From f98716a0ea7d97f840db75667da6b52dff4cea1e Mon Sep 17 00:00:00 2001 From: Steven Landers Date: Fri, 3 May 2024 10:18:40 -0400 Subject: [PATCH 01/51] [EVM] validate eth_getFeeHistory params (#1624) * validate eth fee history vars * truncate instead of error on large block range * make max blocks configurable (same as logs) --- evmrpc/info.go | 23 ++++++++++-- evmrpc/info_test.go | 87 +++++++++++++++++++++++++++------------------ evmrpc/server.go | 4 +-- evmrpc/tx_test.go | 2 +- 4 files changed, 76 insertions(+), 40 deletions(-) diff --git a/evmrpc/info.go b/evmrpc/info.go index 89e391ad7..f1c0313d4 100644 --- a/evmrpc/info.go +++ b/evmrpc/info.go @@ -24,10 +24,11 @@ type InfoAPI struct { txDecoder sdk.TxDecoder homeDir string connectionType ConnectionType + maxBlocks int64 } -func NewInfoAPI(tmClient rpcclient.Client, k *keeper.Keeper, ctxProvider func(int64) sdk.Context, txDecoder sdk.TxDecoder, homeDir string, connectionType ConnectionType) *InfoAPI { - return &InfoAPI{tmClient: tmClient, keeper: k, ctxProvider: ctxProvider, txDecoder: txDecoder, homeDir: homeDir, connectionType: connectionType} +func NewInfoAPI(tmClient rpcclient.Client, k *keeper.Keeper, ctxProvider func(int64) sdk.Context, txDecoder sdk.TxDecoder, homeDir string, maxBlocks int64, connectionType ConnectionType) *InfoAPI { + return &InfoAPI{tmClient: tmClient, keeper: k, ctxProvider: ctxProvider, txDecoder: txDecoder, homeDir: homeDir, connectionType: connectionType, maxBlocks: maxBlocks} } type FeeHistoryResult struct { @@ -93,9 +94,25 @@ func (i *InfoAPI) FeeHistory(ctx context.Context, blockCount math.HexOrDecimal64 defer recordMetrics("eth_feeHistory", i.connectionType, startTime, returnErr == nil) result = &FeeHistoryResult{} + // logic consistent with go-ethereum's validation (block < 1 means no block) + if blockCount < 1 { + return result, nil + } + + // default go-ethereum max block history is 1024 + // https://github.com/ethereum/go-ethereum/blob/master/eth/gasprice/feehistory.go#L235 + if blockCount > math.HexOrDecimal64(i.maxBlocks) { + blockCount = math.HexOrDecimal64(i.maxBlocks) + } + + // if someone needs more than 100 reward percentiles, we can discuss, but it's not likely + if len(rewardPercentiles) > 100 { + return nil, errors.New("rewardPercentiles length must be less than or equal to 100") + } + // validate reward percentiles for i, p := range rewardPercentiles { - if p < 0 || p > 100 || (i > 0 && p < rewardPercentiles[i-1]) { + if p < 0 || p > 100 || (i > 0 && p <= rewardPercentiles[i-1]) { return nil, errors.New("invalid reward percentiles: must be ascending and between 0 and 100") } } diff --git a/evmrpc/info_test.go b/evmrpc/info_test.go index 4abe20680..e55538007 100644 --- a/evmrpc/info_test.go +++ b/evmrpc/info_test.go @@ -1,6 +1,7 @@ package evmrpc_test import ( + "errors" "math/big" "testing" @@ -28,7 +29,7 @@ func TestChainID(t *testing.T) { func TestAccounts(t *testing.T) { homeDir := t.TempDir() - api := evmrpc.NewInfoAPI(nil, nil, nil, nil, homeDir, evmrpc.ConnectionTypeHTTP) + api := evmrpc.NewInfoAPI(nil, nil, nil, nil, homeDir, 1024, evmrpc.ConnectionTypeHTTP) clientCtx := client.Context{}.WithViper("").WithHomeDir(homeDir) clientCtx, err := config.ReadFromClientConfig(clientCtx) require.Nil(t, err) @@ -64,42 +65,60 @@ func TestGasPrice(t *testing.T) { } func TestFeeHistory(t *testing.T) { - bodyByNumber := []interface{}{"0x1", "0x8", []interface{}{0.5}} - bodyByLatest := []interface{}{"0x1", "latest", []interface{}{0.5}} - bodyByEarliest := []interface{}{"0x1", "earliest", []interface{}{0.5}} - bodyOld := []interface{}{"0x1", "0x1", []interface{}{0.5}} - bodyFuture := []interface{}{"0x1", "0x9", []interface{}{0.5}} - expectedOldest := []string{"0x1", "0x1", "0x1", "0x1", "0x1"} - Ctx = Ctx.WithBlockHeight(1) - for i, body := range [][]interface{}{ - bodyByNumber, bodyByLatest, bodyByEarliest, bodyOld, bodyFuture, - } { - resObj := sendRequestGood(t, "feeHistory", body...) - resObj = resObj["result"].(map[string]interface{}) - require.Equal(t, expectedOldest[i], resObj["oldestBlock"].(string)) - rewards := resObj["reward"].([]interface{}) - require.Equal(t, 1, len(rewards)) - reward := rewards[0].([]interface{}) - require.Equal(t, 1, len(reward)) - require.Equal(t, "0xa", reward[0].(string)) - baseFeePerGas := resObj["baseFeePerGas"].([]interface{}) - require.Equal(t, 1, len(baseFeePerGas)) - require.Equal(t, "0x0", baseFeePerGas[0].(string)) - gasUsedRatio := resObj["gasUsedRatio"].([]interface{}) - require.Equal(t, 1, len(gasUsedRatio)) - require.Equal(t, 0.5, gasUsedRatio[0].(float64)) + type feeHistoryTestCase struct { + name string + blockCount interface{} + lastBlock interface{} // Changed to interface{} to handle different types + rewardPercentiles interface{} + expectedOldest string + expectedReward string + expectedBaseFee string + expectedGasUsed float64 + expectedError error } - // bad percentile - outOfRangeBody1 := []interface{}{"0x1", "0x8", []interface{}{-1}} - outOfRangeBody2 := []interface{}{"0x1", "0x8", []interface{}{101}} - outOfOrderBody := []interface{}{"0x1", "0x8", []interface{}{99, 1}} - for _, body := range [][]interface{}{outOfRangeBody1, outOfRangeBody2, outOfOrderBody} { - resObj := sendRequestGood(t, "feeHistory", body...) - errMap := resObj["error"].(map[string]interface{}) - require.Equal(t, "invalid reward percentiles: must be ascending and between 0 and 100", errMap["message"].(string)) + Ctx = Ctx.WithBlockHeight(1) // Simulate context with a specific block height + + testCases := []feeHistoryTestCase{ + {name: "Valid request by number", blockCount: 1, lastBlock: "0x8", rewardPercentiles: []interface{}{0.5}, expectedOldest: "0x1", expectedReward: "0xa", expectedBaseFee: "0x0", expectedGasUsed: 0.5}, + {name: "Valid request by latest", blockCount: 1, lastBlock: "latest", rewardPercentiles: []interface{}{0.5}, expectedOldest: "0x1", expectedReward: "0xa", expectedBaseFee: "0x0", expectedGasUsed: 0.5}, + {name: "Valid request by earliest", blockCount: 1, lastBlock: "earliest", rewardPercentiles: []interface{}{0.5}, expectedOldest: "0x1", expectedReward: "0xa", expectedBaseFee: "0x0", expectedGasUsed: 0.5}, + {name: "Request on the same block", blockCount: 1, lastBlock: "0x1", rewardPercentiles: []interface{}{0.5}, expectedOldest: "0x1", expectedReward: "0xa", expectedBaseFee: "0x0", expectedGasUsed: 0.5}, + {name: "Request on future block", blockCount: 1, lastBlock: "0x9", rewardPercentiles: []interface{}{0.5}, expectedOldest: "0x1", expectedReward: "0xa", expectedBaseFee: "0x0", expectedGasUsed: 0.5}, + {name: "Block count truncates", blockCount: 1025, lastBlock: "latest", rewardPercentiles: []interface{}{25}, expectedOldest: "0x1", expectedReward: "0xa", expectedBaseFee: "0x0", expectedGasUsed: 0.5}, + {name: "Too many percentiles", blockCount: 10, lastBlock: "latest", rewardPercentiles: make([]interface{}, 101), expectedError: errors.New("rewardPercentiles length must be less than or equal to 100")}, + {name: "Invalid percentiles order", blockCount: 10, lastBlock: "latest", rewardPercentiles: []interface{}{99, 1}, expectedError: errors.New("invalid reward percentiles: must be ascending and between 0 and 100")}, } - Ctx = Ctx.WithBlockHeight(8) + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + // Mimic request sending and handle the response + resObj := sendRequestGood(t, "feeHistory", tc.blockCount, tc.lastBlock, tc.rewardPercentiles) + if tc.expectedError != nil { + errMap := resObj["error"].(map[string]interface{}) + require.Equal(t, tc.expectedError.Error(), errMap["message"].(string)) + } else { + _, errorExists := resObj["error"] + require.False(t, errorExists) + + resObj = resObj["result"].(map[string]interface{}) + require.Equal(t, tc.expectedOldest, resObj["oldestBlock"].(string)) + rewards, ok := resObj["reward"].([]interface{}) + + require.True(t, ok, "Expected rewards to be a slice of interfaces") + require.Equal(t, 1, len(rewards), "Expected exactly one reward entry") + reward, ok := rewards[0].([]interface{}) + require.True(t, ok, "Expected reward to be a slice of interfaces") + require.Equal(t, 1, len(reward), "Expected exactly one sub-item in reward") + require.Equal(t, tc.expectedReward, reward[0].(string), "Reward does not match expected value") + + require.Equal(t, tc.expectedBaseFee, resObj["baseFeePerGas"].([]interface{})[0].(string)) + require.Equal(t, tc.expectedGasUsed, resObj["gasUsedRatio"].([]interface{})[0].(float64)) + } + }) + } + + Ctx = Ctx.WithBlockHeight(8) // Reset context to a new block height } func TestCalculatePercentiles(t *testing.T) { diff --git a/evmrpc/server.go b/evmrpc/server.go index dfa7156eb..5e41e1fb6 100644 --- a/evmrpc/server.go +++ b/evmrpc/server.go @@ -61,7 +61,7 @@ func NewEVMHTTPServer( }, { Namespace: "eth", - Service: NewInfoAPI(tmClient, k, ctxProvider, txConfig.TxDecoder(), homeDir, ConnectionTypeHTTP), + Service: NewInfoAPI(tmClient, k, ctxProvider, txConfig.TxDecoder(), homeDir, config.MaxBlocksForLog, ConnectionTypeHTTP), }, { Namespace: "eth", @@ -143,7 +143,7 @@ func NewEVMWebSocketServer( }, { Namespace: "eth", - Service: NewInfoAPI(tmClient, k, ctxProvider, txConfig.TxDecoder(), homeDir, ConnectionTypeWS), + Service: NewInfoAPI(tmClient, k, ctxProvider, txConfig.TxDecoder(), homeDir, config.MaxBlocksForLog, ConnectionTypeWS), }, { Namespace: "eth", diff --git a/evmrpc/tx_test.go b/evmrpc/tx_test.go index cb88886c0..26d464a75 100644 --- a/evmrpc/tx_test.go +++ b/evmrpc/tx_test.go @@ -226,7 +226,7 @@ func TestGetTransactionError(t *testing.T) { func TestSign(t *testing.T) { homeDir := t.TempDir() txApi := evmrpc.NewTransactionAPI(nil, nil, nil, nil, homeDir, evmrpc.ConnectionTypeHTTP) - infoApi := evmrpc.NewInfoAPI(nil, nil, nil, nil, homeDir, evmrpc.ConnectionTypeHTTP) + infoApi := evmrpc.NewInfoAPI(nil, nil, nil, nil, homeDir, 1024, evmrpc.ConnectionTypeHTTP) clientCtx := client.Context{}.WithViper("").WithHomeDir(homeDir) clientCtx, err := config.ReadFromClientConfig(clientCtx) require.Nil(t, err) From e05ef4670f73a173f6f01adfc000c8a802245aa4 Mon Sep 17 00:00:00 2001 From: Matthieu Vachon Date: Wed, 10 Apr 2024 12:18:54 -0400 Subject: [PATCH 02/51] Firehose tracer addition --- app/app.go | 83 +- app/eth_replay.go | 4 +- buf.gen.yaml | 6 + evmrpc/config.go | 13 + evmrpc/config_test.go | 8 +- go.sum | 2 + pb/sf/ethereum/type/v2/type.go | 27 + pb/sf/ethereum/type/v2/type.pb.go | 3691 +++++++++++++++++ precompiles/bank/bank.go | 18 +- precompiles/bank/bank_test.go | 39 + precompiles/wasmd/wasmd.go | 6 +- x/evm/keeper/msg_server.go | 109 +- x/evm/module.go | 19 + x/evm/module_test.go | 68 +- x/evm/state/balance.go | 1 - x/evm/tracers/balances.go | 82 + x/evm/tracers/firehose.go | 2259 ++++++++++ x/evm/tracers/firehose_test.go | 471 +++ x/evm/tracers/registry.go | 31 + .../reorder-ordinals-empty.golden.json | 122 + x/evm/tracers/tracing.go | 112 + x/evm/tracing/hooks.go | 77 + 22 files changed, 7222 insertions(+), 26 deletions(-) create mode 100644 buf.gen.yaml create mode 100644 pb/sf/ethereum/type/v2/type.go create mode 100644 pb/sf/ethereum/type/v2/type.pb.go create mode 100644 x/evm/tracers/balances.go create mode 100644 x/evm/tracers/firehose.go create mode 100644 x/evm/tracers/firehose_test.go create mode 100644 x/evm/tracers/registry.go create mode 100755 x/evm/tracers/testdata/firehose/reorder-ordinals-empty.golden.json create mode 100644 x/evm/tracers/tracing.go create mode 100644 x/evm/tracing/hooks.go diff --git a/app/app.go b/app/app.go index 0eacd4282..88569dc9b 100644 --- a/app/app.go +++ b/app/app.go @@ -7,14 +7,19 @@ import ( "encoding/json" "fmt" "io" + "math/big" "os" "path/filepath" "strings" "sync" "time" + ethcommon "github.com/ethereum/go-ethereum/common" + ethhexutil "github.com/ethereum/go-ethereum/common/hexutil" + ethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/ethclient" ethrpc "github.com/ethereum/go-ethereum/rpc" + "github.com/sei-protocol/sei-chain/app/antedecorators" "github.com/sei-protocol/sei-chain/evmrpc" "github.com/sei-protocol/sei-chain/precompiles" @@ -125,6 +130,8 @@ import ( evmkeeper "github.com/sei-protocol/sei-chain/x/evm/keeper" "github.com/sei-protocol/sei-chain/x/evm/querier" "github.com/sei-protocol/sei-chain/x/evm/replay" + evmtracers "github.com/sei-protocol/sei-chain/x/evm/tracers" + "github.com/sei-protocol/sei-chain/x/evm/tracing" evmtypes "github.com/sei-protocol/sei-chain/x/evm/types" "github.com/spf13/cast" abci "github.com/tendermint/tendermint/abci/types" @@ -374,6 +381,7 @@ type App struct { encodingConfig appparams.EncodingConfig evmRPCConfig evmrpc.Config + evmTracer *tracing.Hooks } // New returns a reference to an initialized blockchain app @@ -949,6 +957,15 @@ func New( app.HardForkManager = upgrades.NewHardForkManager(app.ChainID) app.HardForkManager.RegisterHandler(v0upgrade.NewHardForkUpgradeHandler(100_000, upgrades.ChainIDSeiHardForkTest, app.WasmKeeper)) + if app.evmRPCConfig.LiveEVMTracer != "" { + chainConfig := evmtypes.DefaultChainConfig().EthereumConfig(app.EvmKeeper.ChainID(app.GetCheckCtx())) + evmTracer, err := evmtracers.NewBlockchainTracer(evmtracers.GlobalLiveTracerRegistry, app.evmRPCConfig.LiveEVMTracer, chainConfig) + if err != nil { + panic(fmt.Sprintf("error creating EVM tracer due to %s", err)) + } + app.evmTracer = evmTracer + } + return app } @@ -1427,12 +1444,23 @@ func (app *App) ProcessTXsWithOCC(ctx sdk.Context, txs [][]byte, typedTxs []sdk. wg.Add(1) go func(txIndex int, tx []byte) { defer wg.Done() + + var txTracer sdk.TxTracer + if app.evmTracer != nil { + txTracer = app.evmTracer + if app.evmTracer.GetTxTracer != nil { + txTracer = app.evmTracer.GetTxTracer(absoluteTxIndices[txIndex]) + } + } + deliverTxEntry := &sdk.DeliverTxEntry{ Request: abci.RequestDeliverTx{Tx: tx}, SdkTx: typedTxs[txIndex], Checksum: sha256.Sum256(tx), AbsoluteIndex: absoluteTxIndices[txIndex], + TxTracer: txTracer, } + // get prefill estimate estimatedWritesets, err := app.AccessControlKeeper.GenerateEstimatedWritesets(ctx, app.GetAnteDepGenerator(), txIndex, typedTxs[txIndex]) // if no error, then we assign the mapped writesets for prefill estimate @@ -1493,12 +1521,17 @@ func (app *App) BuildDependenciesAndRunTxs(ctx sdk.Context, txs [][]byte, typedT return app.ProcessBlockSynchronous(ctx, txs, typedTxs, absoluteTxIndices), ctx } -func (app *App) ProcessBlock(ctx sdk.Context, txs [][]byte, req BlockProcessRequest, lastCommit abci.CommitInfo) ([]abci.Event, []*abci.ExecTxResult, abci.ResponseEndBlock, error) { +func (app *App) ProcessBlock(ctx sdk.Context, txs [][]byte, req BlockProcessRequest, lastCommit abci.CommitInfo) (events []abci.Event, txResults []*abci.ExecTxResult, endBlockResp abci.ResponseEndBlock, err error) { ctx = ctx.WithIsOCCEnabled(app.OccEnabled()) + goCtx := app.decorateContextWithDexMemState(ctx.Context()) ctx = ctx.WithContext(goCtx) - events := []abci.Event{} + if app.evmTracer != nil { + ctx = evmtracers.SetCtxBlockchainTracer(ctx, app.evmTracer) + } + + events = []abci.Event{} beginBlockReq := abci.RequestBeginBlock{ Hash: req.GetHash(), ByzantineValidators: utils.Map(req.GetByzantineValidators(), func(mis abci.Misbehavior) abci.Evidence { @@ -1523,9 +1556,16 @@ func (app *App) ProcessBlock(ctx sdk.Context, txs [][]byte, req BlockProcessRequ beginBlockResp := app.BeginBlock(ctx, beginBlockReq) events = append(events, beginBlockResp.Events...) - txResults := make([]*abci.ExecTxResult, len(txs)) + txResults = make([]*abci.ExecTxResult, len(txs)) typedTxs := app.DecodeTransactionsConcurrently(ctx, txs) + if app.evmTracer != nil { + header := ctx.BlockHeader() + app.evmTracer.OnSeiBlockStart(req.GetHash(), uint64(header.Size()), TmBlockHeaderToEVM(ctx, header, &app.EvmKeeper)) + defer func() { + app.evmTracer.OnSeiBlockEnd(err) + }() + } prioritizedTxs, otherTxs, prioritizedTypedTxs, otherTypedTxs, prioritizedIndices, otherIndices := app.PartitionPrioritizedTxs(ctx, txs, typedTxs) // run the prioritized txs @@ -1551,7 +1591,7 @@ func (app *App) ProcessBlock(ctx sdk.Context, txs [][]byte, req BlockProcessRequ lazyWriteEvents := app.BankKeeper.WriteDeferredBalances(ctx) events = append(events, lazyWriteEvents...) - endBlockResp := app.EndBlock(ctx, abci.RequestEndBlock{ + endBlockResp = app.EndBlock(ctx, abci.RequestEndBlock{ Height: req.GetHeight(), }) @@ -1862,3 +1902,38 @@ func init() { // override max wasm size to 2MB wasmtypes.MaxWasmSize = 2 * 1024 * 1024 } + +func TmBlockHeaderToEVM( + ctx sdk.Context, + block tmproto.Header, + k *evmkeeper.Keeper, +) (header *ethtypes.Header) { + number := big.NewInt(block.Height) + lastHash := ethcommon.BytesToHash(block.LastBlockId.Hash) + appHash := ethcommon.BytesToHash(block.AppHash) + txHash := ethcommon.BytesToHash(block.DataHash) + resultHash := ethcommon.BytesToHash(block.LastResultsHash) + miner := ethcommon.BytesToAddress(block.ProposerAddress) + gasLimit, gasWanted := uint64(0), uint64(0) + + header = ðtypes.Header{ + Number: number, + ParentHash: lastHash, + Nonce: ethtypes.BlockNonce{}, // inapplicable to Sei + MixDigest: ethcommon.Hash{}, // inapplicable to Sei + UncleHash: ethtypes.EmptyUncleHash, // inapplicable to Sei + Bloom: k.GetBlockBloom(ctx, block.Height), + Root: appHash, + Coinbase: miner, + Difficulty: big.NewInt(0), // inapplicable to Sei + Extra: ethhexutil.Bytes{}, // inapplicable to Sei + GasLimit: gasLimit, + GasUsed: gasWanted, + Time: uint64(block.Time.Unix()), + TxHash: txHash, + ReceiptHash: resultHash, + BaseFee: k.GetBaseFeePerGas(ctx).RoundInt().BigInt(), + } + + return +} diff --git a/app/eth_replay.go b/app/eth_replay.go index d63a3f1dd..bf9b7b414 100644 --- a/app/eth_replay.go +++ b/app/eth_replay.go @@ -13,7 +13,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/ethereum/go-ethereum/common" ethcore "github.com/ethereum/go-ethereum/core" - "github.com/ethereum/go-ethereum/core/tracing" + ethtracing "github.com/ethereum/go-ethereum/core/tracing" ethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/params" ethtests "github.com/ethereum/go-ethereum/tests" @@ -85,7 +85,7 @@ func Replay(a *App) { for _, w := range b.Withdrawals() { amount := new(big.Int).SetUint64(w.Amount) amount = amount.Mul(amount, big.NewInt(params.GWei)) - s.AddBalance(w.Address, amount, tracing.BalanceIncreaseWithdrawal) + s.AddBalance(w.Address, amount, ethtracing.BalanceIncreaseWithdrawal) } _, _ = s.Finalize() for _, tx := range b.Txs { diff --git a/buf.gen.yaml b/buf.gen.yaml new file mode 100644 index 000000000..6275bdee3 --- /dev/null +++ b/buf.gen.yaml @@ -0,0 +1,6 @@ +version: v1 +plugins: + - plugin: buf.build/protocolbuffers/go:v1.31.0 + out: pb + opt: paths=source_relative + diff --git a/evmrpc/config.go b/evmrpc/config.go index 00e2a2725..f596acbf1 100644 --- a/evmrpc/config.go +++ b/evmrpc/config.go @@ -82,6 +82,12 @@ type Config struct { // max number of concurrent NewHead subscriptions MaxSubscriptionsNewHead uint64 `mapstructure:"max_subscriptions_new_head"` + + // The EVM tracer to use when doing node synchronization, applies to + // all block produced but traces only EVM transactions. + // + // Refer to x/evm/tracers/registry.go#GlobalLiveTracerRegistry for registered tracers. + LiveEVMTracer string `mapstructure:"live_evm_tracer"` } var DefaultConfig = Config{ @@ -105,6 +111,7 @@ var DefaultConfig = Config{ MaxLogNoBlock: 10000, MaxBlocksForLog: 2000, MaxSubscriptionsNewHead: 10000, + LiveEVMTracer: "", } const ( @@ -128,6 +135,7 @@ const ( flagMaxLogNoBlock = "evm.max_log_no_block" flagMaxBlocksForLog = "evm.max_blocks_for_log" flagMaxSubscriptionsNewHead = "evm.max_subscriptions_new_head" + flagLiveEVMTracer = "evm.live_evm_tracer" ) func ReadConfig(opts servertypes.AppOptions) (Config, error) { @@ -233,5 +241,10 @@ func ReadConfig(opts servertypes.AppOptions) (Config, error) { return cfg, err } } + if v := opts.Get(flagLiveEVMTracer); v != nil { + if cfg.LiveEVMTracer, err = cast.ToStringE(v); err != nil { + return cfg, err + } + } return cfg, nil } diff --git a/evmrpc/config_test.go b/evmrpc/config_test.go index 6cc99b370..c1fbec70a 100644 --- a/evmrpc/config_test.go +++ b/evmrpc/config_test.go @@ -1,6 +1,7 @@ package evmrpc_test import ( + "fmt" "testing" "time" @@ -29,6 +30,7 @@ type opts struct { maxLogNoBlock interface{} maxBlocksForLog interface{} maxSubscriptionsNewHead interface{} + liveEVMTracer interface{} } func (o *opts) Get(k string) interface{} { @@ -92,7 +94,10 @@ func (o *opts) Get(k string) interface{} { if k == "evm.max_subscriptions_new_head" { return o.maxSubscriptionsNewHead } - panic("unknown key") + if k == "evm.live_evm_tracer" { + return o.liveEVMTracer + } + panic(fmt.Errorf("unknown key: %s", k)) } func TestReadConfig(t *testing.T) { @@ -117,6 +122,7 @@ func TestReadConfig(t *testing.T) { 20000, 1000, 10000, + "", } _, err := evmrpc.ReadConfig(&goodOpts) require.Nil(t, err) diff --git a/go.sum b/go.sum index d4c27f7a2..12fb9495e 100644 --- a/go.sum +++ b/go.sum @@ -1430,6 +1430,8 @@ github.com/stbenjam/no-sprintf-host-port v0.1.1/go.mod h1:TLhvtIvONRzdmkFiio4O8L github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= github.com/streadway/amqp v0.0.0-20190827072141-edfb9018d271/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI= +github.com/streamingfast/sei-cosmos v0.0.0-20240327153024-8e22d1da5334 h1:+4kXknHWASf4Qq0yo67kDmZcBDeSUxVICb34CDEY6Kw= +github.com/streamingfast/sei-cosmos v0.0.0-20240327153024-8e22d1da5334/go.mod h1:ib/gp0gCxN7FXUZ40j5+x8BeyoI7AcX+rTvf53JoDsY= 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= diff --git a/pb/sf/ethereum/type/v2/type.go b/pb/sf/ethereum/type/v2/type.go new file mode 100644 index 000000000..38b6881fc --- /dev/null +++ b/pb/sf/ethereum/type/v2/type.go @@ -0,0 +1,27 @@ +package pbeth + +import ( + "encoding/hex" + "math/big" + "time" +) + +var b0 = big.NewInt(0) + +func (b *Block) PreviousID() string { + return hex.EncodeToString(b.Header.ParentHash) +} + +func (b *Block) Time() time.Time { + return b.Header.Timestamp.AsTime() +} + +func (m *BigInt) Native() *big.Int { + if m == nil { + return b0 + } + + z := new(big.Int) + z.SetBytes(m.Bytes) + return z +} diff --git a/pb/sf/ethereum/type/v2/type.pb.go b/pb/sf/ethereum/type/v2/type.pb.go new file mode 100644 index 000000000..8103b2f18 --- /dev/null +++ b/pb/sf/ethereum/type/v2/type.pb.go @@ -0,0 +1,3691 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.31.0 +// protoc (unknown) +// source: sf/ethereum/type/v2/type.proto + +package pbeth + +import ( + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + timestamppb "google.golang.org/protobuf/types/known/timestamppb" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +type TransactionTraceStatus int32 + +const ( + TransactionTraceStatus_UNKNOWN TransactionTraceStatus = 0 + TransactionTraceStatus_SUCCEEDED TransactionTraceStatus = 1 + TransactionTraceStatus_FAILED TransactionTraceStatus = 2 + TransactionTraceStatus_REVERTED TransactionTraceStatus = 3 +) + +// Enum value maps for TransactionTraceStatus. +var ( + TransactionTraceStatus_name = map[int32]string{ + 0: "UNKNOWN", + 1: "SUCCEEDED", + 2: "FAILED", + 3: "REVERTED", + } + TransactionTraceStatus_value = map[string]int32{ + "UNKNOWN": 0, + "SUCCEEDED": 1, + "FAILED": 2, + "REVERTED": 3, + } +) + +func (x TransactionTraceStatus) Enum() *TransactionTraceStatus { + p := new(TransactionTraceStatus) + *p = x + return p +} + +func (x TransactionTraceStatus) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (TransactionTraceStatus) Descriptor() protoreflect.EnumDescriptor { + return file_sf_ethereum_type_v2_type_proto_enumTypes[0].Descriptor() +} + +func (TransactionTraceStatus) Type() protoreflect.EnumType { + return &file_sf_ethereum_type_v2_type_proto_enumTypes[0] +} + +func (x TransactionTraceStatus) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use TransactionTraceStatus.Descriptor instead. +func (TransactionTraceStatus) EnumDescriptor() ([]byte, []int) { + return file_sf_ethereum_type_v2_type_proto_rawDescGZIP(), []int{0} +} + +type CallType int32 + +const ( + CallType_UNSPECIFIED CallType = 0 + CallType_CALL CallType = 1 // direct? what's the name for `Call` alone? + CallType_CALLCODE CallType = 2 + CallType_DELEGATE CallType = 3 + CallType_STATIC CallType = 4 + CallType_CREATE CallType = 5 // create2 ? any other form of calls? +) + +// Enum value maps for CallType. +var ( + CallType_name = map[int32]string{ + 0: "UNSPECIFIED", + 1: "CALL", + 2: "CALLCODE", + 3: "DELEGATE", + 4: "STATIC", + 5: "CREATE", + } + CallType_value = map[string]int32{ + "UNSPECIFIED": 0, + "CALL": 1, + "CALLCODE": 2, + "DELEGATE": 3, + "STATIC": 4, + "CREATE": 5, + } +) + +func (x CallType) Enum() *CallType { + p := new(CallType) + *p = x + return p +} + +func (x CallType) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (CallType) Descriptor() protoreflect.EnumDescriptor { + return file_sf_ethereum_type_v2_type_proto_enumTypes[1].Descriptor() +} + +func (CallType) Type() protoreflect.EnumType { + return &file_sf_ethereum_type_v2_type_proto_enumTypes[1] +} + +func (x CallType) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use CallType.Descriptor instead. +func (CallType) EnumDescriptor() ([]byte, []int) { + return file_sf_ethereum_type_v2_type_proto_rawDescGZIP(), []int{1} +} + +type Block_DetailLevel int32 + +const ( + Block_DETAILLEVEL_EXTENDED Block_DetailLevel = 0 + // DETAILLEVEL_TRACE = 1; // TBD + Block_DETAILLEVEL_BASE Block_DetailLevel = 2 +) + +// Enum value maps for Block_DetailLevel. +var ( + Block_DetailLevel_name = map[int32]string{ + 0: "DETAILLEVEL_EXTENDED", + 2: "DETAILLEVEL_BASE", + } + Block_DetailLevel_value = map[string]int32{ + "DETAILLEVEL_EXTENDED": 0, + "DETAILLEVEL_BASE": 2, + } +) + +func (x Block_DetailLevel) Enum() *Block_DetailLevel { + p := new(Block_DetailLevel) + *p = x + return p +} + +func (x Block_DetailLevel) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (Block_DetailLevel) Descriptor() protoreflect.EnumDescriptor { + return file_sf_ethereum_type_v2_type_proto_enumTypes[2].Descriptor() +} + +func (Block_DetailLevel) Type() protoreflect.EnumType { + return &file_sf_ethereum_type_v2_type_proto_enumTypes[2] +} + +func (x Block_DetailLevel) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use Block_DetailLevel.Descriptor instead. +func (Block_DetailLevel) EnumDescriptor() ([]byte, []int) { + return file_sf_ethereum_type_v2_type_proto_rawDescGZIP(), []int{0, 0} +} + +type TransactionTrace_Type int32 + +const ( + // All transactions that ever existed prior Berlin fork before EIP-2718 was implemented. + TransactionTrace_TRX_TYPE_LEGACY TransactionTrace_Type = 0 + // Transaction that specicy an access list of contract/storage_keys that is going to be used + // in this transaction. + // + // Added in Berlin fork (EIP-2930). + TransactionTrace_TRX_TYPE_ACCESS_LIST TransactionTrace_Type = 1 + // Transaction that specifis an access list just like TRX_TYPE_ACCESS_LIST but in addition defines the + // max base gas gee and max priority gas fee to pay for this transaction. Transaction's of those type are + // executed against EIP-1559 rules which dictates a dynamic gas cost based on the congestion of the network. + TransactionTrace_TRX_TYPE_DYNAMIC_FEE TransactionTrace_Type = 2 + // Transaction which contain a large amount of data that cannot be accessed by EVM execution, but whose commitment + // can be accessed. The format is intended to be fully compatible with the format that will be used in full sharding. + // + // Transaction that defines specifis an access list just like TRX_TYPE_ACCESS_LIST and enables dynamic fee just like + // TRX_TYPE_DYNAMIC_FEE but in addition defines the fields 'max_fee_per_data_gas' of type 'uint256' and the fields + // 'blob_versioned_hashes' field represents a list of hash outputs from 'kzg_to_versioned_hash'. + // + // Activated in Dencun + TransactionTrace_TRX_TYPE_BLOB TransactionTrace_Type = 3 + // Arbitrum-specific transactions + TransactionTrace_TRX_TYPE_ARBITRUM_DEPOSIT TransactionTrace_Type = 100 + TransactionTrace_TRX_TYPE_ARBITRUM_UNSIGNED TransactionTrace_Type = 101 + TransactionTrace_TRX_TYPE_ARBITRUM_CONTRACT TransactionTrace_Type = 102 + TransactionTrace_TRX_TYPE_ARBITRUM_RETRY TransactionTrace_Type = 104 + TransactionTrace_TRX_TYPE_ARBITRUM_SUBMIT_RETRYABLE TransactionTrace_Type = 105 + TransactionTrace_TRX_TYPE_ARBITRUM_INTERNAL TransactionTrace_Type = 106 + TransactionTrace_TRX_TYPE_ARBITRUM_LEGACY TransactionTrace_Type = 120 +) + +// Enum value maps for TransactionTrace_Type. +var ( + TransactionTrace_Type_name = map[int32]string{ + 0: "TRX_TYPE_LEGACY", + 1: "TRX_TYPE_ACCESS_LIST", + 2: "TRX_TYPE_DYNAMIC_FEE", + 3: "TRX_TYPE_BLOB", + 100: "TRX_TYPE_ARBITRUM_DEPOSIT", + 101: "TRX_TYPE_ARBITRUM_UNSIGNED", + 102: "TRX_TYPE_ARBITRUM_CONTRACT", + 104: "TRX_TYPE_ARBITRUM_RETRY", + 105: "TRX_TYPE_ARBITRUM_SUBMIT_RETRYABLE", + 106: "TRX_TYPE_ARBITRUM_INTERNAL", + 120: "TRX_TYPE_ARBITRUM_LEGACY", + } + TransactionTrace_Type_value = map[string]int32{ + "TRX_TYPE_LEGACY": 0, + "TRX_TYPE_ACCESS_LIST": 1, + "TRX_TYPE_DYNAMIC_FEE": 2, + "TRX_TYPE_BLOB": 3, + "TRX_TYPE_ARBITRUM_DEPOSIT": 100, + "TRX_TYPE_ARBITRUM_UNSIGNED": 101, + "TRX_TYPE_ARBITRUM_CONTRACT": 102, + "TRX_TYPE_ARBITRUM_RETRY": 104, + "TRX_TYPE_ARBITRUM_SUBMIT_RETRYABLE": 105, + "TRX_TYPE_ARBITRUM_INTERNAL": 106, + "TRX_TYPE_ARBITRUM_LEGACY": 120, + } +) + +func (x TransactionTrace_Type) Enum() *TransactionTrace_Type { + p := new(TransactionTrace_Type) + *p = x + return p +} + +func (x TransactionTrace_Type) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (TransactionTrace_Type) Descriptor() protoreflect.EnumDescriptor { + return file_sf_ethereum_type_v2_type_proto_enumTypes[3].Descriptor() +} + +func (TransactionTrace_Type) Type() protoreflect.EnumType { + return &file_sf_ethereum_type_v2_type_proto_enumTypes[3] +} + +func (x TransactionTrace_Type) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use TransactionTrace_Type.Descriptor instead. +func (TransactionTrace_Type) EnumDescriptor() ([]byte, []int) { + return file_sf_ethereum_type_v2_type_proto_rawDescGZIP(), []int{5, 0} +} + +// Obtain all balanche change reasons under deep mind repository: +// +// ```shell +// ack -ho 'BalanceChangeReason\(".*"\)' | grep -Eo '".*"' | sort | uniq +// ``` +type BalanceChange_Reason int32 + +const ( + BalanceChange_REASON_UNKNOWN BalanceChange_Reason = 0 + BalanceChange_REASON_REWARD_MINE_UNCLE BalanceChange_Reason = 1 + BalanceChange_REASON_REWARD_MINE_BLOCK BalanceChange_Reason = 2 + BalanceChange_REASON_DAO_REFUND_CONTRACT BalanceChange_Reason = 3 + BalanceChange_REASON_DAO_ADJUST_BALANCE BalanceChange_Reason = 4 + BalanceChange_REASON_TRANSFER BalanceChange_Reason = 5 + BalanceChange_REASON_GENESIS_BALANCE BalanceChange_Reason = 6 + BalanceChange_REASON_GAS_BUY BalanceChange_Reason = 7 + BalanceChange_REASON_REWARD_TRANSACTION_FEE BalanceChange_Reason = 8 + BalanceChange_REASON_REWARD_FEE_RESET BalanceChange_Reason = 14 + BalanceChange_REASON_GAS_REFUND BalanceChange_Reason = 9 + BalanceChange_REASON_TOUCH_ACCOUNT BalanceChange_Reason = 10 + BalanceChange_REASON_SUICIDE_REFUND BalanceChange_Reason = 11 + BalanceChange_REASON_SUICIDE_WITHDRAW BalanceChange_Reason = 13 + BalanceChange_REASON_CALL_BALANCE_OVERRIDE BalanceChange_Reason = 12 + // Used on chain(s) where some Ether burning happens + BalanceChange_REASON_BURN BalanceChange_Reason = 15 + BalanceChange_REASON_WITHDRAWAL BalanceChange_Reason = 16 +) + +// Enum value maps for BalanceChange_Reason. +var ( + BalanceChange_Reason_name = map[int32]string{ + 0: "REASON_UNKNOWN", + 1: "REASON_REWARD_MINE_UNCLE", + 2: "REASON_REWARD_MINE_BLOCK", + 3: "REASON_DAO_REFUND_CONTRACT", + 4: "REASON_DAO_ADJUST_BALANCE", + 5: "REASON_TRANSFER", + 6: "REASON_GENESIS_BALANCE", + 7: "REASON_GAS_BUY", + 8: "REASON_REWARD_TRANSACTION_FEE", + 14: "REASON_REWARD_FEE_RESET", + 9: "REASON_GAS_REFUND", + 10: "REASON_TOUCH_ACCOUNT", + 11: "REASON_SUICIDE_REFUND", + 13: "REASON_SUICIDE_WITHDRAW", + 12: "REASON_CALL_BALANCE_OVERRIDE", + 15: "REASON_BURN", + 16: "REASON_WITHDRAWAL", + } + BalanceChange_Reason_value = map[string]int32{ + "REASON_UNKNOWN": 0, + "REASON_REWARD_MINE_UNCLE": 1, + "REASON_REWARD_MINE_BLOCK": 2, + "REASON_DAO_REFUND_CONTRACT": 3, + "REASON_DAO_ADJUST_BALANCE": 4, + "REASON_TRANSFER": 5, + "REASON_GENESIS_BALANCE": 6, + "REASON_GAS_BUY": 7, + "REASON_REWARD_TRANSACTION_FEE": 8, + "REASON_REWARD_FEE_RESET": 14, + "REASON_GAS_REFUND": 9, + "REASON_TOUCH_ACCOUNT": 10, + "REASON_SUICIDE_REFUND": 11, + "REASON_SUICIDE_WITHDRAW": 13, + "REASON_CALL_BALANCE_OVERRIDE": 12, + "REASON_BURN": 15, + "REASON_WITHDRAWAL": 16, + } +) + +func (x BalanceChange_Reason) Enum() *BalanceChange_Reason { + p := new(BalanceChange_Reason) + *p = x + return p +} + +func (x BalanceChange_Reason) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (BalanceChange_Reason) Descriptor() protoreflect.EnumDescriptor { + return file_sf_ethereum_type_v2_type_proto_enumTypes[4].Descriptor() +} + +func (BalanceChange_Reason) Type() protoreflect.EnumType { + return &file_sf_ethereum_type_v2_type_proto_enumTypes[4] +} + +func (x BalanceChange_Reason) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use BalanceChange_Reason.Descriptor instead. +func (BalanceChange_Reason) EnumDescriptor() ([]byte, []int) { + return file_sf_ethereum_type_v2_type_proto_rawDescGZIP(), []int{11, 0} +} + +// Obtain all gas change reasons under deep mind repository: +// +// ```shell +// ack -ho 'GasChangeReason\(".*"\)' | grep -Eo '".*"' | sort | uniq +// ``` +type GasChange_Reason int32 + +const ( + GasChange_REASON_UNKNOWN GasChange_Reason = 0 + // REASON_CALL is the amount of gas that will be charged for a 'CALL' opcode executed by the EVM + GasChange_REASON_CALL GasChange_Reason = 1 + // REASON_CALL_CODE is the amount of gas that will be charged for a 'CALLCODE' opcode executed by the EVM + GasChange_REASON_CALL_CODE GasChange_Reason = 2 + // REASON_CALL_DATA_COPY is the amount of gas that will be charged for a 'CALLDATACOPY' opcode executed by the EVM + GasChange_REASON_CALL_DATA_COPY GasChange_Reason = 3 + // REASON_CODE_COPY is the amount of gas that will be charged for a 'CALLDATACOPY' opcode executed by the EVM + GasChange_REASON_CODE_COPY GasChange_Reason = 4 + // REASON_CODE_STORAGE is the amount of gas that will be charged for code storage + GasChange_REASON_CODE_STORAGE GasChange_Reason = 5 + // REASON_CONTRACT_CREATION is the amount of gas that will be charged for a 'CREATE' opcode executed by the EVM and for the gas + // burned for a CREATE, today controlled by EIP150 rules + GasChange_REASON_CONTRACT_CREATION GasChange_Reason = 6 + // REASON_CONTRACT_CREATION2 is the amount of gas that will be charged for a 'CREATE2' opcode executed by the EVM and for the gas + // burned for a CREATE2, today controlled by EIP150 rules + GasChange_REASON_CONTRACT_CREATION2 GasChange_Reason = 7 + // REASON_DELEGATE_CALL is the amount of gas that will be charged for a 'DELEGATECALL' opcode executed by the EVM + GasChange_REASON_DELEGATE_CALL GasChange_Reason = 8 + // REASON_EVENT_LOG is the amount of gas that will be charged for a 'LOG' opcode executed by the EVM + GasChange_REASON_EVENT_LOG GasChange_Reason = 9 + // REASON_EXT_CODE_COPY is the amount of gas that will be charged for a 'LOG' opcode executed by the EVM + GasChange_REASON_EXT_CODE_COPY GasChange_Reason = 10 + // REASON_FAILED_EXECUTION is the burning of the remaining gas when the execution failed without a revert + GasChange_REASON_FAILED_EXECUTION GasChange_Reason = 11 + // REASON_INTRINSIC_GAS is the amount of gas that will be charged for the intrinsic cost of the transaction, there is + // always exactly one of those per transaction + GasChange_REASON_INTRINSIC_GAS GasChange_Reason = 12 + // GasChangePrecompiledContract is the amount of gas that will be charged for a precompiled contract execution + GasChange_REASON_PRECOMPILED_CONTRACT GasChange_Reason = 13 + // REASON_REFUND_AFTER_EXECUTION is the amount of gas that will be refunded to the caller after the execution of the call, + // if there is left over at the end of execution + GasChange_REASON_REFUND_AFTER_EXECUTION GasChange_Reason = 14 + // REASON_RETURN is the amount of gas that will be charged for a 'RETURN' opcode executed by the EVM + GasChange_REASON_RETURN GasChange_Reason = 15 + // REASON_RETURN_DATA_COPY is the amount of gas that will be charged for a 'RETURNDATACOPY' opcode executed by the EVM + GasChange_REASON_RETURN_DATA_COPY GasChange_Reason = 16 + // REASON_REVERT is the amount of gas that will be charged for a 'REVERT' opcode executed by the EVM + GasChange_REASON_REVERT GasChange_Reason = 17 + // REASON_SELF_DESTRUCT is the amount of gas that will be charged for a 'SELFDESTRUCT' opcode executed by the EVM + GasChange_REASON_SELF_DESTRUCT GasChange_Reason = 18 + // REASON_STATIC_CALL is the amount of gas that will be charged for a 'STATICALL' opcode executed by the EVM + GasChange_REASON_STATIC_CALL GasChange_Reason = 19 + // REASON_STATE_COLD_ACCESS is the amount of gas that will be charged for a cold storage access as controlled by EIP2929 rules + // + // Added in Berlin fork (Geth 1.10+) + GasChange_REASON_STATE_COLD_ACCESS GasChange_Reason = 20 + // REASON_TX_INITIAL_BALANCE is the initial balance for the call which will be equal to the gasLimit of the call + // + // Added as new tracing reason in Geth, available only on some chains + GasChange_REASON_TX_INITIAL_BALANCE GasChange_Reason = 21 + // REASON_TX_REFUNDS is the sum of all refunds which happened during the tx execution (e.g. storage slot being cleared) + // this generates an increase in gas. There is only one such gas change per transaction. + // + // Added as new tracing reason in Geth, available only on some chains + GasChange_REASON_TX_REFUNDS GasChange_Reason = 22 + // REASON_TX_LEFT_OVER_RETURNED is the amount of gas left over at the end of transaction's execution that will be returned + // to the chain. This change will always be a negative change as we "drain" left over gas towards 0. If there was no gas + // left at the end of execution, no such even will be emitted. The returned gas's value in Wei is returned to caller. + // There is at most one of such gas change per transaction. + // + // Added as new tracing reason in Geth, available only on some chains + GasChange_REASON_TX_LEFT_OVER_RETURNED GasChange_Reason = 23 + // REASON_CALL_INITIAL_BALANCE is the initial balance for the call which will be equal to the gasLimit of the call. There is only + // one such gas change per call. + // + // Added as new tracing reason in Geth, available only on some chains + GasChange_REASON_CALL_INITIAL_BALANCE GasChange_Reason = 24 + // REASON_CALL_LEFT_OVER_RETURNED is the amount of gas left over that will be returned to the caller, this change will always + // be a negative change as we "drain" left over gas towards 0. If there was no gas left at the end of execution, no such even + // will be emitted. + GasChange_REASON_CALL_LEFT_OVER_RETURNED GasChange_Reason = 25 +) + +// Enum value maps for GasChange_Reason. +var ( + GasChange_Reason_name = map[int32]string{ + 0: "REASON_UNKNOWN", + 1: "REASON_CALL", + 2: "REASON_CALL_CODE", + 3: "REASON_CALL_DATA_COPY", + 4: "REASON_CODE_COPY", + 5: "REASON_CODE_STORAGE", + 6: "REASON_CONTRACT_CREATION", + 7: "REASON_CONTRACT_CREATION2", + 8: "REASON_DELEGATE_CALL", + 9: "REASON_EVENT_LOG", + 10: "REASON_EXT_CODE_COPY", + 11: "REASON_FAILED_EXECUTION", + 12: "REASON_INTRINSIC_GAS", + 13: "REASON_PRECOMPILED_CONTRACT", + 14: "REASON_REFUND_AFTER_EXECUTION", + 15: "REASON_RETURN", + 16: "REASON_RETURN_DATA_COPY", + 17: "REASON_REVERT", + 18: "REASON_SELF_DESTRUCT", + 19: "REASON_STATIC_CALL", + 20: "REASON_STATE_COLD_ACCESS", + 21: "REASON_TX_INITIAL_BALANCE", + 22: "REASON_TX_REFUNDS", + 23: "REASON_TX_LEFT_OVER_RETURNED", + 24: "REASON_CALL_INITIAL_BALANCE", + 25: "REASON_CALL_LEFT_OVER_RETURNED", + } + GasChange_Reason_value = map[string]int32{ + "REASON_UNKNOWN": 0, + "REASON_CALL": 1, + "REASON_CALL_CODE": 2, + "REASON_CALL_DATA_COPY": 3, + "REASON_CODE_COPY": 4, + "REASON_CODE_STORAGE": 5, + "REASON_CONTRACT_CREATION": 6, + "REASON_CONTRACT_CREATION2": 7, + "REASON_DELEGATE_CALL": 8, + "REASON_EVENT_LOG": 9, + "REASON_EXT_CODE_COPY": 10, + "REASON_FAILED_EXECUTION": 11, + "REASON_INTRINSIC_GAS": 12, + "REASON_PRECOMPILED_CONTRACT": 13, + "REASON_REFUND_AFTER_EXECUTION": 14, + "REASON_RETURN": 15, + "REASON_RETURN_DATA_COPY": 16, + "REASON_REVERT": 17, + "REASON_SELF_DESTRUCT": 18, + "REASON_STATIC_CALL": 19, + "REASON_STATE_COLD_ACCESS": 20, + "REASON_TX_INITIAL_BALANCE": 21, + "REASON_TX_REFUNDS": 22, + "REASON_TX_LEFT_OVER_RETURNED": 23, + "REASON_CALL_INITIAL_BALANCE": 24, + "REASON_CALL_LEFT_OVER_RETURNED": 25, + } +) + +func (x GasChange_Reason) Enum() *GasChange_Reason { + p := new(GasChange_Reason) + *p = x + return p +} + +func (x GasChange_Reason) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (GasChange_Reason) Descriptor() protoreflect.EnumDescriptor { + return file_sf_ethereum_type_v2_type_proto_enumTypes[5].Descriptor() +} + +func (GasChange_Reason) Type() protoreflect.EnumType { + return &file_sf_ethereum_type_v2_type_proto_enumTypes[5] +} + +func (x GasChange_Reason) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use GasChange_Reason.Descriptor instead. +func (GasChange_Reason) EnumDescriptor() ([]byte, []int) { + return file_sf_ethereum_type_v2_type_proto_rawDescGZIP(), []int{15, 0} +} + +type Block struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Hash is the block's hash. + Hash []byte `protobuf:"bytes,2,opt,name=hash,proto3" json:"hash,omitempty"` + // Number is the block's height at which this block was mined. + Number uint64 `protobuf:"varint,3,opt,name=number,proto3" json:"number,omitempty"` + // Size is the size in bytes of the RLP encoding of the block according to Ethereum + // rules. + Size uint64 `protobuf:"varint,4,opt,name=size,proto3" json:"size,omitempty"` + // Header contain's the block's header information like its parent hash, the merkel root hash + // and all other information the form a block. + Header *BlockHeader `protobuf:"bytes,5,opt,name=header,proto3" json:"header,omitempty"` + // Uncles represents block produced with a valid solution but were not actually choosen + // as the canonical block for the given height so they are mostly "forked" blocks. + // + // If the Block has been produced using the Proof of Stake consensus algorithm, this + // field will actually be always empty. + Uncles []*BlockHeader `protobuf:"bytes,6,rep,name=uncles,proto3" json:"uncles,omitempty"` + // TransactionTraces hold the execute trace of all the transactions that were executed + // in this block. In in there that you will find most of the Ethereum data model. + // + // They are ordered by the order of execution of the transaction in the block. + TransactionTraces []*TransactionTrace `protobuf:"bytes,10,rep,name=transaction_traces,json=transactionTraces,proto3" json:"transaction_traces,omitempty"` + // BalanceChanges here is the array of ETH transfer that happened at the block level + // outside of the normal transaction flow of a block. The best example of this is mining + // reward for the block mined, the transfer of ETH to the miner happens outside the normal + // transaction flow of the chain and is recorded as a `BalanceChange` here since we cannot + // attached it to any transaction. + // + // Only available in DetailLevel: EXTENDED + BalanceChanges []*BalanceChange `protobuf:"bytes,11,rep,name=balance_changes,json=balanceChanges,proto3" json:"balance_changes,omitempty"` + // DetailLevel affects the data available in this block. + // + // EXTENDED describes the most complete block, with traces, balance changes, storage changes. It is extracted during the execution of the block. + // BASE describes a block that contains only the block header, transaction receipts and event logs: everything that can be extracted using the base JSON-RPC interface (https://ethereum.org/en/developers/docs/apis/json-rpc/#json-rpc-methods) + // + // Furthermore, the eth_getTransactionReceipt call has been avoided because it brings only minimal improvements at the cost of requiring an archive node or a full node with complete transaction index. + DetailLevel Block_DetailLevel `protobuf:"varint,12,opt,name=detail_level,json=detailLevel,proto3,enum=sf.ethereum.type.v2.Block_DetailLevel" json:"detail_level,omitempty"` + // CodeChanges here is the array of smart code change that happened that happened at the block level + // outside of the normal transaction flow of a block. Some Ethereum's fork like BSC and Polygon + // has some capabilities to upgrade internal smart contracts used usually to track the validator + // list. + // + // On hard fork, some procedure runs to upgrade the smart contract code to a new version. In those + // network, a `CodeChange` for each modified smart contract on upgrade would be present here. Note + // that this happen rarely, so the vast majority of block will have an empty list here. + // Only available in DetailLevel: EXTENDED + CodeChanges []*CodeChange `protobuf:"bytes,20,rep,name=code_changes,json=codeChanges,proto3" json:"code_changes,omitempty"` + // System calls are introduced in Cancun, along with blobs. They are executed outside of transactions but affect the state. + // Only available in DetailLevel: EXTENDED + SystemCalls []*Call `protobuf:"bytes,21,rep,name=system_calls,json=systemCalls,proto3" json:"system_calls,omitempty"` + // Ver represents that data model version of the block, it is used internally by Firehose on Ethereum + // as a validation that we are reading the correct version. + Ver int32 `protobuf:"varint,1,opt,name=ver,proto3" json:"ver,omitempty"` +} + +func (x *Block) Reset() { + *x = Block{} + if protoimpl.UnsafeEnabled { + mi := &file_sf_ethereum_type_v2_type_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Block) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Block) ProtoMessage() {} + +func (x *Block) ProtoReflect() protoreflect.Message { + mi := &file_sf_ethereum_type_v2_type_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Block.ProtoReflect.Descriptor instead. +func (*Block) Descriptor() ([]byte, []int) { + return file_sf_ethereum_type_v2_type_proto_rawDescGZIP(), []int{0} +} + +func (x *Block) GetHash() []byte { + if x != nil { + return x.Hash + } + return nil +} + +func (x *Block) GetNumber() uint64 { + if x != nil { + return x.Number + } + return 0 +} + +func (x *Block) GetSize() uint64 { + if x != nil { + return x.Size + } + return 0 +} + +func (x *Block) GetHeader() *BlockHeader { + if x != nil { + return x.Header + } + return nil +} + +func (x *Block) GetUncles() []*BlockHeader { + if x != nil { + return x.Uncles + } + return nil +} + +func (x *Block) GetTransactionTraces() []*TransactionTrace { + if x != nil { + return x.TransactionTraces + } + return nil +} + +func (x *Block) GetBalanceChanges() []*BalanceChange { + if x != nil { + return x.BalanceChanges + } + return nil +} + +func (x *Block) GetDetailLevel() Block_DetailLevel { + if x != nil { + return x.DetailLevel + } + return Block_DETAILLEVEL_EXTENDED +} + +func (x *Block) GetCodeChanges() []*CodeChange { + if x != nil { + return x.CodeChanges + } + return nil +} + +func (x *Block) GetSystemCalls() []*Call { + if x != nil { + return x.SystemCalls + } + return nil +} + +func (x *Block) GetVer() int32 { + if x != nil { + return x.Ver + } + return 0 +} + +type BlockHeader struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ParentHash []byte `protobuf:"bytes,1,opt,name=parent_hash,json=parentHash,proto3" json:"parent_hash,omitempty"` + // Uncle hash of the block, some reference it as `sha3Uncles`, but `sha3“ is badly worded, so we prefer `uncle_hash`, also + // referred as `ommers` in EIP specification. + // + // If the Block containing this `BlockHeader` has been produced using the Proof of Stake + // consensus algorithm, this field will actually be constant and set to `0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347`. + UncleHash []byte `protobuf:"bytes,2,opt,name=uncle_hash,json=uncleHash,proto3" json:"uncle_hash,omitempty"` + Coinbase []byte `protobuf:"bytes,3,opt,name=coinbase,proto3" json:"coinbase,omitempty"` + StateRoot []byte `protobuf:"bytes,4,opt,name=state_root,json=stateRoot,proto3" json:"state_root,omitempty"` + TransactionsRoot []byte `protobuf:"bytes,5,opt,name=transactions_root,json=transactionsRoot,proto3" json:"transactions_root,omitempty"` + ReceiptRoot []byte `protobuf:"bytes,6,opt,name=receipt_root,json=receiptRoot,proto3" json:"receipt_root,omitempty"` + LogsBloom []byte `protobuf:"bytes,7,opt,name=logs_bloom,json=logsBloom,proto3" json:"logs_bloom,omitempty"` + // Difficulty is the difficulty of the Proof of Work algorithm that was required to compute a solution. + // + // If the Block containing this `BlockHeader` has been produced using the Proof of Stake + // consensus algorithm, this field will actually be constant and set to `0x00`. + Difficulty *BigInt `protobuf:"bytes,8,opt,name=difficulty,proto3" json:"difficulty,omitempty"` + // TotalDifficulty is the sum of all previous blocks difficulty including this block difficulty. + // + // If the Block containing this `BlockHeader` has been produced using the Proof of Stake + // consensus algorithm, this field will actually be constant and set to the terminal total difficulty + // that was required to transition to Proof of Stake algorithm, which varies per network. It is set to + // 58 750 000 000 000 000 000 000 on Ethereum Mainnet and to 10 790 000 on Ethereum Testnet Goerli. + TotalDifficulty *BigInt `protobuf:"bytes,17,opt,name=total_difficulty,json=totalDifficulty,proto3" json:"total_difficulty,omitempty"` + Number uint64 `protobuf:"varint,9,opt,name=number,proto3" json:"number,omitempty"` + GasLimit uint64 `protobuf:"varint,10,opt,name=gas_limit,json=gasLimit,proto3" json:"gas_limit,omitempty"` + GasUsed uint64 `protobuf:"varint,11,opt,name=gas_used,json=gasUsed,proto3" json:"gas_used,omitempty"` + Timestamp *timestamppb.Timestamp `protobuf:"bytes,12,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + // ExtraData is free-form bytes included in the block by the "miner". While on Yellow paper of + // Ethereum this value is maxed to 32 bytes, other consensus algorithm like Clique and some other + // forks are using bigger values to carry special consensus data. + // + // If the Block containing this `BlockHeader` has been produced using the Proof of Stake + // consensus algorithm, this field is strictly enforced to be <= 32 bytes. + ExtraData []byte `protobuf:"bytes,13,opt,name=extra_data,json=extraData,proto3" json:"extra_data,omitempty"` + // MixHash is used to prove, when combined with the `nonce` that sufficient amount of computation has been + // achieved and that the solution found is valid. + MixHash []byte `protobuf:"bytes,14,opt,name=mix_hash,json=mixHash,proto3" json:"mix_hash,omitempty"` + // Nonce is used to prove, when combined with the `mix_hash` that sufficient amount of computation has been + // achieved and that the solution found is valid. + // + // If the Block containing this `BlockHeader` has been produced using the Proof of Stake + // consensus algorithm, this field will actually be constant and set to `0`. + Nonce uint64 `protobuf:"varint,15,opt,name=nonce,proto3" json:"nonce,omitempty"` + // Hash is the hash of the block which is actually the computation: + // + // Keccak256(rlp([ + // parent_hash, + // uncle_hash, + // coinbase, + // state_root, + // transactions_root, + // receipt_root, + // logs_bloom, + // difficulty, + // number, + // gas_limit, + // gas_used, + // timestamp, + // extra_data, + // mix_hash, + // nonce, + // base_fee_per_gas (to be included only if London fork is active) + // withdrawals_root (to be included only if Shangai fork is active) + // blob_gas_used (to be included only if Cancun fork is active) + // excess_blob_gas (to be included only if Cancun fork is active) + // parent_beacon_root (to be included only if Cancun fork is active) + // ])) + Hash []byte `protobuf:"bytes,16,opt,name=hash,proto3" json:"hash,omitempty"` + // Base fee per gas according to EIP-1559 (e.g. London Fork) rules, only set if London is present/active on the chain. + BaseFeePerGas *BigInt `protobuf:"bytes,18,opt,name=base_fee_per_gas,json=baseFeePerGas,proto3" json:"base_fee_per_gas,omitempty"` + // Withdrawals root hash according to EIP-4895 (e.g. Shangai Fork) rules, only set if Shangai is present/active on the chain. + // + // Only available in DetailLevel: EXTENDED + WithdrawalsRoot []byte `protobuf:"bytes,19,opt,name=withdrawals_root,json=withdrawalsRoot,proto3" json:"withdrawals_root,omitempty"` + // Only available in DetailLevel: EXTENDED + TxDependency *Uint64NestedArray `protobuf:"bytes,20,opt,name=tx_dependency,json=txDependency,proto3" json:"tx_dependency,omitempty"` + // BlobGasUsed was added by EIP-4844 and is ignored in legacy headers. + BlobGasUsed *uint64 `protobuf:"varint,22,opt,name=blob_gas_used,json=blobGasUsed,proto3,oneof" json:"blob_gas_used,omitempty"` + // ExcessBlobGas was added by EIP-4844 and is ignored in legacy headers. + ExcessBlobGas *uint64 `protobuf:"varint,23,opt,name=excess_blob_gas,json=excessBlobGas,proto3,oneof" json:"excess_blob_gas,omitempty"` + // ParentBeaconRoot was added by EIP-4788 and is ignored in legacy headers. + ParentBeaconRoot []byte `protobuf:"bytes,24,opt,name=parent_beacon_root,json=parentBeaconRoot,proto3" json:"parent_beacon_root,omitempty"` +} + +func (x *BlockHeader) Reset() { + *x = BlockHeader{} + if protoimpl.UnsafeEnabled { + mi := &file_sf_ethereum_type_v2_type_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *BlockHeader) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*BlockHeader) ProtoMessage() {} + +func (x *BlockHeader) ProtoReflect() protoreflect.Message { + mi := &file_sf_ethereum_type_v2_type_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use BlockHeader.ProtoReflect.Descriptor instead. +func (*BlockHeader) Descriptor() ([]byte, []int) { + return file_sf_ethereum_type_v2_type_proto_rawDescGZIP(), []int{1} +} + +func (x *BlockHeader) GetParentHash() []byte { + if x != nil { + return x.ParentHash + } + return nil +} + +func (x *BlockHeader) GetUncleHash() []byte { + if x != nil { + return x.UncleHash + } + return nil +} + +func (x *BlockHeader) GetCoinbase() []byte { + if x != nil { + return x.Coinbase + } + return nil +} + +func (x *BlockHeader) GetStateRoot() []byte { + if x != nil { + return x.StateRoot + } + return nil +} + +func (x *BlockHeader) GetTransactionsRoot() []byte { + if x != nil { + return x.TransactionsRoot + } + return nil +} + +func (x *BlockHeader) GetReceiptRoot() []byte { + if x != nil { + return x.ReceiptRoot + } + return nil +} + +func (x *BlockHeader) GetLogsBloom() []byte { + if x != nil { + return x.LogsBloom + } + return nil +} + +func (x *BlockHeader) GetDifficulty() *BigInt { + if x != nil { + return x.Difficulty + } + return nil +} + +func (x *BlockHeader) GetTotalDifficulty() *BigInt { + if x != nil { + return x.TotalDifficulty + } + return nil +} + +func (x *BlockHeader) GetNumber() uint64 { + if x != nil { + return x.Number + } + return 0 +} + +func (x *BlockHeader) GetGasLimit() uint64 { + if x != nil { + return x.GasLimit + } + return 0 +} + +func (x *BlockHeader) GetGasUsed() uint64 { + if x != nil { + return x.GasUsed + } + return 0 +} + +func (x *BlockHeader) GetTimestamp() *timestamppb.Timestamp { + if x != nil { + return x.Timestamp + } + return nil +} + +func (x *BlockHeader) GetExtraData() []byte { + if x != nil { + return x.ExtraData + } + return nil +} + +func (x *BlockHeader) GetMixHash() []byte { + if x != nil { + return x.MixHash + } + return nil +} + +func (x *BlockHeader) GetNonce() uint64 { + if x != nil { + return x.Nonce + } + return 0 +} + +func (x *BlockHeader) GetHash() []byte { + if x != nil { + return x.Hash + } + return nil +} + +func (x *BlockHeader) GetBaseFeePerGas() *BigInt { + if x != nil { + return x.BaseFeePerGas + } + return nil +} + +func (x *BlockHeader) GetWithdrawalsRoot() []byte { + if x != nil { + return x.WithdrawalsRoot + } + return nil +} + +func (x *BlockHeader) GetTxDependency() *Uint64NestedArray { + if x != nil { + return x.TxDependency + } + return nil +} + +func (x *BlockHeader) GetBlobGasUsed() uint64 { + if x != nil && x.BlobGasUsed != nil { + return *x.BlobGasUsed + } + return 0 +} + +func (x *BlockHeader) GetExcessBlobGas() uint64 { + if x != nil && x.ExcessBlobGas != nil { + return *x.ExcessBlobGas + } + return 0 +} + +func (x *BlockHeader) GetParentBeaconRoot() []byte { + if x != nil { + return x.ParentBeaconRoot + } + return nil +} + +type Uint64NestedArray struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Val []*Uint64Array `protobuf:"bytes,1,rep,name=val,proto3" json:"val,omitempty"` +} + +func (x *Uint64NestedArray) Reset() { + *x = Uint64NestedArray{} + if protoimpl.UnsafeEnabled { + mi := &file_sf_ethereum_type_v2_type_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Uint64NestedArray) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Uint64NestedArray) ProtoMessage() {} + +func (x *Uint64NestedArray) ProtoReflect() protoreflect.Message { + mi := &file_sf_ethereum_type_v2_type_proto_msgTypes[2] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Uint64NestedArray.ProtoReflect.Descriptor instead. +func (*Uint64NestedArray) Descriptor() ([]byte, []int) { + return file_sf_ethereum_type_v2_type_proto_rawDescGZIP(), []int{2} +} + +func (x *Uint64NestedArray) GetVal() []*Uint64Array { + if x != nil { + return x.Val + } + return nil +} + +type Uint64Array struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Val []uint64 `protobuf:"varint,1,rep,packed,name=val,proto3" json:"val,omitempty"` +} + +func (x *Uint64Array) Reset() { + *x = Uint64Array{} + if protoimpl.UnsafeEnabled { + mi := &file_sf_ethereum_type_v2_type_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Uint64Array) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Uint64Array) ProtoMessage() {} + +func (x *Uint64Array) ProtoReflect() protoreflect.Message { + mi := &file_sf_ethereum_type_v2_type_proto_msgTypes[3] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Uint64Array.ProtoReflect.Descriptor instead. +func (*Uint64Array) Descriptor() ([]byte, []int) { + return file_sf_ethereum_type_v2_type_proto_rawDescGZIP(), []int{3} +} + +func (x *Uint64Array) GetVal() []uint64 { + if x != nil { + return x.Val + } + return nil +} + +type BigInt struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Bytes []byte `protobuf:"bytes,1,opt,name=bytes,proto3" json:"bytes,omitempty"` +} + +func (x *BigInt) Reset() { + *x = BigInt{} + if protoimpl.UnsafeEnabled { + mi := &file_sf_ethereum_type_v2_type_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *BigInt) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*BigInt) ProtoMessage() {} + +func (x *BigInt) ProtoReflect() protoreflect.Message { + mi := &file_sf_ethereum_type_v2_type_proto_msgTypes[4] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use BigInt.ProtoReflect.Descriptor instead. +func (*BigInt) Descriptor() ([]byte, []int) { + return file_sf_ethereum_type_v2_type_proto_rawDescGZIP(), []int{4} +} + +func (x *BigInt) GetBytes() []byte { + if x != nil { + return x.Bytes + } + return nil +} + +// TransactionTrace is full trace of execution of the transaction when the +// it actually executed on chain. +// +// It contains all the transaction details like `from`, `to`, `gas`, etc. +// as well as all the internal calls that were made during the transaction. +// +// The `calls` vector contains Call objects which have balance changes, events +// storage changes, etc. +// +// If ordering is important between elements, almost each message like `Log`, +// `Call`, `StorageChange`, etc. have an ordinal field that is represents "execution" +// order of the said element against all other elements in this block. +// +// Due to how the call tree works doing "naively", looping through all calls then +// through a Call's element like `logs` while not yielding the elements in the order +// they were executed on chain. A log in call could have been done before or after +// another in another call depending on the actual call tree. +// +// The `calls` are ordered by creation order and the call tree can be re-computing +// using fields found in `Call` object (parent/child relationship). +// +// Another important thing to note is that even if a transaction succeed, some calls +// within it could have been reverted internally, if this is important to you, you must +// check the field `state_reverted` on the `Call` to determine if it was fully committed +// to the chain or not. +type TransactionTrace struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // consensus + To []byte `protobuf:"bytes,1,opt,name=to,proto3" json:"to,omitempty"` + Nonce uint64 `protobuf:"varint,2,opt,name=nonce,proto3" json:"nonce,omitempty"` + // GasPrice represents the effective price that has been paid for each gas unit of this transaction. Over time, the + // Ethereum rules changes regarding GasPrice field here. Before London fork, the GasPrice was always set to the + // fixed gas price. After London fork, this value has different meaning depending on the transaction type (see `Type` field). + // + // In cases where `TransactionTrace.Type == TRX_TYPE_LEGACY || TRX_TYPE_ACCESS_LIST`, then GasPrice has the same meaning + // as before the London fork. + // + // In cases where `TransactionTrace.Type == TRX_TYPE_DYNAMIC_FEE`, then GasPrice is the effective gas price paid + // for the transaction which is equals to `BlockHeader.BaseFeePerGas + TransactionTrace.` + GasPrice *BigInt `protobuf:"bytes,3,opt,name=gas_price,json=gasPrice,proto3" json:"gas_price,omitempty"` + // GasLimit is the maximum of gas unit the sender of the transaction is willing to consume when perform the EVM + // execution of the whole transaction + GasLimit uint64 `protobuf:"varint,4,opt,name=gas_limit,json=gasLimit,proto3" json:"gas_limit,omitempty"` + // Value is the amount of Ether transferred as part of this transaction. + Value *BigInt `protobuf:"bytes,5,opt,name=value,proto3" json:"value,omitempty"` + // Input data the transaction will receive for execution of EVM. + Input []byte `protobuf:"bytes,6,opt,name=input,proto3" json:"input,omitempty"` + // V is the recovery ID value for the signature Y point. + V []byte `protobuf:"bytes,7,opt,name=v,proto3" json:"v,omitempty"` + // R is the signature's X point on the elliptic curve (32 bytes). + R []byte `protobuf:"bytes,8,opt,name=r,proto3" json:"r,omitempty"` + // S is the signature's Y point on the elliptic curve (32 bytes). + S []byte `protobuf:"bytes,9,opt,name=s,proto3" json:"s,omitempty"` + // GasUsed is the total amount of gas unit used for the whole execution of the transaction. + GasUsed uint64 `protobuf:"varint,10,opt,name=gas_used,json=gasUsed,proto3" json:"gas_used,omitempty"` + // Type represents the Ethereum transaction type, available only since EIP-2718 & EIP-2930 activation which happened on Berlin fork. + // The value is always set even for transaction before Berlin fork because those before the fork are still legacy transactions. + Type TransactionTrace_Type `protobuf:"varint,12,opt,name=type,proto3,enum=sf.ethereum.type.v2.TransactionTrace_Type" json:"type,omitempty"` + // AcccessList represents the storage access this transaction has agreed to do in which case those storage + // access cost less gas unit per access. + // + // This will is populated only if `TransactionTrace.Type == TRX_TYPE_ACCESS_LIST || TRX_TYPE_DYNAMIC_FEE` which + // is possible only if Berlin (TRX_TYPE_ACCESS_LIST) nor London (TRX_TYPE_DYNAMIC_FEE) fork are active on the chain. + AccessList []*AccessTuple `protobuf:"bytes,14,rep,name=access_list,json=accessList,proto3" json:"access_list,omitempty"` + // MaxFeePerGas is the maximum fee per gas the user is willing to pay for the transaction gas used. + // + // This will is populated only if `TransactionTrace.Type == TRX_TYPE_DYNAMIC_FEE` which is possible only + // if Londong fork is active on the chain. + // + // Only available in DetailLevel: EXTENDED + MaxFeePerGas *BigInt `protobuf:"bytes,11,opt,name=max_fee_per_gas,json=maxFeePerGas,proto3" json:"max_fee_per_gas,omitempty"` + // MaxPriorityFeePerGas is priority fee per gas the user to pay in extra to the miner on top of the block's + // base fee. + // + // This will is populated only if `TransactionTrace.Type == TRX_TYPE_DYNAMIC_FEE` which is possible only + // if London fork is active on the chain. + // + // Only available in DetailLevel: EXTENDED + MaxPriorityFeePerGas *BigInt `protobuf:"bytes,13,opt,name=max_priority_fee_per_gas,json=maxPriorityFeePerGas,proto3" json:"max_priority_fee_per_gas,omitempty"` + // meta + Index uint32 `protobuf:"varint,20,opt,name=index,proto3" json:"index,omitempty"` + Hash []byte `protobuf:"bytes,21,opt,name=hash,proto3" json:"hash,omitempty"` + From []byte `protobuf:"bytes,22,opt,name=from,proto3" json:"from,omitempty"` + // Only available in DetailLevel: EXTENDED + ReturnData []byte `protobuf:"bytes,23,opt,name=return_data,json=returnData,proto3" json:"return_data,omitempty"` + // Only available in DetailLevel: EXTENDED + PublicKey []byte `protobuf:"bytes,24,opt,name=public_key,json=publicKey,proto3" json:"public_key,omitempty"` + BeginOrdinal uint64 `protobuf:"varint,25,opt,name=begin_ordinal,json=beginOrdinal,proto3" json:"begin_ordinal,omitempty"` + EndOrdinal uint64 `protobuf:"varint,26,opt,name=end_ordinal,json=endOrdinal,proto3" json:"end_ordinal,omitempty"` + // TransactionTraceStatus is the status of the transaction execution and will let you know if the transaction + // was successful or not. + // + // A successful transaction has been recorded to the blockchain's state for calls in it that were successful. + // This means it's possible only a subset of the calls were properly recorded, refer to [calls[].state_reverted] field + // to determine which calls were reverted. + // + // A quirks of the Ethereum protocol is that a transaction `FAILED` or `REVERTED` still affects the blockchain's + // state for **some** of the state changes. Indeed, in those cases, the transactions fees are still paid to the miner + // which means there is a balance change for the transaction's emitter (e.g. `from`) to pay the gas fees, an optional + // balance change for gas refunded to the transaction's emitter (e.g. `from`) and a balance change for the miner who + // received the transaction fees. There is also a nonce change for the transaction's emitter (e.g. `from`). + // + // This means that to properly record the state changes for a transaction, you need to conditionally procees the + // transaction's status. + // + // For a `SUCCEEDED` transaction, you iterate over the `calls` array and record the state changes for each call for + // which `state_reverted == false` (if a transaction succeeded, the call at #0 will always `state_reverted == false` + // because it aligns with the transaction). + // + // For a `FAILED` or `REVERTED` transaction, you iterate over the root call (e.g. at #0, will always exist) for + // balance changes you process those where `reason` is either `REASON_GAS_BUY`, `REASON_GAS_REFUND` or + // `REASON_REWARD_TRANSACTION_FEE` and for nonce change, still on the root call, you pick the nonce change which the + // smallest ordinal (if more than one). + Status TransactionTraceStatus `protobuf:"varint,30,opt,name=status,proto3,enum=sf.ethereum.type.v2.TransactionTraceStatus" json:"status,omitempty"` + Receipt *TransactionReceipt `protobuf:"bytes,31,opt,name=receipt,proto3" json:"receipt,omitempty"` + // Only available in DetailLevel: EXTENDED + Calls []*Call `protobuf:"bytes,32,rep,name=calls,proto3" json:"calls,omitempty"` + // BlobGas is the amount of gas the transaction is going to pay for the blobs, this is a computed value + // equivalent to `self.blob_gas_fee_cap * len(self.blob_hashes)` and provided in the model for convenience. + // + // This is specified by https://eips.ethereum.org/EIPS/eip-4844 + // + // This will is populated only if `TransactionTrace.Type == TRX_TYPE_BLOB` which is possible only + // if Cancun fork is active on the chain. + BlobGas *uint64 `protobuf:"varint,33,opt,name=blob_gas,json=blobGas,proto3,oneof" json:"blob_gas,omitempty"` + // BlobGasFeeCap is the maximum fee per data gas the user is willing to pay for the data gas used. + // + // This is specified by https://eips.ethereum.org/EIPS/eip-4844 + // + // This will is populated only if `TransactionTrace.Type == TRX_TYPE_BLOB` which is possible only + // if Cancun fork is active on the chain. + BlobGasFeeCap *BigInt `protobuf:"bytes,34,opt,name=blob_gas_fee_cap,json=blobGasFeeCap,proto3,oneof" json:"blob_gas_fee_cap,omitempty"` + // BlobHashes field represents a list of hash outputs from 'kzg_to_versioned_hash' which + // essentially is a version byte + the sha256 hash of the blob commitment (e.g. + // `BLOB_COMMITMENT_VERSION_KZG + sha256(commitment)[1:]`. + // + // This is specified by https://eips.ethereum.org/EIPS/eip-4844 + // + // This will is populated only if `TransactionTrace.Type == TRX_TYPE_BLOB` which is possible only + // if Cancun fork is active on the chain. + BlobHashes [][]byte `protobuf:"bytes,35,rep,name=blob_hashes,json=blobHashes,proto3" json:"blob_hashes,omitempty"` +} + +func (x *TransactionTrace) Reset() { + *x = TransactionTrace{} + if protoimpl.UnsafeEnabled { + mi := &file_sf_ethereum_type_v2_type_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *TransactionTrace) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TransactionTrace) ProtoMessage() {} + +func (x *TransactionTrace) ProtoReflect() protoreflect.Message { + mi := &file_sf_ethereum_type_v2_type_proto_msgTypes[5] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use TransactionTrace.ProtoReflect.Descriptor instead. +func (*TransactionTrace) Descriptor() ([]byte, []int) { + return file_sf_ethereum_type_v2_type_proto_rawDescGZIP(), []int{5} +} + +func (x *TransactionTrace) GetTo() []byte { + if x != nil { + return x.To + } + return nil +} + +func (x *TransactionTrace) GetNonce() uint64 { + if x != nil { + return x.Nonce + } + return 0 +} + +func (x *TransactionTrace) GetGasPrice() *BigInt { + if x != nil { + return x.GasPrice + } + return nil +} + +func (x *TransactionTrace) GetGasLimit() uint64 { + if x != nil { + return x.GasLimit + } + return 0 +} + +func (x *TransactionTrace) GetValue() *BigInt { + if x != nil { + return x.Value + } + return nil +} + +func (x *TransactionTrace) GetInput() []byte { + if x != nil { + return x.Input + } + return nil +} + +func (x *TransactionTrace) GetV() []byte { + if x != nil { + return x.V + } + return nil +} + +func (x *TransactionTrace) GetR() []byte { + if x != nil { + return x.R + } + return nil +} + +func (x *TransactionTrace) GetS() []byte { + if x != nil { + return x.S + } + return nil +} + +func (x *TransactionTrace) GetGasUsed() uint64 { + if x != nil { + return x.GasUsed + } + return 0 +} + +func (x *TransactionTrace) GetType() TransactionTrace_Type { + if x != nil { + return x.Type + } + return TransactionTrace_TRX_TYPE_LEGACY +} + +func (x *TransactionTrace) GetAccessList() []*AccessTuple { + if x != nil { + return x.AccessList + } + return nil +} + +func (x *TransactionTrace) GetMaxFeePerGas() *BigInt { + if x != nil { + return x.MaxFeePerGas + } + return nil +} + +func (x *TransactionTrace) GetMaxPriorityFeePerGas() *BigInt { + if x != nil { + return x.MaxPriorityFeePerGas + } + return nil +} + +func (x *TransactionTrace) GetIndex() uint32 { + if x != nil { + return x.Index + } + return 0 +} + +func (x *TransactionTrace) GetHash() []byte { + if x != nil { + return x.Hash + } + return nil +} + +func (x *TransactionTrace) GetFrom() []byte { + if x != nil { + return x.From + } + return nil +} + +func (x *TransactionTrace) GetReturnData() []byte { + if x != nil { + return x.ReturnData + } + return nil +} + +func (x *TransactionTrace) GetPublicKey() []byte { + if x != nil { + return x.PublicKey + } + return nil +} + +func (x *TransactionTrace) GetBeginOrdinal() uint64 { + if x != nil { + return x.BeginOrdinal + } + return 0 +} + +func (x *TransactionTrace) GetEndOrdinal() uint64 { + if x != nil { + return x.EndOrdinal + } + return 0 +} + +func (x *TransactionTrace) GetStatus() TransactionTraceStatus { + if x != nil { + return x.Status + } + return TransactionTraceStatus_UNKNOWN +} + +func (x *TransactionTrace) GetReceipt() *TransactionReceipt { + if x != nil { + return x.Receipt + } + return nil +} + +func (x *TransactionTrace) GetCalls() []*Call { + if x != nil { + return x.Calls + } + return nil +} + +func (x *TransactionTrace) GetBlobGas() uint64 { + if x != nil && x.BlobGas != nil { + return *x.BlobGas + } + return 0 +} + +func (x *TransactionTrace) GetBlobGasFeeCap() *BigInt { + if x != nil { + return x.BlobGasFeeCap + } + return nil +} + +func (x *TransactionTrace) GetBlobHashes() [][]byte { + if x != nil { + return x.BlobHashes + } + return nil +} + +// AccessTuple represents a list of storage keys for a given contract's address and is used +// for AccessList construction. +type AccessTuple struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Address []byte `protobuf:"bytes,1,opt,name=address,proto3" json:"address,omitempty"` + StorageKeys [][]byte `protobuf:"bytes,2,rep,name=storage_keys,json=storageKeys,proto3" json:"storage_keys,omitempty"` +} + +func (x *AccessTuple) Reset() { + *x = AccessTuple{} + if protoimpl.UnsafeEnabled { + mi := &file_sf_ethereum_type_v2_type_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *AccessTuple) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AccessTuple) ProtoMessage() {} + +func (x *AccessTuple) ProtoReflect() protoreflect.Message { + mi := &file_sf_ethereum_type_v2_type_proto_msgTypes[6] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use AccessTuple.ProtoReflect.Descriptor instead. +func (*AccessTuple) Descriptor() ([]byte, []int) { + return file_sf_ethereum_type_v2_type_proto_rawDescGZIP(), []int{6} +} + +func (x *AccessTuple) GetAddress() []byte { + if x != nil { + return x.Address + } + return nil +} + +func (x *AccessTuple) GetStorageKeys() [][]byte { + if x != nil { + return x.StorageKeys + } + return nil +} + +type TransactionReceipt struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // State root is an intermediate state_root hash, computed in-between transactions to make + // **sure** you could build a proof and point to state in the middle of a block. Geth client + // uses `PostState + root + PostStateOrStatus“ while Parity used `status_code, root...“ this piles + // hardforks, see (read the EIPs first): + // - https://github.com/ethereum/EIPs/blob/master/EIPS/eip-658.md + // + // Moreover, the notion of `Outcome“ in parity, which segregates the two concepts, which are + // stored in the same field `status_code“ can be computed based on such a hack of the `state_root` + // field, following `EIP-658`. + // + // Before Byzantinium hard fork, this field is always empty. + StateRoot []byte `protobuf:"bytes,1,opt,name=state_root,json=stateRoot,proto3" json:"state_root,omitempty"` + CumulativeGasUsed uint64 `protobuf:"varint,2,opt,name=cumulative_gas_used,json=cumulativeGasUsed,proto3" json:"cumulative_gas_used,omitempty"` + LogsBloom []byte `protobuf:"bytes,3,opt,name=logs_bloom,json=logsBloom,proto3" json:"logs_bloom,omitempty"` + Logs []*Log `protobuf:"bytes,4,rep,name=logs,proto3" json:"logs,omitempty"` + // BlobGasUsed is the amount of blob gas that has been used within this transaction. At time + // of writing, this is equal to `self.blob_gas_fee_cap * len(self.blob_hashes)`. + // + // This is specified by https://eips.ethereum.org/EIPS/eip-4844 + // + // This will is populated only if `TransactionTrace.Type == TRX_TYPE_BLOB` which is possible only + // if Cancun fork is active on the chain. + BlobGasUsed *uint64 `protobuf:"varint,5,opt,name=blob_gas_used,json=blobGasUsed,proto3,oneof" json:"blob_gas_used,omitempty"` + // BlobGasPrice is the amount to pay per blob item in the transaction. + // + // This is specified by https://eips.ethereum.org/EIPS/eip-4844 + // + // This will is populated only if `TransactionTrace.Type == TRX_TYPE_BLOB` which is possible only + // if Cancun fork is active on the chain. + BlobGasPrice *BigInt `protobuf:"bytes,6,opt,name=blob_gas_price,json=blobGasPrice,proto3,oneof" json:"blob_gas_price,omitempty"` +} + +func (x *TransactionReceipt) Reset() { + *x = TransactionReceipt{} + if protoimpl.UnsafeEnabled { + mi := &file_sf_ethereum_type_v2_type_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *TransactionReceipt) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TransactionReceipt) ProtoMessage() {} + +func (x *TransactionReceipt) ProtoReflect() protoreflect.Message { + mi := &file_sf_ethereum_type_v2_type_proto_msgTypes[7] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use TransactionReceipt.ProtoReflect.Descriptor instead. +func (*TransactionReceipt) Descriptor() ([]byte, []int) { + return file_sf_ethereum_type_v2_type_proto_rawDescGZIP(), []int{7} +} + +func (x *TransactionReceipt) GetStateRoot() []byte { + if x != nil { + return x.StateRoot + } + return nil +} + +func (x *TransactionReceipt) GetCumulativeGasUsed() uint64 { + if x != nil { + return x.CumulativeGasUsed + } + return 0 +} + +func (x *TransactionReceipt) GetLogsBloom() []byte { + if x != nil { + return x.LogsBloom + } + return nil +} + +func (x *TransactionReceipt) GetLogs() []*Log { + if x != nil { + return x.Logs + } + return nil +} + +func (x *TransactionReceipt) GetBlobGasUsed() uint64 { + if x != nil && x.BlobGasUsed != nil { + return *x.BlobGasUsed + } + return 0 +} + +func (x *TransactionReceipt) GetBlobGasPrice() *BigInt { + if x != nil { + return x.BlobGasPrice + } + return nil +} + +type Log struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Address []byte `protobuf:"bytes,1,opt,name=address,proto3" json:"address,omitempty"` + Topics [][]byte `protobuf:"bytes,2,rep,name=topics,proto3" json:"topics,omitempty"` + Data []byte `protobuf:"bytes,3,opt,name=data,proto3" json:"data,omitempty"` + // Index is the index of the log relative to the transaction. This index + // is always populated regardless of the state revertion of the the call + // that emitted this log. + // + // Only available in DetailLevel: EXTENDED + Index uint32 `protobuf:"varint,4,opt,name=index,proto3" json:"index,omitempty"` + // BlockIndex represents the index of the log relative to the Block. + // + // An **important** notice is that this field will be 0 when the call + // that emitted the log has been reverted by the chain. + // + // Currently, there is two locations where a Log can be obtained: + // - block.transaction_traces[].receipt.logs[] + // - block.transaction_traces[].calls[].logs[] + // + // In the `receipt` case, the logs will be populated only when the call + // that emitted them has not been reverted by the chain and when in this + // position, the `blockIndex` is always populated correctly. + // + // In the case of `calls` case, for `call` where `stateReverted == true`, + // the `blockIndex` value will always be 0. + BlockIndex uint32 `protobuf:"varint,6,opt,name=blockIndex,proto3" json:"blockIndex,omitempty"` + Ordinal uint64 `protobuf:"varint,7,opt,name=ordinal,proto3" json:"ordinal,omitempty"` +} + +func (x *Log) Reset() { + *x = Log{} + if protoimpl.UnsafeEnabled { + mi := &file_sf_ethereum_type_v2_type_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Log) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Log) ProtoMessage() {} + +func (x *Log) ProtoReflect() protoreflect.Message { + mi := &file_sf_ethereum_type_v2_type_proto_msgTypes[8] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Log.ProtoReflect.Descriptor instead. +func (*Log) Descriptor() ([]byte, []int) { + return file_sf_ethereum_type_v2_type_proto_rawDescGZIP(), []int{8} +} + +func (x *Log) GetAddress() []byte { + if x != nil { + return x.Address + } + return nil +} + +func (x *Log) GetTopics() [][]byte { + if x != nil { + return x.Topics + } + return nil +} + +func (x *Log) GetData() []byte { + if x != nil { + return x.Data + } + return nil +} + +func (x *Log) GetIndex() uint32 { + if x != nil { + return x.Index + } + return 0 +} + +func (x *Log) GetBlockIndex() uint32 { + if x != nil { + return x.BlockIndex + } + return 0 +} + +func (x *Log) GetOrdinal() uint64 { + if x != nil { + return x.Ordinal + } + return 0 +} + +type Call struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Index uint32 `protobuf:"varint,1,opt,name=index,proto3" json:"index,omitempty"` + ParentIndex uint32 `protobuf:"varint,2,opt,name=parent_index,json=parentIndex,proto3" json:"parent_index,omitempty"` + Depth uint32 `protobuf:"varint,3,opt,name=depth,proto3" json:"depth,omitempty"` + CallType CallType `protobuf:"varint,4,opt,name=call_type,json=callType,proto3,enum=sf.ethereum.type.v2.CallType" json:"call_type,omitempty"` + Caller []byte `protobuf:"bytes,5,opt,name=caller,proto3" json:"caller,omitempty"` + Address []byte `protobuf:"bytes,6,opt,name=address,proto3" json:"address,omitempty"` + Value *BigInt `protobuf:"bytes,7,opt,name=value,proto3" json:"value,omitempty"` + GasLimit uint64 `protobuf:"varint,8,opt,name=gas_limit,json=gasLimit,proto3" json:"gas_limit,omitempty"` + GasConsumed uint64 `protobuf:"varint,9,opt,name=gas_consumed,json=gasConsumed,proto3" json:"gas_consumed,omitempty"` + ReturnData []byte `protobuf:"bytes,13,opt,name=return_data,json=returnData,proto3" json:"return_data,omitempty"` + Input []byte `protobuf:"bytes,14,opt,name=input,proto3" json:"input,omitempty"` + ExecutedCode bool `protobuf:"varint,15,opt,name=executed_code,json=executedCode,proto3" json:"executed_code,omitempty"` + Suicide bool `protobuf:"varint,16,opt,name=suicide,proto3" json:"suicide,omitempty"` + // hex representation of the hash -> preimage + KeccakPreimages map[string]string `protobuf:"bytes,20,rep,name=keccak_preimages,json=keccakPreimages,proto3" json:"keccak_preimages,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + StorageChanges []*StorageChange `protobuf:"bytes,21,rep,name=storage_changes,json=storageChanges,proto3" json:"storage_changes,omitempty"` + BalanceChanges []*BalanceChange `protobuf:"bytes,22,rep,name=balance_changes,json=balanceChanges,proto3" json:"balance_changes,omitempty"` + NonceChanges []*NonceChange `protobuf:"bytes,24,rep,name=nonce_changes,json=nonceChanges,proto3" json:"nonce_changes,omitempty"` + Logs []*Log `protobuf:"bytes,25,rep,name=logs,proto3" json:"logs,omitempty"` + CodeChanges []*CodeChange `protobuf:"bytes,26,rep,name=code_changes,json=codeChanges,proto3" json:"code_changes,omitempty"` + GasChanges []*GasChange `protobuf:"bytes,28,rep,name=gas_changes,json=gasChanges,proto3" json:"gas_changes,omitempty"` + // In Ethereum, a call can be either: + // - Successfull, execution passes without any problem encountered + // - Failed, execution failed, and remaining gas should be consumed + // - Reverted, execution failed, but only gas consumed so far is billed, remaining gas is refunded + // + // When a call is either `failed` or `reverted`, the `status_failed` field + // below is set to `true`. If the status is `reverted`, then both `status_failed` + // and `status_reverted` are going to be set to `true`. + StatusFailed bool `protobuf:"varint,10,opt,name=status_failed,json=statusFailed,proto3" json:"status_failed,omitempty"` + StatusReverted bool `protobuf:"varint,12,opt,name=status_reverted,json=statusReverted,proto3" json:"status_reverted,omitempty"` + // Populated when a call either failed or reverted, so when `status_failed == true`, + // see above for details about those flags. + FailureReason string `protobuf:"bytes,11,opt,name=failure_reason,json=failureReason,proto3" json:"failure_reason,omitempty"` + // This field represents wheter or not the state changes performed + // by this call were correctly recorded by the blockchain. + // + // On Ethereum, a transaction can record state changes even if some + // of its inner nested calls failed. This is problematic however since + // a call will invalidate all its state changes as well as all state + // changes performed by its child call. This means that even if a call + // has a status of `SUCCESS`, the chain might have reverted all the state + // changes it performed. + // + // ```text + // + // Trx 1 + // Call #1 + // Call #2 + // Call #3 + // |--- Failure here + // Call #4 + // + // ``` + // + // In the transaction above, while Call #2 and Call #3 would have the + // status `EXECUTED`. + // + // If you check all calls and check only `state_reverted` flag, you might be missing + // some balance changes and nonce changes. This is because when a full transaction fails + // in ethereum (e.g. `calls.all(x.state_reverted == true)`), there is still the transaction + // fee that are recorded to the chain. + // + // Refer to [TransactionTrace#status] field for more details about the handling you must + // perform. + StateReverted bool `protobuf:"varint,30,opt,name=state_reverted,json=stateReverted,proto3" json:"state_reverted,omitempty"` + BeginOrdinal uint64 `protobuf:"varint,31,opt,name=begin_ordinal,json=beginOrdinal,proto3" json:"begin_ordinal,omitempty"` + EndOrdinal uint64 `protobuf:"varint,32,opt,name=end_ordinal,json=endOrdinal,proto3" json:"end_ordinal,omitempty"` + AccountCreations []*AccountCreation `protobuf:"bytes,33,rep,name=account_creations,json=accountCreations,proto3" json:"account_creations,omitempty"` +} + +func (x *Call) Reset() { + *x = Call{} + if protoimpl.UnsafeEnabled { + mi := &file_sf_ethereum_type_v2_type_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Call) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Call) ProtoMessage() {} + +func (x *Call) ProtoReflect() protoreflect.Message { + mi := &file_sf_ethereum_type_v2_type_proto_msgTypes[9] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Call.ProtoReflect.Descriptor instead. +func (*Call) Descriptor() ([]byte, []int) { + return file_sf_ethereum_type_v2_type_proto_rawDescGZIP(), []int{9} +} + +func (x *Call) GetIndex() uint32 { + if x != nil { + return x.Index + } + return 0 +} + +func (x *Call) GetParentIndex() uint32 { + if x != nil { + return x.ParentIndex + } + return 0 +} + +func (x *Call) GetDepth() uint32 { + if x != nil { + return x.Depth + } + return 0 +} + +func (x *Call) GetCallType() CallType { + if x != nil { + return x.CallType + } + return CallType_UNSPECIFIED +} + +func (x *Call) GetCaller() []byte { + if x != nil { + return x.Caller + } + return nil +} + +func (x *Call) GetAddress() []byte { + if x != nil { + return x.Address + } + return nil +} + +func (x *Call) GetValue() *BigInt { + if x != nil { + return x.Value + } + return nil +} + +func (x *Call) GetGasLimit() uint64 { + if x != nil { + return x.GasLimit + } + return 0 +} + +func (x *Call) GetGasConsumed() uint64 { + if x != nil { + return x.GasConsumed + } + return 0 +} + +func (x *Call) GetReturnData() []byte { + if x != nil { + return x.ReturnData + } + return nil +} + +func (x *Call) GetInput() []byte { + if x != nil { + return x.Input + } + return nil +} + +func (x *Call) GetExecutedCode() bool { + if x != nil { + return x.ExecutedCode + } + return false +} + +func (x *Call) GetSuicide() bool { + if x != nil { + return x.Suicide + } + return false +} + +func (x *Call) GetKeccakPreimages() map[string]string { + if x != nil { + return x.KeccakPreimages + } + return nil +} + +func (x *Call) GetStorageChanges() []*StorageChange { + if x != nil { + return x.StorageChanges + } + return nil +} + +func (x *Call) GetBalanceChanges() []*BalanceChange { + if x != nil { + return x.BalanceChanges + } + return nil +} + +func (x *Call) GetNonceChanges() []*NonceChange { + if x != nil { + return x.NonceChanges + } + return nil +} + +func (x *Call) GetLogs() []*Log { + if x != nil { + return x.Logs + } + return nil +} + +func (x *Call) GetCodeChanges() []*CodeChange { + if x != nil { + return x.CodeChanges + } + return nil +} + +func (x *Call) GetGasChanges() []*GasChange { + if x != nil { + return x.GasChanges + } + return nil +} + +func (x *Call) GetStatusFailed() bool { + if x != nil { + return x.StatusFailed + } + return false +} + +func (x *Call) GetStatusReverted() bool { + if x != nil { + return x.StatusReverted + } + return false +} + +func (x *Call) GetFailureReason() string { + if x != nil { + return x.FailureReason + } + return "" +} + +func (x *Call) GetStateReverted() bool { + if x != nil { + return x.StateReverted + } + return false +} + +func (x *Call) GetBeginOrdinal() uint64 { + if x != nil { + return x.BeginOrdinal + } + return 0 +} + +func (x *Call) GetEndOrdinal() uint64 { + if x != nil { + return x.EndOrdinal + } + return 0 +} + +func (x *Call) GetAccountCreations() []*AccountCreation { + if x != nil { + return x.AccountCreations + } + return nil +} + +type StorageChange struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Address []byte `protobuf:"bytes,1,opt,name=address,proto3" json:"address,omitempty"` + Key []byte `protobuf:"bytes,2,opt,name=key,proto3" json:"key,omitempty"` + OldValue []byte `protobuf:"bytes,3,opt,name=old_value,json=oldValue,proto3" json:"old_value,omitempty"` + NewValue []byte `protobuf:"bytes,4,opt,name=new_value,json=newValue,proto3" json:"new_value,omitempty"` + Ordinal uint64 `protobuf:"varint,5,opt,name=ordinal,proto3" json:"ordinal,omitempty"` +} + +func (x *StorageChange) Reset() { + *x = StorageChange{} + if protoimpl.UnsafeEnabled { + mi := &file_sf_ethereum_type_v2_type_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *StorageChange) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*StorageChange) ProtoMessage() {} + +func (x *StorageChange) ProtoReflect() protoreflect.Message { + mi := &file_sf_ethereum_type_v2_type_proto_msgTypes[10] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use StorageChange.ProtoReflect.Descriptor instead. +func (*StorageChange) Descriptor() ([]byte, []int) { + return file_sf_ethereum_type_v2_type_proto_rawDescGZIP(), []int{10} +} + +func (x *StorageChange) GetAddress() []byte { + if x != nil { + return x.Address + } + return nil +} + +func (x *StorageChange) GetKey() []byte { + if x != nil { + return x.Key + } + return nil +} + +func (x *StorageChange) GetOldValue() []byte { + if x != nil { + return x.OldValue + } + return nil +} + +func (x *StorageChange) GetNewValue() []byte { + if x != nil { + return x.NewValue + } + return nil +} + +func (x *StorageChange) GetOrdinal() uint64 { + if x != nil { + return x.Ordinal + } + return 0 +} + +type BalanceChange struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Address []byte `protobuf:"bytes,1,opt,name=address,proto3" json:"address,omitempty"` + OldValue *BigInt `protobuf:"bytes,2,opt,name=old_value,json=oldValue,proto3" json:"old_value,omitempty"` + NewValue *BigInt `protobuf:"bytes,3,opt,name=new_value,json=newValue,proto3" json:"new_value,omitempty"` + Reason BalanceChange_Reason `protobuf:"varint,4,opt,name=reason,proto3,enum=sf.ethereum.type.v2.BalanceChange_Reason" json:"reason,omitempty"` + Ordinal uint64 `protobuf:"varint,5,opt,name=ordinal,proto3" json:"ordinal,omitempty"` +} + +func (x *BalanceChange) Reset() { + *x = BalanceChange{} + if protoimpl.UnsafeEnabled { + mi := &file_sf_ethereum_type_v2_type_proto_msgTypes[11] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *BalanceChange) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*BalanceChange) ProtoMessage() {} + +func (x *BalanceChange) ProtoReflect() protoreflect.Message { + mi := &file_sf_ethereum_type_v2_type_proto_msgTypes[11] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use BalanceChange.ProtoReflect.Descriptor instead. +func (*BalanceChange) Descriptor() ([]byte, []int) { + return file_sf_ethereum_type_v2_type_proto_rawDescGZIP(), []int{11} +} + +func (x *BalanceChange) GetAddress() []byte { + if x != nil { + return x.Address + } + return nil +} + +func (x *BalanceChange) GetOldValue() *BigInt { + if x != nil { + return x.OldValue + } + return nil +} + +func (x *BalanceChange) GetNewValue() *BigInt { + if x != nil { + return x.NewValue + } + return nil +} + +func (x *BalanceChange) GetReason() BalanceChange_Reason { + if x != nil { + return x.Reason + } + return BalanceChange_REASON_UNKNOWN +} + +func (x *BalanceChange) GetOrdinal() uint64 { + if x != nil { + return x.Ordinal + } + return 0 +} + +type NonceChange struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Address []byte `protobuf:"bytes,1,opt,name=address,proto3" json:"address,omitempty"` + OldValue uint64 `protobuf:"varint,2,opt,name=old_value,json=oldValue,proto3" json:"old_value,omitempty"` + NewValue uint64 `protobuf:"varint,3,opt,name=new_value,json=newValue,proto3" json:"new_value,omitempty"` + Ordinal uint64 `protobuf:"varint,4,opt,name=ordinal,proto3" json:"ordinal,omitempty"` +} + +func (x *NonceChange) Reset() { + *x = NonceChange{} + if protoimpl.UnsafeEnabled { + mi := &file_sf_ethereum_type_v2_type_proto_msgTypes[12] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *NonceChange) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*NonceChange) ProtoMessage() {} + +func (x *NonceChange) ProtoReflect() protoreflect.Message { + mi := &file_sf_ethereum_type_v2_type_proto_msgTypes[12] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use NonceChange.ProtoReflect.Descriptor instead. +func (*NonceChange) Descriptor() ([]byte, []int) { + return file_sf_ethereum_type_v2_type_proto_rawDescGZIP(), []int{12} +} + +func (x *NonceChange) GetAddress() []byte { + if x != nil { + return x.Address + } + return nil +} + +func (x *NonceChange) GetOldValue() uint64 { + if x != nil { + return x.OldValue + } + return 0 +} + +func (x *NonceChange) GetNewValue() uint64 { + if x != nil { + return x.NewValue + } + return 0 +} + +func (x *NonceChange) GetOrdinal() uint64 { + if x != nil { + return x.Ordinal + } + return 0 +} + +type AccountCreation struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Account []byte `protobuf:"bytes,1,opt,name=account,proto3" json:"account,omitempty"` + Ordinal uint64 `protobuf:"varint,2,opt,name=ordinal,proto3" json:"ordinal,omitempty"` +} + +func (x *AccountCreation) Reset() { + *x = AccountCreation{} + if protoimpl.UnsafeEnabled { + mi := &file_sf_ethereum_type_v2_type_proto_msgTypes[13] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *AccountCreation) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AccountCreation) ProtoMessage() {} + +func (x *AccountCreation) ProtoReflect() protoreflect.Message { + mi := &file_sf_ethereum_type_v2_type_proto_msgTypes[13] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use AccountCreation.ProtoReflect.Descriptor instead. +func (*AccountCreation) Descriptor() ([]byte, []int) { + return file_sf_ethereum_type_v2_type_proto_rawDescGZIP(), []int{13} +} + +func (x *AccountCreation) GetAccount() []byte { + if x != nil { + return x.Account + } + return nil +} + +func (x *AccountCreation) GetOrdinal() uint64 { + if x != nil { + return x.Ordinal + } + return 0 +} + +type CodeChange struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Address []byte `protobuf:"bytes,1,opt,name=address,proto3" json:"address,omitempty"` + OldHash []byte `protobuf:"bytes,2,opt,name=old_hash,json=oldHash,proto3" json:"old_hash,omitempty"` + OldCode []byte `protobuf:"bytes,3,opt,name=old_code,json=oldCode,proto3" json:"old_code,omitempty"` + NewHash []byte `protobuf:"bytes,4,opt,name=new_hash,json=newHash,proto3" json:"new_hash,omitempty"` + NewCode []byte `protobuf:"bytes,5,opt,name=new_code,json=newCode,proto3" json:"new_code,omitempty"` + Ordinal uint64 `protobuf:"varint,6,opt,name=ordinal,proto3" json:"ordinal,omitempty"` +} + +func (x *CodeChange) Reset() { + *x = CodeChange{} + if protoimpl.UnsafeEnabled { + mi := &file_sf_ethereum_type_v2_type_proto_msgTypes[14] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CodeChange) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CodeChange) ProtoMessage() {} + +func (x *CodeChange) ProtoReflect() protoreflect.Message { + mi := &file_sf_ethereum_type_v2_type_proto_msgTypes[14] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CodeChange.ProtoReflect.Descriptor instead. +func (*CodeChange) Descriptor() ([]byte, []int) { + return file_sf_ethereum_type_v2_type_proto_rawDescGZIP(), []int{14} +} + +func (x *CodeChange) GetAddress() []byte { + if x != nil { + return x.Address + } + return nil +} + +func (x *CodeChange) GetOldHash() []byte { + if x != nil { + return x.OldHash + } + return nil +} + +func (x *CodeChange) GetOldCode() []byte { + if x != nil { + return x.OldCode + } + return nil +} + +func (x *CodeChange) GetNewHash() []byte { + if x != nil { + return x.NewHash + } + return nil +} + +func (x *CodeChange) GetNewCode() []byte { + if x != nil { + return x.NewCode + } + return nil +} + +func (x *CodeChange) GetOrdinal() uint64 { + if x != nil { + return x.Ordinal + } + return 0 +} + +// The gas change model represents the reason why some gas cost has occurred. +// The gas is computed per actual op codes. Doing them completely might prove +// overwhelming in most cases. +// +// Hence, we only index some of them, those that are costy like all the calls +// one, log events, return data, etc. +type GasChange struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + OldValue uint64 `protobuf:"varint,1,opt,name=old_value,json=oldValue,proto3" json:"old_value,omitempty"` + NewValue uint64 `protobuf:"varint,2,opt,name=new_value,json=newValue,proto3" json:"new_value,omitempty"` + Reason GasChange_Reason `protobuf:"varint,3,opt,name=reason,proto3,enum=sf.ethereum.type.v2.GasChange_Reason" json:"reason,omitempty"` + Ordinal uint64 `protobuf:"varint,4,opt,name=ordinal,proto3" json:"ordinal,omitempty"` +} + +func (x *GasChange) Reset() { + *x = GasChange{} + if protoimpl.UnsafeEnabled { + mi := &file_sf_ethereum_type_v2_type_proto_msgTypes[15] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GasChange) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GasChange) ProtoMessage() {} + +func (x *GasChange) ProtoReflect() protoreflect.Message { + mi := &file_sf_ethereum_type_v2_type_proto_msgTypes[15] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GasChange.ProtoReflect.Descriptor instead. +func (*GasChange) Descriptor() ([]byte, []int) { + return file_sf_ethereum_type_v2_type_proto_rawDescGZIP(), []int{15} +} + +func (x *GasChange) GetOldValue() uint64 { + if x != nil { + return x.OldValue + } + return 0 +} + +func (x *GasChange) GetNewValue() uint64 { + if x != nil { + return x.NewValue + } + return 0 +} + +func (x *GasChange) GetReason() GasChange_Reason { + if x != nil { + return x.Reason + } + return GasChange_REASON_UNKNOWN +} + +func (x *GasChange) GetOrdinal() uint64 { + if x != nil { + return x.Ordinal + } + return 0 +} + +// HeaderOnlyBlock is used to optimally unpack the [Block] structure (note the +// corresponding message number for the `header` field) while consuming less +// memory, when only the `header` is desired. +// +// WARN: this is a client-side optimization pattern and should be moved in the +// consuming code. +type HeaderOnlyBlock struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Header *BlockHeader `protobuf:"bytes,5,opt,name=header,proto3" json:"header,omitempty"` +} + +func (x *HeaderOnlyBlock) Reset() { + *x = HeaderOnlyBlock{} + if protoimpl.UnsafeEnabled { + mi := &file_sf_ethereum_type_v2_type_proto_msgTypes[16] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *HeaderOnlyBlock) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*HeaderOnlyBlock) ProtoMessage() {} + +func (x *HeaderOnlyBlock) ProtoReflect() protoreflect.Message { + mi := &file_sf_ethereum_type_v2_type_proto_msgTypes[16] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use HeaderOnlyBlock.ProtoReflect.Descriptor instead. +func (*HeaderOnlyBlock) Descriptor() ([]byte, []int) { + return file_sf_ethereum_type_v2_type_proto_rawDescGZIP(), []int{16} +} + +func (x *HeaderOnlyBlock) GetHeader() *BlockHeader { + if x != nil { + return x.Header + } + return nil +} + +// BlockWithRefs is a lightweight block, with traces and transactions +// purged from the `block` within, and only. It is used in transports +// to pass block data around. +type BlockWithRefs struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + Block *Block `protobuf:"bytes,2,opt,name=block,proto3" json:"block,omitempty"` + TransactionTraceRefs *TransactionRefs `protobuf:"bytes,3,opt,name=transaction_trace_refs,json=transactionTraceRefs,proto3" json:"transaction_trace_refs,omitempty"` + Irreversible bool `protobuf:"varint,4,opt,name=irreversible,proto3" json:"irreversible,omitempty"` +} + +func (x *BlockWithRefs) Reset() { + *x = BlockWithRefs{} + if protoimpl.UnsafeEnabled { + mi := &file_sf_ethereum_type_v2_type_proto_msgTypes[17] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *BlockWithRefs) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*BlockWithRefs) ProtoMessage() {} + +func (x *BlockWithRefs) ProtoReflect() protoreflect.Message { + mi := &file_sf_ethereum_type_v2_type_proto_msgTypes[17] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use BlockWithRefs.ProtoReflect.Descriptor instead. +func (*BlockWithRefs) Descriptor() ([]byte, []int) { + return file_sf_ethereum_type_v2_type_proto_rawDescGZIP(), []int{17} +} + +func (x *BlockWithRefs) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +func (x *BlockWithRefs) GetBlock() *Block { + if x != nil { + return x.Block + } + return nil +} + +func (x *BlockWithRefs) GetTransactionTraceRefs() *TransactionRefs { + if x != nil { + return x.TransactionTraceRefs + } + return nil +} + +func (x *BlockWithRefs) GetIrreversible() bool { + if x != nil { + return x.Irreversible + } + return false +} + +type TransactionTraceWithBlockRef struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Trace *TransactionTrace `protobuf:"bytes,1,opt,name=trace,proto3" json:"trace,omitempty"` + BlockRef *BlockRef `protobuf:"bytes,2,opt,name=block_ref,json=blockRef,proto3" json:"block_ref,omitempty"` +} + +func (x *TransactionTraceWithBlockRef) Reset() { + *x = TransactionTraceWithBlockRef{} + if protoimpl.UnsafeEnabled { + mi := &file_sf_ethereum_type_v2_type_proto_msgTypes[18] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *TransactionTraceWithBlockRef) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TransactionTraceWithBlockRef) ProtoMessage() {} + +func (x *TransactionTraceWithBlockRef) ProtoReflect() protoreflect.Message { + mi := &file_sf_ethereum_type_v2_type_proto_msgTypes[18] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use TransactionTraceWithBlockRef.ProtoReflect.Descriptor instead. +func (*TransactionTraceWithBlockRef) Descriptor() ([]byte, []int) { + return file_sf_ethereum_type_v2_type_proto_rawDescGZIP(), []int{18} +} + +func (x *TransactionTraceWithBlockRef) GetTrace() *TransactionTrace { + if x != nil { + return x.Trace + } + return nil +} + +func (x *TransactionTraceWithBlockRef) GetBlockRef() *BlockRef { + if x != nil { + return x.BlockRef + } + return nil +} + +type TransactionRefs struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Hashes [][]byte `protobuf:"bytes,1,rep,name=hashes,proto3" json:"hashes,omitempty"` +} + +func (x *TransactionRefs) Reset() { + *x = TransactionRefs{} + if protoimpl.UnsafeEnabled { + mi := &file_sf_ethereum_type_v2_type_proto_msgTypes[19] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *TransactionRefs) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TransactionRefs) ProtoMessage() {} + +func (x *TransactionRefs) ProtoReflect() protoreflect.Message { + mi := &file_sf_ethereum_type_v2_type_proto_msgTypes[19] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use TransactionRefs.ProtoReflect.Descriptor instead. +func (*TransactionRefs) Descriptor() ([]byte, []int) { + return file_sf_ethereum_type_v2_type_proto_rawDescGZIP(), []int{19} +} + +func (x *TransactionRefs) GetHashes() [][]byte { + if x != nil { + return x.Hashes + } + return nil +} + +type BlockRef struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Hash []byte `protobuf:"bytes,1,opt,name=hash,proto3" json:"hash,omitempty"` + Number uint64 `protobuf:"varint,2,opt,name=number,proto3" json:"number,omitempty"` +} + +func (x *BlockRef) Reset() { + *x = BlockRef{} + if protoimpl.UnsafeEnabled { + mi := &file_sf_ethereum_type_v2_type_proto_msgTypes[20] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *BlockRef) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*BlockRef) ProtoMessage() {} + +func (x *BlockRef) ProtoReflect() protoreflect.Message { + mi := &file_sf_ethereum_type_v2_type_proto_msgTypes[20] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use BlockRef.ProtoReflect.Descriptor instead. +func (*BlockRef) Descriptor() ([]byte, []int) { + return file_sf_ethereum_type_v2_type_proto_rawDescGZIP(), []int{20} +} + +func (x *BlockRef) GetHash() []byte { + if x != nil { + return x.Hash + } + return nil +} + +func (x *BlockRef) GetNumber() uint64 { + if x != nil { + return x.Number + } + return 0 +} + +var File_sf_ethereum_type_v2_type_proto protoreflect.FileDescriptor + +var file_sf_ethereum_type_v2_type_proto_rawDesc = []byte{ + 0x0a, 0x1e, 0x73, 0x66, 0x2f, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2f, 0x74, 0x79, + 0x70, 0x65, 0x2f, 0x76, 0x32, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x12, 0x13, 0x73, 0x66, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x74, 0x79, + 0x70, 0x65, 0x2e, 0x76, 0x32, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x8e, 0x05, 0x0a, 0x05, 0x42, 0x6c, 0x6f, 0x63, 0x6b, + 0x12, 0x12, 0x0a, 0x04, 0x68, 0x61, 0x73, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, + 0x68, 0x61, 0x73, 0x68, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, + 0x73, 0x69, 0x7a, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, + 0x12, 0x38, 0x0a, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x20, 0x2e, 0x73, 0x66, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x74, + 0x79, 0x70, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x61, 0x64, + 0x65, 0x72, 0x52, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x38, 0x0a, 0x06, 0x75, 0x6e, + 0x63, 0x6c, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x73, 0x66, 0x2e, + 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x76, 0x32, + 0x2e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x52, 0x06, 0x75, 0x6e, + 0x63, 0x6c, 0x65, 0x73, 0x12, 0x54, 0x0a, 0x12, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x72, 0x61, 0x63, 0x65, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x25, 0x2e, 0x73, 0x66, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x74, + 0x79, 0x70, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x54, 0x72, 0x61, 0x63, 0x65, 0x52, 0x11, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x61, 0x63, 0x65, 0x73, 0x12, 0x4b, 0x0a, 0x0f, 0x62, 0x61, + 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x18, 0x0b, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x73, 0x66, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, + 0x6d, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, + 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x0e, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, + 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x12, 0x49, 0x0a, 0x0c, 0x64, 0x65, 0x74, 0x61, 0x69, + 0x6c, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x26, 0x2e, + 0x73, 0x66, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x74, 0x79, 0x70, 0x65, + 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, + 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x0b, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x4c, 0x65, 0x76, + 0x65, 0x6c, 0x12, 0x42, 0x0a, 0x0c, 0x63, 0x6f, 0x64, 0x65, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x67, + 0x65, 0x73, 0x18, 0x14, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x73, 0x66, 0x2e, 0x65, 0x74, + 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x43, + 0x6f, 0x64, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x0b, 0x63, 0x6f, 0x64, 0x65, 0x43, + 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x12, 0x3c, 0x0a, 0x0c, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, + 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x73, 0x18, 0x15, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x73, + 0x66, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, + 0x76, 0x32, 0x2e, 0x43, 0x61, 0x6c, 0x6c, 0x52, 0x0b, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x43, + 0x61, 0x6c, 0x6c, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x76, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x03, 0x76, 0x65, 0x72, 0x22, 0x3d, 0x0a, 0x0b, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, + 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x18, 0x0a, 0x14, 0x44, 0x45, 0x54, 0x41, 0x49, 0x4c, 0x4c, + 0x45, 0x56, 0x45, 0x4c, 0x5f, 0x45, 0x58, 0x54, 0x45, 0x4e, 0x44, 0x45, 0x44, 0x10, 0x00, 0x12, + 0x14, 0x0a, 0x10, 0x44, 0x45, 0x54, 0x41, 0x49, 0x4c, 0x4c, 0x45, 0x56, 0x45, 0x4c, 0x5f, 0x42, + 0x41, 0x53, 0x45, 0x10, 0x02, 0x4a, 0x04, 0x08, 0x28, 0x10, 0x29, 0x4a, 0x04, 0x08, 0x29, 0x10, + 0x2a, 0x4a, 0x04, 0x08, 0x2a, 0x10, 0x2b, 0x22, 0xd2, 0x07, 0x0a, 0x0b, 0x42, 0x6c, 0x6f, 0x63, + 0x6b, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x65, 0x6e, + 0x74, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0a, 0x70, 0x61, + 0x72, 0x65, 0x6e, 0x74, 0x48, 0x61, 0x73, 0x68, 0x12, 0x1d, 0x0a, 0x0a, 0x75, 0x6e, 0x63, 0x6c, + 0x65, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x75, 0x6e, + 0x63, 0x6c, 0x65, 0x48, 0x61, 0x73, 0x68, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x6f, 0x69, 0x6e, 0x62, + 0x61, 0x73, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x63, 0x6f, 0x69, 0x6e, 0x62, + 0x61, 0x73, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x72, 0x6f, 0x6f, + 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x73, 0x74, 0x61, 0x74, 0x65, 0x52, 0x6f, + 0x6f, 0x74, 0x12, 0x2b, 0x0a, 0x11, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x10, 0x74, + 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x6f, 0x6f, 0x74, 0x12, + 0x21, 0x0a, 0x0c, 0x72, 0x65, 0x63, 0x65, 0x69, 0x70, 0x74, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0b, 0x72, 0x65, 0x63, 0x65, 0x69, 0x70, 0x74, 0x52, 0x6f, + 0x6f, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x6c, 0x6f, 0x67, 0x73, 0x5f, 0x62, 0x6c, 0x6f, 0x6f, 0x6d, + 0x18, 0x07, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x6c, 0x6f, 0x67, 0x73, 0x42, 0x6c, 0x6f, 0x6f, + 0x6d, 0x12, 0x3b, 0x0a, 0x0a, 0x64, 0x69, 0x66, 0x66, 0x69, 0x63, 0x75, 0x6c, 0x74, 0x79, 0x18, + 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x73, 0x66, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, + 0x65, 0x75, 0x6d, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x69, 0x67, 0x49, + 0x6e, 0x74, 0x52, 0x0a, 0x64, 0x69, 0x66, 0x66, 0x69, 0x63, 0x75, 0x6c, 0x74, 0x79, 0x12, 0x46, + 0x0a, 0x10, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x64, 0x69, 0x66, 0x66, 0x69, 0x63, 0x75, 0x6c, + 0x74, 0x79, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x73, 0x66, 0x2e, 0x65, 0x74, + 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x42, + 0x69, 0x67, 0x49, 0x6e, 0x74, 0x52, 0x0f, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x44, 0x69, 0x66, 0x66, + 0x69, 0x63, 0x75, 0x6c, 0x74, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, + 0x18, 0x09, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x1b, + 0x0a, 0x09, 0x67, 0x61, 0x73, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x08, 0x67, 0x61, 0x73, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x67, + 0x61, 0x73, 0x5f, 0x75, 0x73, 0x65, 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x67, + 0x61, 0x73, 0x55, 0x73, 0x65, 0x64, 0x12, 0x38, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, + 0x12, 0x1d, 0x0a, 0x0a, 0x65, 0x78, 0x74, 0x72, 0x61, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x0d, + 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x65, 0x78, 0x74, 0x72, 0x61, 0x44, 0x61, 0x74, 0x61, 0x12, + 0x19, 0x0a, 0x08, 0x6d, 0x69, 0x78, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x0e, 0x20, 0x01, 0x28, + 0x0c, 0x52, 0x07, 0x6d, 0x69, 0x78, 0x48, 0x61, 0x73, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x6e, 0x6f, + 0x6e, 0x63, 0x65, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x6e, 0x6f, 0x6e, 0x63, 0x65, + 0x12, 0x12, 0x0a, 0x04, 0x68, 0x61, 0x73, 0x68, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, + 0x68, 0x61, 0x73, 0x68, 0x12, 0x44, 0x0a, 0x10, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x66, 0x65, 0x65, + 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x67, 0x61, 0x73, 0x18, 0x12, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, + 0x2e, 0x73, 0x66, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x74, 0x79, 0x70, + 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x69, 0x67, 0x49, 0x6e, 0x74, 0x52, 0x0d, 0x62, 0x61, 0x73, + 0x65, 0x46, 0x65, 0x65, 0x50, 0x65, 0x72, 0x47, 0x61, 0x73, 0x12, 0x29, 0x0a, 0x10, 0x77, 0x69, + 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x73, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x13, + 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0f, 0x77, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, + 0x73, 0x52, 0x6f, 0x6f, 0x74, 0x12, 0x4b, 0x0a, 0x0d, 0x74, 0x78, 0x5f, 0x64, 0x65, 0x70, 0x65, + 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x73, + 0x66, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, + 0x76, 0x32, 0x2e, 0x55, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x4e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x41, + 0x72, 0x72, 0x61, 0x79, 0x52, 0x0c, 0x74, 0x78, 0x44, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, + 0x63, 0x79, 0x12, 0x27, 0x0a, 0x0d, 0x62, 0x6c, 0x6f, 0x62, 0x5f, 0x67, 0x61, 0x73, 0x5f, 0x75, + 0x73, 0x65, 0x64, 0x18, 0x16, 0x20, 0x01, 0x28, 0x04, 0x48, 0x00, 0x52, 0x0b, 0x62, 0x6c, 0x6f, + 0x62, 0x47, 0x61, 0x73, 0x55, 0x73, 0x65, 0x64, 0x88, 0x01, 0x01, 0x12, 0x2b, 0x0a, 0x0f, 0x65, + 0x78, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x62, 0x6c, 0x6f, 0x62, 0x5f, 0x67, 0x61, 0x73, 0x18, 0x17, + 0x20, 0x01, 0x28, 0x04, 0x48, 0x01, 0x52, 0x0d, 0x65, 0x78, 0x63, 0x65, 0x73, 0x73, 0x42, 0x6c, + 0x6f, 0x62, 0x47, 0x61, 0x73, 0x88, 0x01, 0x01, 0x12, 0x2c, 0x0a, 0x12, 0x70, 0x61, 0x72, 0x65, + 0x6e, 0x74, 0x5f, 0x62, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x18, + 0x20, 0x01, 0x28, 0x0c, 0x52, 0x10, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x42, 0x65, 0x61, 0x63, + 0x6f, 0x6e, 0x52, 0x6f, 0x6f, 0x74, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x62, 0x6c, 0x6f, 0x62, 0x5f, + 0x67, 0x61, 0x73, 0x5f, 0x75, 0x73, 0x65, 0x64, 0x42, 0x12, 0x0a, 0x10, 0x5f, 0x65, 0x78, 0x63, + 0x65, 0x73, 0x73, 0x5f, 0x62, 0x6c, 0x6f, 0x62, 0x5f, 0x67, 0x61, 0x73, 0x22, 0x47, 0x0a, 0x11, + 0x55, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x4e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x41, 0x72, 0x72, 0x61, + 0x79, 0x12, 0x32, 0x0a, 0x03, 0x76, 0x61, 0x6c, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, + 0x2e, 0x73, 0x66, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x74, 0x79, 0x70, + 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x55, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x41, 0x72, 0x72, 0x61, 0x79, + 0x52, 0x03, 0x76, 0x61, 0x6c, 0x22, 0x1f, 0x0a, 0x0b, 0x55, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x41, + 0x72, 0x72, 0x61, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x76, 0x61, 0x6c, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x04, 0x52, 0x03, 0x76, 0x61, 0x6c, 0x22, 0x1e, 0x0a, 0x06, 0x42, 0x69, 0x67, 0x49, 0x6e, 0x74, + 0x12, 0x14, 0x0a, 0x05, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, + 0x05, 0x62, 0x79, 0x74, 0x65, 0x73, 0x22, 0xab, 0x0b, 0x0a, 0x10, 0x54, 0x72, 0x61, 0x6e, 0x73, + 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x61, 0x63, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x74, + 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x02, 0x74, 0x6f, 0x12, 0x14, 0x0a, 0x05, 0x6e, + 0x6f, 0x6e, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x6e, 0x6f, 0x6e, 0x63, + 0x65, 0x12, 0x38, 0x0a, 0x09, 0x67, 0x61, 0x73, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x73, 0x66, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, + 0x75, 0x6d, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x69, 0x67, 0x49, 0x6e, + 0x74, 0x52, 0x08, 0x67, 0x61, 0x73, 0x50, 0x72, 0x69, 0x63, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x67, + 0x61, 0x73, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, + 0x67, 0x61, 0x73, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x31, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x73, 0x66, 0x2e, 0x65, 0x74, 0x68, + 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x69, + 0x67, 0x49, 0x6e, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x69, + 0x6e, 0x70, 0x75, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x69, 0x6e, 0x70, 0x75, + 0x74, 0x12, 0x0c, 0x0a, 0x01, 0x76, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x01, 0x76, 0x12, + 0x0c, 0x0a, 0x01, 0x72, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x01, 0x72, 0x12, 0x0c, 0x0a, + 0x01, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x01, 0x73, 0x12, 0x19, 0x0a, 0x08, 0x67, + 0x61, 0x73, 0x5f, 0x75, 0x73, 0x65, 0x64, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x67, + 0x61, 0x73, 0x55, 0x73, 0x65, 0x64, 0x12, 0x3e, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x0c, + 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2a, 0x2e, 0x73, 0x66, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, + 0x75, 0x6d, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, + 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x61, 0x63, 0x65, 0x2e, 0x54, 0x79, 0x70, 0x65, + 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x41, 0x0a, 0x0b, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, + 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x18, 0x0e, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x73, 0x66, + 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x76, + 0x32, 0x2e, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x54, 0x75, 0x70, 0x6c, 0x65, 0x52, 0x0a, 0x61, + 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x42, 0x0a, 0x0f, 0x6d, 0x61, 0x78, + 0x5f, 0x66, 0x65, 0x65, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x67, 0x61, 0x73, 0x18, 0x0b, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x73, 0x66, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, + 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x69, 0x67, 0x49, 0x6e, 0x74, 0x52, + 0x0c, 0x6d, 0x61, 0x78, 0x46, 0x65, 0x65, 0x50, 0x65, 0x72, 0x47, 0x61, 0x73, 0x12, 0x53, 0x0a, + 0x18, 0x6d, 0x61, 0x78, 0x5f, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x5f, 0x66, 0x65, + 0x65, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x67, 0x61, 0x73, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1b, 0x2e, 0x73, 0x66, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x74, 0x79, + 0x70, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x69, 0x67, 0x49, 0x6e, 0x74, 0x52, 0x14, 0x6d, 0x61, + 0x78, 0x50, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x46, 0x65, 0x65, 0x50, 0x65, 0x72, 0x47, + 0x61, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x14, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x61, 0x73, 0x68, + 0x18, 0x15, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x68, 0x61, 0x73, 0x68, 0x12, 0x12, 0x0a, 0x04, + 0x66, 0x72, 0x6f, 0x6d, 0x18, 0x16, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x66, 0x72, 0x6f, 0x6d, + 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, + 0x17, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0a, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x44, 0x61, 0x74, + 0x61, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f, 0x6b, 0x65, 0x79, 0x18, + 0x18, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, + 0x12, 0x23, 0x0a, 0x0d, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x5f, 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x61, + 0x6c, 0x18, 0x19, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x4f, 0x72, + 0x64, 0x69, 0x6e, 0x61, 0x6c, 0x12, 0x1f, 0x0a, 0x0b, 0x65, 0x6e, 0x64, 0x5f, 0x6f, 0x72, 0x64, + 0x69, 0x6e, 0x61, 0x6c, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, 0x65, 0x6e, 0x64, 0x4f, + 0x72, 0x64, 0x69, 0x6e, 0x61, 0x6c, 0x12, 0x43, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x18, 0x1e, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2b, 0x2e, 0x73, 0x66, 0x2e, 0x65, 0x74, 0x68, 0x65, + 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x54, 0x72, 0x61, + 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x61, 0x63, 0x65, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x41, 0x0a, 0x07, 0x72, + 0x65, 0x63, 0x65, 0x69, 0x70, 0x74, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x73, + 0x66, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, + 0x76, 0x32, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, + 0x63, 0x65, 0x69, 0x70, 0x74, 0x52, 0x07, 0x72, 0x65, 0x63, 0x65, 0x69, 0x70, 0x74, 0x12, 0x2f, + 0x0a, 0x05, 0x63, 0x61, 0x6c, 0x6c, 0x73, 0x18, 0x20, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, + 0x73, 0x66, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x74, 0x79, 0x70, 0x65, + 0x2e, 0x76, 0x32, 0x2e, 0x43, 0x61, 0x6c, 0x6c, 0x52, 0x05, 0x63, 0x61, 0x6c, 0x6c, 0x73, 0x12, + 0x1e, 0x0a, 0x08, 0x62, 0x6c, 0x6f, 0x62, 0x5f, 0x67, 0x61, 0x73, 0x18, 0x21, 0x20, 0x01, 0x28, + 0x04, 0x48, 0x00, 0x52, 0x07, 0x62, 0x6c, 0x6f, 0x62, 0x47, 0x61, 0x73, 0x88, 0x01, 0x01, 0x12, + 0x49, 0x0a, 0x10, 0x62, 0x6c, 0x6f, 0x62, 0x5f, 0x67, 0x61, 0x73, 0x5f, 0x66, 0x65, 0x65, 0x5f, + 0x63, 0x61, 0x70, 0x18, 0x22, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x73, 0x66, 0x2e, 0x65, + 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x76, 0x32, 0x2e, + 0x42, 0x69, 0x67, 0x49, 0x6e, 0x74, 0x48, 0x01, 0x52, 0x0d, 0x62, 0x6c, 0x6f, 0x62, 0x47, 0x61, + 0x73, 0x46, 0x65, 0x65, 0x43, 0x61, 0x70, 0x88, 0x01, 0x01, 0x12, 0x1f, 0x0a, 0x0b, 0x62, 0x6c, + 0x6f, 0x62, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x18, 0x23, 0x20, 0x03, 0x28, 0x0c, 0x52, + 0x0a, 0x62, 0x6c, 0x6f, 0x62, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x22, 0xc4, 0x02, 0x0a, 0x04, + 0x54, 0x79, 0x70, 0x65, 0x12, 0x13, 0x0a, 0x0f, 0x54, 0x52, 0x58, 0x5f, 0x54, 0x59, 0x50, 0x45, + 0x5f, 0x4c, 0x45, 0x47, 0x41, 0x43, 0x59, 0x10, 0x00, 0x12, 0x18, 0x0a, 0x14, 0x54, 0x52, 0x58, + 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x41, 0x43, 0x43, 0x45, 0x53, 0x53, 0x5f, 0x4c, 0x49, 0x53, + 0x54, 0x10, 0x01, 0x12, 0x18, 0x0a, 0x14, 0x54, 0x52, 0x58, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, + 0x44, 0x59, 0x4e, 0x41, 0x4d, 0x49, 0x43, 0x5f, 0x46, 0x45, 0x45, 0x10, 0x02, 0x12, 0x11, 0x0a, + 0x0d, 0x54, 0x52, 0x58, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x42, 0x4c, 0x4f, 0x42, 0x10, 0x03, + 0x12, 0x1d, 0x0a, 0x19, 0x54, 0x52, 0x58, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x41, 0x52, 0x42, + 0x49, 0x54, 0x52, 0x55, 0x4d, 0x5f, 0x44, 0x45, 0x50, 0x4f, 0x53, 0x49, 0x54, 0x10, 0x64, 0x12, + 0x1e, 0x0a, 0x1a, 0x54, 0x52, 0x58, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x41, 0x52, 0x42, 0x49, + 0x54, 0x52, 0x55, 0x4d, 0x5f, 0x55, 0x4e, 0x53, 0x49, 0x47, 0x4e, 0x45, 0x44, 0x10, 0x65, 0x12, + 0x1e, 0x0a, 0x1a, 0x54, 0x52, 0x58, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x41, 0x52, 0x42, 0x49, + 0x54, 0x52, 0x55, 0x4d, 0x5f, 0x43, 0x4f, 0x4e, 0x54, 0x52, 0x41, 0x43, 0x54, 0x10, 0x66, 0x12, + 0x1b, 0x0a, 0x17, 0x54, 0x52, 0x58, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x41, 0x52, 0x42, 0x49, + 0x54, 0x52, 0x55, 0x4d, 0x5f, 0x52, 0x45, 0x54, 0x52, 0x59, 0x10, 0x68, 0x12, 0x26, 0x0a, 0x22, + 0x54, 0x52, 0x58, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x41, 0x52, 0x42, 0x49, 0x54, 0x52, 0x55, + 0x4d, 0x5f, 0x53, 0x55, 0x42, 0x4d, 0x49, 0x54, 0x5f, 0x52, 0x45, 0x54, 0x52, 0x59, 0x41, 0x42, + 0x4c, 0x45, 0x10, 0x69, 0x12, 0x1e, 0x0a, 0x1a, 0x54, 0x52, 0x58, 0x5f, 0x54, 0x59, 0x50, 0x45, + 0x5f, 0x41, 0x52, 0x42, 0x49, 0x54, 0x52, 0x55, 0x4d, 0x5f, 0x49, 0x4e, 0x54, 0x45, 0x52, 0x4e, + 0x41, 0x4c, 0x10, 0x6a, 0x12, 0x1c, 0x0a, 0x18, 0x54, 0x52, 0x58, 0x5f, 0x54, 0x59, 0x50, 0x45, + 0x5f, 0x41, 0x52, 0x42, 0x49, 0x54, 0x52, 0x55, 0x4d, 0x5f, 0x4c, 0x45, 0x47, 0x41, 0x43, 0x59, + 0x10, 0x78, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x62, 0x6c, 0x6f, 0x62, 0x5f, 0x67, 0x61, 0x73, 0x42, + 0x13, 0x0a, 0x11, 0x5f, 0x62, 0x6c, 0x6f, 0x62, 0x5f, 0x67, 0x61, 0x73, 0x5f, 0x66, 0x65, 0x65, + 0x5f, 0x63, 0x61, 0x70, 0x22, 0x4a, 0x0a, 0x0b, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x54, 0x75, + 0x70, 0x6c, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x21, 0x0a, + 0x0c, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x18, 0x02, 0x20, + 0x03, 0x28, 0x0c, 0x52, 0x0b, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x4b, 0x65, 0x79, 0x73, + 0x22, 0xc6, 0x02, 0x0a, 0x12, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x52, 0x65, 0x63, 0x65, 0x69, 0x70, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x74, 0x65, + 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x73, 0x74, 0x61, + 0x74, 0x65, 0x52, 0x6f, 0x6f, 0x74, 0x12, 0x2e, 0x0a, 0x13, 0x63, 0x75, 0x6d, 0x75, 0x6c, 0x61, + 0x74, 0x69, 0x76, 0x65, 0x5f, 0x67, 0x61, 0x73, 0x5f, 0x75, 0x73, 0x65, 0x64, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x04, 0x52, 0x11, 0x63, 0x75, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x47, + 0x61, 0x73, 0x55, 0x73, 0x65, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x6c, 0x6f, 0x67, 0x73, 0x5f, 0x62, + 0x6c, 0x6f, 0x6f, 0x6d, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x6c, 0x6f, 0x67, 0x73, + 0x42, 0x6c, 0x6f, 0x6f, 0x6d, 0x12, 0x2c, 0x0a, 0x04, 0x6c, 0x6f, 0x67, 0x73, 0x18, 0x04, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x73, 0x66, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, + 0x6d, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x6f, 0x67, 0x52, 0x04, 0x6c, + 0x6f, 0x67, 0x73, 0x12, 0x27, 0x0a, 0x0d, 0x62, 0x6c, 0x6f, 0x62, 0x5f, 0x67, 0x61, 0x73, 0x5f, + 0x75, 0x73, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x48, 0x00, 0x52, 0x0b, 0x62, 0x6c, + 0x6f, 0x62, 0x47, 0x61, 0x73, 0x55, 0x73, 0x65, 0x64, 0x88, 0x01, 0x01, 0x12, 0x46, 0x0a, 0x0e, + 0x62, 0x6c, 0x6f, 0x62, 0x5f, 0x67, 0x61, 0x73, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x73, 0x66, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, + 0x75, 0x6d, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x69, 0x67, 0x49, 0x6e, + 0x74, 0x48, 0x01, 0x52, 0x0c, 0x62, 0x6c, 0x6f, 0x62, 0x47, 0x61, 0x73, 0x50, 0x72, 0x69, 0x63, + 0x65, 0x88, 0x01, 0x01, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x62, 0x6c, 0x6f, 0x62, 0x5f, 0x67, 0x61, + 0x73, 0x5f, 0x75, 0x73, 0x65, 0x64, 0x42, 0x11, 0x0a, 0x0f, 0x5f, 0x62, 0x6c, 0x6f, 0x62, 0x5f, + 0x67, 0x61, 0x73, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x22, 0x9b, 0x01, 0x0a, 0x03, 0x4c, 0x6f, + 0x67, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0c, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x74, + 0x6f, 0x70, 0x69, 0x63, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x06, 0x74, 0x6f, 0x70, + 0x69, 0x63, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1e, 0x0a, + 0x0a, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x0a, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x18, 0x0a, + 0x07, 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x61, 0x6c, 0x18, 0x07, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, + 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x61, 0x6c, 0x22, 0xb2, 0x0a, 0x0a, 0x04, 0x43, 0x61, 0x6c, 0x6c, + 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x21, 0x0a, 0x0c, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, + 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x70, 0x61, + 0x72, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x14, 0x0a, 0x05, 0x64, 0x65, 0x70, + 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x64, 0x65, 0x70, 0x74, 0x68, 0x12, + 0x3a, 0x0a, 0x09, 0x63, 0x61, 0x6c, 0x6c, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x1d, 0x2e, 0x73, 0x66, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, + 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x43, 0x61, 0x6c, 0x6c, 0x54, 0x79, 0x70, + 0x65, 0x52, 0x08, 0x63, 0x61, 0x6c, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x63, + 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x63, 0x61, 0x6c, + 0x6c, 0x65, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x31, 0x0a, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x73, + 0x66, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, + 0x76, 0x32, 0x2e, 0x42, 0x69, 0x67, 0x49, 0x6e, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x12, 0x1b, 0x0a, 0x09, 0x67, 0x61, 0x73, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x08, 0x20, + 0x01, 0x28, 0x04, 0x52, 0x08, 0x67, 0x61, 0x73, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x21, 0x0a, + 0x0c, 0x67, 0x61, 0x73, 0x5f, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6d, 0x65, 0x64, 0x18, 0x09, 0x20, + 0x01, 0x28, 0x04, 0x52, 0x0b, 0x67, 0x61, 0x73, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6d, 0x65, 0x64, + 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, + 0x0d, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0a, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x44, 0x61, 0x74, + 0x61, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0c, + 0x52, 0x05, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x65, 0x78, 0x65, 0x63, 0x75, + 0x74, 0x65, 0x64, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, + 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x64, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x18, 0x0a, 0x07, + 0x73, 0x75, 0x69, 0x63, 0x69, 0x64, 0x65, 0x18, 0x10, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, + 0x75, 0x69, 0x63, 0x69, 0x64, 0x65, 0x12, 0x59, 0x0a, 0x10, 0x6b, 0x65, 0x63, 0x63, 0x61, 0x6b, + 0x5f, 0x70, 0x72, 0x65, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x73, 0x18, 0x14, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x2e, 0x2e, 0x73, 0x66, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x74, + 0x79, 0x70, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x43, 0x61, 0x6c, 0x6c, 0x2e, 0x4b, 0x65, 0x63, 0x63, + 0x61, 0x6b, 0x50, 0x72, 0x65, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x52, 0x0f, 0x6b, 0x65, 0x63, 0x63, 0x61, 0x6b, 0x50, 0x72, 0x65, 0x69, 0x6d, 0x61, 0x67, 0x65, + 0x73, 0x12, 0x4b, 0x0a, 0x0f, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x63, 0x68, 0x61, + 0x6e, 0x67, 0x65, 0x73, 0x18, 0x15, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x73, 0x66, 0x2e, + 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x76, 0x32, + 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x0e, + 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x12, 0x4b, + 0x0a, 0x0f, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, + 0x73, 0x18, 0x16, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x73, 0x66, 0x2e, 0x65, 0x74, 0x68, + 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x61, + 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x0e, 0x62, 0x61, 0x6c, + 0x61, 0x6e, 0x63, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x12, 0x45, 0x0a, 0x0d, 0x6e, + 0x6f, 0x6e, 0x63, 0x65, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x18, 0x18, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x73, 0x66, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, + 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x4e, 0x6f, 0x6e, 0x63, 0x65, 0x43, 0x68, + 0x61, 0x6e, 0x67, 0x65, 0x52, 0x0c, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, + 0x65, 0x73, 0x12, 0x2c, 0x0a, 0x04, 0x6c, 0x6f, 0x67, 0x73, 0x18, 0x19, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x18, 0x2e, 0x73, 0x66, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x74, + 0x79, 0x70, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x6f, 0x67, 0x52, 0x04, 0x6c, 0x6f, 0x67, 0x73, + 0x12, 0x42, 0x0a, 0x0c, 0x63, 0x6f, 0x64, 0x65, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, + 0x18, 0x1a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x73, 0x66, 0x2e, 0x65, 0x74, 0x68, 0x65, + 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x43, 0x6f, 0x64, + 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x0b, 0x63, 0x6f, 0x64, 0x65, 0x43, 0x68, 0x61, + 0x6e, 0x67, 0x65, 0x73, 0x12, 0x3f, 0x0a, 0x0b, 0x67, 0x61, 0x73, 0x5f, 0x63, 0x68, 0x61, 0x6e, + 0x67, 0x65, 0x73, 0x18, 0x1c, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x73, 0x66, 0x2e, 0x65, + 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x76, 0x32, 0x2e, + 0x47, 0x61, 0x73, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x0a, 0x67, 0x61, 0x73, 0x43, 0x68, + 0x61, 0x6e, 0x67, 0x65, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5f, + 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x73, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x12, 0x27, 0x0a, 0x0f, 0x73, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x5f, 0x72, 0x65, 0x76, 0x65, 0x72, 0x74, 0x65, 0x64, 0x18, 0x0c, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x0e, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x76, 0x65, 0x72, + 0x74, 0x65, 0x64, 0x12, 0x25, 0x0a, 0x0e, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x5f, 0x72, + 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x66, 0x61, 0x69, + 0x6c, 0x75, 0x72, 0x65, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x74, + 0x61, 0x74, 0x65, 0x5f, 0x72, 0x65, 0x76, 0x65, 0x72, 0x74, 0x65, 0x64, 0x18, 0x1e, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x0d, 0x73, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x76, 0x65, 0x72, 0x74, 0x65, + 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x5f, 0x6f, 0x72, 0x64, 0x69, 0x6e, + 0x61, 0x6c, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x4f, + 0x72, 0x64, 0x69, 0x6e, 0x61, 0x6c, 0x12, 0x1f, 0x0a, 0x0b, 0x65, 0x6e, 0x64, 0x5f, 0x6f, 0x72, + 0x64, 0x69, 0x6e, 0x61, 0x6c, 0x18, 0x20, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, 0x65, 0x6e, 0x64, + 0x4f, 0x72, 0x64, 0x69, 0x6e, 0x61, 0x6c, 0x12, 0x51, 0x0a, 0x11, 0x61, 0x63, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x5f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x21, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x73, 0x66, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, + 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x10, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x43, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x42, 0x0a, 0x14, 0x4b, 0x65, + 0x63, 0x63, 0x61, 0x6b, 0x50, 0x72, 0x65, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x73, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x4a, 0x04, + 0x08, 0x1b, 0x10, 0x1c, 0x4a, 0x04, 0x08, 0x1d, 0x10, 0x1e, 0x4a, 0x04, 0x08, 0x32, 0x10, 0x33, + 0x4a, 0x04, 0x08, 0x33, 0x10, 0x34, 0x4a, 0x04, 0x08, 0x3c, 0x10, 0x3d, 0x22, 0x8f, 0x01, 0x0a, + 0x0d, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x18, + 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, + 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x1b, 0x0a, 0x09, 0x6f, 0x6c, + 0x64, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x6f, + 0x6c, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x6e, 0x65, 0x77, 0x5f, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x6e, 0x65, 0x77, 0x56, + 0x61, 0x6c, 0x75, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x61, 0x6c, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x61, 0x6c, 0x22, 0xcc, + 0x05, 0x0a, 0x0d, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, + 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0c, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x38, 0x0a, 0x09, 0x6f, 0x6c, + 0x64, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, + 0x73, 0x66, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x74, 0x79, 0x70, 0x65, + 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x69, 0x67, 0x49, 0x6e, 0x74, 0x52, 0x08, 0x6f, 0x6c, 0x64, 0x56, + 0x61, 0x6c, 0x75, 0x65, 0x12, 0x38, 0x0a, 0x09, 0x6e, 0x65, 0x77, 0x5f, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x73, 0x66, 0x2e, 0x65, 0x74, 0x68, + 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x69, + 0x67, 0x49, 0x6e, 0x74, 0x52, 0x08, 0x6e, 0x65, 0x77, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x41, + 0x0a, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x29, + 0x2e, 0x73, 0x66, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x74, 0x79, 0x70, + 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x43, 0x68, 0x61, 0x6e, + 0x67, 0x65, 0x2e, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x52, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, + 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x61, 0x6c, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x04, 0x52, 0x07, 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x61, 0x6c, 0x22, 0xcf, 0x03, 0x0a, 0x06, + 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x0e, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, + 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x1c, 0x0a, 0x18, 0x52, 0x45, + 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x52, 0x45, 0x57, 0x41, 0x52, 0x44, 0x5f, 0x4d, 0x49, 0x4e, 0x45, + 0x5f, 0x55, 0x4e, 0x43, 0x4c, 0x45, 0x10, 0x01, 0x12, 0x1c, 0x0a, 0x18, 0x52, 0x45, 0x41, 0x53, + 0x4f, 0x4e, 0x5f, 0x52, 0x45, 0x57, 0x41, 0x52, 0x44, 0x5f, 0x4d, 0x49, 0x4e, 0x45, 0x5f, 0x42, + 0x4c, 0x4f, 0x43, 0x4b, 0x10, 0x02, 0x12, 0x1e, 0x0a, 0x1a, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, + 0x5f, 0x44, 0x41, 0x4f, 0x5f, 0x52, 0x45, 0x46, 0x55, 0x4e, 0x44, 0x5f, 0x43, 0x4f, 0x4e, 0x54, + 0x52, 0x41, 0x43, 0x54, 0x10, 0x03, 0x12, 0x1d, 0x0a, 0x19, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, + 0x5f, 0x44, 0x41, 0x4f, 0x5f, 0x41, 0x44, 0x4a, 0x55, 0x53, 0x54, 0x5f, 0x42, 0x41, 0x4c, 0x41, + 0x4e, 0x43, 0x45, 0x10, 0x04, 0x12, 0x13, 0x0a, 0x0f, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, + 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x10, 0x05, 0x12, 0x1a, 0x0a, 0x16, 0x52, 0x45, + 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x47, 0x45, 0x4e, 0x45, 0x53, 0x49, 0x53, 0x5f, 0x42, 0x41, 0x4c, + 0x41, 0x4e, 0x43, 0x45, 0x10, 0x06, 0x12, 0x12, 0x0a, 0x0e, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, + 0x5f, 0x47, 0x41, 0x53, 0x5f, 0x42, 0x55, 0x59, 0x10, 0x07, 0x12, 0x21, 0x0a, 0x1d, 0x52, 0x45, + 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x52, 0x45, 0x57, 0x41, 0x52, 0x44, 0x5f, 0x54, 0x52, 0x41, 0x4e, + 0x53, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x46, 0x45, 0x45, 0x10, 0x08, 0x12, 0x1b, 0x0a, + 0x17, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x52, 0x45, 0x57, 0x41, 0x52, 0x44, 0x5f, 0x46, + 0x45, 0x45, 0x5f, 0x52, 0x45, 0x53, 0x45, 0x54, 0x10, 0x0e, 0x12, 0x15, 0x0a, 0x11, 0x52, 0x45, + 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x47, 0x41, 0x53, 0x5f, 0x52, 0x45, 0x46, 0x55, 0x4e, 0x44, 0x10, + 0x09, 0x12, 0x18, 0x0a, 0x14, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x54, 0x4f, 0x55, 0x43, + 0x48, 0x5f, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x10, 0x0a, 0x12, 0x19, 0x0a, 0x15, 0x52, + 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x53, 0x55, 0x49, 0x43, 0x49, 0x44, 0x45, 0x5f, 0x52, 0x45, + 0x46, 0x55, 0x4e, 0x44, 0x10, 0x0b, 0x12, 0x1b, 0x0a, 0x17, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, + 0x5f, 0x53, 0x55, 0x49, 0x43, 0x49, 0x44, 0x45, 0x5f, 0x57, 0x49, 0x54, 0x48, 0x44, 0x52, 0x41, + 0x57, 0x10, 0x0d, 0x12, 0x20, 0x0a, 0x1c, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x43, 0x41, + 0x4c, 0x4c, 0x5f, 0x42, 0x41, 0x4c, 0x41, 0x4e, 0x43, 0x45, 0x5f, 0x4f, 0x56, 0x45, 0x52, 0x52, + 0x49, 0x44, 0x45, 0x10, 0x0c, 0x12, 0x0f, 0x0a, 0x0b, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, + 0x42, 0x55, 0x52, 0x4e, 0x10, 0x0f, 0x12, 0x15, 0x0a, 0x11, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, + 0x5f, 0x57, 0x49, 0x54, 0x48, 0x44, 0x52, 0x41, 0x57, 0x41, 0x4c, 0x10, 0x10, 0x22, 0x7b, 0x0a, + 0x0b, 0x4e, 0x6f, 0x6e, 0x63, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x18, 0x0a, 0x07, + 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x61, + 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x6f, 0x6c, 0x64, 0x5f, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x6f, 0x6c, 0x64, 0x56, 0x61, + 0x6c, 0x75, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x6e, 0x65, 0x77, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x6e, 0x65, 0x77, 0x56, 0x61, 0x6c, 0x75, 0x65, + 0x12, 0x18, 0x0a, 0x07, 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x61, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x07, 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x61, 0x6c, 0x22, 0x45, 0x0a, 0x0f, 0x41, 0x63, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x43, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, + 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, + 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x6f, 0x72, 0x64, 0x69, 0x6e, + 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x61, + 0x6c, 0x22, 0xac, 0x01, 0x0a, 0x0a, 0x43, 0x6f, 0x64, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, + 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0c, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x19, 0x0a, 0x08, 0x6f, 0x6c, + 0x64, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x6f, 0x6c, + 0x64, 0x48, 0x61, 0x73, 0x68, 0x12, 0x19, 0x0a, 0x08, 0x6f, 0x6c, 0x64, 0x5f, 0x63, 0x6f, 0x64, + 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x6f, 0x6c, 0x64, 0x43, 0x6f, 0x64, 0x65, + 0x12, 0x19, 0x0a, 0x08, 0x6e, 0x65, 0x77, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x0c, 0x52, 0x07, 0x6e, 0x65, 0x77, 0x48, 0x61, 0x73, 0x68, 0x12, 0x19, 0x0a, 0x08, 0x6e, + 0x65, 0x77, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x6e, + 0x65, 0x77, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x61, + 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x61, 0x6c, + 0x22, 0xe0, 0x06, 0x0a, 0x09, 0x47, 0x61, 0x73, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x1b, + 0x0a, 0x09, 0x6f, 0x6c, 0x64, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x08, 0x6f, 0x6c, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x6e, + 0x65, 0x77, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, + 0x6e, 0x65, 0x77, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x3d, 0x0a, 0x06, 0x72, 0x65, 0x61, 0x73, + 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x25, 0x2e, 0x73, 0x66, 0x2e, 0x65, 0x74, + 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x47, + 0x61, 0x73, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x2e, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x52, + 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x6f, 0x72, 0x64, 0x69, 0x6e, + 0x61, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x61, + 0x6c, 0x22, 0xbf, 0x05, 0x0a, 0x06, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x0e, + 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, + 0x12, 0x0f, 0x0a, 0x0b, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x43, 0x41, 0x4c, 0x4c, 0x10, + 0x01, 0x12, 0x14, 0x0a, 0x10, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x43, 0x41, 0x4c, 0x4c, + 0x5f, 0x43, 0x4f, 0x44, 0x45, 0x10, 0x02, 0x12, 0x19, 0x0a, 0x15, 0x52, 0x45, 0x41, 0x53, 0x4f, + 0x4e, 0x5f, 0x43, 0x41, 0x4c, 0x4c, 0x5f, 0x44, 0x41, 0x54, 0x41, 0x5f, 0x43, 0x4f, 0x50, 0x59, + 0x10, 0x03, 0x12, 0x14, 0x0a, 0x10, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x43, 0x4f, 0x44, + 0x45, 0x5f, 0x43, 0x4f, 0x50, 0x59, 0x10, 0x04, 0x12, 0x17, 0x0a, 0x13, 0x52, 0x45, 0x41, 0x53, + 0x4f, 0x4e, 0x5f, 0x43, 0x4f, 0x44, 0x45, 0x5f, 0x53, 0x54, 0x4f, 0x52, 0x41, 0x47, 0x45, 0x10, + 0x05, 0x12, 0x1c, 0x0a, 0x18, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x43, 0x4f, 0x4e, 0x54, + 0x52, 0x41, 0x43, 0x54, 0x5f, 0x43, 0x52, 0x45, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x06, 0x12, + 0x1d, 0x0a, 0x19, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x43, 0x4f, 0x4e, 0x54, 0x52, 0x41, + 0x43, 0x54, 0x5f, 0x43, 0x52, 0x45, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x32, 0x10, 0x07, 0x12, 0x18, + 0x0a, 0x14, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x44, 0x45, 0x4c, 0x45, 0x47, 0x41, 0x54, + 0x45, 0x5f, 0x43, 0x41, 0x4c, 0x4c, 0x10, 0x08, 0x12, 0x14, 0x0a, 0x10, 0x52, 0x45, 0x41, 0x53, + 0x4f, 0x4e, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x4c, 0x4f, 0x47, 0x10, 0x09, 0x12, 0x18, + 0x0a, 0x14, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x45, 0x58, 0x54, 0x5f, 0x43, 0x4f, 0x44, + 0x45, 0x5f, 0x43, 0x4f, 0x50, 0x59, 0x10, 0x0a, 0x12, 0x1b, 0x0a, 0x17, 0x52, 0x45, 0x41, 0x53, + 0x4f, 0x4e, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, 0x5f, 0x45, 0x58, 0x45, 0x43, 0x55, 0x54, + 0x49, 0x4f, 0x4e, 0x10, 0x0b, 0x12, 0x18, 0x0a, 0x14, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, + 0x49, 0x4e, 0x54, 0x52, 0x49, 0x4e, 0x53, 0x49, 0x43, 0x5f, 0x47, 0x41, 0x53, 0x10, 0x0c, 0x12, + 0x1f, 0x0a, 0x1b, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x50, 0x52, 0x45, 0x43, 0x4f, 0x4d, + 0x50, 0x49, 0x4c, 0x45, 0x44, 0x5f, 0x43, 0x4f, 0x4e, 0x54, 0x52, 0x41, 0x43, 0x54, 0x10, 0x0d, + 0x12, 0x21, 0x0a, 0x1d, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x52, 0x45, 0x46, 0x55, 0x4e, + 0x44, 0x5f, 0x41, 0x46, 0x54, 0x45, 0x52, 0x5f, 0x45, 0x58, 0x45, 0x43, 0x55, 0x54, 0x49, 0x4f, + 0x4e, 0x10, 0x0e, 0x12, 0x11, 0x0a, 0x0d, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x52, 0x45, + 0x54, 0x55, 0x52, 0x4e, 0x10, 0x0f, 0x12, 0x1b, 0x0a, 0x17, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, + 0x5f, 0x52, 0x45, 0x54, 0x55, 0x52, 0x4e, 0x5f, 0x44, 0x41, 0x54, 0x41, 0x5f, 0x43, 0x4f, 0x50, + 0x59, 0x10, 0x10, 0x12, 0x11, 0x0a, 0x0d, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x52, 0x45, + 0x56, 0x45, 0x52, 0x54, 0x10, 0x11, 0x12, 0x18, 0x0a, 0x14, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, + 0x5f, 0x53, 0x45, 0x4c, 0x46, 0x5f, 0x44, 0x45, 0x53, 0x54, 0x52, 0x55, 0x43, 0x54, 0x10, 0x12, + 0x12, 0x16, 0x0a, 0x12, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x49, + 0x43, 0x5f, 0x43, 0x41, 0x4c, 0x4c, 0x10, 0x13, 0x12, 0x1c, 0x0a, 0x18, 0x52, 0x45, 0x41, 0x53, + 0x4f, 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x43, 0x4f, 0x4c, 0x44, 0x5f, 0x41, 0x43, + 0x43, 0x45, 0x53, 0x53, 0x10, 0x14, 0x12, 0x1d, 0x0a, 0x19, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, + 0x5f, 0x54, 0x58, 0x5f, 0x49, 0x4e, 0x49, 0x54, 0x49, 0x41, 0x4c, 0x5f, 0x42, 0x41, 0x4c, 0x41, + 0x4e, 0x43, 0x45, 0x10, 0x15, 0x12, 0x15, 0x0a, 0x11, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, + 0x54, 0x58, 0x5f, 0x52, 0x45, 0x46, 0x55, 0x4e, 0x44, 0x53, 0x10, 0x16, 0x12, 0x20, 0x0a, 0x1c, + 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x54, 0x58, 0x5f, 0x4c, 0x45, 0x46, 0x54, 0x5f, 0x4f, + 0x56, 0x45, 0x52, 0x5f, 0x52, 0x45, 0x54, 0x55, 0x52, 0x4e, 0x45, 0x44, 0x10, 0x17, 0x12, 0x1f, + 0x0a, 0x1b, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x43, 0x41, 0x4c, 0x4c, 0x5f, 0x49, 0x4e, + 0x49, 0x54, 0x49, 0x41, 0x4c, 0x5f, 0x42, 0x41, 0x4c, 0x41, 0x4e, 0x43, 0x45, 0x10, 0x18, 0x12, + 0x22, 0x0a, 0x1e, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x43, 0x41, 0x4c, 0x4c, 0x5f, 0x4c, + 0x45, 0x46, 0x54, 0x5f, 0x4f, 0x56, 0x45, 0x52, 0x5f, 0x52, 0x45, 0x54, 0x55, 0x52, 0x4e, 0x45, + 0x44, 0x10, 0x19, 0x22, 0x4b, 0x0a, 0x0f, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x4f, 0x6e, 0x6c, + 0x79, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x38, 0x0a, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x73, 0x66, 0x2e, 0x65, 0x74, 0x68, 0x65, + 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x6c, 0x6f, + 0x63, 0x6b, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x52, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, + 0x22, 0xd1, 0x01, 0x0a, 0x0d, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x57, 0x69, 0x74, 0x68, 0x52, 0x65, + 0x66, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, + 0x69, 0x64, 0x12, 0x30, 0x0a, 0x05, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1a, 0x2e, 0x73, 0x66, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, + 0x74, 0x79, 0x70, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x05, 0x62, + 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x5a, 0x0a, 0x16, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x72, 0x61, 0x63, 0x65, 0x5f, 0x72, 0x65, 0x66, 0x73, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x73, 0x66, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, + 0x75, 0x6d, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, + 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x66, 0x73, 0x52, 0x14, 0x74, 0x72, 0x61, 0x6e, + 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x61, 0x63, 0x65, 0x52, 0x65, 0x66, 0x73, + 0x12, 0x22, 0x0a, 0x0c, 0x69, 0x72, 0x72, 0x65, 0x76, 0x65, 0x72, 0x73, 0x69, 0x62, 0x6c, 0x65, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x69, 0x72, 0x72, 0x65, 0x76, 0x65, 0x72, 0x73, + 0x69, 0x62, 0x6c, 0x65, 0x22, 0x97, 0x01, 0x0a, 0x1c, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x61, 0x63, 0x65, 0x57, 0x69, 0x74, 0x68, 0x42, 0x6c, 0x6f, + 0x63, 0x6b, 0x52, 0x65, 0x66, 0x12, 0x3b, 0x0a, 0x05, 0x74, 0x72, 0x61, 0x63, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x73, 0x66, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, + 0x75, 0x6d, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, + 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x61, 0x63, 0x65, 0x52, 0x05, 0x74, 0x72, 0x61, + 0x63, 0x65, 0x12, 0x3a, 0x0a, 0x09, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x72, 0x65, 0x66, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x73, 0x66, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, + 0x65, 0x75, 0x6d, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x6c, 0x6f, 0x63, + 0x6b, 0x52, 0x65, 0x66, 0x52, 0x08, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x66, 0x22, 0x29, + 0x0a, 0x0f, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x66, + 0x73, 0x12, 0x16, 0x0a, 0x06, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0c, 0x52, 0x06, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x22, 0x36, 0x0a, 0x08, 0x42, 0x6c, 0x6f, + 0x63, 0x6b, 0x52, 0x65, 0x66, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x61, 0x73, 0x68, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0c, 0x52, 0x04, 0x68, 0x61, 0x73, 0x68, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, + 0x72, 0x2a, 0x4e, 0x0a, 0x16, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x54, 0x72, 0x61, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x0b, 0x0a, 0x07, 0x55, + 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x53, 0x55, 0x43, 0x43, + 0x45, 0x45, 0x44, 0x45, 0x44, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x46, 0x41, 0x49, 0x4c, 0x45, + 0x44, 0x10, 0x02, 0x12, 0x0c, 0x0a, 0x08, 0x52, 0x45, 0x56, 0x45, 0x52, 0x54, 0x45, 0x44, 0x10, + 0x03, 0x2a, 0x59, 0x0a, 0x08, 0x43, 0x61, 0x6c, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0f, 0x0a, + 0x0b, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x08, + 0x0a, 0x04, 0x43, 0x41, 0x4c, 0x4c, 0x10, 0x01, 0x12, 0x0c, 0x0a, 0x08, 0x43, 0x41, 0x4c, 0x4c, + 0x43, 0x4f, 0x44, 0x45, 0x10, 0x02, 0x12, 0x0c, 0x0a, 0x08, 0x44, 0x45, 0x4c, 0x45, 0x47, 0x41, + 0x54, 0x45, 0x10, 0x03, 0x12, 0x0a, 0x0a, 0x06, 0x53, 0x54, 0x41, 0x54, 0x49, 0x43, 0x10, 0x04, + 0x12, 0x0a, 0x0a, 0x06, 0x43, 0x52, 0x45, 0x41, 0x54, 0x45, 0x10, 0x05, 0x42, 0x4f, 0x5a, 0x4d, + 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x73, 0x74, 0x72, 0x65, 0x61, + 0x6d, 0x69, 0x6e, 0x67, 0x66, 0x61, 0x73, 0x74, 0x2f, 0x66, 0x69, 0x72, 0x65, 0x68, 0x6f, 0x73, + 0x65, 0x2d, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, + 0x2f, 0x70, 0x62, 0x2f, 0x73, 0x66, 0x2f, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2f, + 0x74, 0x79, 0x70, 0x65, 0x2f, 0x76, 0x32, 0x3b, 0x70, 0x62, 0x65, 0x74, 0x68, 0x62, 0x06, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_sf_ethereum_type_v2_type_proto_rawDescOnce sync.Once + file_sf_ethereum_type_v2_type_proto_rawDescData = file_sf_ethereum_type_v2_type_proto_rawDesc +) + +func file_sf_ethereum_type_v2_type_proto_rawDescGZIP() []byte { + file_sf_ethereum_type_v2_type_proto_rawDescOnce.Do(func() { + file_sf_ethereum_type_v2_type_proto_rawDescData = protoimpl.X.CompressGZIP(file_sf_ethereum_type_v2_type_proto_rawDescData) + }) + return file_sf_ethereum_type_v2_type_proto_rawDescData +} + +var file_sf_ethereum_type_v2_type_proto_enumTypes = make([]protoimpl.EnumInfo, 6) +var file_sf_ethereum_type_v2_type_proto_msgTypes = make([]protoimpl.MessageInfo, 22) +var file_sf_ethereum_type_v2_type_proto_goTypes = []interface{}{ + (TransactionTraceStatus)(0), // 0: sf.ethereum.type.v2.TransactionTraceStatus + (CallType)(0), // 1: sf.ethereum.type.v2.CallType + (Block_DetailLevel)(0), // 2: sf.ethereum.type.v2.Block.DetailLevel + (TransactionTrace_Type)(0), // 3: sf.ethereum.type.v2.TransactionTrace.Type + (BalanceChange_Reason)(0), // 4: sf.ethereum.type.v2.BalanceChange.Reason + (GasChange_Reason)(0), // 5: sf.ethereum.type.v2.GasChange.Reason + (*Block)(nil), // 6: sf.ethereum.type.v2.Block + (*BlockHeader)(nil), // 7: sf.ethereum.type.v2.BlockHeader + (*Uint64NestedArray)(nil), // 8: sf.ethereum.type.v2.Uint64NestedArray + (*Uint64Array)(nil), // 9: sf.ethereum.type.v2.Uint64Array + (*BigInt)(nil), // 10: sf.ethereum.type.v2.BigInt + (*TransactionTrace)(nil), // 11: sf.ethereum.type.v2.TransactionTrace + (*AccessTuple)(nil), // 12: sf.ethereum.type.v2.AccessTuple + (*TransactionReceipt)(nil), // 13: sf.ethereum.type.v2.TransactionReceipt + (*Log)(nil), // 14: sf.ethereum.type.v2.Log + (*Call)(nil), // 15: sf.ethereum.type.v2.Call + (*StorageChange)(nil), // 16: sf.ethereum.type.v2.StorageChange + (*BalanceChange)(nil), // 17: sf.ethereum.type.v2.BalanceChange + (*NonceChange)(nil), // 18: sf.ethereum.type.v2.NonceChange + (*AccountCreation)(nil), // 19: sf.ethereum.type.v2.AccountCreation + (*CodeChange)(nil), // 20: sf.ethereum.type.v2.CodeChange + (*GasChange)(nil), // 21: sf.ethereum.type.v2.GasChange + (*HeaderOnlyBlock)(nil), // 22: sf.ethereum.type.v2.HeaderOnlyBlock + (*BlockWithRefs)(nil), // 23: sf.ethereum.type.v2.BlockWithRefs + (*TransactionTraceWithBlockRef)(nil), // 24: sf.ethereum.type.v2.TransactionTraceWithBlockRef + (*TransactionRefs)(nil), // 25: sf.ethereum.type.v2.TransactionRefs + (*BlockRef)(nil), // 26: sf.ethereum.type.v2.BlockRef + nil, // 27: sf.ethereum.type.v2.Call.KeccakPreimagesEntry + (*timestamppb.Timestamp)(nil), // 28: google.protobuf.Timestamp +} +var file_sf_ethereum_type_v2_type_proto_depIdxs = []int32{ + 7, // 0: sf.ethereum.type.v2.Block.header:type_name -> sf.ethereum.type.v2.BlockHeader + 7, // 1: sf.ethereum.type.v2.Block.uncles:type_name -> sf.ethereum.type.v2.BlockHeader + 11, // 2: sf.ethereum.type.v2.Block.transaction_traces:type_name -> sf.ethereum.type.v2.TransactionTrace + 17, // 3: sf.ethereum.type.v2.Block.balance_changes:type_name -> sf.ethereum.type.v2.BalanceChange + 2, // 4: sf.ethereum.type.v2.Block.detail_level:type_name -> sf.ethereum.type.v2.Block.DetailLevel + 20, // 5: sf.ethereum.type.v2.Block.code_changes:type_name -> sf.ethereum.type.v2.CodeChange + 15, // 6: sf.ethereum.type.v2.Block.system_calls:type_name -> sf.ethereum.type.v2.Call + 10, // 7: sf.ethereum.type.v2.BlockHeader.difficulty:type_name -> sf.ethereum.type.v2.BigInt + 10, // 8: sf.ethereum.type.v2.BlockHeader.total_difficulty:type_name -> sf.ethereum.type.v2.BigInt + 28, // 9: sf.ethereum.type.v2.BlockHeader.timestamp:type_name -> google.protobuf.Timestamp + 10, // 10: sf.ethereum.type.v2.BlockHeader.base_fee_per_gas:type_name -> sf.ethereum.type.v2.BigInt + 8, // 11: sf.ethereum.type.v2.BlockHeader.tx_dependency:type_name -> sf.ethereum.type.v2.Uint64NestedArray + 9, // 12: sf.ethereum.type.v2.Uint64NestedArray.val:type_name -> sf.ethereum.type.v2.Uint64Array + 10, // 13: sf.ethereum.type.v2.TransactionTrace.gas_price:type_name -> sf.ethereum.type.v2.BigInt + 10, // 14: sf.ethereum.type.v2.TransactionTrace.value:type_name -> sf.ethereum.type.v2.BigInt + 3, // 15: sf.ethereum.type.v2.TransactionTrace.type:type_name -> sf.ethereum.type.v2.TransactionTrace.Type + 12, // 16: sf.ethereum.type.v2.TransactionTrace.access_list:type_name -> sf.ethereum.type.v2.AccessTuple + 10, // 17: sf.ethereum.type.v2.TransactionTrace.max_fee_per_gas:type_name -> sf.ethereum.type.v2.BigInt + 10, // 18: sf.ethereum.type.v2.TransactionTrace.max_priority_fee_per_gas:type_name -> sf.ethereum.type.v2.BigInt + 0, // 19: sf.ethereum.type.v2.TransactionTrace.status:type_name -> sf.ethereum.type.v2.TransactionTraceStatus + 13, // 20: sf.ethereum.type.v2.TransactionTrace.receipt:type_name -> sf.ethereum.type.v2.TransactionReceipt + 15, // 21: sf.ethereum.type.v2.TransactionTrace.calls:type_name -> sf.ethereum.type.v2.Call + 10, // 22: sf.ethereum.type.v2.TransactionTrace.blob_gas_fee_cap:type_name -> sf.ethereum.type.v2.BigInt + 14, // 23: sf.ethereum.type.v2.TransactionReceipt.logs:type_name -> sf.ethereum.type.v2.Log + 10, // 24: sf.ethereum.type.v2.TransactionReceipt.blob_gas_price:type_name -> sf.ethereum.type.v2.BigInt + 1, // 25: sf.ethereum.type.v2.Call.call_type:type_name -> sf.ethereum.type.v2.CallType + 10, // 26: sf.ethereum.type.v2.Call.value:type_name -> sf.ethereum.type.v2.BigInt + 27, // 27: sf.ethereum.type.v2.Call.keccak_preimages:type_name -> sf.ethereum.type.v2.Call.KeccakPreimagesEntry + 16, // 28: sf.ethereum.type.v2.Call.storage_changes:type_name -> sf.ethereum.type.v2.StorageChange + 17, // 29: sf.ethereum.type.v2.Call.balance_changes:type_name -> sf.ethereum.type.v2.BalanceChange + 18, // 30: sf.ethereum.type.v2.Call.nonce_changes:type_name -> sf.ethereum.type.v2.NonceChange + 14, // 31: sf.ethereum.type.v2.Call.logs:type_name -> sf.ethereum.type.v2.Log + 20, // 32: sf.ethereum.type.v2.Call.code_changes:type_name -> sf.ethereum.type.v2.CodeChange + 21, // 33: sf.ethereum.type.v2.Call.gas_changes:type_name -> sf.ethereum.type.v2.GasChange + 19, // 34: sf.ethereum.type.v2.Call.account_creations:type_name -> sf.ethereum.type.v2.AccountCreation + 10, // 35: sf.ethereum.type.v2.BalanceChange.old_value:type_name -> sf.ethereum.type.v2.BigInt + 10, // 36: sf.ethereum.type.v2.BalanceChange.new_value:type_name -> sf.ethereum.type.v2.BigInt + 4, // 37: sf.ethereum.type.v2.BalanceChange.reason:type_name -> sf.ethereum.type.v2.BalanceChange.Reason + 5, // 38: sf.ethereum.type.v2.GasChange.reason:type_name -> sf.ethereum.type.v2.GasChange.Reason + 7, // 39: sf.ethereum.type.v2.HeaderOnlyBlock.header:type_name -> sf.ethereum.type.v2.BlockHeader + 6, // 40: sf.ethereum.type.v2.BlockWithRefs.block:type_name -> sf.ethereum.type.v2.Block + 25, // 41: sf.ethereum.type.v2.BlockWithRefs.transaction_trace_refs:type_name -> sf.ethereum.type.v2.TransactionRefs + 11, // 42: sf.ethereum.type.v2.TransactionTraceWithBlockRef.trace:type_name -> sf.ethereum.type.v2.TransactionTrace + 26, // 43: sf.ethereum.type.v2.TransactionTraceWithBlockRef.block_ref:type_name -> sf.ethereum.type.v2.BlockRef + 44, // [44:44] is the sub-list for method output_type + 44, // [44:44] is the sub-list for method input_type + 44, // [44:44] is the sub-list for extension type_name + 44, // [44:44] is the sub-list for extension extendee + 0, // [0:44] is the sub-list for field type_name +} + +func init() { file_sf_ethereum_type_v2_type_proto_init() } +func file_sf_ethereum_type_v2_type_proto_init() { + if File_sf_ethereum_type_v2_type_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_sf_ethereum_type_v2_type_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Block); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_sf_ethereum_type_v2_type_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*BlockHeader); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_sf_ethereum_type_v2_type_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Uint64NestedArray); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_sf_ethereum_type_v2_type_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Uint64Array); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_sf_ethereum_type_v2_type_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*BigInt); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_sf_ethereum_type_v2_type_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TransactionTrace); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_sf_ethereum_type_v2_type_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AccessTuple); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_sf_ethereum_type_v2_type_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TransactionReceipt); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_sf_ethereum_type_v2_type_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Log); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_sf_ethereum_type_v2_type_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Call); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_sf_ethereum_type_v2_type_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*StorageChange); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_sf_ethereum_type_v2_type_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*BalanceChange); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_sf_ethereum_type_v2_type_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*NonceChange); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_sf_ethereum_type_v2_type_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AccountCreation); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_sf_ethereum_type_v2_type_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CodeChange); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_sf_ethereum_type_v2_type_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GasChange); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_sf_ethereum_type_v2_type_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*HeaderOnlyBlock); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_sf_ethereum_type_v2_type_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*BlockWithRefs); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_sf_ethereum_type_v2_type_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TransactionTraceWithBlockRef); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_sf_ethereum_type_v2_type_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TransactionRefs); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_sf_ethereum_type_v2_type_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*BlockRef); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + file_sf_ethereum_type_v2_type_proto_msgTypes[1].OneofWrappers = []interface{}{} + file_sf_ethereum_type_v2_type_proto_msgTypes[5].OneofWrappers = []interface{}{} + file_sf_ethereum_type_v2_type_proto_msgTypes[7].OneofWrappers = []interface{}{} + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_sf_ethereum_type_v2_type_proto_rawDesc, + NumEnums: 6, + NumMessages: 22, + NumExtensions: 0, + NumServices: 0, + }, + GoTypes: file_sf_ethereum_type_v2_type_proto_goTypes, + DependencyIndexes: file_sf_ethereum_type_v2_type_proto_depIdxs, + EnumInfos: file_sf_ethereum_type_v2_type_proto_enumTypes, + MessageInfos: file_sf_ethereum_type_v2_type_proto_msgTypes, + }.Build() + File_sf_ethereum_type_v2_type_proto = out.File + file_sf_ethereum_type_v2_type_proto_rawDesc = nil + file_sf_ethereum_type_v2_type_proto_goTypes = nil + file_sf_ethereum_type_v2_type_proto_depIdxs = nil +} diff --git a/precompiles/bank/bank.go b/precompiles/bank/bank.go index da076d46b..b461903f2 100644 --- a/precompiles/bank/bank.go +++ b/precompiles/bank/bank.go @@ -13,6 +13,7 @@ import ( "github.com/ethereum/go-ethereum/core/vm" pcommon "github.com/sei-protocol/sei-chain/precompiles/common" "github.com/sei-protocol/sei-chain/utils" + "github.com/sei-protocol/sei-chain/x/evm/tracers" "github.com/tendermint/tendermint/libs/log" ) @@ -227,15 +228,30 @@ func (p Precompile) sendNative(ctx sdk.Context, method *abi.Method, args []inter return nil, err } - usei, wei, err := pcommon.HandlePaymentUseiWei(ctx, p.evmKeeper.GetSeiAddressOrDefault(ctx, p.address), senderSeiAddr, value, p.bankKeeper) + precompiledSeiAddr := p.evmKeeper.GetSeiAddressOrDefault(ctx, p.address) + + usei, wei, err := pcommon.HandlePaymentUseiWei(ctx, precompiledSeiAddr, senderSeiAddr, value, p.bankKeeper) if err != nil { return nil, err } + if hooks := tracers.GetCtxEthTracingHooks(ctx); hooks != nil && hooks.OnBalanceChange != nil && (value.Sign() != 0) { + tracers.TraceTransferEVMValue(ctx, hooks, p.bankKeeper, precompiledSeiAddr, p.address, senderSeiAddr, caller, value) + } + if err := p.bankKeeper.SendCoinsAndWei(ctx, senderSeiAddr, receiverSeiAddr, usei, wei); err != nil { return nil, err } + if hooks := tracers.GetCtxEthTracingHooks(ctx); hooks != nil && hooks.OnBalanceChange != nil && (value.Sign() != 0) { + receveirEvmAddr, found := p.evmKeeper.GetEVMAddress(ctx, receiverSeiAddr) + if !found { + return nil, fmt.Errorf("sei address %s is not associated, this shouldn't happen at this point since SendCoinsAndWei above worked", receiverSeiAddr) + } + + tracers.TraceTransferEVMValue(ctx, hooks, p.bankKeeper, senderSeiAddr, caller, receiverSeiAddr, receveirEvmAddr, value) + } + return method.Outputs.Pack(true) } diff --git a/precompiles/bank/bank_test.go b/precompiles/bank/bank_test.go index d8ad3e986..c40b7ad0c 100644 --- a/precompiles/bank/bank_test.go +++ b/precompiles/bank/bank_test.go @@ -12,6 +12,7 @@ import ( "github.com/cosmos/cosmos-sdk/types/tx/signing" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" "github.com/ethereum/go-ethereum/common" + ethtracing "github.com/ethereum/go-ethereum/core/tracing" ethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/core/vm" "github.com/ethereum/go-ethereum/crypto" @@ -20,6 +21,8 @@ import ( "github.com/sei-protocol/sei-chain/x/evm/ante" "github.com/sei-protocol/sei-chain/x/evm/keeper" "github.com/sei-protocol/sei-chain/x/evm/state" + "github.com/sei-protocol/sei-chain/x/evm/tracers" + "github.com/sei-protocol/sei-chain/x/evm/tracing" "github.com/sei-protocol/sei-chain/x/evm/types" "github.com/sei-protocol/sei-chain/x/evm/types/ethtx" "github.com/stretchr/testify/require" @@ -39,7 +42,18 @@ func (tx mockTx) GetSignaturesV2() ([]signing.SignatureV2, error) { return nil, func TestRun(t *testing.T) { testApp := testkeeper.EVMTestApp + + var balanceChanges []balanceChange + ctx := testApp.NewContext(false, tmtypes.Header{}).WithBlockHeight(2) + ctx = tracers.SetCtxBlockchainTracer(ctx, &tracing.Hooks{ + Hooks: ðtracing.Hooks{ + OnBalanceChange: func(addr common.Address, prev, new *big.Int, reason ethtracing.BalanceChangeReason) { + balanceChanges = append(balanceChanges, balanceChange{prev.String(), new.String(), reason}) + }, + }, + }) + k := &testApp.EvmKeeper // Setup sender addresses and environment @@ -137,6 +151,15 @@ func TestRun(t *testing.T) { require.Nil(t, err) require.Empty(t, res.VmError) + // Test balance changes, there is 8 but we care about the first 4 here + require.Equal(t, 8, len(balanceChanges)) + require.Equal(t, []balanceChange{ + {"9800000000000000000", "9799989999999999900", ethtracing.BalanceChangeTransfer}, + {"0", "10000000000100", ethtracing.BalanceChangeTransfer}, + {"10000000000100", "0", ethtracing.BalanceChangeTransfer}, + {"9799989999999999900", "9800000000000000000", ethtracing.BalanceChangeTransfer}, + }, balanceChanges[0:4], "balance changes do not match, actual are:\n\n%s", balanceChangesValues(balanceChanges[0:4])) + evts := ctx.EventManager().ABCIEvents() for _, evt := range evts { @@ -289,3 +312,19 @@ func TestAddress(t *testing.T) { require.Nil(t, err) require.Equal(t, common.HexToAddress(bank.BankAddress), p.Address()) } + +type balanceChange struct { + // We use string to avoid big.Int equality issues + old string + new string + reason ethtracing.BalanceChangeReason +} + +func balanceChangesValues(changes []balanceChange) string { + out := make([]string, len(changes)) + for i, change := range changes { + out[i] = fmt.Sprintf("{%q, %q, ethtracing.BalanceChangeReason(%d)}", change.old, change.new, change.reason) + } + + return strings.Join(out, "\n") +} diff --git a/precompiles/wasmd/wasmd.go b/precompiles/wasmd/wasmd.go index 52926a26f..b8e61cbe9 100644 --- a/precompiles/wasmd/wasmd.go +++ b/precompiles/wasmd/wasmd.go @@ -129,7 +129,7 @@ func (p Precompile) GetName() string { return "wasmd" } -func (p Precompile) RunAndCalculateGas(evm *vm.EVM, caller common.Address, callingContract common.Address, input []byte, suppliedGas uint64, value *big.Int, _ *tracing.Hooks, readOnly bool) (ret []byte, remainingGas uint64, err error) { +func (p Precompile) RunAndCalculateGas(evm *vm.EVM, caller common.Address, callingContract common.Address, input []byte, suppliedGas uint64, value *big.Int, logger *tracing.Hooks, readOnly bool) (ret []byte, remainingGas uint64, err error) { ctx, method, args, err := p.Prepare(evm, input) if err != nil { return nil, 0, err @@ -141,6 +141,10 @@ func (p Precompile) RunAndCalculateGas(evm *vm.EVM, caller common.Address, calli } ctx = ctx.WithGasMeter(sdk.NewGasMeterWithMultiplier(ctx, gasLimitBigInt.Uint64())) + if logger != nil && logger.OnGasChange != nil { + defer func() { logger.OnGasChange(suppliedGas, remainingGas, tracing.GasChangeCallPrecompiledContract) }() + } + switch method.Name { case InstantiateMethod: return p.instantiate(ctx, method, caller, callingContract, args, value, readOnly) diff --git a/x/evm/keeper/msg_server.go b/x/evm/keeper/msg_server.go index 61aef7074..a46b3bcb3 100644 --- a/x/evm/keeper/msg_server.go +++ b/x/evm/keeper/msg_server.go @@ -26,6 +26,7 @@ import ( "github.com/sei-protocol/sei-chain/x/evm/artifacts/erc721" artifactsutils "github.com/sei-protocol/sei-chain/x/evm/artifacts/utils" "github.com/sei-protocol/sei-chain/x/evm/state" + evmtracers "github.com/sei-protocol/sei-chain/x/evm/tracers" "github.com/sei-protocol/sei-chain/x/evm/types" ) @@ -133,7 +134,7 @@ func (server msgServer) EVMTransaction(goCtx context.Context, msg *types.MsgEVMT originalGasMeter.ConsumeGas(adjustedGasUsed.TruncateInt().Uint64(), "evm transaction") }() - res, applyErr := server.applyEVMMessage(ctx, emsg, stateDB, gp) + res, applyErr := server.applyEVMTx(ctx, tx, emsg, stateDB, gp) serverRes = &types.MsgEVMTransactionResponse{ Hash: tx.Hash().Hex(), } @@ -198,18 +199,86 @@ func (k *Keeper) GetEVMMessage(ctx sdk.Context, tx *ethtypes.Transaction, sender return msg } -func (k Keeper) applyEVMMessage(ctx sdk.Context, msg *core.Message, stateDB *state.DBImpl, gp core.GasPool) (*core.ExecutionResult, error) { +func (k Keeper) applyEVMTx(ctx sdk.Context, tx *ethtypes.Transaction, msg *core.Message, stateDB *state.DBImpl, gp core.GasPool) (res *core.ExecutionResult, err error) { + evmHooks := evmtracers.GetCtxEthTracingHooks(ctx) + + var onStart func(vm *vm.EVM) + if evmHooks != nil && evmHooks.OnTxStart != nil { + onStart = func(evmInstance *vm.EVM) { + evmHooks.OnTxStart(evmInstance.GetVMContext(), tx, msg.From) + } + } + var onEnd func(res *core.ExecutionResult, err error) + if evmHooks != nil && evmHooks.OnTxEnd != nil { + onEnd = func(res *core.ExecutionResult, err error) { + var receipt *ethtypes.Receipt + if err == nil { + receipt = getEthReceipt(ctx, tx, msg, res, stateDB) + } + + var txErr error + if res != nil { + txErr = res.Err + } + + evmHooks.OnTxEnd(receipt, txErr) + } + } + + return k.applyEVMMessageWithTracing(ctx, msg, stateDB, gp, onStart, onEnd) +} + +func (k Keeper) applyEVMMessage(ctx sdk.Context, msg *core.Message, stateDB *state.DBImpl, gp core.GasPool) (res *core.ExecutionResult, err error) { + evmTracer := evmtracers.GetCtxBlockchainTracer(ctx) + + var onStart func(*vm.EVM) + if evmTracer != nil && evmTracer.OnSeiSystemCallStart != nil { + onStart = func(*vm.EVM) { + evmTracer.OnSeiSystemCallStart() + } + } + var onEnd func(*core.ExecutionResult, error) + if evmTracer != nil && evmTracer.OnSeiSystemCallEnd != nil { + onEnd = func(*core.ExecutionResult, error) { + evmTracer.OnSeiSystemCallEnd() + } + } + + return k.applyEVMMessageWithTracing(ctx, msg, stateDB, gp, onStart, onEnd) +} + +func (k Keeper) applyEVMMessageWithTracing( + ctx sdk.Context, + msg *core.Message, + stateDB *state.DBImpl, + gp core.GasPool, + onStart func(vm *vm.EVM), + onEnd func(res *core.ExecutionResult, err error), +) (res *core.ExecutionResult, err error) { blockCtx, err := k.GetVMBlockContext(ctx, gp) if err != nil { return nil, err } cfg := types.DefaultChainConfig().EthereumConfig(k.ChainID(ctx)) txCtx := core.NewEVMTxContext(msg) - evmInstance := vm.NewEVM(*blockCtx, txCtx, stateDB, cfg, vm.Config{}) + evmHooks := evmtracers.GetCtxEthTracingHooks(ctx) + evmInstance := vm.NewEVM(*blockCtx, txCtx, stateDB, cfg, vm.Config{ + Tracer: evmHooks, + }) stateDB.SetEVM(evmInstance) + stateDB.SetLogger(evmHooks) + + if onStart != nil { + onStart(evmInstance) + } + if onEnd != nil { + defer func() { + onEnd(res, err) + }() + } + st := core.NewStateTransition(evmInstance, msg, &gp, true) // fee already charged in ante handler - res, err := st.TransitionDb() - return res, err + return st.TransitionDb() } func (server msgServer) writeReceipt(ctx sdk.Context, origMsg *types.MsgEVMTransaction, tx *ethtypes.Transaction, msg *core.Message, response *types.MsgEVMTransactionResponse, stateDB *state.DBImpl) (*types.Receipt, error) { @@ -321,3 +390,33 @@ func (server msgServer) RegisterPointer(goCtx context.Context, msg *types.MsgReg } return &types.MsgRegisterPointerResponse{PointerAddress: pointerAddr.String()}, err } + +func getEthReceipt(ctx sdk.Context, tx *ethtypes.Transaction, msg *core.Message, res *core.ExecutionResult, stateDB *state.DBImpl) *ethtypes.Receipt { + ethLogs := stateDB.GetAllLogs() + receipt := ðtypes.Receipt{ + Type: tx.Type(), + CumulativeGasUsed: uint64(0), + Logs: ethLogs, + TxHash: tx.Hash(), + GasUsed: res.UsedGas, + EffectiveGasPrice: tx.GasPrice(), + TransactionIndex: uint(ctx.TxIndex()), + } + receipt.Bloom = ethtypes.CreateBloom(ethtypes.Receipts{receipt}) + + if msg.To == nil { + receipt.ContractAddress = crypto.CreateAddress(msg.From, msg.Nonce) + } else { + if len(msg.Data) > 0 { + receipt.ContractAddress = *msg.To + } + } + + if res.Err == nil { + receipt.Status = ethtypes.ReceiptStatusSuccessful + } else { + receipt.Status = ethtypes.ReceiptStatusFailed + } + + return receipt +} diff --git a/x/evm/module.go b/x/evm/module.go index 8286973b5..86fcff80c 100644 --- a/x/evm/module.go +++ b/x/evm/module.go @@ -27,6 +27,7 @@ import ( "github.com/sei-protocol/sei-chain/x/evm/keeper" "github.com/sei-protocol/sei-chain/x/evm/migrations" "github.com/sei-protocol/sei-chain/x/evm/state" + "github.com/sei-protocol/sei-chain/x/evm/tracers" "github.com/sei-protocol/sei-chain/x/evm/types" ) @@ -211,6 +212,13 @@ func (am AppModule) EndBlock(ctx sdk.Context, _ abci.RequestEndBlock) []abci.Val coinbase = am.keeper.AccountKeeper().GetModuleAddress(authtypes.FeeCollectorName) } evmTxDeferredInfoList := am.keeper.GetEVMTxDeferredInfo(ctx) + evmHooks := tracers.GetCtxEthTracingHooks(ctx) + + var coinbaseEVMAddress common.Address + if evmHooks != nil { + coinbaseEVMAddress = am.keeper.GetEVMAddressOrDefault(ctx, coinbase) + } + denom := am.keeper.GetBaseDenom(ctx) surplus := utils.Sdk0 for _, deferredInfo := range evmTxDeferredInfoList { @@ -230,9 +238,14 @@ func (am AppModule) EndBlock(ctx sdk.Context, _ abci.RequestEndBlock) []abci.Val if err := am.keeper.BankKeeper().SendCoinsAndWei(ctx, coinbaseAddress, coinbase, balance, weiBalance); err != nil { ctx.Logger().Error(fmt.Sprintf("failed to send usei surplus from %s to coinbase account due to %s", coinbaseAddress.String(), err)) } + + if evmHooks != nil && evmHooks.OnBalanceChange != nil { + tracers.TraceTransactionRewards(ctx, evmHooks, am.keeper.BankKeeper(), coinbase, coinbaseEVMAddress, balance, weiBalance) + } } surplus = surplus.Add(deferredInfo.Surplus) } + surplusUsei, surplusWei := state.SplitUseiWeiAmount(surplus.BigInt()) if surplusUsei.GT(sdk.ZeroInt()) { if err := am.keeper.BankKeeper().AddCoins(ctx, am.keeper.AccountKeeper().GetModuleAddress(types.ModuleName), sdk.NewCoins(sdk.NewCoin(am.keeper.GetBaseDenom(ctx), surplusUsei)), true); err != nil { @@ -244,6 +257,12 @@ func (am AppModule) EndBlock(ctx sdk.Context, _ abci.RequestEndBlock) []abci.Val ctx.Logger().Error("failed to send wei surplus of %s to EVM module account", surplusWei) } } + + if evmHooks != nil && evmHooks.OnBalanceChange != nil && (surplusUsei.GT(sdk.ZeroInt()) || surplusWei.GT(sdk.ZeroInt())) { + evmModuleAddress := am.keeper.AccountKeeper().GetModuleAddress(types.ModuleName) + tracers.TraceBlockReward(ctx, evmHooks, am.keeper.BankKeeper(), evmModuleAddress, am.keeper.GetEVMAddressOrDefault(ctx, evmModuleAddress), surplusUsei, surplusWei) + } + am.keeper.SetTxHashesOnHeight(ctx, ctx.BlockHeight(), utils.Filter(utils.Map(evmTxDeferredInfoList, func(i keeper.EvmTxDeferredInfo) common.Hash { return i.TxHash }), func(h common.Hash) bool { return h.Cmp(ethtypes.EmptyTxsHash) != 0 })) am.keeper.SetBlockBloom(ctx, ctx.BlockHeight(), utils.Map(evmTxDeferredInfoList, func(i keeper.EvmTxDeferredInfo) ethtypes.Bloom { return i.TxBloom })) return []abci.ValidatorUpdate{} diff --git a/x/evm/module_test.go b/x/evm/module_test.go index 8456c5cba..f8af5e769 100644 --- a/x/evm/module_test.go +++ b/x/evm/module_test.go @@ -1,8 +1,10 @@ package evm_test import ( + "fmt" "math" "math/big" + "strings" "testing" sdk "github.com/cosmos/cosmos-sdk/types" @@ -10,11 +12,13 @@ import ( "github.com/cosmos/cosmos-sdk/x/auth/vesting" vestingtypes "github.com/cosmos/cosmos-sdk/x/auth/vesting/types" "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/tracing" + ethtracing "github.com/ethereum/go-ethereum/core/tracing" ethtypes "github.com/ethereum/go-ethereum/core/types" testkeeper "github.com/sei-protocol/sei-chain/testutil/keeper" "github.com/sei-protocol/sei-chain/x/evm" "github.com/sei-protocol/sei-chain/x/evm/state" + "github.com/sei-protocol/sei-chain/x/evm/tracers" + "github.com/sei-protocol/sei-chain/x/evm/tracing" "github.com/sei-protocol/sei-chain/x/evm/types" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -66,19 +70,19 @@ func TestABCI(t *testing.T) { m.BeginBlock(ctx, abci.RequestBeginBlock{}) // 1st tx s := state.NewDBImpl(ctx.WithTxIndex(1), k, false) - s.SubBalance(evmAddr1, big.NewInt(10000000000000), tracing.BalanceChangeUnspecified) - s.AddBalance(evmAddr2, big.NewInt(8000000000000), tracing.BalanceChangeUnspecified) + s.SubBalance(evmAddr1, big.NewInt(10000000000000), ethtracing.BalanceChangeUnspecified) + s.AddBalance(evmAddr2, big.NewInt(8000000000000), ethtracing.BalanceChangeUnspecified) feeCollectorAddr, err := k.GetFeeCollectorAddress(ctx) require.Nil(t, err) - s.AddBalance(feeCollectorAddr, big.NewInt(2000000000000), tracing.BalanceChangeUnspecified) + s.AddBalance(feeCollectorAddr, big.NewInt(2000000000000), ethtracing.BalanceChangeUnspecified) surplus, err := s.Finalize() require.Nil(t, err) require.Equal(t, sdk.ZeroInt(), surplus) k.AppendToEvmTxDeferredInfo(ctx.WithTxIndex(1), ethtypes.Bloom{}, common.Hash{}, surplus) // 3rd tx s = state.NewDBImpl(ctx.WithTxIndex(3), k, false) - s.SubBalance(evmAddr2, big.NewInt(5000000000000), tracing.BalanceChangeUnspecified) - s.AddBalance(evmAddr1, big.NewInt(5000000000000), tracing.BalanceChangeUnspecified) + s.SubBalance(evmAddr2, big.NewInt(5000000000000), ethtracing.BalanceChangeUnspecified) + s.AddBalance(evmAddr1, big.NewInt(5000000000000), ethtracing.BalanceChangeUnspecified) surplus, err = s.Finalize() require.Nil(t, err) require.Equal(t, sdk.ZeroInt(), surplus) @@ -91,9 +95,12 @@ func TestABCI(t *testing.T) { // second block m.BeginBlock(ctx, abci.RequestBeginBlock{}) // 2nd tx + var balanceChanges []evmBalanceChange + ctx = addTestBalanceChangeTracerToCtx(ctx, &balanceChanges) + s = state.NewDBImpl(ctx.WithTxIndex(2), k, false) - s.SubBalance(evmAddr2, big.NewInt(3000000000000), tracing.BalanceChangeUnspecified) - s.AddBalance(evmAddr1, big.NewInt(2000000000000), tracing.BalanceChangeUnspecified) + s.SubBalance(evmAddr2, big.NewInt(3000000000000), ethtracing.BalanceChangeUnspecified) + s.AddBalance(evmAddr1, big.NewInt(2000000000000), ethtracing.BalanceChangeUnspecified) surplus, err = s.Finalize() require.Nil(t, err) require.Equal(t, sdk.NewInt(1000000000000), surplus) @@ -103,6 +110,11 @@ func TestABCI(t *testing.T) { require.Equal(t, uint64(1), k.BankKeeper().GetBalance(ctx, k.AccountKeeper().GetModuleAddress(types.ModuleName), "usei").Amount.Uint64()) require.Equal(t, uint64(2), k.BankKeeper().GetBalance(ctx, k.AccountKeeper().GetModuleAddress(authtypes.FeeCollectorName), "usei").Amount.Uint64()) + require.Equal(t, 1, len(balanceChanges)) + require.Equal(t, []evmBalanceChange{ + {"0", "1000000000000", ethtracing.BalanceIncreaseRewardMineBlock}, + }, balanceChanges, "balance changes do not match, actual are:\n\n%s", balanceChangesValues(balanceChanges)) + // third block m.BeginBlock(ctx, abci.RequestBeginBlock{}) k.AppendErrorToEvmTxDeferredInfo(ctx.WithTxIndex(0), common.Hash{1}, "test error") @@ -113,6 +125,9 @@ func TestABCI(t *testing.T) { require.Equal(t, receipt.VmError, "test error") // fourth block with locked tokens in coinbase address + balanceChanges = make([]evmBalanceChange, 0) + ctx = addTestBalanceChangeTracerToCtx(ctx, &balanceChanges) + m.BeginBlock(ctx, abci.RequestBeginBlock{}) coinbase := state.GetCoinbaseAddress(2) vms := vesting.NewMsgServerImpl(*k.AccountKeeper(), k.BankKeeper()) @@ -124,9 +139,9 @@ func TestABCI(t *testing.T) { }) require.Nil(t, err) s = state.NewDBImpl(ctx.WithTxIndex(2), k, false) - s.SubBalance(evmAddr1, big.NewInt(2000000000000), tracing.BalanceChangeUnspecified) - s.AddBalance(evmAddr2, big.NewInt(1000000000000), tracing.BalanceChangeUnspecified) - s.AddBalance(feeCollectorAddr, big.NewInt(1000000000000), tracing.BalanceChangeUnspecified) + s.SubBalance(evmAddr1, big.NewInt(2000000000000), ethtracing.BalanceChangeUnspecified) + s.AddBalance(evmAddr2, big.NewInt(1000000000000), ethtracing.BalanceChangeUnspecified) + s.AddBalance(feeCollectorAddr, big.NewInt(1000000000000), ethtracing.BalanceChangeUnspecified) surplus, err = s.Finalize() require.Nil(t, err) k.AppendToEvmTxDeferredInfo(ctx.WithTxIndex(2), ethtypes.Bloom{}, common.Hash{}, surplus) @@ -135,4 +150,35 @@ func TestABCI(t *testing.T) { m.EndBlock(ctx, abci.RequestEndBlock{}) // should not crash require.Equal(t, sdk.OneInt(), k.BankKeeper().GetBalance(ctx, coinbase, "usei").Amount) require.Equal(t, sdk.ZeroInt(), k.BankKeeper().SpendableCoins(ctx, coinbase).AmountOf("usei")) + + require.Equal(t, 1, len(balanceChanges)) + require.Equal(t, []evmBalanceChange{ + {"2000000000000", "3000000000000", ethtracing.BalanceIncreaseRewardTransactionFee}, + }, balanceChanges, "balance changes do not match, actual are:\n\n%s", balanceChangesValues(balanceChanges)) +} + +func addTestBalanceChangeTracerToCtx(ctx sdk.Context, balanceChanges *[]evmBalanceChange) sdk.Context { + return tracers.SetCtxBlockchainTracer(ctx, &tracing.Hooks{ + Hooks: ðtracing.Hooks{ + OnBalanceChange: func(addr common.Address, prev, new *big.Int, reason ethtracing.BalanceChangeReason) { + *balanceChanges = append(*balanceChanges, evmBalanceChange{prev.String(), new.String(), reason}) + }, + }, + }) +} + +type evmBalanceChange struct { + // We use string to avoid big.Int equality issues + old string + new string + reason ethtracing.BalanceChangeReason +} + +func balanceChangesValues(changes []evmBalanceChange) string { + out := make([]string, len(changes)) + for i, change := range changes { + out[i] = fmt.Sprintf("{%q, %q, ethtracing.BalanceChangeReason(%d)}", change.old, change.new, change.reason) + } + + return strings.Join(out, "\n") } diff --git a/x/evm/state/balance.go b/x/evm/state/balance.go index 7c4872952..f0255429c 100644 --- a/x/evm/state/balance.go +++ b/x/evm/state/balance.go @@ -80,7 +80,6 @@ func (s *DBImpl) AddBalance(evmAddr common.Address, amt *big.Int, reason tracing } if s.logger != nil && s.logger.OnBalanceChange != nil { - // We could modify AddWei instead so it returns us the old/new balance directly. newBalance := s.GetBalance(evmAddr) oldBalance := new(big.Int).Sub(newBalance, amt) diff --git a/x/evm/tracers/balances.go b/x/evm/tracers/balances.go new file mode 100644 index 000000000..563028379 --- /dev/null +++ b/x/evm/tracers/balances.go @@ -0,0 +1,82 @@ +package tracers + +import ( + "math/big" + + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/tracing" + "github.com/sei-protocol/sei-chain/x/evm/state" +) + +type BankBalanceKeeper interface { + GetBalance(sdk.Context, sdk.AccAddress, string) sdk.Coin + GetWeiBalance(ctx sdk.Context, addr sdk.AccAddress) sdk.Int +} + +// TraceTransactionRewards is a helper function to trace the payment of the transaction rewards +// to the coinbase address. +func TraceTransactionRewards( + ctx sdk.Context, + hooks *tracing.Hooks, + bankKeeper BankBalanceKeeper, + toSeiAddr sdk.AccAddress, + toEVMAddr common.Address, + usei sdk.Int, + wei sdk.Int, +) { + value := usei.Mul(state.SdkUseiToSweiMultiplier).Add(wei).BigInt() + + newBalance := getEVMBalance(ctx, bankKeeper, toSeiAddr) + oldBalance := new(big.Int).Sub(newBalance, value) + + hooks.OnBalanceChange(toEVMAddr, oldBalance, newBalance, tracing.BalanceIncreaseRewardTransactionFee) +} + +func TraceTransferEVMValue( + ctx sdk.Context, + hooks *tracing.Hooks, + bankKeeper BankBalanceKeeper, + fromSeiAddr sdk.AccAddress, + fromEVMAddr common.Address, + toSeiAddr sdk.AccAddress, + toEVMAddr common.Address, + value *big.Int, +) { + // From address got value removed from it + newBalance := getEVMBalance(ctx, bankKeeper, fromSeiAddr) + oldBalance := new(big.Int).Add(newBalance, value) + + hooks.OnBalanceChange(fromEVMAddr, oldBalance, newBalance, tracing.BalanceChangeTransfer) + + // To received valye from the sender + newBalance = getEVMBalance(ctx, bankKeeper, toSeiAddr) + oldBalance = new(big.Int).Sub(newBalance, value) + + hooks.OnBalanceChange(toEVMAddr, oldBalance, newBalance, tracing.BalanceChangeTransfer) +} + +func TraceBlockReward( + ctx sdk.Context, + hooks *tracing.Hooks, + bankKeeper BankBalanceKeeper, + toSeiAddr sdk.AccAddress, + toEVMAddr common.Address, + usei sdk.Int, + wei sdk.Int, +) { + value := usei.Mul(state.SdkUseiToSweiMultiplier).Add(wei).BigInt() + + // To received value + newBalance := getEVMBalance(ctx, bankKeeper, toSeiAddr) + oldBalance := new(big.Int).Sub(newBalance, value) + + hooks.OnBalanceChange(toEVMAddr, oldBalance, newBalance, tracing.BalanceIncreaseRewardMineBlock) +} + +func getEVMBalance(ctx sdk.Context, bankKeeper BankBalanceKeeper, addr sdk.AccAddress) *big.Int { + swei := bankKeeper.GetBalance(ctx, addr, sdk.MustGetBaseDenom()).Amount.Mul(state.SdkUseiToSweiMultiplier) + wei := bankKeeper.GetWeiBalance(ctx, addr) + + return swei.Add(wei).BigInt() +} diff --git a/x/evm/tracers/firehose.go b/x/evm/tracers/firehose.go new file mode 100644 index 000000000..808c40cb0 --- /dev/null +++ b/x/evm/tracers/firehose.go @@ -0,0 +1,2259 @@ +package tracers + +import ( + "bytes" + "cmp" + "encoding/base64" + "encoding/hex" + "encoding/json" + "errors" + "fmt" + "io" + "math/big" + "net/url" + "os" + "regexp" + "runtime" + "runtime/debug" + "strconv" + "strings" + "sync" + "sync/atomic" + "time" + + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/math" + "github.com/ethereum/go-ethereum/core/tracing" + "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/eth/tracers" + "github.com/ethereum/go-ethereum/params" + "github.com/ethereum/go-ethereum/rlp" + "github.com/holiman/uint256" + pbeth "github.com/sei-protocol/sei-chain/pb/sf/ethereum/type/v2" + seitracing "github.com/sei-protocol/sei-chain/x/evm/tracing" + "golang.org/x/exp/maps" + "golang.org/x/exp/slices" + "google.golang.org/protobuf/proto" + "google.golang.org/protobuf/types/known/timestamppb" +) + +const ( + firehoseTraceLevel = "trace" + firehoseDebugLevel = "debug" + firehoseInfoLevel = "info" +) + +const ( + callSourceRoot = "root" + callSourceChild = "child" +) + +// Here what you can expect from the debugging levels: +// - Info == block start/end + trx start/end +// - Debug == Info + call start/end + error +// - Trace == Debug + state db changes, log, balance, nonce, code, storage, gas +var firehoseTracerLogLevel = strings.ToLower(os.Getenv("FIREHOSE_ETHEREUM_TRACER_LOG_LEVEL")) +var isFirehoseInfoEnabled = firehoseTracerLogLevel == firehoseInfoLevel || firehoseTracerLogLevel == firehoseDebugLevel || firehoseTracerLogLevel == firehoseTraceLevel +var isFirehoseDebugEnabled = firehoseTracerLogLevel == firehoseDebugLevel || firehoseTracerLogLevel == firehoseTraceLevel +var isFirehoseTracerEnabled = firehoseTracerLogLevel == firehoseTraceLevel + +var emptyCommonAddress = common.Address{} +var emptyCommonHash = common.Hash{} + +func init() { + staticFirehoseChainValidationOnInit() + + tracers.LiveDirectory.Register("firehose", newFirehoseTracer) + GlobalLiveTracerRegistry.Register("firehose", newSeiFirehoseTracer) +} + +func newFirehoseTracer(cfg json.RawMessage) (*tracing.Hooks, error) { + firehoseInfo("new firehose tracer") + + var config FirehoseConfig + if len([]byte(cfg)) > 0 { + if err := json.Unmarshal(cfg, &config); err != nil { + return nil, fmt.Errorf("failed to parse Firehose config: %w", err) + } + } + + return newTracingHooksFromFirehose(NewFirehose(&config)), nil +} + +func newTracingHooksFromFirehose(tracer *Firehose) *tracing.Hooks { + return &tracing.Hooks{ + OnBlockchainInit: tracer.OnBlockchainInit, + OnGenesisBlock: tracer.OnGenesisBlock, + OnBlockStart: tracer.OnBlockStart, + OnBlockEnd: tracer.OnBlockEnd, + OnSkippedBlock: tracer.OnSkippedBlock, + + OnTxStart: tracer.OnTxStart, + OnTxEnd: tracer.OnTxEnd, + OnEnter: tracer.OnCallEnter, + OnExit: tracer.OnCallExit, + OnOpcode: tracer.OnOpcode, + OnFault: tracer.OnOpcodeFault, + + OnBalanceChange: tracer.OnBalanceChange, + OnNonceChange: tracer.OnNonceChange, + OnCodeChange: tracer.OnCodeChange, + OnStorageChange: tracer.OnStorageChange, + OnGasChange: tracer.OnGasChange, + OnLog: tracer.OnLog, + } +} + +func newSeiFirehoseTracer(tracerURL *url.URL) (*seitracing.Hooks, error) { + tracerConfig, err := new(FirehoseConfig).fromURLParameters(tracerURL.Query()) + if err != nil { + return nil, fmt.Errorf("failed to parse Firehose config: %w", err) + } + + tracer := NewFirehose(tracerConfig) + + commitLock := new(sync.Mutex) + + return &seitracing.Hooks{ + Hooks: newTracingHooksFromFirehose(tracer), + + OnSeiBlockchainInit: tracer.OnBlockchainInit, + OnSeiBlockStart: tracer.OnSeiBlockStart, + OnSeiBlockEnd: tracer.OnBlockEnd, + + GetTxTracer: func(txIndex int) sdk.TxTracer { + tracer.blockReorderOrdinalOnce.Do(func() { + tracer.blockReorderOrdinal = true + tracer.blockReorderOrdinalSnapshot = tracer.blockOrdinal.value + }) + + // Created first so we can get the pointer id everywhere + isolatedTracer := &TxTracerHooks{} + isolatedTracerID := fmt.Sprintf("%03d-%p", txIndex, isolatedTracer) + isolatedTxTracer := tracer.newIsolatedTransactionTracer(isolatedTracerID) + + firehoseInfo("new isolated transaction tracer (tracer=%s)", isolatedTracerID) + isolatedTracer.Hooks = &seitracing.Hooks{ + Hooks: newTracingHooksFromFirehose(isolatedTxTracer), + } + + isolatedTracer.OnTxReset = func() { + firehoseDebug("resetting isolated transaction tracer (tracer=%s)", isolatedTracerID) + isolatedTxTracer.resetTransaction() + } + + isolatedTracer.OnTxCommit = func() { + firehoseInfo("committing isolated transaction tracer (tracer=%s)", isolatedTracerID) + + if isolatedTxTracer.transactionTransient == nil { + panic(fmt.Errorf("hook OnTxCommit called without a transaction being completed, this is invalid (tracer=%s)", isolatedTracerID)) + } + + commitLock.Lock() + tracer.block.TransactionTraces = append(tracer.block.TransactionTraces, isolatedTxTracer.transactionTransient) + commitLock.Unlock() + } + + return isolatedTracer + }, + }, nil +} + +type FirehoseConfig struct { + ApplyBackwardCompatibility *bool `json:"applyBackwardCompatibility"` +} + +func (c *FirehoseConfig) fromURLParameters(query url.Values) (*FirehoseConfig, error) { + if v := query.Get("applyBackwardCompatibility"); v != "" { + applyBackwardCompatibility, err := strconv.ParseBool(v) + if err != nil { + return nil, fmt.Errorf("invalid applyBackwardCompatibility value: %w", err) + } + + c.ApplyBackwardCompatibility = &applyBackwardCompatibility + } + + return c, nil +} + +type Firehose struct { + // Global state + outputBuffer *bytes.Buffer + initSent *atomic.Bool + chainConfig *params.ChainConfig + hasher crypto.KeccakState // Keccak256 hasher instance shared across tracer needs (non-concurrent safe) + hasherBuf common.Hash // Keccak256 hasher result array shared across tracer needs (non-concurrent safe) + tracerID string + // The FirehoseTracer is used in multiple chains, some for which were produced using a legacy version + // of the whole tracing infrastructure. This legacy version had many small bugs here and there that + // we must "reproduce" on some chain to ensure that the FirehoseTracer produces the same output + // as the legacy version. + // + // This value is fed from the tracer configuration. If explicitly set, the value set will be used + // here. If not set in the config, then we inspect `OnBlockchainInit` the chain config to determine + // if it's a network for which we must reproduce the legacy bugs. + applyBackwardCompatibility *bool + + // Block state + block *pbeth.Block + blockBaseFee *big.Int + blockOrdinal *Ordinal + blockFinality *FinalityStatus + blockRules params.Rules + blockReorderOrdinal bool + blockReorderOrdinalSnapshot uint64 + blockReorderOrdinalOnce sync.Once + + // Transaction state + evm *tracing.VMContext + transaction *pbeth.TransactionTrace + transactionLogIndex uint32 + inSystemCall bool + blockIsPrecompiledAddr func(addr common.Address) bool + transactionIsolated bool + transactionTransient *pbeth.TransactionTrace + + // Call state + callStack *CallStack + deferredCallState *DeferredCallState + latestCallEnterSuicided bool +} + +const FirehoseProtocolVersion = "3.0" + +func NewFirehose(config *FirehoseConfig) *Firehose { + return &Firehose{ + // Global state + outputBuffer: bytes.NewBuffer(make([]byte, 0, 100*1024*1024)), + initSent: new(atomic.Bool), + chainConfig: nil, + hasher: crypto.NewKeccakState(), + tracerID: "global", + applyBackwardCompatibility: config.ApplyBackwardCompatibility, + + // Block state + blockOrdinal: &Ordinal{}, + blockFinality: &FinalityStatus{}, + blockReorderOrdinal: false, + + // Transaction state + transactionLogIndex: 0, + + // Call state + callStack: NewCallStack(), + deferredCallState: NewDeferredCallState(), + latestCallEnterSuicided: false, + } +} + +func (f *Firehose) newIsolatedTransactionTracer(traceId string) *Firehose { + f.ensureInBlock(0) + + return &Firehose{ + // Global state + initSent: f.initSent, + chainConfig: f.chainConfig, + hasher: crypto.NewKeccakState(), + hasherBuf: common.Hash{}, + tracerID: traceId, + + // Block state + block: f.block, + blockBaseFee: f.blockBaseFee, + blockOrdinal: &Ordinal{}, + blockFinality: f.blockFinality, + blockIsPrecompiledAddr: f.blockIsPrecompiledAddr, + blockRules: f.blockRules, + + // Transaction state + transactionLogIndex: 0, + transactionIsolated: true, + + // Call state + callStack: NewCallStack(), + deferredCallState: NewDeferredCallState(), + latestCallEnterSuicided: false, + } +} + +// resetBlock resets the block state only, do not reset transaction or call state +func (f *Firehose) resetBlock() { + f.block = nil + f.blockBaseFee = nil + f.blockOrdinal.Reset() + f.blockFinality.Reset() + f.blockIsPrecompiledAddr = nil + f.blockRules = params.Rules{} + f.blockReorderOrdinal = false + f.blockReorderOrdinalSnapshot = 0 + f.blockReorderOrdinalOnce = sync.Once{} +} + +// resetTransaction resets the transaction state and the call state in one shot +func (f *Firehose) resetTransaction() { + f.transaction = nil + f.evm = nil + f.transactionLogIndex = 0 + f.inSystemCall = false + f.transactionTransient = nil + + f.callStack.Reset() + f.latestCallEnterSuicided = false + f.deferredCallState.Reset() +} + +func (f *Firehose) OnBlockchainInit(chainConfig *params.ChainConfig) { + f.chainConfig = chainConfig + + if wasNeverSent := f.initSent.CompareAndSwap(false, true); wasNeverSent { + printToFirehose("INIT", FirehoseProtocolVersion, "geth", params.Version) + } else { + f.panicInvalidState("The OnBlockchainInit callback was called more than once", 0) + } + + if f.applyBackwardCompatibility == nil { + f.applyBackwardCompatibility = ptr(chainNeedsLegacyBackwardCompatibility(chainConfig.ChainID)) + } +} + +var mainnetChainID = big.NewInt(1) +var polygonMainnetChainID = big.NewInt(137) +var polygonMumbaiChainID = big.NewInt(80001) +var bscMainnetChainID = big.NewInt(56) +var bscTestnetChainID = big.NewInt(97) + +func chainNeedsLegacyBackwardCompatibility(id *big.Int) bool { + return id.Cmp(mainnetChainID) == 0 || id.Cmp(polygonMainnetChainID) == 0 || id.Cmp(polygonMumbaiChainID) == 0 || id.Cmp(bscMainnetChainID) == 0 || id.Cmp(bscTestnetChainID) == 0 +} + +func (f *Firehose) OnSeiBlockStart(hash []byte, size uint64, b *types.Header) { + firehoseInfo("block start (number=%d hash=%s)", b.Number, byteView(hash)) + + f.blockRules = f.chainConfig.Rules(b.Number, f.chainConfig.TerminalTotalDifficultyPassed, b.Time) + f.blockIsPrecompiledAddr = getActivePrecompilesChecker(f.blockRules) + + f.block = &pbeth.Block{ + Hash: hash, + Number: b.Number.Uint64(), + Header: newBlockHeaderFromChainHeader(b, &pbeth.BigInt{}), + Size: size, + Ver: 4, + } + + if f.block.Header.BaseFeePerGas != nil { + f.blockBaseFee = f.block.Header.BaseFeePerGas.Native() + } + + f.blockFinality.populate(b.Number.Uint64()-1, b.ParentHash[:]) +} + +func (f *Firehose) OnBlockStart(event tracing.BlockEvent) { + b := event.Block + firehoseInfo("block start (number=%d hash=%s)", b.NumberU64(), b.Hash()) + + f.ensureBlockChainInit() + + f.blockRules = f.chainConfig.Rules(b.Number(), f.chainConfig.TerminalTotalDifficultyPassed, b.Time()) + f.blockIsPrecompiledAddr = getActivePrecompilesChecker(f.blockRules) + + f.block = &pbeth.Block{ + Hash: b.Hash().Bytes(), + Number: b.Number().Uint64(), + Header: newBlockHeaderFromChainHeader(b.Header(), firehoseBigIntFromNative(new(big.Int).Add(event.TD, b.Difficulty()))), + Size: b.Size(), + Ver: 4, + } + + if *f.applyBackwardCompatibility { + f.block.Ver = 3 + } + + for _, uncle := range b.Uncles() { + // TODO: check if td should be part of uncles + f.block.Uncles = append(f.block.Uncles, newBlockHeaderFromChainHeader(uncle, nil)) + } + + if f.block.Header.BaseFeePerGas != nil { + f.blockBaseFee = f.block.Header.BaseFeePerGas.Native() + } + + f.blockFinality.populateFromChain(event.Finalized) +} + +func (f *Firehose) OnSkippedBlock(event tracing.BlockEvent) { + // Blocks that are skipped from blockchain that were known and should contain 0 transactions. + // It happened in the past, on Polygon if I recall right, that we missed block because some block + // went in this code path. + // + // See https: //github.com/streamingfast/go-ethereum/blob/a46903cf0cad829479ded66b369017914bf82314/core/blockchain.go#L1797-L1814 + if event.Block.Transactions().Len() > 0 { + panic(fmt.Sprintf("The tracer received an `OnSkippedBlock` block #%d (%s) with %d transactions, this according to core/blockchain.go should never happen and is an error", + event.Block.NumberU64(), + event.Block.Hash().Hex(), + event.Block.Transactions().Len(), + )) + } + + // Trace the block as normal, worst case the Firehose system will simply discard it at some point + f.OnBlockStart(event) + f.OnBlockEnd(nil) +} + +func getActivePrecompilesChecker(rules params.Rules) func(addr common.Address) bool { + activePrecompiles := vm.ActivePrecompiles(rules) + + activePrecompilesMap := make(map[common.Address]bool, len(activePrecompiles)) + for _, addr := range activePrecompiles { + activePrecompilesMap[addr] = true + } + + return func(addr common.Address) bool { + _, found := activePrecompilesMap[addr] + return found + } +} + +func (f *Firehose) OnBlockEnd(err error) { + firehoseInfo("block ending (err=%s)", errorView(err)) + + if err == nil { + if f.blockReorderOrdinal { + f.reorderIsolatedTransactionsAndOrdinals() + } + + f.ensureInBlockAndNotInTrx() + f.printBlockToFirehose(f.block, f.blockFinality) + } else { + // An error occurred, could have happen in transaction/call context, we must not check if in trx/call, only check in block + f.ensureInBlock(0) + } + + f.resetBlock() + f.resetTransaction() + + firehoseInfo("block end") +} + +// reorderIsolatedTransactionsAndOrdinals is called right after all transactions have completed execution. It will sort transactions +// according to their index. +// +// But most importantly, will re-assign all the ordinals of each transaction recursively. When the parallel execution happened, +// all ordinal were made relative to the transaction they were contained in. But now, we are going to re-assign them to the +// global block ordinal by getting the current ordinal and ad it to the transaction ordinal and so forth. +func (f *Firehose) reorderIsolatedTransactionsAndOrdinals() { + if !f.blockReorderOrdinal { + firehoseInfo("post process isolated transactions skipped (block_reorder_ordinals=false)") + return + } + + ordinalBase := f.blockReorderOrdinalSnapshot + firehoseInfo("post processing isolated transactions sorting & re-assigning ordinals (ordinal_base=%d)", ordinalBase) + + slices.SortStableFunc(f.block.TransactionTraces, func(i, j *pbeth.TransactionTrace) int { + return int(i.Index) - int(j.Index) + }) + + baseline := ordinalBase + for _, trx := range f.block.TransactionTraces { + trx.BeginOrdinal += baseline + for _, call := range trx.Calls { + f.reorderCallOrdinals(call, baseline) + } + + for _, log := range trx.Receipt.Logs { + log.Ordinal += baseline + } + + trx.EndOrdinal += baseline + baseline = trx.EndOrdinal + } + + for _, ch := range f.block.BalanceChanges { + if ch.Ordinal >= ordinalBase { + ch.Ordinal += baseline + } + } + for _, ch := range f.block.CodeChanges { + if ch.Ordinal >= ordinalBase { + ch.Ordinal += baseline + } + } + for _, call := range f.block.SystemCalls { + if call.BeginOrdinal >= ordinalBase { + f.reorderCallOrdinals(call, baseline) + } + } +} + +func (f *Firehose) reorderCallOrdinals(call *pbeth.Call, ordinalBase uint64) (ordinalEnd uint64) { + if *f.applyBackwardCompatibility { + if call.BeginOrdinal != 0 { + call.BeginOrdinal += ordinalBase // consistent with a known small bug: root call has beginOrdinal set to 0 + } + } else { + call.BeginOrdinal += ordinalBase + } + + for _, log := range call.Logs { + log.Ordinal += ordinalBase + } + for _, act := range call.AccountCreations { + act.Ordinal += ordinalBase + } + for _, ch := range call.BalanceChanges { + ch.Ordinal += ordinalBase + } + for _, ch := range call.GasChanges { + ch.Ordinal += ordinalBase + } + for _, ch := range call.NonceChanges { + ch.Ordinal += ordinalBase + } + for _, ch := range call.StorageChanges { + ch.Ordinal += ordinalBase + } + for _, ch := range call.CodeChanges { + ch.Ordinal += ordinalBase + } + + call.EndOrdinal += ordinalBase + + return call.EndOrdinal +} + +func (f *Firehose) OnBeaconBlockRootStart(root common.Hash) { + firehoseInfo("system call start (for=%s)", "beacon_block_root") + f.ensureInBlockAndNotInTrx() + + f.inSystemCall = true + f.transaction = &pbeth.TransactionTrace{} +} + +func (f *Firehose) OnBeaconBlockRootEnd() { + f.ensureInBlockAndInTrx() + f.ensureInSystemCall() + + f.block.SystemCalls = append(f.block.SystemCalls, f.transaction.Calls...) + + f.resetTransaction() +} + +func (f *Firehose) OnTxStart(evm *tracing.VMContext, tx *types.Transaction, from common.Address) { + firehoseInfo("trx start (tracer=%s hash=%s type=%d gas=%d isolated=%t input=%s)", f.tracerID, tx.Hash(), tx.Type(), tx.Gas(), f.transactionIsolated, inputView(tx.Data())) + + f.ensureInBlockAndNotInTrxAndNotInCall() + + f.evm = evm + var to common.Address + if tx.To() == nil { + to = crypto.CreateAddress(from, evm.StateDB.GetNonce(from)) + } else { + to = *tx.To() + } + + f.onTxStart(tx, tx.Hash(), from, to) +} + +// onTxStart is used internally a two places, in the normal "tracer" and in the "OnGenesisBlock", +// we manually pass some override to the `tx` because genesis block has a different way of creating +// the transaction that wraps the genesis block. +func (f *Firehose) onTxStart(tx *types.Transaction, hash common.Hash, from, to common.Address) { + v, r, s := tx.RawSignatureValues() + + var blobGas *uint64 + if tx.Type() == types.BlobTxType { + blobGas = ptr(tx.BlobGas()) + } + + f.transaction = &pbeth.TransactionTrace{ + BeginOrdinal: f.blockOrdinal.Next(), + Hash: hash.Bytes(), + From: from.Bytes(), + To: to.Bytes(), + Nonce: tx.Nonce(), + GasLimit: tx.Gas(), + GasPrice: gasPrice(tx, f.blockBaseFee), + Value: firehoseBigIntFromNative(tx.Value()), + Input: tx.Data(), + V: emptyBytesToNil(v.Bytes()), + R: normalizeSignaturePoint(r.Bytes()), + S: normalizeSignaturePoint(s.Bytes()), + Type: transactionTypeFromChainTxType(tx.Type()), + AccessList: newAccessListFromChain(tx.AccessList()), + MaxFeePerGas: maxFeePerGas(tx), + MaxPriorityFeePerGas: maxPriorityFeePerGas(tx), + BlobGas: blobGas, + BlobGasFeeCap: firehoseBigIntFromNative(tx.BlobGasFeeCap()), + BlobHashes: newBlobHashesFromChain(tx.BlobHashes()), + } +} + +func (f *Firehose) OnTxEnd(receipt *types.Receipt, err error) { + firehoseInfo("trx ending (tracer=%s)", f.tracerID) + f.ensureInBlockAndInTrx() + + trxTrace := f.completeTransaction(receipt) + + // In this case, we are in some kind of parallel processing and we must simply add the transaction + // to a transient storage (and not in the block directly). Adding it to the block will be done by the + // `OnTxCommit` callback. + if f.transactionIsolated { + f.transactionTransient = trxTrace + + // We must not reset transaction here. In the isolated transaction tracer, the transaction is reset + // by the `OnTxReset` callback which comes from outside the tracer. Second, resetting the transaction + // also resets the [f.transactionTransient] field which is the one we want to keep on completion + // of an isolated transaction. + } else { + f.block.TransactionTraces = append(f.block.TransactionTraces, trxTrace) + + // The reset must be done as the very last thing as the CallStack needs to be + // properly populated for the `completeTransaction` call above to complete correctly. + f.resetTransaction() + } + + firehoseInfo("trx end (tracer=%s)", f.tracerID) +} + +func (f *Firehose) completeTransaction(receipt *types.Receipt) *pbeth.TransactionTrace { + firehoseInfo("completing transaction (call_count=%d receipt=%s)", len(f.transaction.Calls), (*receiptView)(receipt)) + + // Sorting needs to happen first, before we populate the state reverted + slices.SortFunc(f.transaction.Calls, func(i, j *pbeth.Call) int { + return cmp.Compare(i.Index, j.Index) + }) + + rootCall := f.transaction.Calls[0] + + if !f.deferredCallState.IsEmpty() { + if err := f.deferredCallState.MaybePopulateCallAndReset(callSourceRoot, rootCall); err != nil { + panic(err) + } + } + + // Receipt can be nil if an error occurred during the transaction execution, right now we don't have it + if receipt != nil { + f.transaction.Index = uint32(receipt.TransactionIndex) + f.transaction.GasUsed = receipt.GasUsed + f.transaction.Receipt = newTxReceiptFromChain(receipt, f.transaction.Type) + f.transaction.Status = transactionStatusFromChainTxReceipt(receipt.Status) + } + + // It's possible that the transaction was reverted, but we still have a receipt, in that case, we must + // check the root call + if rootCall.StatusReverted { + f.transaction.Status = pbeth.TransactionTraceStatus_REVERTED + } + + // Order is important, we must populate the state reverted before we remove the log block index and re-assign ordinals + f.populateStateReverted() + f.removeLogBlockIndexOnStateRevertedCalls() + f.assignOrdinalAndIndexToReceiptLogs() + + if *f.applyBackwardCompatibility { + // Known Firehose issue: This field has never been populated in the old Firehose instrumentation + } else { + f.transaction.ReturnData = rootCall.ReturnData + } + + f.transaction.EndOrdinal = f.blockOrdinal.Next() + + return f.transaction +} + +func (f *Firehose) populateStateReverted() { + // Calls are ordered by execution index. So the algo is quite simple. + // We loop through the flat calls, at each call, if the parent is present + // and reverted, the current call is reverted. Otherwise, if the current call + // is failed, the state is reverted. In all other cases, we simply continue + // our iteration loop. + // + // This works because we see the parent before its children, and since we + // trickle down the state reverted value down the children, checking the parent + // of a call will always tell us if the whole chain of parent/child should + // be reverted + // + calls := f.transaction.Calls + for _, call := range f.transaction.Calls { + var parent *pbeth.Call + if call.ParentIndex > 0 { + parent = calls[call.ParentIndex-1] + } + + call.StateReverted = (parent != nil && parent.StateReverted) || call.StatusFailed + } +} + +func (f *Firehose) removeLogBlockIndexOnStateRevertedCalls() { + for _, call := range f.transaction.Calls { + if call.StateReverted { + for _, log := range call.Logs { + log.BlockIndex = 0 + } + } + } +} + +func (f *Firehose) assignOrdinalAndIndexToReceiptLogs() { + firehoseTrace("assigning ordinal and index to logs") + defer func() { + firehoseTrace("assigning ordinal and index to logs terminated") + }() + + trx := f.transaction + + receiptsLogs := trx.Receipt.Logs + + callLogs := []*pbeth.Log{} + for _, call := range trx.Calls { + firehoseTrace("checking call (reverted=%t logs=%d)", call.StateReverted, len(call.Logs)) + if call.StateReverted { + continue + } + + callLogs = append(callLogs, call.Logs...) + } + + slices.SortFunc(callLogs, func(i, j *pbeth.Log) int { + return cmp.Compare(i.Ordinal, j.Ordinal) + }) + + if len(callLogs) != len(receiptsLogs) { + panic(fmt.Errorf( + "mismatch between Firehose call logs and Ethereum transaction %s receipt logs at block #%d, transaction receipt has %d logs but there is %d Firehose call logs", + hex.EncodeToString(trx.Hash), + f.block.Number, + len(receiptsLogs), + len(callLogs), + )) + } + + for i := 0; i < len(callLogs); i++ { + callLog := callLogs[i] + receiptsLog := receiptsLogs[i] + + result := &validationResult{} + // Ordinal must **not** be checked as we are assigning it here below after the validations + validateBytesField(result, "Address", callLog.Address, receiptsLog.Address) + validateUint32Field(result, "BlockIndex", callLog.BlockIndex, receiptsLog.BlockIndex) + validateBytesField(result, "Data", callLog.Data, receiptsLog.Data) + validateArrayOfBytesField(result, "Topics", callLog.Topics, receiptsLog.Topics) + + if len(result.failures) > 0 { + result.panicOnAnyFailures("mismatch between Firehose call log and Ethereum transaction receipt log at index %d", i) + } + + receiptsLog.Index = callLog.Index + receiptsLog.Ordinal = callLog.Ordinal + } +} + +// OnCallEnter implements the EVMLogger interface to initialize the tracing operation. +func (f *Firehose) OnCallEnter(depth int, typ byte, from common.Address, to common.Address, input []byte, gas uint64, value *big.Int) { + opCode := vm.OpCode(typ) + + var callType pbeth.CallType + if isRootCall := depth == 0; isRootCall { + callType = rootCallType(opCode == vm.CREATE) + } else { + // The invokation for vm.SELFDESTRUCT is called while already in another call and is recorded specially + // in the Geth tracer and generates `OnEnter/OnExit` callbacks. However in Firehose, self destruction + // simply sets the call as having called suicided so there is no extra call. + // + // So we ignore `OnEnter/OnExit` callbacks for `SELFDESTRUCT` opcode, we ignore it here and set + // a special sentinel variable that will tell `OnExit` to ignore itself. + if opCode == vm.SELFDESTRUCT { + f.ensureInCall() + f.callStack.Peek().Suicide = true + + // The next OnCallExit must be ignored, this variable will make the next OnCallExit to be ignored + f.latestCallEnterSuicided = true + return + } + + callType = callTypeFromOpCode(opCode) + if callType == pbeth.CallType_UNSPECIFIED { + panic(fmt.Errorf("unexpected call type, received OpCode %s but only call related opcode (CALL, CREATE, CREATE2, STATIC, DELEGATECALL and CALLCODE) or SELFDESTRUCT is accepted", opCode)) + } + } + + f.callStart(computeCallSource(depth), callType, from, to, input, gas, value) +} + +// OnCallExit is called after the call finishes to finalize the tracing. +func (f *Firehose) OnCallExit(depth int, output []byte, gasUsed uint64, err error, reverted bool) { + f.callEnd(computeCallSource(depth), output, gasUsed, err, reverted) +} + +// OnOpcode implements the EVMLogger interface to trace a single step of VM execution. +func (f *Firehose) OnOpcode(pc uint64, op byte, gas, cost uint64, scope tracing.OpContext, rData []byte, depth int, err error) { + firehoseTrace("on opcode (op=%s gas=%d cost=%d, err=%s)", op, gas, cost, errorView(err)) + + if activeCall := f.callStack.Peek(); activeCall != nil { + opCode := vm.OpCode(op) + f.captureInterpreterStep(activeCall) + + // The rest of the logic expects that a call succeeded, nothing to do more here if the interpreter failed on this OpCode + if err != nil { + return + } + + // The gas change must come first to retain Firehose backward compatibility. Indeed, before Firehose 3.0, + // we had a specific method `OnKeccakPreimage` that was called during the KECCAK256 opcode. However, in + // the new model, we do it through `OnOpcode`. + // + // The gas change recording in the previous Firehose patch was done before calling `OnKeccakPreimage` so + // we must do the same here. + // + // No need to wrap in apply backward compatibility, the old behavior is fine in all cases. + if cost > 0 { + if reason, found := opCodeToGasChangeReasonMap[opCode]; found { + activeCall.GasChanges = append(activeCall.GasChanges, f.newGasChange("state", gas, gas-cost, reason)) + } + } + + if opCode == vm.KECCAK256 { + f.onOpcodeKeccak256(activeCall, scope.StackData(), Memory(scope.MemoryData())) + } + } +} + +// onOpcodeKeccak256 is called during the SHA3 (a.k.a KECCAK256) opcode it's known +// in Firehose tracer as Keccak preimages. The preimage is the input data that +// was used to produce the given keccak hash. +func (f *Firehose) onOpcodeKeccak256(call *pbeth.Call, stack []uint256.Int, memory Memory) { + if call.KeccakPreimages == nil { + call.KeccakPreimages = make(map[string]string) + } + + offset, size := stack[len(stack)-1], stack[len(stack)-2] + preImage := memory.GetPtrUint256(&offset, &size) + + // We should have exclusive access to the hasher, we can safely reset it. + f.hasher.Reset() + f.hasher.Write(preImage) + if _, err := f.hasher.Read(f.hasherBuf[:]); err != nil { + panic(fmt.Errorf("failed to read keccak256 hash: %w", err)) + } + + encodedData := hex.EncodeToString(preImage) + + if *f.applyBackwardCompatibility { + // Known Firehose issue: It appears the old Firehose instrumentation have a bug + // where when the keccak256 preimage is empty, it is written as "." which is + // completely wrong. + // + // To keep the same behavior, we will write the preimage as a "." when the encoded + // data is an empty string. + if encodedData == "" { + encodedData = "." + } + } + + call.KeccakPreimages[hex.EncodeToString(f.hasherBuf[:])] = encodedData +} + +var opCodeToGasChangeReasonMap = map[vm.OpCode]pbeth.GasChange_Reason{ + vm.CREATE: pbeth.GasChange_REASON_CONTRACT_CREATION, + vm.CREATE2: pbeth.GasChange_REASON_CONTRACT_CREATION2, + vm.CALL: pbeth.GasChange_REASON_CALL, + vm.STATICCALL: pbeth.GasChange_REASON_STATIC_CALL, + vm.CALLCODE: pbeth.GasChange_REASON_CALL_CODE, + vm.DELEGATECALL: pbeth.GasChange_REASON_DELEGATE_CALL, + vm.RETURN: pbeth.GasChange_REASON_RETURN, + vm.REVERT: pbeth.GasChange_REASON_REVERT, + vm.LOG0: pbeth.GasChange_REASON_EVENT_LOG, + vm.LOG1: pbeth.GasChange_REASON_EVENT_LOG, + vm.LOG2: pbeth.GasChange_REASON_EVENT_LOG, + vm.LOG3: pbeth.GasChange_REASON_EVENT_LOG, + vm.LOG4: pbeth.GasChange_REASON_EVENT_LOG, + vm.SELFDESTRUCT: pbeth.GasChange_REASON_SELF_DESTRUCT, + vm.CALLDATACOPY: pbeth.GasChange_REASON_CALL_DATA_COPY, + vm.CODECOPY: pbeth.GasChange_REASON_CODE_COPY, + vm.EXTCODECOPY: pbeth.GasChange_REASON_EXT_CODE_COPY, + vm.RETURNDATACOPY: pbeth.GasChange_REASON_RETURN_DATA_COPY, +} + +// OnOpcodeFault implements the EVMLogger interface to trace an execution fault. +func (f *Firehose) OnOpcodeFault(pc uint64, op byte, gas, cost uint64, scope tracing.OpContext, depth int, err error) { + if activeCall := f.callStack.Peek(); activeCall != nil { + f.captureInterpreterStep(activeCall) + } +} + +func (f *Firehose) captureInterpreterStep(activeCall *pbeth.Call) { + if *f.applyBackwardCompatibility { + // for call, we need to process the executed code here + // since in old firehose executed code calculation depends if the code exist + if activeCall.CallType == pbeth.CallType_CALL && !activeCall.ExecutedCode { + firehoseTrace("Intepreter step for callType_CALL") + activeCall.ExecutedCode = len(activeCall.Input) > 0 + } + } else { + activeCall.ExecutedCode = true + } +} + +func (f *Firehose) callStart(source string, callType pbeth.CallType, from common.Address, to common.Address, input []byte, gas uint64, value *big.Int) { + firehoseDebug("call start (source=%s index=%d type=%s input=%s)", source, f.callStack.NextIndex(), callType, inputView(input)) + f.ensureInBlockAndInTrx() + + if *f.applyBackwardCompatibility { + // Known Firehose issue: Contract creation call's input is always `nil` in old Firehose patch + // due to an oversight that having it in `CodeChange` would be sufficient but this is wrong + // as constructor's input are not part of the code change but part of the call input. + if callType == pbeth.CallType_CREATE { + input = nil + } + } + + call := &pbeth.Call{ + CallType: callType, + Depth: 0, + Caller: from.Bytes(), + Address: to.Bytes(), + // We need to clone `input` received by the tracer as it's re-used within Geth! + Input: bytes.Clone(input), + Value: firehoseBigIntFromNative(value), + GasLimit: gas, + } + + if *f.applyBackwardCompatibility { + // Known Firehose issue: The BeginOrdinal of the genesis block root call is never actually + // incremented and it's always 0. + // + // Ref 042a2ff03fd623f151d7726314b8aad6 + + call.BeginOrdinal = 0 + call.ExecutedCode = f.getExecutedCode(f.evm, call) + + if f.block.Number != 0 { + call.BeginOrdinal = f.blockOrdinal.Next() + } + } else { + call.BeginOrdinal = f.blockOrdinal.Next() + } + + if err := f.deferredCallState.MaybePopulateCallAndReset(source, call); err != nil { + panic(err) + } + + if *f.applyBackwardCompatibility { + // Known Firehose issue: The `BeginOrdinal` of the root call is incremented but must + // be assigned back to 0 because of a bug in the console reader. remove on new chain. + // + // New chain integration should remove this `if` statement + if source == callSourceRoot { + call.BeginOrdinal = 0 + } + } + + f.callStack.Push(call) +} + +// Known Firehose issue: How we computed `executed_code` before was not working for contract's that only +// deal with ETH transfer through Solidity `receive()` built-in since those call have `len(input) == 0` +// +// Older comment keeping for future review: +// +// For precompiled address however, interpreter does not run so determine there was a bug in Firehose instrumentation where we would +// +// if call.ExecutedCode || (f.isPrecompiledAddr != nil && f.isPrecompiledAddr(common.BytesToAddress(call.Address))) { +// // In this case, we are sure that some code executed. This translates in the old Firehose instrumentation +// // that it would have **never** emitted an `account_without_code`. +// // +// // When no `account_without_code` was executed in the previous Firehose instrumentation, +// // the `call.ExecutedCode` defaulted to the condition below +// call.ExecutedCode = call.CallType != pbeth.CallType_CREATE && len(call.Input) > 0 +// } else { +// +// // In all other cases, we are sure that no code executed. This translates in the old Firehose instrumentation +// // that it would have emitted an `account_without_code` and it would have then forced set the `call.ExecutedCode` +// // to `false`. +// call.ExecutedCode = false +// } +func (f *Firehose) getExecutedCode(evm *tracing.VMContext, call *pbeth.Call) bool { + precompile := f.blockIsPrecompiledAddr(common.BytesToAddress(call.Address)) + + if evm != nil && call.CallType == pbeth.CallType_CALL { + if !evm.StateDB.Exist(common.BytesToAddress(call.Address)) && + !precompile && f.blockRules.IsEIP158 && + (call.Value == nil || call.Value.Native().Sign() == 0) { + firehoseTrace("executed code IsSpuriousDragon (callType=%s inputLength=%d)", call.CallType.String(), len(call.Input)) + return call.CallType != pbeth.CallType_CREATE && len(call.Input) > 0 + } + } + + if precompile { + firehoseTrace("executed code isprecompile (callType=%s inputLength=%d)", call.CallType.String(), len(call.Input)) + return call.CallType != pbeth.CallType_CREATE && len(call.Input) > 0 + } + + if call.CallType == pbeth.CallType_CALL { + firehoseTrace("executed code callType_CALL") + // calculation for executed code will happen in captureInterpreterStep + return false + } + + firehoseTrace("executed code default (callType=%s inputLength=%d)", call.CallType.String(), len(call.Input)) + return call.CallType != pbeth.CallType_CREATE && len(call.Input) > 0 +} + +func (f *Firehose) callEnd(source string, output []byte, gasUsed uint64, err error, reverted bool) { + firehoseDebug("call end (source=%s index=%d output=%s gasUsed=%d err=%s reverted=%t)", source, f.callStack.ActiveIndex(), outputView(output), gasUsed, errorView(err), reverted) + + if f.latestCallEnterSuicided { + if source != callSourceChild { + panic(fmt.Errorf("unexpected source for suicided call end, expected child but got %s, suicide are always produced on a 'child' source", source)) + } + + // Geth native tracer does a `OnEnter(SELFDESTRUCT, ...)/OnExit(...)`, we must skip the `OnExit` call + // in that case because we did not push it on our CallStack. + f.latestCallEnterSuicided = false + return + } + + f.ensureInBlockAndInTrxAndInCall() + + call := f.callStack.Pop() + call.GasConsumed = gasUsed + + // For create call, we do not save the returned value which is the actual contract's code + if call.CallType != pbeth.CallType_CREATE { + call.ReturnData = bytes.Clone(output) + } + + if reverted { + failureReason := "" + if err != nil { + failureReason = err.Error() + } + + call.FailureReason = failureReason + call.StatusFailed = true + + // We also treat ErrInsufficientBalance and ErrDepth as reverted in Firehose model + // because they do not cost any gas. + call.StatusReverted = errors.Is(err, vm.ErrExecutionReverted) || errors.Is(err, vm.ErrInsufficientBalance) || errors.Is(err, vm.ErrDepth) + + if *f.applyBackwardCompatibility { + // Known Firehose issue: FIXME Document! + if !call.ExecutedCode && (errors.Is(err, vm.ErrInsufficientBalance) || errors.Is(err, vm.ErrDepth)) { + call.ExecutedCode = call.CallType != pbeth.CallType_CREATE && len(call.Input) > 0 + } + } + } + + if *f.applyBackwardCompatibility { + // Known Firehose issue: The EndOrdinal of the genesis block root call is never actually + // incremented and it's always 0. + if f.block.Number != 0 { + call.EndOrdinal = f.blockOrdinal.Next() + } + } else { + call.EndOrdinal = f.blockOrdinal.Next() + } + + f.transaction.Calls = append(f.transaction.Calls, call) +} + +func computeCallSource(depth int) string { + if depth == 0 { + return callSourceRoot + } + + return callSourceChild +} + +func (f *Firehose) OnGenesisBlock(b *types.Block, alloc types.GenesisAlloc) { + f.ensureBlockChainInit() + + f.OnBlockStart(tracing.BlockEvent{Block: b, TD: big.NewInt(0), Finalized: nil, Safe: nil}) + f.onTxStart(types.NewTx(&types.LegacyTx{}), emptyCommonHash, emptyCommonAddress, emptyCommonAddress) + f.OnCallEnter(0, byte(vm.CALL), emptyCommonAddress, emptyCommonAddress, nil, 0, nil) + + for _, addr := range sortedKeys(alloc) { + account := alloc[addr] + + if account.Balance != nil && account.Balance.Sign() != 0 { + activeCall := f.callStack.Peek() + activeCall.BalanceChanges = append(activeCall.BalanceChanges, f.newBalanceChange("genesis", addr, common.Big0, account.Balance, pbeth.BalanceChange_REASON_GENESIS_BALANCE)) + } + + if len(account.Code) > 0 { + f.OnCodeChange(addr, emptyCommonHash, nil, common.BytesToHash(crypto.Keccak256(account.Code)), account.Code) + } + + if account.Nonce > 0 { + f.OnNonceChange(addr, 0, account.Nonce) + } + + for _, key := range sortedKeys(account.Storage) { + f.OnStorageChange(addr, key, emptyCommonHash, account.Storage[key]) + } + } + + f.OnCallExit(0, nil, 0, nil, false) + f.OnTxEnd(&types.Receipt{ + PostState: b.Root().Bytes(), + Status: types.ReceiptStatusSuccessful, + }, nil) + f.OnBlockEnd(nil) +} + +type bytesGetter interface { + comparable + Bytes() []byte +} + +func sortedKeys[K bytesGetter, V any](m map[K]V) []K { + keys := maps.Keys(m) + slices.SortFunc(keys, func(i, j K) int { + return bytes.Compare(i.Bytes(), j.Bytes()) + }) + + return keys +} + +func (f *Firehose) OnBalanceChange(a common.Address, prev, new *big.Int, reason tracing.BalanceChangeReason) { + if reason == tracing.BalanceChangeUnspecified { + // We ignore those, if they are mislabelled, too bad so particular attention needs to be ported to this + return + } + + if *f.applyBackwardCompatibility { + // Known Firehose issue: It's possible to burn Ether by sending some ether to a suicided account. In those case, + // at theend of block producing, StateDB finalize the block by burning ether from the account. This is something + // we were not tracking in the old Firehose instrumentation. + if reason == tracing.BalanceDecreaseSelfdestructBurn { + return + } + } + + f.ensureInBlockOrTrx() + + change := f.newBalanceChange("tracer", a, prev, new, balanceChangeReasonFromChain(reason)) + + if f.transaction != nil { + activeCall := f.callStack.Peek() + + // There is an initial transfer happening will the call is not yet started, we track it manually + if activeCall == nil { + f.deferredCallState.balanceChanges = append(f.deferredCallState.balanceChanges, change) + return + } + + activeCall.BalanceChanges = append(activeCall.BalanceChanges, change) + } else { + f.block.BalanceChanges = append(f.block.BalanceChanges, change) + } +} + +func (f *Firehose) newBalanceChange(tag string, address common.Address, oldValue, newValue *big.Int, reason pbeth.BalanceChange_Reason) *pbeth.BalanceChange { + firehoseTrace("balance changed (tag=%s before=%d after=%d reason=%s)", tag, oldValue, newValue, reason) + + if reason == pbeth.BalanceChange_REASON_UNKNOWN { + panic(fmt.Errorf("received unknown balance change reason %s", reason)) + } + + return &pbeth.BalanceChange{ + Ordinal: f.blockOrdinal.Next(), + Address: address.Bytes(), + OldValue: firehoseBigIntFromNative(oldValue), + NewValue: firehoseBigIntFromNative(newValue), + Reason: reason, + } +} + +func (f *Firehose) OnNonceChange(a common.Address, prev, new uint64) { + f.ensureInBlockAndInTrx() + + activeCall := f.callStack.Peek() + change := &pbeth.NonceChange{ + Address: a.Bytes(), + OldValue: prev, + NewValue: new, + Ordinal: f.blockOrdinal.Next(), + } + + // There is an initial nonce change happening when the call is not yet started, we track it manually + if activeCall == nil { + f.deferredCallState.nonceChanges = append(f.deferredCallState.nonceChanges, change) + return + } + + activeCall.NonceChanges = append(activeCall.NonceChanges, change) +} + +func (f *Firehose) OnCodeChange(a common.Address, prevCodeHash common.Hash, prev []byte, codeHash common.Hash, code []byte) { + f.ensureInBlockOrTrx() + + change := &pbeth.CodeChange{ + Address: a.Bytes(), + OldHash: prevCodeHash.Bytes(), + OldCode: prev, + NewHash: codeHash.Bytes(), + NewCode: code, + Ordinal: f.blockOrdinal.Next(), + } + + if f.transaction != nil { + activeCall := f.callStack.Peek() + if activeCall == nil { + f.panicInvalidState("caller expected to be in call state but we were not, this is a bug", 0) + } + + activeCall.CodeChanges = append(activeCall.CodeChanges, change) + } else { + f.block.CodeChanges = append(f.block.CodeChanges, change) + } +} + +func (f *Firehose) OnStorageChange(a common.Address, k, prev, new common.Hash) { + f.ensureInBlockAndInTrxAndInCall() + + activeCall := f.callStack.Peek() + activeCall.StorageChanges = append(activeCall.StorageChanges, &pbeth.StorageChange{ + Address: a.Bytes(), + Key: k.Bytes(), + OldValue: prev.Bytes(), + NewValue: new.Bytes(), + Ordinal: f.blockOrdinal.Next(), + }) +} + +func (f *Firehose) OnLog(l *types.Log) { + f.ensureInBlockAndInTrxAndInCall() + + topics := make([][]byte, len(l.Topics)) + for i, topic := range l.Topics { + topics[i] = topic.Bytes() + } + + activeCall := f.callStack.Peek() + firehoseTrace("adding log to call (address=%s call=%d [has already %d logs])", l.Address, activeCall.Index, len(activeCall.Logs)) + + activeCall.Logs = append(activeCall.Logs, &pbeth.Log{ + Address: l.Address.Bytes(), + Topics: topics, + Data: l.Data, + Index: f.transactionLogIndex, + BlockIndex: uint32(l.Index), + Ordinal: f.blockOrdinal.Next(), + }) + + f.transactionLogIndex++ +} + +func (f *Firehose) OnGasChange(old, new uint64, reason tracing.GasChangeReason) { + f.ensureInBlockAndInTrx() + + if old == new { + return + } + + if reason == tracing.GasChangeCallOpCode { + // We ignore those because we track OpCode gas consumption manually by tracking the gas value at `OnOpcode` call + return + } + + if *f.applyBackwardCompatibility { + // Known Firehose issue: New geth native tracer added more gas change, some that we were indeed missing and + // should have included in our previous patch. + // + // Ref eb1916a67d9bea03df16a7a3e2cfac72 + if reason == tracing.GasChangeTxInitialBalance || + reason == tracing.GasChangeTxRefunds || + reason == tracing.GasChangeTxLeftOverReturned || + reason == tracing.GasChangeCallInitialBalance || + reason == tracing.GasChangeCallLeftOverReturned { + return + } + } + + activeCall := f.callStack.Peek() + change := f.newGasChange("tracer", old, new, gasChangeReasonFromChain(reason)) + + // There is an initial gas consumption happening will the call is not yet started, we track it manually + if activeCall == nil { + f.deferredCallState.gasChanges = append(f.deferredCallState.gasChanges, change) + return + } + + activeCall.GasChanges = append(activeCall.GasChanges, change) +} + +func (f *Firehose) newGasChange(tag string, oldValue, newValue uint64, reason pbeth.GasChange_Reason) *pbeth.GasChange { + firehoseTrace("gas consumed (tag=%s before=%d after=%d reason=%s)", tag, oldValue, newValue, reason) + + // Should already be checked by the caller, but we keep it here for safety if the code ever change + if reason == pbeth.GasChange_REASON_UNKNOWN { + panic(fmt.Errorf("received unknown gas change reason %s", reason)) + } + + return &pbeth.GasChange{ + OldValue: oldValue, + NewValue: newValue, + Ordinal: f.blockOrdinal.Next(), + Reason: reason, + } +} + +func (f *Firehose) ensureBlockChainInit() { + if f.chainConfig == nil { + f.panicInvalidState("the OnBlockchainInit hook should have been called at this point", 2) + } +} + +func (f *Firehose) ensureInBlock(callerSkip int) { + if f.block == nil { + f.panicInvalidState("caller expected to be in block state but we were not, this is a bug", callerSkip+1) + } + + if f.chainConfig == nil { + f.panicInvalidState("the OnBlockchainInit hook should have been called at this point", callerSkip+1) + } +} + +func (f *Firehose) ensureNotInBlock(callerSkip int) { + if f.block != nil { + f.panicInvalidState("caller expected to not be in block state but we were, this is a bug", callerSkip+1) + } +} + +// Suppress lint warning about unusued method, we keep it in the patch because it's used in other +// network which pulls this branch. +var _ = new(Firehose).ensureNotInBlock + +func (f *Firehose) ensureInBlockAndInTrx() { + f.ensureInBlock(2) + + if f.transaction == nil { + f.panicInvalidState("caller expected to be in transaction state but we were not, this is a bug", 2) + } +} + +func (f *Firehose) ensureInBlockAndNotInTrx() { + f.ensureInBlock(2) + + if f.transaction != nil { + f.panicInvalidState("caller expected to not be in transaction state but we were, this is a bug", 2) + } +} + +func (f *Firehose) ensureInBlockAndNotInTrxAndNotInCall() { + f.ensureInBlock(2) + + if f.transaction != nil { + f.panicInvalidState("caller expected to not be in transaction state but we were, this is a bug", 2) + } + + if f.callStack.HasActiveCall() { + f.panicInvalidState("caller expected to not be in call state but we were, this is a bug", 2) + } +} + +func (f *Firehose) ensureInBlockOrTrx() { + if f.transaction == nil && f.block == nil { + f.panicInvalidState("caller expected to be in either block or transaction state but we were not, this is a bug", 2) + } +} + +func (f *Firehose) ensureInBlockAndInTrxAndInCall() { + if f.transaction == nil || f.block == nil { + f.panicInvalidState("caller expected to be in block and in transaction but we were not, this is a bug", 2) + } + + if !f.callStack.HasActiveCall() { + f.panicInvalidState("caller expected to be in call state but we were not, this is a bug", 2) + } +} + +func (f *Firehose) ensureInCall() { + if f.block == nil { + f.panicInvalidState("caller expected to be in call state but we were not, this is a bug", 2) + } +} + +func (f *Firehose) ensureInSystemCall() { + if !f.inSystemCall { + f.panicInvalidState("call expected to be in system call state but we were not, this is a bug", 2) + } +} + +func (f *Firehose) panicInvalidState(msg string, callerSkip int) string { + caller := "N/A" + if _, file, line, ok := runtime.Caller(callerSkip); ok { + caller = fmt.Sprintf("%s:%d", file, line) + } + + if f.block != nil { + msg += fmt.Sprintf(" at block #%d (%s)", f.block.Number, hex.EncodeToString(f.block.Hash)) + } + + if f.transaction != nil { + msg += fmt.Sprintf(" in transaction %s", hex.EncodeToString(f.transaction.Hash)) + } + + panic(fmt.Errorf("%s (caller=%s, init=%t, inBlock=%t, inTransaction=%t, inCall=%t)", msg, caller, f.chainConfig != nil, f.block != nil, f.transaction != nil, f.callStack.HasActiveCall())) +} + +// printToFirehose is an easy way to print to Firehose format, it essentially +// adds the "FIRE" prefix to the input and joins the input with spaces as well +// as adding a newline at the end. +// +// It flushes this through [flushToFirehose] to the `os.Stdout` writer. +func (f *Firehose) printBlockToFirehose(block *pbeth.Block, finalityStatus *FinalityStatus) { + marshalled, err := proto.Marshal(block) + if err != nil { + panic(fmt.Errorf("failed to marshal block: %w", err)) + } + + f.outputBuffer.Reset() + + previousHash := block.PreviousID() + previousNum := 0 + if block.Number > 0 { + previousNum = int(block.Number) - 1 + } + + libNum := finalityStatus.LastIrreversibleBlockNumber + if finalityStatus.IsEmpty() { + // FIXME: We should have access to the genesis block to perform this operation to ensure we never go below the + // the genesis block + if block.Number >= 200 { + libNum = block.Number - 200 + } else { + libNum = 0 + } + } + + // **Important* The final space in the Sprintf template is mandatory! + f.outputBuffer.WriteString(fmt.Sprintf("FIRE BLOCK %d %s %d %s %d %d ", block.Number, hex.EncodeToString(block.Hash), previousNum, previousHash, libNum, block.Time().UnixNano())) + + encoder := base64.NewEncoder(base64.StdEncoding, f.outputBuffer) + if _, err = encoder.Write(marshalled); err != nil { + panic(fmt.Errorf("write to encoder should have been infaillible: %w", err)) + } + + if err := encoder.Close(); err != nil { + panic(fmt.Errorf("closing encoder should have been infaillible: %w", err)) + } + + f.outputBuffer.WriteString("\n") + + flushToFirehose(f.outputBuffer.Bytes(), os.Stdout) +} + +// printToFirehose is an easy way to print to Firehose format, it essentially +// adds the "FIRE" prefix to the input and joins the input with spaces as well +// as adding a newline at the end. +// +// It flushes this through [flushToFirehose] to the `os.Stdout` writer. +func printToFirehose(input ...string) { + flushToFirehose([]byte("FIRE "+strings.Join(input, " ")+"\n"), os.Stdout) +} + +// flushToFirehose sends data to Firehose via `io.Writter` checking for errors +// and retrying if necessary. +// +// If error is still present after 10 retries, prints an error message to `writer` +// as well as writing file `/tmp/firehose_writer_failed_print.log` with the same +// error message. +func flushToFirehose(in []byte, writer io.Writer) { + var written int + var err error + loops := 10 + for i := 0; i < loops; i++ { + written, err = writer.Write(in) + + if len(in) == written { + return + } + + in = in[written:] + if i == loops-1 { + break + } + } + + errstr := fmt.Sprintf("\nFIREHOSE FAILED WRITING %dx: %s\n", loops, err) + if err := os.WriteFile("./firehose_writer_failed_print.log", []byte(errstr), 0600); err != nil { + fmt.Println(errstr) + } + + fmt.Fprint(writer, errstr) +} + +// FIXME: Create a unit test that is going to fail as soon as any header is added in +func newBlockHeaderFromChainHeader(h *types.Header, td *pbeth.BigInt) *pbeth.BlockHeader { + var withdrawalsHashBytes []byte + if hash := h.WithdrawalsHash; hash != nil { + withdrawalsHashBytes = hash.Bytes() + } + + var parentBeaconRootBytes []byte + if root := h.ParentBeaconRoot; root != nil { + parentBeaconRootBytes = root.Bytes() + } + + pbHead := &pbeth.BlockHeader{ + Hash: h.Hash().Bytes(), + Number: h.Number.Uint64(), + ParentHash: h.ParentHash.Bytes(), + UncleHash: h.UncleHash.Bytes(), + Coinbase: h.Coinbase.Bytes(), + StateRoot: h.Root.Bytes(), + TransactionsRoot: h.TxHash.Bytes(), + ReceiptRoot: h.ReceiptHash.Bytes(), + LogsBloom: h.Bloom.Bytes(), + Difficulty: firehoseBigIntFromNative(h.Difficulty), + TotalDifficulty: td, + GasLimit: h.GasLimit, + GasUsed: h.GasUsed, + Timestamp: timestamppb.New(time.Unix(int64(h.Time), 0)), + ExtraData: h.Extra, + MixHash: h.MixDigest.Bytes(), + Nonce: h.Nonce.Uint64(), + BaseFeePerGas: firehoseBigIntFromNative(h.BaseFee), + WithdrawalsRoot: withdrawalsHashBytes, + BlobGasUsed: h.BlobGasUsed, + ExcessBlobGas: h.ExcessBlobGas, + ParentBeaconRoot: parentBeaconRootBytes, + + // Only set on Polygon fork(s) + TxDependency: nil, + } + + if pbHead.Difficulty == nil { + pbHead.Difficulty = &pbeth.BigInt{Bytes: []byte{0}} + } + + return pbHead +} + +// FIXME: Bring back Firehose test that ensures no new tx type are missed +func transactionTypeFromChainTxType(txType uint8) pbeth.TransactionTrace_Type { + switch txType { + case types.AccessListTxType: + return pbeth.TransactionTrace_TRX_TYPE_ACCESS_LIST + case types.DynamicFeeTxType: + return pbeth.TransactionTrace_TRX_TYPE_DYNAMIC_FEE + case types.LegacyTxType: + return pbeth.TransactionTrace_TRX_TYPE_LEGACY + case types.BlobTxType: + return pbeth.TransactionTrace_TRX_TYPE_BLOB + default: + panic(fmt.Errorf("unknown transaction type %d", txType)) + } +} + +func transactionStatusFromChainTxReceipt(txStatus uint64) pbeth.TransactionTraceStatus { + switch txStatus { + case types.ReceiptStatusSuccessful: + return pbeth.TransactionTraceStatus_SUCCEEDED + case types.ReceiptStatusFailed: + return pbeth.TransactionTraceStatus_FAILED + default: + panic(fmt.Errorf("unknown transaction status %d", txStatus)) + } +} + +func rootCallType(create bool) pbeth.CallType { + if create { + return pbeth.CallType_CREATE + } + + return pbeth.CallType_CALL +} + +func callTypeFromOpCode(typ vm.OpCode) pbeth.CallType { + switch typ { + case vm.CALL: + return pbeth.CallType_CALL + case vm.STATICCALL: + return pbeth.CallType_STATIC + case vm.DELEGATECALL: + return pbeth.CallType_DELEGATE + case vm.CREATE, vm.CREATE2: + return pbeth.CallType_CREATE + case vm.CALLCODE: + return pbeth.CallType_CALLCODE + } + + return pbeth.CallType_UNSPECIFIED +} + +func newTxReceiptFromChain(receipt *types.Receipt, txType pbeth.TransactionTrace_Type) (out *pbeth.TransactionReceipt) { + out = &pbeth.TransactionReceipt{ + StateRoot: receipt.PostState, + CumulativeGasUsed: receipt.CumulativeGasUsed, + LogsBloom: receipt.Bloom[:], + } + + if txType == pbeth.TransactionTrace_TRX_TYPE_BLOB { + out.BlobGasUsed = &receipt.BlobGasUsed + out.BlobGasPrice = firehoseBigIntFromNative(receipt.BlobGasPrice) + } + + if len(receipt.Logs) > 0 { + out.Logs = make([]*pbeth.Log, len(receipt.Logs)) + for i, log := range receipt.Logs { + out.Logs[i] = &pbeth.Log{ + Address: log.Address.Bytes(), + Topics: func() [][]byte { + if len(log.Topics) == 0 { + return nil + } + + out := make([][]byte, len(log.Topics)) + for i, topic := range log.Topics { + out[i] = topic.Bytes() + } + return out + }(), + Data: log.Data, + Index: uint32(i), + BlockIndex: uint32(log.Index), + + // Ordinal on transaction receipt logs is populated at the very end, so pairing + // between call logs and receipt logs is made + } + } + } + + return out +} + +func newAccessListFromChain(accessList types.AccessList) (out []*pbeth.AccessTuple) { + if len(accessList) == 0 { + return nil + } + + out = make([]*pbeth.AccessTuple, len(accessList)) + for i, tuple := range accessList { + out[i] = &pbeth.AccessTuple{ + Address: tuple.Address.Bytes(), + StorageKeys: func() [][]byte { + out := make([][]byte, len(tuple.StorageKeys)) + for i, key := range tuple.StorageKeys { + out[i] = key.Bytes() + } + return out + }(), + } + } + + return +} + +func newBlobHashesFromChain(blobHashes []common.Hash) (out [][]byte) { + if len(blobHashes) == 0 { + return nil + } + + out = make([][]byte, len(blobHashes)) + for i, blobHash := range blobHashes { + out[i] = blobHash.Bytes() + } + + return +} + +var balanceChangeReasonToPb = map[tracing.BalanceChangeReason]pbeth.BalanceChange_Reason{ + tracing.BalanceIncreaseRewardMineUncle: pbeth.BalanceChange_REASON_REWARD_MINE_UNCLE, + tracing.BalanceIncreaseRewardMineBlock: pbeth.BalanceChange_REASON_REWARD_MINE_BLOCK, + tracing.BalanceIncreaseDaoContract: pbeth.BalanceChange_REASON_DAO_REFUND_CONTRACT, + tracing.BalanceDecreaseDaoAccount: pbeth.BalanceChange_REASON_DAO_ADJUST_BALANCE, + tracing.BalanceChangeTransfer: pbeth.BalanceChange_REASON_TRANSFER, + tracing.BalanceIncreaseGenesisBalance: pbeth.BalanceChange_REASON_GENESIS_BALANCE, + tracing.BalanceDecreaseGasBuy: pbeth.BalanceChange_REASON_GAS_BUY, + tracing.BalanceIncreaseRewardTransactionFee: pbeth.BalanceChange_REASON_REWARD_TRANSACTION_FEE, + tracing.BalanceIncreaseGasReturn: pbeth.BalanceChange_REASON_GAS_REFUND, + tracing.BalanceChangeTouchAccount: pbeth.BalanceChange_REASON_TOUCH_ACCOUNT, + tracing.BalanceIncreaseSelfdestruct: pbeth.BalanceChange_REASON_SUICIDE_REFUND, + tracing.BalanceDecreaseSelfdestruct: pbeth.BalanceChange_REASON_SUICIDE_WITHDRAW, + tracing.BalanceDecreaseSelfdestructBurn: pbeth.BalanceChange_REASON_BURN, + tracing.BalanceIncreaseWithdrawal: pbeth.BalanceChange_REASON_WITHDRAWAL, + + tracing.BalanceChangeUnspecified: pbeth.BalanceChange_REASON_UNKNOWN, +} + +func balanceChangeReasonFromChain(reason tracing.BalanceChangeReason) pbeth.BalanceChange_Reason { + if r, ok := balanceChangeReasonToPb[reason]; ok { + return r + } + + panic(fmt.Errorf("unknown tracer balance change reason value '%d', check state.BalanceChangeReason so see to which constant it refers to", reason)) +} + +var gasChangeReasonToPb = map[tracing.GasChangeReason]pbeth.GasChange_Reason{ + tracing.GasChangeTxInitialBalance: pbeth.GasChange_REASON_TX_INITIAL_BALANCE, + tracing.GasChangeTxRefunds: pbeth.GasChange_REASON_TX_REFUNDS, + tracing.GasChangeTxLeftOverReturned: pbeth.GasChange_REASON_TX_LEFT_OVER_RETURNED, + tracing.GasChangeCallInitialBalance: pbeth.GasChange_REASON_CALL_INITIAL_BALANCE, + tracing.GasChangeCallLeftOverReturned: pbeth.GasChange_REASON_CALL_LEFT_OVER_RETURNED, + tracing.GasChangeTxIntrinsicGas: pbeth.GasChange_REASON_INTRINSIC_GAS, + tracing.GasChangeCallContractCreation: pbeth.GasChange_REASON_CONTRACT_CREATION, + tracing.GasChangeCallContractCreation2: pbeth.GasChange_REASON_CONTRACT_CREATION2, + tracing.GasChangeCallCodeStorage: pbeth.GasChange_REASON_CODE_STORAGE, + tracing.GasChangeCallPrecompiledContract: pbeth.GasChange_REASON_PRECOMPILED_CONTRACT, + tracing.GasChangeCallStorageColdAccess: pbeth.GasChange_REASON_STATE_COLD_ACCESS, + tracing.GasChangeCallLeftOverRefunded: pbeth.GasChange_REASON_REFUND_AFTER_EXECUTION, + tracing.GasChangeCallFailedExecution: pbeth.GasChange_REASON_FAILED_EXECUTION, + + // Ignored, we track them manually, newGasChange ensure that we panic if we see Unknown + tracing.GasChangeCallOpCode: pbeth.GasChange_REASON_UNKNOWN, +} + +func gasChangeReasonFromChain(reason tracing.GasChangeReason) pbeth.GasChange_Reason { + if r, ok := gasChangeReasonToPb[reason]; ok { + if r == pbeth.GasChange_REASON_UNKNOWN { + panic(fmt.Errorf("tracer gas change reason value '%d' mapped to %s which is not accepted", reason, r)) + } + + return r + } + + panic(fmt.Errorf("unknown tracer gas change reason value '%d', check vm.GasChangeReason so see to which constant it refers to", reason)) +} + +func maxFeePerGas(tx *types.Transaction) *pbeth.BigInt { + switch tx.Type() { + case types.LegacyTxType, types.AccessListTxType: + return nil + + case types.DynamicFeeTxType, types.BlobTxType: + return firehoseBigIntFromNative(tx.GasFeeCap()) + + } + + panic(errUnhandledTransactionType("maxFeePerGas", tx.Type())) +} + +func maxPriorityFeePerGas(tx *types.Transaction) *pbeth.BigInt { + switch tx.Type() { + case types.LegacyTxType, types.AccessListTxType: + return nil + + case types.DynamicFeeTxType, types.BlobTxType: + return firehoseBigIntFromNative(tx.GasTipCap()) + } + + panic(errUnhandledTransactionType("maxPriorityFeePerGas", tx.Type())) +} + +func gasPrice(tx *types.Transaction, baseFee *big.Int) *pbeth.BigInt { + switch tx.Type() { + case types.LegacyTxType, types.AccessListTxType: + return firehoseBigIntFromNative(tx.GasPrice()) + + case types.DynamicFeeTxType, types.BlobTxType: + if baseFee == nil { + return firehoseBigIntFromNative(tx.GasPrice()) + } + + return firehoseBigIntFromNative(math.BigMin(new(big.Int).Add(tx.GasTipCap(), baseFee), tx.GasFeeCap())) + } + + panic(errUnhandledTransactionType("gasPrice", tx.Type())) +} + +func FirehoseDebug(msg string, args ...any) { + firehoseDebug(msg, args...) +} + +func firehoseInfo(msg string, args ...any) { + if isFirehoseInfoEnabled { + firehoseLog(msg, args) + } +} + +func firehoseDebug(msg string, args ...any) { + if isFirehoseDebugEnabled { + firehoseLog(msg, args) + } +} + +func firehoseTrace(msg string, args ...any) { + if isFirehoseTracerEnabled { + firehoseLog(msg, args) + } +} + +func firehoseLog(msg string, args []any) { + fmt.Fprintf(os.Stderr, "[Firehose] "+msg+"\n", args...) +} + +// Ignore unused, we keep it around for debugging purposes +var _ = firehoseDebugPrintStack + +func firehoseDebugPrintStack() { + if isFirehoseDebugEnabled { + fmt.Fprintf(os.Stderr, "[Firehose] Stacktrace\n") + + // PrintStack prints to Stderr + debug.PrintStack() + } +} + +func errUnhandledTransactionType(tag string, value uint8) error { + return fmt.Errorf("unhandled transaction type's %d for firehose.%s(), carefully review the patch, if this new transaction type add new fields, think about adding them to Firehose Block format, when you see this message, it means something changed in the chain model and great care and thinking most be put here to properly understand the changes and the consequences they bring for the instrumentation", value, tag) +} + +type Ordinal struct { + value uint64 +} + +// Reset resets the ordinal to zero. +func (o *Ordinal) Reset() { + o.value = 0 +} + +// Peek gives you the current ordinal value which is actually the last assigned +// value attributed, the next value that is going to be used is `Peek() + 1`. +func (o *Ordinal) Peek() (out uint64) { + return o.value +} + +// Next gives you the next sequential ordinal value that you should +// use to assign to your exeuction trace (block, transaction, call, etc). +func (o *Ordinal) Next() (out uint64) { + o.value++ + + return o.value +} + +type CallStack struct { + index uint32 + stack []*pbeth.Call + depth int +} + +func NewCallStack() *CallStack { + return &CallStack{} +} + +func (s *CallStack) Reset() { + s.index = 0 + s.stack = s.stack[:0] + s.depth = 0 +} + +func (s *CallStack) HasActiveCall() bool { + return len(s.stack) > 0 +} + +// Push a call onto the stack. The `Index` and `ParentIndex` of this call are +// assigned by this method which knowns how to find the parent call and deal with +// it. +func (s *CallStack) Push(call *pbeth.Call) { + s.index++ + call.Index = s.index + + call.Depth = uint32(s.depth) + s.depth++ + + // If a current call is active, it's the parent of this call + if parent := s.Peek(); parent != nil { + call.ParentIndex = parent.Index + } + + s.stack = append(s.stack, call) +} + +func (s *CallStack) ActiveIndex() uint32 { + if len(s.stack) == 0 { + return 0 + } + + return s.stack[len(s.stack)-1].Index +} + +func (s *CallStack) NextIndex() uint32 { + return s.index + 1 +} + +func (s *CallStack) Pop() (out *pbeth.Call) { + if len(s.stack) == 0 { + panic(fmt.Errorf("pop from empty call stack")) + } + + out = s.stack[len(s.stack)-1] + s.stack = s.stack[:len(s.stack)-1] + s.depth-- + + return +} + +// Peek returns the top of the stack without removing it, it's the +// activate call. +func (s *CallStack) Peek() *pbeth.Call { + if len(s.stack) == 0 { + return nil + } + + return s.stack[len(s.stack)-1] +} + +// DeferredCallState is a helper struct that can be used to accumulate call's state +// that is recorded before the Call has been started. This happens on the "starting" +// portion of the call/created. +type DeferredCallState struct { + accountCreations []*pbeth.AccountCreation + balanceChanges []*pbeth.BalanceChange + gasChanges []*pbeth.GasChange + nonceChanges []*pbeth.NonceChange +} + +func NewDeferredCallState() *DeferredCallState { + return &DeferredCallState{} +} + +func (d *DeferredCallState) MaybePopulateCallAndReset(source string, call *pbeth.Call) error { + if d.IsEmpty() { + return nil + } + + if source != "root" { + return fmt.Errorf("unexpected source for deferred call state, expected root but got %s, deferred call's state are always produced on the 'root' call", source) + } + + // We must happen because it's populated at beginning of the call as well as at the very end + call.AccountCreations = append(call.AccountCreations, d.accountCreations...) + call.BalanceChanges = append(call.BalanceChanges, d.balanceChanges...) + call.GasChanges = append(call.GasChanges, d.gasChanges...) + call.NonceChanges = append(call.NonceChanges, d.nonceChanges...) + + d.Reset() + + return nil +} + +func (d *DeferredCallState) IsEmpty() bool { + return len(d.accountCreations) == 0 && len(d.balanceChanges) == 0 && len(d.gasChanges) == 0 && len(d.nonceChanges) == 0 +} + +func (d *DeferredCallState) Reset() { + d.accountCreations = nil + d.balanceChanges = nil + d.gasChanges = nil + d.nonceChanges = nil +} + +type byteView []byte + +func (b byteView) String() string { + return hex.EncodeToString(b) +} + +func errorView(err error) _errorView { + return _errorView{err} +} + +type _errorView struct { + err error +} + +func (e _errorView) String() string { + if e.err == nil { + return "" + } + + return e.err.Error() +} + +type inputView []byte + +func (b inputView) String() string { + if len(b) == 0 { + return "" + } + + if len(b) < 4 { + return common.Bytes2Hex(b) + } + + method := b[:4] + rest := b[4:] + + if len(rest)%32 == 0 { + return fmt.Sprintf("%s (%d params)", common.Bytes2Hex(method), len(rest)/32) + } + + // Contract input starts with pre-defined chracters AFAIK, we could show them more nicely + + return fmt.Sprintf("%d bytes", len(rest)) +} + +type outputView []byte + +func (b outputView) String() string { + if len(b) == 0 { + return "" + } + + return fmt.Sprintf("%d bytes", len(b)) +} + +type receiptView types.Receipt + +func (r *receiptView) String() string { + if r == nil { + return "" + } + + status := "unknown" + switch r.Status { + case types.ReceiptStatusSuccessful: + status = "success" + case types.ReceiptStatusFailed: + status = "failed" + } + + return fmt.Sprintf("[status=%s, gasUsed=%d, logs=%d]", status, r.GasUsed, len(r.Logs)) +} + +func emptyBytesToNil(in []byte) []byte { + if len(in) == 0 { + return nil + } + + return in +} + +func normalizeSignaturePoint(value []byte) []byte { + if len(value) == 0 { + return nil + } + + if len(value) < 32 { + offset := 32 - len(value) + + out := make([]byte, 32) + copy(out[offset:32], value) + + return out + } + + return value[0:32] +} + +func firehoseBigIntFromNative(in *big.Int) *pbeth.BigInt { + if in == nil || in.Sign() == 0 { + return nil + } + + return &pbeth.BigInt{Bytes: in.Bytes()} +} + +type FinalityStatus struct { + LastIrreversibleBlockNumber uint64 + LastIrreversibleBlockHash []byte +} + +func (s *FinalityStatus) populate(finalNumber uint64, finalHash []byte) { + s.LastIrreversibleBlockNumber = finalNumber + s.LastIrreversibleBlockHash = finalHash +} + +func (s *FinalityStatus) populateFromChain(finalHeader *types.Header) { + if finalHeader == nil { + s.Reset() + return + } + + s.LastIrreversibleBlockNumber = finalHeader.Number.Uint64() + s.LastIrreversibleBlockHash = finalHeader.Hash().Bytes() +} + +func (s *FinalityStatus) Reset() { + s.LastIrreversibleBlockNumber = 0 + s.LastIrreversibleBlockHash = nil +} + +func (s *FinalityStatus) IsEmpty() bool { + return s.LastIrreversibleBlockNumber == 0 && len(s.LastIrreversibleBlockHash) == 0 +} + +var errFirehoseUnknownType = errors.New("firehose unknown tx type") +var sanitizeRegexp = regexp.MustCompile(`[\t( ){2,}]+`) + +func staticFirehoseChainValidationOnInit() { + firehoseKnownTxTypes := map[byte]bool{ + types.LegacyTxType: true, + types.AccessListTxType: true, + types.DynamicFeeTxType: true, + types.BlobTxType: true, + } + + for txType := byte(0); txType < 255; txType++ { + err := validateFirehoseKnownTransactionType(txType, firehoseKnownTxTypes[txType]) + if err != nil { + panic(fmt.Errorf(sanitizeRegexp.ReplaceAllString(` + If you see this panic message, it comes from a sanity check of Firehose instrumentation + around Ethereum transaction types. + + Over time, Ethereum added new transaction types but there is no easy way for Firehose to + report a compile time check that a new transaction's type must be handled. As such, we + have a runtime check at initialization of the process that encode/decode each possible + transaction's receipt and check proper handling. + + This panic means that a transaction that Firehose don't know about has most probably + been added and you must take **great care** to instrument it. One of the most important place + to look is in 'firehose.StartTransaction' where it should be properly handled. Think + carefully, read the EIP and ensure that any new "semantic" the transactions type's is + bringing is handled and instrumented (it might affect Block and other execution units also). + + For example, when London fork appeared, semantic of 'GasPrice' changed and it required + a different computation for 'GasPrice' when 'DynamicFeeTx' transaction were added. If you determined + it was indeed a new transaction's type, fix 'firehoseKnownTxTypes' variable above to include it + as a known Firehose type (after proper instrumentation of course). + + It's also possible the test itself is now flaky, we do 'receipt := types.Receipt{Type: }' + then 'buffer := receipt.EncodeRLP(...)' and then 'receipt.DecodeRLP(buffer)'. This should catch + new transaction types but could be now generate false positive. + + Received error: %w + `, " "), err)) + } + } +} + +func validateFirehoseKnownTransactionType(txType byte, isKnownFirehoseTxType bool) error { + writerBuffer := bytes.NewBuffer(nil) + + receipt := types.Receipt{Type: txType} + err := receipt.EncodeRLP(writerBuffer) + if err != nil { + if err == types.ErrTxTypeNotSupported { + if isKnownFirehoseTxType { + return fmt.Errorf("firehose known type but encoding RLP of receipt led to 'types.ErrTxTypeNotSupported'") + } + + // It's not a known type and encoding reported the same, so validation is OK + return nil + } + + // All other cases results in an error as we should have been able to encode it to RLP + return fmt.Errorf("encoding RLP: %w", err) + } + + readerBuffer := bytes.NewBuffer(writerBuffer.Bytes()) + err = receipt.DecodeRLP(rlp.NewStream(readerBuffer, 0)) + if err != nil { + if err == types.ErrTxTypeNotSupported { + if isKnownFirehoseTxType { + return fmt.Errorf("firehose known type but decoding of RLP of receipt led to 'types.ErrTxTypeNotSupported'") + } + + // It's not a known type and decoding reported the same, so validation is OK + return nil + } + + // All other cases results in an error as we should have been able to decode it from RLP + return fmt.Errorf("decoding RLP: %w", err) + } + + // If we reach here, encoding/decoding accepted the transaction's type, so let's ensure we expected the same + if !isKnownFirehoseTxType { + return fmt.Errorf("unknown tx type value %d: %w", txType, errFirehoseUnknownType) + } + + return nil +} + +type validationResult struct { + failures []string +} + +func (r *validationResult) panicOnAnyFailures(msg string, args ...any) { + if len(r.failures) > 0 { + panic(fmt.Errorf(fmt.Sprintf(msg, args...)+": validation failed:\n %s", strings.Join(r.failures, "\n"))) + } +} + +// We keep them around, planning in the future to use them (they existed in the previous Firehose patch) +var _, _, _, _ = validateAddressField, validateBigIntField, validateHashField, validateUint64Field + +func validateAddressField(into *validationResult, field string, a, b common.Address) { + validateField(into, field, a, b, a == b, common.Address.String) +} + +func validateBigIntField(into *validationResult, field string, a, b *big.Int) { + equal := false + if a == nil && b == nil { + equal = true + } else if a == nil || b == nil { + equal = false + } else { + equal = a.Cmp(b) == 0 + } + + validateField(into, field, a, b, equal, func(x *big.Int) string { + if x == nil { + return "" + } else { + return x.String() + } + }) +} + +func validateBytesField(into *validationResult, field string, a, b []byte) { + validateField(into, field, a, b, bytes.Equal(a, b), common.Bytes2Hex) +} + +func validateArrayOfBytesField(into *validationResult, field string, a, b [][]byte) { + if len(a) != len(b) { + into.failures = append(into.failures, fmt.Sprintf("%s [(actual element) %d != %d (expected element)]", field, len(a), len(b))) + return + } + + for i := range a { + validateBytesField(into, fmt.Sprintf("%s[%d]", field, i), a[i], b[i]) + } +} + +func validateHashField(into *validationResult, field string, a, b common.Hash) { + validateField(into, field, a, b, a == b, common.Hash.String) +} + +func validateUint32Field(into *validationResult, field string, a, b uint32) { + validateField(into, field, a, b, a == b, func(x uint32) string { return strconv.FormatUint(uint64(x), 10) }) +} + +func validateUint64Field(into *validationResult, field string, a, b uint64) { + validateField(into, field, a, b, a == b, func(x uint64) string { return strconv.FormatUint(x, 10) }) +} + +// validateField, pays the price for failure message construction only when field are not equal +func validateField[T any](into *validationResult, field string, a, b T, equal bool, toString func(x T) string) { + if !equal { + into.failures = append(into.failures, fmt.Sprintf("%s [(actual) %s %s %s (expected)]", field, toString(a), "!=", toString(b))) + } +} + +func ptr[T any](t T) *T { + return &t +} + +type Memory []byte + +func (m Memory) GetPtrUint256(offset, size *uint256.Int) []byte { + return m.GetPtr(int64(offset.Uint64()), int64(size.Uint64())) +} + +func (m Memory) GetPtr(offset, size int64) []byte { + if size == 0 { + return nil + } + + if len(m) > int(offset) { + return m[offset : offset+size] + } + + return nil +} diff --git a/x/evm/tracers/firehose_test.go b/x/evm/tracers/firehose_test.go new file mode 100644 index 000000000..4b6e13238 --- /dev/null +++ b/x/evm/tracers/firehose_test.go @@ -0,0 +1,471 @@ +package tracers + +import ( + "encoding/json" + "fmt" + "math/big" + "os" + "reflect" + "slices" + "testing" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/tracing" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/core/vm" + "github.com/ethereum/go-ethereum/params" + pbeth "github.com/sei-protocol/sei-chain/pb/sf/ethereum/type/v2" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "golang.org/x/exp/maps" + "google.golang.org/protobuf/encoding/protojson" + "google.golang.org/protobuf/proto" + "google.golang.org/protobuf/types/known/timestamppb" +) + +func TestFirehoseCallStack_Push(t *testing.T) { + type actionRunner func(t *testing.T, s *CallStack) + + push := func(call *pbeth.Call) actionRunner { return func(_ *testing.T, s *CallStack) { s.Push(call) } } + pop := func() actionRunner { return func(_ *testing.T, s *CallStack) { s.Pop() } } + check := func(r actionRunner) actionRunner { return func(t *testing.T, s *CallStack) { r(t, s) } } + + tests := []struct { + name string + actions []actionRunner + }{ + { + "push/pop emtpy", []actionRunner{ + push(&pbeth.Call{}), + pop(), + check(func(t *testing.T, s *CallStack) { + require.Len(t, s.stack, 0) + }), + }, + }, + { + "push/push/push", []actionRunner{ + push(&pbeth.Call{}), + push(&pbeth.Call{}), + push(&pbeth.Call{}), + check(func(t *testing.T, s *CallStack) { + require.Len(t, s.stack, 3) + + require.Equal(t, 1, int(s.stack[0].Index)) + require.Equal(t, 0, int(s.stack[0].ParentIndex)) + + require.Equal(t, 2, int(s.stack[1].Index)) + require.Equal(t, 1, int(s.stack[1].ParentIndex)) + + require.Equal(t, 3, int(s.stack[2].Index)) + require.Equal(t, 2, int(s.stack[2].ParentIndex)) + }), + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + s := NewCallStack() + + for _, action := range tt.actions { + action(t, s) + } + }) + } +} + +func Test_validateKnownTransactionTypes(t *testing.T) { + tests := []struct { + name string + txType byte + knownType bool + want error + }{ + {"legacy", 0, true, nil}, + {"access_list", 1, true, nil}, + {"inexistant", 255, false, nil}, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + err := validateFirehoseKnownTransactionType(tt.txType, tt.knownType) + if tt.want == nil && err != nil { + t.Fatalf("Transaction of type %d expected to validate properly but received error %q", tt.txType, err) + } else if tt.want != nil && err == nil { + t.Fatalf("Transaction of type %d expected to validate improperly but generated no error", tt.txType) + } else if tt.want != nil && err != nil && tt.want.Error() != err.Error() { + t.Fatalf("Transaction of type %d expected to validate improperly but generated error %q does not match expected error %q", tt.txType, err, tt.want) + } + }) + } +} + +var ignorePbFieldNames = map[string]bool{ + "Hash": true, + "TotalDifficulty": true, + "state": true, + "unknownFields": true, + "sizeCache": true, + + // This was a Polygon specific field that existed for a while and has since been + // removed. It can be safely ignored in all protocols now. + "TxDependency": true, +} + +var pbFieldNameToGethMapping = map[string]string{ + "WithdrawalsRoot": "WithdrawalsHash", + "MixHash": "MixDigest", + "BaseFeePerGas": "BaseFee", + "StateRoot": "Root", + "ExtraData": "Extra", + "Timestamp": "Time", + "ReceiptRoot": "ReceiptHash", + "TransactionsRoot": "TxHash", + "LogsBloom": "Bloom", +} + +var ( + pbHeaderType = reflect.TypeOf((*pbeth.BlockHeader)(nil)).Elem() + gethHeaderType = reflect.TypeOf((*types.Header)(nil)).Elem() +) + +func Test_TypesHeader_AllConsensusFieldsAreKnown(t *testing.T) { + // This exact hash varies from protocol to protocol and also sometimes from one version to the other. + // When adding support for a new hard-fork that adds new block header fields, it's normal that this value + // changes. If you are sure the two struct are the same, then you can update the expected hash below + // to the new value. + expectedHash := common.HexToHash("5341947c531e5c9cf38202784b16ac66484fe1838aa6e825436b22321b927296") + + gethHeaderValue := reflect.New(gethHeaderType) + fillAllFieldsWithNonEmptyValues(t, gethHeaderValue, reflect.VisibleFields(gethHeaderType)) + gethHeader := gethHeaderValue.Interface().(*types.Header) + + // If you hit this assertion, it means that the fields `types.Header` of go-ethereum differs now + // versus last time this test was edited. + // + // It's important to understand that in Ethereum Block Header (e.g. `*types.Header`), the `Hash` is + // actually a computed value based on the other fields in the struct, so if you change any field, + // the hash will change also. + // + // On hard-fork, it happens that new fields are added, this test serves as a way to "detect" in codde + // that the expected fields of `types.Header` changed + require.Equal(t, expectedHash, gethHeader.Hash(), + "Geth Header Hash mistmatch, got %q but expecting %q on *types.Header:\n\nGeth Header (from fillNonDefault(new(*types.Header)))\n%s", + gethHeader.Hash().Hex(), + expectedHash, + asIndentedJSON(t, gethHeader), + ) +} + +func Test_FirehoseAndGethHeaderFieldMatches(t *testing.T) { + pbFields := filter(reflect.VisibleFields(pbHeaderType), func(f reflect.StructField) bool { + return !ignorePbFieldNames[f.Name] + }) + + gethFields := reflect.VisibleFields(gethHeaderType) + + pbFieldCount := len(pbFields) + gethFieldCount := len(gethFields) + + pbFieldNames := extractStructFieldNames(pbFields) + gethFieldNames := extractStructFieldNames(gethFields) + + // If you reach this assertion, it means that the fields count in the protobuf and go-ethereum are different. + // It is super important that you properly update the mapping from pbeth.BlockHeader to go-ethereum/core/types.Header + // that is done in `codecHeaderToGethHeader` function in `executor/provider_statedb.go`. + require.Equal( + t, + pbFieldCount, + gethFieldCount, + fieldsCountMistmatchMessage(t, pbFieldNames, gethFieldNames)) + + for pbFieldName := range pbFieldNames { + pbFieldRenamedName, found := pbFieldNameToGethMapping[pbFieldName] + if !found { + pbFieldRenamedName = pbFieldName + } + + assert.Contains(t, gethFieldNames, pbFieldRenamedName, "pbField.Name=%q (original %q) not found in gethFieldNames", pbFieldRenamedName, pbFieldName) + } +} + +func fillAllFieldsWithNonEmptyValues(t *testing.T, structValue reflect.Value, fields []reflect.StructField) { + t.Helper() + + for _, field := range fields { + fieldValue := structValue.Elem().FieldByName(field.Name) + require.True(t, fieldValue.IsValid(), "field %q not found", field.Name) + + switch fieldValue.Interface().(type) { + case []byte: + fieldValue.Set(reflect.ValueOf([]byte{1})) + case uint64: + fieldValue.Set(reflect.ValueOf(uint64(1))) + case *uint64: + var mockValue uint64 = 1 + fieldValue.Set(reflect.ValueOf(&mockValue)) + case *common.Hash: + var mockValue common.Hash = common.HexToHash("0x01") + fieldValue.Set(reflect.ValueOf(&mockValue)) + case common.Hash: + fieldValue.Set(reflect.ValueOf(common.HexToHash("0x01"))) + case common.Address: + fieldValue.Set(reflect.ValueOf(common.HexToAddress("0x01"))) + case types.Bloom: + fieldValue.Set(reflect.ValueOf(types.BytesToBloom([]byte{1}))) + case types.BlockNonce: + fieldValue.Set(reflect.ValueOf(types.EncodeNonce(1))) + case *big.Int: + fieldValue.Set(reflect.ValueOf(big.NewInt(1))) + case *pbeth.BigInt: + fieldValue.Set(reflect.ValueOf(&pbeth.BigInt{Bytes: []byte{1}})) + case *timestamppb.Timestamp: + fieldValue.Set(reflect.ValueOf(×tamppb.Timestamp{Seconds: 1})) + default: + // If you reach this panic in test, simply add a case above with a sane non-default + // value for the type in question. + t.Fatalf("unsupported type %T", fieldValue.Interface()) + } + } +} + +func fieldsCountMistmatchMessage(t *testing.T, pbFieldNames map[string]bool, gethFieldNames map[string]bool) string { + t.Helper() + + pbRemappedFieldNames := make(map[string]bool, len(pbFieldNames)) + for pbFieldName := range pbFieldNames { + pbFieldRenamedName, found := pbFieldNameToGethMapping[pbFieldName] + if !found { + pbFieldRenamedName = pbFieldName + } + + pbRemappedFieldNames[pbFieldRenamedName] = true + } + + return fmt.Sprintf( + "Field count mistmatch between `pbeth.BlockHeader` (has %d fields) and `*types.Header` (has %d fields)\n\n"+ + "Fields in `pbeth.Blockheader`:\n%s\n\n"+ + "Fields in `*types.Header`:\n%s\n\n"+ + "Missing in `pbeth.BlockHeader`:\n%s\n\n"+ + "Missing in `*types.Header`:\n%s", + len(pbRemappedFieldNames), + len(gethFieldNames), + asIndentedJSON(t, maps.Keys(pbRemappedFieldNames)), + asIndentedJSON(t, maps.Keys(gethFieldNames)), + asIndentedJSON(t, missingInSet(gethFieldNames, pbRemappedFieldNames)), + asIndentedJSON(t, missingInSet(pbRemappedFieldNames, gethFieldNames)), + ) +} + +func asIndentedJSON(t *testing.T, v any) string { + t.Helper() + out, err := json.MarshalIndent(v, "", " ") + require.NoError(t, err) + + return string(out) +} + +func missingInSet(a, b map[string]bool) []string { + missing := make([]string, 0) + for name := range a { + if !b[name] { + missing = append(missing, name) + } + } + + return missing +} + +func extractStructFieldNames(fields []reflect.StructField) map[string]bool { + result := make(map[string]bool, len(fields)) + for _, field := range fields { + result[field.Name] = true + } + return result +} + +func filter[S ~[]T, T any](s S, f func(T) bool) (out S) { + out = make(S, 0, len(s)/4) + for i, v := range s { + if f(v) { + out = append(out, s[i]) + } + } + + return out +} + +func TestFirehose_reorderIsolatedTransactionsAndOrdinals(t *testing.T) { + tests := []struct { + name string + populate func(t *Firehose) + expectedBlockFile string + }{ + { + name: "empty", + populate: func(t *Firehose) { + t.OnBlockStart(blockEvent(1)) + + // Simulated GetTxTracer being called + t.blockReorderOrdinalOnce.Do(func() { + t.blockReorderOrdinal = true + t.blockReorderOrdinalSnapshot = t.blockOrdinal.value + }) + + t.blockOrdinal.Reset() + t.onTxStart(txEvent(), hex2Hash("CC"), from, to) + t.OnCallEnter(0, byte(vm.CALL), from, to, nil, 0, nil) + t.OnBalanceChange(empty, b(1), b(2), 0) + t.OnCallExit(0, nil, 0, nil, false) + t.OnTxEnd(txReceiptEvent(2), nil) + + t.blockOrdinal.Reset() + t.onTxStart(txEvent(), hex2Hash("AA"), from, to) + t.OnCallEnter(0, byte(vm.CALL), from, to, nil, 0, nil) + t.OnBalanceChange(empty, b(1), b(2), 0) + t.OnCallExit(0, nil, 0, nil, false) + t.OnTxEnd(txReceiptEvent(0), nil) + + t.blockOrdinal.Reset() + t.onTxStart(txEvent(), hex2Hash("BB"), from, to) + t.OnCallEnter(0, byte(vm.CALL), from, to, nil, 0, nil) + t.OnBalanceChange(empty, b(1), b(2), 0) + t.OnCallExit(0, nil, 0, nil, false) + t.OnTxEnd(txReceiptEvent(1), nil) + }, + expectedBlockFile: "testdata/firehose/reorder-ordinals-empty.golden.json", + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + f := NewFirehose(&FirehoseConfig{ + ApplyBackwardCompatibility: ptr(false), + }) + f.OnBlockchainInit(params.AllEthashProtocolChanges) + + tt.populate(f) + + f.reorderIsolatedTransactionsAndOrdinals() + + goldenUpdate := os.Getenv("GOLDEN_UPDATE") == "true" + goldenPath := tt.expectedBlockFile + + if !goldenUpdate && !fileExits(t, goldenPath) { + t.Fatalf("the golden file %q does not exist, re-run with 'GOLDEN_UPDATE=true go test ./... -run %q' to generate the intial version", goldenPath, t.Name()) + } + + content, err := protojson.MarshalOptions{Indent: " "}.Marshal(f.block) + require.NoError(t, err) + + if goldenUpdate { + require.NoError(t, os.WriteFile(goldenPath, content, os.ModePerm)) + } + + expected, err := os.ReadFile(goldenPath) + require.NoError(t, err) + + expectedBlock := &pbeth.Block{} + protojson.Unmarshal(expected, expectedBlock) + + if !proto.Equal(expectedBlock, f.block) { + assert.Equal(t, expectedBlock, f.block, "Run 'GOLDEN_UPDATE=true go test ./... -run %q' to update golden file", t.Name()) + } + + seenOrdinals := make(map[uint64]int) + + walkChanges(f.block.BalanceChanges, seenOrdinals) + walkChanges(f.block.CodeChanges, seenOrdinals) + walkCalls(f.block.SystemCalls, seenOrdinals) + + for _, trx := range f.block.TransactionTraces { + seenOrdinals[trx.BeginOrdinal] = seenOrdinals[trx.BeginOrdinal] + 1 + seenOrdinals[trx.EndOrdinal] = seenOrdinals[trx.EndOrdinal] + 1 + walkCalls(trx.Calls, seenOrdinals) + } + + // No ordinal should be seen more than once + for ordinal, count := range seenOrdinals { + assert.Equal(t, 1, count, "Ordinal %d seen %d times", ordinal, count) + } + + ordinals := maps.Keys(seenOrdinals) + slices.Sort(ordinals) + + // All ordinals should be in stricly increasing order + prev := -1 + for _, ordinal := range ordinals { + if prev != -1 { + assert.Equal(t, prev+1, int(ordinal), "Ordinal %d is not in sequence", ordinal) + } + } + }) + } +} + +func walkCalls(calls []*pbeth.Call, ordinals map[uint64]int) { + for _, call := range calls { + walkCall(call, ordinals) + } +} + +func walkCall(call *pbeth.Call, ordinals map[uint64]int) { + ordinals[call.BeginOrdinal] = ordinals[call.BeginOrdinal] + 1 + ordinals[call.EndOrdinal] = ordinals[call.EndOrdinal] + 1 + + walkChanges(call.BalanceChanges, ordinals) + walkChanges(call.CodeChanges, ordinals) + walkChanges(call.Logs, ordinals) + walkChanges(call.StorageChanges, ordinals) + walkChanges(call.NonceChanges, ordinals) + walkChanges(call.GasChanges, ordinals) +} + +func walkChanges[T any](changes []T, ordinals map[uint64]int) { + for _, change := range changes { + var x any = change + if v, ok := x.(interface{ GetOrdinal() uint64 }); ok { + ordinals[v.GetOrdinal()] = ordinals[v.GetOrdinal()] + 1 + } + } +} + +var b = big.NewInt +var empty, from, to = common.HexToAddress("00"), common.HexToAddress("01"), common.HexToAddress("02") +var emptyHash = common.Hash{} +var hex2Hash = common.HexToHash + +func fileExits(t *testing.T, path string) bool { + t.Helper() + stat, err := os.Stat(path) + return err == nil && !stat.IsDir() +} + +func txEvent() *types.Transaction { + return types.NewTx(&types.LegacyTx{ + Nonce: 0, + GasPrice: big.NewInt(1), + Gas: 1, + To: &to, + Value: big.NewInt(1), + Data: nil, + V: big.NewInt(1), + R: big.NewInt(1), + S: big.NewInt(1), + }) +} + +func txReceiptEvent(txIndex uint) *types.Receipt { + return &types.Receipt{ + Status: 1, + TransactionIndex: txIndex, + } +} + +func blockEvent(height uint64) tracing.BlockEvent { + return tracing.BlockEvent{ + Block: types.NewBlock(&types.Header{ + Number: big.NewInt(int64(height)), + }, nil, nil, nil, nil), + TD: b(1), + } +} diff --git a/x/evm/tracers/registry.go b/x/evm/tracers/registry.go new file mode 100644 index 000000000..71731343d --- /dev/null +++ b/x/evm/tracers/registry.go @@ -0,0 +1,31 @@ +package tracers + +var GlobalLiveTracerRegistry = NewLiveTracerRegistry() + +type LiveTracerRegistry interface { + GetFactoryByID(id string) (BlockchainTracerFactory, bool) + Register(id string, factory BlockchainTracerFactory) +} + +var _ LiveTracerRegistry = (*liveTracerRegistry)(nil) + +func NewLiveTracerRegistry() LiveTracerRegistry { + return &liveTracerRegistry{ + tracers: make(map[string]BlockchainTracerFactory), + } +} + +type liveTracerRegistry struct { + tracers map[string]BlockchainTracerFactory +} + +// Register implements LiveTracerRegistry. +func (r *liveTracerRegistry) Register(id string, factory BlockchainTracerFactory) { + r.tracers[id] = factory +} + +// GetFactoryByID implements LiveTracerRegistry. +func (r *liveTracerRegistry) GetFactoryByID(id string) (BlockchainTracerFactory, bool) { + v, found := r.tracers[id] + return v, found +} diff --git a/x/evm/tracers/testdata/firehose/reorder-ordinals-empty.golden.json b/x/evm/tracers/testdata/firehose/reorder-ordinals-empty.golden.json new file mode 100755 index 000000000..b2ac4a9e5 --- /dev/null +++ b/x/evm/tracers/testdata/firehose/reorder-ordinals-empty.golden.json @@ -0,0 +1,122 @@ +{ + "hash": "sr0uqeYWyrLV1vijvIG6fe+0mu8LRG6FLMHv5UmUxK8=", + "number": "1", + "size": "501", + "header": { + "parentHash": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=", + "uncleHash": "HcxN6N7HXXqrhbVntszUGtMSRRuUinQT8KFC/UDUk0c=", + "coinbase": "AAAAAAAAAAAAAAAAAAAAAAAAAAA=", + "stateRoot": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=", + "transactionsRoot": "VugfFxvMVab/g0XmksD4bltI4BuZbK3AAWIvteNjtCE=", + "receiptRoot": "VugfFxvMVab/g0XmksD4bltI4BuZbK3AAWIvteNjtCE=", + "logsBloom": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==", + "difficulty": { + "bytes": "AA==" + }, + "totalDifficulty": { + "bytes": "AQ==" + }, + "number": "1", + "timestamp": "1970-01-01T00:00:00Z", + "mixHash": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=", + "hash": "sr0uqeYWyrLV1vijvIG6fe+0mu8LRG6FLMHv5UmUxK8=" + }, + "transactionTraces": [ + { + "to": "AAAAAAAAAAAAAAAAAAAAAAAAAAI=", + "gasPrice": { + "bytes": "AQ==" + }, + "gasLimit": "1", + "value": { + "bytes": "AQ==" + }, + "v": "AQ==", + "r": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE=", + "s": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE=", + "hash": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKo=", + "from": "AAAAAAAAAAAAAAAAAAAAAAAAAAE=", + "beginOrdinal": "1", + "endOrdinal": "4", + "status": "SUCCEEDED", + "receipt": { + "logsBloom": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==" + }, + "calls": [ + { + "index": 1, + "callType": "CALL", + "caller": "AAAAAAAAAAAAAAAAAAAAAAAAAAE=", + "address": "AAAAAAAAAAAAAAAAAAAAAAAAAAI=", + "beginOrdinal": "2", + "endOrdinal": "3" + } + ] + }, + { + "to": "AAAAAAAAAAAAAAAAAAAAAAAAAAI=", + "gasPrice": { + "bytes": "AQ==" + }, + "gasLimit": "1", + "value": { + "bytes": "AQ==" + }, + "v": "AQ==", + "r": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE=", + "s": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE=", + "index": 1, + "hash": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALs=", + "from": "AAAAAAAAAAAAAAAAAAAAAAAAAAE=", + "beginOrdinal": "5", + "endOrdinal": "8", + "status": "SUCCEEDED", + "receipt": { + "logsBloom": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==" + }, + "calls": [ + { + "index": 1, + "callType": "CALL", + "caller": "AAAAAAAAAAAAAAAAAAAAAAAAAAE=", + "address": "AAAAAAAAAAAAAAAAAAAAAAAAAAI=", + "beginOrdinal": "6", + "endOrdinal": "7" + } + ] + }, + { + "to": "AAAAAAAAAAAAAAAAAAAAAAAAAAI=", + "gasPrice": { + "bytes": "AQ==" + }, + "gasLimit": "1", + "value": { + "bytes": "AQ==" + }, + "v": "AQ==", + "r": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE=", + "s": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE=", + "index": 2, + "hash": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMw=", + "from": "AAAAAAAAAAAAAAAAAAAAAAAAAAE=", + "beginOrdinal": "9", + "endOrdinal": "12", + "status": "SUCCEEDED", + "receipt": { + "logsBloom": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==" + }, + "calls": [ + { + "index": 1, + "callType": "CALL", + "caller": "AAAAAAAAAAAAAAAAAAAAAAAAAAE=", + "address": "AAAAAAAAAAAAAAAAAAAAAAAAAAI=", + "beginOrdinal": "10", + "endOrdinal": "11" + } + ] + } + ], + "ver": 4 +} \ No newline at end of file diff --git a/x/evm/tracers/tracing.go b/x/evm/tracers/tracing.go new file mode 100644 index 000000000..6bfb7be97 --- /dev/null +++ b/x/evm/tracers/tracing.go @@ -0,0 +1,112 @@ +package tracers + +import ( + "context" + "fmt" + "net/url" + + sdk "github.com/cosmos/cosmos-sdk/types" + ethtracing "github.com/ethereum/go-ethereum/core/tracing" + "github.com/ethereum/go-ethereum/params" + "github.com/sei-protocol/sei-chain/x/evm/tracing" +) + +// BlockchainTracerFactory is a function that creates a new [BlockchainTracer]. +// It's going to received the parsed URL from the `live-evm-tracer` flag. +// +// The scheme of the URL is going to be used to determine which tracer to use +// by the registry. +type BlockchainTracerFactory = func(tracerURL *url.URL) (*tracing.Hooks, error) + +// NewBlockchainTracer creates a new [tracing.Hooks] struct that is used to trace blocks and transactions +// for EVM needs. The tracer is instansiated by the provided URL and registered in the registry. +func NewBlockchainTracer(registry LiveTracerRegistry, tracerIdentifier string, chainConfig *params.ChainConfig) (*tracing.Hooks, error) { + tracerURL, err := url.Parse(tracerIdentifier) + if err != nil { + return nil, fmt.Errorf("tracer value %q should have been a valid URL: %w", tracerIdentifier, err) + } + + // We accept plain string like "firehose" and URL like "firehose://...". The former form parses as + // an URL correct with `scheme="", host="", path="firehose", so the logic below does that. Take + // the scheme is defined otherwise. + tracerID := tracerURL.Scheme + if tracerID == "" && tracerURL.Host == "" && tracerURL.EscapedPath() != "" { + tracerID = tracerURL.EscapedPath() + } + + if tracerID == "" { + return nil, fmt.Errorf("unable to extract tracer ID from %q", tracerID) + } + + factory, found := registry.GetFactoryByID(tracerID) + if !found { + return nil, fmt.Errorf("tracer %q is not registered", tracerID) + } + + tracer, err := factory(tracerURL) + if err != nil { + return nil, fmt.Errorf("failed to create tracer: %w", err) + } + + tracer.OnSeiBlockchainInit(chainConfig) + + return tracer, nil +} + +type CtxBlockchainTracerKeyType string + +const CtxBlockchainTracerKey = CtxBlockchainTracerKeyType("evm_and_state_logger") + +func SetCtxBlockchainTracer(ctx sdk.Context, logger *tracing.Hooks) sdk.Context { + return ctx.WithContext(context.WithValue(ctx.Context(), CtxBlockchainTracerKey, logger)) +} + +// GetCtxBlockchainTracer function to get the SEI specific [tracing.Hooks] struct +// used to trace EVM blocks and transactions. +func GetCtxBlockchainTracer(ctx sdk.Context) *tracing.Hooks { + rawVal := ctx.Context().Value(CtxBlockchainTracerKey) + if rawVal == nil { + return nil + } + logger, ok := rawVal.(*tracing.Hooks) + if !ok { + return nil + } + return logger +} + +// GetCtxEthTracingHooks is a convenience function to get the ethtracing.Hooks from the context +// avoiding nil pointer exceptions when trying to send the tracer to lower-level go-ethereum components +// that deals with *tracing.Hooks directly. +func GetCtxEthTracingHooks(ctx sdk.Context) *ethtracing.Hooks { + if logger := GetCtxBlockchainTracer(ctx); logger != nil { + return logger.Hooks + } + + return nil +} + +var _ sdk.TxTracer = (*TxTracerHooks)(nil) + +type TxTracerHooks struct { + Hooks *tracing.Hooks + + OnTxReset func() + OnTxCommit func() +} + +func (h TxTracerHooks) InjectInContext(ctx sdk.Context) sdk.Context { + return SetCtxBlockchainTracer(ctx, h.Hooks) +} + +func (h TxTracerHooks) Reset() { + if h.OnTxReset != nil { + h.OnTxReset() + } +} + +func (h TxTracerHooks) Commit() { + if h.OnTxCommit != nil { + h.OnTxCommit() + } +} diff --git a/x/evm/tracing/hooks.go b/x/evm/tracing/hooks.go new file mode 100644 index 000000000..351fd1dd2 --- /dev/null +++ b/x/evm/tracing/hooks.go @@ -0,0 +1,77 @@ +package tracing + +import ( + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/tracing" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/params" +) + +// BlockEvent is emitted upon tracing an incoming block. +// It contains the block as well as consensus related information. +type BlockEvent struct { + Hash common.Hash + Header *types.Header + Size uint64 +} + +type ( + // OnSeiBlockchainInitHook is called when the blockchain is initialized + // once per process and receives the chain configuration. + OnSeiBlockchainInitHook = func(chainConfig *params.ChainConfig) + // OnSeiBlockStart is called before executing `block`. + // `td` is the total difficulty prior to `block`. + // `skip` indicates processing of this previously known block + // will be skipped. OnBlockStart and OnBlockEnd will be emitted to + // convey how chain is progressing. E.g. known blocks will be skipped + // when node is started after a crash. + OnSeiBlockStartHook = func(hash []byte, size uint64, b *types.Header) + // OnSeiBlockEnd is called after executing `block` and receives the error + // that occurred during processing. If an `err` is received in the callback, + // it means the block should be discarded (optimistic execution failed for example). + OnSeiBlockEnd = func(err error) + + // OnSeiSystemCallStart is called before executing a system call in Sei context. CoWasm + // contract execution that invokes the EVM from one ore another are examples of system calls. + // + // You can use this hook to route upcoming `OnEnter/OnExit` EVM tracing hook to be appended + // to a system call bucket for the purpose of tracing the system calls. + OnSeiSystemCallStart = func(err error) + + // OnSeiSystemCallStart is called after executing a system call in Sei context. CoWasm + // contract execution that invokes the EVM from one ore another are examples of system calls. + // + // You can use this hook to terminate special handling of `OnEnter/OnExit`. + OnSeiSystemCallEnd = func(err error) +) + +// Hooks is used to collect traces during chain processing. It's a similar +// interface as the go-ethereum's [tracing.Hooks] but adapted to Sei particularities. +// +// The method all starts with OnSei... to avoid confusion with the go-ethereum's [tracing.Hooks] +// interface and allow one to implement both interfaces in the same struct. +type Hooks struct { + *tracing.Hooks + + OnSeiBlockchainInit OnSeiBlockchainInitHook + OnSeiBlockStart OnSeiBlockStartHook + OnSeiBlockEnd OnSeiBlockEnd + + OnSeiSystemCallStart func() + OnSeiSystemCallEnd func() + + GetTxTracer func(txIndex int) sdk.TxTracer +} + +var _ sdk.TxTracer = (*Hooks)(nil) + +func (h *Hooks) InjectInContext(ctx sdk.Context) sdk.Context { + return ctx +} + +func (h *Hooks) Reset() { +} + +func (h *Hooks) Commit() { +} From 3fc8d42f98ed920fdfe3250b0194358a365a0724 Mon Sep 17 00:00:00 2001 From: codchen Date: Sat, 4 May 2024 11:11:07 +0800 Subject: [PATCH 03/51] Avoid using iterator when getting spendable coins (#1626) --- x/evm/state/balance.go | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/x/evm/state/balance.go b/x/evm/state/balance.go index 7c4872952..d36eb8f23 100644 --- a/x/evm/state/balance.go +++ b/x/evm/state/balance.go @@ -92,8 +92,12 @@ func (s *DBImpl) AddBalance(evmAddr common.Address, amt *big.Int, reason tracing func (s *DBImpl) GetBalance(evmAddr common.Address) *big.Int { s.k.PrepareReplayedAddr(s.ctx, evmAddr) - usei := s.k.BankKeeper().SpendableCoins(s.ctx, s.getSeiAddress(evmAddr)).AmountOf(s.k.GetBaseDenom(s.ctx)) - wei := s.k.BankKeeper().GetWeiBalance(s.ctx, s.getSeiAddress(evmAddr)) + seiAddr := s.getSeiAddress(evmAddr) + denom := s.k.GetBaseDenom(s.ctx) + allUsei := s.k.BankKeeper().GetBalance(s.ctx, seiAddr, denom).Amount + lockedUsei := s.k.BankKeeper().LockedCoins(s.ctx, seiAddr).AmountOf(denom) // LockedCoins doesn't use iterators + usei := allUsei.Sub(lockedUsei) + wei := s.k.BankKeeper().GetWeiBalance(s.ctx, seiAddr) return usei.Mul(SdkUseiToSweiMultiplier).Add(wei).BigInt() } From aee2743534d63eba2db72346cb941b1d63158344 Mon Sep 17 00:00:00 2001 From: codchen Date: Sat, 4 May 2024 11:28:52 +0800 Subject: [PATCH 04/51] Use buffered listener for NewHeads subscription (#1625) --- .golangci.yml | 1 - evmrpc/subscribe.go | 42 +++++++++++++++++++++++++++++------------- 2 files changed, 29 insertions(+), 14 deletions(-) diff --git a/.golangci.yml b/.golangci.yml index 6490cac8c..511f556fc 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -9,7 +9,6 @@ linters: disable-all: true enable: - bodyclose - - deadcode # - depguard ## see https://github.com/golangci/golangci-lint/issues/3906 - dogsled - exportloopref diff --git a/evmrpc/subscribe.go b/evmrpc/subscribe.go index b2abb4303..f7b2bbe0b 100644 --- a/evmrpc/subscribe.go +++ b/evmrpc/subscribe.go @@ -20,6 +20,7 @@ import ( ) const SleepInterval = 5 * time.Second +const NewHeadsListenerBuffer = 10 type SubscriptionAPI struct { tmClient rpcclient.Client @@ -64,17 +65,14 @@ func NewSubscriptionAPI(tmClient rpcclient.Client, logFetcher *LogFetcher, subsc continue } api.newHeadListenersMtx.Lock() - for _, c := range api.newHeadListeners { - c := c - go func() { - defer func() { - // if the channel is already closed, sending to it will panic - if err := recover(); err != nil { - return - } - }() - c <- ethHeader - }() + toDelete := []rpc.ID{} + for id, c := range api.newHeadListeners { + if !handleListener(c, ethHeader) { + toDelete = append(toDelete, id) + } + } + for _, id := range toDelete { + delete(api.newHeadListeners, id) } api.newHeadListenersMtx.Unlock() } @@ -82,6 +80,20 @@ func NewSubscriptionAPI(tmClient rpcclient.Client, logFetcher *LogFetcher, subsc return api } +func handleListener(c chan map[string]interface{}, ethHeader map[string]interface{}) bool { + // if the channel is already closed, sending to it/closing it will panic + defer func() { _ = recover() }() + select { + case c <- ethHeader: + return true + default: + // this path is hit when the buffer is full, meaning that the subscriber is not consuming + // fast enough + close(c) + return false + } +} + func (a *SubscriptionAPI) NewHeads(ctx context.Context) (s *rpc.Subscription, err error) { defer recordMetrics("eth_newHeads", a.connectionType, time.Now(), err == nil) notifier, supported := rpc.NotifierFromContext(ctx) @@ -90,7 +102,7 @@ func (a *SubscriptionAPI) NewHeads(ctx context.Context) (s *rpc.Subscription, er } rpcSub := notifier.CreateSubscription() - listener := make(chan map[string]interface{}) + listener := make(chan map[string]interface{}, NewHeadsListenerBuffer) a.newHeadListenersMtx.Lock() defer a.newHeadListenersMtx.Unlock() if uint64(len(a.newHeadListeners)) >= a.subscriptonConfig.newHeadLimit { @@ -102,11 +114,14 @@ func (a *SubscriptionAPI) NewHeads(ctx context.Context) (s *rpc.Subscription, er OUTER: for { select { - case res := <-listener: + case res, ok := <-listener: err = notifier.Notify(rpcSub.ID, res) if err != nil { break OUTER } + if !ok { + break OUTER + } case <-rpcSub.Err(): break OUTER case <-notifier.Closed(): @@ -116,6 +131,7 @@ func (a *SubscriptionAPI) NewHeads(ctx context.Context) (s *rpc.Subscription, er a.newHeadListenersMtx.Lock() defer a.newHeadListenersMtx.Unlock() delete(a.newHeadListeners, rpcSub.ID) + defer func() { _ = recover() }() // might have already been closed close(listener) }() From 49ab63a3d5537e4e1e3bb0d6cb7280a4a610b9a9 Mon Sep 17 00:00:00 2001 From: codchen Date: Mon, 6 May 2024 20:14:06 +0800 Subject: [PATCH 05/51] Make PlaceOrder tx not gasless (#1592) --- app/antedecorators/gasless.go | 2 +- app/antedecorators/gasless_test.go | 59 ------------------- .../dex_module/cancel_order_test.yaml | 4 +- .../dex_module/place_order_test.yaml | 9 +-- 4 files changed, 5 insertions(+), 69 deletions(-) diff --git a/app/antedecorators/gasless.go b/app/antedecorators/gasless.go index 72fe941da..628b1194f 100644 --- a/app/antedecorators/gasless.go +++ b/app/antedecorators/gasless.go @@ -137,7 +137,7 @@ func IsTxGasless(tx sdk.Tx, ctx sdk.Context, oracleKeeper oraclekeeper.Keeper) ( } func dexPlaceOrdersIsGasless(_ *dextypes.MsgPlaceOrders) bool { - return true + return false } // WhitelistedGaslessCancellationAddrs TODO: migrate this into params state diff --git a/app/antedecorators/gasless_test.go b/app/antedecorators/gasless_test.go index 5e77d907b..9f50f7242 100644 --- a/app/antedecorators/gasless_test.go +++ b/app/antedecorators/gasless_test.go @@ -4,7 +4,6 @@ import ( "fmt" "testing" - "github.com/cosmos/cosmos-sdk/store" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/accesscontrol" "github.com/cosmos/cosmos-sdk/x/staking" @@ -14,9 +13,7 @@ import ( oracletypes "github.com/sei-protocol/sei-chain/x/oracle/types" "github.com/stretchr/testify/require" "github.com/tendermint/tendermint/crypto/secp256k1" - "github.com/tendermint/tendermint/libs/log" tmproto "github.com/tendermint/tendermint/proto/tendermint/types" - tmdb "github.com/tendermint/tm-db" ) var output = "" @@ -112,53 +109,6 @@ func CallGaslessDecoratorWithMsg(ctx sdk.Context, msg sdk.Msg, oracleKeeper orac return err } -func TestGaslessDecorator(t *testing.T) { - output = "" - anteDecorators := []sdk.AnteFullDecorator{ - FakeAnteDecoratorOne{}, - antedecorators.NewGaslessDecorator([]sdk.AnteFullDecorator{FakeAnteDecoratorTwo{}}, oraclekeeper.Keeper{}), - FakeAnteDecoratorThree{}, - } - chainedHandler, depGen := sdk.ChainAnteDecorators(anteDecorators...) - - db := tmdb.NewMemDB() - stateStore := store.NewCommitMultiStore(db) - ctx := sdk.NewContext(stateStore, tmproto.Header{}, false, log.NewNopLogger()) - - // normal tx (not gasless) - _, err := chainedHandler(ctx, FakeTx{}, false) - require.NoError(t, err) - require.Equal(t, "onetwothree", output) - _, err = depGen([]accesscontrol.AccessOperation{}, FakeTx{}, 1) - require.NoError(t, err) - require.Equal(t, "onetwothree", outputDeps) - - // gasless tx (deliverTx) -> wrapped should still be run - output = "" - outputDeps = "" - _, err = chainedHandler(ctx, FakeTx{ - FakeMsgs: []sdk.Msg{&types.MsgPlaceOrders{}}, - Gas: 100, - }, false) - require.NoError(t, err) - require.Equal(t, "onetwothree", output) - _, err = depGen([]accesscontrol.AccessOperation{}, FakeTx{}, 1) - require.NoError(t, err) - require.Equal(t, "onetwothree", outputDeps) - - // gasless tx (checkTx) -> wrapped should not be run - output = "" - outputDeps = "" - _, err = chainedHandler(ctx.WithIsCheckTx(true), FakeTx{ - FakeMsgs: []sdk.Msg{&types.MsgPlaceOrders{}}, - }, false) - require.NoError(t, err) - require.Equal(t, "onethree", output) - _, err = depGen([]accesscontrol.AccessOperation{}, FakeTx{}, 1) - require.NoError(t, err) - require.Equal(t, "onetwothree", outputDeps) -} - func TestOracleVoteGasless(t *testing.T) { input := oraclekeeper.CreateTestInput(t) @@ -200,15 +150,6 @@ func TestOracleVoteGasless(t *testing.T) { require.True(t, gasless) } -func TestDexPlaceOrderGasless(t *testing.T) { - // this needs to be updated if its changed from constant true - // reset gasless - gasless = true - err := CallGaslessDecoratorWithMsg(sdk.NewContext(nil, tmproto.Header{}, false, nil).WithIsCheckTx(true), &types.MsgPlaceOrders{}, oraclekeeper.Keeper{}) - require.NoError(t, err) - require.True(t, gasless) -} - func TestDexCancelOrderGasless(t *testing.T) { addr1 := sdk.AccAddress(secp256k1.GenPrivKey().PubKey().Address()) addr2 := sdk.AccAddress(secp256k1.GenPrivKey().PubKey().Address()) diff --git a/integration_test/dex_module/cancel_order_test.yaml b/integration_test/dex_module/cancel_order_test.yaml index 5086da32d..31496bd87 100644 --- a/integration_test/dex_module/cancel_order_test.yaml +++ b/integration_test/dex_module/cancel_order_test.yaml @@ -7,7 +7,7 @@ - cmd: echo "LONG?1.01?5?SEI?ATOM?LIMIT?{\"leverage\":\"1\",\"position_effect\":\"Open\"}" env: PARAMS # Place an order and set ORDER_ID - - cmd: printf "12345678\n" | seid tx dex place-orders $CONTRACT_ADDR $PARAMS --amount=1000000000usei -y --from=admin --chain-id=sei --fees=1000000usei --gas=5000000 --broadcast-mode=block --output json|jq -M -r ".logs[].events[].attributes[] | select(.key == \"order_id\").value" + - cmd: printf "12345678\n" | seid tx dex place-orders $CONTRACT_ADDR $PARAMS --amount=1000000000usei -y --from=admin --chain-id=sei --fees=1000000usei --gas=500000 --broadcast-mode=block --output json|jq -M -r ".logs[].events[].attributes[] | select(.key == \"order_id\").value" env: ORDER_ID # Prepare parameter to cancel the placed order - cmd: echo $ORDER_ID"?LONG?1.01?SEI?ATOM" @@ -22,4 +22,4 @@ env: NUMORDER verifiers: - type: eval - expr: NUMORDER == 5 # placed from the place_order test + expr: NUMORDER == 4 # placed from the place_order test diff --git a/integration_test/dex_module/place_order_test.yaml b/integration_test/dex_module/place_order_test.yaml index 62fa13ac1..168d4080c 100644 --- a/integration_test/dex_module/place_order_test.yaml +++ b/integration_test/dex_module/place_order_test.yaml @@ -6,19 +6,14 @@ # Prepare parameter - cmd: echo "LONG?1.01?5?SEI?ATOM?LIMIT?{\"leverage\":\"1\",\"position_effect\":\"Open\"}" env: PARAMS - # Verify that placing a dex order with gas > max block gas is okay since gas will be ignored - - cmd: printf "12345678\n" | seid tx dex place-orders $CONTRACT_ADDR $PARAMS --amount=1000000000usei -y --from=admin --chain-id=sei --fees=1000000usei --gas=500000000 --broadcast-mode=block --output json|jq -M -r ".logs[].events[].attributes[] | select(.key == \"order_id\").value" - env: MAX_GAS_ORDER_ID # Place an order and set ORDER_ID - - cmd: printf "12345678\n" | seid tx dex place-orders $CONTRACT_ADDR $PARAMS --amount=1000000000usei -y --from=admin --chain-id=sei --fees=1000000usei --gas=5000000 --broadcast-mode=block --output json|jq -M -r ".logs[].events[].attributes[] | select(.key == \"order_id\").value" + - cmd: printf "12345678\n" | seid tx dex place-orders $CONTRACT_ADDR $PARAMS --amount=1000000000usei -y --from=admin --chain-id=sei --fees=1000000usei --gas=500000 --broadcast-mode=block --output json|jq -M -r ".logs[].events[].attributes[] | select(.key == \"order_id\").value" env: ORDER_ID # Query the order by id - cmd: seid q dex get-orders-by-id $CONTRACT_ADDR SEI ATOM $ORDER_ID --output json |jq .order.status env: RESULT verifiers: # Order ids should be greater or equal to 0 - - type: eval - expr: MAX_GAS_ORDER_ID >= 0 - type: eval expr: ORDER_ID >= 0 # Order status should be something like PLACED @@ -40,7 +35,7 @@ - cmd: echo "LONG?1.0?10?usei?uatom?LIMIT? LONG?3.0?3000?usei?uatomatomatom?LIMIT? LONG?3.0?1000?usei?uatomatom?LIMIT?" env: PARAMS # Place 3 orders - - cmd: printf "12345678\n" | seid tx dex place-orders $CONTRACT_ADDR $PARAMS --amount=1000000000usei -y --from=admin --chain-id=sei --fees=1000000usei --gas=5000000 --broadcast-mode=block --output json| jq .code + - cmd: printf "12345678\n" | seid tx dex place-orders $CONTRACT_ADDR $PARAMS --amount=1000000000usei -y --from=admin --chain-id=sei --fees=1000000usei --gas=500000 --broadcast-mode=block --output json| jq .code # Query all the orders - cmd: seid q dex get-orders $CONTRACT_ADDR $ADMIN_ADDR --output json |jq ".[] | length" From bbac7c24deaeb8b99e9270c94d64ed8bab32bb8a Mon Sep 17 00:00:00 2001 From: codchen Date: Mon, 6 May 2024 22:24:13 +0800 Subject: [PATCH 06/51] Pass EVM VM error to sdk.Result (#1627) --- evmrpc/simulate_test.go | 4 +- example/contracts/README | 6 +- .../contracts/simplestorage/SimpleStorage.abi | 2 +- .../contracts/simplestorage/SimpleStorage.bin | 2 +- .../contracts/simplestorage/SimpleStorage.go | 31 ++++++- .../contracts/simplestorage/SimpleStorage.sol | 4 + go.mod | 4 +- go.sum | 8 +- x/evm/keeper/msg_server_test.go | 82 +++++++++++++++++++ x/evm/types/message_evm_transaction.go | 10 +++ 10 files changed, 139 insertions(+), 14 deletions(-) diff --git a/evmrpc/simulate_test.go b/evmrpc/simulate_test.go index 28b5a06f0..b626ba637 100644 --- a/evmrpc/simulate_test.go +++ b/evmrpc/simulate_test.go @@ -62,7 +62,7 @@ func TestEstimateGas(t *testing.T) { } resObj = sendRequestGood(t, "estimateGas", txArgs, nil, map[string]interface{}{}) result = resObj["result"].(string) - require.Equal(t, "0x53f3", result) // 21491 + require.Equal(t, "0x53f9", result) // 21497 Ctx = Ctx.WithBlockHeight(8) } @@ -127,7 +127,7 @@ func TestCall(t *testing.T) { } resObj := sendRequestGood(t, "call", txArgs, nil, map[string]interface{}{}, map[string]interface{}{}) result := resObj["result"].(string) - require.Equal(t, "0x608060405234801561000f575f80fd5b5060043610610034575f3560e01c806360fe47b1146100385780636d4ce63c14610054575b5f80fd5b610052600480360381019061004d91906100f1565b610072565b005b61005c6100b2565b604051610069919061012b565b60405180910390f35b805f819055507f0de2d86113046b9e8bb6b785e96a6228f6803952bf53a40b68a36dce316218c1816040516100a7919061012b565b60405180910390a150565b5f8054905090565b5f80fd5b5f819050919050565b6100d0816100be565b81146100da575f80fd5b50565b5f813590506100eb816100c7565b92915050565b5f60208284031215610106576101056100ba565b5b5f610113848285016100dd565b91505092915050565b610125816100be565b82525050565b5f60208201905061013e5f83018461011c565b9291505056fea26469706673582212205b2eaa3bd967fbbfe4490610612964348d1d0b2a793d2b0d117fe05ccb02d1e364736f6c63430008150033", result) // 21325 + require.Equal(t, "0x608060405234801561000f575f80fd5b506004361061003f575f3560e01c806360fe47b1146100435780636d4ce63c1461005f5780639c3674fc1461007d575b5f80fd5b61005d6004803603810190610058919061010a565b610087565b005b6100676100c7565b6040516100749190610144565b60405180910390f35b6100856100cf565b005b805f819055507f0de2d86113046b9e8bb6b785e96a6228f6803952bf53a40b68a36dce316218c1816040516100bc9190610144565b60405180910390a150565b5f8054905090565b5f80fd5b5f80fd5b5f819050919050565b6100e9816100d7565b81146100f3575f80fd5b50565b5f81359050610104816100e0565b92915050565b5f6020828403121561011f5761011e6100d3565b5b5f61012c848285016100f6565b91505092915050565b61013e816100d7565b82525050565b5f6020820190506101575f830184610135565b9291505056fea2646970667358221220bb55137839ea2afda11ab2d30ad07fee30bb9438caaa46e30ccd1053ed72439064736f6c63430008150033", result) Ctx = Ctx.WithBlockHeight(8) } diff --git a/example/contracts/README b/example/contracts/README index 520262542..9c9a0e1d1 100644 --- a/example/contracts/README +++ b/example/contracts/README @@ -10,9 +10,9 @@ make make devtools # Compile sol -solc --bin -o example/contracts/sendall example/contracts/sendall/SendAll.sol +solc --bin -o example/contracts/simplestorage example/contracts/simplestorage/SimpleStorage.sol solc @openzeppelin=contracts/lib/openzeppelin-contracts --bin -o x/evm/artifacts contracts/src/CW721ERC721Wrapper.sol # Generate ABI in Go -solc --abi -o example/contracts/sendall example/contracts/sendall/SendAll.sol -abigen --abi=example/contracts/sendall/SendAll.abi --pkg=sendall --out=example/contracts/sendall/SendAll.go +solc --abi -o example/contracts/simplestorage example/contracts/simplestorage/SimpleStorage.sol +abigen --abi=example/contracts/simplestorage/SimpleStorage.abi --pkg=simplestorage --out=example/contracts/simplestorage/SimpleStorage.go diff --git a/example/contracts/simplestorage/SimpleStorage.abi b/example/contracts/simplestorage/SimpleStorage.abi index 3c5944797..97e20adb5 100644 --- a/example/contracts/simplestorage/SimpleStorage.abi +++ b/example/contracts/simplestorage/SimpleStorage.abi @@ -1 +1 @@ -[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"SetEvent","type":"event"},{"inputs":[],"name":"get","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"set","outputs":[],"stateMutability":"nonpayable","type":"function"}] \ No newline at end of file +[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"SetEvent","type":"event"},{"inputs":[],"name":"bad","outputs":[],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"get","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"set","outputs":[],"stateMutability":"nonpayable","type":"function"}] \ No newline at end of file diff --git a/example/contracts/simplestorage/SimpleStorage.bin b/example/contracts/simplestorage/SimpleStorage.bin index bb903ae71..08af40cf6 100644 --- a/example/contracts/simplestorage/SimpleStorage.bin +++ b/example/contracts/simplestorage/SimpleStorage.bin @@ -1 +1 @@ -608060405234801561000f575f80fd5b5061017a8061001d5f395ff3fe608060405234801561000f575f80fd5b5060043610610034575f3560e01c806360fe47b1146100385780636d4ce63c14610054575b5f80fd5b610052600480360381019061004d91906100f1565b610072565b005b61005c6100b2565b604051610069919061012b565b60405180910390f35b805f819055507f0de2d86113046b9e8bb6b785e96a6228f6803952bf53a40b68a36dce316218c1816040516100a7919061012b565b60405180910390a150565b5f8054905090565b5f80fd5b5f819050919050565b6100d0816100be565b81146100da575f80fd5b50565b5f813590506100eb816100c7565b92915050565b5f60208284031215610106576101056100ba565b5b5f610113848285016100dd565b91505092915050565b610125816100be565b82525050565b5f60208201905061013e5f83018461011c565b9291505056fea26469706673582212205b2eaa3bd967fbbfe4490610612964348d1d0b2a793d2b0d117fe05ccb02d1e364736f6c63430008150033 \ No newline at end of file +608060405234801561000f575f80fd5b506101938061001d5f395ff3fe608060405234801561000f575f80fd5b506004361061003f575f3560e01c806360fe47b1146100435780636d4ce63c1461005f5780639c3674fc1461007d575b5f80fd5b61005d6004803603810190610058919061010a565b610087565b005b6100676100c7565b6040516100749190610144565b60405180910390f35b6100856100cf565b005b805f819055507f0de2d86113046b9e8bb6b785e96a6228f6803952bf53a40b68a36dce316218c1816040516100bc9190610144565b60405180910390a150565b5f8054905090565b5f80fd5b5f80fd5b5f819050919050565b6100e9816100d7565b81146100f3575f80fd5b50565b5f81359050610104816100e0565b92915050565b5f6020828403121561011f5761011e6100d3565b5b5f61012c848285016100f6565b91505092915050565b61013e816100d7565b82525050565b5f6020820190506101575f830184610135565b9291505056fea2646970667358221220bb55137839ea2afda11ab2d30ad07fee30bb9438caaa46e30ccd1053ed72439064736f6c63430008150033 \ No newline at end of file diff --git a/example/contracts/simplestorage/SimpleStorage.go b/example/contracts/simplestorage/SimpleStorage.go index c3d451e29..deabc03c1 100644 --- a/example/contracts/simplestorage/SimpleStorage.go +++ b/example/contracts/simplestorage/SimpleStorage.go @@ -31,7 +31,7 @@ var ( // SimplestorageMetaData contains all meta data concerning the Simplestorage contract. var SimplestorageMetaData = &bind.MetaData{ - ABI: "[{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"SetEvent\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"get\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"set\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", + ABI: "[{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"SetEvent\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"bad\",\"outputs\":[],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"get\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"set\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", } // SimplestorageABI is the input ABI used to generate the binding from. @@ -180,6 +180,35 @@ func (_Simplestorage *SimplestorageTransactorRaw) Transact(opts *bind.TransactOp return _Simplestorage.Contract.contract.Transact(opts, method, params...) } +// Bad is a free data retrieval call binding the contract method 0x9c3674fc. +// +// Solidity: function bad() pure returns() +func (_Simplestorage *SimplestorageCaller) Bad(opts *bind.CallOpts) error { + var out []interface{} + err := _Simplestorage.contract.Call(opts, &out, "bad") + + if err != nil { + return err + } + + return err + +} + +// Bad is a free data retrieval call binding the contract method 0x9c3674fc. +// +// Solidity: function bad() pure returns() +func (_Simplestorage *SimplestorageSession) Bad() error { + return _Simplestorage.Contract.Bad(&_Simplestorage.CallOpts) +} + +// Bad is a free data retrieval call binding the contract method 0x9c3674fc. +// +// Solidity: function bad() pure returns() +func (_Simplestorage *SimplestorageCallerSession) Bad() error { + return _Simplestorage.Contract.Bad(&_Simplestorage.CallOpts) +} + // Get is a free data retrieval call binding the contract method 0x6d4ce63c. // // Solidity: function get() view returns(uint256) diff --git a/example/contracts/simplestorage/SimpleStorage.sol b/example/contracts/simplestorage/SimpleStorage.sol index b8688e2b9..67530368d 100644 --- a/example/contracts/simplestorage/SimpleStorage.sol +++ b/example/contracts/simplestorage/SimpleStorage.sol @@ -14,4 +14,8 @@ contract SimpleStorage { function get() public view returns (uint256) { return storedData; } + + function bad() public pure { + revert(); + } } \ No newline at end of file diff --git a/go.mod b/go.mod index 778cb9657..7f6480208 100644 --- a/go.mod +++ b/go.mod @@ -346,7 +346,7 @@ require ( replace ( github.com/CosmWasm/wasmd => github.com/sei-protocol/sei-wasmd v0.1.2 github.com/confio/ics23/go => github.com/cosmos/cosmos-sdk/ics23/go v0.8.0 - github.com/cosmos/cosmos-sdk => github.com/sei-protocol/sei-cosmos v0.3.5 + github.com/cosmos/cosmos-sdk => github.com/sei-protocol/sei-cosmos v0.3.8 github.com/cosmos/iavl => github.com/sei-protocol/sei-iavl v0.1.9 github.com/cosmos/ibc-go/v3 => github.com/sei-protocol/sei-ibc-go/v3 v3.3.0 github.com/ethereum/go-ethereum => github.com/sei-protocol/go-ethereum v1.13.5-sei-16 @@ -354,7 +354,7 @@ replace ( github.com/sei-protocol/sei-db => github.com/sei-protocol/sei-db v0.0.36 // Latest goleveldb is broken, we have to stick to this version github.com/syndtr/goleveldb => github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 - github.com/tendermint/tendermint => github.com/sei-protocol/sei-tendermint v0.3.1 + github.com/tendermint/tendermint => github.com/sei-protocol/sei-tendermint v0.3.2 github.com/tendermint/tm-db => github.com/sei-protocol/tm-db v0.0.4 google.golang.org/grpc => google.golang.org/grpc v1.33.2 ) diff --git a/go.sum b/go.sum index d4c27f7a2..c7de0ca4d 100644 --- a/go.sum +++ b/go.sum @@ -1347,16 +1347,16 @@ github.com/sei-protocol/go-ethereum v1.13.5-sei-16 h1:bPQw44//5XHDZWfwO98g2Hie5H github.com/sei-protocol/go-ethereum v1.13.5-sei-16/go.mod h1:kcRZmuzRn1lVejiFNTz4l4W7imnpq1bDAnuKS/RyhbQ= github.com/sei-protocol/goutils v0.0.2 h1:Bfa7Sv+4CVLNM20QcpvGb81B8C5HkQC/kW1CQpIbXDA= github.com/sei-protocol/goutils v0.0.2/go.mod h1:iYE2DuJfEnM+APPehr2gOUXfuLuPsVxorcDO+Tzq9q8= -github.com/sei-protocol/sei-cosmos v0.3.5 h1:ibWj4uM3YeKLaGKfl1oWj36nkJo/2aZSyS7xo8Ixh6E= -github.com/sei-protocol/sei-cosmos v0.3.5/go.mod h1:imKzUdlLFKj8H39Ej9dICT+HZkx0rgEPsVm0PPb59kc= +github.com/sei-protocol/sei-cosmos v0.3.8 h1:YojcJLDNkerH7owwJlzuIWfKP0RNM2K9FKtjZkValow= +github.com/sei-protocol/sei-cosmos v0.3.8/go.mod h1:WWwx6XlJc9SrjdRwLW69o511hFpfUiHapYb+V9OqOG4= github.com/sei-protocol/sei-db v0.0.36 h1:Qg8MlO/4btECyAB/XrbEexhpaS7OmYsrs9IUYULf+bY= github.com/sei-protocol/sei-db v0.0.36/go.mod h1:F/ZKZA8HJPcUzSZPA8yt6pfwlGriJ4RDR4eHKSGLStI= github.com/sei-protocol/sei-iavl v0.1.9 h1:y4mVYftxLNRs6533zl7N0/Ch+CzRQc04JDfHolIxgBE= github.com/sei-protocol/sei-iavl v0.1.9/go.mod h1:7PfkEVT5dcoQE+s/9KWdoXJ8VVVP1QpYYPLdxlkSXFk= github.com/sei-protocol/sei-ibc-go/v3 v3.3.0 h1:/mjpTuCSEVDJ51nUDSHU92N0bRSwt49r1rmdC/lqgp8= github.com/sei-protocol/sei-ibc-go/v3 v3.3.0/go.mod h1:VwB/vWu4ysT5DN2aF78d17LYmx3omSAdq6gpKvM7XRA= -github.com/sei-protocol/sei-tendermint v0.3.1 h1:CzlJqFCFBoh0qlzUNc4n3HVNGD9FX+bGTKOyHkgMd4U= -github.com/sei-protocol/sei-tendermint v0.3.1/go.mod h1:4LSlJdhl3nf3OmohliwRNUFLOB1XWlrmSodrIP7fLh4= +github.com/sei-protocol/sei-tendermint v0.3.2 h1:Fiwr0y09GT5Gv/iGXVi6itRdwdUdh//O/oQTHq3x33c= +github.com/sei-protocol/sei-tendermint v0.3.2/go.mod h1:4LSlJdhl3nf3OmohliwRNUFLOB1XWlrmSodrIP7fLh4= github.com/sei-protocol/sei-tm-db v0.0.5 h1:3WONKdSXEqdZZeLuWYfK5hP37TJpfaUa13vAyAlvaQY= github.com/sei-protocol/sei-tm-db v0.0.5/go.mod h1:Cpa6rGyczgthq7/0pI31jys2Fw0Nfrc+/jKdP1prVqY= github.com/sei-protocol/sei-wasmd v0.1.2 h1:CHAQGWq0htMsJVo+4CWqz1uCCAMg6bTm1OUlD1mRZ5o= diff --git a/x/evm/keeper/msg_server_test.go b/x/evm/keeper/msg_server_test.go index 5d1fc24ea..e6609e9a7 100644 --- a/x/evm/keeper/msg_server_test.go +++ b/x/evm/keeper/msg_server_test.go @@ -2,6 +2,7 @@ package keeper_test import ( "bytes" + "crypto/sha256" "encoding/hex" "math/big" "os" @@ -25,6 +26,7 @@ import ( "github.com/sei-protocol/sei-chain/x/evm/types" "github.com/sei-protocol/sei-chain/x/evm/types/ethtx" "github.com/stretchr/testify/require" + abci "github.com/tendermint/tendermint/abci/types" ) type mockTx struct { @@ -589,3 +591,83 @@ func TestRegisterPointer(t *testing.T) { } require.False(t, hasRegisteredEvent) } + +func TestEvmError(t *testing.T) { + k := testkeeper.EVMTestApp.EvmKeeper + ctx := testkeeper.EVMTestApp.GetContextForDeliverTx([]byte{}) + code, err := os.ReadFile("../../../example/contracts/simplestorage/SimpleStorage.bin") + require.Nil(t, err) + bz, err := hex.DecodeString(string(code)) + require.Nil(t, err) + privKey := testkeeper.MockPrivateKey() + testPrivHex := hex.EncodeToString(privKey.Bytes()) + key, _ := crypto.HexToECDSA(testPrivHex) + txData := ethtypes.LegacyTx{ + GasPrice: big.NewInt(1000000000000), + Gas: 200000, + To: nil, + Value: big.NewInt(0), + Data: bz, + Nonce: 0, + } + chainID := k.ChainID(ctx) + chainCfg := types.DefaultChainConfig() + ethCfg := chainCfg.EthereumConfig(chainID) + blockNum := big.NewInt(ctx.BlockHeight()) + signer := ethtypes.MakeSigner(ethCfg, blockNum, uint64(ctx.BlockTime().Unix())) + tx, err := ethtypes.SignTx(ethtypes.NewTx(&txData), signer, key) + require.Nil(t, err) + txwrapper, err := ethtx.NewLegacyTx(tx) + require.Nil(t, err) + req, err := types.NewMsgEVMTransaction(txwrapper) + require.Nil(t, err) + + _, evmAddr := testkeeper.PrivateKeyToAddresses(privKey) + amt := sdk.NewCoins(sdk.NewCoin(k.GetBaseDenom(ctx), sdk.NewInt(1000000))) + k.BankKeeper().MintCoins(ctx, types.ModuleName, sdk.NewCoins(sdk.NewCoin(k.GetBaseDenom(ctx), sdk.NewInt(1000000)))) + k.BankKeeper().SendCoinsFromModuleToAccount(ctx, types.ModuleName, evmAddr[:], amt) + + tb := testkeeper.EVMTestApp.GetTxConfig().NewTxBuilder() + tb.SetMsgs(req) + sdktx := tb.GetTx() + txbz, err := testkeeper.EVMTestApp.GetTxConfig().TxEncoder()(sdktx) + require.Nil(t, err) + + res := testkeeper.EVMTestApp.DeliverTx(ctx, abci.RequestDeliverTx{Tx: txbz}, sdktx, sha256.Sum256(txbz)) + require.Equal(t, uint32(0), res.Code) + receipt, err := k.GetReceipt(ctx, common.HexToHash(res.EvmTxInfo.TxHash)) + require.Nil(t, err) + + // send transaction that's gonna be reverted to the contract + contractAddr := common.HexToAddress(receipt.ContractAddress) + abi, err := simplestorage.SimplestorageMetaData.GetAbi() + require.Nil(t, err) + bz, err = abi.Pack("bad") + require.Nil(t, err) + txData = ethtypes.LegacyTx{ + GasPrice: big.NewInt(1000000000000), + Gas: 200000, + To: &contractAddr, + Value: big.NewInt(0), + Data: bz, + Nonce: 1, + } + tx, err = ethtypes.SignTx(ethtypes.NewTx(&txData), signer, key) + require.Nil(t, err) + txwrapper, err = ethtx.NewLegacyTx(tx) + require.Nil(t, err) + req, err = types.NewMsgEVMTransaction(txwrapper) + require.Nil(t, err) + + tb = testkeeper.EVMTestApp.GetTxConfig().NewTxBuilder() + tb.SetMsgs(req) + sdktx = tb.GetTx() + txbz, err = testkeeper.EVMTestApp.GetTxConfig().TxEncoder()(sdktx) + require.Nil(t, err) + + res = testkeeper.EVMTestApp.DeliverTx(ctx, abci.RequestDeliverTx{Tx: txbz}, sdktx, sha256.Sum256(txbz)) + require.Equal(t, uint32(0), res.Code) + receipt, err = k.GetReceipt(ctx, common.HexToHash(res.EvmTxInfo.TxHash)) + require.Nil(t, err) + require.Equal(t, receipt.VmError, res.EvmTxInfo.VmError) +} diff --git a/x/evm/types/message_evm_transaction.go b/x/evm/types/message_evm_transaction.go index 5ab737579..b68793830 100644 --- a/x/evm/types/message_evm_transaction.go +++ b/x/evm/types/message_evm_transaction.go @@ -13,6 +13,7 @@ const TypeMsgEVMTransaction = "evm_transaction" var ( _ sdk.Msg = &MsgEVMTransaction{} _ codectypes.UnpackInterfacesMessage = &MsgEVMTransaction{} + _ sdk.ResultDecorator = &MsgEVMTransactionResponse{} ) func NewMsgEVMTransaction(txData proto.Message) (*MsgEVMTransaction, error) { @@ -77,3 +78,12 @@ func MustGetEVMTransactionMessage(tx sdk.Tx) *MsgEVMTransaction { } return msg } + +func (res *MsgEVMTransactionResponse) DecorateSdkResult(sdkRes *sdk.Result) { + if res == nil { + return + } + if res.VmError != "" { + sdkRes.EvmError = res.VmError + } +} From 502a5607fb1facef00115f9af87f3668f7c69022 Mon Sep 17 00:00:00 2001 From: Denys S <150304777+dssei@users.noreply.github.com> Date: Mon, 6 May 2024 09:28:34 -0700 Subject: [PATCH 07/51] IBC transfer precompile for default timeout height and timestamp (#1622) * working draft of ibc with default timeouts * fixed draft * tests for transferWithDefaultTimeout method * move common args validation to a common method * formatting * more tests * get time from block --- app/app.go | 3 + precompiles/common/expected_keepers.go | 17 ++ precompiles/ibc/IBC.sol | 8 + precompiles/ibc/abi.json | 41 ++- precompiles/ibc/ibc.go | 292 ++++++++++++++++---- precompiles/ibc/ibc_test.go | 367 ++++++++++++++++++++++++- precompiles/setup.go | 7 +- 7 files changed, 674 insertions(+), 61 deletions(-) diff --git a/app/app.go b/app/app.go index 0eacd4282..79f901e33 100644 --- a/app/app.go +++ b/app/app.go @@ -675,6 +675,9 @@ func New( app.DistrKeeper, app.OracleKeeper, app.TransferKeeper, + app.IBCKeeper.ClientKeeper, + app.IBCKeeper.ConnectionKeeper, + app.IBCKeeper.ChannelKeeper, ); err != nil { panic(err) } diff --git a/precompiles/common/expected_keepers.go b/precompiles/common/expected_keepers.go index 3b8596431..f175d6719 100644 --- a/precompiles/common/expected_keepers.go +++ b/precompiles/common/expected_keepers.go @@ -3,6 +3,10 @@ package common import ( "context" + connectiontypes "github.com/cosmos/ibc-go/v3/modules/core/03-connection/types" + "github.com/cosmos/ibc-go/v3/modules/core/04-channel/types" + "github.com/cosmos/ibc-go/v3/modules/core/exported" + sdk "github.com/cosmos/cosmos-sdk/types" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" @@ -79,3 +83,16 @@ type TransferKeeper interface { timeoutTimestamp uint64, ) error } + +type ClientKeeper interface { + GetClientState(ctx sdk.Context, clientID string) (exported.ClientState, bool) + GetClientConsensusState(ctx sdk.Context, clientID string, height exported.Height) (exported.ConsensusState, bool) +} + +type ConnectionKeeper interface { + GetConnection(ctx sdk.Context, connectionID string) (connectiontypes.ConnectionEnd, bool) +} + +type ChannelKeeper interface { + GetChannel(ctx sdk.Context, portID, channelID string) (types.Channel, bool) +} diff --git a/precompiles/ibc/IBC.sol b/precompiles/ibc/IBC.sol index 649d3a3b6..892652a8b 100644 --- a/precompiles/ibc/IBC.sol +++ b/precompiles/ibc/IBC.sol @@ -19,4 +19,12 @@ interface IBC { uint64 revisionHeight, uint64 timeoutTimestamp ) external returns (bool success); + + function transferWithDefaultTimeout( + string toAddress, + string memory port, + string memory channel, + string memory denom, + uint256 amount + ) external returns (bool success); } diff --git a/precompiles/ibc/abi.json b/precompiles/ibc/abi.json index a1ff1e9fc..93db335e4 100644 --- a/precompiles/ibc/abi.json +++ b/precompiles/ibc/abi.json @@ -50,7 +50,46 @@ "type": "bool" } ], - "stateMutability": "view", + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "toAddress", + "type": "string" + }, + { + "internalType": "string", + "name": "port", + "type": "string" + }, + { + "internalType": "string", + "name": "channel", + "type": "string" + }, + { + "internalType": "string", + "name": "denom", + "type": "string" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "transferWithDefaultTimeout", + "outputs": [ + { + "internalType": "bool", + "name": "success", + "type": "bool" + } + ], + "stateMutability": "payable", "type": "function" } ] diff --git a/precompiles/ibc/ibc.go b/precompiles/ibc/ibc.go index c6f1921d4..9d84be672 100644 --- a/precompiles/ibc/ibc.go +++ b/precompiles/ibc/ibc.go @@ -7,12 +7,15 @@ import ( "fmt" "math/big" + "github.com/cosmos/ibc-go/v3/modules/apps/transfer/types" + "github.com/cosmos/cosmos-sdk/types/bech32" "github.com/sei-protocol/sei-chain/utils" sdk "github.com/cosmos/cosmos-sdk/types" clienttypes "github.com/cosmos/ibc-go/v3/modules/core/02-client/types" + connectiontypes "github.com/cosmos/ibc-go/v3/modules/core/03-connection/types" "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/tracing" @@ -21,7 +24,8 @@ import ( ) const ( - TransferMethod = "transfer" + TransferMethod = "transfer" + TransferWithDefaultTimeoutMethod = "transferWithDefaultTimeout" ) const ( @@ -51,27 +55,41 @@ func GetABI() abi.ABI { type Precompile struct { pcommon.Precompile - address common.Address - transferKeeper pcommon.TransferKeeper - evmKeeper pcommon.EVMKeeper - - TransferID []byte + address common.Address + transferKeeper pcommon.TransferKeeper + evmKeeper pcommon.EVMKeeper + clientKeeper pcommon.ClientKeeper + connectionKeeper pcommon.ConnectionKeeper + channelKeeper pcommon.ChannelKeeper + + TransferID []byte + TransferWithDefaultTimeoutID []byte } -func NewPrecompile(transferKeeper pcommon.TransferKeeper, evmKeeper pcommon.EVMKeeper) (*Precompile, error) { +func NewPrecompile( + transferKeeper pcommon.TransferKeeper, + evmKeeper pcommon.EVMKeeper, + clientKeeper pcommon.ClientKeeper, + connectionKeeper pcommon.ConnectionKeeper, + channelKeeper pcommon.ChannelKeeper) (*Precompile, error) { newAbi := GetABI() p := &Precompile{ - Precompile: pcommon.Precompile{ABI: newAbi}, - address: common.HexToAddress(IBCAddress), - transferKeeper: transferKeeper, - evmKeeper: evmKeeper, + Precompile: pcommon.Precompile{ABI: newAbi}, + address: common.HexToAddress(IBCAddress), + transferKeeper: transferKeeper, + evmKeeper: evmKeeper, + clientKeeper: clientKeeper, + connectionKeeper: connectionKeeper, + channelKeeper: channelKeeper, } for name, m := range newAbi.Methods { switch name { case TransferMethod: p.TransferID = m.ID + case TransferWithDefaultTimeoutMethod: + p.TransferWithDefaultTimeoutID = m.ID } } @@ -116,6 +134,8 @@ func (p Precompile) RunAndCalculateGas(evm *vm.EVM, caller common.Address, calli switch method.Name { case TransferMethod: return p.transfer(ctx, method, args, caller) + case TransferWithDefaultTimeoutMethod: + return p.transferWithDefaultTimeout(ctx, method, args, caller) } return } @@ -138,61 +158,87 @@ func (p Precompile) transfer(ctx sdk.Context, method *abi.Method, args []interfa rerr = err return } - senderSeiAddr, ok := p.evmKeeper.GetSeiAddress(ctx, caller) - if !ok { - rerr = errors.New("caller is not a valid SEI address") + validatedArgs, err := p.validateCommonArgs(ctx, args, caller) + if err != nil { + rerr = err return } - receiverAddressString, ok := args[0].(string) - if !ok { - rerr = errors.New("receiverAddress is not a string") + if validatedArgs.amount.Cmp(big.NewInt(0)) == 0 { + // short circuit + remainingGas = pcommon.GetRemainingGas(ctx, p.evmKeeper) + ret, rerr = method.Outputs.Pack(true) return } - _, bz, err := bech32.DecodeAndConvert(receiverAddressString) - if err != nil { - rerr = err - return + + coin := sdk.Coin{ + Denom: validatedArgs.denom, + Amount: sdk.NewIntFromBigInt(validatedArgs.amount), } - err = sdk.VerifyAddressFormat(bz) - if err != nil { - rerr = err + + revisionNumber, ok := args[5].(uint64) + if !ok { + rerr = errors.New("revisionNumber is not a uint64") return } - port, ok := args[1].(string) + revisionHeight, ok := args[6].(uint64) if !ok { - rerr = errors.New("port is not a string") + rerr = errors.New("revisionHeight is not a uint64") return } - if port == "" { - rerr = errors.New("port cannot be empty") - return + + height := clienttypes.Height{ + RevisionNumber: revisionNumber, + RevisionHeight: revisionHeight, } - channelID, ok := args[2].(string) + timeoutTimestamp, ok := args[7].(uint64) if !ok { - rerr = errors.New("channelID is not a string") + rerr = errors.New("timeoutTimestamp is not a uint64") return } - if channelID == "" { - rerr = errors.New("channelID cannot be empty") + + err = p.transferKeeper.SendTransfer( + ctx, + validatedArgs.port, + validatedArgs.channelID, + coin, + validatedArgs.senderSeiAddr, + validatedArgs.receiverAddressString, + height, + timeoutTimestamp) + + if err != nil { + rerr = err return } + remainingGas = pcommon.GetRemainingGas(ctx, p.evmKeeper) + ret, rerr = method.Outputs.Pack(true) + return +} - denom := args[3].(string) - if denom == "" { - rerr = errors.New("invalid denom") +func (p Precompile) transferWithDefaultTimeout(ctx sdk.Context, method *abi.Method, args []interface{}, caller common.Address) (ret []byte, remainingGas uint64, rerr error) { + defer func() { + if err := recover(); err != nil { + ret = nil + remainingGas = 0 + rerr = fmt.Errorf("%s", err) + return + } + }() + + if err := pcommon.ValidateArgsLength(args, 5); err != nil { + rerr = err return } - - amount, ok := args[4].(*big.Int) - if !ok { - rerr = errors.New("amount is not a big.Int") + validatedArgs, err := p.validateCommonArgs(ctx, args, caller) + if err != nil { + rerr = err return } - if amount.Cmp(big.NewInt(0)) == 0 { + if validatedArgs.amount.Cmp(big.NewInt(0)) == 0 { // short circuit remainingGas = pcommon.GetRemainingGas(ctx, p.evmKeeper) ret, rerr = method.Outputs.Pack(true) @@ -200,34 +246,44 @@ func (p Precompile) transfer(ctx sdk.Context, method *abi.Method, args []interfa } coin := sdk.Coin{ - Denom: denom, - Amount: sdk.NewIntFromBigInt(amount), + Denom: validatedArgs.denom, + Amount: sdk.NewIntFromBigInt(validatedArgs.amount), } - revisionNumber, ok := args[5].(uint64) - if !ok { - rerr = errors.New("revisionNumber is not a uint64") + connection, err := p.getChannelConnection(ctx, validatedArgs.port, validatedArgs.channelID) + + if err != nil { + rerr = err return } - revisionHeight, ok := args[6].(uint64) - if !ok { - rerr = errors.New("revisionHeight is not a uint64") + latestConsensusHeight, err := p.getConsensusLatestHeight(ctx, *connection) + if err != nil { + rerr = err return } - height := clienttypes.Height{ - RevisionNumber: revisionNumber, - RevisionHeight: revisionHeight, + height, err := GetAdjustedHeight(*latestConsensusHeight) + if err != nil { + rerr = err + return } - timeoutTimestamp, ok := args[7].(uint64) - if !ok { - rerr = errors.New("timeoutTimestamp is not a uint64") + timeoutTimestamp, err := p.GetAdjustedTimestamp(ctx, connection.ClientId, *latestConsensusHeight) + if err != nil { + rerr = err return } - err = p.transferKeeper.SendTransfer(ctx, port, channelID, coin, senderSeiAddr, receiverAddressString, height, timeoutTimestamp) + err = p.transferKeeper.SendTransfer( + ctx, + validatedArgs.port, + validatedArgs.channelID, + coin, + validatedArgs.senderSeiAddr, + validatedArgs.receiverAddressString, + height, + timeoutTimestamp) if err != nil { rerr = err @@ -266,3 +322,127 @@ func (p Precompile) accAddressFromArg(ctx sdk.Context, arg interface{}) (sdk.Acc } return seiAddr, nil } + +func (p Precompile) getChannelConnection(ctx sdk.Context, port string, channelID string) (*connectiontypes.ConnectionEnd, error) { + channel, found := p.channelKeeper.GetChannel(ctx, port, channelID) + if !found { + return nil, errors.New("channel not found") + } + + connection, found := p.connectionKeeper.GetConnection(ctx, channel.ConnectionHops[0]) + + if !found { + return nil, errors.New("connection not found") + } + return &connection, nil +} + +func (p Precompile) getConsensusLatestHeight(ctx sdk.Context, connection connectiontypes.ConnectionEnd) (*clienttypes.Height, error) { + clientState, found := p.clientKeeper.GetClientState(ctx, connection.ClientId) + + if !found { + return nil, errors.New("could not get the client state") + } + + latestHeight := clientState.GetLatestHeight() + return &clienttypes.Height{ + RevisionNumber: latestHeight.GetRevisionNumber(), + RevisionHeight: latestHeight.GetRevisionHeight(), + }, nil +} + +func GetAdjustedHeight(latestConsensusHeight clienttypes.Height) (clienttypes.Height, error) { + defaultTimeoutHeight, err := clienttypes.ParseHeight(types.DefaultRelativePacketTimeoutHeight) + if err != nil { + return clienttypes.Height{}, err + } + + absoluteHeight := latestConsensusHeight + absoluteHeight.RevisionNumber += defaultTimeoutHeight.RevisionNumber + absoluteHeight.RevisionHeight += defaultTimeoutHeight.RevisionHeight + return absoluteHeight, nil +} + +func (p Precompile) GetAdjustedTimestamp(ctx sdk.Context, clientId string, height clienttypes.Height) (uint64, error) { + consensusState, found := p.clientKeeper.GetClientConsensusState(ctx, clientId, height) + var consensusStateTimestamp uint64 + if found { + consensusStateTimestamp = consensusState.GetTimestamp() + } + + defaultRelativePacketTimeoutTimestamp := types.DefaultRelativePacketTimeoutTimestamp + blockTime := ctx.BlockTime().UnixNano() + if blockTime > 0 { + now := uint64(blockTime) + if now > consensusStateTimestamp { + return now + defaultRelativePacketTimeoutTimestamp, nil + } else { + return consensusStateTimestamp + defaultRelativePacketTimeoutTimestamp, nil + } + } else { + return 0, errors.New("block time is not greater than Jan 1st, 1970 12:00 AM") + } +} + +type ValidatedArgs struct { + senderSeiAddr sdk.AccAddress + receiverAddressString string + port string + channelID string + denom string + amount *big.Int +} + +func (p Precompile) validateCommonArgs(ctx sdk.Context, args []interface{}, caller common.Address) (*ValidatedArgs, error) { + senderSeiAddr, ok := p.evmKeeper.GetSeiAddress(ctx, caller) + if !ok { + return nil, errors.New("caller is not a valid SEI address") + } + + receiverAddressString, ok := args[0].(string) + if !ok { + return nil, errors.New("receiverAddress is not a string") + } + _, bz, err := bech32.DecodeAndConvert(receiverAddressString) + if err != nil { + return nil, err + } + err = sdk.VerifyAddressFormat(bz) + if err != nil { + return nil, err + } + + port, ok := args[1].(string) + if !ok { + return nil, errors.New("port is not a string") + } + if port == "" { + return nil, errors.New("port cannot be empty") + } + + channelID, ok := args[2].(string) + if !ok { + return nil, errors.New("channelID is not a string") + } + if channelID == "" { + return nil, errors.New("channelID cannot be empty") + } + + denom := args[3].(string) + if denom == "" { + return nil, errors.New("invalid denom") + } + + amount, ok := args[4].(*big.Int) + if !ok { + return nil, errors.New("amount is not a big.Int") + } + return &ValidatedArgs{ + senderSeiAddr: senderSeiAddr, + receiverAddressString: receiverAddressString, + port: port, + channelID: channelID, + denom: denom, + amount: amount, + }, nil +} diff --git a/precompiles/ibc/ibc_test.go b/precompiles/ibc/ibc_test.go index fc07b9cb8..8a6da8c14 100644 --- a/precompiles/ibc/ibc_test.go +++ b/precompiles/ibc/ibc_test.go @@ -2,9 +2,11 @@ package ibc_test import ( "errors" + "github.com/cosmos/ibc-go/v3/modules/core/exported" "math/big" "reflect" "testing" + "time" sdk "github.com/cosmos/cosmos-sdk/types" clienttypes "github.com/cosmos/ibc-go/v3/modules/core/02-client/types" @@ -36,7 +38,7 @@ func TestPrecompile_Run(t *testing.T) { senderSeiAddress, senderEvmAddress := testkeeper.MockAddressPair() receiverAddress := "cosmos1yykwxjzr2tv4mhx5tsf8090sdg96f2ax8fydk2" - pre, _ := ibc.NewPrecompile(nil, nil) + pre, _ := ibc.NewPrecompile(nil, nil, nil, nil, nil) testTransfer, _ := pre.ABI.MethodById(pre.TransferID) packedTrue, _ := testTransfer.Outputs.Pack(true) @@ -216,7 +218,7 @@ func TestPrecompile_Run(t *testing.T) { StateDB: stateDb, TxContext: vm.TxContext{Origin: senderEvmAddress}, } - p, _ := ibc.NewPrecompile(tt.fields.transferKeeper, k) + p, _ := ibc.NewPrecompile(tt.fields.transferKeeper, k, nil, nil, nil) transfer, err := p.ABI.MethodById(p.TransferID) require.Nil(t, err) inputs, err := transfer.Inputs.Pack(tt.args.input.receiverAddr, @@ -241,3 +243,364 @@ func TestPrecompile_Run(t *testing.T) { }) } } + +func TestTransferWithDefaultTimeoutPrecompile_Run(t *testing.T) { + senderSeiAddress, senderEvmAddress := testkeeper.MockAddressPair() + receiverAddress := "cosmos1yykwxjzr2tv4mhx5tsf8090sdg96f2ax8fydk2" + + type fields struct { + transferKeeper pcommon.TransferKeeper + clientKeeper pcommon.ClientKeeper + connectionKeeper pcommon.ConnectionKeeper + channelKeeper pcommon.ChannelKeeper + } + + type input struct { + receiverAddr string + sourcePort string + sourceChannel string + denom string + amount *big.Int + } + type args struct { + caller common.Address + callingContract common.Address + input *input + suppliedGas uint64 + value *big.Int + } + + commonArgs := args{ + caller: senderEvmAddress, + callingContract: senderEvmAddress, + input: &input{ + receiverAddr: receiverAddress, + sourcePort: "transfer", + sourceChannel: "channel-0", + denom: "denom", + amount: big.NewInt(100), + }, + suppliedGas: uint64(1000000), + value: nil, + } + + tests := []struct { + name string + fields fields + args args + wantBz []byte + wantRemainingGas uint64 + wantErr bool + wantErrMsg string + }{ + { + name: "failed transfer: caller not whitelisted", + fields: fields{transferKeeper: &MockTransferKeeper{}}, + args: args{caller: senderEvmAddress, callingContract: common.Address{}, input: commonArgs.input, suppliedGas: 1000000, value: nil}, + wantBz: nil, + wantErr: true, + wantErrMsg: "cannot delegatecall IBC", + }, + { + name: "failed transfer: empty sourcePort", + fields: fields{transferKeeper: &MockTransferKeeper{}}, + args: args{ + caller: senderEvmAddress, + callingContract: senderEvmAddress, + input: &input{ + receiverAddr: receiverAddress, + sourcePort: "", // empty sourcePort + sourceChannel: "channel-0", + denom: "denom", + amount: big.NewInt(100), + }, + suppliedGas: uint64(1000000), + value: nil, + }, + wantBz: nil, + wantErr: true, + wantErrMsg: "port cannot be empty", + }, + { + name: "failed transfer: empty sourceChannel", + fields: fields{transferKeeper: &MockTransferKeeper{}}, + args: args{ + caller: senderEvmAddress, + callingContract: senderEvmAddress, + input: &input{ + receiverAddr: receiverAddress, + sourcePort: "transfer", + sourceChannel: "", + denom: "denom", + amount: big.NewInt(100), + }, + suppliedGas: uint64(1000000), + value: nil, + }, + wantBz: nil, + wantErr: true, + wantErrMsg: "channelID cannot be empty", + }, + { + name: "failed transfer: invalid denom", + fields: fields{transferKeeper: &MockTransferKeeper{}}, + args: args{ + caller: senderEvmAddress, + callingContract: senderEvmAddress, + input: &input{ + receiverAddr: receiverAddress, + sourcePort: "transfer", + sourceChannel: "channel-0", + denom: "", + amount: big.NewInt(100), + }, + suppliedGas: uint64(1000000), + value: nil, + }, + wantBz: nil, + wantErr: true, + wantErrMsg: "invalid denom", + }, + { + name: "failed transfer: invalid receiver address", + fields: fields{transferKeeper: &MockTransferKeeper{}}, + args: args{ + caller: senderEvmAddress, + callingContract: senderEvmAddress, + input: &input{ + receiverAddr: "invalid", + sourcePort: "transfer", + sourceChannel: "channel-0", + denom: "", + amount: big.NewInt(100), + }, + suppliedGas: uint64(1000000), + value: nil, + }, + wantBz: nil, + wantErr: true, + wantErrMsg: "decoding bech32 failed: invalid bech32 string length 7", + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + testApp := testkeeper.EVMTestApp + ctx := testApp.NewContext(false, tmtypes.Header{}).WithBlockHeight(2) + k := &testApp.EvmKeeper + k.SetAddressMapping(ctx, senderSeiAddress, senderEvmAddress) + stateDb := state.NewDBImpl(ctx, k, true) + evm := vm.EVM{ + StateDB: stateDb, + TxContext: vm.TxContext{Origin: senderEvmAddress}, + } + + p, _ := ibc.NewPrecompile(tt.fields.transferKeeper, + k, tt.fields.clientKeeper, + tt.fields.connectionKeeper, + tt.fields.channelKeeper) + transfer, err := p.ABI.MethodById(p.TransferWithDefaultTimeoutID) + require.Nil(t, err) + inputs, err := transfer.Inputs.Pack(tt.args.input.receiverAddr, + tt.args.input.sourcePort, tt.args.input.sourceChannel, tt.args.input.denom, tt.args.input.amount) + require.Nil(t, err) + gotBz, gotRemainingGas, err := p.RunAndCalculateGas(&evm, + tt.args.caller, + tt.args.callingContract, + append(p.TransferWithDefaultTimeoutID, inputs...), + tt.args.suppliedGas, + tt.args.value, + nil, + false) + if (err != nil) != tt.wantErr { + t.Errorf("Run() error = %v, wantErr %v", err, tt.wantErr) + return + } + if err != nil { + require.Equal(t, tt.wantErrMsg, err.Error()) + } + + if !reflect.DeepEqual(gotBz, tt.wantBz) { + t.Errorf("Run() gotBz = %v, want %v", gotBz, tt.wantBz) + } + if !reflect.DeepEqual(gotRemainingGas, tt.wantRemainingGas) { + t.Errorf("Run() gotRemainingGas = %v, want %v", gotRemainingGas, tt.wantRemainingGas) + } + }) + } +} + +func TestPrecompile_GetAdjustedHeight(t *testing.T) { + type args struct { + latestConsensusHeight clienttypes.Height + } + tests := []struct { + name string + args args + want clienttypes.Height + wantErr bool + }{ + { + name: "height is adjusted with defaults", + args: args{ + latestConsensusHeight: clienttypes.NewHeight(2, 3), + }, + want: clienttypes.Height{ + RevisionNumber: 2, + RevisionHeight: 1003, + }, + wantErr: false, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got, err := ibc.GetAdjustedHeight(tt.args.latestConsensusHeight) + if (err != nil) != tt.wantErr { + t.Errorf("GetAdjustedHeight() error = %v, wantErr %v", err, tt.wantErr) + return + } + if !reflect.DeepEqual(got, tt.want) { + t.Errorf("GetAdjustedHeight() got = %v, want %v", got, tt.want) + } + }) + } +} + +type MockClientKeeper struct { + consensusState *MockConsensusState + returnConsensusState bool +} + +func (ck *MockClientKeeper) GetClientState(ctx sdk.Context, clientID string) (exported.ClientState, bool) { + return nil, false +} + +func (ck *MockClientKeeper) GetClientConsensusState(ctx sdk.Context, clientID string, height exported.Height) (exported.ConsensusState, bool) { + return ck.consensusState, ck.returnConsensusState +} + +type MockConsensusState struct { + timestamp uint64 +} + +func (m *MockConsensusState) Reset() { + panic("implement me") +} + +func (m *MockConsensusState) String() string { + panic("implement me") +} + +func (m *MockConsensusState) ProtoMessage() { + panic("implement me") +} + +func (m *MockConsensusState) ClientType() string { + return "mock" +} + +func (m *MockConsensusState) GetRoot() exported.Root { + return nil +} + +func (m *MockConsensusState) GetTimestamp() uint64 { + return m.timestamp +} + +func (m *MockConsensusState) ValidateBasic() error { + return nil +} + +func TestPrecompile_GetAdjustedTimestamp(t *testing.T) { + type fields struct { + transferKeeper pcommon.TransferKeeper + evmKeeper pcommon.EVMKeeper + clientKeeper pcommon.ClientKeeper + connectionKeeper pcommon.ConnectionKeeper + channelKeeper pcommon.ChannelKeeper + } + type args struct { + ctx sdk.Context + clientId string + height clienttypes.Height + } + timestampSeconds := 1714680155 + ctx := sdk.Context{} + tests := []struct { + name string + fields fields + args args + want uint64 + wantErr bool + }{ + { + name: "if consensus timestamp is less than the given time, return the given time adjusted with default", + fields: fields{ + clientKeeper: &MockClientKeeper{ + consensusState: &MockConsensusState{ + timestamp: uint64(timestampSeconds - 1), + }, + returnConsensusState: true, + }, + }, + args: args{ + ctx: ctx.WithBlockTime(time.Unix(int64(timestampSeconds), 0)), + }, + want: uint64(timestampSeconds)*1_000_000_000 + uint64((time.Duration(10) * time.Minute).Nanoseconds()), + wantErr: false, + }, + { + name: "if consensus state is not found, return the given time adjusted with default", + fields: fields{ + clientKeeper: &MockClientKeeper{ + returnConsensusState: false, + }, + }, + args: args{ + ctx: ctx.WithBlockTime(time.Unix(int64(timestampSeconds), 0)), + }, + want: uint64(timestampSeconds)*1_000_000_000 + uint64((time.Duration(10) * time.Minute).Nanoseconds()), + wantErr: false, + }, + { + name: "if time from local clock can not be retrieved, return error", + fields: fields{ + clientKeeper: &MockClientKeeper{ + returnConsensusState: false, + }, + }, + args: args{ + ctx: ctx.WithBlockTime(time.Unix(int64(0), 0)), + }, + wantErr: true, + }, + { + name: "if consensus timestamp is > than the given time, return the consensus time adjusted with default", + fields: fields{ + clientKeeper: &MockClientKeeper{ + consensusState: &MockConsensusState{ + timestamp: uint64(timestampSeconds+1) * 1_000_000_000, + }, + returnConsensusState: true, + }, + }, + args: args{ + ctx: ctx.WithBlockTime(time.Unix(int64(timestampSeconds), 0)), + }, + want: uint64(timestampSeconds+1)*1_000_000_000 + uint64((time.Duration(10) * time.Minute).Nanoseconds()), + wantErr: false, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + p, _ := ibc.NewPrecompile(tt.fields.transferKeeper, tt.fields.evmKeeper, tt.fields.clientKeeper, tt.fields.connectionKeeper, tt.fields.channelKeeper) + got, err := p.GetAdjustedTimestamp(tt.args.ctx, tt.args.clientId, tt.args.height) + if (err != nil) != tt.wantErr { + t.Errorf("GetAdjustedTimestamp() error = %v, wantErr %v", err, tt.wantErr) + return + } + if got != tt.want { + t.Errorf("GetAdjustedTimestamp() got = %v, want %v", got, tt.want) + } + }) + } +} diff --git a/precompiles/setup.go b/precompiles/setup.go index 3cadd9792..052c05e9d 100644 --- a/precompiles/setup.go +++ b/precompiles/setup.go @@ -49,6 +49,9 @@ func InitializePrecompiles( distrKeeper common.DistributionKeeper, oracleKeeper common.OracleKeeper, transferKeeper common.TransferKeeper, + clientKeeper common.ClientKeeper, + connectionKeeper common.ConnectionKeeper, + channelKeeper common.ChannelKeeper, ) error { SetupMtx.Lock() defer SetupMtx.Unlock() @@ -87,7 +90,7 @@ func InitializePrecompiles( if err != nil { return err } - ibcp, err := ibc.NewPrecompile(transferKeeper, evmKeeper) + ibcp, err := ibc.NewPrecompile(transferKeeper, evmKeeper, clientKeeper, connectionKeeper, channelKeeper) if err != nil { return err } @@ -130,7 +133,7 @@ func InitializePrecompiles( func GetPrecompileInfo(name string) PrecompileInfo { if !Initialized { // Precompile Info does not require any keeper state - _ = InitializePrecompiles(true, nil, nil, nil, nil, nil, nil, nil, nil, nil) + _ = InitializePrecompiles(true, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil) } i, ok := PrecompileNamesToInfo[name] if !ok { From 22404d57ed398bab205beba938f75e16b3d2a450 Mon Sep 17 00:00:00 2001 From: Steven Landers Date: Mon, 6 May 2024 23:04:08 -0400 Subject: [PATCH 08/51] [EVM] Merge balances on associate tx (#1630) * add associate tx test * fix migration of balances * fix getAdmin function * add log so we can debug key import on github actions * fix test (multi-interaction cli step) --- contracts/test/AssociateTest.js | 87 +++++++++++++++++++ contracts/test/lib.js | 85 +++++++++++++++--- contracts/test/test1.key | 9 ++ contracts/test/test2.key | 9 ++ contracts/test/test3.key | 9 ++ .../evm_module/scripts/evm_tests.sh | 1 + x/evm/ante/preprocess.go | 38 ++++---- 7 files changed, 212 insertions(+), 26 deletions(-) create mode 100644 contracts/test/AssociateTest.js create mode 100644 contracts/test/test1.key create mode 100644 contracts/test/test2.key create mode 100644 contracts/test/test3.key diff --git a/contracts/test/AssociateTest.js b/contracts/test/AssociateTest.js new file mode 100644 index 000000000..04e35eda1 --- /dev/null +++ b/contracts/test/AssociateTest.js @@ -0,0 +1,87 @@ +const { fundAddress, fundSeiAddress, getSeiBalance, associateKey, importKey, waitForReceipt, bankSend, evmSend, getNativeAccount} = require("./lib"); +const { expect } = require("chai"); + +describe("Associate Balances", function () { + + const keys = { + "test1": { + seiAddress: 'sei1nzdg7e6rvkrmvp5zzmp5tupuj0088nqsa4mze4', + evmAddress: '0x90684e7F229f2d8E2336661f79caB693E4228Ff7' + }, + "test2": { + seiAddress: 'sei1jqgph9jpdtvv64e3rzegxtssvgmh7lxnn8vmdq', + evmAddress: '0x28b2B0621f76A2D08A9e04acb7F445E61ba5b7E7' + }, + "test3": { + seiAddress: 'sei1qkawqt7dw09rkvn53lm2deamtfcpuq9v0h6zur', + evmAddress: '0xCb2FB25A6a34Ca874171Ac0406d05A49BC45a1cF' + } + } + + const addresses = { + seiAddress: 'sei1nzdg7e6rvkrmvp5zzmp5tupuj0088nqsa4mze4', + evmAddress: '0x90684e7F229f2d8E2336661f79caB693E4228Ff7' + } + + function truncate(num, byThisManyDecimals) { + return parseFloat(`${num}`.slice(0, 12)) + } + + async function verifyAssociation(seiAddr, evmAddr, associateFunc) { + const beforeSei = BigInt(await getSeiBalance(seiAddr)) + const beforeEvm = await ethers.provider.getBalance(evmAddr) + const gas = await associateFunc(seiAddr) + const afterSei = BigInt(await getSeiBalance(seiAddr)) + const afterEvm = await ethers.provider.getBalance(evmAddr) + + // console.log(`SEI Balance (before): ${beforeSei}`) + // console.log(`EVM Balance (before): ${beforeEvm}`) + // console.log(`SEI Balance (after): ${afterSei}`) + // console.log(`EVM Balance (after): ${afterEvm}`) + + const multiplier = BigInt(1000000000000) + expect(afterEvm).to.equal((beforeSei * multiplier) + beforeEvm - (gas * multiplier)) + expect(afterSei).to.equal(truncate(beforeSei - gas)) + } + + before(async function(){ + await importKey("test1", "../contracts/test/test1.key") + await importKey("test2", "../contracts/test/test2.key") + await importKey("test3", "../contracts/test/test3.key") + }) + + it("should associate with sei transaction", async function(){ + const addr = keys.test1 + await fundSeiAddress(addr.seiAddress, "10000000000") + await fundAddress(addr.evmAddress, "200"); + + await verifyAssociation(addr.seiAddress, addr.evmAddress, async function(){ + await bankSend(addr.seiAddress, "test1") + return BigInt(20000) + }) + }); + + it("should associate with evm transaction", async function(){ + const addr = keys.test2 + await fundSeiAddress(addr.seiAddress, "10000000000") + await fundAddress(addr.evmAddress, "200"); + + await verifyAssociation(addr.seiAddress, addr.evmAddress, async function(){ + const txHash = await evmSend(addr.evmAddress, "test2", "0") + const receipt = await waitForReceipt(txHash) + return BigInt(receipt.gasUsed * (receipt.gasPrice / BigInt(1000000000000))) + }) + }); + + it("should associate with associate transaction", async function(){ + const addr = keys.test3 + await fundSeiAddress(addr.seiAddress, "10000000000") + await fundAddress(addr.evmAddress, "200"); + + await verifyAssociation(addr.seiAddress, addr.evmAddress, async function(){ + await associateKey("test3") + return BigInt(0) + }) + }); + +}) \ No newline at end of file diff --git a/contracts/test/lib.js b/contracts/test/lib.js index e409e436a..58cba6730 100644 --- a/contracts/test/lib.js +++ b/contracts/test/lib.js @@ -10,13 +10,52 @@ async function delay() { await sleep(1000) } -async function fundAddress(addr) { - return await execute(`seid tx evm send ${addr} 10000000000000000000 --from ${adminKeyName}`); +async function fundAddress(addr, amount="10000000000000000000") { + const result = await evmSend(addr, adminKeyName, amount) + await delay() + return result } -async function getAdmin() { - await associateAdmin() - const seiAddress = await getAdminSeiAddress() +async function evmSend(addr, fromKey, amount="100000000000000000000000") { + const output = await execute(`seid tx evm send ${addr} ${amount} --from ${fromKey} -b block -y`); + return output.replace(/.*0x/, "0x").trim() +} + +async function bankSend(toAddr, fromKey, amount="100000000000", denom="usei") { + const result = await execute(`seid tx bank send ${fromKey} ${toAddr} ${amount}${denom} -b block --fees 20000usei -y`); + await delay() + return result +} + +async function fundSeiAddress(seiAddr, amount="100000000000", denom="usei") { + return await execute(`seid tx bank send ${adminKeyName} ${seiAddr} ${amount}${denom} -b block --fees 20000usei -y`); +} + +async function getSeiBalance(seiAddr, denom="usei") { + const result = await execute(`seid query bank balances ${seiAddr} -o json`); + const balances = JSON.parse(result) + for(let b of balances.balances) { + if(b.denom === denom) { + return parseInt(b.amount, 10) + } + } + return 0 +} + +async function importKey(name, keyfile) { + try { + return await execute(`seid keys import ${name} ${keyfile}`, `printf "12345678\\n12345678\\n"`) + } catch(e) { + console.log("not importing key (skipping)") + console.log(e) + } +} + +async function getNativeAccount(keyName) { + await associateKey(adminKeyName) + const seiAddress = await getKeySeiAddress(keyName) + await fundSeiAddress(seiAddress) + await delay() const evmAddress = await getEvmAddress(seiAddress) return { seiAddress, @@ -24,13 +63,19 @@ async function getAdmin() { } } -async function getAdminSeiAddress() { - return (await execute(`seid keys show ${adminKeyName} -a`)).trim() +async function getAdmin() { + await associateKey(adminKeyName) + return await getNativeAccount(adminKeyName) +} + +async function getKeySeiAddress(name) { + return (await execute(`seid keys show ${name} -a`)).trim() } -async function associateAdmin() { +async function associateKey(keyName) { try { - return await execute(`seid tx evm associate-address --from ${adminKeyName}`) + await execute(`seid tx evm associate-address --from ${keyName} -b block`) + await delay() }catch(e){ console.log("skipping associate") } @@ -174,14 +219,14 @@ async function executeWasm(contractAddress, msg, coins = "0usei") { return JSON.parse(output); } -async function execute(command) { +async function execute(command, interaction=`printf "12345678\\n"`){ return new Promise((resolve, reject) => { // Check if the Docker container 'sei-node-0' is running exec("docker ps --filter 'name=sei-node-0' --format '{{.Names}}'", (error, stdout, stderr) => { if (stdout.includes('sei-node-0')) { // The container is running, modify the command to execute inside Docker command = command.replace(/\.\.\//g, "/sei-protocol/sei-chain/"); - const dockerCommand = `docker exec sei-node-0 /bin/bash -c 'export PATH=$PATH:/root/go/bin:/root/.foundry/bin && printf "12345678\\n" | ${command}'`; + const dockerCommand = `docker exec sei-node-0 /bin/bash -c 'export PATH=$PATH:/root/go/bin:/root/.foundry/bin && ${interaction} | ${command}'`; execCommand(dockerCommand, resolve, reject); } else { // The container is not running, execute command normally @@ -205,8 +250,19 @@ function execCommand(command, resolve, reject) { }); } +async function waitForReceipt(txHash) { + let receipt = await ethers.provider.getTransactionReceipt(txHash) + while(!receipt) { + await delay() + receipt = await ethers.provider.getTransactionReceipt(txHash) + } + return receipt +} + module.exports = { fundAddress, + fundSeiAddress, + getSeiBalance, storeWasm, deployWasm, instantiateWasm, @@ -220,4 +276,11 @@ module.exports = { deployEvmContract, deployErc20PointerForCw20, deployErc721PointerForCw721, + importKey, + getNativeAccount, + associateKey, + delay, + bankSend, + evmSend, + waitForReceipt, }; diff --git a/contracts/test/test1.key b/contracts/test/test1.key new file mode 100644 index 000000000..51255116e --- /dev/null +++ b/contracts/test/test1.key @@ -0,0 +1,9 @@ +-----BEGIN TENDERMINT PRIVATE KEY----- +kdf: bcrypt +salt: 377151BDAA4DCDD8761F9489519D3E90 +type: secp256k1 + +aMtUz1ow5FBmictYj67Wm5qJksJsiF0O86PrjOHnoINVBn0aCzYNxdkvNg0PP0Qb +jHfcKaDPgk3PaeW16YqNJwveVX71A7lwpUmfT44= +=46/d +-----END TENDERMINT PRIVATE KEY----- diff --git a/contracts/test/test2.key b/contracts/test/test2.key new file mode 100644 index 000000000..b57f16480 --- /dev/null +++ b/contracts/test/test2.key @@ -0,0 +1,9 @@ +-----BEGIN TENDERMINT PRIVATE KEY----- +kdf: bcrypt +salt: 72E32FD4A4089E256F1EFCCBBA576592 +type: secp256k1 + +MZ77pmO6izHdpkKVWYhGLGjZUAhf//WGURYVqUqhjJbCGtAXEkFKrjEAEpO3pyn1 +tYe8Hlry3BiqLoLY+j7CwE7W6g3WshJouXCrUiY= +=VWqu +-----END TENDERMINT PRIVATE KEY----- diff --git a/contracts/test/test3.key b/contracts/test/test3.key new file mode 100644 index 000000000..6202cc16e --- /dev/null +++ b/contracts/test/test3.key @@ -0,0 +1,9 @@ +-----BEGIN TENDERMINT PRIVATE KEY----- +kdf: bcrypt +salt: CDAEDE2709FFE1049C3E217BCD179BB2 +type: secp256k1 + +l8hOkMcbc9ugxiUmS3k1wdziq6N+qhas25H0fjWD9tDK/BPn0QkY3pIz39TZJNuf +/l9ImHhYxccWPoyTybKmXEjMaKLpFRZLdu+t844= +=lvXk +-----END TENDERMINT PRIVATE KEY----- diff --git a/integration_test/evm_module/scripts/evm_tests.sh b/integration_test/evm_module/scripts/evm_tests.sh index dedc6f2f8..8507a1019 100755 --- a/integration_test/evm_module/scripts/evm_tests.sh +++ b/integration_test/evm_module/scripts/evm_tests.sh @@ -2,3 +2,4 @@ cd contracts npm ci npx hardhat test --network seilocal test/EVMCompatabilityTest.js npx hardhat test --network seilocal test/EVMPrecompileTest.js +npx hardhat test --network seilocal test/AssociateTest.js \ No newline at end of file diff --git a/x/evm/ante/preprocess.go b/x/evm/ante/preprocess.go index bb0e1d0a2..ef48827d3 100644 --- a/x/evm/ante/preprocess.go +++ b/x/evm/ante/preprocess.go @@ -115,21 +115,7 @@ func (p *EVMPreprocessDecorator) AssociateAddresses(ctx sdk.Context, seiAddr sdk } p.accountKeeper.SetAccount(ctx, acc) } - castAddr := sdk.AccAddress(evmAddr[:]) - castAddrBalances := p.evmKeeper.BankKeeper().GetAllBalances(ctx, castAddr) - if !castAddrBalances.IsZero() { - if err := p.evmKeeper.BankKeeper().SendCoins(ctx, castAddr, seiAddr, castAddrBalances); err != nil { - return err - } - } - castAddrWei := p.evmKeeper.BankKeeper().GetWeiBalance(ctx, castAddr) - if !castAddrWei.IsZero() { - if err := p.evmKeeper.BankKeeper().SendCoinsAndWei(ctx, castAddr, seiAddr, sdk.ZeroInt(), castAddrWei); err != nil { - return err - } - } - p.evmKeeper.AccountKeeper().RemoveAccount(ctx, authtypes.NewBaseAccountWithAddress(castAddr)) - return nil + return migrateBalance(ctx, p.evmKeeper, evmAddr, seiAddr) } // stateless @@ -340,6 +326,24 @@ func NewEVMAddressDecorator(evmKeeper *evmkeeper.Keeper, accountKeeper *accountk return &EVMAddressDecorator{evmKeeper: evmKeeper, accountKeeper: accountKeeper} } +func migrateBalance(ctx sdk.Context, evmKeeper *evmkeeper.Keeper, evmAddr common.Address, seiAddr sdk.AccAddress) error { + castAddr := sdk.AccAddress(evmAddr[:]) + castAddrBalances := evmKeeper.BankKeeper().GetAllBalances(ctx, castAddr) + if !castAddrBalances.IsZero() { + if err := evmKeeper.BankKeeper().SendCoins(ctx, castAddr, seiAddr, castAddrBalances); err != nil { + return err + } + } + castAddrWei := evmKeeper.BankKeeper().GetWeiBalance(ctx, castAddr) + if !castAddrWei.IsZero() { + if err := evmKeeper.BankKeeper().SendCoinsAndWei(ctx, castAddr, seiAddr, sdk.ZeroInt(), castAddrWei); err != nil { + return err + } + } + evmKeeper.AccountKeeper().RemoveAccount(ctx, authtypes.NewBaseAccountWithAddress(castAddr)) + return nil +} + //nolint:revive func (p *EVMAddressDecorator) AnteHandle(ctx sdk.Context, tx sdk.Tx, simulate bool, next sdk.AnteHandler) (sdk.Context, error) { sigTx, ok := tx.(authsigning.SigVerifiableTx) @@ -367,6 +371,10 @@ func (p *EVMAddressDecorator) AnteHandle(ctx sdk.Context, tx sdk.Tx, simulate bo continue } p.evmKeeper.SetAddressMapping(ctx, signer, evmAddr) + if err := migrateBalance(ctx, p.evmKeeper, evmAddr, signer); err != nil { + ctx.Logger().Error(fmt.Sprintf("failed to migrate EVM address balance (%s) %s", evmAddr.Hex(), err)) + return ctx, err + } } return next(ctx, tx, simulate) } From 981f00319ee76938c5bca253c2e8a24216f5b5dd Mon Sep 17 00:00:00 2001 From: codchen Date: Tue, 7 May 2024 11:15:32 +0800 Subject: [PATCH 09/51] Surface precompile error (#1628) --- precompiles/addr/addr.go | 6 ++++++ precompiles/bank/bank.go | 6 ++++++ precompiles/distribution/distribution.go | 6 ++++++ precompiles/gov/gov.go | 6 ++++++ precompiles/ibc/ibc.go | 6 ++++++ precompiles/json/json.go | 6 ++++++ precompiles/oracle/oracle.go | 6 ++++++ precompiles/pointer/pointer.go | 6 ++++++ precompiles/pointer/pointer_test.go | 2 ++ precompiles/pointerview/pointerview.go | 6 ++++++ precompiles/staking/staking.go | 6 ++++++ precompiles/wasmd/wasmd.go | 5 +++++ precompiles/wasmd/wasmd_test.go | 13 +++++++++++++ x/evm/keeper/msg_server.go | 9 +++++++++ x/evm/state/statedb.go | 12 ++++++++++++ 15 files changed, 101 insertions(+) diff --git a/precompiles/addr/addr.go b/precompiles/addr/addr.go index f787a4708..35d70952a 100644 --- a/precompiles/addr/addr.go +++ b/precompiles/addr/addr.go @@ -12,6 +12,7 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/vm" pcommon "github.com/sei-protocol/sei-chain/precompiles/common" + "github.com/sei-protocol/sei-chain/x/evm/state" ) const ( @@ -93,6 +94,11 @@ func (p Precompile) GetName() string { } func (p Precompile) Run(evm *vm.EVM, _ common.Address, _ common.Address, input []byte, value *big.Int, _ bool) (bz []byte, err error) { + defer func() { + if err != nil { + evm.StateDB.(*state.DBImpl).SetPrecompileError(err) + } + }() ctx, method, args, err := p.Prepare(evm, input) if err != nil { return nil, err diff --git a/precompiles/bank/bank.go b/precompiles/bank/bank.go index da076d46b..82db6a7d4 100644 --- a/precompiles/bank/bank.go +++ b/precompiles/bank/bank.go @@ -13,6 +13,7 @@ import ( "github.com/ethereum/go-ethereum/core/vm" pcommon "github.com/sei-protocol/sei-chain/precompiles/common" "github.com/sei-protocol/sei-chain/utils" + "github.com/sei-protocol/sei-chain/x/evm/state" "github.com/tendermint/tendermint/libs/log" ) @@ -131,6 +132,11 @@ func (p Precompile) GetName() string { } func (p Precompile) Run(evm *vm.EVM, caller common.Address, callingContract common.Address, input []byte, value *big.Int, readOnly bool) (bz []byte, err error) { + defer func() { + if err != nil { + evm.StateDB.(*state.DBImpl).SetPrecompileError(err) + } + }() ctx, method, args, err := p.Prepare(evm, input) if err != nil { return nil, err diff --git a/precompiles/distribution/distribution.go b/precompiles/distribution/distribution.go index 08ff3ee5b..5fe383b5d 100644 --- a/precompiles/distribution/distribution.go +++ b/precompiles/distribution/distribution.go @@ -12,6 +12,7 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/vm" pcommon "github.com/sei-protocol/sei-chain/precompiles/common" + "github.com/sei-protocol/sei-chain/x/evm/state" ) const ( @@ -101,6 +102,11 @@ func (p Precompile) GetName() string { } func (p Precompile) Run(evm *vm.EVM, caller common.Address, callingContract common.Address, input []byte, value *big.Int, readOnly bool) (bz []byte, err error) { + defer func() { + if err != nil { + evm.StateDB.(*state.DBImpl).SetPrecompileError(err) + } + }() if readOnly { return nil, errors.New("cannot call distr precompile from staticcall") } diff --git a/precompiles/gov/gov.go b/precompiles/gov/gov.go index 096165fcb..48890f0ea 100644 --- a/precompiles/gov/gov.go +++ b/precompiles/gov/gov.go @@ -13,6 +13,7 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/vm" pcommon "github.com/sei-protocol/sei-chain/precompiles/common" + "github.com/sei-protocol/sei-chain/x/evm/state" ) const ( @@ -104,6 +105,11 @@ func (p Precompile) GetName() string { } func (p Precompile) Run(evm *vm.EVM, caller common.Address, callingContract common.Address, input []byte, value *big.Int, readOnly bool) (bz []byte, err error) { + defer func() { + if err != nil { + evm.StateDB.(*state.DBImpl).SetPrecompileError(err) + } + }() if readOnly { return nil, errors.New("cannot call gov precompile from staticcall") } diff --git a/precompiles/ibc/ibc.go b/precompiles/ibc/ibc.go index 9d84be672..089f56ffe 100644 --- a/precompiles/ibc/ibc.go +++ b/precompiles/ibc/ibc.go @@ -12,6 +12,7 @@ import ( "github.com/cosmos/cosmos-sdk/types/bech32" "github.com/sei-protocol/sei-chain/utils" + "github.com/sei-protocol/sei-chain/x/evm/state" sdk "github.com/cosmos/cosmos-sdk/types" clienttypes "github.com/cosmos/ibc-go/v3/modules/core/02-client/types" @@ -113,6 +114,11 @@ func (p Precompile) RequiredGas(input []byte) uint64 { } func (p Precompile) RunAndCalculateGas(evm *vm.EVM, caller common.Address, callingContract common.Address, input []byte, suppliedGas uint64, value *big.Int, _ *tracing.Hooks, readOnly bool) (ret []byte, remainingGas uint64, err error) { + defer func() { + if err != nil { + evm.StateDB.(*state.DBImpl).SetPrecompileError(err) + } + }() if readOnly { return nil, 0, errors.New("cannot call IBC precompile from staticcall") } diff --git a/precompiles/json/json.go b/precompiles/json/json.go index 0a0344f51..c089013d3 100644 --- a/precompiles/json/json.go +++ b/precompiles/json/json.go @@ -15,6 +15,7 @@ import ( "github.com/ethereum/go-ethereum/core/vm" pcommon "github.com/sei-protocol/sei-chain/precompiles/common" "github.com/sei-protocol/sei-chain/utils" + "github.com/sei-protocol/sei-chain/x/evm/state" ) const ( @@ -93,6 +94,11 @@ func (p Precompile) GetName() string { } func (p Precompile) Run(evm *vm.EVM, _ common.Address, _ common.Address, input []byte, value *big.Int, _ bool) (bz []byte, err error) { + defer func() { + if err != nil { + evm.StateDB.(*state.DBImpl).SetPrecompileError(err) + } + }() ctx, method, args, err := p.Prepare(evm, input) if err != nil { return nil, err diff --git a/precompiles/oracle/oracle.go b/precompiles/oracle/oracle.go index 44c954a59..161c6ea8b 100644 --- a/precompiles/oracle/oracle.go +++ b/precompiles/oracle/oracle.go @@ -11,6 +11,7 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/vm" pcommon "github.com/sei-protocol/sei-chain/precompiles/common" + "github.com/sei-protocol/sei-chain/x/evm/state" "github.com/sei-protocol/sei-chain/x/oracle/types" ) @@ -118,6 +119,11 @@ func (p Precompile) GetName() string { } func (p Precompile) Run(evm *vm.EVM, _ common.Address, _ common.Address, input []byte, value *big.Int, _ bool) (bz []byte, err error) { + defer func() { + if err != nil { + evm.StateDB.(*state.DBImpl).SetPrecompileError(err) + } + }() ctx, method, args, err := p.Prepare(evm, input) if err != nil { return nil, err diff --git a/precompiles/pointer/pointer.go b/precompiles/pointer/pointer.go index 88b933c7f..790e9b762 100644 --- a/precompiles/pointer/pointer.go +++ b/precompiles/pointer/pointer.go @@ -19,6 +19,7 @@ import ( "github.com/sei-protocol/sei-chain/x/evm/artifacts/cw20" "github.com/sei-protocol/sei-chain/x/evm/artifacts/cw721" "github.com/sei-protocol/sei-chain/x/evm/artifacts/native" + "github.com/sei-protocol/sei-chain/x/evm/state" "github.com/sei-protocol/sei-chain/x/evm/types" ) @@ -98,6 +99,11 @@ func (p Precompile) GetName() string { } func (p Precompile) RunAndCalculateGas(evm *vm.EVM, caller common.Address, callingContract common.Address, input []byte, suppliedGas uint64, value *big.Int, _ *tracing.Hooks, readOnly bool) (ret []byte, remainingGas uint64, err error) { + defer func() { + if err != nil { + evm.StateDB.(*state.DBImpl).SetPrecompileError(err) + } + }() if readOnly { return nil, 0, errors.New("cannot call pointer precompile from staticcall") } diff --git a/precompiles/pointer/pointer_test.go b/precompiles/pointer/pointer_test.go index f621a66c3..3d5f25f6a 100644 --- a/precompiles/pointer/pointer_test.go +++ b/precompiles/pointer/pointer_test.go @@ -36,6 +36,7 @@ func TestAddNative(t *testing.T) { evm := vm.NewEVM(*blockCtx, vm.TxContext{}, statedb, cfg, vm.Config{}) _, g, err := p.RunAndCalculateGas(evm, caller, caller, append(p.AddNativePointerID, args...), suppliedGas, nil, nil, false) require.NotNil(t, err) + require.NotNil(t, statedb.GetPrecompileError()) require.Equal(t, uint64(0), g) _, _, exists := testApp.EvmKeeper.GetERC20NativePointer(statedb.Ctx(), "test") require.False(t, exists) @@ -79,5 +80,6 @@ func TestAddNative(t *testing.T) { evm = vm.NewEVM(*blockCtx, vm.TxContext{}, statedb, cfg, vm.Config{}) _, g, err = p.RunAndCalculateGas(evm, caller, caller, append(p.AddNativePointerID, args...), suppliedGas, nil, nil, false) require.NotNil(t, err) + require.NotNil(t, statedb.GetPrecompileError()) require.Equal(t, uint64(0), g) } diff --git a/precompiles/pointerview/pointerview.go b/precompiles/pointerview/pointerview.go index 6019dd7dd..f56e8ce05 100644 --- a/precompiles/pointerview/pointerview.go +++ b/precompiles/pointerview/pointerview.go @@ -11,6 +11,7 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/vm" pcommon "github.com/sei-protocol/sei-chain/precompiles/common" + "github.com/sei-protocol/sei-chain/x/evm/state" ) const ( @@ -83,6 +84,11 @@ func (p Precompile) GetName() string { } func (p Precompile) Run(evm *vm.EVM, _ common.Address, _ common.Address, input []byte, _ *big.Int, _ bool) (ret []byte, err error) { + defer func() { + if err != nil { + evm.StateDB.(*state.DBImpl).SetPrecompileError(err) + } + }() ctx, method, args, err := p.Prepare(evm, input) if err != nil { return nil, err diff --git a/precompiles/staking/staking.go b/precompiles/staking/staking.go index e828a02ff..c6854613a 100644 --- a/precompiles/staking/staking.go +++ b/precompiles/staking/staking.go @@ -13,6 +13,7 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/vm" pcommon "github.com/sei-protocol/sei-chain/precompiles/common" + "github.com/sei-protocol/sei-chain/x/evm/state" ) const ( @@ -110,6 +111,11 @@ func (p Precompile) GetName() string { } func (p Precompile) Run(evm *vm.EVM, caller common.Address, callingContract common.Address, input []byte, value *big.Int, readOnly bool) (bz []byte, err error) { + defer func() { + if err != nil { + evm.StateDB.(*state.DBImpl).SetPrecompileError(err) + } + }() if readOnly { return nil, errors.New("cannot call staking precompile from staticcall") } diff --git a/precompiles/wasmd/wasmd.go b/precompiles/wasmd/wasmd.go index 52926a26f..e1487883d 100644 --- a/precompiles/wasmd/wasmd.go +++ b/precompiles/wasmd/wasmd.go @@ -130,6 +130,11 @@ func (p Precompile) GetName() string { } func (p Precompile) RunAndCalculateGas(evm *vm.EVM, caller common.Address, callingContract common.Address, input []byte, suppliedGas uint64, value *big.Int, _ *tracing.Hooks, readOnly bool) (ret []byte, remainingGas uint64, err error) { + defer func() { + if err != nil { + evm.StateDB.(*state.DBImpl).SetPrecompileError(err) + } + }() ctx, method, args, err := p.Prepare(evm, input) if err != nil { return nil, 0, err diff --git a/precompiles/wasmd/wasmd_test.go b/precompiles/wasmd/wasmd_test.go index 0950d14c5..3dd069bed 100644 --- a/precompiles/wasmd/wasmd_test.go +++ b/precompiles/wasmd/wasmd_test.go @@ -113,15 +113,20 @@ func TestInstantiate(t *testing.T) { ) _, g, err = p.RunAndCalculateGas(&evm, mockEVMAddr, mockEVMAddr, append(p.InstantiateID, args...), suppliedGas, nil, nil, false) require.NotNil(t, err) + require.NotNil(t, statedb.GetPrecompileError()) require.Equal(t, uint64(0), g) // bad inputs badArgs, _ := instantiateMethod.Inputs.Pack(codeID, "not bech32", []byte("{}"), "test", amtsbz) + statedb.SetPrecompileError(nil) _, _, err = p.RunAndCalculateGas(&evm, mockEVMAddr, mockEVMAddr, append(p.InstantiateID, badArgs...), suppliedGas, nil, nil, false) require.NotNil(t, err) + require.NotNil(t, statedb.GetPrecompileError()) badArgs, _ = instantiateMethod.Inputs.Pack(codeID, mockAddr.String(), []byte("{}"), "test", []byte("bad coins")) + statedb.SetPrecompileError(nil) _, _, err = p.RunAndCalculateGas(&evm, mockEVMAddr, mockEVMAddr, append(p.InstantiateID, badArgs...), suppliedGas, nil, nil, false) require.NotNil(t, err) + require.NotNil(t, statedb.GetPrecompileError()) } func TestExecute(t *testing.T) { @@ -192,24 +197,32 @@ func TestExecute(t *testing.T) { // disallowed delegatecall contractAddrDisallowed := common.BytesToAddress([]byte("contractB")) + statedb.SetPrecompileError(nil) _, _, err = p.RunAndCalculateGas(&evm, mockEVMAddr, contractAddrDisallowed, append(p.ExecuteID, args...), suppliedGas, nil, nil, false) require.NotNil(t, err) + require.NotNil(t, statedb.GetPrecompileError()) // bad contract address args, _ = executeMethod.Inputs.Pack(mockAddr.String(), []byte("{\"echo\":{\"message\":\"test msg\"}}"), amtsbz) + statedb.SetPrecompileError(nil) _, g, err = p.RunAndCalculateGas(&evm, mockEVMAddr, mockEVMAddr, append(p.ExecuteID, args...), suppliedGas, nil, nil, false) require.NotNil(t, err) require.Equal(t, uint64(0), g) + require.NotNil(t, statedb.GetPrecompileError()) // bad inputs args, _ = executeMethod.Inputs.Pack("not bech32", []byte("{\"echo\":{\"message\":\"test msg\"}}"), amtsbz) + statedb.SetPrecompileError(nil) _, g, err = p.RunAndCalculateGas(&evm, mockEVMAddr, mockEVMAddr, append(p.ExecuteID, args...), suppliedGas, nil, nil, false) require.NotNil(t, err) require.Equal(t, uint64(0), g) + require.NotNil(t, statedb.GetPrecompileError()) args, _ = executeMethod.Inputs.Pack(contractAddr.String(), []byte("{\"echo\":{\"message\":\"test msg\"}}"), []byte("bad coins")) + statedb.SetPrecompileError(nil) _, g, err = p.RunAndCalculateGas(&evm, mockEVMAddr, mockEVMAddr, append(p.ExecuteID, args...), suppliedGas, nil, nil, false) require.NotNil(t, err) require.Equal(t, uint64(0), g) + require.NotNil(t, statedb.GetPrecompileError()) } func TestQuery(t *testing.T) { diff --git a/x/evm/keeper/msg_server.go b/x/evm/keeper/msg_server.go index 61aef7074..8bd89f5fc 100644 --- a/x/evm/keeper/msg_server.go +++ b/x/evm/keeper/msg_server.go @@ -243,6 +243,15 @@ func (server msgServer) writeReceipt(ctx sdk.Context, origMsg *types.MsgEVMTrans receipt.Status = uint32(ethtypes.ReceiptStatusFailed) } + if perr := stateDB.GetPrecompileError(); perr != nil { + if receipt.Status > 0 { + ctx.Logger().Error(fmt.Sprintf("Transaction %s succeeded in execution but has precompile error %s", receipt.TxHashHex, perr.Error())) + } else { + // append precompile error to VM error + receipt.VmError = fmt.Sprintf("%s|%s", receipt.VmError, perr.Error()) + } + } + receipt.From = origMsg.Derived.SenderEVMAddr.Hex() return receipt, server.SetReceipt(ctx, tx.Hash(), receipt) diff --git a/x/evm/state/statedb.go b/x/evm/state/statedb.go index 29a61363c..e42d171e7 100644 --- a/x/evm/state/statedb.go +++ b/x/evm/state/statedb.go @@ -22,6 +22,9 @@ type DBImpl struct { // If err is not nil at the end of the execution, the transaction will be rolled // back. err error + // whenever this is set, the same error would also cause EVM to revert, which is + // why we don't put it in `tempState`, since we still want to be able to access it later. + precompileErr error // a temporary address that collects fees for this particular transaction so that there is // no single bottleneck for fee collection. Its account state and balance will be deleted @@ -143,6 +146,7 @@ func (s *DBImpl) Copy() vm.StateDB { coinbaseEvmAddress: s.coinbaseEvmAddress, simulation: s.simulation, err: s.err, + precompileErr: s.precompileErr, logger: s.logger, } } @@ -171,6 +175,14 @@ func (s *DBImpl) Preimages() map[common.Hash][]byte { return map[common.Hash][]byte{} } +func (s *DBImpl) SetPrecompileError(err error) { + s.precompileErr = err +} + +func (s *DBImpl) GetPrecompileError() error { + return s.precompileErr +} + // ** TEST ONLY FUNCTIONS **// func (s *DBImpl) Err() error { return s.err From b7c1875ad5b0f7bd9b8aaac590044fe543cf7b46 Mon Sep 17 00:00:00 2001 From: codchen Date: Tue, 7 May 2024 21:24:12 +0800 Subject: [PATCH 10/51] Always consider CosmWasm contract address as associated (#1633) --- x/evm/keeper/address.go | 7 +++++++ x/evm/keeper/address_test.go | 10 ++++++++++ 2 files changed, 17 insertions(+) diff --git a/x/evm/keeper/address.go b/x/evm/keeper/address.go index 99f13cc1c..2f65f205c 100644 --- a/x/evm/keeper/address.go +++ b/x/evm/keeper/address.go @@ -1,6 +1,7 @@ package keeper import ( + wasmtypes "github.com/CosmWasm/wasmd/x/wasm/types" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/ethereum/go-ethereum/common" "github.com/sei-protocol/sei-chain/x/evm/types" @@ -27,6 +28,12 @@ func (k *Keeper) DeleteAddressMapping(ctx sdk.Context, seiAddress sdk.AccAddress } func (k *Keeper) GetEVMAddress(ctx sdk.Context, seiAddress sdk.AccAddress) (common.Address, bool) { + // CW address has a different length and should always be considered associated + // Note that this association is one-way since CW address is longer than EOA address + // and would need to be cropped. + if len(seiAddress) == wasmtypes.ContractAddrLen { + return common.BytesToAddress(seiAddress), true + } store := ctx.KVStore(k.storeKey) bz := store.Get(types.SeiAddressToEVMAddressKey(seiAddress)) addr := common.Address{} diff --git a/x/evm/keeper/address_test.go b/x/evm/keeper/address_test.go index 825dfb565..9e9142549 100644 --- a/x/evm/keeper/address_test.go +++ b/x/evm/keeper/address_test.go @@ -4,6 +4,8 @@ import ( "bytes" "testing" + wasmkeeper "github.com/CosmWasm/wasmd/x/wasm/keeper" + "github.com/ethereum/go-ethereum/common" "github.com/sei-protocol/sei-chain/testutil/keeper" "github.com/stretchr/testify/require" ) @@ -50,3 +52,11 @@ func TestGetAddressOrDefault(t *testing.T) { defaultSeiAddr := k.GetSeiAddressOrDefault(ctx, evmAddr) require.True(t, bytes.Equal(defaultSeiAddr, evmAddr[:])) } + +func TestGetEVMAddressForCW(t *testing.T) { + k, ctx := keeper.MockEVMKeeper() + cwAddr := wasmkeeper.BuildContractAddress(123, 456) + cwEvmAddr, associated := k.GetEVMAddress(ctx, cwAddr) + require.True(t, associated) + require.Equal(t, common.BytesToAddress(cwAddr), cwEvmAddr) +} From 56732e623b102266bd9b35301d40ea401770b772 Mon Sep 17 00:00:00 2001 From: codchen Date: Tue, 7 May 2024 23:03:53 +0800 Subject: [PATCH 11/51] Add logic to export/import all persistent EVM state (#1636) * add EVM state to genesis * export/import EVM state --- go.mod | 2 + go.sum | 3 + proto/evm/genesis.proto | 26 + x/evm/genesis.go | 61 ++ x/evm/genesis_test.go | 31 +- x/evm/keeper/address.go | 13 + x/evm/keeper/code.go | 12 + x/evm/keeper/keeper.go | 10 + x/evm/keeper/nonce.go | 12 + x/evm/keeper/state.go | 13 + x/evm/module_test.go | 2 +- x/evm/types/genesis.pb.go | 1463 ++++++++++++++++++++++++++++++++++--- 12 files changed, 1534 insertions(+), 114 deletions(-) diff --git a/go.mod b/go.mod index 7f6480208..3383e4767 100644 --- a/go.mod +++ b/go.mod @@ -125,6 +125,7 @@ require ( github.com/fzipp/gocyclo v0.5.1 // indirect github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff // indirect github.com/gballet/go-verkle v0.1.1-0.20231031103413-a67434b50f46 // indirect + github.com/ghodss/yaml v1.0.0 // indirect github.com/go-critic/go-critic v0.6.3 // indirect github.com/go-kit/kit v0.12.0 // indirect github.com/go-kit/log v0.2.1 // indirect @@ -172,6 +173,7 @@ require ( github.com/gostaticanalysis/nilerr v0.1.1 // indirect github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 // indirect github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 // indirect + github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.1 // indirect github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c // indirect github.com/hashicorp/errwrap v1.0.0 // indirect github.com/hashicorp/go-bexpr v0.1.10 // indirect diff --git a/go.sum b/go.sum index c7de0ca4d..4f0b12d30 100644 --- a/go.sum +++ b/go.sum @@ -457,6 +457,7 @@ github.com/gballet/go-verkle v0.1.1-0.20231031103413-a67434b50f46 h1:BAIP2Gihuqh github.com/gballet/go-verkle v0.1.1-0.20231031103413-a67434b50f46/go.mod h1:QNpY22eby74jVhqH4WhDLDwxc/vqsern6pW+u2kbkpc= github.com/getkin/kin-openapi v0.53.0/go.mod h1:7Yn5whZr5kJi6t+kShccXS8ae1APpYTW6yheSwk8Yi4= github.com/ghemawat/stream v0.0.0-20171120220530-696b145b53b9/go.mod h1:106OIgooyS7OzLDOpUGgm9fA3bQENb/cFSyyBmMoJDs= +github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/gin-contrib/sse v0.0.0-20190301062529-5545eab6dad3/go.mod h1:VJ0WA2NBN22VlZ2dKZQPAPnyWw5XTlK1KymzLKsr59s= github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= @@ -765,6 +766,8 @@ github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t github.com/grpc-ecosystem/grpc-gateway v1.12.1/go.mod h1:8XEsbTttt/W+VvjtQhLACqCisSPWTxCZ7sBRjU6iH9c= github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.1 h1:/c3QmbOGMGTOumP2iT/rCwB7b0QDGLKzqOmktBjT+Is= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.1/go.mod h1:5SN9VR2LTsRFsrEC6FHgRbTWrTHu6tqPeKxEQv15giM= github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c h1:6rhixN/i8ZofjG1Y75iExal34USq5p+wiN1tpie8IrU= github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c/go.mod h1:NMPJylDgVpX0MLRlPy15sqSwOFv/U1GZ2m21JhFfek0= github.com/guptarohit/asciigraph v0.5.5/go.mod h1:dYl5wwK4gNsnFf9Zp+l06rFiDZ5YtXM6x7SRWZ3KGag= diff --git a/proto/evm/genesis.proto b/proto/evm/genesis.proto index 6862e42f9..4ce0ae02d 100644 --- a/proto/evm/genesis.proto +++ b/proto/evm/genesis.proto @@ -12,8 +12,34 @@ message AddressAssociation { string eth_address = 2; // Ethereum address } +message Code { + string address = 1; + bytes code = 2; +} + +message ContractState { + string address = 1; + bytes key = 2; + bytes value = 3; +} + +message Nonce { + string address = 1; + uint64 nonce = 2; +} + +message Serialized { + bytes prefix = 1; + bytes key = 2; + bytes value = 3; +} + // GenesisState defines the evm module's genesis state. message GenesisState { Params params = 1 [(gogoproto.nullable) = false]; repeated AddressAssociation address_associations = 2; // List of address associations + repeated Code codes = 3; // List of stored code + repeated ContractState states = 4; // List of contract state + repeated Nonce nonces = 5; + repeated Serialized serialized = 6; } diff --git a/x/evm/genesis.go b/x/evm/genesis.go index 54eacf22d..a32db21ae 100644 --- a/x/evm/genesis.go +++ b/x/evm/genesis.go @@ -5,6 +5,7 @@ import ( "github.com/cosmos/cosmos-sdk/codec" sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/ethereum/go-ethereum/common" "github.com/sei-protocol/sei-chain/x/evm/keeper" "github.com/sei-protocol/sei-chain/x/evm/types" ) @@ -12,11 +13,71 @@ import ( func InitGenesis(ctx sdk.Context, k *keeper.Keeper, genState types.GenesisState) { k.InitGenesis(ctx, genState) k.SetParams(ctx, genState.Params) + for _, aa := range genState.AddressAssociations { + k.SetAddressMapping(ctx, sdk.MustAccAddressFromBech32(aa.SeiAddress), common.HexToAddress(aa.EthAddress)) + } + for _, code := range genState.Codes { + k.SetCode(ctx, common.HexToAddress(code.Address), code.Code) + } + for _, state := range genState.States { + k.SetState(ctx, common.HexToAddress(state.Address), common.BytesToHash(state.Key), common.BytesToHash(state.Value)) + } + for _, nonce := range genState.Nonces { + k.SetNonce(ctx, common.HexToAddress(nonce.Address), nonce.Nonce) + } + for _, serialized := range genState.Serialized { + k.PrefixStore(ctx, serialized.Prefix).Set(serialized.Key, serialized.Value) + } } func ExportGenesis(ctx sdk.Context, k *keeper.Keeper) *types.GenesisState { genesis := types.DefaultGenesis() genesis.Params = k.GetParams(ctx) + k.IterateSeiAddressMapping(ctx, func(evmAddr common.Address, seiAddr sdk.AccAddress) bool { + genesis.AddressAssociations = append(genesis.AddressAssociations, &types.AddressAssociation{ + SeiAddress: seiAddr.String(), + EthAddress: evmAddr.Hex(), + }) + return false + }) + k.IterateAllCode(ctx, func(addr common.Address, code []byte) bool { + genesis.Codes = append(genesis.Codes, &types.Code{ + Address: addr.Hex(), + Code: code, + }) + return false + }) + k.IterateState(ctx, func(addr common.Address, key, val common.Hash) bool { + genesis.States = append(genesis.States, &types.ContractState{ + Address: addr.Hex(), + Key: key[:], + Value: val[:], + }) + return false + }) + k.IterateAllNonces(ctx, func(addr common.Address, nonce uint64) bool { + genesis.Nonces = append(genesis.Nonces, &types.Nonce{ + Address: addr.Hex(), + Nonce: nonce, + }) + return false + }) + for _, prefix := range [][]byte{ + types.ReceiptKeyPrefix, + types.BlockBloomPrefix, + types.TxHashesPrefix, + types.PointerRegistryPrefix, + types.PointerCWCodePrefix, + } { + k.IterateAll(ctx, prefix, func(key, val []byte) bool { + genesis.Serialized = append(genesis.Serialized, &types.Serialized{ + Prefix: prefix, + Key: key, + Value: val, + }) + return false + }) + } return genesis } diff --git a/x/evm/genesis_test.go b/x/evm/genesis_test.go index e2b815129..19a0a9f96 100644 --- a/x/evm/genesis_test.go +++ b/x/evm/genesis_test.go @@ -3,14 +3,28 @@ package evm_test import ( "testing" + "github.com/ethereum/go-ethereum/common" + ethtypes "github.com/ethereum/go-ethereum/core/types" testkeeper "github.com/sei-protocol/sei-chain/testutil/keeper" "github.com/sei-protocol/sei-chain/x/evm" "github.com/sei-protocol/sei-chain/x/evm/types" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" ) -func TestExportGenesis(t *testing.T) { - keeper, ctx := testkeeper.MockEVMKeeper() +func TestExportImportGenesis(t *testing.T) { + keeper, origctx := testkeeper.MockEVMKeeper() + ctx := origctx.WithMultiStore(origctx.MultiStore().CacheMultiStore()) + seiAddr, evmAddr := testkeeper.MockAddressPair() + keeper.SetAddressMapping(ctx, seiAddr, evmAddr) + _, codeAddr := testkeeper.MockAddressPair() + keeper.SetCode(ctx, codeAddr, []byte("abcde")) + keeper.SetState(ctx, codeAddr, common.BytesToHash([]byte("123")), common.BytesToHash([]byte("456"))) + keeper.SetNonce(ctx, evmAddr, 2) + keeper.SetReceipt(ctx, common.BytesToHash([]byte("789")), &types.Receipt{TxType: 2}) + keeper.SetBlockBloom(ctx, 5, []ethtypes.Bloom{{1}}) + keeper.SetTxHashesOnHeight(ctx, 5, []common.Hash{common.BytesToHash([]byte("123"))}) + keeper.SetERC20CW20Pointer(ctx, "cw20addr", codeAddr) genesis := evm.ExportGenesis(ctx, keeper) assert.NoError(t, genesis.Validate()) param := genesis.GetParams() @@ -18,4 +32,17 @@ func TestExportGenesis(t *testing.T) { assert.Equal(t, types.DefaultParams().BaseFeePerGas, param.BaseFeePerGas) assert.Equal(t, types.DefaultParams().MinimumFeePerGas, param.MinimumFeePerGas) assert.Equal(t, types.DefaultParams().WhitelistedCwCodeHashesForDelegateCall, param.WhitelistedCwCodeHashesForDelegateCall) + evm.InitGenesis(origctx, keeper, *genesis) + require.Equal(t, evmAddr, keeper.GetEVMAddressOrDefault(origctx, seiAddr)) + require.Equal(t, keeper.GetCode(ctx, codeAddr), keeper.GetCode(origctx, codeAddr)) + require.Equal(t, keeper.GetCodeHash(ctx, codeAddr), keeper.GetCodeHash(origctx, codeAddr)) + require.Equal(t, keeper.GetCodeSize(ctx, codeAddr), keeper.GetCodeSize(origctx, codeAddr)) + require.Equal(t, keeper.GetState(ctx, codeAddr, common.BytesToHash([]byte("123"))), keeper.GetState(origctx, codeAddr, common.BytesToHash([]byte("123")))) + require.Equal(t, keeper.GetNonce(ctx, evmAddr), keeper.GetNonce(origctx, evmAddr)) + _, err := keeper.GetReceipt(origctx, common.BytesToHash([]byte("789"))) + require.Nil(t, err) + require.Equal(t, keeper.GetBlockBloom(ctx, 5), keeper.GetBlockBloom(origctx, 5)) + require.Equal(t, keeper.GetTxHashesOnHeight(ctx, 5), keeper.GetTxHashesOnHeight(origctx, 5)) + _, _, exists := keeper.GetERC20CW20Pointer(origctx, "cw20addr") + require.True(t, exists) } diff --git a/x/evm/keeper/address.go b/x/evm/keeper/address.go index 2f65f205c..5b67c9102 100644 --- a/x/evm/keeper/address.go +++ b/x/evm/keeper/address.go @@ -2,6 +2,7 @@ package keeper import ( wasmtypes "github.com/CosmWasm/wasmd/x/wasm/types" + "github.com/cosmos/cosmos-sdk/store/prefix" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/ethereum/go-ethereum/common" "github.com/sei-protocol/sei-chain/x/evm/types" @@ -68,3 +69,15 @@ func (k *Keeper) GetSeiAddressOrDefault(ctx sdk.Context, evmAddress common.Addre } return sdk.AccAddress(evmAddress[:]) } + +func (k *Keeper) IterateSeiAddressMapping(ctx sdk.Context, cb func(evmAddr common.Address, seiAddr sdk.AccAddress) bool) { + iter := prefix.NewStore(ctx.KVStore(k.storeKey), types.EVMAddressToSeiAddressKeyPrefix).Iterator(nil, nil) + defer iter.Close() + for ; iter.Valid(); iter.Next() { + evmAddr := common.BytesToAddress(iter.Key()) + seiAddr := sdk.AccAddress(iter.Value()) + if cb(evmAddr, seiAddr) { + break + } + } +} diff --git a/x/evm/keeper/code.go b/x/evm/keeper/code.go index d2412f26d..be7d1fe20 100644 --- a/x/evm/keeper/code.go +++ b/x/evm/keeper/code.go @@ -3,6 +3,7 @@ package keeper import ( "encoding/binary" + "github.com/cosmos/cosmos-sdk/store/prefix" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/ethereum/go-ethereum/common" ethtypes "github.com/ethereum/go-ethereum/core/types" @@ -48,3 +49,14 @@ func (k *Keeper) GetCodeSize(ctx sdk.Context, addr common.Address) int { } return int(binary.BigEndian.Uint64(bz)) } + +func (k *Keeper) IterateAllCode(ctx sdk.Context, cb func(addr common.Address, code []byte) bool) { + iter := prefix.NewStore(ctx.KVStore(k.storeKey), types.CodeKeyPrefix).Iterator(nil, nil) + defer iter.Close() + for ; iter.Valid(); iter.Next() { + evmAddr := common.BytesToAddress(iter.Key()) + if cb(evmAddr, iter.Value()) { + break + } + } +} diff --git a/x/evm/keeper/keeper.go b/x/evm/keeper/keeper.go index 209732843..b019f9c09 100644 --- a/x/evm/keeper/keeper.go +++ b/x/evm/keeper/keeper.go @@ -153,6 +153,16 @@ func (k *Keeper) GetStoreKey() sdk.StoreKey { return k.storeKey } +func (k *Keeper) IterateAll(ctx sdk.Context, pref []byte, cb func(key, val []byte) bool) { + iter := k.PrefixStore(ctx, pref).Iterator(nil, nil) + defer iter.Close() + for ; iter.Valid(); iter.Next() { + if cb(iter.Key(), iter.Value()) { + break + } + } +} + func (k *Keeper) PrefixStore(ctx sdk.Context, pref []byte) sdk.KVStore { store := ctx.KVStore(k.GetStoreKey()) return prefix.NewStore(store, pref) diff --git a/x/evm/keeper/nonce.go b/x/evm/keeper/nonce.go index 27e937ee4..253f66548 100644 --- a/x/evm/keeper/nonce.go +++ b/x/evm/keeper/nonce.go @@ -3,6 +3,7 @@ package keeper import ( "encoding/binary" + "github.com/cosmos/cosmos-sdk/store/prefix" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/ethereum/go-ethereum/common" "github.com/sei-protocol/sei-chain/x/evm/types" @@ -21,3 +22,14 @@ func (k *Keeper) SetNonce(ctx sdk.Context, addr common.Address, nonce uint64) { binary.BigEndian.PutUint64(length, nonce) k.PrefixStore(ctx, types.NonceKeyPrefix).Set(addr[:], length) } + +func (k *Keeper) IterateAllNonces(ctx sdk.Context, cb func(addr common.Address, nonce uint64) bool) { + iter := prefix.NewStore(ctx.KVStore(k.storeKey), types.NonceKeyPrefix).Iterator(nil, nil) + defer iter.Close() + for ; iter.Valid(); iter.Next() { + evmAddr := common.BytesToAddress(iter.Key()) + if cb(evmAddr, binary.BigEndian.Uint64(iter.Value())) { + break + } + } +} diff --git a/x/evm/keeper/state.go b/x/evm/keeper/state.go index 2cd0ab722..b2279bb41 100644 --- a/x/evm/keeper/state.go +++ b/x/evm/keeper/state.go @@ -1,6 +1,7 @@ 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/sei-protocol/sei-chain/x/evm/types" @@ -29,3 +30,15 @@ func (k *Keeper) GetState(ctx sdk.Context, addr common.Address, hash common.Hash func (k *Keeper) SetState(ctx sdk.Context, addr common.Address, key common.Hash, val common.Hash) { k.PrefixStore(ctx, types.StateKey(addr)).Set(key[:], val[:]) } + +func (k *Keeper) IterateState(ctx sdk.Context, cb func(addr common.Address, key common.Hash, val common.Hash) bool) { + iter := prefix.NewStore(ctx.KVStore(k.storeKey), types.StateKeyPrefix).Iterator(nil, nil) + defer iter.Close() + for ; iter.Valid(); iter.Next() { + k := iter.Key() + evmAddr := common.BytesToAddress(k[:common.AddressLength]) + if cb(evmAddr, common.BytesToHash(k[common.AddressLength:]), common.BytesToHash(iter.Value())) { + break + } + } +} diff --git a/x/evm/module_test.go b/x/evm/module_test.go index 8456c5cba..d64095ee0 100644 --- a/x/evm/module_test.go +++ b/x/evm/module_test.go @@ -45,7 +45,7 @@ func TestModuleExportGenesis(t *testing.T) { module := evm.NewAppModule(nil, k) jsonMsg := module.ExportGenesis(ctx, types.ModuleCdc) jsonStr := string(jsonMsg) - assert.Equal(t, "{\"params\":{\"priority_normalizer\":\"1.000000000000000000\",\"base_fee_per_gas\":\"0.000000000000000000\",\"minimum_fee_per_gas\":\"1000000000.000000000000000000\",\"whitelisted_cw_code_hashes_for_delegate_call\":[\"ol1416zS7kfMOcIk4WL+ebU+a75u0qVujAqGWT6+YQI=\",\"lM3Zw+hcJvfOxDwjv7SzsrLXGgqNhcWN8S/+wHQf68g=\"]},\"address_associations\":[]}", jsonStr) + assert.Equal(t, "{\"params\":{\"priority_normalizer\":\"1.000000000000000000\",\"base_fee_per_gas\":\"0.000000000000000000\",\"minimum_fee_per_gas\":\"1000000000.000000000000000000\",\"whitelisted_cw_code_hashes_for_delegate_call\":[\"ol1416zS7kfMOcIk4WL+ebU+a75u0qVujAqGWT6+YQI=\",\"lM3Zw+hcJvfOxDwjv7SzsrLXGgqNhcWN8S/+wHQf68g=\"]},\"address_associations\":[{\"sei_address\":\"sei17xpfvakm2amg962yls6f84z3kell8c5la4jkdu\",\"eth_address\":\"0x27F7B8B8B5A4e71E8E9aA671f4e4031E3773303F\"}],\"codes\":[],\"states\":[],\"nonces\":[],\"serialized\":[{\"prefix\":\"Fg==\",\"key\":\"AwAB\",\"value\":\"AAAAAAAAAAM=\"},{\"prefix\":\"Fg==\",\"key\":\"BAAB\",\"value\":\"AAAAAAAAAAQ=\"}]}", jsonStr) } func TestConsensusVersion(t *testing.T) { diff --git a/x/evm/types/genesis.pb.go b/x/evm/types/genesis.pb.go index 5b00c8a07..00b8fbf54 100644 --- a/x/evm/types/genesis.pb.go +++ b/x/evm/types/genesis.pb.go @@ -76,17 +76,245 @@ func (m *AddressAssociation) GetEthAddress() string { return "" } +type Code struct { + Address string `protobuf:"bytes,1,opt,name=address,proto3" json:"address,omitempty"` + Code []byte `protobuf:"bytes,2,opt,name=code,proto3" json:"code,omitempty"` +} + +func (m *Code) Reset() { *m = Code{} } +func (m *Code) String() string { return proto.CompactTextString(m) } +func (*Code) ProtoMessage() {} +func (*Code) Descriptor() ([]byte, []int) { + return fileDescriptor_9f044f30507c97ed, []int{1} +} +func (m *Code) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *Code) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_Code.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 *Code) XXX_Merge(src proto.Message) { + xxx_messageInfo_Code.Merge(m, src) +} +func (m *Code) XXX_Size() int { + return m.Size() +} +func (m *Code) XXX_DiscardUnknown() { + xxx_messageInfo_Code.DiscardUnknown(m) +} + +var xxx_messageInfo_Code proto.InternalMessageInfo + +func (m *Code) GetAddress() string { + if m != nil { + return m.Address + } + return "" +} + +func (m *Code) GetCode() []byte { + if m != nil { + return m.Code + } + return nil +} + +type ContractState struct { + Address string `protobuf:"bytes,1,opt,name=address,proto3" json:"address,omitempty"` + Key []byte `protobuf:"bytes,2,opt,name=key,proto3" json:"key,omitempty"` + Value []byte `protobuf:"bytes,3,opt,name=value,proto3" json:"value,omitempty"` +} + +func (m *ContractState) Reset() { *m = ContractState{} } +func (m *ContractState) String() string { return proto.CompactTextString(m) } +func (*ContractState) ProtoMessage() {} +func (*ContractState) Descriptor() ([]byte, []int) { + return fileDescriptor_9f044f30507c97ed, []int{2} +} +func (m *ContractState) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ContractState) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_ContractState.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 *ContractState) XXX_Merge(src proto.Message) { + xxx_messageInfo_ContractState.Merge(m, src) +} +func (m *ContractState) XXX_Size() int { + return m.Size() +} +func (m *ContractState) XXX_DiscardUnknown() { + xxx_messageInfo_ContractState.DiscardUnknown(m) +} + +var xxx_messageInfo_ContractState proto.InternalMessageInfo + +func (m *ContractState) GetAddress() string { + if m != nil { + return m.Address + } + return "" +} + +func (m *ContractState) GetKey() []byte { + if m != nil { + return m.Key + } + return nil +} + +func (m *ContractState) GetValue() []byte { + if m != nil { + return m.Value + } + return nil +} + +type Nonce struct { + Address string `protobuf:"bytes,1,opt,name=address,proto3" json:"address,omitempty"` + Nonce uint64 `protobuf:"varint,2,opt,name=nonce,proto3" json:"nonce,omitempty"` +} + +func (m *Nonce) Reset() { *m = Nonce{} } +func (m *Nonce) String() string { return proto.CompactTextString(m) } +func (*Nonce) ProtoMessage() {} +func (*Nonce) Descriptor() ([]byte, []int) { + return fileDescriptor_9f044f30507c97ed, []int{3} +} +func (m *Nonce) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *Nonce) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_Nonce.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 *Nonce) XXX_Merge(src proto.Message) { + xxx_messageInfo_Nonce.Merge(m, src) +} +func (m *Nonce) XXX_Size() int { + return m.Size() +} +func (m *Nonce) XXX_DiscardUnknown() { + xxx_messageInfo_Nonce.DiscardUnknown(m) +} + +var xxx_messageInfo_Nonce proto.InternalMessageInfo + +func (m *Nonce) GetAddress() string { + if m != nil { + return m.Address + } + return "" +} + +func (m *Nonce) GetNonce() uint64 { + if m != nil { + return m.Nonce + } + return 0 +} + +type Serialized struct { + Prefix []byte `protobuf:"bytes,1,opt,name=prefix,proto3" json:"prefix,omitempty"` + Key []byte `protobuf:"bytes,2,opt,name=key,proto3" json:"key,omitempty"` + Value []byte `protobuf:"bytes,3,opt,name=value,proto3" json:"value,omitempty"` +} + +func (m *Serialized) Reset() { *m = Serialized{} } +func (m *Serialized) String() string { return proto.CompactTextString(m) } +func (*Serialized) ProtoMessage() {} +func (*Serialized) Descriptor() ([]byte, []int) { + return fileDescriptor_9f044f30507c97ed, []int{4} +} +func (m *Serialized) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *Serialized) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_Serialized.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 *Serialized) XXX_Merge(src proto.Message) { + xxx_messageInfo_Serialized.Merge(m, src) +} +func (m *Serialized) XXX_Size() int { + return m.Size() +} +func (m *Serialized) XXX_DiscardUnknown() { + xxx_messageInfo_Serialized.DiscardUnknown(m) +} + +var xxx_messageInfo_Serialized proto.InternalMessageInfo + +func (m *Serialized) GetPrefix() []byte { + if m != nil { + return m.Prefix + } + return nil +} + +func (m *Serialized) GetKey() []byte { + if m != nil { + return m.Key + } + return nil +} + +func (m *Serialized) GetValue() []byte { + if m != nil { + return m.Value + } + return nil +} + // GenesisState defines the evm module's genesis state. type GenesisState struct { Params Params `protobuf:"bytes,1,opt,name=params,proto3" json:"params"` AddressAssociations []*AddressAssociation `protobuf:"bytes,2,rep,name=address_associations,json=addressAssociations,proto3" json:"address_associations,omitempty"` + Codes []*Code `protobuf:"bytes,3,rep,name=codes,proto3" json:"codes,omitempty"` + States []*ContractState `protobuf:"bytes,4,rep,name=states,proto3" json:"states,omitempty"` + Nonces []*Nonce `protobuf:"bytes,5,rep,name=nonces,proto3" json:"nonces,omitempty"` + Serialized []*Serialized `protobuf:"bytes,6,rep,name=serialized,proto3" json:"serialized,omitempty"` } 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_9f044f30507c97ed, []int{1} + return fileDescriptor_9f044f30507c97ed, []int{5} } func (m *GenesisState) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -129,33 +357,76 @@ func (m *GenesisState) GetAddressAssociations() []*AddressAssociation { return nil } +func (m *GenesisState) GetCodes() []*Code { + if m != nil { + return m.Codes + } + return nil +} + +func (m *GenesisState) GetStates() []*ContractState { + if m != nil { + return m.States + } + return nil +} + +func (m *GenesisState) GetNonces() []*Nonce { + if m != nil { + return m.Nonces + } + return nil +} + +func (m *GenesisState) GetSerialized() []*Serialized { + if m != nil { + return m.Serialized + } + return nil +} + func init() { proto.RegisterType((*AddressAssociation)(nil), "seiprotocol.seichain.evm.AddressAssociation") + proto.RegisterType((*Code)(nil), "seiprotocol.seichain.evm.Code") + proto.RegisterType((*ContractState)(nil), "seiprotocol.seichain.evm.ContractState") + proto.RegisterType((*Nonce)(nil), "seiprotocol.seichain.evm.Nonce") + proto.RegisterType((*Serialized)(nil), "seiprotocol.seichain.evm.Serialized") proto.RegisterType((*GenesisState)(nil), "seiprotocol.seichain.evm.GenesisState") } func init() { proto.RegisterFile("evm/genesis.proto", fileDescriptor_9f044f30507c97ed) } var fileDescriptor_9f044f30507c97ed = []byte{ - // 284 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x74, 0x90, 0xb1, 0x4e, 0xc3, 0x30, - 0x10, 0x86, 0x63, 0x40, 0x95, 0x70, 0x18, 0x20, 0x74, 0xa8, 0x3a, 0xb8, 0x55, 0xa7, 0x0e, 0xd4, - 0x91, 0xca, 0x8e, 0xd4, 0x2e, 0x5d, 0x51, 0x90, 0x18, 0x58, 0x22, 0x37, 0x3d, 0x25, 0x27, 0x91, - 0x38, 0xca, 0x99, 0x0a, 0xde, 0x82, 0x37, 0xe1, 0x35, 0x3a, 0x76, 0x64, 0x42, 0x28, 0x79, 0x11, - 0x14, 0xc7, 0xc0, 0x50, 0x75, 0x3b, 0xfb, 0xff, 0xfc, 0xff, 0xbf, 0x8f, 0x5f, 0xc1, 0x36, 0x0f, - 0x53, 0x28, 0x80, 0x90, 0x64, 0x59, 0x69, 0xa3, 0x83, 0x01, 0x01, 0xda, 0x29, 0xd1, 0xcf, 0x92, - 0x00, 0x93, 0x4c, 0x61, 0x21, 0x61, 0x9b, 0x0f, 0xfb, 0xa9, 0x4e, 0xb5, 0x95, 0xc2, 0x76, 0xea, - 0xf8, 0xe1, 0x65, 0x6b, 0x51, 0xaa, 0x4a, 0xe5, 0xce, 0x61, 0xf2, 0xc8, 0x83, 0xc5, 0x66, 0x53, - 0x01, 0xd1, 0x82, 0x48, 0x27, 0xa8, 0x0c, 0xea, 0x22, 0x18, 0x71, 0x9f, 0x00, 0x63, 0xd5, 0x29, - 0x03, 0x36, 0x66, 0xd3, 0xf3, 0x88, 0x13, 0xa0, 0x63, 0x5b, 0x00, 0x4c, 0xf6, 0x07, 0x9c, 0x74, - 0x00, 0x98, 0xcc, 0x01, 0x93, 0x0f, 0xc6, 0x2f, 0x56, 0x5d, 0xd7, 0x07, 0xa3, 0x0c, 0x04, 0x77, - 0xbc, 0xd7, 0x05, 0x5b, 0x37, 0x7f, 0x3e, 0x96, 0xc7, 0xba, 0xcb, 0x7b, 0xcb, 0x2d, 0xcf, 0x76, - 0x5f, 0x23, 0x2f, 0x72, 0xaf, 0x82, 0x98, 0xf7, 0x5d, 0x5a, 0xac, 0xfe, 0x9b, 0xb6, 0xd1, 0xa7, - 0x53, 0x7f, 0x7e, 0x73, 0xdc, 0xed, 0xf0, 0x7b, 0xd1, 0xb5, 0x3a, 0xb8, 0xa3, 0xe5, 0x6a, 0x57, - 0x0b, 0xb6, 0xaf, 0x05, 0xfb, 0xae, 0x05, 0x7b, 0x6f, 0x84, 0xb7, 0x6f, 0x84, 0xf7, 0xd9, 0x08, - 0xef, 0x69, 0x96, 0xa2, 0xc9, 0x5e, 0xd6, 0x32, 0xd1, 0x79, 0x48, 0x80, 0xb3, 0xdf, 0x1c, 0x7b, - 0xb0, 0x41, 0xe1, 0x6b, 0xd8, 0x6e, 0xd6, 0xbc, 0x95, 0x40, 0xeb, 0x9e, 0xd5, 0x6f, 0x7f, 0x02, - 0x00, 0x00, 0xff, 0xff, 0x71, 0xa9, 0x4b, 0x46, 0xb0, 0x01, 0x00, 0x00, + // 461 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x93, 0xcf, 0x6b, 0x13, 0x41, + 0x14, 0xc7, 0x13, 0xf7, 0x87, 0xf8, 0x12, 0xa1, 0x8e, 0x41, 0x96, 0x1e, 0x36, 0x65, 0x11, 0xec, + 0xc1, 0xee, 0x42, 0x2d, 0xf4, 0xa6, 0xb4, 0x15, 0x7a, 0x11, 0xd1, 0x29, 0x78, 0xf0, 0x12, 0xa6, + 0xbb, 0xcf, 0x64, 0x30, 0xd9, 0x09, 0xfb, 0xa6, 0xa1, 0xf5, 0xaf, 0xf0, 0x9f, 0xf0, 0x7f, 0xe9, + 0xb1, 0x47, 0x4f, 0x22, 0xc9, 0x3f, 0x22, 0xf3, 0x76, 0xfb, 0x43, 0xca, 0x86, 0xde, 0xde, 0xdb, + 0xf9, 0x7e, 0x3f, 0xcc, 0xe4, 0x43, 0xe0, 0x19, 0x2e, 0x66, 0xd9, 0x18, 0x4b, 0x24, 0x4d, 0xe9, + 0xbc, 0x32, 0xd6, 0x88, 0x88, 0x50, 0xf3, 0x94, 0x9b, 0x69, 0x4a, 0xa8, 0xf3, 0x89, 0xd2, 0x65, + 0x8a, 0x8b, 0xd9, 0xe6, 0x60, 0x6c, 0xc6, 0x86, 0x8f, 0x32, 0x37, 0xd5, 0xf9, 0xcd, 0x0d, 0x87, + 0x98, 0xab, 0x4a, 0xcd, 0x1a, 0x42, 0xf2, 0x05, 0xc4, 0x41, 0x51, 0x54, 0x48, 0x74, 0x40, 0x64, + 0x72, 0xad, 0xac, 0x36, 0xa5, 0x18, 0x42, 0x8f, 0x50, 0x8f, 0x54, 0x7d, 0x12, 0x75, 0xb7, 0xba, + 0xdb, 0x4f, 0x24, 0x10, 0xea, 0x26, 0xeb, 0x02, 0x68, 0x27, 0x37, 0x81, 0x47, 0x75, 0x00, 0xed, + 0xa4, 0x09, 0x24, 0x7b, 0xe0, 0x1f, 0x99, 0x02, 0x45, 0x04, 0x8f, 0xff, 0xa7, 0x5c, 0xaf, 0x42, + 0x80, 0x9f, 0x9b, 0x02, 0xb9, 0xdb, 0x97, 0x3c, 0x27, 0x9f, 0xe1, 0xe9, 0x91, 0x29, 0x6d, 0xa5, + 0x72, 0x7b, 0x62, 0x95, 0x5d, 0x57, 0xdf, 0x00, 0xef, 0x3b, 0x5e, 0x34, 0x6d, 0x37, 0x8a, 0x01, + 0x04, 0x0b, 0x35, 0x3d, 0xc3, 0xc8, 0xe3, 0x6f, 0xf5, 0x92, 0xec, 0x43, 0xf0, 0xd1, 0x94, 0xf9, + 0x3a, 0xd4, 0x00, 0x82, 0xd2, 0x45, 0x18, 0xe6, 0xcb, 0x7a, 0x49, 0x3e, 0x00, 0x9c, 0x60, 0xa5, + 0xd5, 0x54, 0xff, 0xc0, 0x42, 0xbc, 0x80, 0x70, 0x5e, 0xe1, 0x37, 0x7d, 0xce, 0xe5, 0xbe, 0x6c, + 0xb6, 0x07, 0x5f, 0xe3, 0x97, 0x07, 0xfd, 0xe3, 0xda, 0x5d, 0xfd, 0xb2, 0xb7, 0x10, 0xd6, 0x22, + 0x18, 0xd8, 0xdb, 0xdd, 0x4a, 0xdb, 0x5c, 0xa6, 0x9f, 0x38, 0x77, 0xe8, 0x5f, 0xfe, 0x19, 0x76, + 0x64, 0xd3, 0x12, 0x23, 0x18, 0x34, 0xf7, 0x1f, 0xa9, 0x5b, 0x73, 0x4e, 0x85, 0xb7, 0xdd, 0xdb, + 0x7d, 0xdd, 0x4e, 0xbb, 0xaf, 0x5b, 0x3e, 0x57, 0xf7, 0xbe, 0x91, 0xd8, 0x83, 0xc0, 0x39, 0xa1, + 0xc8, 0x63, 0x62, 0xdc, 0x4e, 0x74, 0xa2, 0x65, 0x1d, 0x16, 0xef, 0x20, 0x24, 0xf7, 0x3e, 0x8a, + 0x7c, 0xae, 0xbd, 0x5a, 0x57, 0xbb, 0x63, 0x5a, 0x36, 0x35, 0xb1, 0x0f, 0x21, 0xff, 0xfe, 0x14, + 0x05, 0x0c, 0x18, 0xb6, 0x03, 0xd8, 0xab, 0x6c, 0xe2, 0xe2, 0x3d, 0x00, 0xdd, 0xf8, 0x8a, 0x42, + 0x2e, 0xbf, 0x6c, 0x2f, 0xdf, 0xba, 0x95, 0x77, 0x7a, 0x87, 0xc7, 0x97, 0xcb, 0xb8, 0x7b, 0xb5, + 0x8c, 0xbb, 0x7f, 0x97, 0x71, 0xf7, 0xe7, 0x2a, 0xee, 0x5c, 0xad, 0xe2, 0xce, 0xef, 0x55, 0xdc, + 0xf9, 0xba, 0x33, 0xd6, 0x76, 0x72, 0x76, 0x9a, 0xe6, 0x66, 0x96, 0x11, 0xea, 0x9d, 0x6b, 0x2c, + 0x2f, 0xcc, 0xcd, 0xce, 0x33, 0xf7, 0xff, 0xb2, 0x17, 0x73, 0xa4, 0xd3, 0x90, 0xcf, 0xdf, 0xfc, + 0x0b, 0x00, 0x00, 0xff, 0xff, 0x58, 0x59, 0xc2, 0xfb, 0xb6, 0x03, 0x00, 0x00, } func (m *AddressAssociation) Marshal() (dAtA []byte, err error) { @@ -195,7 +466,7 @@ func (m *AddressAssociation) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } -func (m *GenesisState) Marshal() (dAtA []byte, err error) { +func (m *Code) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -205,95 +476,891 @@ func (m *GenesisState) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *GenesisState) MarshalTo(dAtA []byte) (int, error) { +func (m *Code) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *GenesisState) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *Code) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int _ = l - if len(m.AddressAssociations) > 0 { - for iNdEx := len(m.AddressAssociations) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.AddressAssociations[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err + if len(m.Code) > 0 { + i -= len(m.Code) + copy(dAtA[i:], m.Code) + i = encodeVarintGenesis(dAtA, i, uint64(len(m.Code))) + i-- + dAtA[i] = 0x12 + } + if len(m.Address) > 0 { + i -= len(m.Address) + copy(dAtA[i:], m.Address) + i = encodeVarintGenesis(dAtA, i, uint64(len(m.Address))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *ContractState) 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 *ContractState) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ContractState) 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 = encodeVarintGenesis(dAtA, i, uint64(len(m.Value))) + i-- + dAtA[i] = 0x1a + } + if len(m.Key) > 0 { + i -= len(m.Key) + copy(dAtA[i:], m.Key) + i = encodeVarintGenesis(dAtA, i, uint64(len(m.Key))) + i-- + dAtA[i] = 0x12 + } + if len(m.Address) > 0 { + i -= len(m.Address) + copy(dAtA[i:], m.Address) + i = encodeVarintGenesis(dAtA, i, uint64(len(m.Address))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *Nonce) 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 *Nonce) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Nonce) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.Nonce != 0 { + i = encodeVarintGenesis(dAtA, i, uint64(m.Nonce)) + i-- + dAtA[i] = 0x10 + } + if len(m.Address) > 0 { + i -= len(m.Address) + copy(dAtA[i:], m.Address) + i = encodeVarintGenesis(dAtA, i, uint64(len(m.Address))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *Serialized) 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 *Serialized) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Serialized) 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 = encodeVarintGenesis(dAtA, i, uint64(len(m.Value))) + i-- + dAtA[i] = 0x1a + } + if len(m.Key) > 0 { + i -= len(m.Key) + copy(dAtA[i:], m.Key) + i = encodeVarintGenesis(dAtA, i, uint64(len(m.Key))) + i-- + dAtA[i] = 0x12 + } + if len(m.Prefix) > 0 { + i -= len(m.Prefix) + copy(dAtA[i:], m.Prefix) + i = encodeVarintGenesis(dAtA, i, uint64(len(m.Prefix))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +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.Serialized) > 0 { + for iNdEx := len(m.Serialized) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Serialized[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenesis(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x32 + } + } + if len(m.Nonces) > 0 { + for iNdEx := len(m.Nonces) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Nonces[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenesis(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x2a + } + } + if len(m.States) > 0 { + for iNdEx := len(m.States) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.States[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenesis(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x22 + } + } + if len(m.Codes) > 0 { + for iNdEx := len(m.Codes) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Codes[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.AddressAssociations) > 0 { + for iNdEx := len(m.AddressAssociations) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.AddressAssociations[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 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 *AddressAssociation) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.SeiAddress) + if l > 0 { + n += 1 + l + sovGenesis(uint64(l)) + } + l = len(m.EthAddress) + if l > 0 { + n += 1 + l + sovGenesis(uint64(l)) + } + return n +} + +func (m *Code) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Address) + if l > 0 { + n += 1 + l + sovGenesis(uint64(l)) + } + l = len(m.Code) + if l > 0 { + n += 1 + l + sovGenesis(uint64(l)) + } + return n +} + +func (m *ContractState) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Address) + if l > 0 { + n += 1 + l + sovGenesis(uint64(l)) + } + l = len(m.Key) + if l > 0 { + n += 1 + l + sovGenesis(uint64(l)) + } + l = len(m.Value) + if l > 0 { + n += 1 + l + sovGenesis(uint64(l)) + } + return n +} + +func (m *Nonce) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Address) + if l > 0 { + n += 1 + l + sovGenesis(uint64(l)) + } + if m.Nonce != 0 { + n += 1 + sovGenesis(uint64(m.Nonce)) + } + return n +} + +func (m *Serialized) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Prefix) + if l > 0 { + n += 1 + l + sovGenesis(uint64(l)) + } + l = len(m.Key) + if l > 0 { + n += 1 + l + sovGenesis(uint64(l)) + } + l = len(m.Value) + if l > 0 { + n += 1 + l + sovGenesis(uint64(l)) + } + return n +} + +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.AddressAssociations) > 0 { + for _, e := range m.AddressAssociations { + l = e.Size() + n += 1 + l + sovGenesis(uint64(l)) + } + } + if len(m.Codes) > 0 { + for _, e := range m.Codes { + l = e.Size() + n += 1 + l + sovGenesis(uint64(l)) + } + } + if len(m.States) > 0 { + for _, e := range m.States { + l = e.Size() + n += 1 + l + sovGenesis(uint64(l)) + } + } + if len(m.Nonces) > 0 { + for _, e := range m.Nonces { + l = e.Size() + n += 1 + l + sovGenesis(uint64(l)) + } + } + if len(m.Serialized) > 0 { + for _, e := range m.Serialized { + l = e.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 *AddressAssociation) 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: AddressAssociation: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: AddressAssociation: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field SeiAddress", 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.SeiAddress = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field EthAddress", 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.EthAddress = string(dAtA[iNdEx:postIndex]) + 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 *Code) 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: Code: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Code: 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 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.Address = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Code", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenesis + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthGenesis + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthGenesis + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Code = append(m.Code[:0], dAtA[iNdEx:postIndex]...) + if m.Code == nil { + m.Code = []byte{} + } + 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 *ContractState) 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: ContractState: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ContractState: 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 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.Address = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Key", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenesis + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthGenesis + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthGenesis + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Key = append(m.Key[:0], dAtA[iNdEx:postIndex]...) + if m.Key == nil { + m.Key = []byte{} + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Value", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenesis + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthGenesis + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthGenesis + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Value = append(m.Value[:0], dAtA[iNdEx:postIndex]...) + if m.Value == nil { + m.Value = []byte{} + } + 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 *Nonce) 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: Nonce: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Nonce: 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 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.Address = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Nonce", wireType) + } + m.Nonce = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenesis + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Nonce |= uint64(b&0x7F) << shift + if b < 0x80 { + break } - 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 + 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 } - i -= size - i = encodeVarintGenesis(dAtA, i, uint64(size)) } - i-- - dAtA[i] = 0xa - 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 *AddressAssociation) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.SeiAddress) - if l > 0 { - n += 1 + l + sovGenesis(uint64(l)) - } - l = len(m.EthAddress) - if l > 0 { - n += 1 + l + sovGenesis(uint64(l)) - } - return n -} -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.AddressAssociations) > 0 { - for _, e := range m.AddressAssociations { - l = e.Size() - n += 1 + l + sovGenesis(uint64(l)) - } + if iNdEx > l { + return io.ErrUnexpectedEOF } - 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)))) + return nil } -func (m *AddressAssociation) Unmarshal(dAtA []byte) error { +func (m *Serialized) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -316,17 +1383,17 @@ func (m *AddressAssociation) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: AddressAssociation: wiretype end group for non-group") + return fmt.Errorf("proto: Serialized: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: AddressAssociation: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: Serialized: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field SeiAddress", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Prefix", wireType) } - var stringLen uint64 + var byteLen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowGenesis @@ -336,29 +1403,31 @@ func (m *AddressAssociation) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + byteLen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if byteLen < 0 { return ErrInvalidLengthGenesis } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + byteLen if postIndex < 0 { return ErrInvalidLengthGenesis } if postIndex > l { return io.ErrUnexpectedEOF } - m.SeiAddress = string(dAtA[iNdEx:postIndex]) + m.Prefix = append(m.Prefix[:0], dAtA[iNdEx:postIndex]...) + if m.Prefix == nil { + m.Prefix = []byte{} + } iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field EthAddress", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Key", wireType) } - var stringLen uint64 + var byteLen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowGenesis @@ -368,23 +1437,59 @@ func (m *AddressAssociation) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + byteLen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if byteLen < 0 { return ErrInvalidLengthGenesis } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + byteLen if postIndex < 0 { return ErrInvalidLengthGenesis } if postIndex > l { return io.ErrUnexpectedEOF } - m.EthAddress = string(dAtA[iNdEx:postIndex]) + m.Key = append(m.Key[:0], dAtA[iNdEx:postIndex]...) + if m.Key == nil { + m.Key = []byte{} + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Value", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenesis + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthGenesis + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthGenesis + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Value = append(m.Value[:0], dAtA[iNdEx:postIndex]...) + if m.Value == nil { + m.Value = []byte{} + } iNdEx = postIndex default: iNdEx = preIndex @@ -503,6 +1608,142 @@ func (m *GenesisState) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Codes", 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.Codes = append(m.Codes, &Code{}) + if err := m.Codes[len(m.Codes)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field States", 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.States = append(m.States, &ContractState{}) + if err := m.States[len(m.States)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Nonces", 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.Nonces = append(m.Nonces, &Nonce{}) + if err := m.Nonces[len(m.Nonces)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Serialized", 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.Serialized = append(m.Serialized, &Serialized{}) + if err := m.Serialized[len(m.Serialized)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenesis(dAtA[iNdEx:]) From 5330af1f2ea592a34bd41bb5e671f07c97c83239 Mon Sep 17 00:00:00 2001 From: Philip Su Date: Tue, 7 May 2024 09:04:30 -0700 Subject: [PATCH 12/51] Fix ctx for evm queries (#1629) --- x/evm/client/cli/query.go | 40 +++++++++++++++++++++++++++------------ 1 file changed, 28 insertions(+), 12 deletions(-) diff --git a/x/evm/client/cli/query.go b/x/evm/client/cli/query.go index ff9f10210..10120bac3 100644 --- a/x/evm/client/cli/query.go +++ b/x/evm/client/cli/query.go @@ -53,7 +53,10 @@ func CmdQuerySeiAddress() *cobra.Command { Short: "gets sei address (sei...) by EVM address (0x...) if account has association set", Args: cobra.ExactArgs(1), RunE: func(cmd *cobra.Command, args []string) error { - clientCtx := client.GetClientContextFromCmd(cmd) + clientCtx, err := client.GetClientQueryContext(cmd) + if err != nil { + return err + } queryClient := types.NewQueryClient(clientCtx) @@ -77,8 +80,10 @@ func CmdQueryEVMAddress() *cobra.Command { Short: "gets evm address (0x...) by Sei address (sei...) if account has association set", Args: cobra.ExactArgs(1), RunE: func(cmd *cobra.Command, args []string) error { - clientCtx := client.GetClientContextFromCmd(cmd) - + clientCtx, err := client.GetClientQueryContext(cmd) + if err != nil { + return err + } queryClient := types.NewQueryClient(clientCtx) res, err := queryClient.EVMAddressBySeiAddress(context.Background(), &types.QueryEVMAddressBySeiAddressRequest{SeiAddress: args[0]}) @@ -101,7 +106,10 @@ func CmdQueryERC20() *cobra.Command { Short: "get hex payload for the given inputs", Args: cobra.MinimumNArgs(2), RunE: func(cmd *cobra.Command, args []string) error { - clientCtx := client.GetClientContextFromCmd(cmd) + clientCtx, err := client.GetClientQueryContext(cmd) + if err != nil { + return err + } queryClient := types.NewQueryClient(clientCtx) abi, err := native.NativeMetaData.GetAbi() if err != nil { @@ -160,8 +168,10 @@ func CmdQueryPayload() *cobra.Command { Short: "get hex payload for the given inputs", Args: cobra.MinimumNArgs(2), RunE: func(cmd *cobra.Command, args []string) error { - clientCtx := client.GetClientContextFromCmd(cmd) - + clientCtx, err := client.GetClientQueryContext(cmd) + if err != nil { + return err + } dat, err := os.ReadFile(args[0]) if err != nil { return err @@ -191,8 +201,10 @@ func CmdQueryERC20Payload() *cobra.Command { Short: "get hex payload for the given inputs", Args: cobra.MinimumNArgs(1), RunE: func(cmd *cobra.Command, args []string) error { - clientCtx := client.GetClientContextFromCmd(cmd) - + clientCtx, err := client.GetClientQueryContext(cmd) + if err != nil { + return err + } abi, err := cw20.Cw20MetaData.GetAbi() if err != nil { return err @@ -232,8 +244,10 @@ func CmdQueryERC721Payload() *cobra.Command { Short: "get hex payload for the given inputs", Args: cobra.MinimumNArgs(1), RunE: func(cmd *cobra.Command, args []string) error { - clientCtx := client.GetClientContextFromCmd(cmd) - + clientCtx, err := client.GetClientQueryContext(cmd) + if err != nil { + return err + } abi, err := cw721.Cw721MetaData.GetAbi() if err != nil { return err @@ -273,8 +287,10 @@ func CmdQueryPointer() *cobra.Command { Short: "get pointer address of the specified type (one of [NATIVE, CW20, CW721, ERC20, ERC721]) and pointee", Args: cobra.ExactArgs(2), RunE: func(cmd *cobra.Command, args []string) error { - clientCtx := client.GetClientContextFromCmd(cmd) - + clientCtx, err := client.GetClientQueryContext(cmd) + if err != nil { + return err + } queryClient := types.NewQueryClient(clientCtx) res, err := queryClient.Pointer(context.Background(), &types.QueryPointerRequest{ From 0ecbfe49577f1f805c8b5626dbe0508624035782 Mon Sep 17 00:00:00 2001 From: Yiming Zang <50607998+yzang2019@users.noreply.github.com> Date: Wed, 8 May 2024 00:40:08 +0800 Subject: [PATCH 13/51] Add reverse mapping for pointers (#1634) * Add reverse key mapping for pointers * Fix unit test failures * Make some methods private --- x/evm/keeper/pointer.go | 98 ++++++++++++++++++++++++++++++------ x/evm/keeper/pointer_test.go | 28 +++++++++-- x/evm/types/keys.go | 9 +++- 3 files changed, 116 insertions(+), 19 deletions(-) diff --git a/x/evm/keeper/pointer.go b/x/evm/keeper/pointer.go index e87192834..f5d75a4a8 100644 --- a/x/evm/keeper/pointer.go +++ b/x/evm/keeper/pointer.go @@ -16,11 +16,19 @@ import ( ) func (k *Keeper) SetERC20NativePointer(ctx sdk.Context, token string, addr common.Address) error { - return k.SetPointerInfo(ctx, types.PointerERC20NativeKey(token), addr[:], native.CurrentVersion) + err := k.setPointerInfo(ctx, types.PointerERC20NativeKey(token), addr[:], native.CurrentVersion) + if err != nil { + return err + } + return k.setPointerInfo(ctx, types.PointerReverseRegistryKey(addr), []byte(token), native.CurrentVersion) } func (k *Keeper) SetERC20NativePointerWithVersion(ctx sdk.Context, token string, addr common.Address, version uint16) error { - return k.SetPointerInfo(ctx, types.PointerERC20NativeKey(token), addr[:], version) + err := k.setPointerInfo(ctx, types.PointerERC20NativeKey(token), addr[:], version) + if err != nil { + return err + } + return k.setPointerInfo(ctx, types.PointerReverseRegistryKey(addr), []byte(token), version) } func (k *Keeper) GetERC20NativePointer(ctx sdk.Context, token string) (addr common.Address, version uint16, exists bool) { @@ -31,16 +39,37 @@ func (k *Keeper) GetERC20NativePointer(ctx sdk.Context, token string) (addr comm return } +func (k *Keeper) GetERC20NativeByPointer(ctx sdk.Context, addr common.Address) (token string, version uint16, exists bool) { + tokenBz, version, exists := k.GetPointerInfo(ctx, types.PointerReverseRegistryKey(addr)) + if exists { + token = string(tokenBz) + } + return +} + func (k *Keeper) DeleteERC20NativePointer(ctx sdk.Context, token string, version uint16) { - k.DeletePointerInfo(ctx, types.PointerERC20NativeKey(token), version) + addr, _, exists := k.GetERC20NativePointer(ctx, token) + if exists { + k.deletePointerInfo(ctx, types.PointerERC20NativeKey(token), version) + k.deletePointerInfo(ctx, types.PointerReverseRegistryKey(addr), version) + } + } func (k *Keeper) SetERC20CW20Pointer(ctx sdk.Context, cw20Address string, addr common.Address) error { - return k.SetPointerInfo(ctx, types.PointerERC20CW20Key(cw20Address), addr[:], cw20.CurrentVersion) + err := k.setPointerInfo(ctx, types.PointerERC20CW20Key(cw20Address), addr[:], cw20.CurrentVersion) + if err != nil { + return err + } + return k.setPointerInfo(ctx, types.PointerReverseRegistryKey(addr), []byte(cw20Address), cw20.CurrentVersion) } func (k *Keeper) SetERC20CW20PointerWithVersion(ctx sdk.Context, cw20Address string, addr common.Address, version uint16) error { - return k.SetPointerInfo(ctx, types.PointerERC20CW20Key(cw20Address), addr[:], version) + err := k.setPointerInfo(ctx, types.PointerERC20CW20Key(cw20Address), addr[:], version) + if err != nil { + return err + } + return k.setPointerInfo(ctx, types.PointerReverseRegistryKey(addr), []byte(cw20Address), version) } func (k *Keeper) GetERC20CW20Pointer(ctx sdk.Context, cw20Address string) (addr common.Address, version uint16, exists bool) { @@ -51,16 +80,37 @@ func (k *Keeper) GetERC20CW20Pointer(ctx sdk.Context, cw20Address string) (addr return } +func (k *Keeper) GetERC20CW20ByPointer(ctx sdk.Context, addr common.Address) (cw20Address string, version uint16, exists bool) { + cw20AddressBz, version, exists := k.GetPointerInfo(ctx, types.PointerReverseRegistryKey(addr)) + if exists { + cw20Address = string(cw20AddressBz) + } + return +} + func (k *Keeper) DeleteERC20CW20Pointer(ctx sdk.Context, cw20Address string, version uint16) { - k.DeletePointerInfo(ctx, types.PointerERC20CW20Key(cw20Address), version) + addr, _, exists := k.GetERC20CW20Pointer(ctx, cw20Address) + if exists { + k.deletePointerInfo(ctx, types.PointerERC20CW20Key(cw20Address), version) + k.deletePointerInfo(ctx, types.PointerReverseRegistryKey(addr), version) + } + } func (k *Keeper) SetERC721CW721Pointer(ctx sdk.Context, cw721Address string, addr common.Address) error { - return k.SetPointerInfo(ctx, types.PointerERC721CW721Key(cw721Address), addr[:], cw721.CurrentVersion) + err := k.setPointerInfo(ctx, types.PointerERC721CW721Key(cw721Address), addr[:], cw721.CurrentVersion) + if err != nil { + return err + } + return k.setPointerInfo(ctx, types.PointerReverseRegistryKey(addr), []byte(cw721Address), cw721.CurrentVersion) } func (k *Keeper) SetERC721CW721PointerWithVersion(ctx sdk.Context, cw721Address string, addr common.Address, version uint16) error { - return k.SetPointerInfo(ctx, types.PointerERC721CW721Key(cw721Address), addr[:], version) + err := k.setPointerInfo(ctx, types.PointerERC721CW721Key(cw721Address), addr[:], version) + if err != nil { + return err + } + return k.setPointerInfo(ctx, types.PointerReverseRegistryKey(addr), []byte(cw721Address), version) } func (k *Keeper) GetERC721CW721Pointer(ctx sdk.Context, cw721Address string) (addr common.Address, version uint16, exists bool) { @@ -71,12 +121,28 @@ func (k *Keeper) GetERC721CW721Pointer(ctx sdk.Context, cw721Address string) (ad return } +func (k *Keeper) GetERC721CW721ByPointer(ctx sdk.Context, addr common.Address) (cw721Address string, version uint16, exists bool) { + cw721AddressBz, version, exists := k.GetPointerInfo(ctx, types.PointerReverseRegistryKey(addr)) + if exists { + cw721Address = string(cw721AddressBz) + } + return +} + func (k *Keeper) DeleteERC721CW721Pointer(ctx sdk.Context, cw721Address string, version uint16) { - k.DeletePointerInfo(ctx, types.PointerERC721CW721Key(cw721Address), version) + addr, _, exists := k.GetERC721CW721Pointer(ctx, cw721Address) + if exists { + k.deletePointerInfo(ctx, types.PointerERC721CW721Key(cw721Address), version) + k.deletePointerInfo(ctx, types.PointerReverseRegistryKey(addr), version) + } } func (k *Keeper) SetCW20ERC20Pointer(ctx sdk.Context, erc20Address common.Address, addr string) error { - return k.SetPointerInfo(ctx, types.PointerCW20ERC20Key(erc20Address), []byte(addr), erc20.CurrentVersion) + err := k.setPointerInfo(ctx, types.PointerCW20ERC20Key(erc20Address), []byte(addr), erc20.CurrentVersion) + if err != nil { + return err + } + return k.setPointerInfo(ctx, types.PointerReverseRegistryKey(common.BytesToAddress([]byte(addr))), erc20Address[:], erc20.CurrentVersion) } func (k *Keeper) GetCW20ERC20Pointer(ctx sdk.Context, erc20Address common.Address) (addr sdk.AccAddress, version uint16, exists bool) { @@ -88,7 +154,11 @@ func (k *Keeper) GetCW20ERC20Pointer(ctx sdk.Context, erc20Address common.Addres } func (k *Keeper) SetCW721ERC721Pointer(ctx sdk.Context, erc721Address common.Address, addr string) error { - return k.SetPointerInfo(ctx, types.PointerCW721ERC721Key(erc721Address), []byte(addr), erc721.CurrentVersion) + err := k.setPointerInfo(ctx, types.PointerCW721ERC721Key(erc721Address), []byte(addr), erc721.CurrentVersion) + if err != nil { + return err + } + return k.setPointerInfo(ctx, types.PointerReverseRegistryKey(common.BytesToAddress([]byte(addr))), erc721Address[:], erc721.CurrentVersion) } func (k *Keeper) GetCW721ERC721Pointer(ctx sdk.Context, erc721Address common.Address) (addr sdk.AccAddress, version uint16, exists bool) { @@ -112,10 +182,10 @@ func (k *Keeper) GetPointerInfo(ctx sdk.Context, pref []byte) (addr []byte, vers return } -func (k *Keeper) SetPointerInfo(ctx sdk.Context, pref []byte, addr []byte, version uint16) error { +func (k *Keeper) setPointerInfo(ctx sdk.Context, pref []byte, addr []byte, version uint16) error { existingAddr, existingVersion, exists := k.GetPointerInfo(ctx, pref) if exists && existingVersion >= version { - return fmt.Errorf("pointer at %s with version %d exists when trying to set pointer for version %d", string(existingAddr), existingVersion, version) + return fmt.Errorf("pointer at %X with version %d exists when trying to set pointer for version %d", string(existingAddr), existingVersion, version) } store := prefix.NewStore(ctx.KVStore(k.GetStoreKey()), pref) versionBz := make([]byte, 2) @@ -124,7 +194,7 @@ func (k *Keeper) SetPointerInfo(ctx sdk.Context, pref []byte, addr []byte, versi return nil } -func (k *Keeper) DeletePointerInfo(ctx sdk.Context, pref []byte, version uint16) { +func (k *Keeper) deletePointerInfo(ctx sdk.Context, pref []byte, version uint16) { store := prefix.NewStore(ctx.KVStore(k.GetStoreKey()), pref) versionBz := make([]byte, 2) binary.BigEndian.PutUint16(versionBz, version) diff --git a/x/evm/keeper/pointer_test.go b/x/evm/keeper/pointer_test.go index e4048af69..7d21bb107 100644 --- a/x/evm/keeper/pointer_test.go +++ b/x/evm/keeper/pointer_test.go @@ -7,15 +7,37 @@ import ( "github.com/stretchr/testify/require" ) -func TestSetPointer(t *testing.T) { +func TestERC20NativePointer(t *testing.T) { k, ctx := testkeeper.MockEVMKeeper() _, pointer := testkeeper.MockAddressPair() - cw20, _ := testkeeper.MockAddressPair() - cw721, _ := testkeeper.MockAddressPair() require.Nil(t, k.SetERC20NativePointer(ctx, "test", pointer)) require.NotNil(t, k.SetERC20NativePointer(ctx, "test", pointer)) // already set + addr, _, _ := k.GetERC20NativePointer(ctx, "test") + require.Equal(t, pointer, addr) + token, _, _ := k.GetERC20NativeByPointer(ctx, addr) + require.Equal(t, "test", token) +} + +func TestSetERC20CW20Pointer(t *testing.T) { + k, ctx := testkeeper.MockEVMKeeper() + _, pointer := testkeeper.MockAddressPair() + cw20, _ := testkeeper.MockAddressPair() require.Nil(t, k.SetERC20CW20Pointer(ctx, cw20.String(), pointer)) require.NotNil(t, k.SetERC20CW20Pointer(ctx, cw20.String(), pointer)) // already set + addr, _, _ := k.GetERC20CW20Pointer(ctx, cw20.String()) + require.Equal(t, pointer, addr) + cw20Addr, _, _ := k.GetERC20CW20ByPointer(ctx, addr) + require.Equal(t, cw20.String(), cw20Addr) +} + +func TestERC721CW721Pointer(t *testing.T) { + k, ctx := testkeeper.MockEVMKeeper() + _, pointer := testkeeper.MockAddressPair() + cw721, _ := testkeeper.MockAddressPair() require.Nil(t, k.SetERC721CW721Pointer(ctx, cw721.String(), pointer)) require.NotNil(t, k.SetERC721CW721Pointer(ctx, cw721.String(), pointer)) // already set + addr, _, _ := k.GetERC721CW721Pointer(ctx, cw721.String()) + require.Equal(t, pointer, addr) + cw721Addr, _, _ := k.GetERC721CW721ByPointer(ctx, addr) + require.Equal(t, cw721.String(), cw721Addr) } diff --git a/x/evm/types/keys.go b/x/evm/types/keys.go index b376c2b59..d5513f7e5 100644 --- a/x/evm/types/keys.go +++ b/x/evm/types/keys.go @@ -46,8 +46,9 @@ var ( ReplayedHeight = []byte{0x13} ReplayInitialHeight = []byte{0x14} - PointerRegistryPrefix = []byte{0x15} - PointerCWCodePrefix = []byte{0x16} + PointerRegistryPrefix = []byte{0x15} + PointerCWCodePrefix = []byte{0x16} + PointerReverseRegistryPrefix = []byte{0x17} ) var ( @@ -120,3 +121,7 @@ func PointerCW721ERC721Key(erc721Addr common.Address) []byte { erc721Addr[:]..., ) } + +func PointerReverseRegistryKey(addr common.Address) []byte { + return append(PointerReverseRegistryPrefix, addr[:]...) +} From 567c7743986b18a81deca28bfeb9507b50d820d2 Mon Sep 17 00:00:00 2001 From: Jeremy Wei Date: Tue, 7 May 2024 21:11:54 -0400 Subject: [PATCH 14/51] Unregistered EVM NewProposalHandler (#1637) fix --- x/evm/types/codec.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/x/evm/types/codec.go b/x/evm/types/codec.go index a092de6e0..c5f6a2815 100644 --- a/x/evm/types/codec.go +++ b/x/evm/types/codec.go @@ -11,6 +11,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/msgservice" + govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" "github.com/gogo/protobuf/proto" "github.com/sei-protocol/sei-chain/x/evm/types/ethtx" ) @@ -31,6 +32,11 @@ func GetAmino() *codec.LegacyAmino { } func RegisterInterfaces(registry codectypes.InterfaceRegistry) { + registry.RegisterImplementations((*govtypes.Content)(nil), + &AddERCNativePointerProposal{}, + &AddERCCW20PointerProposal{}, + &AddERCCW721PointerProposal{}, + ) registry.RegisterImplementations( (*sdk.Msg)(nil), &MsgEVMTransaction{}, From a2ab1c5324a34a8055ef4a4416bf48e34cc20427 Mon Sep 17 00:00:00 2001 From: codchen Date: Wed, 8 May 2024 10:48:59 +0800 Subject: [PATCH 15/51] Fix ante surplus handling (#1635) * Fix ante surplus handling * only write if supply is incorrect --- go.mod | 2 +- go.sum | 4 +-- x/evm/ante/fee.go | 4 ++- x/evm/derived/derived.go | 1 - x/evm/genesis.go | 1 + x/evm/keeper/ante.go | 34 +++++++++++++++++++++ x/evm/keeper/msg_server.go | 1 - x/evm/migrations/fix_total_supply.go | 37 +++++++++++++++++++++++ x/evm/migrations/fix_total_supply_test.go | 26 ++++++++++++++++ x/evm/module.go | 27 +++++++++++------ x/evm/module_test.go | 15 ++++++++- x/evm/state/balance_test.go | 9 ++---- x/evm/state/statedb.go | 5 --- x/evm/types/keys.go | 2 ++ 14 files changed, 140 insertions(+), 28 deletions(-) create mode 100644 x/evm/keeper/ante.go create mode 100644 x/evm/migrations/fix_total_supply.go create mode 100644 x/evm/migrations/fix_total_supply_test.go diff --git a/go.mod b/go.mod index 3383e4767..298ab0cbe 100644 --- a/go.mod +++ b/go.mod @@ -348,7 +348,7 @@ require ( replace ( github.com/CosmWasm/wasmd => github.com/sei-protocol/sei-wasmd v0.1.2 github.com/confio/ics23/go => github.com/cosmos/cosmos-sdk/ics23/go v0.8.0 - github.com/cosmos/cosmos-sdk => github.com/sei-protocol/sei-cosmos v0.3.8 + github.com/cosmos/cosmos-sdk => github.com/sei-protocol/sei-cosmos v0.3.10 github.com/cosmos/iavl => github.com/sei-protocol/sei-iavl v0.1.9 github.com/cosmos/ibc-go/v3 => github.com/sei-protocol/sei-ibc-go/v3 v3.3.0 github.com/ethereum/go-ethereum => github.com/sei-protocol/go-ethereum v1.13.5-sei-16 diff --git a/go.sum b/go.sum index 4f0b12d30..912639bb5 100644 --- a/go.sum +++ b/go.sum @@ -1350,8 +1350,8 @@ github.com/sei-protocol/go-ethereum v1.13.5-sei-16 h1:bPQw44//5XHDZWfwO98g2Hie5H github.com/sei-protocol/go-ethereum v1.13.5-sei-16/go.mod h1:kcRZmuzRn1lVejiFNTz4l4W7imnpq1bDAnuKS/RyhbQ= github.com/sei-protocol/goutils v0.0.2 h1:Bfa7Sv+4CVLNM20QcpvGb81B8C5HkQC/kW1CQpIbXDA= github.com/sei-protocol/goutils v0.0.2/go.mod h1:iYE2DuJfEnM+APPehr2gOUXfuLuPsVxorcDO+Tzq9q8= -github.com/sei-protocol/sei-cosmos v0.3.8 h1:YojcJLDNkerH7owwJlzuIWfKP0RNM2K9FKtjZkValow= -github.com/sei-protocol/sei-cosmos v0.3.8/go.mod h1:WWwx6XlJc9SrjdRwLW69o511hFpfUiHapYb+V9OqOG4= +github.com/sei-protocol/sei-cosmos v0.3.10 h1:1sgxeVno1uy10/F0Mkqlc0Jy14alDRepdvBftLIByaE= +github.com/sei-protocol/sei-cosmos v0.3.10/go.mod h1:WWwx6XlJc9SrjdRwLW69o511hFpfUiHapYb+V9OqOG4= github.com/sei-protocol/sei-db v0.0.36 h1:Qg8MlO/4btECyAB/XrbEexhpaS7OmYsrs9IUYULf+bY= github.com/sei-protocol/sei-db v0.0.36/go.mod h1:F/ZKZA8HJPcUzSZPA8yt6pfwlGriJ4RDR4eHKSGLStI= github.com/sei-protocol/sei-iavl v0.1.9 h1:y4mVYftxLNRs6533zl7N0/Ch+CzRQc04JDfHolIxgBE= diff --git a/x/evm/ante/fee.go b/x/evm/ante/fee.go index 1e64bd920..d3517038b 100644 --- a/x/evm/ante/fee.go +++ b/x/evm/ante/fee.go @@ -87,7 +87,9 @@ func (fc EVMFeeCheckDecorator) AnteHandle(ctx sdk.Context, tx sdk.Tx, simulate b if err != nil { return ctx, err } - msg.Derived.AnteSurplus = surplus + if err := fc.evmKeeper.AddAnteSurplus(ctx, etx.Hash(), surplus); err != nil { + return ctx, err + } } // calculate the priority by dividing the total fee with the native gas limit (i.e. the effective native gas price) diff --git a/x/evm/derived/derived.go b/x/evm/derived/derived.go index a97d64b8a..810df0b27 100644 --- a/x/evm/derived/derived.go +++ b/x/evm/derived/derived.go @@ -19,7 +19,6 @@ type Derived struct { PubKey *secp256k1.PubKey IsAssociate bool Version SignerVersion - AnteSurplus sdk.Int } // Derived should never come from deserialization or be transmitted after serialization, diff --git a/x/evm/genesis.go b/x/evm/genesis.go index a32db21ae..7e3802b31 100644 --- a/x/evm/genesis.go +++ b/x/evm/genesis.go @@ -68,6 +68,7 @@ func ExportGenesis(ctx sdk.Context, k *keeper.Keeper) *types.GenesisState { types.TxHashesPrefix, types.PointerRegistryPrefix, types.PointerCWCodePrefix, + types.PointerReverseRegistryPrefix, } { k.IterateAll(ctx, prefix, func(key, val []byte) bool { genesis.Serialized = append(genesis.Serialized, &types.Serialized{ diff --git a/x/evm/keeper/ante.go b/x/evm/keeper/ante.go new file mode 100644 index 000000000..4499a84ee --- /dev/null +++ b/x/evm/keeper/ante.go @@ -0,0 +1,34 @@ +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/sei-protocol/sei-chain/x/evm/types" +) + +func (k *Keeper) AddAnteSurplus(ctx sdk.Context, txHash common.Hash, surplus sdk.Int) error { + store := prefix.NewStore(ctx.KVStore(k.memStoreKey), types.AnteSurplusPrefix) + bz, err := surplus.Marshal() + if err != nil { + return err + } + store.Set(txHash[:], bz) + return nil +} + +func (k *Keeper) GetAnteSurplusSum(ctx sdk.Context) sdk.Int { + iter := prefix.NewStore(ctx.KVStore(k.memStoreKey), types.AnteSurplusPrefix).Iterator(nil, nil) + defer iter.Close() + res := sdk.ZeroInt() + for ; iter.Valid(); iter.Next() { + surplus := sdk.Int{} + _ = surplus.Unmarshal(iter.Value()) + res = res.Add(surplus) + } + return res +} + +func (k *Keeper) DeleteAllAnteSurplus(ctx sdk.Context) { + _ = prefix.NewStore(ctx.KVStore(k.memStoreKey), types.AnteSurplusPrefix).DeleteAll(nil, nil) +} diff --git a/x/evm/keeper/msg_server.go b/x/evm/keeper/msg_server.go index 8bd89f5fc..5d7033149 100644 --- a/x/evm/keeper/msg_server.go +++ b/x/evm/keeper/msg_server.go @@ -58,7 +58,6 @@ func (server msgServer) EVMTransaction(goCtx context.Context, msg *types.MsgEVMT ctx = ctx.WithGasMeter(sdk.NewInfiniteGasMeterWithMultiplier(ctx)) stateDB := state.NewDBImpl(ctx, &server, false) - stateDB.AddSurplus(msg.Derived.AnteSurplus) tx, _ := msg.AsTransaction() emsg := server.GetEVMMessage(ctx, tx, msg.Derived.SenderEVMAddr) gp := server.GetGasPool() diff --git a/x/evm/migrations/fix_total_supply.go b/x/evm/migrations/fix_total_supply.go new file mode 100644 index 000000000..e75cf046b --- /dev/null +++ b/x/evm/migrations/fix_total_supply.go @@ -0,0 +1,37 @@ +package migrations + +import ( + sdk "github.com/cosmos/cosmos-sdk/types" + bankkeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper" + "github.com/sei-protocol/sei-chain/x/evm/keeper" + "github.com/sei-protocol/sei-chain/x/evm/types" +) + +// This migration is to fix total supply mismatch caused by mishandled +// ante surplus +func FixTotalSupply(ctx sdk.Context, k *keeper.Keeper) error { + balances := k.BankKeeper().GetAccountsBalances(ctx) + correctSupply := sdk.ZeroInt() + for _, balance := range balances { + correctSupply = correctSupply.Add(balance.Coins.AmountOf(sdk.MustGetBaseDenom())) + } + totalWeiBalance := sdk.ZeroInt() + k.BankKeeper().IterateAllWeiBalances(ctx, func(aa sdk.AccAddress, i sdk.Int) bool { + totalWeiBalance = totalWeiBalance.Add(i) + return false + }) + weiInUsei, weiRemainder := bankkeeper.SplitUseiWeiAmount(totalWeiBalance) + if !weiRemainder.IsZero() { + ctx.Logger().Error("wei total supply has been compromised as well; rounding up and adding to reserve") + if err := k.BankKeeper().AddWei(ctx, k.AccountKeeper().GetModuleAddress(types.ModuleName), bankkeeper.OneUseiInWei.Sub(weiRemainder)); err != nil { + return err + } + weiInUsei = weiInUsei.Add(sdk.OneInt()) + } + correctSupply = correctSupply.Add(weiInUsei) + currentSupply := k.BankKeeper().GetSupply(ctx, sdk.MustGetBaseDenom()).Amount + if !currentSupply.Equal(correctSupply) { + k.BankKeeper().SetSupply(ctx, sdk.NewCoin(sdk.MustGetBaseDenom(), correctSupply)) + } + return nil +} diff --git a/x/evm/migrations/fix_total_supply_test.go b/x/evm/migrations/fix_total_supply_test.go new file mode 100644 index 000000000..a932098af --- /dev/null +++ b/x/evm/migrations/fix_total_supply_test.go @@ -0,0 +1,26 @@ +package migrations_test + +import ( + "testing" + + sdk "github.com/cosmos/cosmos-sdk/types" + testkeeper "github.com/sei-protocol/sei-chain/testutil/keeper" + "github.com/sei-protocol/sei-chain/x/evm/migrations" + "github.com/stretchr/testify/require" +) + +func TestFixTotalSupply(t *testing.T) { + k, ctx := testkeeper.MockEVMKeeper() + addr, _ := testkeeper.MockAddressPair() + balance := sdk.NewCoins(sdk.NewCoin(sdk.MustGetBaseDenom(), sdk.OneInt())) + k.BankKeeper().MintCoins(ctx, "evm", balance) + k.BankKeeper().SendCoinsFromModuleToAccount(ctx, "evm", addr, balance) + k.BankKeeper().AddWei(ctx, addr, sdk.OneInt()) + oldSupply := k.BankKeeper().GetSupply(ctx, sdk.MustGetBaseDenom()).Amount + require.Nil(t, migrations.FixTotalSupply(ctx, k)) + require.Equal(t, oldSupply.Add(sdk.OneInt()), k.BankKeeper().GetSupply(ctx, sdk.MustGetBaseDenom()).Amount) + require.Equal(t, sdk.OneInt(), k.BankKeeper().GetBalance(ctx, addr, sdk.MustGetBaseDenom()).Amount) + require.Equal(t, sdk.ZeroInt(), k.BankKeeper().GetBalance(ctx, k.AccountKeeper().GetModuleAddress("evm"), sdk.MustGetBaseDenom()).Amount) + require.Equal(t, sdk.OneInt(), k.BankKeeper().GetWeiBalance(ctx, addr)) + require.Equal(t, sdk.NewInt(999_999_999_999), k.BankKeeper().GetWeiBalance(ctx, k.AccountKeeper().GetModuleAddress("evm"))) +} diff --git a/x/evm/module.go b/x/evm/module.go index 8286973b5..1c834bcea 100644 --- a/x/evm/module.go +++ b/x/evm/module.go @@ -143,6 +143,10 @@ func (am AppModule) RegisterServices(cfg module.Configurator) { _ = cfg.RegisterMigration(types.ModuleName, 4, func(ctx sdk.Context) error { return migrations.StoreCWPointerCode(ctx, am.keeper) }) + + _ = cfg.RegisterMigration(types.ModuleName, 5, func(ctx sdk.Context) error { + return migrations.FixTotalSupply(ctx, am.keeper) + }) } // RegisterInvariants registers the capability module's invariants. @@ -167,7 +171,7 @@ func (am AppModule) ExportGenesis(ctx sdk.Context, cdc codec.JSONCodec) json.Raw } // ConsensusVersion implements ConsensusVersion. -func (AppModule) ConsensusVersion() uint64 { return 5 } +func (AppModule) ConsensusVersion() uint64 { return 6 } // BeginBlock executes all ABCI BeginBlock logic respective to the capability module. func (am AppModule) BeginBlock(ctx sdk.Context, _ abci.RequestBeginBlock) { @@ -212,7 +216,7 @@ func (am AppModule) EndBlock(ctx sdk.Context, _ abci.RequestEndBlock) []abci.Val } evmTxDeferredInfoList := am.keeper.GetEVMTxDeferredInfo(ctx) denom := am.keeper.GetBaseDenom(ctx) - surplus := utils.Sdk0 + surplus := am.keeper.GetAnteSurplusSum(ctx) for _, deferredInfo := range evmTxDeferredInfoList { if deferredInfo.Error != "" && deferredInfo.TxHash.Cmp(ethtypes.EmptyTxsHash) != 0 { _ = am.keeper.SetReceipt(ctx, deferredInfo.TxHash, &types.Receipt{ @@ -233,18 +237,21 @@ func (am AppModule) EndBlock(ctx sdk.Context, _ abci.RequestEndBlock) []abci.Val } surplus = surplus.Add(deferredInfo.Surplus) } - surplusUsei, surplusWei := state.SplitUseiWeiAmount(surplus.BigInt()) - if surplusUsei.GT(sdk.ZeroInt()) { - if err := am.keeper.BankKeeper().AddCoins(ctx, am.keeper.AccountKeeper().GetModuleAddress(types.ModuleName), sdk.NewCoins(sdk.NewCoin(am.keeper.GetBaseDenom(ctx), surplusUsei)), true); err != nil { - ctx.Logger().Error("failed to send usei surplus of %s to EVM module account", surplusUsei) + if surplus.IsPositive() { + surplusUsei, surplusWei := state.SplitUseiWeiAmount(surplus.BigInt()) + if surplusUsei.GT(sdk.ZeroInt()) { + if err := am.keeper.BankKeeper().AddCoins(ctx, am.keeper.AccountKeeper().GetModuleAddress(types.ModuleName), sdk.NewCoins(sdk.NewCoin(am.keeper.GetBaseDenom(ctx), surplusUsei)), true); err != nil { + ctx.Logger().Error("failed to send usei surplus of %s to EVM module account", surplusUsei) + } } - } - if surplusWei.GT(sdk.ZeroInt()) { - if err := am.keeper.BankKeeper().AddWei(ctx, am.keeper.AccountKeeper().GetModuleAddress(types.ModuleName), surplusWei); err != nil { - ctx.Logger().Error("failed to send wei surplus of %s to EVM module account", surplusWei) + if surplusWei.GT(sdk.ZeroInt()) { + if err := am.keeper.BankKeeper().AddWei(ctx, am.keeper.AccountKeeper().GetModuleAddress(types.ModuleName), surplusWei); err != nil { + ctx.Logger().Error("failed to send wei surplus of %s to EVM module account", surplusWei) + } } } am.keeper.SetTxHashesOnHeight(ctx, ctx.BlockHeight(), utils.Filter(utils.Map(evmTxDeferredInfoList, func(i keeper.EvmTxDeferredInfo) common.Hash { return i.TxHash }), func(h common.Hash) bool { return h.Cmp(ethtypes.EmptyTxsHash) != 0 })) am.keeper.SetBlockBloom(ctx, ctx.BlockHeight(), utils.Map(evmTxDeferredInfoList, func(i keeper.EvmTxDeferredInfo) ethtypes.Bloom { return i.TxBloom })) + am.keeper.DeleteAllAnteSurplus(ctx) return []abci.ValidatorUpdate{} } diff --git a/x/evm/module_test.go b/x/evm/module_test.go index d64095ee0..4082dcb86 100644 --- a/x/evm/module_test.go +++ b/x/evm/module_test.go @@ -51,7 +51,7 @@ func TestModuleExportGenesis(t *testing.T) { func TestConsensusVersion(t *testing.T) { k, _ := testkeeper.MockEVMKeeper() module := evm.NewAppModule(nil, k) - assert.Equal(t, uint64(5), module.ConsensusVersion()) + assert.Equal(t, uint64(6), module.ConsensusVersion()) } func TestABCI(t *testing.T) { @@ -136,3 +136,16 @@ func TestABCI(t *testing.T) { require.Equal(t, sdk.OneInt(), k.BankKeeper().GetBalance(ctx, coinbase, "usei").Amount) require.Equal(t, sdk.ZeroInt(), k.BankKeeper().SpendableCoins(ctx, coinbase).AmountOf("usei")) } + +func TestAnteSurplus(t *testing.T) { + k, ctx := testkeeper.MockEVMKeeper() + m := evm.NewAppModule(nil, k) + // first block + m.BeginBlock(ctx, abci.RequestBeginBlock{}) + k.AddAnteSurplus(ctx, common.BytesToHash([]byte("1234")), sdk.NewInt(1_000_000_000_001)) + m.EndBlock(ctx, abci.RequestEndBlock{}) + require.Equal(t, uint64(1), k.BankKeeper().GetBalance(ctx, k.AccountKeeper().GetModuleAddress(types.ModuleName), "usei").Amount.Uint64()) + require.Equal(t, uint64(1), k.BankKeeper().GetWeiBalance(ctx, k.AccountKeeper().GetModuleAddress(types.ModuleName)).Uint64()) + // ante surplus should be cleared + require.Equal(t, uint64(0), k.GetAnteSurplusSum(ctx).Uint64()) +} diff --git a/x/evm/state/balance_test.go b/x/evm/state/balance_test.go index 33aa29b32..abe7d5b70 100644 --- a/x/evm/state/balance_test.go +++ b/x/evm/state/balance_test.go @@ -98,16 +98,14 @@ func TestSurplus(t *testing.T) { db := state.NewDBImpl(ctx, k, false) db.AddBalance(evmAddr, big.NewInt(1_000_000_000_001), tracing.BalanceChangeUnspecified) _, err := db.Finalize() - require.NotNil(t, err) - require.Contains(t, err.Error(), "negative surplus value") + require.Nil(t, err) // test negative usei surplus positive wei surplus (negative total) db = state.NewDBImpl(ctx, k, false) db.AddBalance(evmAddr, big.NewInt(1_000_000_000_000), tracing.BalanceChangeUnspecified) db.SubBalance(evmAddr, big.NewInt(1), tracing.BalanceChangeUnspecified) _, err = db.Finalize() - require.NotNil(t, err) - require.Contains(t, err.Error(), "negative surplus value") + require.Nil(t, err) // test negative usei surplus positive wei surplus (positive total) db = state.NewDBImpl(ctx, k, false) @@ -124,8 +122,7 @@ func TestSurplus(t *testing.T) { db.AddBalance(evmAddr, big.NewInt(2), tracing.BalanceChangeUnspecified) db.AddBalance(evmAddr, big.NewInt(999_999_999_999), tracing.BalanceChangeUnspecified) _, err = db.Finalize() - require.NotNil(t, err) - require.Contains(t, err.Error(), "negative surplus value") + require.Nil(t, err) // test positive usei surplus negative wei surplus (positive total) db = state.NewDBImpl(ctx, k, false) diff --git a/x/evm/state/statedb.go b/x/evm/state/statedb.go index e42d171e7..c0bdecb76 100644 --- a/x/evm/state/statedb.go +++ b/x/evm/state/statedb.go @@ -1,8 +1,6 @@ package state import ( - "fmt" - sdk "github.com/cosmos/cosmos-sdk/types" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/tracing" @@ -115,9 +113,6 @@ func (s *DBImpl) Finalize() (surplus sdk.Int, err error) { for _, ts := range s.tempStatesHist { surplus = surplus.Add(ts.surplus) } - if surplus.IsNegative() { - err = fmt.Errorf("negative surplus value: %s", surplus.String()) - } return } diff --git a/x/evm/types/keys.go b/x/evm/types/keys.go index d5513f7e5..70bd37119 100644 --- a/x/evm/types/keys.go +++ b/x/evm/types/keys.go @@ -49,6 +49,8 @@ var ( PointerRegistryPrefix = []byte{0x15} PointerCWCodePrefix = []byte{0x16} PointerReverseRegistryPrefix = []byte{0x17} + + AnteSurplusPrefix = []byte{0x18} ) var ( From a2ad8b776c4199bb8550b665bb3c4495add54fa5 Mon Sep 17 00:00:00 2001 From: codchen Date: Wed, 8 May 2024 12:28:24 +0800 Subject: [PATCH 16/51] Bump dependencies (#1641) --- go.mod | 8 +++----- go.sum | 15 ++++++--------- 2 files changed, 9 insertions(+), 14 deletions(-) diff --git a/go.mod b/go.mod index 298ab0cbe..2c4da3eae 100644 --- a/go.mod +++ b/go.mod @@ -125,7 +125,6 @@ require ( github.com/fzipp/gocyclo v0.5.1 // indirect github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff // indirect github.com/gballet/go-verkle v0.1.1-0.20231031103413-a67434b50f46 // indirect - github.com/ghodss/yaml v1.0.0 // indirect github.com/go-critic/go-critic v0.6.3 // indirect github.com/go-kit/kit v0.12.0 // indirect github.com/go-kit/log v0.2.1 // indirect @@ -173,7 +172,6 @@ require ( github.com/gostaticanalysis/nilerr v0.1.1 // indirect github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 // indirect github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 // indirect - github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.1 // indirect github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c // indirect github.com/hashicorp/errwrap v1.0.0 // indirect github.com/hashicorp/go-bexpr v0.1.10 // indirect @@ -346,9 +344,9 @@ require ( ) replace ( - github.com/CosmWasm/wasmd => github.com/sei-protocol/sei-wasmd v0.1.2 + github.com/CosmWasm/wasmd => github.com/sei-protocol/sei-wasmd v0.1.3 github.com/confio/ics23/go => github.com/cosmos/cosmos-sdk/ics23/go v0.8.0 - github.com/cosmos/cosmos-sdk => github.com/sei-protocol/sei-cosmos v0.3.10 + github.com/cosmos/cosmos-sdk => github.com/sei-protocol/sei-cosmos v0.3.11 github.com/cosmos/iavl => github.com/sei-protocol/sei-iavl v0.1.9 github.com/cosmos/ibc-go/v3 => github.com/sei-protocol/sei-ibc-go/v3 v3.3.0 github.com/ethereum/go-ethereum => github.com/sei-protocol/go-ethereum v1.13.5-sei-16 @@ -356,7 +354,7 @@ replace ( github.com/sei-protocol/sei-db => github.com/sei-protocol/sei-db v0.0.36 // Latest goleveldb is broken, we have to stick to this version github.com/syndtr/goleveldb => github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 - github.com/tendermint/tendermint => github.com/sei-protocol/sei-tendermint v0.3.2 + github.com/tendermint/tendermint => github.com/sei-protocol/sei-tendermint v0.3.3 github.com/tendermint/tm-db => github.com/sei-protocol/tm-db v0.0.4 google.golang.org/grpc => google.golang.org/grpc v1.33.2 ) diff --git a/go.sum b/go.sum index 912639bb5..728acaf63 100644 --- a/go.sum +++ b/go.sum @@ -457,7 +457,6 @@ github.com/gballet/go-verkle v0.1.1-0.20231031103413-a67434b50f46 h1:BAIP2Gihuqh github.com/gballet/go-verkle v0.1.1-0.20231031103413-a67434b50f46/go.mod h1:QNpY22eby74jVhqH4WhDLDwxc/vqsern6pW+u2kbkpc= github.com/getkin/kin-openapi v0.53.0/go.mod h1:7Yn5whZr5kJi6t+kShccXS8ae1APpYTW6yheSwk8Yi4= github.com/ghemawat/stream v0.0.0-20171120220530-696b145b53b9/go.mod h1:106OIgooyS7OzLDOpUGgm9fA3bQENb/cFSyyBmMoJDs= -github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/gin-contrib/sse v0.0.0-20190301062529-5545eab6dad3/go.mod h1:VJ0WA2NBN22VlZ2dKZQPAPnyWw5XTlK1KymzLKsr59s= github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= @@ -766,8 +765,6 @@ github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t github.com/grpc-ecosystem/grpc-gateway v1.12.1/go.mod h1:8XEsbTttt/W+VvjtQhLACqCisSPWTxCZ7sBRjU6iH9c= github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.1 h1:/c3QmbOGMGTOumP2iT/rCwB7b0QDGLKzqOmktBjT+Is= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.1/go.mod h1:5SN9VR2LTsRFsrEC6FHgRbTWrTHu6tqPeKxEQv15giM= github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c h1:6rhixN/i8ZofjG1Y75iExal34USq5p+wiN1tpie8IrU= github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c/go.mod h1:NMPJylDgVpX0MLRlPy15sqSwOFv/U1GZ2m21JhFfek0= github.com/guptarohit/asciigraph v0.5.5/go.mod h1:dYl5wwK4gNsnFf9Zp+l06rFiDZ5YtXM6x7SRWZ3KGag= @@ -1350,20 +1347,20 @@ github.com/sei-protocol/go-ethereum v1.13.5-sei-16 h1:bPQw44//5XHDZWfwO98g2Hie5H github.com/sei-protocol/go-ethereum v1.13.5-sei-16/go.mod h1:kcRZmuzRn1lVejiFNTz4l4W7imnpq1bDAnuKS/RyhbQ= github.com/sei-protocol/goutils v0.0.2 h1:Bfa7Sv+4CVLNM20QcpvGb81B8C5HkQC/kW1CQpIbXDA= github.com/sei-protocol/goutils v0.0.2/go.mod h1:iYE2DuJfEnM+APPehr2gOUXfuLuPsVxorcDO+Tzq9q8= -github.com/sei-protocol/sei-cosmos v0.3.10 h1:1sgxeVno1uy10/F0Mkqlc0Jy14alDRepdvBftLIByaE= -github.com/sei-protocol/sei-cosmos v0.3.10/go.mod h1:WWwx6XlJc9SrjdRwLW69o511hFpfUiHapYb+V9OqOG4= +github.com/sei-protocol/sei-cosmos v0.3.11 h1:mHhscQlvF6temJ8AsVBBAD6ZY44q5tUSgxhsMXrduRg= +github.com/sei-protocol/sei-cosmos v0.3.11/go.mod h1:WWwx6XlJc9SrjdRwLW69o511hFpfUiHapYb+V9OqOG4= github.com/sei-protocol/sei-db v0.0.36 h1:Qg8MlO/4btECyAB/XrbEexhpaS7OmYsrs9IUYULf+bY= github.com/sei-protocol/sei-db v0.0.36/go.mod h1:F/ZKZA8HJPcUzSZPA8yt6pfwlGriJ4RDR4eHKSGLStI= github.com/sei-protocol/sei-iavl v0.1.9 h1:y4mVYftxLNRs6533zl7N0/Ch+CzRQc04JDfHolIxgBE= github.com/sei-protocol/sei-iavl v0.1.9/go.mod h1:7PfkEVT5dcoQE+s/9KWdoXJ8VVVP1QpYYPLdxlkSXFk= github.com/sei-protocol/sei-ibc-go/v3 v3.3.0 h1:/mjpTuCSEVDJ51nUDSHU92N0bRSwt49r1rmdC/lqgp8= github.com/sei-protocol/sei-ibc-go/v3 v3.3.0/go.mod h1:VwB/vWu4ysT5DN2aF78d17LYmx3omSAdq6gpKvM7XRA= -github.com/sei-protocol/sei-tendermint v0.3.2 h1:Fiwr0y09GT5Gv/iGXVi6itRdwdUdh//O/oQTHq3x33c= -github.com/sei-protocol/sei-tendermint v0.3.2/go.mod h1:4LSlJdhl3nf3OmohliwRNUFLOB1XWlrmSodrIP7fLh4= +github.com/sei-protocol/sei-tendermint v0.3.3 h1:zH6xxrSRwHERaj/AcCR76U9daVY3Ub8kcy8+a/z1Dag= +github.com/sei-protocol/sei-tendermint v0.3.3/go.mod h1:4LSlJdhl3nf3OmohliwRNUFLOB1XWlrmSodrIP7fLh4= github.com/sei-protocol/sei-tm-db v0.0.5 h1:3WONKdSXEqdZZeLuWYfK5hP37TJpfaUa13vAyAlvaQY= github.com/sei-protocol/sei-tm-db v0.0.5/go.mod h1:Cpa6rGyczgthq7/0pI31jys2Fw0Nfrc+/jKdP1prVqY= -github.com/sei-protocol/sei-wasmd v0.1.2 h1:CHAQGWq0htMsJVo+4CWqz1uCCAMg6bTm1OUlD1mRZ5o= -github.com/sei-protocol/sei-wasmd v0.1.2/go.mod h1:CNF8PPkDFU0I/Lzw2+DbaNQhyxQj309ljOq7Waxj3fk= +github.com/sei-protocol/sei-wasmd v0.1.3 h1:8LtSauzetkPhjUN4uPTLMubSxr4rc7k9KWD9bnUf8xs= +github.com/sei-protocol/sei-wasmd v0.1.3/go.mod h1:CNF8PPkDFU0I/Lzw2+DbaNQhyxQj309ljOq7Waxj3fk= github.com/sei-protocol/tm-db v0.0.4 h1:7Y4EU62Xzzg6wKAHEotm7SXQR0aPLcGhKHkh3qd0tnk= github.com/sei-protocol/tm-db v0.0.4/go.mod h1:PWsIWOTwdwC7Ow/GUvx8HgUJTO691pBuorIQD8JvwAs= github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= From aaec77e020bfe8d82a0ba77019b5f7e8b61be4a0 Mon Sep 17 00:00:00 2001 From: Jeremy Wei Date: Wed, 8 May 2024 10:08:52 -0400 Subject: [PATCH 17/51] [EVM] add test for large gas estimate (#1631) * evm large gas estimate * fix * fix --- contracts/src/MultiSender.sol | 46 ++++++++++++++++++++++++++ contracts/test/EVMCompatabilityTest.js | 17 ++++++++++ 2 files changed, 63 insertions(+) create mode 100644 contracts/src/MultiSender.sol diff --git a/contracts/src/MultiSender.sol b/contracts/src/MultiSender.sol new file mode 100644 index 000000000..4a6fd0f97 --- /dev/null +++ b/contracts/src/MultiSender.sol @@ -0,0 +1,46 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.0; + +contract MultiSender { + event SendSuccessful( + address indexed sender, + address recipient, + uint256 amount + ); + + function batchTransferEqualAmount( + address[] calldata recipients, + uint256 amount + ) external payable { + uint256 totalAmount = amount * recipients.length; + require(msg.value >= totalAmount, "Insufficient amount sent"); + + for (uint256 i = 0; i < recipients.length; i++) { + bool success = payable(recipients[i]).send(amount); + require(success, "Failed to send Ether"); + emit SendSuccessful(msg.sender, recipients[i], amount); + } + } + + function batchTransfer( + address[] calldata recipients, + uint256[] calldata amounts + ) external payable { + require( + recipients.length == amounts.length, + "Recipients and amounts do not match" + ); + uint256 totalAmount = 0; + for (uint256 i = 0; i < amounts.length; i++) { + totalAmount += amounts[i]; + } + + require(msg.value >= totalAmount, "Insufficient amount sent"); + + for (uint256 i = 0; i < recipients.length; i++) { + bool success = payable(recipients[i]).send(amounts[i]); + require(success, "Failed to send Ether"); + emit SendSuccessful(msg.sender, recipients[i], amounts[i]); + } + } +} \ No newline at end of file diff --git a/contracts/test/EVMCompatabilityTest.js b/contracts/test/EVMCompatabilityTest.js index f608b3ec9..a11643e21 100644 --- a/contracts/test/EVMCompatabilityTest.js +++ b/contracts/test/EVMCompatabilityTest.js @@ -3,6 +3,7 @@ const {isBigNumber} = require("hardhat/common"); const {uniq, shuffle} = require("lodash"); const { ethers, upgrades } = require('hardhat'); const { getImplementationAddress } = require('@openzeppelin/upgrades-core'); +const { deployEvmContract } = require("./lib") function sleep(ms) { return new Promise(resolve => setTimeout(resolve, ms)); @@ -47,6 +48,15 @@ function generateWallet() { return wallet.connect(ethers.provider); } +function generateWallets(num) { + const arr = [] + for(let i=0; i wallet.address); + const gas = await batcher.batchTransferEqualAmount.estimateGas(wallets, 1000000000000, {value: 100000000000000}); + expect(gas).to.be.greaterThan(0); + }); + it("Should check the network status", async function () { const network = await ethers.provider.getNetwork(); expect(network).to.have.property('name'); From 9d9d7a684257f23e2cb3560de681236683e8d975 Mon Sep 17 00:00:00 2001 From: Jeremy Wei Date: Wed, 8 May 2024 10:19:57 -0400 Subject: [PATCH 18/51] Tests on pointers for sending to unassociated addrs (#1639) * unassociated addrs tests * fix * fix --- contracts/test/CW20toERC20PointerTest.js | 12 ++++++++++++ contracts/test/ERC20toCW20PointerTest.js | 13 ++++++++++++- 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/contracts/test/CW20toERC20PointerTest.js b/contracts/test/CW20toERC20PointerTest.js index 6ea2bed7e..69d9d0f2d 100644 --- a/contracts/test/CW20toERC20PointerTest.js +++ b/contracts/test/CW20toERC20PointerTest.js @@ -81,6 +81,18 @@ describe("CW20 to ERC20 Pointer", function () { expect(balanceAfter).to.equal((parseInt(balanceBefore) + 100).toString()) }); + it("transfer to unassociated address should fail", async function() { + const unassociatedSeiAddr = "sei1z7qugn2xy4ww0c9nsccftxw592n4xhxccmcf4q"; + const respBefore = await queryWasm(cw20Pointer, "balance", {address: accounts[1].seiAddress}) + const balanceBefore = respBefore.data.balance; + + await executeWasm(cw20Pointer, { transfer: { recipient: unassociatedSeiAddr, amount: "100" } }); + const respAfter = await queryWasm(cw20Pointer, "balance", {address: accounts[1].seiAddress}) + const balanceAfter = respAfter.data.balance; + + expect(balanceAfter).to.equal((parseInt(balanceBefore)).toString()) + }); + //TODO: other execute methods it("should increase and decrease allowance for a spender", async function() { diff --git a/contracts/test/ERC20toCW20PointerTest.js b/contracts/test/ERC20toCW20PointerTest.js index b750ce998..dc339c08f 100644 --- a/contracts/test/ERC20toCW20PointerTest.js +++ b/contracts/test/ERC20toCW20PointerTest.js @@ -97,9 +97,20 @@ describe("ERC20 to CW20 Pointer", function () { }); it("should fail transfer() if sender has insufficient balance", async function () { - let recipient = accounts[1]; + const recipient = accounts[1]; await expect(pointer.transfer(recipient.evmAddress, 20000000)).to.be.revertedWith("CosmWasm execute failed"); }); + + it("transfer to unassociated address should fail", async function() { + const unassociatedRecipient = "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266"; + await expect(pointer.transfer(unassociatedRecipient, 1)).to.be.revertedWithoutReason; + }); + + it("transfer to contract address should succeed", async function() { + const contract = await pointer.getAddress(); + const tx = await pointer.transfer(contract, 1); + await tx.wait(); + }); }); describe("approve()", function () { From 8b1f76d93d74dad27b08d1136ccfbff86ebdc002 Mon Sep 17 00:00:00 2001 From: Steven Landers Date: Wed, 8 May 2024 10:56:22 -0400 Subject: [PATCH 19/51] [EVM] Prevent registering pointers to pointers (#1638) * small test refactor * add coverage for keeper logic * cleanup * add register step to cw tests * add erc tests * update code id for error * goimports and cleanup --- contracts/test/CW20toERC20PointerTest.js | 20 +- contracts/test/CW721toERC721PointerTest.js | 25 +- contracts/test/ERC20toCW20PointerTest.js | 34 ++- contracts/test/ERC721toCW721PointerTest.js | 36 ++- contracts/test/lib.js | 76 +++++- x/evm/keeper/pointer.go | 87 +++---- x/evm/keeper/pointer_test.go | 263 ++++++++++++++++++--- 7 files changed, 411 insertions(+), 130 deletions(-) diff --git a/contracts/test/CW20toERC20PointerTest.js b/contracts/test/CW20toERC20PointerTest.js index 69d9d0f2d..87ec4b9e9 100644 --- a/contracts/test/CW20toERC20PointerTest.js +++ b/contracts/test/CW20toERC20PointerTest.js @@ -1,10 +1,8 @@ -const {fundAddress, storeWasm, instantiateWasm, getSeiAddress, getAdmin, queryWasm, executeWasm, deployEvmContract, setupSigners, - getEvmAddress +const {getAdmin, queryWasm, executeWasm, deployEvmContract, setupSigners, deployErc20PointerForCw20, deployWasm, WASM, + registerPointerForCw20 } = require("./lib") const { expect } = require("chai"); -const {getAdminAddress} = require("@openzeppelin/upgrades-core"); -const CW20_POINTER_WASM = "../example/cosmwasm/cw20/artifacts/cwerc20.wasm"; describe("CW20 to ERC20 Pointer", function () { let accounts; let testToken; @@ -29,8 +27,7 @@ describe("CW20 to ERC20 Pointer", function () { admin = await getAdmin() await setBalance(admin.evmAddress, 1000000000000) - const codeId = await storeWasm(CW20_POINTER_WASM) - cw20Pointer = await instantiateWasm(codeId, accounts[0].seiAddress, "cw20-erc20", {erc20_address: tokenAddr }) + cw20Pointer = await registerPointerForCw20(tokenAddr) }) async function assertUnsupported(addr, operation, args) { @@ -43,6 +40,17 @@ describe("CW20 to ERC20 Pointer", function () { } } + describe("validation", function(){ + it("should not allow a pointer to the pointer", async function(){ + try { + await deployErc20PointerForCw20(hre.ethers.provider, cw20Pointer, 5) + expect.fail(`Expected to be prevented from creating a pointer`); + } catch(e){ + expect(e.message).to.include("contract deployment failed"); + } + }) + }) + describe("query", function(){ it("should return token_info", async function(){ const result = await queryWasm(cw20Pointer, "token_info", {}) diff --git a/contracts/test/CW721toERC721PointerTest.js b/contracts/test/CW721toERC721PointerTest.js index 492b861d3..d0e0c36d0 100644 --- a/contracts/test/CW721toERC721PointerTest.js +++ b/contracts/test/CW721toERC721PointerTest.js @@ -1,8 +1,8 @@ -const {setupSigners, deployEvmContract, getAdmin, deployWasm, executeWasm, queryWasm} = require("./lib"); +const {setupSigners, deployEvmContract, getAdmin, deployWasm, executeWasm, queryWasm, deployErc20PointerForCw20, + deployErc721PointerForCw721, WASM, registerPointerForCw721 +} = require("./lib"); const {expect} = require("chai"); -const CW721_POINTER_WASM = "../example/cosmwasm/cw721/artifacts/cwerc721.wasm"; - describe("CW721 to ERC721 Pointer", function () { let accounts; let erc721; @@ -13,11 +13,8 @@ describe("CW721 to ERC721 Pointer", function () { accounts = await setupSigners(await hre.ethers.getSigners()) erc721 = await deployEvmContract("MyNFT") admin = await getAdmin() - pointer = await deployWasm(CW721_POINTER_WASM, - accounts[0].seiAddress, - "cw721-erc721", - {erc721_address: await erc721.getAddress() } - ) + + pointer = await registerPointerForCw721(await erc721.getAddress()) await (await erc721.mint(accounts[0].evmAddress, 1)).wait() await (await erc721.mint(accounts[1].evmAddress, 2)).wait() @@ -27,8 +24,18 @@ describe("CW721 to ERC721 Pointer", function () { await (await erc721.setApprovalForAll(admin.evmAddress, true)).wait(); }) - describe("query", function(){ + describe("validation", function(){ + it("should not allow a pointer to the pointer", async function(){ + try { + await deployErc721PointerForCw721(hre.ethers.provider, pointer, 5) + expect.fail(`Expected to be prevented from creating a pointer`); + } catch(e){ + expect(e.message).to.include("contract deployment failed"); + } + }) + }) + describe("query", function(){ it("should query the owner of a token", async function () { const result = await queryWasm(pointer, "owner_of", { token_id: "1" }); expect(result).to.deep.equal({data:{ diff --git a/contracts/test/ERC20toCW20PointerTest.js b/contracts/test/ERC20toCW20PointerTest.js index dc339c08f..a87bb6c44 100644 --- a/contracts/test/ERC20toCW20PointerTest.js +++ b/contracts/test/ERC20toCW20PointerTest.js @@ -1,21 +1,7 @@ -const {setupSigners, deployErc20PointerForCw20, getAdmin, storeWasm, instantiateWasm} = require("./lib"); +const {setupSigners, deployErc20PointerForCw20, getAdmin, deployWasm, WASM, ABI, registerPointerForCw20 +} = require("./lib"); const {expect} = require("chai"); -const CW20_BASE_WASM_LOCATION = "../contracts/wasm/cw20_base.wasm"; - -const erc20Abi = [ - "function name() view returns (string)", - "function symbol() view returns (string)", - "function decimals() view returns (uint8)", - "function totalSupply() view returns (uint256)", - "function balanceOf(address owner) view returns (uint256 balance)", - "function transfer(address to, uint amount) returns (bool)", - "function allowance(address owner, address spender) view returns (uint256)", - "function approve(address spender, uint256 value) returns (bool)", - "function transferFrom(address from, address to, uint value) returns (bool)" -]; - - describe("ERC20 to CW20 Pointer", function () { let accounts; let pointer; @@ -26,8 +12,7 @@ describe("ERC20 to CW20 Pointer", function () { accounts = await setupSigners(await hre.ethers.getSigners()) admin = await getAdmin() - const codeId = await storeWasm(CW20_BASE_WASM_LOCATION) - cw20Address = await instantiateWasm(codeId, accounts[0].seiAddress, "cw20", { + cw20Address = await deployWasm(WASM.CW20, accounts[0].seiAddress, "cw20", { name: "Test", symbol: "TEST", decimals: 6, @@ -43,10 +28,21 @@ describe("ERC20 to CW20 Pointer", function () { // deploy TestToken const pointerAddr = await deployErc20PointerForCw20(hre.ethers.provider, cw20Address) - const contract = new hre.ethers.Contract(pointerAddr, erc20Abi, hre.ethers.provider); + const contract = new hre.ethers.Contract(pointerAddr, ABI.ERC20, hre.ethers.provider); pointer = contract.connect(accounts[0].signer) }) + describe("validation", function(){ + it("should not allow a pointer to the pointer", async function(){ + try { + await registerPointerForCw20(await pointer.getAddress()) + expect.fail(`Expected to be prevented from creating a pointer`); + } catch(e){ + expect(e.message).to.include("contract deployment failed"); + } + }) + }) + describe("read", function(){ it("get name", async function () { const name = await pointer.name(); diff --git a/contracts/test/ERC721toCW721PointerTest.js b/contracts/test/ERC721toCW721PointerTest.js index 89a9f94d4..2b0e151a1 100644 --- a/contracts/test/ERC721toCW721PointerTest.js +++ b/contracts/test/ERC721toCW721PointerTest.js @@ -1,27 +1,10 @@ -const {setupSigners, deployErc721PointerForCw721, getAdmin, deployWasm, executeWasm} = require("./lib"); +const {setupSigners, deployErc721PointerForCw721, getAdmin, deployWasm, executeWasm, ABI, registerPointerForCw20, + registerPointerForCw721 +} = require("./lib"); const {expect} = require("chai"); const CW721_BASE_WASM_LOCATION = "../contracts/wasm/cw721_base.wasm"; -const erc721Abi = [ - "event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId)", - "event Transfer(address indexed from, address indexed to, uint256 indexed tokenId)", - "event ApprovalForAll(address indexed owner, address indexed operator, bool approved)", - "function name() view returns (string)", - "function symbol() view returns (string)", - "function totalSupply() view returns (uint256)", - "function tokenURI(uint256 tokenId) view returns (string)", - "function balanceOf(address owner) view returns (uint256 balance)", - "function ownerOf(uint256 tokenId) view returns (address owner)", - "function getApproved(uint256 tokenId) view returns (address operator)", - "function isApprovedForAll(address owner, address operator) view returns (bool)", - "function approve(address to, uint256 tokenId) returns (bool)", - "function setApprovalForAll(address operator, bool _approved) returns (bool)", - "function transferFrom(address from, address to, uint256 tokenId) returns (bool)", - "function safeTransferFrom(address from, address to, uint256 tokenId) returns (bool)", - "function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) returns (bool)" -]; - describe("ERC721 to CW721 Pointer", function () { let accounts; let pointerAcc0; @@ -44,11 +27,22 @@ describe("ERC721 to CW721 Pointer", function () { await executeWasm(cw721Address, { mint : { token_id : "3", owner : accounts[1].seiAddress, token_uri: "token uri 3"}}); const pointerAddr = await deployErc721PointerForCw721(hre.ethers.provider, cw721Address) - const contract = new hre.ethers.Contract(pointerAddr, erc721Abi, hre.ethers.provider); + const contract = new hre.ethers.Contract(pointerAddr, ABI.ERC721, hre.ethers.provider); pointerAcc0 = contract.connect(accounts[0].signer) pointerAcc1 = contract.connect(accounts[1].signer) }) + describe("validation", function(){ + it("should not allow a pointer to the pointer", async function(){ + try { + await registerPointerForCw721(await pointerAcc0.getAddress()) + expect.fail(`Expected to be prevented from creating a pointer`); + } catch(e){ + expect(e.message).to.include("contract deployment failed"); + } + }) + }) + describe("read", function(){ it("get name", async function () { const name = await pointerAcc0.name(); diff --git a/contracts/test/lib.js b/contracts/test/lib.js index 58cba6730..4a422413b 100644 --- a/contracts/test/lib.js +++ b/contracts/test/lib.js @@ -2,6 +2,45 @@ const { exec } = require("child_process"); // Importing exec from child_process const adminKeyName = "admin" +const ABI = { + ERC20: [ + "function name() view returns (string)", + "function symbol() view returns (string)", + "function decimals() view returns (uint8)", + "function totalSupply() view returns (uint256)", + "function balanceOf(address owner) view returns (uint256 balance)", + "function transfer(address to, uint amount) returns (bool)", + "function allowance(address owner, address spender) view returns (uint256)", + "function approve(address spender, uint256 value) returns (bool)", + "function transferFrom(address from, address to, uint value) returns (bool)" + ], + ERC721: [ + "event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId)", + "event Transfer(address indexed from, address indexed to, uint256 indexed tokenId)", + "event ApprovalForAll(address indexed owner, address indexed operator, bool approved)", + "function name() view returns (string)", + "function symbol() view returns (string)", + "function totalSupply() view returns (uint256)", + "function tokenURI(uint256 tokenId) view returns (string)", + "function balanceOf(address owner) view returns (uint256 balance)", + "function ownerOf(uint256 tokenId) view returns (address owner)", + "function getApproved(uint256 tokenId) view returns (address operator)", + "function isApprovedForAll(address owner, address operator) view returns (bool)", + "function approve(address to, uint256 tokenId) returns (bool)", + "function setApprovalForAll(address operator, bool _approved) returns (bool)", + "function transferFrom(address from, address to, uint256 tokenId) returns (bool)", + "function safeTransferFrom(address from, address to, uint256 tokenId) returns (bool)", + "function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) returns (bool)" + ], +} + +const WASM = { + CW721: "../contracts/wasm/cw721_base.wasm", + CW20: "../contracts/wasm/cw20_base.wasm", + POINTER_CW20: "../example/cosmwasm/cw20/artifacts/cwerc20.wasm", + POINTER_CW721: "../example/cosmwasm/cw721/artifacts/cwerc721.wasm", +} + function sleep(ms) { return new Promise(resolve => setTimeout(resolve, ms)); } @@ -116,15 +155,17 @@ async function getPointerForCw721(cw721Address) { return JSON.parse(output); } -async function deployErc20PointerForCw20(provider, cw20Address) { +async function deployErc20PointerForCw20(provider, cw20Address, attempts=10) { const command = `seid tx evm call-precompile pointer addCW20Pointer ${cw20Address} --from=admin -b block` const output = await execute(command); const txHash = output.replace(/.*0x/, "0x").trim() let attempt = 0; - while(attempt < 10) { + while(attempt < attempts) { const receipt = await provider.getTransactionReceipt(txHash); - if(receipt) { + if(receipt && receipt.status === 1) { return (await getPointerForCw20(cw20Address)).pointer + } else if(receipt){ + throw new Error("contract deployment failed") } await sleep(500) attempt++ @@ -139,8 +180,10 @@ async function deployErc721PointerForCw721(provider, cw721Address) { let attempt = 0; while(attempt < 10) { const receipt = await provider.getTransactionReceipt(txHash); - if(receipt) { + if(receipt && receipt.status === 1) { return (await getPointerForCw721(cw721Address)).pointer + } else if(receipt){ + throw new Error("contract deployment failed") } await sleep(500) attempt++ @@ -161,6 +204,27 @@ async function instantiateWasm(codeId, adminAddr, label, args = {}) { return getEventAttribute(response, "instantiate", "_contract_address"); } +async function registerPointerForCw20(erc20Address, fees="20000usei", from=adminKeyName) { + const command = `seid tx evm register-pointer ERC20 ${erc20Address} --from ${from} --fees ${fees} --broadcast-mode block -y -o json` + const output = await execute(command); + const response = JSON.parse(output) + if(response.code !== 0) { + throw new Error("contract deployment failed") + } + return getEventAttribute(response, "pointer_registered", "pointer_address") +} + +async function registerPointerForCw721(erc721Address, fees="20000usei", from=adminKeyName) { + const command = `seid tx evm register-pointer ERC721 ${erc721Address} --from ${from} --fees ${fees} --broadcast-mode block -y -o json` + const output = await execute(command); + const response = JSON.parse(output) + if(response.code !== 0) { + throw new Error("contract deployment failed") + } + return getEventAttribute(response, "pointer_registered", "pointer_address") + +} + async function getSeiAddress(evmAddress) { const command = `seid q evm sei-addr ${evmAddress} -o json` @@ -276,6 +340,8 @@ module.exports = { deployEvmContract, deployErc20PointerForCw20, deployErc721PointerForCw721, + registerPointerForCw20, + registerPointerForCw721, importKey, getNativeAccount, associateKey, @@ -283,4 +349,6 @@ module.exports = { bankSend, evmSend, waitForReceipt, + WASM, + ABI, }; diff --git a/x/evm/keeper/pointer.go b/x/evm/keeper/pointer.go index f5d75a4a8..e9b2e1a07 100644 --- a/x/evm/keeper/pointer.go +++ b/x/evm/keeper/pointer.go @@ -6,7 +6,9 @@ import ( "github.com/cosmos/cosmos-sdk/store/prefix" sdk "github.com/cosmos/cosmos-sdk/types" + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" "github.com/ethereum/go-ethereum/common" + "github.com/sei-protocol/sei-chain/x/evm/artifacts/cw20" "github.com/sei-protocol/sei-chain/x/evm/artifacts/cw721" "github.com/sei-protocol/sei-chain/x/evm/artifacts/erc20" @@ -15,15 +17,18 @@ import ( "github.com/sei-protocol/sei-chain/x/evm/types" ) +var ErrorPointerToPointerNotAllowed = sdkerrors.Wrap(sdkerrors.ErrInvalidRequest, "cannot create a pointer to a pointer") + +// ERC20 -> Native Token func (k *Keeper) SetERC20NativePointer(ctx sdk.Context, token string, addr common.Address) error { - err := k.setPointerInfo(ctx, types.PointerERC20NativeKey(token), addr[:], native.CurrentVersion) - if err != nil { - return err - } - return k.setPointerInfo(ctx, types.PointerReverseRegistryKey(addr), []byte(token), native.CurrentVersion) + return k.SetERC20NativePointerWithVersion(ctx, token, addr, native.CurrentVersion) } +// ERC20 -> Native Token func (k *Keeper) SetERC20NativePointerWithVersion(ctx sdk.Context, token string, addr common.Address, version uint16) error { + if k.cwAddressIsPointer(ctx, token) { + return ErrorPointerToPointerNotAllowed + } err := k.setPointerInfo(ctx, types.PointerERC20NativeKey(token), addr[:], version) if err != nil { return err @@ -31,6 +36,7 @@ func (k *Keeper) SetERC20NativePointerWithVersion(ctx sdk.Context, token string, return k.setPointerInfo(ctx, types.PointerReverseRegistryKey(addr), []byte(token), version) } +// ERC20 -> Native Token func (k *Keeper) GetERC20NativePointer(ctx sdk.Context, token string) (addr common.Address, version uint16, exists bool) { addrBz, version, exists := k.GetPointerInfo(ctx, types.PointerERC20NativeKey(token)) if exists { @@ -39,32 +45,25 @@ func (k *Keeper) GetERC20NativePointer(ctx sdk.Context, token string) (addr comm return } -func (k *Keeper) GetERC20NativeByPointer(ctx sdk.Context, addr common.Address) (token string, version uint16, exists bool) { - tokenBz, version, exists := k.GetPointerInfo(ctx, types.PointerReverseRegistryKey(addr)) - if exists { - token = string(tokenBz) - } - return -} - +// ERC20 -> Native Token func (k *Keeper) DeleteERC20NativePointer(ctx sdk.Context, token string, version uint16) { addr, _, exists := k.GetERC20NativePointer(ctx, token) if exists { k.deletePointerInfo(ctx, types.PointerERC20NativeKey(token), version) k.deletePointerInfo(ctx, types.PointerReverseRegistryKey(addr), version) } - } +// ERC20 -> CW20 func (k *Keeper) SetERC20CW20Pointer(ctx sdk.Context, cw20Address string, addr common.Address) error { - err := k.setPointerInfo(ctx, types.PointerERC20CW20Key(cw20Address), addr[:], cw20.CurrentVersion) - if err != nil { - return err - } - return k.setPointerInfo(ctx, types.PointerReverseRegistryKey(addr), []byte(cw20Address), cw20.CurrentVersion) + return k.SetERC20CW20PointerWithVersion(ctx, cw20Address, addr, cw20.CurrentVersion) } +// ERC20 -> CW20 func (k *Keeper) SetERC20CW20PointerWithVersion(ctx sdk.Context, cw20Address string, addr common.Address, version uint16) error { + if k.cwAddressIsPointer(ctx, cw20Address) { + return ErrorPointerToPointerNotAllowed + } err := k.setPointerInfo(ctx, types.PointerERC20CW20Key(cw20Address), addr[:], version) if err != nil { return err @@ -72,6 +71,7 @@ func (k *Keeper) SetERC20CW20PointerWithVersion(ctx sdk.Context, cw20Address str return k.setPointerInfo(ctx, types.PointerReverseRegistryKey(addr), []byte(cw20Address), version) } +// ERC20 -> CW20 func (k *Keeper) GetERC20CW20Pointer(ctx sdk.Context, cw20Address string) (addr common.Address, version uint16, exists bool) { addrBz, version, exists := k.GetPointerInfo(ctx, types.PointerERC20CW20Key(cw20Address)) if exists { @@ -80,32 +80,25 @@ func (k *Keeper) GetERC20CW20Pointer(ctx sdk.Context, cw20Address string) (addr return } -func (k *Keeper) GetERC20CW20ByPointer(ctx sdk.Context, addr common.Address) (cw20Address string, version uint16, exists bool) { - cw20AddressBz, version, exists := k.GetPointerInfo(ctx, types.PointerReverseRegistryKey(addr)) - if exists { - cw20Address = string(cw20AddressBz) - } - return -} - +// ERC20 -> CW20 func (k *Keeper) DeleteERC20CW20Pointer(ctx sdk.Context, cw20Address string, version uint16) { addr, _, exists := k.GetERC20CW20Pointer(ctx, cw20Address) if exists { k.deletePointerInfo(ctx, types.PointerERC20CW20Key(cw20Address), version) k.deletePointerInfo(ctx, types.PointerReverseRegistryKey(addr), version) } - } +// ERC721 -> CW721 func (k *Keeper) SetERC721CW721Pointer(ctx sdk.Context, cw721Address string, addr common.Address) error { - err := k.setPointerInfo(ctx, types.PointerERC721CW721Key(cw721Address), addr[:], cw721.CurrentVersion) - if err != nil { - return err - } - return k.setPointerInfo(ctx, types.PointerReverseRegistryKey(addr), []byte(cw721Address), cw721.CurrentVersion) + return k.SetERC721CW721PointerWithVersion(ctx, cw721Address, addr, cw721.CurrentVersion) } +// ERC721 -> CW721 func (k *Keeper) SetERC721CW721PointerWithVersion(ctx sdk.Context, cw721Address string, addr common.Address, version uint16) error { + if k.cwAddressIsPointer(ctx, cw721Address) { + return ErrorPointerToPointerNotAllowed + } err := k.setPointerInfo(ctx, types.PointerERC721CW721Key(cw721Address), addr[:], version) if err != nil { return err @@ -113,6 +106,7 @@ func (k *Keeper) SetERC721CW721PointerWithVersion(ctx sdk.Context, cw721Address return k.setPointerInfo(ctx, types.PointerReverseRegistryKey(addr), []byte(cw721Address), version) } +// ERC721 -> CW721 func (k *Keeper) GetERC721CW721Pointer(ctx sdk.Context, cw721Address string) (addr common.Address, version uint16, exists bool) { addrBz, version, exists := k.GetPointerInfo(ctx, types.PointerERC721CW721Key(cw721Address)) if exists { @@ -121,14 +115,7 @@ func (k *Keeper) GetERC721CW721Pointer(ctx sdk.Context, cw721Address string) (ad return } -func (k *Keeper) GetERC721CW721ByPointer(ctx sdk.Context, addr common.Address) (cw721Address string, version uint16, exists bool) { - cw721AddressBz, version, exists := k.GetPointerInfo(ctx, types.PointerReverseRegistryKey(addr)) - if exists { - cw721Address = string(cw721AddressBz) - } - return -} - +// ERC721 -> CW721 func (k *Keeper) DeleteERC721CW721Pointer(ctx sdk.Context, cw721Address string, version uint16) { addr, _, exists := k.GetERC721CW721Pointer(ctx, cw721Address) if exists { @@ -137,7 +124,11 @@ func (k *Keeper) DeleteERC721CW721Pointer(ctx sdk.Context, cw721Address string, } } +// CW20 -> ERC20 func (k *Keeper) SetCW20ERC20Pointer(ctx sdk.Context, erc20Address common.Address, addr string) error { + if k.evmAddressIsPointer(ctx, erc20Address) { + return ErrorPointerToPointerNotAllowed + } err := k.setPointerInfo(ctx, types.PointerCW20ERC20Key(erc20Address), []byte(addr), erc20.CurrentVersion) if err != nil { return err @@ -145,6 +136,7 @@ func (k *Keeper) SetCW20ERC20Pointer(ctx sdk.Context, erc20Address common.Addres return k.setPointerInfo(ctx, types.PointerReverseRegistryKey(common.BytesToAddress([]byte(addr))), erc20Address[:], erc20.CurrentVersion) } +// CW20 -> ERC20 func (k *Keeper) GetCW20ERC20Pointer(ctx sdk.Context, erc20Address common.Address) (addr sdk.AccAddress, version uint16, exists bool) { addrBz, version, exists := k.GetPointerInfo(ctx, types.PointerCW20ERC20Key(erc20Address)) if exists { @@ -153,7 +145,20 @@ func (k *Keeper) GetCW20ERC20Pointer(ctx sdk.Context, erc20Address common.Addres return } +func (k *Keeper) evmAddressIsPointer(ctx sdk.Context, addr common.Address) bool { + _, _, exists := k.GetPointerInfo(ctx, types.PointerReverseRegistryKey(addr)) + return exists +} + +func (k *Keeper) cwAddressIsPointer(ctx sdk.Context, addr string) bool { + _, _, exists := k.GetPointerInfo(ctx, types.PointerReverseRegistryKey(common.BytesToAddress([]byte(addr)))) + return exists +} + func (k *Keeper) SetCW721ERC721Pointer(ctx sdk.Context, erc721Address common.Address, addr string) error { + if k.evmAddressIsPointer(ctx, erc721Address) { + return ErrorPointerToPointerNotAllowed + } err := k.setPointerInfo(ctx, types.PointerCW721ERC721Key(erc721Address), []byte(addr), erc721.CurrentVersion) if err != nil { return err diff --git a/x/evm/keeper/pointer_test.go b/x/evm/keeper/pointer_test.go index 7d21bb107..b44fde796 100644 --- a/x/evm/keeper/pointer_test.go +++ b/x/evm/keeper/pointer_test.go @@ -3,41 +3,244 @@ package keeper_test import ( "testing" - testkeeper "github.com/sei-protocol/sei-chain/testutil/keeper" + "github.com/cosmos/cosmos-sdk/types" + "github.com/ethereum/go-ethereum/common" "github.com/stretchr/testify/require" + + testkeeper "github.com/sei-protocol/sei-chain/testutil/keeper" + "github.com/sei-protocol/sei-chain/x/evm/artifacts/cw20" + "github.com/sei-protocol/sei-chain/x/evm/artifacts/cw721" + "github.com/sei-protocol/sei-chain/x/evm/artifacts/native" + evmkeeper "github.com/sei-protocol/sei-chain/x/evm/keeper" ) -func TestERC20NativePointer(t *testing.T) { - k, ctx := testkeeper.MockEVMKeeper() - _, pointer := testkeeper.MockAddressPair() - require.Nil(t, k.SetERC20NativePointer(ctx, "test", pointer)) - require.NotNil(t, k.SetERC20NativePointer(ctx, "test", pointer)) // already set - addr, _, _ := k.GetERC20NativePointer(ctx, "test") - require.Equal(t, pointer, addr) - token, _, _ := k.GetERC20NativeByPointer(ctx, addr) - require.Equal(t, "test", token) +// allows us to permutate different pointer combinations +type handlers struct { + evmSetter func(ctx types.Context, token string, addr common.Address) error + evmGetter func(ctx types.Context, token string) (addr common.Address, version uint16, exists bool) + evmDeleter func(ctx types.Context, token string, version uint16) + cwSetter func(ctx types.Context, erc20Address common.Address, addr string) error + cwGetter func(ctx types.Context, erc20Address common.Address) (addr types.AccAddress, version uint16, exists bool) + cwDeleter func(ctx types.Context, erc20Address common.Address, version uint16) +} + +type seiPointerTest struct { + name string + getHandlers func(k *evmkeeper.Keeper) *handlers + version uint16 } -func TestSetERC20CW20Pointer(t *testing.T) { - k, ctx := testkeeper.MockEVMKeeper() - _, pointer := testkeeper.MockAddressPair() - cw20, _ := testkeeper.MockAddressPair() - require.Nil(t, k.SetERC20CW20Pointer(ctx, cw20.String(), pointer)) - require.NotNil(t, k.SetERC20CW20Pointer(ctx, cw20.String(), pointer)) // already set - addr, _, _ := k.GetERC20CW20Pointer(ctx, cw20.String()) - require.Equal(t, pointer, addr) - cw20Addr, _, _ := k.GetERC20CW20ByPointer(ctx, addr) - require.Equal(t, cw20.String(), cw20Addr) +func TestEVMtoCWPointers(t *testing.T) { + tests := []seiPointerTest{ + { + name: "ERC20NativePointer prevents pointer to cw20 pointer", + getHandlers: func(k *evmkeeper.Keeper) *handlers { + return &handlers{ + evmSetter: k.SetERC20NativePointer, + evmGetter: k.GetERC20NativePointer, + evmDeleter: k.DeleteERC20NativePointer, + cwSetter: k.SetCW20ERC20Pointer, + cwGetter: k.GetCW20ERC20Pointer, + } + }, + version: native.CurrentVersion, + }, + { + name: "ERC20NativePointer prevents pointer to cw721 pointer", + getHandlers: func(k *evmkeeper.Keeper) *handlers { + return &handlers{ + evmSetter: k.SetERC20NativePointer, + evmGetter: k.GetERC20NativePointer, + evmDeleter: k.DeleteERC20NativePointer, + cwSetter: k.SetCW721ERC721Pointer, + cwGetter: k.GetCW721ERC721Pointer, + } + }, + version: native.CurrentVersion, + }, + { + name: "ERC20CW20Pointer prevents pointer to cw721 pointer", + getHandlers: func(k *evmkeeper.Keeper) *handlers { + return &handlers{ + evmSetter: k.SetERC20CW20Pointer, + evmGetter: k.GetERC20CW20Pointer, + evmDeleter: k.DeleteERC20CW20Pointer, + cwSetter: k.SetCW721ERC721Pointer, + cwGetter: k.GetCW721ERC721Pointer, + } + }, + version: cw20.CurrentVersion, + }, + { + name: "ERC20CW20Pointer prevents pointer to cw20 pointer", + getHandlers: func(k *evmkeeper.Keeper) *handlers { + return &handlers{ + evmSetter: k.SetERC20CW20Pointer, + evmGetter: k.GetERC20CW20Pointer, + evmDeleter: k.DeleteERC20CW20Pointer, + cwSetter: k.SetCW20ERC20Pointer, + cwGetter: k.GetCW20ERC20Pointer, + } + }, + version: cw20.CurrentVersion, + }, + { + name: "ERC721CW721Pointer prevents pointer to cw721 pointer", + getHandlers: func(k *evmkeeper.Keeper) *handlers { + return &handlers{ + evmSetter: k.SetERC721CW721Pointer, + evmGetter: k.GetERC721CW721Pointer, + evmDeleter: k.DeleteERC721CW721Pointer, + cwSetter: k.SetCW721ERC721Pointer, + cwGetter: k.GetCW721ERC721Pointer, + } + }, + version: cw721.CurrentVersion, + }, + { + name: "ERC721CW721Pointer prevents pointer to cw20 pointer", + getHandlers: func(k *evmkeeper.Keeper) *handlers { + return &handlers{ + evmSetter: k.SetERC721CW721Pointer, + evmGetter: k.GetERC721CW721Pointer, + evmDeleter: k.DeleteERC721CW721Pointer, + cwSetter: k.SetCW20ERC20Pointer, + cwGetter: k.GetCW20ERC20Pointer, + } + }, + version: cw721.CurrentVersion, + }, + } + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + k, ctx := testkeeper.MockEVMKeeper() + handlers := test.getHandlers(k) + cwAddress, evmAddress := testkeeper.MockAddressPair() + + // create a pointer + require.Nil(t, handlers.evmSetter(ctx, cwAddress.String(), evmAddress)) + + // should exist + addr, _, exists := handlers.evmGetter(ctx, cwAddress.String()) + require.Equal(t, evmAddress, addr) + require.True(t, exists) + require.NotNil(t, handlers.evmSetter(ctx, cwAddress.String(), evmAddress)) + + // should delete + var version uint16 = 1 + if test.version != 0 { + version = test.version + } + handlers.evmDeleter(ctx, cwAddress.String(), version) + _, _, exists = handlers.evmGetter(ctx, cwAddress.String()) + require.False(t, exists) + + // setup target as pointer + require.Nil(t, handlers.cwSetter(ctx, evmAddress, cwAddress.String())) + _, _, exists = handlers.cwGetter(ctx, evmAddress) + require.True(t, exists) + + // should not allow pointer to pointer + require.Error(t, handlers.evmSetter(ctx, cwAddress.String(), evmAddress), evmkeeper.ErrorPointerToPointerNotAllowed) + + }) + } } -func TestERC721CW721Pointer(t *testing.T) { - k, ctx := testkeeper.MockEVMKeeper() - _, pointer := testkeeper.MockAddressPair() - cw721, _ := testkeeper.MockAddressPair() - require.Nil(t, k.SetERC721CW721Pointer(ctx, cw721.String(), pointer)) - require.NotNil(t, k.SetERC721CW721Pointer(ctx, cw721.String(), pointer)) // already set - addr, _, _ := k.GetERC721CW721Pointer(ctx, cw721.String()) - require.Equal(t, pointer, addr) - cw721Addr, _, _ := k.GetERC721CW721ByPointer(ctx, addr) - require.Equal(t, cw721.String(), cw721Addr) +func TestCWtoEVMPointers(t *testing.T) { + tests := []seiPointerTest{ + { + name: "CW20ERC20Pointer prevents pointer to native pointer", + getHandlers: func(k *evmkeeper.Keeper) *handlers { + return &handlers{ + cwSetter: k.SetCW20ERC20Pointer, + cwGetter: k.GetCW20ERC20Pointer, + evmSetter: k.SetERC20NativePointer, + evmGetter: k.GetERC20NativePointer, + } + }, + }, + { + name: "CW20ERC20Pointer prevents pointer to erc20 pointer", + getHandlers: func(k *evmkeeper.Keeper) *handlers { + return &handlers{ + cwSetter: k.SetCW20ERC20Pointer, + cwGetter: k.GetCW20ERC20Pointer, + evmSetter: k.SetERC20CW20Pointer, + evmGetter: k.GetERC20CW20Pointer, + } + }, + }, + { + name: "CW20ERC20Pointer prevents pointer to erc721 pointer", + getHandlers: func(k *evmkeeper.Keeper) *handlers { + return &handlers{ + cwSetter: k.SetCW20ERC20Pointer, + cwGetter: k.GetCW20ERC20Pointer, + evmSetter: k.SetERC721CW721Pointer, + evmGetter: k.GetERC721CW721Pointer, + } + }, + }, + { + name: "CW721ERC721Pointer prevents pointer to native pointer", + getHandlers: func(k *evmkeeper.Keeper) *handlers { + return &handlers{ + cwSetter: k.SetCW721ERC721Pointer, + cwGetter: k.GetCW721ERC721Pointer, + evmSetter: k.SetERC20NativePointer, + evmGetter: k.GetERC20NativePointer, + } + }, + }, + { + name: "CW721ERC721Pointer prevents pointer to erc721 pointer", + getHandlers: func(k *evmkeeper.Keeper) *handlers { + return &handlers{ + cwSetter: k.SetCW721ERC721Pointer, + cwGetter: k.GetCW721ERC721Pointer, + evmSetter: k.SetERC721CW721Pointer, + evmGetter: k.GetERC721CW721Pointer, + } + }, + }, + { + name: "CW721ERC721Pointer prevents pointer to erc20 pointer", + getHandlers: func(k *evmkeeper.Keeper) *handlers { + return &handlers{ + cwSetter: k.SetCW721ERC721Pointer, + cwGetter: k.GetCW721ERC721Pointer, + evmSetter: k.SetERC20CW20Pointer, + evmGetter: k.GetERC20CW20Pointer, + } + }, + }, + } + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + k, ctx := testkeeper.MockEVMKeeper() + handlers := test.getHandlers(k) + cwAddress, evmAddress := testkeeper.MockAddressPair() + + // create a pointer + require.Nil(t, handlers.cwSetter(ctx, evmAddress, cwAddress.String())) + + // should exist + addr, _, exists := handlers.cwGetter(ctx, evmAddress) + require.Equal(t, cwAddress, addr) + require.True(t, exists) + require.NotNil(t, handlers.cwSetter(ctx, evmAddress, cwAddress.String())) + + // create new address to test prevention logic + cwAddress2, evmAddress2 := testkeeper.MockAddressPair() + + // setup target as pointer (has to be evm so that the target exists) + require.Nil(t, handlers.evmSetter(ctx, cwAddress2.String(), evmAddress2)) + _, _, exists = handlers.evmGetter(ctx, cwAddress2.String()) + require.True(t, exists) + + // should not allow pointer to pointer + require.Error(t, handlers.cwSetter(ctx, evmAddress2, cwAddress2.String()), evmkeeper.ErrorPointerToPointerNotAllowed) + }) + } } From a6ca72f614ce332a7b7121fb6a9028e1f0cf981f Mon Sep 17 00:00:00 2001 From: Philip Su Date: Wed, 8 May 2024 08:50:43 -0700 Subject: [PATCH 20/51] Add v5.2.1 and v5.2.2 upgrade handler (#1643) Add v5.2.2 upgrade handler --- app/upgrades.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/upgrades.go b/app/upgrades.go index f0bf59d4e..a5c1dc5c8 100644 --- a/app/upgrades.go +++ b/app/upgrades.go @@ -94,6 +94,8 @@ var upgradesList = []string{ "v5.0.1", "v5.1.0", "v5.2.0", + "v5.2.1", + "v5.2.2", } // if there is an override list, use that instead, for integration tests From 8fc4dc6d4aaf9ad8a551978495f5c9107934bff3 Mon Sep 17 00:00:00 2001 From: codchen Date: Thu, 9 May 2024 14:46:08 +0800 Subject: [PATCH 21/51] Multiple Sec3 fixes (#1642) --- precompiles/pointer/Pointer.sol | 6 +++--- precompiles/pointer/pointer.go | 9 +++++++++ precompiles/wasmd/wasmd.go | 10 +++++++--- x/evm/client/cli/query.go | 9 +++++++++ x/evm/handler.go | 3 +++ x/evm/keeper/msg_server.go | 5 +++-- x/evm/keeper/precompile.go | 2 ++ 7 files changed, 36 insertions(+), 8 deletions(-) diff --git a/precompiles/pointer/Pointer.sol b/precompiles/pointer/Pointer.sol index d85893949..a9575b5d5 100644 --- a/precompiles/pointer/Pointer.sol +++ b/precompiles/pointer/Pointer.sol @@ -8,13 +8,13 @@ IPointer constant POINTER_CONTRACT = IPointer(POINTER_PRECOMPILE_ADDRESS); interface IPointer { function addNativePointer( string memory token - ) payable external returns (address ret); + ) external returns (address ret); function addCW20Pointer( string memory cwAddr - ) payable external returns (address ret); + ) external returns (address ret); function addCW721Pointer( string memory cwAddr - ) payable external returns (address ret); + ) external returns (address ret); } diff --git a/precompiles/pointer/pointer.go b/precompiles/pointer/pointer.go index 790e9b762..35d17f8bb 100644 --- a/precompiles/pointer/pointer.go +++ b/precompiles/pointer/pointer.go @@ -133,6 +133,9 @@ func (p Precompile) Run(*vm.EVM, common.Address, common.Address, []byte, *big.In } func (p Precompile) AddNative(ctx sdk.Context, method *ethabi.Method, caller common.Address, args []interface{}, value *big.Int, evm *vm.EVM, suppliedGas uint64) (ret []byte, remainingGas uint64, err error) { + if err := pcommon.ValidateNonPayable(value); err != nil { + return nil, 0, err + } if err := pcommon.ValidateArgsLength(args, 1); err != nil { return nil, 0, err } @@ -187,6 +190,9 @@ func (p Precompile) AddNative(ctx sdk.Context, method *ethabi.Method, caller com } func (p Precompile) AddCW20(ctx sdk.Context, method *ethabi.Method, caller common.Address, args []interface{}, value *big.Int, evm *vm.EVM, suppliedGas uint64) (ret []byte, remainingGas uint64, err error) { + if err := pcommon.ValidateNonPayable(value); err != nil { + return nil, 0, err + } if err := pcommon.ValidateArgsLength(args, 1); err != nil { return nil, 0, err } @@ -238,6 +244,9 @@ func (p Precompile) AddCW20(ctx sdk.Context, method *ethabi.Method, caller commo } func (p Precompile) AddCW721(ctx sdk.Context, method *ethabi.Method, caller common.Address, args []interface{}, value *big.Int, evm *vm.EVM, suppliedGas uint64) (ret []byte, remainingGas uint64, err error) { + if err := pcommon.ValidateNonPayable(value); err != nil { + return nil, 0, err + } if err := pcommon.ValidateArgsLength(args, 1); err != nil { return nil, 0, err } diff --git a/precompiles/wasmd/wasmd.go b/precompiles/wasmd/wasmd.go index e1487883d..e38cd6cfd 100644 --- a/precompiles/wasmd/wasmd.go +++ b/precompiles/wasmd/wasmd.go @@ -152,7 +152,7 @@ func (p Precompile) RunAndCalculateGas(evm *vm.EVM, caller common.Address, calli case ExecuteMethod: return p.execute(ctx, method, caller, callingContract, args, value, readOnly) case ExecuteBatchMethod: - return p.execute_batch(ctx, method, caller, callingContract, args, value, readOnly) + return p.executeBatch(ctx, method, caller, callingContract, args, value, readOnly) case QueryMethod: return p.query(ctx, method, args, value) } @@ -256,7 +256,7 @@ func (p Precompile) instantiate(ctx sdk.Context, method *abi.Method, caller comm return } -func (p Precompile) execute_batch(ctx sdk.Context, method *abi.Method, caller common.Address, callingContract common.Address, args []interface{}, value *big.Int, readOnly bool) (ret []byte, remainingGas uint64, rerr error) { +func (p Precompile) executeBatch(ctx sdk.Context, method *abi.Method, caller common.Address, callingContract common.Address, args []interface{}, value *big.Int, readOnly bool) (ret []byte, remainingGas uint64, rerr error) { defer func() { if err := recover(); err != nil { ret = nil @@ -319,7 +319,11 @@ func (p Precompile) execute_batch(ctx sdk.Context, method *abi.Method, caller co rerr = err return } - senderAddr := p.evmKeeper.GetSeiAddressOrDefault(ctx, caller) + senderAddr, senderAssociated := p.evmKeeper.GetSeiAddress(ctx, caller) + if !senderAssociated { + rerr = fmt.Errorf("sender %s is not associated", caller.Hex()) + return + } msg := executeMsg.Msg coinsBz := executeMsg.Coins coins := sdk.NewCoins() diff --git a/x/evm/client/cli/query.go b/x/evm/client/cli/query.go index 10120bac3..6209125b7 100644 --- a/x/evm/client/cli/query.go +++ b/x/evm/client/cli/query.go @@ -212,14 +212,23 @@ func CmdQueryERC20Payload() *cobra.Command { var bz []byte switch args[0] { case "transfer": + if len(args) != 3 { + return errors.New("expected usage: `seid tx evm erc20-payload transfer [to] [amount]`") + } to := common.HexToAddress(args[1]) amt, _ := sdk.NewIntFromString(args[2]) bz, err = abi.Pack(args[0], to, amt.BigInt()) case "approve": + if len(args) != 3 { + return errors.New("expected usage: `seid tx evm erc20-payload approve [spender] [amount]`") + } spender := common.HexToAddress(args[1]) amt, _ := sdk.NewIntFromString(args[2]) bz, err = abi.Pack(args[0], spender, amt.BigInt()) case "transferFrom": + if len(args) != 4 { + return errors.New("expected usage: `seid tx evm erc20-payload transferFrom [from] [to] [amount]`") + } from := common.HexToAddress(args[1]) to := common.HexToAddress(args[2]) amt, _ := sdk.NewIntFromString(args[3]) diff --git a/x/evm/handler.go b/x/evm/handler.go index f610540ec..9cff2a1d2 100644 --- a/x/evm/handler.go +++ b/x/evm/handler.go @@ -24,6 +24,9 @@ func NewHandler(k *keeper.Keeper) sdk.Handler { case *types.MsgSend: res, err := msgServer.Send(sdk.WrapSDKContext(ctx), msg) return sdk.WrapServiceResult(ctx, res, err) + case *types.MsgRegisterPointer: + res, err := msgServer.RegisterPointer(sdk.WrapSDKContext(ctx), msg) + return sdk.WrapServiceResult(ctx, res, err) default: errMsg := fmt.Sprintf("unrecognized %s message type: %T", types.ModuleName, msg) return nil, sdkerrors.Wrap(sdkerrors.ErrUnknownRequest, errMsg) diff --git a/x/evm/keeper/msg_server.go b/x/evm/keeper/msg_server.go index 5d7033149..43059ba73 100644 --- a/x/evm/keeper/msg_server.go +++ b/x/evm/keeper/msg_server.go @@ -84,8 +84,9 @@ func (server msgServer) EVMTransaction(goCtx context.Context, msg *types.MsgEVMT ) return } - receipt, err := server.writeReceipt(ctx, msg, tx, emsg, serverRes, stateDB) - if err != nil { + receipt, rerr := server.writeReceipt(ctx, msg, tx, emsg, serverRes, stateDB) + if rerr != nil { + err = rerr ctx.Logger().Error(fmt.Sprintf("failed to write EVM receipt: %s", err)) telemetry.IncrCounterWithLabels( diff --git a/x/evm/keeper/precompile.go b/x/evm/keeper/precompile.go index c2a8b5119..24a571493 100644 --- a/x/evm/keeper/precompile.go +++ b/x/evm/keeper/precompile.go @@ -5,6 +5,7 @@ import ( "github.com/sei-protocol/sei-chain/precompiles/bank" "github.com/sei-protocol/sei-chain/precompiles/gov" "github.com/sei-protocol/sei-chain/precompiles/staking" + "github.com/sei-protocol/sei-chain/precompiles/wasmd" ) // add any payable precompiles here @@ -13,6 +14,7 @@ var payablePrecompiles = map[string]struct{}{ bank.BankAddress: {}, staking.StakingAddress: {}, gov.GovAddress: {}, + wasmd.WasmdAddress: {}, } func IsPayablePrecompile(addr *common.Address) bool { From b843a73a4adc2be34ef926f6f82095ef8e867071 Mon Sep 17 00:00:00 2001 From: Jeremy Wei Date: Thu, 9 May 2024 09:17:36 -0400 Subject: [PATCH 22/51] cw20 erc20 execution tests (#1632) * cw20 erc20 execution tests * fix * fix * fix --- contracts/test/CW20toERC20PointerTest.js | 27 +++++++++++++++++++----- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/contracts/test/CW20toERC20PointerTest.js b/contracts/test/CW20toERC20PointerTest.js index 87ec4b9e9..123c5b674 100644 --- a/contracts/test/CW20toERC20PointerTest.js +++ b/contracts/test/CW20toERC20PointerTest.js @@ -101,10 +101,19 @@ describe("CW20 to ERC20 Pointer", function () { expect(balanceAfter).to.equal((parseInt(balanceBefore)).toString()) }); - //TODO: other execute methods + it("transfer to contract address should succeed", async function() { + const respBefore = await queryWasm(cw20Pointer, "balance", {address: admin.seiAddress}) + const balanceBefore = respBefore.data.balance; + + await executeWasm(cw20Pointer, { transfer: { recipient: cw20Pointer, amount: "100" } }); + const respAfter = await queryWasm(cw20Pointer, "balance", {address: admin.seiAddress}) + const balanceAfter = respAfter.data.balance; + + expect(balanceAfter).to.equal((parseInt(balanceBefore) - 100).toString()) + }) it("should increase and decrease allowance for a spender", async function() { - const spender = accounts[1].seiAddress + const spender = accounts[0].seiAddress await executeWasm(cw20Pointer, { increase_allowance: { spender: spender, amount: "300" } }); let allowance = await queryWasm(cw20Pointer, "allowance", { owner: admin.seiAddress, spender: spender }); @@ -116,7 +125,15 @@ describe("CW20 to ERC20 Pointer", function () { expect(allowance.data.allowance).to.equal("0"); }); + it("should transfer token using transferFrom", async function() { + const resp = await testToken.approve(admin.evmAddress, 100); + await resp.wait(); + const respBefore = await queryWasm(cw20Pointer, "balance", {address: accounts[0].seiAddress}); + const balanceBefore = respBefore.data.balance; + await executeWasm(cw20Pointer, { transfer_from: { owner: accounts[0].seiAddress, recipient: accounts[1].seiAddress, amount: "100" } }); + const respAfter = await queryWasm(cw20Pointer, "balance", {address: accounts[0].seiAddress}); + const balanceAfter = respAfter.data.balance; + expect(balanceAfter).to.equal((parseInt(balanceBefore) - 100).toString()) + }); }) - - -}) \ No newline at end of file +}) From 7a3a6cfbc3f25a9b51e4da7738d9afe09b454b64 Mon Sep 17 00:00:00 2001 From: Jeremy Wei Date: Thu, 9 May 2024 10:14:36 -0400 Subject: [PATCH 23/51] Dedicated seid commands for pointer registration (#1646) * added erc-pointer seid cmd * fix * fix --- contracts/test/lib.js | 8 ++-- precompiles/pointer/pointer.go | 3 +- x/evm/client/cli/native_tx.go | 80 ++++++++++++++++++++++++++++++++-- x/evm/client/cli/tx.go | 3 +- 4 files changed, 85 insertions(+), 9 deletions(-) diff --git a/contracts/test/lib.js b/contracts/test/lib.js index 4a422413b..25adb403c 100644 --- a/contracts/test/lib.js +++ b/contracts/test/lib.js @@ -156,7 +156,7 @@ async function getPointerForCw721(cw721Address) { } async function deployErc20PointerForCw20(provider, cw20Address, attempts=10) { - const command = `seid tx evm call-precompile pointer addCW20Pointer ${cw20Address} --from=admin -b block` + const command = `seid tx evm register-evm-pointer CW20 ${cw20Address} --from=admin -b block` const output = await execute(command); const txHash = output.replace(/.*0x/, "0x").trim() let attempt = 0; @@ -174,7 +174,7 @@ async function deployErc20PointerForCw20(provider, cw20Address, attempts=10) { } async function deployErc721PointerForCw721(provider, cw721Address) { - const command = `seid tx evm call-precompile pointer addCW721Pointer ${cw721Address} --from=admin -b block` + const command = `seid tx evm register-evm-pointer CW721 ${cw721Address} --from=admin -b block` const output = await execute(command); const txHash = output.replace(/.*0x/, "0x").trim() let attempt = 0; @@ -205,7 +205,7 @@ async function instantiateWasm(codeId, adminAddr, label, args = {}) { } async function registerPointerForCw20(erc20Address, fees="20000usei", from=adminKeyName) { - const command = `seid tx evm register-pointer ERC20 ${erc20Address} --from ${from} --fees ${fees} --broadcast-mode block -y -o json` + const command = `seid tx evm register-cw-pointer ERC20 ${erc20Address} --from ${from} --fees ${fees} --broadcast-mode block -y -o json` const output = await execute(command); const response = JSON.parse(output) if(response.code !== 0) { @@ -215,7 +215,7 @@ async function registerPointerForCw20(erc20Address, fees="20000usei", from=admin } async function registerPointerForCw721(erc721Address, fees="20000usei", from=adminKeyName) { - const command = `seid tx evm register-pointer ERC721 ${erc721Address} --from ${from} --fees ${fees} --broadcast-mode block -y -o json` + const command = `seid tx evm register-cw-pointer ERC721 ${erc721Address} --from ${from} --fees ${fees} --broadcast-mode block -y -o json` const output = await execute(command); const response = JSON.parse(output) if(response.code !== 0) { diff --git a/precompiles/pointer/pointer.go b/precompiles/pointer/pointer.go index 35d17f8bb..2dfe52c4c 100644 --- a/precompiles/pointer/pointer.go +++ b/precompiles/pointer/pointer.go @@ -24,6 +24,7 @@ import ( ) const ( + PrecompileName = "pointer" AddNativePointer = "addNativePointer" AddCW20Pointer = "addCW20Pointer" AddCW721Pointer = "addCW721Pointer" @@ -95,7 +96,7 @@ func (p Precompile) Address() common.Address { } func (p Precompile) GetName() string { - return "pointer" + return PrecompileName } func (p Precompile) RunAndCalculateGas(evm *vm.EVM, caller common.Address, callingContract common.Address, input []byte, suppliedGas uint64, value *big.Int, _ *tracing.Hooks, readOnly bool) (ret []byte, remainingGas uint64, err error) { diff --git a/x/evm/client/cli/native_tx.go b/x/evm/client/cli/native_tx.go index 180035041..e37b2dc40 100644 --- a/x/evm/client/cli/native_tx.go +++ b/x/evm/client/cli/native_tx.go @@ -1,14 +1,24 @@ package cli import ( + "fmt" + "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" + "github.com/ethereum/go-ethereum/common" + "github.com/sei-protocol/sei-chain/evmrpc" + "github.com/sei-protocol/sei-chain/precompiles" + "github.com/sei-protocol/sei-chain/precompiles/pointer" "github.com/sei-protocol/sei-chain/x/evm/types" "github.com/spf13/cobra" ) +const ( + FlagCwAddress = "cw-address" +) + func NativeSendTxCmd() *cobra.Command { cmd := &cobra.Command{ Use: "native-send [from_key_or_address] [to_evm_address] [amount]", @@ -46,10 +56,10 @@ func NativeSendTxCmd() *cobra.Command { return cmd } -func NativeRegisterPointerCmd() *cobra.Command { +func RegisterCwPointerCmd() *cobra.Command { cmd := &cobra.Command{ - Use: "register-pointer [pointer type] [erc address]", - Short: `Register a CosmWasm pointer for an ERC20/721 contract. Pointer type is either ERC20 or ERC721`, + Use: "register-cw-pointer [pointer type] [erc address]", + Short: `Register a CosmWasm pointer for an ERC20/721 contract. Pointer type is either ERC20 or ERC721.`, Args: cobra.ExactArgs(2), RunE: func(cmd *cobra.Command, args []string) error { clientCtx, err := client.GetClientTxContext(cmd) @@ -74,3 +84,67 @@ func NativeRegisterPointerCmd() *cobra.Command { return cmd } + +func RegisterEvmPointerCmd() *cobra.Command { + cmd := &cobra.Command{ + Use: "register-evm-pointer [pointer type] [cw-address] --gas-fee-cap= --gas-limit= --evm-rpc=", + Short: `Register an EVM pointer for a CosmWasm contract. Pointer type is either CW20, CW721, or NATIVE.`, + Args: cobra.ExactArgs(2), + RunE: func(cmd *cobra.Command, args []string) error { + pInfo := precompiles.GetPrecompileInfo(pointer.PrecompileName) + var payload []byte + var err error + switch args[0] { + case "CW20": + payload, err = getMethodPayload(pInfo.ABI, []string{pointer.AddCW20Pointer, args[1]}) + case "CW721": + payload, err = getMethodPayload(pInfo.ABI, []string{pointer.AddCW721Pointer, args[1]}) + case "NATIVE": + payload, err = getMethodPayload(pInfo.ABI, []string{pointer.AddNativePointer, args[1]}) + default: + return fmt.Errorf("invalid pointer type: %s", args[0]) + } + if err != nil { + return err + } + txData, err := getTxData(cmd) + if err != nil { + return err + } + key, err := getPrivateKey(cmd) + if err != nil { + return err + } + + rpc, err := cmd.Flags().GetString(FlagRPC) + if err != nil { + return err + } + nonce, err := getNonce(rpc, key.PublicKey) + if err != nil { + return err + } + + txData.Nonce = nonce + txData.Data = payload + addr := common.HexToAddress(pointer.PointerAddress) + txData.To = &addr + + resp, err := sendTx(txData, rpc, key) + if err != nil { + return err + } + + fmt.Println("Transaction hash:", resp.Hex()) + return nil + }, + } + + cmd.Flags().Uint64(FlagGasFeeCap, 1000000000000, "Gas fee cap for the transaction") + cmd.Flags().Uint64(FlagGas, 7000000, "Gas limit for the transaction") + cmd.Flags().String(FlagCwAddress, "", "CosmWasm contract address") + cmd.Flags().String(FlagRPC, fmt.Sprintf("http://%s:8545", evmrpc.LocalAddress), "RPC endpoint to send request to") + flags.AddTxFlagsToCmd(cmd) + + return cmd +} diff --git a/x/evm/client/cli/tx.go b/x/evm/client/cli/tx.go index 6cc9d3ce3..42e4f7ffa 100644 --- a/x/evm/client/cli/tx.go +++ b/x/evm/client/cli/tx.go @@ -63,7 +63,8 @@ func GetTxCmd() *cobra.Command { cmd.AddCommand(CmdERC20Send()) cmd.AddCommand(CmdCallPrecompile()) cmd.AddCommand(NativeSendTxCmd()) - cmd.AddCommand(NativeRegisterPointerCmd()) + cmd.AddCommand(RegisterCwPointerCmd()) + cmd.AddCommand(RegisterEvmPointerCmd()) cmd.AddCommand(NewAddERCNativePointerProposalTxCmd()) cmd.AddCommand(NewAddERCCW20PointerProposalTxCmd()) cmd.AddCommand(NewAddERCCW721PointerProposalTxCmd()) From 4a2218f84e810ee6a0b01318c81edcbd207dc836 Mon Sep 17 00:00:00 2001 From: codchen Date: Thu, 9 May 2024 23:27:58 +0800 Subject: [PATCH 24/51] Disallow circular interop call (#1647) * Disallow circular interop call * tests --------- Co-authored-by: Steven Landers --- app/app.go | 2 +- evmrpc/simulate.go | 6 +-- precompiles/wasmd/wasmd.go | 3 ++ precompiles/wasmd/wasmd_test.go | 10 ++++ x/evm/ante/fee.go | 1 - x/evm/keeper/evm.go | 92 +++++++++++++-------------------- x/evm/keeper/evm_test.go | 9 ++++ x/evm/keeper/msg_server.go | 1 - x/evm/state/statedb.go | 7 +-- x/evm/types/context.go | 28 ---------- 10 files changed, 62 insertions(+), 97 deletions(-) delete mode 100644 x/evm/types/context.go diff --git a/app/app.go b/app/app.go index 79f901e33..2b57885f5 100644 --- a/app/app.go +++ b/app/app.go @@ -1747,7 +1747,7 @@ func (app *App) RegisterTendermintService(clientCtx client.Context) { app.Logger().Error(fmt.Sprintf("failed to create query context for EVM; using latest context instead: %v+", err.Error())) return app.GetCheckCtx() } - return ctx + return ctx.WithIsEVM(true) } if app.evmRPCConfig.HTTPEnabled { evmHTTPServer, err := evmrpc.NewEVMHTTPServer(app.Logger(), app.evmRPCConfig, clientCtx.Client, &app.EvmKeeper, ctxProvider, app.encodingConfig.TxConfig, DefaultNodeHome) diff --git a/evmrpc/simulate.go b/evmrpc/simulate.go index f5067ccf8..9469e5734 100644 --- a/evmrpc/simulate.go +++ b/evmrpc/simulate.go @@ -351,11 +351,7 @@ func (b *Backend) GetEVM(_ context.Context, msg *core.Message, stateDB vm.StateD if blockCtx == nil { blockCtx, _ = b.keeper.GetVMBlockContext(b.ctxProvider(LatestCtxHeight), core.GasPool(b.RPCGasCap())) } - evm := vm.NewEVM(*blockCtx, txContext, stateDB, b.ChainConfig(), *vmConfig) - if dbImpl, ok := stateDB.(*state.DBImpl); ok { - dbImpl.SetEVM(evm) - } - return evm + return vm.NewEVM(*blockCtx, txContext, stateDB, b.ChainConfig(), *vmConfig) } func (b *Backend) CurrentHeader() *ethtypes.Header { diff --git a/precompiles/wasmd/wasmd.go b/precompiles/wasmd/wasmd.go index e38cd6cfd..6fbef9905 100644 --- a/precompiles/wasmd/wasmd.go +++ b/precompiles/wasmd/wasmd.go @@ -139,6 +139,9 @@ func (p Precompile) RunAndCalculateGas(evm *vm.EVM, caller common.Address, calli if err != nil { return nil, 0, err } + if method.Name != QueryMethod && !ctx.IsEVM() { + return nil, 0, errors.New("sei does not support CW->EVM->CW call pattern") + } gasMultipler := p.evmKeeper.GetPriorityNormalizer(ctx) gasLimitBigInt := sdk.NewDecFromInt(sdk.NewIntFromUint64(suppliedGas)).Mul(gasMultipler).TruncateInt().BigInt() if gasLimitBigInt.Cmp(utils.BigMaxU64) > 0 { diff --git a/precompiles/wasmd/wasmd_test.go b/precompiles/wasmd/wasmd_test.go index 3dd069bed..4dfbd65d4 100644 --- a/precompiles/wasmd/wasmd_test.go +++ b/precompiles/wasmd/wasmd_test.go @@ -40,6 +40,7 @@ func TestInstantiate(t *testing.T) { testApp := app.Setup(false, false) mockAddr, mockEVMAddr := testkeeper.MockAddressPair() ctx := testApp.GetContextForDeliverTx([]byte{}).WithBlockTime(time.Now()) + ctx = ctx.WithIsEVM(true) testApp.EvmKeeper.SetAddressMapping(ctx, mockAddr, mockEVMAddr) wasmKeeper := wasmkeeper.NewDefaultPermissionKeeper(testApp.WasmKeeper) p, err := wasmd.NewPrecompile(&testApp.EvmKeeper, wasmKeeper, testApp.WasmKeeper, testApp.BankKeeper) @@ -133,6 +134,7 @@ func TestExecute(t *testing.T) { testApp := app.Setup(false, false) mockAddr, mockEVMAddr := testkeeper.MockAddressPair() ctx := testApp.GetContextForDeliverTx([]byte{}).WithBlockTime(time.Now()) + ctx = ctx.WithIsEVM(true) testApp.EvmKeeper.SetAddressMapping(ctx, mockAddr, mockEVMAddr) wasmKeeper := wasmkeeper.NewDefaultPermissionKeeper(testApp.WasmKeeper) p, err := wasmd.NewPrecompile(&testApp.EvmKeeper, wasmKeeper, testApp.WasmKeeper, testApp.BankKeeper) @@ -161,6 +163,11 @@ func TestExecute(t *testing.T) { } suppliedGas := uint64(1000000) testApp.BankKeeper.SendCoins(ctx, mockAddr, testApp.EvmKeeper.GetSeiAddressOrDefault(ctx, common.HexToAddress(wasmd.WasmdAddress)), amts) + // circular interop + statedb.WithCtx(statedb.Ctx().WithIsEVM(false)) + _, _, err = p.RunAndCalculateGas(&evm, mockEVMAddr, mockEVMAddr, append(p.ExecuteID, args...), suppliedGas, big.NewInt(1000_000_000_000_000), nil, false) + require.Equal(t, "sei does not support CW->EVM->CW call pattern", err.Error()) + statedb.WithCtx(statedb.Ctx().WithIsEVM(true)) res, g, err := p.RunAndCalculateGas(&evm, mockEVMAddr, mockEVMAddr, append(p.ExecuteID, args...), suppliedGas, big.NewInt(1000_000_000_000_000), nil, false) require.Nil(t, err) outputs, err := executeMethod.Outputs.Unpack(res) @@ -229,6 +236,7 @@ func TestQuery(t *testing.T) { testApp := app.Setup(false, false) mockAddr, mockEVMAddr := testkeeper.MockAddressPair() ctx := testApp.GetContextForDeliverTx([]byte{}).WithBlockTime(time.Now()) + ctx = ctx.WithIsEVM(true) testApp.EvmKeeper.SetAddressMapping(ctx, mockAddr, mockEVMAddr) wasmKeeper := wasmkeeper.NewDefaultPermissionKeeper(testApp.WasmKeeper) p, err := wasmd.NewPrecompile(&testApp.EvmKeeper, wasmKeeper, testApp.WasmKeeper, testApp.BankKeeper) @@ -278,6 +286,7 @@ func TestExecuteBatchOneMessage(t *testing.T) { testApp := app.Setup(false, false) mockAddr, mockEVMAddr := testkeeper.MockAddressPair() ctx := testApp.GetContextForDeliverTx([]byte{}).WithBlockTime(time.Now()) + ctx = ctx.WithIsEVM(true) testApp.EvmKeeper.SetAddressMapping(ctx, mockAddr, mockEVMAddr) wasmKeeper := wasmkeeper.NewDefaultPermissionKeeper(testApp.WasmKeeper) p, err := wasmd.NewPrecompile(&testApp.EvmKeeper, wasmKeeper, testApp.WasmKeeper, testApp.BankKeeper) @@ -379,6 +388,7 @@ func TestExecuteBatchMultipleMessages(t *testing.T) { testApp := app.Setup(false, false) mockAddr, mockEVMAddr := testkeeper.MockAddressPair() ctx := testApp.GetContextForDeliverTx([]byte{}).WithBlockTime(time.Now()) + ctx = ctx.WithIsEVM(true) testApp.EvmKeeper.SetAddressMapping(ctx, mockAddr, mockEVMAddr) wasmKeeper := wasmkeeper.NewDefaultPermissionKeeper(testApp.WasmKeeper) p, err := wasmd.NewPrecompile(&testApp.EvmKeeper, wasmKeeper, testApp.WasmKeeper, testApp.BankKeeper) diff --git a/x/evm/ante/fee.go b/x/evm/ante/fee.go index d3517038b..9cb04160d 100644 --- a/x/evm/ante/fee.go +++ b/x/evm/ante/fee.go @@ -69,7 +69,6 @@ func (fc EVMFeeCheckDecorator) AnteHandle(ctx sdk.Context, tx sdk.Tx, simulate b cfg := evmtypes.DefaultChainConfig().EthereumConfig(fc.evmKeeper.ChainID(ctx)) txCtx := core.NewEVMTxContext(emsg) evmInstance := vm.NewEVM(*blockCtx, txCtx, stateDB, cfg, vm.Config{}) - stateDB.SetEVM(evmInstance) st := core.NewStateTransition(evmInstance, emsg, &gp, true) // run stateless checks before charging gas (mimicking Geth behavior) if !ctx.IsCheckTx() && !ctx.IsReCheckTx() { diff --git a/x/evm/keeper/evm.go b/x/evm/keeper/evm.go index 15b6b388a..357746c42 100644 --- a/x/evm/keeper/evm.go +++ b/x/evm/keeper/evm.go @@ -67,6 +67,9 @@ func (k *Keeper) HandleInternalEVMDelegateCall(ctx sdk.Context, req *types.MsgIn } func (k *Keeper) CallEVM(ctx sdk.Context, from common.Address, to *common.Address, val *sdk.Int, data []byte) (retdata []byte, reterr error) { + if ctx.IsEVM() { + return nil, errors.New("sei does not support EVM->CW->EVM call pattern") + } if to == nil && len(data) > params.MaxInitCodeSize { return nil, fmt.Errorf("%w: code size %v, limit %v", core.ErrMaxInitCodeSizeExceeded, len(data), params.MaxInitCodeSize) } @@ -77,57 +80,40 @@ func (k *Keeper) CallEVM(ctx sdk.Context, from common.Address, to *common.Addres } value = val.BigInt() } - evm := types.GetCtxEVM(ctx) - if evm == nil { - // This call was not part of an existing StateTransition, so it should trigger one - executionCtx := ctx.WithGasMeter(sdk.NewInfiniteGasMeterWithMultiplier(ctx)) - stateDB := state.NewDBImpl(executionCtx, k, false) - gp := k.GetGasPool() - evmMsg := &core.Message{ - Nonce: stateDB.GetNonce(from), // replay attack is prevented by the AccountSequence number set on the CW transaction that triggered this call - GasLimit: k.getEvmGasLimitFromCtx(ctx), - GasPrice: utils.Big0, // fees are already paid on the CW transaction - GasFeeCap: utils.Big0, - GasTipCap: utils.Big0, - To: to, - Value: value, - Data: data, - SkipAccountChecks: false, - From: from, - } - res, err := k.applyEVMMessage(ctx, evmMsg, stateDB, gp) - if err != nil { - return nil, err - } - k.consumeEvmGas(ctx, res.UsedGas) - if res.Err != nil { - return nil, res.Err - } - surplus, err := stateDB.Finalize() - if err != nil { - return nil, err - } - k.AppendToEvmTxDeferredInfo(ctx, ethtypes.Bloom{}, ethtypes.EmptyTxsHash, surplus) - return res.ReturnData, nil - } - // This call is part of an existing StateTransition, so directly invoking `Call` - var f EVMCallFunc - if to == nil { - // contract creation - f = func(caller vm.ContractRef, _ *common.Address, input []byte, gas uint64, value *big.Int) ([]byte, uint64, error) { - ret, _, leftoverGas, err := evm.Create(caller, input, gas, value) - return ret, leftoverGas, err - } - } else { - f = func(caller vm.ContractRef, addr *common.Address, input []byte, gas uint64, value *big.Int) ([]byte, uint64, error) { - return evm.Call(caller, *addr, input, gas, value) - } + // This call was not part of an existing StateTransition, so it should trigger one + executionCtx := ctx.WithGasMeter(sdk.NewInfiniteGasMeterWithMultiplier(ctx)) + stateDB := state.NewDBImpl(executionCtx, k, false) + gp := k.GetGasPool() + evmMsg := &core.Message{ + Nonce: stateDB.GetNonce(from), // replay attack is prevented by the AccountSequence number set on the CW transaction that triggered this call + GasLimit: k.getEvmGasLimitFromCtx(ctx), + GasPrice: utils.Big0, // fees are already paid on the CW transaction + GasFeeCap: utils.Big0, + GasTipCap: utils.Big0, + To: to, + Value: value, + Data: data, + SkipAccountChecks: false, + From: from, + } + res, err := k.applyEVMMessage(ctx, evmMsg, stateDB, gp) + if err != nil { + return nil, err } - return k.callEVM(ctx, from, to, val, data, f) + k.consumeEvmGas(ctx, res.UsedGas) + if res.Err != nil { + return nil, res.Err + } + surplus, err := stateDB.Finalize() + if err != nil { + return nil, err + } + k.AppendToEvmTxDeferredInfo(ctx, ethtypes.Bloom{}, ethtypes.EmptyTxsHash, surplus) + return res.ReturnData, nil } func (k *Keeper) StaticCallEVM(ctx sdk.Context, from sdk.AccAddress, to *common.Address, data []byte) ([]byte, error) { - evm, err := k.getOrCreateEVM(ctx, from) + evm, err := k.createReadOnlyEVM(ctx, from) if err != nil { return nil, err } @@ -151,13 +137,9 @@ func (k *Keeper) callEVM(ctx sdk.Context, from common.Address, to *common.Addres } // only used for StaticCalls -func (k *Keeper) getOrCreateEVM(ctx sdk.Context, from sdk.AccAddress) (*vm.EVM, error) { - evm := types.GetCtxEVM(ctx) - if evm != nil { - return evm, nil - } +func (k *Keeper) createReadOnlyEVM(ctx sdk.Context, from sdk.AccAddress) (*vm.EVM, error) { executionCtx := ctx.WithGasMeter(sdk.NewInfiniteGasMeterWithMultiplier(ctx)) - stateDB := state.NewDBImpl(executionCtx, k, false) + stateDB := state.NewDBImpl(executionCtx, k, true) gp := k.GetGasPool() blockCtx, err := k.GetVMBlockContext(executionCtx, gp) if err != nil { @@ -165,9 +147,7 @@ func (k *Keeper) getOrCreateEVM(ctx sdk.Context, from sdk.AccAddress) (*vm.EVM, } cfg := types.DefaultChainConfig().EthereumConfig(k.ChainID(ctx)) txCtx := vm.TxContext{Origin: k.GetEVMAddressOrDefault(ctx, from)} - evm = vm.NewEVM(*blockCtx, txCtx, stateDB, cfg, vm.Config{}) - stateDB.SetEVM(evm) - return evm, nil + return vm.NewEVM(*blockCtx, txCtx, stateDB, cfg, vm.Config{}), nil } func (k *Keeper) getEvmGasLimitFromCtx(ctx sdk.Context) uint64 { diff --git a/x/evm/keeper/evm_test.go b/x/evm/keeper/evm_test.go index a7e7fc024..81938a4d6 100644 --- a/x/evm/keeper/evm_test.go +++ b/x/evm/keeper/evm_test.go @@ -32,6 +32,11 @@ func TestInternalCallCreateContract(t *testing.T) { Sender: testAddr.String(), Data: contractData, } + // circular interop call + ctx = ctx.WithIsEVM(true) + _, err = k.HandleInternalEVMCall(ctx, req) + require.Equal(t, "sei does not support EVM->CW->EVM call pattern", err.Error()) + ctx = ctx.WithIsEVM(false) _, err = k.HandleInternalEVMCall(ctx, req) require.Nil(t, err) } @@ -55,6 +60,10 @@ func TestInternalCall(t *testing.T) { Sender: testAddr.String(), Data: contractData, } + ctx = ctx.WithIsEVM(true) + _, err = k.HandleInternalEVMCall(ctx, req) + require.Equal(t, "sei does not support EVM->CW->EVM call pattern", err.Error()) + ctx = ctx.WithIsEVM(false) ret, err := k.HandleInternalEVMCall(ctx, req) require.Nil(t, err) contractAddr := crypto.CreateAddress(senderEvmAddr, 0) diff --git a/x/evm/keeper/msg_server.go b/x/evm/keeper/msg_server.go index 43059ba73..f8f0f426a 100644 --- a/x/evm/keeper/msg_server.go +++ b/x/evm/keeper/msg_server.go @@ -206,7 +206,6 @@ func (k Keeper) applyEVMMessage(ctx sdk.Context, msg *core.Message, stateDB *sta cfg := types.DefaultChainConfig().EthereumConfig(k.ChainID(ctx)) txCtx := core.NewEVMTxContext(msg) evmInstance := vm.NewEVM(*blockCtx, txCtx, stateDB, cfg, vm.Config{}) - stateDB.SetEVM(evmInstance) st := core.NewStateTransition(evmInstance, msg, &gp, true) // fee already charged in ante handler res, err := st.TransitionDb() return res, err diff --git a/x/evm/state/statedb.go b/x/evm/state/statedb.go index c0bdecb76..7cd888e82 100644 --- a/x/evm/state/statedb.go +++ b/x/evm/state/statedb.go @@ -7,7 +7,6 @@ import ( ethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/core/vm" "github.com/sei-protocol/sei-chain/utils" - "github.com/sei-protocol/sei-chain/x/evm/types" ) // Initialized for each transaction individually @@ -73,10 +72,8 @@ func (s *DBImpl) SetLogger(logger *tracing.Hooks) { s.logger = logger } -func (s *DBImpl) SetEVM(evm *vm.EVM) { - s.ctx = types.SetCtxEVM(s.ctx, evm) - s.snapshottedCtxs = utils.Map(s.snapshottedCtxs, func(ctx sdk.Context) sdk.Context { return types.SetCtxEVM(ctx, evm) }) -} +// for interface compliance +func (s *DBImpl) SetEVM(evm *vm.EVM) {} // AddPreimage records a SHA3 preimage seen by the VM. // AddPreimage performs a no-op since the EnablePreimageRecording flag is disabled diff --git a/x/evm/types/context.go b/x/evm/types/context.go deleted file mode 100644 index e3a30f7a7..000000000 --- a/x/evm/types/context.go +++ /dev/null @@ -1,28 +0,0 @@ -package types - -import ( - "context" - - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/ethereum/go-ethereum/core/vm" -) - -type CtxEVMKeyType string - -const CtxEVMKey = CtxEVMKeyType("evm") - -func SetCtxEVM(ctx sdk.Context, evm *vm.EVM) sdk.Context { - return ctx.WithContext(context.WithValue(ctx.Context(), CtxEVMKey, evm)) -} - -func GetCtxEVM(ctx sdk.Context) *vm.EVM { - rawVal := ctx.Context().Value(CtxEVMKey) - if rawVal == nil { - return nil - } - evm, ok := rawVal.(*vm.EVM) - if !ok { - return nil - } - return evm -} From 105ef2ec9a4dd448c28d6f049f8587cf82afbad2 Mon Sep 17 00:00:00 2001 From: codchen Date: Fri, 10 May 2024 04:58:41 +0800 Subject: [PATCH 25/51] Lower associated TX balance requirement (#1648) --- x/evm/ante/preprocess.go | 31 ++++++++++++++++--------------- x/evm/ante/preprocess_test.go | 27 +++++++++++++++++++++------ 2 files changed, 37 insertions(+), 21 deletions(-) diff --git a/x/evm/ante/preprocess.go b/x/evm/ante/preprocess.go index ef48827d3..2b13571b6 100644 --- a/x/evm/ante/preprocess.go +++ b/x/evm/ante/preprocess.go @@ -15,7 +15,6 @@ import ( accountkeeper "github.com/cosmos/cosmos-sdk/x/auth/keeper" authsigning "github.com/cosmos/cosmos-sdk/x/auth/signing" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" - bankkeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" "github.com/ethereum/go-ethereum/common" ethtypes "github.com/ethereum/go-ethereum/core/types" @@ -73,20 +72,8 @@ func (p *EVMPreprocessDecorator) AnteHandle(ctx sdk.Context, tx sdk.Tx, simulate return ctx, sdkerrors.Wrap(sdkerrors.ErrInvalidRequest, "account already has association set") } else if isAssociateTx { // check if the account has enough balance (without charging) - baseDenom := p.evmKeeper.GetBaseDenom(ctx) - seiBalance := p.evmKeeper.BankKeeper().GetBalance(ctx, seiAddr, baseDenom).Amount - castBalance := p.evmKeeper.BankKeeper().GetBalance(ctx, sdk.AccAddress(evmAddr[:]), baseDenom).Amount - totalUsei := new(big.Int).Add(seiBalance.BigInt(), castBalance.BigInt()) - if totalUsei.Cmp(BigBalanceThreshold) < 0 { - if totalUsei.Cmp(BigBalanceThresholdMinus1) < 0 { - // no need to check for wei balances since the sum wouldn't reach 2usei - return ctx, sdkerrors.Wrap(sdkerrors.ErrInsufficientFunds, "account needs to have at least 1Sei to force association") - } - seiWeiBalance := p.evmKeeper.BankKeeper().GetWeiBalance(ctx, seiAddr) - evmWeiBalance := p.evmKeeper.BankKeeper().GetWeiBalance(ctx, sdk.AccAddress(evmAddr[:])) - if seiWeiBalance.Add(evmWeiBalance).LT(bankkeeper.OneUseiInWei) { - return ctx, sdkerrors.Wrap(sdkerrors.ErrInsufficientFunds, "account needs to have at least 1Sei to force association") - } + if !p.IsAccountBalancePositive(ctx, seiAddr, evmAddr) { + return ctx, sdkerrors.Wrap(sdkerrors.ErrInsufficientFunds, "account needs to have at least 1 wei to force association") } if err := p.AssociateAddresses(ctx, seiAddr, evmAddr, pubkey); err != nil { return ctx, err @@ -118,6 +105,20 @@ func (p *EVMPreprocessDecorator) AssociateAddresses(ctx sdk.Context, seiAddr sdk return migrateBalance(ctx, p.evmKeeper, evmAddr, seiAddr) } +func (p *EVMPreprocessDecorator) IsAccountBalancePositive(ctx sdk.Context, seiAddr sdk.AccAddress, evmAddr common.Address) bool { + baseDenom := p.evmKeeper.GetBaseDenom(ctx) + if amt := p.evmKeeper.BankKeeper().GetBalance(ctx, seiAddr, baseDenom).Amount; amt.IsPositive() { + return true + } + if amt := p.evmKeeper.BankKeeper().GetBalance(ctx, sdk.AccAddress(evmAddr[:]), baseDenom).Amount; amt.IsPositive() { + return true + } + if amt := p.evmKeeper.BankKeeper().GetWeiBalance(ctx, seiAddr); amt.IsPositive() { + return true + } + return p.evmKeeper.BankKeeper().GetWeiBalance(ctx, sdk.AccAddress(evmAddr[:])).IsPositive() +} + // stateless func Preprocess(ctx sdk.Context, msgEVMTransaction *evmtypes.MsgEVMTransaction) error { if msgEVMTransaction.Derived != nil { diff --git a/x/evm/ante/preprocess_test.go b/x/evm/ante/preprocess_test.go index bec4ea685..b1a31a74d 100644 --- a/x/evm/ante/preprocess_test.go +++ b/x/evm/ante/preprocess_test.go @@ -11,7 +11,6 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" sdkacltypes "github.com/cosmos/cosmos-sdk/types/accesscontrol" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" - bankkeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" "github.com/ethereum/go-ethereum/common" ethtypes "github.com/ethereum/go-ethereum/core/types" @@ -130,7 +129,7 @@ func TestPreprocessAssociateTx(t *testing.T) { require.True(t, ok) require.Equal(t, evmAddr, associated) - ctx, err = handler.AnteHandle(ctx, mockTx{msgs: []sdk.Msg{msg}}, false, func(ctx sdk.Context, _ sdk.Tx, _ bool) (sdk.Context, error) { + _, err = handler.AnteHandle(ctx, mockTx{msgs: []sdk.Msg{msg}}, false, func(ctx sdk.Context, _ sdk.Tx, _ bool) (sdk.Context, error) { panic("should not be called") }) // already associated @@ -157,12 +156,9 @@ func TestPreprocessAssociateTxWithWeiBalance(t *testing.T) { require.Nil(t, err) seiAddr := sdk.AccAddress(privKey.PubKey().Address()) evmAddr := crypto.PubkeyToAddress(key.PublicKey) - k.BankKeeper().AddCoins(ctx, seiAddr, sdk.NewCoins(sdk.NewCoin(k.GetBaseDenom(ctx), sdk.NewInt(int64(ante.BalanceThreshold-1)))), true) - k.BankKeeper().AddWei(ctx, sdk.AccAddress(evmAddr[:]), bankkeeper.OneUseiInWei.Sub(sdk.OneInt())) ctx, err = handler.AnteHandle(ctx, mockTx{msgs: []sdk.Msg{msg}}, false, func(ctx sdk.Context, _ sdk.Tx, _ bool) (sdk.Context, error) { panic("should not be called") }) - // not enough balance (0.9999999999999999 wei only) require.NotNil(t, err) k.BankKeeper().AddWei(ctx, seiAddr, sdk.OneInt()) ctx, err = handler.AnteHandle(ctx, mockTx{msgs: []sdk.Msg{msg}}, false, func(ctx sdk.Context, _ sdk.Tx, _ bool) (sdk.Context, error) { @@ -220,6 +216,25 @@ func TestEVMAddressDecorator(t *testing.T) { require.Equal(t, evmAddr, associatedEvmAddr) } +func TestIsAccountBalancePositive(t *testing.T) { + k, ctx := testkeeper.MockEVMKeeper() + s1, e1 := testkeeper.MockAddressPair() + s2, e2 := testkeeper.MockAddressPair() + s3, e3 := testkeeper.MockAddressPair() + s4, e4 := testkeeper.MockAddressPair() + s5, e5 := testkeeper.MockAddressPair() + require.Nil(t, k.BankKeeper().AddCoins(ctx, s1, sdk.NewCoins(sdk.NewCoin(k.GetBaseDenom(ctx), sdk.OneInt())), true)) + require.Nil(t, k.BankKeeper().AddCoins(ctx, sdk.AccAddress(e2[:]), sdk.NewCoins(sdk.NewCoin(k.GetBaseDenom(ctx), sdk.OneInt())), true)) + require.Nil(t, k.BankKeeper().AddWei(ctx, s3, sdk.OneInt())) + require.Nil(t, k.BankKeeper().AddWei(ctx, sdk.AccAddress(e4[:]), sdk.OneInt())) + handler := ante.NewEVMPreprocessDecorator(k, k.AccountKeeper()) + require.True(t, handler.IsAccountBalancePositive(ctx, s1, e1)) + require.True(t, handler.IsAccountBalancePositive(ctx, s2, e2)) + require.True(t, handler.IsAccountBalancePositive(ctx, s3, e3)) + require.True(t, handler.IsAccountBalancePositive(ctx, s4, e4)) + require.False(t, handler.IsAccountBalancePositive(ctx, s5, e5)) +} + // MockTxNotSigVerifiable is a simple mock transaction type that implements sdk.Tx but not SigVerifiableTx type MockTxIncompatible struct { msgs []sdk.Msg @@ -266,7 +281,7 @@ func TestEVMAddressDecoratorContinueDespiteErrors(t *testing.T) { // Prepare a SigVerifiableTx with a pubkey that fails to parse brokenPubKey := &secp256k1.PubKey{Key: []byte{1, 2, 3}} // deliberately too short to be valid k.AccountKeeper().SetAccount(ctx, authtypes.NewBaseAccount(sender, brokenPubKey, 1, 1)) - ctx, err = handler.AnteHandle(ctx, mockTx{msgs: []sdk.Msg{msg}, signers: []sdk.AccAddress{sender}}, false, func(ctx sdk.Context, _ sdk.Tx, _ bool) (sdk.Context, error) { + _, err = handler.AnteHandle(ctx, mockTx{msgs: []sdk.Msg{msg}, signers: []sdk.AccAddress{sender}}, false, func(ctx sdk.Context, _ sdk.Tx, _ bool) (sdk.Context, error) { return ctx, nil }) From b36bfe41bb7dcf935d338bebf82e412589dfeec2 Mon Sep 17 00:00:00 2001 From: Steven Landers Date: Thu, 9 May 2024 18:52:57 -0400 Subject: [PATCH 26/51] [EVM] Add additional chain-id validation (#1649) * add additional chain-id validation * update location, outside of checktx * add integration test * allow legacy txs * fix occ_tests * goimports * use a different chainID to be multi-env friendly * update tests * adjust to use switch * exit test sh on error --------- Co-authored-by: Philip Su --- contracts/test/EVMCompatabilityTest.js | 91 ++++++++++++++++++- .../scripts/evm_interoperability_tests.sh | 4 + .../evm_module/scripts/evm_tests.sh | 4 + occ_tests/messages/test_msgs.go | 3 +- occ_tests/occ_test.go | 62 +++++++------ occ_tests/utils/utils.go | 3 +- x/evm/ante/sig.go | 22 +++++ 7 files changed, 156 insertions(+), 33 deletions(-) diff --git a/contracts/test/EVMCompatabilityTest.js b/contracts/test/EVMCompatabilityTest.js index a11643e21..7dd54f136 100644 --- a/contracts/test/EVMCompatabilityTest.js +++ b/contracts/test/EVMCompatabilityTest.js @@ -3,7 +3,8 @@ const {isBigNumber} = require("hardhat/common"); const {uniq, shuffle} = require("lodash"); const { ethers, upgrades } = require('hardhat'); const { getImplementationAddress } = require('@openzeppelin/upgrades-core'); -const { deployEvmContract } = require("./lib") +const { deployEvmContract, setupSigners, fundAddress} = require("./lib") +const axios = require("axios"); function sleep(ms) { return new Promise(resolve => setTimeout(resolve, ms)); @@ -1072,6 +1073,94 @@ describe("EVM Test", function () { }); }); +describe("EVM Validations ", function() { + + describe("chainId", async function(){ + let signer; + + before(async function(){ + await setupSigners(await hre.ethers.getSigners()) + signer = generateWallet() + await fundAddress(await signer.getAddress()) + }) + + it("should prevent wrong chainId for eip-155 txs", async function() { + const nonce = await ethers.provider.getTransactionCount(signer, "pending") + + const signedTx = await signer.signTransaction({ + to: await signer.getAddress(), + value: 0, + chainId: "0x12345", + type: 2, + nonce: nonce, + maxPriorityFeePerGas: 21000, + gasLimit: 21000, + maxFeePerGas:10000000000}) + + const nodeUrl = 'http://localhost:8545'; + const response = await axios.post(nodeUrl, { + method: 'eth_sendRawTransaction', + params: [signedTx], + id: 1, + jsonrpc: "2.0" + }) + expect(response.data.error.message).to.include("invalid chain-id") + }); + + it("should prevent wrong chainId for legacy txs", async function() { + const nonce = await ethers.provider.getTransactionCount(signer, "pending") + + + // const accounts = await setupSigners(await hre.ethers.getSigners()) + const signedTx = await signer.signTransaction({ + type: 0, + to: await signer.getAddress(), + value: 0, + nonce: nonce, + chainId: "0x12345", + gasPrice: 1000000000000, + gasLimit: 21000}) + + const nodeUrl = 'http://localhost:8545'; + const response = await axios.post(nodeUrl, { + method: 'eth_sendRawTransaction', + params: [signedTx], + id: 1, + jsonrpc: "2.0" + }) + + expect(response.data.error.message).to.include("invalid chain-id") + }); + + it("should allow empty chainId for legacy txs", async function() { + const nonce = await ethers.provider.getTransactionCount(signer, "pending") + + // const accounts = await setupSigners(await hre.ethers.getSigners()) + const signedTx = await signer.signTransaction({ + type: 0, + to: await signer.getAddress(), + value: 0, + nonce: nonce, + gasPrice: 1000000000000, + gasLimit: 21000}) + + const nodeUrl = 'http://localhost:8545'; + const response = await axios.post(nodeUrl, { + method: 'eth_sendRawTransaction', + params: [signedTx], + id: 1, + jsonrpc: "2.0" + }) + + expect(response.data.result).to.match(/0x.*/) + }); + + + + }) + +}) + describe("EVM throughput", function(){ it("send 100 transactions from one account", async function(){ diff --git a/integration_test/evm_module/scripts/evm_interoperability_tests.sh b/integration_test/evm_module/scripts/evm_interoperability_tests.sh index 707991d57..a27acafa0 100755 --- a/integration_test/evm_module/scripts/evm_interoperability_tests.sh +++ b/integration_test/evm_module/scripts/evm_interoperability_tests.sh @@ -1,3 +1,7 @@ +#!/bin/bash + +set -e + cd contracts npm ci npx hardhat test --network seilocal test/CW20toERC20PointerTest.js diff --git a/integration_test/evm_module/scripts/evm_tests.sh b/integration_test/evm_module/scripts/evm_tests.sh index 8507a1019..32b647d49 100755 --- a/integration_test/evm_module/scripts/evm_tests.sh +++ b/integration_test/evm_module/scripts/evm_tests.sh @@ -1,3 +1,7 @@ +#!/bin/bash + +set -e + cd contracts npm ci npx hardhat test --network seilocal test/EVMCompatabilityTest.js diff --git a/occ_tests/messages/test_msgs.go b/occ_tests/messages/test_msgs.go index a9f3c2d2a..6ea0d5c65 100644 --- a/occ_tests/messages/test_msgs.go +++ b/occ_tests/messages/test_msgs.go @@ -11,6 +11,7 @@ import ( ethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/sei-protocol/sei-chain/occ_tests/utils" + "github.com/sei-protocol/sei-chain/x/evm/config" "github.com/sei-protocol/sei-chain/x/evm/types" "github.com/sei-protocol/sei-chain/x/evm/types/ethtx" ) @@ -84,7 +85,7 @@ func evmTransfer(testAcct utils.TestAcct, to common.Address, scenario string) *u GasFeeCap: new(big.Int).SetUint64(1000000000000), GasTipCap: new(big.Int).SetUint64(1000000000000), Gas: 21000, - ChainID: big.NewInt(1), + ChainID: big.NewInt(config.DefaultChainID), To: &to, Value: big.NewInt(1), Nonce: 0, diff --git a/occ_tests/occ_test.go b/occ_tests/occ_test.go index ff5cb3c0c..e78e6f4a4 100644 --- a/occ_tests/occ_test.go +++ b/occ_tests/occ_test.go @@ -170,38 +170,40 @@ func TestParallelTransactions(t *testing.T) { } for _, tt := range tests { - blockTime := time.Now() - accts := utils.NewTestAccounts(5) - - // execute sequentially, then in parallel - // the responses and state should match for both - sCtx := utils.NewTestContext(t, accts, blockTime, 1, false) - txs := tt.txs(sCtx) - if tt.shuffle { - txs = utils.Shuffle(txs) - } - - if tt.before != nil { - tt.before(sCtx) - } - - sEvts, sResults, _, sErr := utils.RunWithoutOCC(sCtx, txs) - require.NoError(t, sErr, tt.name) - require.Len(t, sResults, len(txs)) + t.Run(tt.name, func(t *testing.T) { + blockTime := time.Now() + accts := utils.NewTestAccounts(5) + + // execute sequentially, then in parallel + // the responses and state should match for both + sCtx := utils.NewTestContext(t, accts, blockTime, 1, false) + txs := tt.txs(sCtx) + if tt.shuffle { + txs = utils.Shuffle(txs) + } - for i := 0; i < tt.runs; i++ { - pCtx := utils.NewTestContext(t, accts, blockTime, config.DefaultConcurrencyWorkers, true) if tt.before != nil { - tt.before(pCtx) + tt.before(sCtx) } - pEvts, pResults, _, pErr := utils.RunWithOCC(pCtx, txs) - require.NoError(t, pErr, tt.name) - require.Len(t, pResults, len(txs)) - - assertExecTxResultCode(t, sResults, pResults, 0, tt.name) - assertEqualEvents(t, sEvts, pEvts, tt.name) - assertEqualExecTxResults(t, sResults, pResults, tt.name) - assertEqualState(t, sCtx.Ctx, pCtx.Ctx, tt.name) - } + + sEvts, sResults, _, sErr := utils.RunWithoutOCC(sCtx, txs) + require.NoError(t, sErr, tt.name) + require.Len(t, sResults, len(txs)) + + for i := 0; i < tt.runs; i++ { + pCtx := utils.NewTestContext(t, accts, blockTime, config.DefaultConcurrencyWorkers, true) + if tt.before != nil { + tt.before(pCtx) + } + pEvts, pResults, _, pErr := utils.RunWithOCC(pCtx, txs) + require.NoError(t, pErr, tt.name) + require.Len(t, pResults, len(txs)) + + assertExecTxResultCode(t, sResults, pResults, 0, tt.name) + assertEqualEvents(t, sEvts, pEvts, tt.name) + assertEqualExecTxResults(t, sResults, pResults, tt.name) + assertEqualState(t, sCtx.Ctx, pCtx.Ctx, tt.name) + } + }) } } diff --git a/occ_tests/utils/utils.go b/occ_tests/utils/utils.go index 4b20702ef..e64772664 100644 --- a/occ_tests/utils/utils.go +++ b/occ_tests/utils/utils.go @@ -35,6 +35,7 @@ import ( dexcache "github.com/sei-protocol/sei-chain/x/dex/cache" dextypes "github.com/sei-protocol/sei-chain/x/dex/types" dexutils "github.com/sei-protocol/sei-chain/x/dex/utils" + "github.com/sei-protocol/sei-chain/x/evm/config" types2 "github.com/sei-protocol/sei-chain/x/evm/types" minttypes "github.com/sei-protocol/sei-chain/x/mint/types" ) @@ -86,7 +87,7 @@ func NewSigner() TestAcct { pvKeyHex := hex.EncodeToString(priv1.Bytes()) key, _ := crypto.HexToECDSA(pvKeyHex) - ethCfg := types2.DefaultChainConfig().EthereumConfig(big.NewInt(1)) + ethCfg := types2.DefaultChainConfig().EthereumConfig(big.NewInt(config.DefaultChainID)) signer := ethtypes.MakeSigner(ethCfg, utils2.Big1, 1) address := crypto.PubkeyToAddress(key.PublicKey) diff --git a/x/evm/ante/sig.go b/x/evm/ante/sig.go index 55f3f69e7..4d0ed5a8c 100644 --- a/x/evm/ante/sig.go +++ b/x/evm/ante/sig.go @@ -1,8 +1,11 @@ package ante import ( + "math/big" + sdk "github.com/cosmos/cosmos-sdk/types" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + ethtypes "github.com/ethereum/go-ethereum/core/types" abci "github.com/tendermint/tendermint/abci/types" tmtypes "github.com/tendermint/tendermint/types" @@ -36,6 +39,25 @@ func (svd *EVMSigVerifyDecorator) AnteHandle(ctx sdk.Context, tx sdk.Tx, simulat ctx = ctx.WithEVMSenderAddress(evmAddr.Hex()) ctx = ctx.WithEVMTxHash(ethTx.Hash().Hex()) + chainID := svd.evmKeeper.ChainID(ctx) + txChainID := ethTx.ChainId() + + // validate chain ID on the transaction + switch ethTx.Type() { + case ethtypes.LegacyTxType: + // legacy either can have a zero or correct chain ID + if txChainID.Cmp(big.NewInt(0)) != 0 && txChainID.Cmp(chainID) != 0 { + ctx.Logger().Error("chainID mismatch", "txChainID", ethTx.ChainId(), "chainID", chainID) + return ctx, sdkerrors.ErrInvalidChainID + } + default: + // after legacy, all transactions must have the correct chain ID + if txChainID.Cmp(chainID) != 0 { + ctx.Logger().Error("chainID mismatch", "txChainID", ethTx.ChainId(), "chainID", chainID) + return ctx, sdkerrors.ErrInvalidChainID + } + } + if ctx.IsCheckTx() { if txNonce < nextNonce { return ctx, sdkerrors.ErrWrongSequence From 3cd47364f3ac27ad779817338cd81c4656854f4b Mon Sep 17 00:00:00 2001 From: codchen Date: Fri, 10 May 2024 12:12:30 +0800 Subject: [PATCH 27/51] Emit signer event for all transactions (#1651) --- x/evm/ante/preprocess.go | 11 ++++++++++- x/evm/types/events.go | 1 + 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/x/evm/ante/preprocess.go b/x/evm/ante/preprocess.go index 2b13571b6..1fb3415e7 100644 --- a/x/evm/ante/preprocess.go +++ b/x/evm/ante/preprocess.go @@ -65,6 +65,9 @@ func (p *EVMPreprocessDecorator) AnteHandle(ctx sdk.Context, tx sdk.Tx, simulate derived := msg.Derived seiAddr := derived.SenderSeiAddr evmAddr := derived.SenderEVMAddr + ctx.EventManager().EmitEvent(sdk.NewEvent(evmtypes.EventTypeSigner, + sdk.NewAttribute(evmtypes.AttributeKeyEvmAddress, evmAddr.Hex()), + sdk.NewAttribute(evmtypes.AttributeKeySeiAddress, seiAddr.String()))) pubkey := derived.PubKey isAssociateTx := derived.IsAssociate _, isAssociated := p.evmKeeper.GetEVMAddress(ctx, seiAddr) @@ -353,7 +356,10 @@ func (p *EVMAddressDecorator) AnteHandle(ctx sdk.Context, tx sdk.Tx, simulate bo } signers := sigTx.GetSigners() for _, signer := range signers { - if _, associated := p.evmKeeper.GetEVMAddress(ctx, signer); associated { + if evmAddr, associated := p.evmKeeper.GetEVMAddress(ctx, signer); associated { + ctx.EventManager().EmitEvent(sdk.NewEvent(evmtypes.EventTypeSigner, + sdk.NewAttribute(evmtypes.AttributeKeyEvmAddress, evmAddr.Hex()), + sdk.NewAttribute(evmtypes.AttributeKeySeiAddress, signer.String()))) continue } acc := p.accountKeeper.GetAccount(ctx, signer) @@ -371,6 +377,9 @@ func (p *EVMAddressDecorator) AnteHandle(ctx sdk.Context, tx sdk.Tx, simulate bo ctx.Logger().Error(fmt.Sprintf("failed to get EVM address from pubkey due to %s", err)) continue } + ctx.EventManager().EmitEvent(sdk.NewEvent(evmtypes.EventTypeSigner, + sdk.NewAttribute(evmtypes.AttributeKeyEvmAddress, evmAddr.Hex()), + sdk.NewAttribute(evmtypes.AttributeKeySeiAddress, signer.String()))) p.evmKeeper.SetAddressMapping(ctx, signer, evmAddr) if err := migrateBalance(ctx, p.evmKeeper, evmAddr, signer); err != nil { ctx.Logger().Error(fmt.Sprintf("failed to migrate EVM address balance (%s) %s", evmAddr.Hex(), err)) diff --git a/x/evm/types/events.go b/x/evm/types/events.go index 45ec378d9..92a8f171e 100644 --- a/x/evm/types/events.go +++ b/x/evm/types/events.go @@ -3,6 +3,7 @@ package types const ( EventTypeAddressAssociated = "address_associated" EventTypePointerRegistered = "pointer_registered" + EventTypeSigner = "signer" AttributeKeySeiAddress = "sei_addr" AttributeKeyEvmAddress = "evm_addr" From afaf78549c155575f9ce95280b7a436188765691 Mon Sep 17 00:00:00 2001 From: Jeremy Wei Date: Fri, 10 May 2024 16:34:10 -0400 Subject: [PATCH 28/51] refactor: Use geths hydrate tx (#1654) * use geth's hydrateTx * fix go mod * fix * fix * delete unused code * fix * bump geth version * fix * comment out Gov Precompile Tester for now --- contracts/test/EVMPrecompileTest.js | 58 +++++++-------- evmrpc/block.go | 9 ++- evmrpc/block_test.go | 4 +- evmrpc/tx.go | 21 ++++-- evmrpc/tx_test.go | 2 +- evmrpc/txpool.go | 18 +++-- evmrpc/utils.go | 109 ---------------------------- go.mod | 2 +- go.sum | 4 +- 9 files changed, 66 insertions(+), 161 deletions(-) diff --git a/contracts/test/EVMPrecompileTest.js b/contracts/test/EVMPrecompileTest.js index c094334f8..60ac53177 100644 --- a/contracts/test/EVMPrecompileTest.js +++ b/contracts/test/EVMPrecompileTest.js @@ -109,35 +109,35 @@ describe("EVM Test", function () { }); }); - // TODO: Update when we add gov query precompiles - describe("EVM Gov Precompile Tester", function () { - let govProposal; - // TODO: Import this - const GovPrecompileContract = '0x0000000000000000000000000000000000001006'; - before(async function() { - govProposal = readDeploymentOutput('gov_proposal_output.txt'); - await sleep(1000); - - // Create a proposal - const [signer, _] = await ethers.getSigners(); - owner = await signer.getAddress(); - - const contractABIPath = path.join(__dirname, '../../precompiles/gov/abi.json'); - const contractABI = require(contractABIPath); - // Get a contract instance - gov = new ethers.Contract(GovPrecompileContract, contractABI, signer); - }); - - it("Gov deposit", async function () { - const depositAmount = ethers.parseEther('0.01'); - const deposit = await gov.deposit(govProposal, { - value: depositAmount, - }) - const receipt = await deposit.wait(); - expect(receipt.status).to.equal(1); - // TODO: Add gov query precompile here - }); - }); + // // TODO: Update when we add gov query precompiles + // describe("EVM Gov Precompile Tester", function () { + // let govProposal; + // // TODO: Import this + // const GovPrecompileContract = '0x0000000000000000000000000000000000001006'; + // before(async function() { + // govProposal = readDeploymentOutput('gov_proposal_output.txt'); + // await sleep(1000); + + // // Create a proposal + // const [signer, _] = await ethers.getSigners(); + // owner = await signer.getAddress(); + + // const contractABIPath = path.join(__dirname, '../../precompiles/gov/abi.json'); + // const contractABI = require(contractABIPath); + // // Get a contract instance + // gov = new ethers.Contract(GovPrecompileContract, contractABI, signer); + // }); + + // it("Gov deposit", async function () { + // const depositAmount = ethers.parseEther('0.01'); + // const deposit = await gov.deposit(govProposal, { + // value: depositAmount, + // }) + // const receipt = await deposit.wait(); + // expect(receipt.status).to.equal(1); + // // TODO: Add gov query precompile here + // }); + // }); // TODO: Update when we add distribution query precompiles describe("EVM Distribution Precompile Tester", function () { diff --git a/evmrpc/block.go b/evmrpc/block.go index 81f834594..2b756d91f 100644 --- a/evmrpc/block.go +++ b/evmrpc/block.go @@ -13,6 +13,7 @@ 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/lib/ethapi" "github.com/ethereum/go-ethereum/rpc" "github.com/sei-protocol/sei-chain/x/evm/keeper" "github.com/sei-protocol/sei-chain/x/evm/types" @@ -152,12 +153,15 @@ func EncodeTmBlock( ) (map[string]interface{}, error) { number := big.NewInt(block.Block.Height) blockhash := common.HexToHash(block.BlockID.Hash.String()) + blockTime := block.Block.Time lastHash := common.HexToHash(block.Block.LastBlockID.Hash.String()) appHash := common.HexToHash(block.Block.AppHash.String()) txHash := common.HexToHash(block.Block.DataHash.String()) resultHash := common.HexToHash(block.Block.LastResultsHash.String()) miner := common.HexToAddress(block.Block.ProposerAddress.String()) + baseFeePerGas := k.GetBaseFeePerGas(ctx).TruncateInt().BigInt() gasLimit, gasWanted := int64(0), int64(0) + chainConfig := types.DefaultChainConfig().EthereumConfig(k.ChainID(ctx)) transactions := []interface{}{} for i, txRes := range blockRes.TxsResults { gasLimit += txRes.GasWanted @@ -181,7 +185,8 @@ func EncodeTmBlock( if err != nil { continue } - transactions = append(transactions, hydrateTransaction(ethtx, number, blockhash, receipt)) + newTx := ethapi.NewRPCTransaction(ethtx, blockhash, number.Uint64(), uint64(blockTime.Second()), uint64(receipt.TransactionIndex), baseFeePerGas, chainConfig) + transactions = append(transactions, newTx) } } } @@ -209,7 +214,7 @@ func EncodeTmBlock( "size": hexutil.Uint64(block.Block.Size()), "uncles": []common.Hash{}, // inapplicable to Sei "transactions": transactions, - "baseFeePerGas": (*hexutil.Big)(k.GetBaseFeePerGas(ctx).TruncateInt().BigInt()), + "baseFeePerGas": (*hexutil.Big)(baseFeePerGas), } if fullTx { result["totalDifficulty"] = (*hexutil.Big)(big.NewInt(0)) // inapplicable to Sei diff --git a/evmrpc/block_test.go b/evmrpc/block_test.go index 331158bdb..29aa42912 100644 --- a/evmrpc/block_test.go +++ b/evmrpc/block_test.go @@ -90,9 +90,9 @@ func verifyBlockResult(t *testing.T, resObj map[string]interface{}) { require.Equal(t, "0x65254651", resObj["timestamp"]) tx := resObj["transactions"].([]interface{})[0].(map[string]interface{}) require.Equal(t, "0x0000000000000000000000000000000000000000000000000000000000000001", tx["blockHash"]) - require.Equal(t, "0x1234567890123456789012345678901234567890", tx["from"]) + require.Equal(t, "0x5b4eba929f3811980f5ae0c5d04fa200f837df4e", tx["from"]) require.Equal(t, "0x3e8", tx["gas"]) - require.Equal(t, "0xa", tx["gasPrice"]) + require.Equal(t, "0x0", tx["gasPrice"]) require.Equal(t, "0xa", tx["maxFeePerGas"]) require.Equal(t, "0x0", tx["maxPriorityFeePerGas"]) require.Equal(t, "0xf02362077ac075a397344172496b28e913ce5294879d811bb0269b3be20a872e", tx["hash"]) diff --git a/evmrpc/tx.go b/evmrpc/tx.go index 16164cfa7..805d670fb 100644 --- a/evmrpc/tx.go +++ b/evmrpc/tx.go @@ -14,6 +14,7 @@ import ( "github.com/ethereum/go-ethereum/common/hexutil" ethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/lib/ethapi" "github.com/ethereum/go-ethereum/rpc" "github.com/sei-protocol/sei-chain/x/evm/keeper" "github.com/sei-protocol/sei-chain/x/evm/types" @@ -68,7 +69,7 @@ func (t *TransactionAPI) GetVMError(hash common.Hash) (result string, returnErr return receipt.VmError, nil } -func (t *TransactionAPI) GetTransactionByBlockNumberAndIndex(ctx context.Context, blockNr rpc.BlockNumber, index hexutil.Uint) (result *RPCTransaction, returnErr error) { +func (t *TransactionAPI) GetTransactionByBlockNumberAndIndex(ctx context.Context, blockNr rpc.BlockNumber, index hexutil.Uint) (result *ethapi.RPCTransaction, returnErr error) { startTime := time.Now() defer recordMetrics("eth_getTransactionByBlockNumberAndIndex", t.connectionType, startTime, returnErr == nil) blockNumber, err := getBlockNumber(ctx, t.tmClient, blockNr) @@ -82,7 +83,7 @@ func (t *TransactionAPI) GetTransactionByBlockNumberAndIndex(ctx context.Context return t.getTransactionWithBlock(block, index) } -func (t *TransactionAPI) GetTransactionByBlockHashAndIndex(ctx context.Context, blockHash common.Hash, index hexutil.Uint) (result *RPCTransaction, returnErr error) { +func (t *TransactionAPI) GetTransactionByBlockHashAndIndex(ctx context.Context, blockHash common.Hash, index hexutil.Uint) (result *ethapi.RPCTransaction, returnErr error) { startTime := time.Now() defer recordMetrics("eth_getTransactionByBlockHashAndIndex", t.connectionType, startTime, returnErr == nil) block, err := blockByHash(ctx, t.tmClient, blockHash[:]) @@ -92,7 +93,7 @@ func (t *TransactionAPI) GetTransactionByBlockHashAndIndex(ctx context.Context, return t.getTransactionWithBlock(block, index) } -func (t *TransactionAPI) GetTransactionByHash(ctx context.Context, hash common.Hash) (result *RPCTransaction, returnErr error) { +func (t *TransactionAPI) GetTransactionByHash(ctx context.Context, hash common.Hash) (result *ethapi.RPCTransaction, returnErr error) { startTime := time.Now() defer recordMetrics("eth_getTransactionByHash", t.connectionType, startTime, returnErr == nil) sdkCtx := t.ctxProvider(LatestCtxHeight) @@ -112,7 +113,7 @@ func (t *TransactionAPI) GetTransactionByHash(ctx context.Context, hash common.H ) from, _ := ethtypes.Sender(signer, etx) v, r, s := etx.RawSignatureValues() - res := RPCTransaction{ + res := ethapi.RPCTransaction{ Type: hexutil.Uint64(etx.Type()), From: from, Gas: hexutil.Uint64(etx.Gas()), @@ -181,7 +182,7 @@ func (t *TransactionAPI) GetTransactionCount(ctx context.Context, address common return (*hexutil.Uint64)(&nonce), nil } -func (t *TransactionAPI) getTransactionWithBlock(block *coretypes.ResultBlock, index hexutil.Uint) (*RPCTransaction, error) { +func (t *TransactionAPI) getTransactionWithBlock(block *coretypes.ResultBlock, index hexutil.Uint) (*ethapi.RPCTransaction, error) { if int(index) >= len(block.Block.Txs) { return nil, nil } @@ -193,8 +194,14 @@ func (t *TransactionAPI) getTransactionWithBlock(block *coretypes.ResultBlock, i if err != nil { return nil, err } - res := hydrateTransaction(ethtx, big.NewInt(block.Block.Height), common.HexToHash(block.BlockID.Hash.String()), receipt) - return &res, nil + height := int64(receipt.BlockNumber) + baseFeePerGas := t.keeper.GetBaseFee(t.ctxProvider(height)) + chainConfig := types.DefaultChainConfig().EthereumConfig(t.keeper.ChainID(t.ctxProvider(height))) + blockHash := common.HexToHash(block.BlockID.Hash.String()) + blockNumber := uint64(block.Block.Height) + blockTime := block.Block.Time + res := ethapi.NewRPCTransaction(ethtx, blockHash, blockNumber, uint64(blockTime.Second()), uint64(receipt.TransactionIndex), baseFeePerGas, chainConfig) + return res, nil } func (t *TransactionAPI) Sign(addr common.Address, data hexutil.Bytes) (result hexutil.Bytes, returnErr error) { diff --git a/evmrpc/tx_test.go b/evmrpc/tx_test.go index 26d464a75..002c31f87 100644 --- a/evmrpc/tx_test.go +++ b/evmrpc/tx_test.go @@ -117,7 +117,7 @@ func TestGetTransaction(t *testing.T) { resObj = resObj["result"].(map[string]interface{}) require.Equal(t, "0x0000000000000000000000000000000000000000000000000000000000000001", resObj["blockHash"].(string)) require.Equal(t, "0x8", resObj["blockNumber"].(string)) - require.Equal(t, "0x1234567890123456789012345678901234567890", resObj["from"].(string)) + require.Equal(t, "0x5b4eba929f3811980f5ae0c5d04fa200f837df4e", resObj["from"].(string)) require.Equal(t, "0x3e8", resObj["gas"].(string)) require.Equal(t, "0xa", resObj["gasPrice"].(string)) require.Equal(t, "0xa", resObj["maxFeePerGas"].(string)) diff --git a/evmrpc/txpool.go b/evmrpc/txpool.go index 8f77d996a..95d90bd1e 100644 --- a/evmrpc/txpool.go +++ b/evmrpc/txpool.go @@ -8,6 +8,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" ethtypes "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/lib/ethapi" "github.com/sei-protocol/sei-chain/x/evm/keeper" "github.com/sei-protocol/sei-chain/x/evm/types" rpcclient "github.com/tendermint/tendermint/rpc/client" @@ -31,12 +32,12 @@ func NewTxPoolAPI(tmClient rpcclient.Client, k *keeper.Keeper, ctxProvider func( } // For now, we put all unconfirmed txs in pending and none in queued -func (t *TxPoolAPI) Content(ctx context.Context) (result map[string]map[string]map[string]*RPCTransaction, returnErr error) { +func (t *TxPoolAPI) Content(ctx context.Context) (result map[string]map[string]map[string]*ethapi.RPCTransaction, returnErr error) { startTime := time.Now() defer recordMetrics("sei_content", t.connectionType, startTime, returnErr == nil) - content := map[string]map[string]map[string]*RPCTransaction{ - "pending": make(map[string]map[string]*RPCTransaction), - "queued": make(map[string]map[string]*RPCTransaction), + content := map[string]map[string]map[string]*ethapi.RPCTransaction{ + "pending": make(map[string]map[string]*ethapi.RPCTransaction), + "queued": make(map[string]map[string]*ethapi.RPCTransaction), } total := t.txPoolConfig.maxNumTxs @@ -63,14 +64,15 @@ func (t *TxPoolAPI) Content(ctx context.Context) (result map[string]map[string]m } nonce := ethTx.Nonce() - res := hydratePendingTransaction(ethTx) + chainConfig := types.DefaultChainConfig().EthereumConfig(t.keeper.ChainID(sdkCtx)) + res := ethapi.NewRPCPendingTransaction(ethTx, nil, chainConfig) nonceStr := strconv.FormatUint(nonce, 10) if content["pending"][fromAddr.String()] == nil { - content["pending"][fromAddr.String()] = map[string]*RPCTransaction{ - nonceStr: &res, + content["pending"][fromAddr.String()] = map[string]*ethapi.RPCTransaction{ + nonceStr: res, } } else { - content["pending"][fromAddr.String()][nonceStr] = &res + content["pending"][fromAddr.String()][nonceStr] = res } } return content, nil diff --git a/evmrpc/utils.go b/evmrpc/utils.go index 7b4c84aae..4e8a8e311 100644 --- a/evmrpc/utils.go +++ b/evmrpc/utils.go @@ -15,15 +15,10 @@ import ( "github.com/cosmos/cosmos-sdk/codec/legacy" "github.com/cosmos/cosmos-sdk/crypto/keyring" sdk "github.com/cosmos/cosmos-sdk/types" - "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/ethereum/go-ethereum/rpc" "github.com/sei-protocol/sei-chain/utils/metrics" - "github.com/sei-protocol/sei-chain/x/evm/ante" "github.com/sei-protocol/sei-chain/x/evm/keeper" - "github.com/sei-protocol/sei-chain/x/evm/types" "github.com/tendermint/tendermint/libs/bytes" rpcclient "github.com/tendermint/tendermint/rpc/client" "github.com/tendermint/tendermint/rpc/coretypes" @@ -36,110 +31,6 @@ const LatestCtxHeight int64 = -1 // the block is exactly half-utilized. const GasUsedRatio float64 = 0.5 -type RPCTransaction struct { - BlockHash *common.Hash `json:"blockHash"` - BlockNumber *hexutil.Big `json:"blockNumber"` - From common.Address `json:"from"` - Gas hexutil.Uint64 `json:"gas"` - GasPrice *hexutil.Big `json:"gasPrice"` - GasFeeCap *hexutil.Big `json:"maxFeePerGas,omitempty"` - GasTipCap *hexutil.Big `json:"maxPriorityFeePerGas,omitempty"` - MaxFeePerBlobGas *hexutil.Big `json:"maxFeePerBlobGas,omitempty"` - Hash common.Hash `json:"hash"` - Input hexutil.Bytes `json:"input"` - Nonce hexutil.Uint64 `json:"nonce"` - To *common.Address `json:"to"` - TransactionIndex *hexutil.Uint64 `json:"transactionIndex"` - Value *hexutil.Big `json:"value"` - Type hexutil.Uint64 `json:"type"` - Accesses *ethtypes.AccessList `json:"accessList,omitempty"` - ChainID *hexutil.Big `json:"chainId,omitempty"` - BlobVersionedHashes []common.Hash `json:"blobVersionedHashes,omitempty"` - V *hexutil.Big `json:"v"` - R *hexutil.Big `json:"r"` - S *hexutil.Big `json:"s"` - YParity *hexutil.Uint64 `json:"yParity,omitempty"` -} - -func hydrateTransaction( - tx *ethtypes.Transaction, - blocknumber *big.Int, - blockhash common.Hash, - receipt *types.Receipt, -) RPCTransaction { - idx := hexutil.Uint64(receipt.TransactionIndex) - al := tx.AccessList() - v, r, s := tx.RawSignatureValues() - var yparity *hexutil.Uint64 - if tx.Type() != ethtypes.LegacyTxType { - yp := hexutil.Uint64(v.Sign()) - yparity = &yp - } - return RPCTransaction{ - BlockHash: &blockhash, - BlockNumber: (*hexutil.Big)(blocknumber), - From: common.HexToAddress(receipt.From), - Gas: hexutil.Uint64(tx.Gas()), - GasPrice: (*hexutil.Big)(tx.GasPrice()), - GasFeeCap: (*hexutil.Big)(tx.GasFeeCap()), - GasTipCap: (*hexutil.Big)(tx.GasTipCap()), - MaxFeePerBlobGas: (*hexutil.Big)(tx.BlobGasFeeCap()), - Hash: tx.Hash(), - Input: tx.Data(), - Nonce: hexutil.Uint64(tx.Nonce()), - To: tx.To(), - Type: hexutil.Uint64(tx.Type()), - TransactionIndex: &idx, - Value: (*hexutil.Big)(tx.Value()), - Accesses: &al, - ChainID: (*hexutil.Big)(tx.ChainId()), - BlobVersionedHashes: tx.BlobHashes(), - V: (*hexutil.Big)(v), - S: (*hexutil.Big)(s), - R: (*hexutil.Big)(r), - YParity: yparity, - } -} - -func hydratePendingTransaction( - tx *ethtypes.Transaction, -) RPCTransaction { - v, r, s := tx.RawSignatureValues() - v = ante.AdjustV(v, tx.Type(), tx.ChainId()) - var yparity *hexutil.Uint64 - if tx.Type() != ethtypes.LegacyTxType { - yp := hexutil.Uint64(v.Sign()) - yparity = &yp - } - al := tx.AccessList() - signer := ethtypes.NewCancunSigner(tx.ChainId()) - fromAddr, err := signer.Sender(tx) - if err != nil { - return RPCTransaction{} - } - return RPCTransaction{ - From: fromAddr, - Gas: hexutil.Uint64(tx.Gas()), - GasPrice: (*hexutil.Big)(tx.GasPrice()), - GasFeeCap: (*hexutil.Big)(tx.GasFeeCap()), - GasTipCap: (*hexutil.Big)(tx.GasTipCap()), - MaxFeePerBlobGas: (*hexutil.Big)(tx.BlobGasFeeCap()), - Hash: tx.Hash(), - Input: tx.Data(), - Nonce: hexutil.Uint64(tx.Nonce()), - To: tx.To(), - Value: (*hexutil.Big)(tx.Value()), - Type: hexutil.Uint64(tx.Type()), - Accesses: &al, - ChainID: (*hexutil.Big)(tx.ChainId()), - BlobVersionedHashes: tx.BlobHashes(), - V: (*hexutil.Big)(v), - S: (*hexutil.Big)(s), - R: (*hexutil.Big)(r), - YParity: yparity, - } -} - func GetBlockNumberByNrOrHash(ctx context.Context, tmClient rpcclient.Client, blockNrOrHash rpc.BlockNumberOrHash) (*int64, error) { if blockNrOrHash.BlockHash != nil { res, err := blockByHash(ctx, tmClient, blockNrOrHash.BlockHash[:]) diff --git a/go.mod b/go.mod index 2c4da3eae..71851bea4 100644 --- a/go.mod +++ b/go.mod @@ -349,7 +349,7 @@ replace ( github.com/cosmos/cosmos-sdk => github.com/sei-protocol/sei-cosmos v0.3.11 github.com/cosmos/iavl => github.com/sei-protocol/sei-iavl v0.1.9 github.com/cosmos/ibc-go/v3 => github.com/sei-protocol/sei-ibc-go/v3 v3.3.0 - github.com/ethereum/go-ethereum => github.com/sei-protocol/go-ethereum v1.13.5-sei-16 + github.com/ethereum/go-ethereum => github.com/sei-protocol/go-ethereum v1.13.5-sei-17 github.com/gogo/protobuf => github.com/regen-network/protobuf v1.3.3-alpha.regen.1 github.com/sei-protocol/sei-db => github.com/sei-protocol/sei-db v0.0.36 // Latest goleveldb is broken, we have to stick to this version diff --git a/go.sum b/go.sum index 728acaf63..4e485c975 100644 --- a/go.sum +++ b/go.sum @@ -1343,8 +1343,8 @@ github.com/seccomp/libseccomp-golang v0.9.2-0.20220502022130-f33da4d89646/go.mod github.com/securego/gosec/v2 v2.11.0 h1:+PDkpzR41OI2jrw1q6AdXZCbsNGNGT7pQjal0H0cArI= github.com/securego/gosec/v2 v2.11.0/go.mod h1:SX8bptShuG8reGC0XS09+a4H2BoWSJi+fscA+Pulbpo= github.com/segmentio/fasthash v1.0.3/go.mod h1:waKX8l2N8yckOgmSsXJi7x1ZfdKZ4x7KRMzBtS3oedY= -github.com/sei-protocol/go-ethereum v1.13.5-sei-16 h1:bPQw44//5XHDZWfwO98g2Hie5HguxYZY+AiRsYMBdVg= -github.com/sei-protocol/go-ethereum v1.13.5-sei-16/go.mod h1:kcRZmuzRn1lVejiFNTz4l4W7imnpq1bDAnuKS/RyhbQ= +github.com/sei-protocol/go-ethereum v1.13.5-sei-17 h1:NQcNuL/nmLCzVJFj6Za4ZrNj1ODTmNKDH6ELrJIEpkY= +github.com/sei-protocol/go-ethereum v1.13.5-sei-17/go.mod h1:kcRZmuzRn1lVejiFNTz4l4W7imnpq1bDAnuKS/RyhbQ= github.com/sei-protocol/goutils v0.0.2 h1:Bfa7Sv+4CVLNM20QcpvGb81B8C5HkQC/kW1CQpIbXDA= github.com/sei-protocol/goutils v0.0.2/go.mod h1:iYE2DuJfEnM+APPehr2gOUXfuLuPsVxorcDO+Tzq9q8= github.com/sei-protocol/sei-cosmos v0.3.11 h1:mHhscQlvF6temJ8AsVBBAD6ZY44q5tUSgxhsMXrduRg= From 8bd8e9b14df1e4532b7a137c467e54a367d25b82 Mon Sep 17 00:00:00 2001 From: Steven Landers Date: Fri, 10 May 2024 16:59:11 -0400 Subject: [PATCH 29/51] [EVM] Fix precompile test flakiness (#1657) * fix precompile test * fix precompile on docker * prefund * fix throughput test * make address calculation resilient * fix funding issue --- .github/workflows/integration-test.yml | 2 - contracts/test/EVMCompatabilityTest.js | 58 +- contracts/test/EVMPrecompileTest.js | 534 +++++++----------- contracts/test/deploy_atom_erc20.sh | 27 - contracts/test/deploy_wasm_contract.sh | 26 - contracts/test/get_validator_address.sh | 12 - contracts/test/lib.js | 48 +- contracts/test/query_oracle_data.sh | 5 - contracts/test/send_gov_proposal.sh | 12 - integration_test/evm_module/hardhat_test.yaml | 17 - 10 files changed, 268 insertions(+), 473 deletions(-) delete mode 100644 contracts/test/deploy_atom_erc20.sh delete mode 100644 contracts/test/deploy_wasm_contract.sh delete mode 100644 contracts/test/get_validator_address.sh delete mode 100644 contracts/test/query_oracle_data.sh delete mode 100644 contracts/test/send_gov_proposal.sh delete mode 100644 integration_test/evm_module/hardhat_test.yaml diff --git a/.github/workflows/integration-test.yml b/.github/workflows/integration-test.yml index 398b390e8..a878de556 100644 --- a/.github/workflows/integration-test.yml +++ b/.github/workflows/integration-test.yml @@ -115,14 +115,12 @@ jobs: { name: "EVM Module", scripts: [ - "python3 integration_test/scripts/runner.py integration_test/evm_module/hardhat_test.yaml", "./integration_test/evm_module/scripts/evm_tests.sh", ] }, { name: "EVM Interoperability", scripts: [ - "python3 integration_test/scripts/runner.py integration_test/evm_module/hardhat_test.yaml", "./integration_test/evm_module/scripts/evm_interoperability_tests.sh" ] }, diff --git a/contracts/test/EVMCompatabilityTest.js b/contracts/test/EVMCompatabilityTest.js index 7dd54f136..ac9ce24c3 100644 --- a/contracts/test/EVMCompatabilityTest.js +++ b/contracts/test/EVMCompatabilityTest.js @@ -71,6 +71,7 @@ describe("EVM Test", function () { let testToken; let owner; let evmAddr; + let firstNonce; // The first contract address deployed from 0xF87A299e6bC7bEba58dbBe5a5Aa21d49bCD16D52 // should always be 0xbD5d765B226CaEA8507EE030565618dAFFD806e2 when sent with nonce=0 @@ -81,10 +82,12 @@ describe("EVM Test", function () { if(evmTester && testToken) { return } - let signers = await ethers.getSigners(); - owner = signers[0]; + const accounts = await setupSigners(await ethers.getSigners()) + owner = accounts[0].signer; debug(`OWNER = ${owner.address}`) + firstNonce = await ethers.provider.getTransactionCount(owner.address) + const TestToken = await ethers.getContractFactory("TestToken") testToken = await TestToken.deploy("TestToken", "TTK"); @@ -104,10 +107,14 @@ describe("EVM Test", function () { expect(await evmTester.getAddress()).to.be.properAddress; expect(await testToken.getAddress()).to.be.properAddress; expect(await evmTester.getAddress()).to.not.equal(await testToken.getAddress()); + }); - // The first contract address deployed from 0xF87A299e6bC7bEba58dbBe5a5Aa21d49bCD16D52 - // should always be 0xbD5d765B226CaEA8507EE030565618dAFFD806e2 when sent with nonce=0 - expect(await testToken.getAddress()).to.equal(firstContractAddress); + it("Should have correct address", async function () { + if(firstNonce > 0) { + this.skip() + } else { + expect(await testToken.getAddress()).to.equal(firstContractAddress); + } }); it("Should estimate gas for a contract deployment", async function () { @@ -456,7 +463,6 @@ describe("EVM Test", function () { const feeData = await ethers.provider.getFeeData(); const gasPrice = Number(feeData.gasPrice); const higherGasPrice = Number(gasPrice + 9) - console.log(`gasPrice = ${gasPrice}`) const zero = ethers.parseUnits('0', 'ether') const txResponse = await owner.sendTransaction({ @@ -505,8 +511,6 @@ describe("EVM Test", function () { describe("Differing maxPriorityFeePerGas and maxFeePerGas", async function() { for (const [name, maxPriorityFeePerGas, maxFeePerGas] of testCases) { it(`EIP-1559 test: ${name}`, async function() { - console.log(`maxPriorityFeePerGas = ${maxPriorityFeePerGas}`) - console.log(`maxFeePerGas = ${maxFeePerGas}`) const balanceBefore = await ethers.provider.getBalance(owner); const zero = ethers.parseUnits('0', 'ether') const txResponse = await owner.sendTransaction({ @@ -520,7 +524,6 @@ describe("EVM Test", function () { expect(receipt).to.not.be.null; expect(receipt.status).to.equal(1); const gasPrice = Number(receipt.gasPrice); - console.log(`gasPrice = ${gasPrice}`) const balanceAfter = await ethers.provider.getBalance(owner); @@ -528,12 +531,9 @@ describe("EVM Test", function () { Number(maxFeePerGas) - gasPrice, Number(maxPriorityFeePerGas) ); - console.log(`tip = ${tip}`) const effectiveGasPrice = tip + gasPrice; - console.log(`effectiveGasPrice = ${effectiveGasPrice}`) const diff = balanceBefore - balanceAfter; - console.log(`diff = ${diff}`) expect(diff).to.equal(21000 * effectiveGasPrice); }); } @@ -799,8 +799,8 @@ describe("EVM Test", function () { await txResponse.wait(); } blockEnd = await ethers.provider.getBlockNumber(); - console.log("blockStart = ", blockStart) - console.log("blockEnd = ", blockEnd) + debug("blockStart = ", blockStart) + debug("blockEnd = ", blockEnd) }); it("Block range filter", async function () { @@ -978,21 +978,19 @@ describe("EVM Test", function () { // deploy BoxV1 const Box = await ethers.getContractFactory("Box"); const val = 42; - console.log('Deploying Box...'); const box = await upgrades.deployProxy(Box, [val], { initializer: 'store' }); const boxReceipt = await box.waitForDeployment() - console.log("boxReceipt = ", JSON.stringify(boxReceipt)) const boxAddr = await box.getAddress(); const implementationAddress = await getImplementationAddress(ethers.provider, boxAddr); - console.log('Box Implementation address:', implementationAddress); - console.log('Box deployed to:', boxAddr) + debug('Box Implementation address:', implementationAddress); + debug('Box deployed to:', boxAddr) // make sure you can retrieve the value const retrievedValue = await box.retrieve(); expect(retrievedValue).to.equal(val); // increment value - console.log("Incrementing value...") + debug("Incrementing value...") const resp = await box.boxIncr(); await resp.wait(); @@ -1002,23 +1000,23 @@ describe("EVM Test", function () { // upgrade to BoxV2 const BoxV2 = await ethers.getContractFactory('BoxV2'); - console.log('Upgrading Box...'); + debug('Upgrading Box...'); const box2 = await upgrades.upgradeProxy(boxAddr, BoxV2, [val+1], { initializer: 'store' }); await box2.deployTransaction.wait(); - console.log('Box upgraded'); + debug('Box upgraded'); const boxV2Addr = await box2.getAddress(); expect(boxV2Addr).to.equal(boxAddr); // should be same address as it should be the proxy - console.log('BoxV2 deployed to:', boxV2Addr); + debug('BoxV2 deployed to:', boxV2Addr); const boxV2 = await BoxV2.attach(boxV2Addr); // check that value is still the same - console.log("Calling boxV2 retrieve()...") + debug("Calling boxV2 retrieve()...") const retrievedValue2 = await boxV2.retrieve(); - console.log("retrievedValue2 = ", retrievedValue2) + debug("retrievedValue2 = ", retrievedValue2) expect(retrievedValue2).to.equal(val+1); // use new function in boxV2 and increment value - console.log("Calling boxV2 boxV2Incr()...") + debug("Calling boxV2 boxV2Incr()...") const txResponse = await boxV2.boxV2Incr(); await txResponse.wait(); @@ -1162,13 +1160,17 @@ describe("EVM Validations ", function() { }) describe("EVM throughput", function(){ + let accounts; + before(async function(){ + accounts = await setupSigners(await hre.ethers.getSigners()) + await fundAddress(accounts[0].evmAddress) + }); it("send 100 transactions from one account", async function(){ const wallet = generateWallet() const toAddress =await wallet.getAddress() - const accounts = await ethers.getSigners(); - const sender = accounts[0] - const address = await sender.getAddress(); + const sender = accounts[0].signer + const address = accounts[0].evmAddress; const txCount = 100; const nonce = await ethers.provider.getTransactionCount(address); diff --git a/contracts/test/EVMPrecompileTest.js b/contracts/test/EVMPrecompileTest.js index 60ac53177..df831e643 100644 --- a/contracts/test/EVMPrecompileTest.js +++ b/contracts/test/EVMPrecompileTest.js @@ -4,369 +4,257 @@ const fs = require('fs'); const path = require('path'); const { expectRevert } = require('@openzeppelin/test-helpers'); +const {deployWasm, storeWasm, setupSigners, getAdmin, execute, isDocker, ABI} = require("./lib"); -describe("EVM Test", function () { - describe("EVM Precompile Tester", function () { - describe("EVM Bank Precompile Tester", function () { - let contractAddress; - let erc20; - let owner; - let owner2; - let signer; - let signer2 - before(async function() { - contractAddress = readDeploymentOutput('erc20_deploy_addr.txt'); - console.log("ERC20 address is:"); - console.log(contractAddress); - await sleep(1000); - - // Create a signer - [signer, signer2] = await ethers.getSigners(); - owner = await signer.getAddress(); - owner2 = await signer2.getAddress(); - - const contractABIPath = path.join(__dirname, '../../precompiles/common/erc20_abi.json'); - const contractABI = require(contractABIPath); - - // Get a contract instance - erc20 = new ethers.Contract(contractAddress, contractABI, signer); - - // force association on owner2 - const tx1 = await signer.sendTransaction({ - to: owner2, - value: 100000000000000 - }); - const receipt1 = await tx1.wait(); - expect(receipt1.status).to.equal(1); - const tx2 = await signer2.sendTransaction({ - to: owner, - value: 1 - }); - const receipt2 = await tx2.wait(); - expect(receipt2.status).to.equal(1); - }); - - it("Transfer function", async function() { - const beforeBalance = await erc20.balanceOf(owner); - const tx = await erc20.transfer(owner2, 1); - const receipt = await tx.wait(); - expect(receipt.status).to.equal(1); - const afterBalance = await erc20.balanceOf(owner); - const diff = beforeBalance - afterBalance; - expect(diff).to.equal(1); - }); - it("Transfer function with insufficient balance fails", async function() { - const receiver = '0x70997970C51812dc3A010C7d01b50e0d17dc79C8'; - await expectRevert.unspecified(erc20.transfer(receiver, 10000)); - }); - - it("No Approve and TransferFrom fails", async function() { - const receiver = '0x70997970C51812dc3A010C7d01b50e0d17dc79C8'; - const erc20AsOwner2 = erc20.connect(signer2); +describe("EVM Precompile Tester", function () { - await expectRevert.unspecified(erc20AsOwner2.transferFrom(owner, receiver, 100)); - }); + let accounts; + let admin; - it("Approve and TransferFrom functions", async function() { - // lets have owner approve the transfer and have owner2 do the transferring - const approvalAmount = await erc20.allowance(owner, owner2); - expect(approvalAmount).to.equal(0); - const approveTx = await erc20.approve(owner2, 100); - const approveReceipt = await approveTx.wait(); - expect(approveReceipt.status).to.equal(1); - expect(await erc20.allowance(owner, owner2)).to.equal(100); + before(async function () { + accounts = await setupSigners(await hre.ethers.getSigners()); + admin = await getAdmin(); + }) - const erc20AsOwner2 = erc20.connect(signer2); + describe("EVM Gov Precompile Tester", function () { + const GovPrecompileContract = '0x0000000000000000000000000000000000001006'; + let gov; + let govProposal; + before(async function () { + const govProposalResponse = JSON.parse(await execute(`seid tx gov submit-proposal param-change ../contracts/test/param_change_proposal.json --from admin --fees 20000usei -b block -y -o json`)) + govProposal = govProposalResponse.logs[0].events[3].attributes[1].value; - // transfer from owner to owner2 - const balanceBefore = await erc20.balanceOf(owner2); - const transferFromTx = await erc20AsOwner2.transferFrom(owner, owner2, 100); - - // await sleep(3000); - const transferFromReceipt = await transferFromTx.wait(); - expect(transferFromReceipt.status).to.equal(1); - const balanceAfter = await erc20.balanceOf(owner2); - const diff = balanceAfter - balanceBefore; - expect(diff).to.equal(100); - }); - - it("Balance of function", async function() { - const balance = await erc20.balanceOf(owner); - expect(balance).to.be.greaterThan(Number(0)); - }); - - it("Name function", async function () { - const name = await erc20.name() - expect(name).to.equal('UATOM'); - }); - - it("Symbol function", async function () { - const symbol = await erc20.symbol() - // expect symbol to be 'UATOM' - expect(symbol).to.equal('UATOM'); - }); + const signer = accounts[0].signer + const contractABIPath = '../../precompiles/gov/abi.json'; + const contractABI = require(contractABIPath); + // Get a contract instance + gov = new ethers.Contract(GovPrecompileContract, contractABI, signer); }); - // // TODO: Update when we add gov query precompiles - // describe("EVM Gov Precompile Tester", function () { - // let govProposal; - // // TODO: Import this - // const GovPrecompileContract = '0x0000000000000000000000000000000000001006'; - // before(async function() { - // govProposal = readDeploymentOutput('gov_proposal_output.txt'); - // await sleep(1000); - - // // Create a proposal - // const [signer, _] = await ethers.getSigners(); - // owner = await signer.getAddress(); - - // const contractABIPath = path.join(__dirname, '../../precompiles/gov/abi.json'); - // const contractABI = require(contractABIPath); - // // Get a contract instance - // gov = new ethers.Contract(GovPrecompileContract, contractABI, signer); - // }); - - // it("Gov deposit", async function () { - // const depositAmount = ethers.parseEther('0.01'); - // const deposit = await gov.deposit(govProposal, { - // value: depositAmount, - // }) - // const receipt = await deposit.wait(); - // expect(receipt.status).to.equal(1); - // // TODO: Add gov query precompile here - // }); - // }); - - // TODO: Update when we add distribution query precompiles - describe("EVM Distribution Precompile Tester", function () { - // TODO: Import this - const DistributionPrecompileContract = '0x0000000000000000000000000000000000001007'; - before(async function() { - const [signer, signer2] = await ethers.getSigners(); - owner = await signer.getAddress(); - owner2 = await signer2.getAddress(); - - const contractABIPath = path.join(__dirname, '../../precompiles/distribution/abi.json'); - const contractABI = require(contractABIPath); - // Get a contract instance - distribution = new ethers.Contract(DistributionPrecompileContract, contractABI, signer); - }); - - it("Distribution set withdraw address", async function () { - const setWithdraw = await distribution.setWithdrawAddress(owner) - const receipt = await setWithdraw.wait(); - expect(receipt.status).to.equal(1); - // TODO: Add distribution query precompile here - }); + it("Gov deposit", async function () { + const depositAmount = ethers.parseEther('0.01'); + const deposit = await gov.deposit(govProposal, { + value: depositAmount, + }) + const receipt = await deposit.wait(); + expect(receipt.status).to.equal(1); }); + }); - // TODO: Update when we add staking query precompiles - describe("EVM Staking Precompile Tester", function () { - const StakingPrecompileContract = '0x0000000000000000000000000000000000001005'; - before(async function() { - validatorAddr = readDeploymentOutput('validator_address.txt'); - await sleep(1000); - const [signer, _] = await ethers.getSigners(); - owner = await signer.getAddress(); - - const contractABIPath = path.join(__dirname, '../../precompiles/staking/abi.json'); - const contractABI = require(contractABIPath); - // Get a contract instance - staking = new ethers.Contract(StakingPrecompileContract, contractABI, signer); - }); - - it("Staking delegate", async function () { - const delegateAmount = ethers.parseEther('0.01'); - const delegate = await staking.delegate(validatorAddr, { - value: delegateAmount, - }); - const receipt = await delegate.wait(); - expect(receipt.status).to.equal(1); - // TODO: Add staking query precompile here - }); + // TODO: Update when we add distribution query precompiles + describe("EVM Distribution Precompile Tester", function () { + const DistributionPrecompileContract = '0x0000000000000000000000000000000000001007'; + let distribution; + before(async function () { + const signer = accounts[0].signer; + const contractABIPath = '../../precompiles/distribution/abi.json'; + const contractABI = require(contractABIPath); + // Get a contract instance + distribution = new ethers.Contract(DistributionPrecompileContract, contractABI, signer); }); - describe("EVM Oracle Precompile Tester", function () { - const OraclePrecompileContract = '0x0000000000000000000000000000000000001008'; - before(async function() { - const exchangeRatesContent = readDeploymentOutput('oracle_exchange_rates.json'); - const twapsContent = readDeploymentOutput('oracle_twaps.json'); + it("Distribution set withdraw address", async function () { + const setWithdraw = await distribution.setWithdrawAddress(accounts[0].evmAddress) + const receipt = await setWithdraw.wait(); + expect(receipt.status).to.equal(1); + }); + }); - exchangeRatesJSON = JSON.parse(exchangeRatesContent).denom_oracle_exchange_rate_pairs; - twapsJSON = JSON.parse(twapsContent).oracle_twaps; + // TODO: Update when we add staking query precompiles + describe("EVM Staking Precompile Tester", function () { + const StakingPrecompileContract = '0x0000000000000000000000000000000000001005'; + let validatorAddr; + let signer; + let staking; - const [signer, _] = await ethers.getSigners(); - owner = await signer.getAddress(); + before(async function () { + validatorAddr = JSON.parse(await execute("seid q staking validators -o json")).validators[0].operator_address + signer = accounts[0].signer; - const contractABIPath = path.join(__dirname, '../../precompiles/oracle/abi.json'); - const contractABI = require(contractABIPath); - // Get a contract instance - oracle = new ethers.Contract(OraclePrecompileContract, contractABI, signer); - }); - - it("Oracle Exchange Rates", async function () { - const exchangeRates = await oracle.getExchangeRates(); - const exchangeRatesLen = exchangeRatesJSON.length; - expect(exchangeRates.length).to.equal(exchangeRatesLen); - - for (let i = 0; i < exchangeRatesLen; i++) { - expect(exchangeRates[i].denom).to.equal(exchangeRatesJSON[i].denom); - expect(exchangeRates[i].oracleExchangeRateVal.exchangeRate).to.be.a('string').and.to.not.be.empty; - expect(exchangeRates[i].oracleExchangeRateVal.exchangeRate).to.be.a('string').and.to.not.be.empty; - expect(exchangeRates[i].oracleExchangeRateVal.lastUpdateTimestamp).to.exist.and.to.be.gt(0); - } - }); + const contractABIPath = '../../precompiles/staking/abi.json'; + const contractABI = require(contractABIPath); - it("Oracle Twaps", async function () { - const twaps = await oracle.getOracleTwaps(3600); - const twapsLen = twapsJSON.length - expect(twaps.length).to.equal(twapsLen); + staking = new ethers.Contract(StakingPrecompileContract, contractABI, signer); + }); - for (let i = 0; i < twapsLen; i++) { - expect(twaps[i].denom).to.equal(twapsJSON[i].denom); - expect(twaps[i].twap).to.be.a('string').and.to.not.be.empty; - expect(twaps[i].lookbackSeconds).to.exist.and.to.be.gt(0); - } + it("Staking delegate", async function () { + const delegateAmount = ethers.parseEther('0.01'); + const delegate = await staking.delegate(validatorAddr, { + value: delegateAmount, }); + const receipt = await delegate.wait(); + expect(receipt.status).to.equal(1); + // TODO: Add staking query precompile here }); + }); - describe("EVM Wasm Precompile Tester", function () { - const WasmPrecompileContract = '0x0000000000000000000000000000000000001002'; - before(async function() { - wasmContractAddress = readDeploymentOutput('wasm_contract_addr.txt'); - wasmCodeID = parseInt(readDeploymentOutput('wasm_code_id.txt')); + describe("EVM Oracle Precompile Tester", function () { + const OraclePrecompileContract = '0x0000000000000000000000000000000000001008'; + let oracle; + let twapsJSON; + let exchangeRatesJSON; + + before(async function() { + // this requires an oracle to run which does not happen outside of an integration test + if(!await isDocker()) { + this.skip() + return; + } + const exchangeRatesContent = await execute("seid q oracle exchange-rates -o json") + const twapsContent = await execute("seid q oracle twaps 3600 -o json") + + exchangeRatesJSON = JSON.parse(exchangeRatesContent).denom_oracle_exchange_rate_pairs; + twapsJSON = JSON.parse(twapsContent).oracle_twaps; + + const contractABIPath = '../../precompiles/oracle/abi.json'; + const contractABI = require(contractABIPath); + // Get a contract instance + oracle = new ethers.Contract(OraclePrecompileContract, contractABI, accounts[0].signer); + }); - const [signer, _] = await ethers.getSigners(); - owner = await signer.getAddress(); + it("Oracle Exchange Rates", async function () { + const exchangeRates = await oracle.getExchangeRates(); + const exchangeRatesLen = exchangeRatesJSON.length; + expect(exchangeRates.length).to.equal(exchangeRatesLen); + + for (let i = 0; i < exchangeRatesLen; i++) { + expect(exchangeRates[i].denom).to.equal(exchangeRatesJSON[i].denom); + expect(exchangeRates[i].oracleExchangeRateVal.exchangeRate).to.be.a('string').and.to.not.be.empty; + expect(exchangeRates[i].oracleExchangeRateVal.exchangeRate).to.be.a('string').and.to.not.be.empty; + expect(exchangeRates[i].oracleExchangeRateVal.lastUpdateTimestamp).to.exist.and.to.be.gt(0); + } + }); - const contractABIPath = path.join(__dirname, '../../precompiles/wasmd/abi.json'); - const contractABI = require(contractABIPath); - // Get a contract instance - wasmd = new ethers.Contract(WasmPrecompileContract, contractABI, signer); - }); + it("Oracle Twaps", async function () { + const twaps = await oracle.getOracleTwaps(3600); + const twapsLen = twapsJSON.length + expect(twaps.length).to.equal(twapsLen); - it("Wasm Precompile Instantiate", async function () { - encoder = new TextEncoder(); + for (let i = 0; i < twapsLen; i++) { + expect(twaps[i].denom).to.equal(twapsJSON[i].denom); + expect(twaps[i].twap).to.be.a('string').and.to.not.be.empty; + expect(twaps[i].lookbackSeconds).to.exist.and.to.be.gt(0); + } + }); + }); - queryCountMsg = {get_count: {}}; - queryStr = JSON.stringify(queryCountMsg); - queryBz = encoder.encode(queryStr); + describe("EVM Wasm Precompile Tester", function () { + const WasmPrecompileContract = '0x0000000000000000000000000000000000001002'; + let wasmCodeID; + let wasmContractAddress; + let wasmd; + let owner; + + before(async function () { + const counterWasm = '../integration_test/contracts/counter_parallel.wasm'; + wasmCodeID = await storeWasm(counterWasm); + + const counterParallelWasm = '../integration_test/contracts/counter_parallel.wasm' + wasmContractAddress = await deployWasm(counterParallelWasm, accounts[0].seiAddress, "counter", {count: 0}); + owner = accounts[0].signer; + + const contractABIPath = '../../precompiles/wasmd/abi.json'; + const contractABI = require(contractABIPath); + // Get a contract instance + wasmd = new ethers.Contract(WasmPrecompileContract, contractABI, owner); + }); - instantiateMsg = {count: 2}; - instantiateStr = JSON.stringify(instantiateMsg); - instantiateBz = encoder.encode(instantiateStr); + it("Wasm Precompile Instantiate", async function () { + const encoder = new TextEncoder(); - coins = []; - coinsStr = JSON.stringify(coins); - coinsBz = encoder.encode(coinsStr); + const instantiateMsg = {count: 2}; + const instantiateStr = JSON.stringify(instantiateMsg); + const instantiateBz = encoder.encode(instantiateStr); - instantiate = await wasmd.instantiate(wasmCodeID, "", instantiateBz, "counter-contract", coinsBz); - const receipt = await instantiate.wait(); - expect(receipt.status).to.equal(1); - // TODO: is there any way to get the instantiate results for contract address - or in events? - }); + const coins = []; + const coinsStr = JSON.stringify(coins); + const coinsBz = encoder.encode(coinsStr); - it("Wasm Precompile Execute", async function () { - expect(wasmContractAddress).to.not.be.empty; - encoder = new TextEncoder(); + const instantiate = await wasmd.instantiate(wasmCodeID, "", instantiateBz, "counter-contract", coinsBz); + const receipt = await instantiate.wait(); + expect(receipt.status).to.equal(1); + }); - queryCountMsg = {get_count: {}}; - queryStr = JSON.stringify(queryCountMsg); - queryBz = encoder.encode(queryStr); - initialCountBz = await wasmd.query(wasmContractAddress, queryBz); - initialCount = parseHexToJSON(initialCountBz) + it("Wasm Precompile Execute", async function () { + const encoder = new TextEncoder(); - incrementMsg = {increment: {}}; - incrementStr = JSON.stringify(incrementMsg); - incrementBz = encoder.encode(incrementStr); + const queryCountMsg = {get_count: {}}; + const queryStr = JSON.stringify(queryCountMsg); + const queryBz = encoder.encode(queryStr); + const initialCountBz = await wasmd.query(wasmContractAddress, queryBz); + const initialCount = parseHexToJSON(initialCountBz) - coins = []; - coinsStr = JSON.stringify(coins); - coinsBz = encoder.encode(coinsStr); + const incrementMsg = {increment: {}}; + const incrementStr = JSON.stringify(incrementMsg); + const incrementBz = encoder.encode(incrementStr); - execute = await wasmd.execute(wasmContractAddress, incrementBz, coinsBz); - const receipt = await execute.wait(); - expect(receipt.status).to.equal(1); + const coins = []; + const coinsStr = JSON.stringify(coins); + const coinsBz = encoder.encode(coinsStr); - finalCountBz = await wasmd.query(wasmContractAddress, queryBz); - finalCount = parseHexToJSON(finalCountBz) - expect(finalCount.count).to.equal(initialCount.count + 1); - }); + const response = await wasmd.execute(wasmContractAddress, incrementBz, coinsBz); + const receipt = await response.wait(); + expect(receipt.status).to.equal(1); - it("Wasm Precompile Batch Execute", async function () { - expect(wasmContractAddress).to.not.be.empty; - encoder = new TextEncoder(); - - queryCountMsg = {get_count: {}}; - queryStr = JSON.stringify(queryCountMsg); - queryBz = encoder.encode(queryStr); - initialCountBz = await wasmd.query(wasmContractAddress, queryBz); - initialCount = parseHexToJSON(initialCountBz) - - incrementMsg = {increment: {}}; - incrementStr = JSON.stringify(incrementMsg); - incrementBz = encoder.encode(incrementStr); - - coins = []; - coinsStr = JSON.stringify(coins); - coinsBz = encoder.encode(coinsStr); - - executeBatch = [ - { - contractAddress: wasmContractAddress, - msg: incrementBz, - coins: coinsBz, - }, - { - contractAddress: wasmContractAddress, - msg: incrementBz, - coins: coinsBz, - }, - { - contractAddress: wasmContractAddress, - msg: incrementBz, - coins: coinsBz, - }, - { - contractAddress: wasmContractAddress, - msg: incrementBz, - coins: coinsBz, - }, - ]; - - executeBatch = await wasmd.execute_batch(executeBatch); - const receipt = await executeBatch.wait(); - expect(receipt.status).to.equal(1); - - finalCountBz = await wasmd.query(wasmContractAddress, queryBz); - finalCount = parseHexToJSON(finalCountBz) - expect(finalCount.count).to.equal(initialCount.count + 4); - }); + const finalCountBz = await wasmd.query(wasmContractAddress, queryBz); + const finalCount = parseHexToJSON(finalCountBz) + expect(finalCount.count).to.equal(initialCount.count + 1); + }); + it("Wasm Precompile Batch Execute", async function () { + const encoder = new TextEncoder(); + + const queryCountMsg = {get_count: {}}; + const queryStr = JSON.stringify(queryCountMsg); + const queryBz = encoder.encode(queryStr); + const initialCountBz = await wasmd.query(wasmContractAddress, queryBz); + const initialCount = parseHexToJSON(initialCountBz) + + const incrementMsg = {increment: {}}; + const incrementStr = JSON.stringify(incrementMsg); + const incrementBz = encoder.encode(incrementStr); + + const coins = []; + const coinsStr = JSON.stringify(coins); + const coinsBz = encoder.encode(coinsStr); + + const executeBatch = [ + { + contractAddress: wasmContractAddress, + msg: incrementBz, + coins: coinsBz, + }, + { + contractAddress: wasmContractAddress, + msg: incrementBz, + coins: coinsBz, + }, + { + contractAddress: wasmContractAddress, + msg: incrementBz, + coins: coinsBz, + }, + { + contractAddress: wasmContractAddress, + msg: incrementBz, + coins: coinsBz, + }, + ]; + + const response = await wasmd.execute_batch(executeBatch); + const receipt = await response.wait(); + expect(receipt.status).to.equal(1); + + const finalCountBz = await wasmd.query(wasmContractAddress, queryBz); + const finalCount = parseHexToJSON(finalCountBz) + expect(finalCount.count).to.equal(initialCount.count + 4); }); }); -}); -function sleep(ms) { - return new Promise(resolve => setTimeout(resolve, ms)); -} - -function readDeploymentOutput(fileName) { - let fileContent; - try { - if (fs.existsSync(fileName)) { - fileContent = fs.readFileSync(fileName, 'utf8').trim(); - } else { - console.error("File not found:", fileName); - } - } catch (error) { - console.error(`Error reading file: ${error}`); - } - return fileContent; -} +}); function parseHexToJSON(hexStr) { // Remove the 0x prefix diff --git a/contracts/test/deploy_atom_erc20.sh b/contracts/test/deploy_atom_erc20.sh deleted file mode 100644 index f5408f313..000000000 --- a/contracts/test/deploy_atom_erc20.sh +++ /dev/null @@ -1,27 +0,0 @@ -#!/bin/bash - -# This script is used to deploy the UATOM ERC20 contract and associate it with the SEI account. -set -e - -endpoint=${EVM_RPC:-"http://127.0.0.1:8545"} -owner1=0xF87A299e6bC7bEba58dbBe5a5Aa21d49bCD16D52 -associated_sei_account1=sei1m9qugvk4h66p6hunfajfg96ysc48zeq4m0d82c -owner2=0x70997970C51812dc3A010C7d01b50e0d17dc79C8 - -echo "Funding account $account with UATOM for testing..." -printf "12345678\n" | seid tx bank send $(printf "12345678\n" | seid keys show admin -a) $associated_sei_account1 10000uatom --fees 20000usei -b block -y - -echo "Fund owners with some SEI" -printf "12345678\n" | seid tx evm send $owner1 1000000000000000000 --from admin -printf "12345678\n" | seid tx evm send $owner2 1000000000000000000 --from admin - -echo "Deploying ERC20 pointer contract for UATOM..." -printf "12345678\n" | seid tx evm call-contract 0x000000000000000000000000000000000000100b c31d960f000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000057561746f6d000000000000000000000000000000000000000000000000000000 --from admin --evm-rpc=$endpoint -sleep 3 -pointer_output=$(seid q evm pointer NATIVE uatom --output json) - -erc20_deploy_addr=$(echo "$pointer_output" | jq .pointer | tr -d '"') -echo $erc20_deploy_addr > contracts/erc20_deploy_addr.txt - -# wait for deployment to finish on live chain -sleep 3 diff --git a/contracts/test/deploy_wasm_contract.sh b/contracts/test/deploy_wasm_contract.sh deleted file mode 100644 index b35df1703..000000000 --- a/contracts/test/deploy_wasm_contract.sh +++ /dev/null @@ -1,26 +0,0 @@ -#!/bin/bash - -seidbin=$(which ~/go/bin/seid | tr -d '"') -keyname=$(printf "12345678\n" | $seidbin keys list --output json | jq ".[0].name" | tr -d '"') -keyaddress=$(printf "12345678\n" | $seidbin keys list --output json | jq ".[0].address" | tr -d '"') -chainid=$($seidbin status | jq ".NodeInfo.network" | tr -d '"') -seihome=$(git rev-parse --show-toplevel | tr -d '"') - -cd $seihome || exit -echo "Deploying wasm counter contract" - -echo "Storing wasm counter contract" -store_result=$(printf "12345678\n" | $seidbin tx wasm store integration_test/contracts/counter_parallel.wasm -y --from="$keyname" --chain-id="$chainid" --gas=5000000 --fees=1000000usei --broadcast-mode=block --output=json) -contract_id=$(echo "$store_result" | jq -r '.logs[].events[].attributes[] | select(.key == "code_id").value') -echo "$contract_id" > contracts/wasm_code_id.txt -echo "Instantiating wasm counter contract" -instantiate_result=$(printf "12345678\n" | $seidbin tx wasm instantiate "$contract_id" '{"count": 0}' -y --no-admin --from="$keyname" --chain-id="$chainid" --gas=5000000 --fees=1000000usei --broadcast-mode=block --label=dex --output=json) -echo $instantiate_result - -contract_addr=$(echo "$instantiate_result" |jq -r 'first(.logs[].events[].attributes[] | select(.key == "_contract_address").value)') - -echo "Deployed counter contract with address:" -echo $contract_addr - -# write the contract address to wasm_contract_addr.txt -echo "$contract_addr" > contracts/wasm_contract_addr.txt \ No newline at end of file diff --git a/contracts/test/get_validator_address.sh b/contracts/test/get_validator_address.sh deleted file mode 100644 index e8c704981..000000000 --- a/contracts/test/get_validator_address.sh +++ /dev/null @@ -1,12 +0,0 @@ -#!/bin/bash - -# This script is used to find the validator address. -set -e - -endpoint=${EVM_RPC:-"http://127.0.0.1:8545"} -owner1=0xF87A299e6bC7bEba58dbBe5a5Aa21d49bCD16D52 -associated_sei_account1=sei1m9qugvk4h66p6hunfajfg96ysc48zeq4m0d82c - -validator_address=$(printf "12345678\n" | seid q staking validators -o json | jq -r '.validators[0].operator_address') - -echo $validator_address > contracts/validator_address.txt diff --git a/contracts/test/lib.js b/contracts/test/lib.js index 25adb403c..fde542038 100644 --- a/contracts/test/lib.js +++ b/contracts/test/lib.js @@ -222,7 +222,6 @@ async function registerPointerForCw721(erc721Address, fees="20000usei", from=adm throw new Error("contract deployment failed") } return getEventAttribute(response, "pointer_registered", "pointer_address") - } @@ -283,35 +282,41 @@ async function executeWasm(contractAddress, msg, coins = "0usei") { return JSON.parse(output); } -async function execute(command, interaction=`printf "12345678\\n"`){ +async function isDocker() { return new Promise((resolve, reject) => { - // Check if the Docker container 'sei-node-0' is running exec("docker ps --filter 'name=sei-node-0' --format '{{.Names}}'", (error, stdout, stderr) => { if (stdout.includes('sei-node-0')) { - // The container is running, modify the command to execute inside Docker - command = command.replace(/\.\.\//g, "/sei-protocol/sei-chain/"); - const dockerCommand = `docker exec sei-node-0 /bin/bash -c 'export PATH=$PATH:/root/go/bin:/root/.foundry/bin && ${interaction} | ${command}'`; - execCommand(dockerCommand, resolve, reject); + resolve(true) } else { - // The container is not running, execute command normally - execCommand(command, resolve, reject); + resolve(false) } }); }); } -function execCommand(command, resolve, reject) { - exec(command, (error, stdout, stderr) => { - if (error) { - reject(error); - return; - } - if (stderr) { - reject(new Error(stderr)); - return; - } - resolve(stdout); - }); +async function execute(command, interaction=`printf "12345678\\n"`){ + if (await isDocker()) { + command = command.replace(/\.\.\//g, "/sei-protocol/sei-chain/"); + command = command.replace("/sei-protocol/sei-chain//sei-protocol/sei-chain/", "/sei-protocol/sei-chain/") + command = `docker exec sei-node-0 /bin/bash -c 'export PATH=$PATH:/root/go/bin:/root/.foundry/bin && ${interaction} | ${command}'`; + } + return await execCommand(command); +} + +function execCommand(command) { + return new Promise((resolve, reject) => { + exec(command, (error, stdout, stderr) => { + if (error) { + reject(error); + return; + } + if (stderr) { + reject(new Error(stderr)); + return; + } + resolve(stdout); + }); + }) } async function waitForReceipt(txHash) { @@ -349,6 +354,7 @@ module.exports = { bankSend, evmSend, waitForReceipt, + isDocker, WASM, ABI, }; diff --git a/contracts/test/query_oracle_data.sh b/contracts/test/query_oracle_data.sh deleted file mode 100644 index 7531f6fe4..000000000 --- a/contracts/test/query_oracle_data.sh +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/bash - -# This script is used to query oracle exchange rates and twap -seid q oracle exchange-rates -o json > contracts/oracle_exchange_rates.json -seid q oracle twaps 3600 -o json > contracts/oracle_twaps.json diff --git a/contracts/test/send_gov_proposal.sh b/contracts/test/send_gov_proposal.sh deleted file mode 100644 index 27641fc89..000000000 --- a/contracts/test/send_gov_proposal.sh +++ /dev/null @@ -1,12 +0,0 @@ -#!/bin/bash - -# This script is used to send a gov deposit. -set -e - -endpoint=${EVM_RPC:-"http://127.0.0.1:8545"} -owner1=0xF87A299e6bC7bEba58dbBe5a5Aa21d49bCD16D52 -associated_sei_account1=sei1m9qugvk4h66p6hunfajfg96ysc48zeq4m0d82c - -gov_proposal_output=$(printf "12345678\n" | seid tx gov submit-proposal param-change contracts/test/param_change_proposal.json --from admin --fees 20000usei -b block -y -o json | jq -r '.logs[0].events[3].attributes[1].value') - -echo $gov_proposal_output > contracts/gov_proposal_output.txt diff --git a/integration_test/evm_module/hardhat_test.yaml b/integration_test/evm_module/hardhat_test.yaml deleted file mode 100644 index 14e7c153e..000000000 --- a/integration_test/evm_module/hardhat_test.yaml +++ /dev/null @@ -1,17 +0,0 @@ -- name: Hardhat Test - inputs: - # Fund owner account in hardhat tests - - cmd: printf "12345678\n" | seid tx evm send 0xF87A299e6bC7bEba58dbBe5a5Aa21d49bCD16D52 10000000000000000000 --from admin | cut -d':' -f2- - env: TX_HASH - - cmd: sleep 3 - - cmd: cast receipt "$TX_HASH" -j |jq -r ."status" - env: RESULT - # Setup for Hardhat Integration Test - - cmd: bash contracts/test/deploy_atom_erc20.sh - - cmd: bash contracts/test/get_validator_address.sh - - cmd: bash contracts/test/send_gov_proposal.sh - - cmd: bash contracts/test/query_oracle_data.sh - - cmd: bash contracts/test/deploy_wasm_contract.sh - verifiers: - - type: eval - expr: RESULT == "0x1" From 91caf567c81d2095a9460849f63e51a61dc51ecf Mon Sep 17 00:00:00 2001 From: Jeremy Wei Date: Sat, 11 May 2024 00:04:40 -0400 Subject: [PATCH 30/51] Surface Debug Trace err (#1650) surface err --- evmrpc/simulate.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/evmrpc/simulate.go b/evmrpc/simulate.go index 9469e5734..a6d3d3e98 100644 --- a/evmrpc/simulate.go +++ b/evmrpc/simulate.go @@ -283,7 +283,10 @@ func (b *Backend) StateAtTransaction(ctx context.Context, block *ethtypes.Block, // Recompute transactions up to the target index. (only doing EVM at the moment, but should do both EVM + Cosmos) signer := ethtypes.MakeSigner(b.ChainConfig(), block.Number(), block.Time()) for idx, tx := range block.Transactions() { - msg, _ := core.TransactionToMessage(tx, signer, block.BaseFee()) + msg, err := core.TransactionToMessage(tx, signer, block.BaseFee()) + if err != nil { + return nil, vm.BlockContext{}, nil, nil, err + } txContext := core.NewEVMTxContext(msg) blockContext, err := b.keeper.GetVMBlockContext(b.ctxProvider(prevBlockHeight), core.GasPool(b.RPCGasCap())) if err != nil { From 18332057c93343a450da0459219da8b6a45af646 Mon Sep 17 00:00:00 2001 From: codchen Date: Mon, 13 May 2024 11:24:26 +0800 Subject: [PATCH 31/51] bump sei-cosmos (#1656) --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 71851bea4..c483ecea6 100644 --- a/go.mod +++ b/go.mod @@ -346,7 +346,7 @@ require ( replace ( github.com/CosmWasm/wasmd => github.com/sei-protocol/sei-wasmd v0.1.3 github.com/confio/ics23/go => github.com/cosmos/cosmos-sdk/ics23/go v0.8.0 - github.com/cosmos/cosmos-sdk => github.com/sei-protocol/sei-cosmos v0.3.11 + github.com/cosmos/cosmos-sdk => github.com/sei-protocol/sei-cosmos v0.3.12 github.com/cosmos/iavl => github.com/sei-protocol/sei-iavl v0.1.9 github.com/cosmos/ibc-go/v3 => github.com/sei-protocol/sei-ibc-go/v3 v3.3.0 github.com/ethereum/go-ethereum => github.com/sei-protocol/go-ethereum v1.13.5-sei-17 diff --git a/go.sum b/go.sum index 4e485c975..eb91caacb 100644 --- a/go.sum +++ b/go.sum @@ -1347,8 +1347,8 @@ github.com/sei-protocol/go-ethereum v1.13.5-sei-17 h1:NQcNuL/nmLCzVJFj6Za4ZrNj1O github.com/sei-protocol/go-ethereum v1.13.5-sei-17/go.mod h1:kcRZmuzRn1lVejiFNTz4l4W7imnpq1bDAnuKS/RyhbQ= github.com/sei-protocol/goutils v0.0.2 h1:Bfa7Sv+4CVLNM20QcpvGb81B8C5HkQC/kW1CQpIbXDA= github.com/sei-protocol/goutils v0.0.2/go.mod h1:iYE2DuJfEnM+APPehr2gOUXfuLuPsVxorcDO+Tzq9q8= -github.com/sei-protocol/sei-cosmos v0.3.11 h1:mHhscQlvF6temJ8AsVBBAD6ZY44q5tUSgxhsMXrduRg= -github.com/sei-protocol/sei-cosmos v0.3.11/go.mod h1:WWwx6XlJc9SrjdRwLW69o511hFpfUiHapYb+V9OqOG4= +github.com/sei-protocol/sei-cosmos v0.3.12 h1:MHHg9o6H3snMoepPB2zuYonW8quXf02CAlWsydtoSRE= +github.com/sei-protocol/sei-cosmos v0.3.12/go.mod h1:WWwx6XlJc9SrjdRwLW69o511hFpfUiHapYb+V9OqOG4= github.com/sei-protocol/sei-db v0.0.36 h1:Qg8MlO/4btECyAB/XrbEexhpaS7OmYsrs9IUYULf+bY= github.com/sei-protocol/sei-db v0.0.36/go.mod h1:F/ZKZA8HJPcUzSZPA8yt6pfwlGriJ4RDR4eHKSGLStI= github.com/sei-protocol/sei-iavl v0.1.9 h1:y4mVYftxLNRs6533zl7N0/Ch+CzRQc04JDfHolIxgBE= From 24d0160573ff6ed3f7a3a4a888eb7543cc6b590d Mon Sep 17 00:00:00 2001 From: Uday Patil Date: Mon, 13 May 2024 10:28:35 -0500 Subject: [PATCH 32/51] Add native pointer erc20 tests (#1644) * Add native pointer erc20 tests * Add to CI * remove irrelevant trycatch * update --------- Co-authored-by: Steven Landers --- contracts/test/ERC20toNativePointerTest.js | 163 ++++++++++++++++++ contracts/test/lib.js | 40 ++++- .../scripts/evm_interoperability_tests.sh | 1 + 3 files changed, 203 insertions(+), 1 deletion(-) create mode 100644 contracts/test/ERC20toNativePointerTest.js diff --git a/contracts/test/ERC20toNativePointerTest.js b/contracts/test/ERC20toNativePointerTest.js new file mode 100644 index 000000000..5fa2fa4bb --- /dev/null +++ b/contracts/test/ERC20toNativePointerTest.js @@ -0,0 +1,163 @@ +const {setupSigners, deployErc20PointerNative, getAdmin, createTokenFactoryTokenAndMint, ABI} = require("./lib"); +const {expect} = require("chai"); + +const { expectRevert } = require('@openzeppelin/test-helpers'); +require("@nomicfoundation/hardhat-chai-matchers"); + +describe("ERC20 to Native Pointer", function () { + let accounts; + let pointer; + let admin; + let denom; + + before(async function () { + accounts = await setupSigners(await hre.ethers.getSigners()) + admin = await getAdmin() + const random_num = Math.floor(Math.random() * 10000) + denom = await createTokenFactoryTokenAndMint(`native-pointer-test-${random_num}`, 1000, accounts[0].seiAddress) + + // deploy TestToken + const pointerAddr = await deployErc20PointerNative(hre.ethers.provider, denom) + const contract = new hre.ethers.Contract(pointerAddr, ABI.ERC20, hre.ethers.provider); + pointer = contract.connect(accounts[0].signer) + }) + + describe("read", function(){ + it("get name", async function () { + const name = await pointer.name(); + expect(name).to.equal(denom); + }); + + it("get symbol", async function () { + const symbol = await pointer.symbol(); + expect(symbol).to.equal(denom); + }); + + it("get decimals", async function () { + const decimals = await pointer.decimals(); + expect(Number(decimals)).to.equal(0); + }); + + it("get balanceOf", async function () { + expect(await pointer.balanceOf(admin.evmAddress)).to.equal(0) + expect(await pointer.balanceOf(accounts[0].evmAddress)).to.equal(1000); + expect(await pointer.balanceOf(accounts[1].evmAddress)).to.equal(0); + }); + + it("get totalSupply", async function () { + expect(await pointer.totalSupply()).to.equal(1000); + }); + + it("get allowance", async function () { + expect(await pointer.allowance(accounts[0].evmAddress, accounts[1].evmAddress)).to.equal(0); + }); + }) + + describe("transfer()", function () { + it("should transfer", async function () { + let sender = accounts[0]; + let recipient = accounts[1]; + + expect(await pointer.balanceOf(sender.evmAddress)).to.equal(1000); + expect(await pointer.balanceOf(recipient.evmAddress)).to.equal(0); + + const tx = await pointer.transfer(recipient.evmAddress, 5); + await tx.wait(); + + expect(await pointer.balanceOf(sender.evmAddress)).to.equal(995); + expect(await pointer.balanceOf(recipient.evmAddress)).to.equal(5); + + const cleanupTx = await pointer.connect(recipient.signer).transfer(sender.evmAddress, 5) + await cleanupTx.wait(); + }); + + it("should fail transfer() if sender has insufficient balance", async function () { + let recipient = accounts[1]; + // TODO: determine why we aren't able to extract the error message + await expectRevert.unspecified(pointer.transfer(recipient.evmAddress, 1001)); + }); + }); + + describe("approve()", function () { + it("should approve", async function () { + const owner = accounts[0].evmAddress; + const spender = accounts[1].evmAddress; + const tx = await pointer.approve(spender, 50); + await tx.wait(); + const allowance = await pointer.allowance(owner, spender); + expect(Number(allowance)).to.equal(50); + }); + + it("should lower approval", async function () { + const owner = accounts[0].evmAddress; + const spender = accounts[1].evmAddress; + const tx = await pointer.approve(spender, 0); + await tx.wait(); + const allowance = await pointer.allowance(owner, spender); + expect(Number(allowance)).to.equal(0); + }); + }); + + + describe("transferFrom()", function () { + it("should transferFrom", async function () { + const recipient = admin; + const owner = accounts[0]; + const spender = accounts[1]; + const amountToTransfer = 10; + + // capture balances before + const recipientBalanceBefore = await pointer.balanceOf(recipient.evmAddress); + const ownerBalanceBefore = await pointer.balanceOf(owner.evmAddress); + expect(Number(ownerBalanceBefore)).to.be.greaterThanOrEqual(amountToTransfer); + + // approve the amount + const tx = await pointer.approve(spender.evmAddress, amountToTransfer); + await tx.wait(); + const allowanceBefore = await pointer.allowance(owner.evmAddress, spender.evmAddress); + expect(Number(allowanceBefore)).to.be.greaterThanOrEqual(amountToTransfer); + + // transfer + const tfTx = await pointer.connect(spender.signer).transferFrom(owner.evmAddress, recipient.evmAddress, amountToTransfer); + const receipt = await tfTx.wait(); + + // capture balances after + const recipientBalanceAfter = await pointer.balanceOf(recipient.evmAddress); + const ownerBalanceAfter = await pointer.balanceOf(owner.evmAddress); + + // check balance diff to ensure transfer went through + const diff = recipientBalanceAfter - recipientBalanceBefore; + expect(diff).to.equal(amountToTransfer); + + // check balanceOf sender (deployerAddr) to ensure it went down + const diff2 = ownerBalanceBefore - ownerBalanceAfter; + expect(diff2).to.equal(amountToTransfer); + + // check that allowance has gone down by amountToTransfer + const allowanceAfter = await pointer.allowance(owner.evmAddress, spender.evmAddress); + expect(Number(allowanceBefore) - Number(allowanceAfter)).to.equal(amountToTransfer); + }); + + it("should fail transferFrom() if sender has insufficient balance", async function () { + const recipient = admin; + const owner = accounts[0]; + const spender = accounts[1]; + + const tx = await pointer.approve(spender.evmAddress, 999999999); + await tx.wait(); + // TODO: determine why we aren't able to extract the error message + await expectRevert.unspecified(pointer.connect(spender.signer).transferFrom(owner.evmAddress, recipient.evmAddress, 999999999)); + }); + + it("should fail transferFrom() if allowance is too low", async function () { + const recipient = admin; + const owner = accounts[0]; + const spender = accounts[1]; + + const tx = await pointer.approve(spender.evmAddress, 10); + await tx.wait(); + + await expect(pointer.connect(spender.signer).transferFrom(owner.evmAddress, recipient.evmAddress, 20)).to.be.revertedWithCustomError(pointer, "ERC20InsufficientAllowance"); + }); + }); +}) \ No newline at end of file diff --git a/contracts/test/lib.js b/contracts/test/lib.js index fde542038..84366045a 100644 --- a/contracts/test/lib.js +++ b/contracts/test/lib.js @@ -12,7 +12,8 @@ const ABI = { "function transfer(address to, uint amount) returns (bool)", "function allowance(address owner, address spender) view returns (uint256)", "function approve(address spender, uint256 value) returns (bool)", - "function transferFrom(address from, address to, uint value) returns (bool)" + "function transferFrom(address from, address to, uint value) returns (bool)", + "error ERC20InsufficientAllowance(address spender, uint256 allowance, uint256 needed)" ], ERC721: [ "event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId)", @@ -137,6 +138,25 @@ function getEventAttribute(response, type, attribute) { throw new Error("attribute not found") } +async function createTokenFactoryTokenAndMint(name, amount, recipient) { + const command = `seid tx tokenfactory create-denom ${name} --from ${adminKeyName} --gas=5000000 --fees=1000000usei -y --broadcast-mode block -o json` + const output = await execute(command); + const response = JSON.parse(output) + const token_denom = getEventAttribute(response, "create_denom", "new_token_denom") + const mint_command = `seid tx tokenfactory mint ${amount}${token_denom} --from ${adminKeyName} --gas=5000000 --fees=1000000usei -y --broadcast-mode block -o json` + await execute(mint_command); + + const send_command = `seid tx bank send ${adminKeyName} ${recipient} ${amount}${token_denom} --from ${adminKeyName} --gas=5000000 --fees=1000000usei -y --broadcast-mode block -o json` + await execute(send_command); + return token_denom +} + +async function getPointerForNative(name) { + const command = `seid query evm pointer NATIVE ${name} -o json` + const output = await execute(command); + return JSON.parse(output); +} + async function storeWasm(path) { const command = `seid tx wasm store ${path} --from ${adminKeyName} --gas=5000000 --fees=1000000usei -y --broadcast-mode block -o json` const output = await execute(command); @@ -173,6 +193,22 @@ async function deployErc20PointerForCw20(provider, cw20Address, attempts=10) { throw new Error("contract deployment failed") } +async function deployErc20PointerNative(provider, name) { + const command = `seid tx evm call-precompile pointer addNativePointer ${name} --from=admin -b block` + const output = await execute(command); + const txHash = output.replace(/.*0x/, "0x").trim() + let attempt = 0; + while(attempt < 10) { + const receipt = await provider.getTransactionReceipt(txHash); + if(receipt) { + return (await getPointerForNative(name)).pointer + } + await sleep(500) + attempt++ + } + throw new Error("contract deployment failed") +} + async function deployErc721PointerForCw721(provider, cw721Address) { const command = `seid tx evm register-evm-pointer CW721 ${cw721Address} --from=admin -b block` const output = await execute(command); @@ -335,6 +371,7 @@ module.exports = { storeWasm, deployWasm, instantiateWasm, + createTokenFactoryTokenAndMint, execute, getSeiAddress, getEvmAddress, @@ -344,6 +381,7 @@ module.exports = { setupSigners, deployEvmContract, deployErc20PointerForCw20, + deployErc20PointerNative, deployErc721PointerForCw721, registerPointerForCw20, registerPointerForCw721, diff --git a/integration_test/evm_module/scripts/evm_interoperability_tests.sh b/integration_test/evm_module/scripts/evm_interoperability_tests.sh index a27acafa0..2dc58ab62 100755 --- a/integration_test/evm_module/scripts/evm_interoperability_tests.sh +++ b/integration_test/evm_module/scripts/evm_interoperability_tests.sh @@ -6,5 +6,6 @@ cd contracts npm ci npx hardhat test --network seilocal test/CW20toERC20PointerTest.js npx hardhat test --network seilocal test/ERC20toCW20PointerTest.js +npx hardhat test --network seilocal test/ERC20toNativePointerTest.js npx hardhat test --network seilocal test/CW721toERC721PointerTest.js npx hardhat test --network seilocal test/ERC721toCW721PointerTest.js From f98594499d8dc7aab29ea9b25f41e2c0160b4033 Mon Sep 17 00:00:00 2001 From: Philip Su Date: Mon, 13 May 2024 09:51:23 -0700 Subject: [PATCH 33/51] V5.3.0 release (#1658) * Add upgrade version * refactor: Use geths hydrate tx (#1654) * use geth's hydrateTx * fix go mod * fix * fix * delete unused code * fix * bump geth version * fix * comment out Gov Precompile Tester for now * [EVM] Fix precompile test flakiness (#1657) * fix precompile test * fix precompile on docker * prefund * fix throughput test * make address calculation resilient * fix funding issue * Surface Debug Trace err (#1650) surface err --------- Co-authored-by: Jeremy Wei Co-authored-by: Steven Landers --- app/upgrades.go | 1 + 1 file changed, 1 insertion(+) diff --git a/app/upgrades.go b/app/upgrades.go index a5c1dc5c8..e57e081f6 100644 --- a/app/upgrades.go +++ b/app/upgrades.go @@ -96,6 +96,7 @@ var upgradesList = []string{ "v5.2.0", "v5.2.1", "v5.2.2", + "v5.3.0", } // if there is an override list, use that instead, for integration tests From 8c348d520e0eb5da81cc97a3585c728974bf09b8 Mon Sep 17 00:00:00 2001 From: codchen Date: Tue, 14 May 2024 11:54:13 +0800 Subject: [PATCH 34/51] Fix event attribute names in CW pointer contracts (#1659) * Fix event attribute names in CW pointer contracts * use reverse registry to validate delegatecall --- .../cosmwasm/cw721/artifacts/checksums.txt | 2 +- .../cosmwasm/cw721/artifacts/cwerc721.wasm | Bin 255724 -> 256986 bytes example/cosmwasm/cw721/src/contract.rs | 38 +- go.mod | 2 + go.sum | 3 + precompiles/ibc/ibc_test.go | 5 +- precompiles/wasmd/wasmd_test.go | 14 +- proto/evm/query.proto | 13 + x/evm/artifacts/erc721/artifacts.go | 2 +- x/evm/artifacts/erc721/cwerc721.wasm | Bin 255724 -> 256986 bytes x/evm/client/cli/query.go | 33 +- x/evm/keeper/evm.go | 9 +- x/evm/keeper/grpc_query.go | 35 ++ x/evm/keeper/msg_server.go | 8 +- x/evm/keeper/params.go | 4 - x/evm/keeper/pointer.go | 21 + x/evm/keeper/whitelist.go | 16 - x/evm/keeper/whitelist_test.go | 14 - x/evm/migrations/store_cw_pointer_code.go | 34 +- x/evm/module.go | 8 +- x/evm/module_test.go | 4 +- x/evm/types/params.go | 12 +- x/evm/types/query.pb.go | 456 ++++++++++++++++-- x/evm/types/query.pb.gw.go | 83 ++++ 24 files changed, 687 insertions(+), 129 deletions(-) delete mode 100644 x/evm/keeper/whitelist.go delete mode 100644 x/evm/keeper/whitelist_test.go diff --git a/example/cosmwasm/cw721/artifacts/checksums.txt b/example/cosmwasm/cw721/artifacts/checksums.txt index a31da2c61..ae91b826c 100644 --- a/example/cosmwasm/cw721/artifacts/checksums.txt +++ b/example/cosmwasm/cw721/artifacts/checksums.txt @@ -1 +1 @@ -94cdd9c3e85c26f7cec43c23bfb4b3b2b2d71a0a8d85c58df12ffec0741febc8 cwerc721.wasm +d34f50997bd0ad45badcf8174b67900806021abca011cbba658517d5af5e5eca cwerc721.wasm diff --git a/example/cosmwasm/cw721/artifacts/cwerc721.wasm b/example/cosmwasm/cw721/artifacts/cwerc721.wasm index 318ada77bc67874fa3f7386116c2d75127549b30..f5ba0432f868a852f8860cc34a5357431ff53918 100644 GIT binary patch delta 65289 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 diff --git a/example/cosmwasm/cw721/src/contract.rs b/example/cosmwasm/cw721/src/contract.rs index 690bb262d..8d7f678b7 100644 --- a/example/cosmwasm/cw721/src/contract.rs +++ b/example/cosmwasm/cw721/src/contract.rs @@ -35,16 +35,16 @@ pub fn execute( execute_send_nft(deps, info, contract, token_id, msg) }, ExecuteMsg::Approve { spender, token_id, expires: _ } => { - execute_approve(deps, spender, token_id) + execute_approve(deps, info, spender, token_id, true) }, - ExecuteMsg::Revoke { spender: _, token_id } => { - execute_approve(deps, "".to_string(), token_id) + ExecuteMsg::Revoke { spender, token_id } => { + execute_approve(deps, info, spender, token_id, false) }, ExecuteMsg::ApproveAll { operator, expires: _ } => { - execute_approve_all(deps, operator, true) + execute_approve_all(deps, info, operator, true) }, ExecuteMsg::RevokeAll { operator } => { - execute_approve_all(deps, operator, false) + execute_approve_all(deps, info, operator, false) }, ExecuteMsg::Burn { token_id: _ } => { execute_burn() } } @@ -82,17 +82,27 @@ pub fn execute_send_nft( pub fn execute_approve( deps: DepsMut, + info: MessageInfo, spender: String, token_id: String, + approved: bool, ) -> Result, ContractError> { let erc_addr = ERC721_ADDRESS.load(deps.storage)?; let querier = EvmQuerier::new(&deps.querier); - let payload = querier.erc721_approve_payload(spender.clone(), token_id.clone())?; + let mut payload_spender = spender.clone(); + let mut action = "approve"; + if !approved { + payload_spender = "".to_string(); + action = "revoke"; + } + let payload = querier.erc721_approve_payload(payload_spender, token_id.clone())?; let msg = EvmMsg::DelegateCallEvm { to: erc_addr, data: payload.encoded_payload }; let res = Response::new() - .add_attribute("action", "approve") + .add_attribute("action", action) .add_attribute("token_id", token_id) + .add_attribute("sender", info.sender) + .add_attribute("spender", spender.clone()) .add_message(msg); Ok(res) @@ -100,6 +110,7 @@ pub fn execute_approve( pub fn execute_approve_all( deps: DepsMut, + info: MessageInfo, to: String, approved: bool, ) -> Result, ContractError> { @@ -108,9 +119,14 @@ pub fn execute_approve_all( let querier = EvmQuerier::new(&deps.querier); let payload = querier.erc721_set_approval_all_payload(to.clone(), approved)?; let msg = EvmMsg::DelegateCallEvm { to: erc_addr, data: payload.encoded_payload }; + let mut action = "approve_all"; + if !approved { + action = "revoke_all"; + } let res = Response::new() - .add_attribute("action", "approve_all") - .add_attribute("to", to) + .add_attribute("action", action) + .add_attribute("operator", to) + .add_attribute("sender", info.sender) .add_attribute("approved", format!("{}", approved)) .add_message(msg); @@ -136,8 +152,8 @@ fn transfer_nft( let payload = querier.erc721_transfer_payload(owner, recipient.clone(), token_id.clone())?; let msg = EvmMsg::DelegateCallEvm { to: erc_addr, data: payload.encoded_payload }; let res = Response::new() - .add_attribute("from", info.sender) - .add_attribute("to", recipient) + .add_attribute("sender", info.sender) + .add_attribute("recipient", recipient) .add_attribute("token_id", token_id) .add_message(msg); diff --git a/go.mod b/go.mod index c483ecea6..abb68a669 100644 --- a/go.mod +++ b/go.mod @@ -125,6 +125,7 @@ require ( github.com/fzipp/gocyclo v0.5.1 // indirect github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff // indirect github.com/gballet/go-verkle v0.1.1-0.20231031103413-a67434b50f46 // indirect + github.com/ghodss/yaml v1.0.0 // indirect github.com/go-critic/go-critic v0.6.3 // indirect github.com/go-kit/kit v0.12.0 // indirect github.com/go-kit/log v0.2.1 // indirect @@ -172,6 +173,7 @@ require ( github.com/gostaticanalysis/nilerr v0.1.1 // indirect github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 // indirect github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 // indirect + github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.1 // indirect github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c // indirect github.com/hashicorp/errwrap v1.0.0 // indirect github.com/hashicorp/go-bexpr v0.1.10 // indirect diff --git a/go.sum b/go.sum index eb91caacb..6d4ac8704 100644 --- a/go.sum +++ b/go.sum @@ -457,6 +457,7 @@ github.com/gballet/go-verkle v0.1.1-0.20231031103413-a67434b50f46 h1:BAIP2Gihuqh github.com/gballet/go-verkle v0.1.1-0.20231031103413-a67434b50f46/go.mod h1:QNpY22eby74jVhqH4WhDLDwxc/vqsern6pW+u2kbkpc= github.com/getkin/kin-openapi v0.53.0/go.mod h1:7Yn5whZr5kJi6t+kShccXS8ae1APpYTW6yheSwk8Yi4= github.com/ghemawat/stream v0.0.0-20171120220530-696b145b53b9/go.mod h1:106OIgooyS7OzLDOpUGgm9fA3bQENb/cFSyyBmMoJDs= +github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/gin-contrib/sse v0.0.0-20190301062529-5545eab6dad3/go.mod h1:VJ0WA2NBN22VlZ2dKZQPAPnyWw5XTlK1KymzLKsr59s= github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= @@ -765,6 +766,8 @@ github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t github.com/grpc-ecosystem/grpc-gateway v1.12.1/go.mod h1:8XEsbTttt/W+VvjtQhLACqCisSPWTxCZ7sBRjU6iH9c= github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.1 h1:/c3QmbOGMGTOumP2iT/rCwB7b0QDGLKzqOmktBjT+Is= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.1/go.mod h1:5SN9VR2LTsRFsrEC6FHgRbTWrTHu6tqPeKxEQv15giM= github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c h1:6rhixN/i8ZofjG1Y75iExal34USq5p+wiN1tpie8IrU= github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c/go.mod h1:NMPJylDgVpX0MLRlPy15sqSwOFv/U1GZ2m21JhFfek0= github.com/guptarohit/asciigraph v0.5.5/go.mod h1:dYl5wwK4gNsnFf9Zp+l06rFiDZ5YtXM6x7SRWZ3KGag= diff --git a/precompiles/ibc/ibc_test.go b/precompiles/ibc/ibc_test.go index 8a6da8c14..ad8b311dc 100644 --- a/precompiles/ibc/ibc_test.go +++ b/precompiles/ibc/ibc_test.go @@ -2,12 +2,13 @@ package ibc_test import ( "errors" - "github.com/cosmos/ibc-go/v3/modules/core/exported" "math/big" "reflect" "testing" "time" + "github.com/cosmos/ibc-go/v3/modules/core/exported" + sdk "github.com/cosmos/cosmos-sdk/types" clienttypes "github.com/cosmos/ibc-go/v3/modules/core/02-client/types" "github.com/ethereum/go-ethereum/common" @@ -95,7 +96,7 @@ func TestPrecompile_Run(t *testing.T) { fields: fields{transferKeeper: &MockTransferKeeper{}}, args: commonArgs, wantBz: packedTrue, - wantRemainingGas: 994040, + wantRemainingGas: 994319, wantErr: false, }, { diff --git a/precompiles/wasmd/wasmd_test.go b/precompiles/wasmd/wasmd_test.go index 4dfbd65d4..95c8ba4a7 100644 --- a/precompiles/wasmd/wasmd_test.go +++ b/precompiles/wasmd/wasmd_test.go @@ -79,7 +79,7 @@ func TestInstantiate(t *testing.T) { require.Equal(t, 2, len(outputs)) require.Equal(t, "sei1hrpna9v7vs3stzyd4z3xf00676kf78zpe2u5ksvljswn2vnjp3yslucc3n", outputs[0].(string)) require.Empty(t, outputs[1].([]byte)) - require.Equal(t, uint64(880848), g) + require.Equal(t, uint64(881127), g) amtsbz, err = sdk.NewCoins().MarshalJSON() require.Nil(t, err) @@ -102,7 +102,7 @@ func TestInstantiate(t *testing.T) { require.Equal(t, 2, len(outputs)) require.Equal(t, "sei1hrpna9v7vs3stzyd4z3xf00676kf78zpe2u5ksvljswn2vnjp3yslucc3n", outputs[0].(string)) require.Empty(t, outputs[1].([]byte)) - require.Equal(t, uint64(903904), g) + require.Equal(t, uint64(904183), g) // non-existent code ID args, _ = instantiateMethod.Inputs.Pack( @@ -174,7 +174,7 @@ func TestExecute(t *testing.T) { require.Nil(t, err) require.Equal(t, 1, len(outputs)) require.Equal(t, fmt.Sprintf("received test msg from %s with 1000usei", mockAddr.String()), string(outputs[0].([]byte))) - require.Equal(t, uint64(907107), g) + require.Equal(t, uint64(907386), g) require.Equal(t, int64(1000), testApp.BankKeeper.GetBalance(statedb.Ctx(), contractAddr, "usei").Amount.Int64()) amtsbz, err = sdk.NewCoins().MarshalJSON() @@ -263,7 +263,7 @@ func TestQuery(t *testing.T) { require.Nil(t, err) require.Equal(t, 1, len(outputs)) require.Equal(t, "{\"message\":\"query test\"}", string(outputs[0].([]byte))) - require.Equal(t, uint64(931433), g) + require.Equal(t, uint64(931712), g) // bad contract address args, _ = queryMethod.Inputs.Pack(mockAddr.String(), []byte("{\"info\":{}}")) @@ -326,7 +326,7 @@ func TestExecuteBatchOneMessage(t *testing.T) { require.Nil(t, err) require.Equal(t, 1, len(outputs)) require.Equal(t, fmt.Sprintf("received test msg from %s with 1000usei", mockAddr.String()), string((outputs[0].([][]byte))[0])) - require.Equal(t, uint64(907107), g) + require.Equal(t, uint64(907386), g) require.Equal(t, int64(1000), testApp.BankKeeper.GetBalance(statedb.Ctx(), contractAddr, "usei").Amount.Int64()) amtsbz, err = sdk.NewCoins().MarshalJSON() @@ -432,7 +432,7 @@ func TestExecuteBatchMultipleMessages(t *testing.T) { require.Equal(t, fmt.Sprintf("received test msg from %s with 1000usei", mockAddr.String()), string(parsedOutputs[0])) require.Equal(t, fmt.Sprintf("received test msg from %s with 1000usei", mockAddr.String()), string(parsedOutputs[1])) require.Equal(t, fmt.Sprintf("received test msg from %s with 1000usei", mockAddr.String()), string(parsedOutputs[2])) - require.Equal(t, uint64(726445), g) + require.Equal(t, uint64(726724), g) require.Equal(t, int64(3000), testApp.BankKeeper.GetBalance(statedb.Ctx(), contractAddr, "usei").Amount.Int64()) amtsbz2, err := sdk.NewCoins().MarshalJSON() @@ -459,7 +459,7 @@ func TestExecuteBatchMultipleMessages(t *testing.T) { require.Equal(t, fmt.Sprintf("received test msg from %s with", mockAddr.String()), string(parsedOutputs[0])) require.Equal(t, fmt.Sprintf("received test msg from %s with 1000usei", mockAddr.String()), string(parsedOutputs[1])) require.Equal(t, fmt.Sprintf("received test msg from %s with", mockAddr.String()), string(parsedOutputs[2])) - require.Equal(t, uint64(774966), g) + require.Equal(t, uint64(775245), g) require.Equal(t, int64(1000), testApp.BankKeeper.GetBalance(statedb.Ctx(), contractAddr, "usei").Amount.Int64()) // allowed delegatecall diff --git a/proto/evm/query.proto b/proto/evm/query.proto index 6f90daa9b..f92d02df0 100644 --- a/proto/evm/query.proto +++ b/proto/evm/query.proto @@ -23,6 +23,10 @@ service Query { rpc Pointer(QueryPointerRequest) returns (QueryPointerResponse) { option (google.api.http).get = "/sei-protocol/seichain/evm/pointer"; } + + rpc PointerVersion(QueryPointerVersionRequest) returns (QueryPointerVersionResponse) { + option (google.api.http).get = "/sei-protocol/seichain/evm/pointer_version"; + } } message QuerySeiAddressByEVMAddressRequest { @@ -62,3 +66,12 @@ message QueryPointerResponse { uint32 version = 2; bool exists = 3; } + +message QueryPointerVersionRequest { + PointerType pointer_type = 1; +} + +message QueryPointerVersionResponse { + uint32 version = 1; + uint64 cw_code_id = 2; +} diff --git a/x/evm/artifacts/erc721/artifacts.go b/x/evm/artifacts/erc721/artifacts.go index b542ee3b4..9bae2456a 100644 --- a/x/evm/artifacts/erc721/artifacts.go +++ b/x/evm/artifacts/erc721/artifacts.go @@ -2,7 +2,7 @@ package erc721 import "embed" -const CurrentVersion uint16 = 1 +const CurrentVersion uint16 = 2 //go:embed cwerc721.wasm var f embed.FS diff --git a/x/evm/artifacts/erc721/cwerc721.wasm b/x/evm/artifacts/erc721/cwerc721.wasm index 318ada77bc67874fa3f7386116c2d75127549b30..f5ba0432f868a852f8860cc34a5357431ff53918 100644 GIT binary patch delta 65289 zcmeFa3!GI|`8U4TI``YmnPC`aV1Rv&qs}M@7BOg;vk4Rx6-Cp`1Pf9J^MYtt%7Fw0 zB}6x}NGVZC$twnl73El(So#ZoS(%ceS<&kyGBQ%r|M&Z>z0WxV17Y?4|L^Dh|FCB7 zv+nCz&w8$FJ^Qt%YoGg7?UMcXQzccJ5-s7MGezP5F}~s%mnU8lr5nckDtg0~!}~@f z(=NCyclOk&GbUel_W9>cJ$vRfC+Z)p9#B#Ld3AU+reiU`Sr0ffm5M8+EB}%)2mf>= zp%aNjETJ|2r*({f!eWVJBBqs6$vFN+n30bvc-=O=K&_*g2)0tEz zqhnDv9{gh|ylPZL)_+JiVbmDkKm6K-mgo@gK{DJ!R2OCUl z)L?^JN05>5+at9#(R#&!X_bwjsDD&sMCk_esFNu<-by|b52Thg&t8h8J5-H8`@c`{b)?8(zEm>N-;$&=5WcJ@V+KXdja(;_-`w^oj)G7qV4bGU#l(Z zvs0f_&#T|47u1Vtt9nVjtbVIrQNL5Ce6n=c7;}>bvS;ls$cinl$N6^&|CDHR*fmCu)OQr@pNoQj>nDo>V_mUsIEwQXADN zPwPp?u=8isFVv)8sh_J~s%I4j`&X2BSN&3N)n8Kv|DUu>Px`7qC^jhhfO=g2Sl^=j zkH-$wuYYIl`LQE)&3*o(&QQnc?Lw1xD#!N2OW$?RHw zo0RXF&hpz({!{*9cX7j#8@nAZlfN!9E|8&^VbB7PHk7j@3hZ25E@y7a%6?=F6%v78*Vvl_*`T50Fu8>Ah1*mmyU z@4C9>n1`2;F{LrsTaABjYg0=m<0?SID?qEn2m9PTQv=jlTxqy;K!Yq+kDnLkrpD^ctXbjPUri z?+$5DFZ*i_Jx#y1OeP`^JCTQ4W@e{XR&+X6^cY#@^DBwxOX7?}X7=wUY=f}~dU#=q z6gg(tqWbbG2GGU){xED)D!AG`?vmGPC(T{p{L1jvJ;1Ete9q$k}Wfxa38hd<@CzJBZR`RYoEEU-W-McqhH>9*7QM!c^rTibQ~`qZE`GQ{3H_%1u>8*f8j z4=wZ0IIX?9^lmMq^lhg#>xY)D-EdkTrJnIOojz1Ov-Z8yH`eE`R#}~KwU_S_s&e(( zUrzrl^0m`vEL7^1wST>& zO&=MOEZynFNwick8tnv@ulqV+5YJy5Da3WB8$nvcbH?YC7goS;6!*`(>`-;-+QpX@ z6*_tF3n%06LHIf65gZO#1vQKB_J^8*-}PKY4|Z+MmAiaQt0=%?3+qI!{2FhPQu^ybAF7!v*+@C)7+D5 zZ1HiqG{CZ4`L~st{bRm-8!})0^2zx7v8(v^hO3^y-%rlt`@Qn_{dtwDBwh=&RGl@S zRr_CkK8AVC)rVtlaaqumzw*j{{!3RkVaRV^jam64uQ^)X=g+=oP~9spbUVPSkq(F> zP#U!UzH9bZ_pSZ;HJvIK&IVmPY`ZvY;ZSsO&cY}0_t0xkt}e07miXqiD6#fe*S^D* zU32sP{?0|W;O)UL9PB^xl>_m1kl(sCvpA*DLf`8j$KU6#pNJYmmh8u*i8nkh^=|gp z+;~7xPy4ps@%q|3{mcDN#&5V22$1t{U3^~dTD}5LF!ubH{1cWQtG|AyfAi7{bKhV_ z8X0*a$@ABb?c1ZMVAZ&s^5;;Jut{xd&SeYYqiNAylIlU*S}=b zsr8TDk70MnN_y||{n@q8Z8|49cuN&k0gST+O;9Hb7_t`yjhXU`Q}>~ayLQJfBG~=+ zt4r$^`e;2TG&q6zuJp}m52%y%w|#TZ1FEHN8MD)pP4Vgp-#m-t5sxxCj%2{h@%oO` z4j!q)ooFp&5N{51t#lwVg#wVC@lD$r_4%{6QMQRmgJghKWMV_Q(oiI9s4QYtcca5x zD<(-(!fDyf${WpFYt+$oRo!shx7=t>cu=)8mK(%2u)>k{Hr{CFJg6>cs;Z*1$W@;0 z!2jkSTlCHwOzXGQVS3{YX7abxhvJp2rcIntB>yQ)y$lKmV>G|osE*HVWG*4gJ!uYo zQjG#Be!5oeZ?1n*^~L*3Q8mP${${4(a?;Uc0T9CzB2JgLZmHS+q#6b+aetzwqU`*i zsDt%QtIW54qV~tnXMduG==sW=`;=;7?o;Y!^ZlPHY-L+=(JE8-R9LdjOt$YRcAH+Y zYJJ<&kpGKz){wS$-vbyl(EnQhfybXPzxbJ&psqE=P3ooGYVx8Ka+9DxCcjx7i4G@j zR$vw8y3MKsGtt3J@RXT6c$4|%X4R%HU;qAQ)u~KFgWAy+Y-E`u*4&}iqZU6w5!edzG`3&wK~CbwKu%07&Du{tooMP*wiQ{ zw&@Z1ZwU9_=ybU;G)7cK-S$XZM})Po)mPtx`Sitm=k)whGW251%N<2>z=BO3kvwQZ zQx{6OUF{L4BZ4N{vH7r4EZ#6uXYrQl&{2^zKIAp9?C7ql?(~QbowZU3XOwp1kf@Wa zoh@SKW>ljZ)Gy-3WOx8TSF1x|0%eQZe7;eQJS5VtqaCu(T1lc>!qy$U;&($=yLN0o zddKE&RDDM1ks3MxL>!S+(3k*&gu9DCXDS{xl|v~+F_fl$>M*6v$^Fz3H4)5MR%wpH z)4%!E(Fd-kIECHe>Tx-ze?`avLx4<_DN+D}E@s}CqnrG`uRWq>`g7ly;Q#IQBmA>o zpHTj_P~J8MznA@KHs1PfpD^OpA-bg$nXOB}gE^7uMIcH3n;H{bsk&Sz{|C}&EQPXf z0EN!~!HgTJex&E$ZPFd;Qk64vI@AjN>$}aMQEIqS=EPB|pQBp_ z0EwZ_h(ZDhZ5U3Q9$rl5uhE_+G>1BEp1OEkE(2buE-oZ&JMG0(G3pID8cjvLe>g|w zVqOZR6FHU5WxTw+Lfx{xxLt0t#0I0bL01~gvh6}41+{{3woZ3i|GgzNK8Ek~tr93UhN9JJAqz>X2H}6QxoPqH>!)6ZnhA z=>=@ZHhqdr9c#i_b5ueSo3la+aM2{E!H#+q|7oIdRZF|P)jI*ZMp0MoH4QKoPn9BeqIGYHJ{ zEojfRpq)z4a!Edc6+0@2LAdFWdIBD)k$OBHiII9Nn*@KwmKL%!)e-@WOM9<50hK@r zHgu+~4B~Z42P($>TaO-`%!1i@eF{Ej)Me@7Bh0PC3J`tXxEqp z3!+5TERZGiJ2ei{0>@+(JB2Z0g6(>2p}^X0dIBkO%q>VGoQy*dZMRevGlPzhF9w5( zTT)txfgm)MWFndc8nBuq3qmLIb0tkGan~Zhg*DoAQz2+pdy9B$beCIiU+=|hjcNOs`V8pfbstlM25q^6@+*ri)m`42@~=hswdfA> z#K+W!^m{j%cRr>Drj|lc#|qaaP2ot@Rks0lq5K;aqTFp(9I0+?$M_-@6_mQFP~rU2F&Gx%P0a81Uo2XAp}WJ)>n2~QnUN`W{JpI%IY za6{DXf&hSZjCh+=R}spxgUU(LaME`abAn<;KsZ^HwTm7VEdhu+AF7BJ{@8!-Kw5K1 zfRN4dp6UYMbjcx}f)?QE{Pp@1=#3x%U6V5Ztj)vGWRK=BuB~O>LafUBn1N~jo@#GF z9(Ym$W2QV(OrxJ7?GnJSv_JP7q%8qG*pQl^P_~J!@pZ0J2RtSqg7)Qn@M5=;z6#IfvbtV zC(YpT>Qw!YmFBYX>Z6^%SB04FM5ja<{Am@NsPwnOGU!yUHAK3`h)rniG#v2j>C50wxTS5*-J@QmudT z7|MO$CGg4%jt|JFDASdG2a|J9opqK+6|&;QFF z4X@CbNzMw`KX`&oc6pDk@Jm-fUADH^eml-;e_;g%n}pOO3q@K{u~q$^c@Pt@ar33M zU*B=6f*q6_KL$O_E2w^cpSNh)9`;sQH|Jgr`ugz-|BG*-FaN%m3jSkn4N~*h{`Rfw zXu|3Z76pIw-;?Ssf85_!?y*G8yKyt&%lZ)ih<6Y0bMJh3F9jD^-bT=pjrs4r3p=z? zN!7<6_>cYZ3O-cur~YH!9@}{6y|YkxbdB22AN4*h5d%}|;I((W-=cK)@|zx2E&7S& zH@yf0$L2WbVEA^$ucj=ml^t3I_G3Fmi z^-FGEsB|-QRP)pm>Q8-X!N888HKd@y$=B%V#h9O8+~`l7T~qSFGDY3a0@@z3B3QS~ zi34gfbS zWew8Q9w~{jBIa$ElzgSmHc3d96KLo_*{xu{UN`a}f_hu=jOD*7{J2{cHEkj_NQdE3KEdcr&ZsAlFdYFBL?}F+E+}hR z(DOnRSg;Ay2_`IAIpI9QmGXD0Y65C$Cd>t9%QWSFCXLEig~A{=-5yC62BR{qR%xtc zF_Zr(bU)_0NahNp!LEvpOxD0az?4=g05k#}9{>gW70n3(uN2{;Cd^r%Q}aiQR-?V0 z&=}+S;~`Bf3c;Q<`8XwIBD-Kry!gt076MJVDyvq3}HI^KP^b~_M6D2K$oZ{Pbb}d-K`5OsGG#UuRrU&@Ire`Kzs~Q>y zSu0+Pwc-IcF)*;T1I|^49uvjTP?e+9V{}IZWYvw*&=y&s0Gl=7QW>#Da@`3n0JV_C z`a=haV)^NcaWfG0{W)8Q4RW)2RKu`IzAgCNXds$JGX9;vaZe@dgZLE%*oQiSr~hTO(53q~JWI7z2MQU_xLg#XAUU~C>6d{aY6;!vjuQU${0H5qjZK#KW|$1lv! zrrYUZd?*Er9%=(GdZS$zA?x3#T~j_dfrsPB(k`luFpLz^0nwsSK0@Os#pRG_`G3B< z5s(>GOqgpfQH9SDtx1ap0sn+jL0-fJiM7Qn=?#)esUjqcg15y4lSL-8q$)yE)d>{9 zRvd*4i~)Zkz(}!o@hfe%U81I`h&f@V8d!p$Ep!W>Uy6ohx~0(utS}+via_+lzzd); z(7^bXVtz{jm`fWOQn2hunJ9RZgjN;tu)pU)o*I+v&{yCmCK2bRmag!ZgDJ)H7qi*| zCA7@jDDo+6CyGr9?&FMuUIb+6MpNj~cGD!?M7$;BsZ}LWN@xf{?Y(g)gpI+rKX@Qe zdz6V>C zLHP3>dJX`?q3sFARUoF6)C0t&|1B^+ie~P8f`^?ys9gvU3l9)PsXt!$iL7$OdrZ*G zQbh949x%qt+VyBsMByMp60yz0et#^XXf^Wb>BBl{!&jH4x)i!;FMP;~& zf&|N!)0XSv5pZS8pwJ@8K_wNWHzD>~0l;1cb&$0=XUg5#!P(ySWxT;;r2Za8#~Dx} zmoo6gaGa=C79B+Y-8(w~Q4oQ*E%U+H0UQC4;Xw|nMOmDLVS>Pm3l%B=*fR2(?}#j+ zXueOpqJ(wsRU3fVf~G&PG61>O@(LLE$ny(ihahN$TJVgmz!fX$j0$;12^g`vqzfiL zN^}Up42VV13Le6+2tj5vMZ>6Yk{m!$>?@o^SV)e-ZXf%boPu(h{YB!Ox3A#fZY^F9 zNA^$g9;L>Bg{4f%4kA-JoFDNxB#Cj={iV=WmNm(DTVmH`}72~7A&l(|x zkF%b-JvNyUB7GvB=Sj%7rDY&`C+8wpkszg;J;ZP4Ks@fof62U<<6U4RZM^ zoRi++HfQhiRM!}QgndIAy#kNNU{fEdAxSfVzARC5Mv^`7{aL4kQ-bI{y<; z**qpqX=4zqVwiTG94}=#Udj_mi=(CN*h2COt0z6${m=qQFy`hCx~tfPpCTbJ1t^)t z@pQtSg`2#%C_jKhi`ZhJR&kmESU9*~TaB_3ei{@ajnq+H#fJRf6y(Z=u40{=W?%Rd z&A-ny*Lo%BSuP7#b#RrkTYt*BCbQ;5U0-6)b#(ZW!Q%~XK{y41SKp&^3EB^bI#Y`^m_}Fte$`3|u_;QuBbYid zsOO3GCE}HAn?0&f2*4IVSM60*pcM>tPRYPqBkGGdosm*;I>$xJqraYL4So zyu_G?J~{`7Y~XDcrKc3Oliv*vbr>o=&DhLz)x%_Kff!D+8V*T{qkDxzqCBYz9B|a6 zMA3``6Zmyb_nw@KEt|=o$(eUrU_oOY>Wt08Jr;J|16)*>b_W+sfB+YllG3%TH$2mV zLa9PMGsRzhwv*uqGS*p*E;1h76I5PAZZ2Zo#VZSK-^xH$zU2s=!6>%{bjqsmlvSKl zJDhQpTF^f{wEhd-qtn?0UCnXO75{w=W(;tb~?m{>0U!U&K$&q#jPhgC|;g3vaISVic2d<2sgZ2jEJL~zlJ)k7$J8*$wH}%9^|kHZ6+xz zk%2{UkUUY7hJDA`pM(o<5J}*>EP zI8?f&Z@9tAW(_#M5t>BA^B`28eDt4^b=WJ*R1Y+q6nKw>ePx-jV_eimC@ovMPGb~U zk99iIs8uHGmUNS(lVL$r6-S5m3lH|CQ|$Dbn9`AW9HOeU;6-Q9&xGZsyoLg22HX#< zp3-IS8N$ZUKWgKE5`cn}7*Z6KEsx{I*_GCpEQ15vAqTGFVrL>{j!c#u4y>m#*(ow@ z%+O91%pN7kbiu)@rwZ;GPPK~jVm=cByTt+4T@r2ggJL`2 zO%mX zJt~tWbg&&A&~Oys0^Br`ut(QY*=s_}BlNDa<wE4pSI<+Q zA0^I@zy=?h*oDQyjV@gX39zLs+6(P)%%-bUqw(gegH_yoe!gls7NyJf^)kHx*TamR_lOXVJv77uIAahrZU#?R{fF(v zj{YxVGc=f(sNB6^GZgN9w2fd^|5wT;i)0QR$R4RA zbrM_OSZkyWP3@xm(n<_*0@DC}Caz=K6`&*=S;I+L6jJ_lUPbic|=& zXaQ?rOu^L#iqi1ufSAiG$?{URPHxLT5pO5@$A&!?XB<{4h|qvgKHTrYd3PG~Ey@<4 zN0Gl$9i`e4n)Oc?M78dOD&bb(QzYjsTP;L+C_-{8BLq~~GHe5CCK?qEuT>E^v5yyP zkW?md;uC{$jR3Yrp|aNy5{9@7fuWcoR)ty%umXoORTq8hn8hsXT377fB_tMAxz>d~ zM7R~{Z5PkF0PqU>)u9o#0gMHnfDZlYaS^m&PxGKz3)BSKNaQ4R*^~-7Sl}p9 zS)xQ81Pd<>({F~MRKNwn1f~}hfOUitZ`zWiv=AAT>}3^1&=%cHI-q#Iw+WVtwY|7Q_w35(|o#&DGPrIL~m>;1|akPSi>k05ai*IIZ*)Z{6^kX@6S;)2Xg2hc{Ul zhc|btd;1ROqtF{ATQrj-6s~ywBDX|O9z;iyZ=5Gha?yiBW|rg0d9rB8@p^hIJQedC z@i@a95eTFZl0OLOYB;9yAwB(Xz%ClXF51id|C_MGAX*VE^Z-byx=-pXIAaLYNvt59m5-9VorV%F+ND#iUpeg}Up>Qf& zf_jJ4pJ+R>EX;CQi{3$-;Hd494}pS{bbwKfCBn}_2O+}uAaYHyw2ZZeaoV1Y3*7S!nvQVpBz+3tHQ>SB2wW*EgWn{|BTnw6Ps>L>0%a zs1&7O<##)YMb8xUs6qpX&vv+4Qb5#{C{BA&CQ>v(^F$j!mLeXd0tQCxOt~rEkbxyG zC2~~*_It5EWTg@k$iy4K7wy@rlra1hcmzeMl=muzo(e5GAh~QRGONS+twJ(*5dQuF z_!^vTLZ-77^3gY$3q#;)K8JS|>a634#|h~;vX>svaj6&~3rmWalA>-`8~}MP^c;bT z({YsK#9_EgRymG@j*H_6h3GiK!#a+VVnhYb$;Mo_7WC_9d%$NW)pGP&Y8O2XiP zUa+mIYU|K(l$0|a$%^ABDZortWD46gnMbg$(!1CflNHAitiE&{CE++KS^Y{a6rqS9TnsfwJQWg|dYfv_Sn2 zQ={W(Abz&W^&lpJ?3O)8C>?l?@YX`hqAURZmR(02T`)2ykEj!dG2j0fh)dD*dZPQ)-!lsb~D9?K!-MB(l*C&~?neOwfZ1mTDs4#Jv!F`i!5 zCA9k{J+b?SgP#LH*wIo>k)^`lU{R_EFJ@mmcrp6|j8$e|nQvhBdH!?t*w!bK0e4V$Q86SQJe`z<#isW3CMiGH?;K75o; zDb(0o6uY(~Sc;0T$nAx zs(OwY5gUn?(Cxiv=!cBr!YpuL*H%8@n&CbyHXS|0Y`Nq;%ckRSarVhIU?)YgIGVX@ z7awd*v7~4MYj2TSaqA3q9O5?oo3J3|$KWX1oNiu}FJ&9T-(bOT_+f(0yrLx+Xq(AG z64e)I6LJ`vXe8n@m3S1!Jz57n;)?HRnF2Q2J~l$bexj-sx?d9%LaMt(({@CsFtfT# zJDMt?MMVD5aIm^U9#GGj#_Ll=Wcn@XlsHW`q4;0DQXgJ831{V;M#rLb0Xc+IO0-8N zc0db;s*K5r37_~DBE%Wo73bScc`k4ozor&6VZc{=#T--wL=sC*_kmOnmYkJKs4e^P z+=A@KsW|E&HQ~M$e}l}hp9MC21#X`*+5DSd-iaF}^(k$|2<4;#*4$Y4QFOFT%*E3O1BpBxW2NZ!Sy8}Ptr z@_1l0Sv)YBBpw(|6c0{^`!qeyjl#)3V+Q1Wx#UHB84Xb_uC2+LLU6Hvs&Q-)=vOo35SSkkA9uvD`8R~-#!B1Z%*1X2`G-6mK;fvTejZcK!l zNRfyKv1UQ)dWlZ=1CdSH23~jcH9D|~kHTm(E`&nI9VoBKz==B`Us?%apTQ!^S_qha zidY+Tk%9n*gwbO76Ju_QmEA!f1I$u#WG!W#6T~yoS>&XB6W&oAmR3n??TFyuS}GuA zfB`x^7h^dOhO|Ho=Ps7@et9@$d)EW?yVuutYGrnaze2#g~e&6}yBf_U>x0 zzE&Q90oA5y97LZ~4AxhmkO+t+%2c7V6{+xV?CNZlRO@TyqVrtWo@xw7S3ta~8nkVO z-dVAeaBWF6ph6O)rHY~4E|pxiLLnX$$HV&gQ|wb}gbPBDgFnGCBl@iOz@0$0B7O{~ zodgvp(oPa}b1Vou2QFQ6i;ChJXjM7Fxs)OSE~fxaDJl{+ffqYc1W<^7w0{uEsxVND zuK||9LJTZ}b^$VxD_fp(1c_LlbJp^lBQa>f&_Jzlmv(m?M6Xb!xUKP|Rhn>@nM|R@ zCd5x`TDEsCcAK3H=@bqa7%D?Rr+|Vb1kyJMe?zH!EScIopex&vihQAw#9#D(nQ;~5 zdE6SDmm?yl2b3+*kZ!6h26i5HAvq2CeJ|}_nAd8tf6;VcO+q$xowbTJgr_4Mw|`|& zp_jOPJtak(2y}=K=vJfO7-s{x$R>M=%Iy833eHUIV*DYO!2x7kc7IF}!sA`Jz;)5TfD1?c^0mbE zeZEXdx*$6+Mk!EsXODG>F>N^7TctsLX(Y1uIAc^gb^ao-K;TYmH*pefcNW4E_ca4- z4;lln&?f&VVrXpy(W0sxVgNG4uq$>pZ!@XTK-&k%5Src^To6?N6K+jy7u&AfkC*$X z0pVe&2-JE_`n4NcdVWRFD{s+@`xn6j0{pTFgC0h3=pd@HzhY#R7+#U#rjR`Unze-RI*YI1s&?$EEudQ^|Eg8n_mw>t*22M(|QKN;U4 zy^Rm>vg70E)@W{XgwW%5H+{4^NU!{=IZ~@5>L30pV9vYiM|OGJ`To@U#ahi(YP&(u z?wfG)xpGGxx7ST`Ofi}#LdO-%Wid5ay=9ig)CKzI+T2pB4((BXh`AN_kb4P1xAR8x zgSg^Nbhd+#8ep4|{Dr12p{_s+2ul)N-DZy}sc>PQSGG&YNj6x7g zb8C${SY5b2lU4Y)$374Z)Xd2VSSqc2M$KA}>O)zt0>M2(Wb-}M5HVlNt3e;xdJmQ( zp1(ni|Cp5bdnUw~K%7Iut4v5RfmnuwH}5gq^9tA6d-S=buGdxAc#nCfuDl998GJn8bQXY|02!!_E1^p-jp{>8EsHY85Df3RJ9*|8zy@}Fl00XrdJytJU z|FEae)V*b|NA~?g^n!1i*Dlht$}xiC-n*(2BPj0ez%RrI`trqkar2g&yWv?Bn|)l2 z;c*W))V-y*nD!aEyBsFd@wS*9Gc@C5uK&~}x{oSH5kh&;8iWfnrJ4GiaulI*vdU>Q z`cgf_9B`@r2H^G7rTSDnikInjp!9^xbSHj&3DFMj@@+yndt zWu5UpW}D?r>dg2877@-=QDNs`~q|od=aXnU%0(pLpGRL;4 zN&2Tt%&jfz^F3>u=7DNlwnyRf2CCySzhIwfOc5cC9v!AWmwS;3JU1cJNDRfny4S)a zM#4lu;6`)dP&KS6Xv}5Lfpd{(B^H>?halF+rlG2j=^hSTZ5&*IJwZ`(Yf>jlYPPk% z#!Q{78ZB6;04bM|ih@W^F%Z<7F+l`$xE>>PV+Mq%KMIEnRip2?-aO!{!;ZU)#UT5a z!)&1WAT|@>RHO;m#%98m$KW6UNEFmm8`~&ej%^fYNaJfdnhO*u*8x< ziRqqrvl)Mk-fUD$7I>hQq%hv)-N7+hZ?+VH9>%&{Oi*asNjaKRTn+^6+C*?5fYmh* z1nADQ%7#N~WJ4Vo&8F8xaQ50-O}wiZ$21a-ZbyDsu?wJBcQOC#+HFk3zXrI1Js0CZyrOtFcG%&ATj4HMk11M*bAE# z>%}F{p|JTrw6I&xfhAkA-yQmDD%^URWA3MY+Vc#gyTvQrw&Q4 z`4iKz{9u0hxr(G|lo>cgwZwNYBO~;*;r*}>2+@}WwW6Ko;(=w$IQ%+4?#>b z!_qV`fasMF@x0Lt8>WWuGSBmesR{AhSu!g#Y3k8XFcWNqXDy-pWy%5soq(jxi;lh!ss@Kh}{nUO)5}x+b;;JPZoB9sxMgvZE(D(TZxEY2H z=2?(xe&X@G5iB}bn++cZn|oSn%VaX7`pjqM4I}Wek^p&vFqk9V@&de23*EvC&C$E(RLsr&>tg>!?HrRS(3Zr9K#83TliDf74E)$l>k z#9;v^y?}bs)Zx4X?;4DFwym@ocY-=Xtu$AipoV~NuQ@>#YZ7C`a0)Gty_&5js3Rwb zG5y0&0D!MWuq&cn-d}O}cbFsRtd#d>{Ai=a9sPOpGZ&PP1OF$*!oC9v~F$wwpR zk&{%jd32(>rnzb?_FN;z0xp}s%ba}@WdBRe%_pg|+qqJK*#TB0sGEczo?FW&b>v(+ z)~@wrgq6O`Tzs-xR0D^Dz#9w~wpKIu)9AEyl9~eEKYx;XBpsJ?{y6ZTT7SYRDyvF= z%!LBL8fblS(C#>GT;%*vp}>@PxrEGPaZ|z*rSZTZ%BYV#mrx{r6kzSA9|NcEu%z~+ zEF*Up(%vgr(Sq_4)PZsmW3I%=Xee&Y?r|Ee(H5@>MZH&T>3AVYd0*7vczfg`8r5Wa zaoUOloj4Ac6JjSyWF$0qzAzVZsT_^taCDHlJ7N=OV-U45N1WWnHQl&(2SjH^ehH8p z0W29f%DIKc+PHUX`KSpq9GGsMvyqH|sZ;QPWgv|QKvs<9k4LB{Y#$6@IHO;~by*&E zCx?yTsO-rGdl3eR^IBM_IN4P=6ZSr$m?M{$=~zZtH5UmxY3Cy0aN(-6M!z_%k8HjO zOcbMoOl1Vwd7Rp?-HS5$;I%Xc@vsrhv+UA47w-t+5lk(>1>ATXixz-_kVwK~x#b`h z*ajAlmj`%^k9vrgVa$#f?z`vrum5V@D-wk$9-14dYl&UqsAwbTi)o}&@v z?w*rW{}NW4hVm@76#NU)e>g8W1rrCu3GDoW3n)T3TIYgH7%A{$ms6-C#l>P9lwo&c zMZo3!fD=VZbGUNDd{|ore#1K=Q_7RAqFMZU!(M1s+*^h2H0f2mOs`hp2kF&v!eEEB zzR2|=OHa6;LU7D11@JgOBq_uU0)(~=@Q65_1stg)K%f%{1qp-=60j*lyb@Pnk3Azk zet}cD46NCx1vnw4Bq&P|%@h#LL{2B-vf%+pg;g-92n@}`k-8l7<-zz0uyE{=;Y|Vp z4-3TG*wX<`SKi+$Kgzg)3oTeTm$mD9dn09U}Ilm z?daIiaKc&2ybf% z=0u1&ZtgDd4HTX#ld{A$e;HHG4HkF`)-y2^JcE%fU9byKs}@&%lD@kpSB;607N{{m zNvu5K?RMx^)WIhnX4&+M@M{QHu6$Zb6eZ{%P)tbwWRdtr#7Ub&PFKxfjhRVcjc%mi z(0xjs2Ly`>l2`|IL9_^LWgO?UiLmj5btFR`Qf4LzdwZ;BtV+mcJOaj(8x3M*q}i0h zO~JwW4v0WZgd8~>;V5xxo|35~0EKA$kCWNAI+;y97*vePg^Q395>A7g1$B1kQ$(UN zmx8%cHX1HINc=mVK_{0&nW^MN7#@JYqlYo?cA#(=f>yCBiBYR==C+M_U&p>sPDhZT zuou;5>~PLTZj2m3Y{jxY!K#5?3QR!-GS%>+3Pmaq>KF+%hk_Nt9WeGJlv=`rV6ibT zi7FMmT0$MGBGfTUsHI2g%zFPJ>z`09B?yOAgj@Qz^F(z}B>XKC zZX4ArRzf&>D`!YLrJ0vx1Nq@B=b z0$NorL&`0HDhI42f`^n_JRUeME;K}>ccIxbY!bePp8n0ZEc@RR5^*1dklPK91Zsf* zup1uXc&=bl#3^P;8wErN_F}Oqn5z)~4{^$SK?kPoo(5qLf zx7R=YEp@CK+Ksri@m43a5Qb0Grr1e3LStbZ#=>YUZpN=upDjtCDlkG9tBMEg5z9o9 zSfYyws!bk)*2cYca72npRg7hjYOpusbj}siASp#01*ZtJT~g`U%rLdtrf!qe6-cdN zYJZ#BjqRb`qk>->@hjp66*l2V)D7B%ehT@?c1!7NDcqY6i-hv9E(9N4SYj^zHX_eH z%=mVYLLP?vx|B-SR_Pg2^u9~3l_jG>GW2|6sC@K+vN(Juv<2D>en@p52M4>fh`;a=V%GpT*f-KD{;sxZ%{C1!BMn|&mg_HR zoWOF8_Vp{~fydNPgh((`9#V(3qZEWrTr$-{U?B=i0xmZO2?2XrVt)9L8m^X@zdWSQ zs(iE!ycyd6o9zRNgZizN-$vuit)G zbshBleSljWVU8XIj_-OJ=p|+*Q~>3zB?e%!O6On?;F;?{s>HD>Na!dqiQZfjkoL0+mfXzQEbJg$--V;yim zbiZ7_i79ewFQs{sChTLiw2t!1{P}U!FHJ$%+C0pVC)D-n?!aNaQmxy#y44K4 zU#%;>x|D-yOavXN>v0ny0Tf3(kp`ntzE22GA;jy1RuBf5k)Ytcl0p~+DQFVVm#B9LjW7~xBUUYpx)(r< zNAgM_&94au7eAn(@>C>MD7e)`Ka%C$j}hod7ax|>ATm}A20HH-?Y1EZU!lNfTVa3X0B;HiJ<4wo98eI{!OaPH@A#dMdZ=FY5T1+qS{I1T>lyW2 ztU|_YeN^`?xqWRItSIOM-%~}Lu{#&N|;aFbf%{ZUpwTT zXHbVI4_Qfot|-IX1aCP16udzX4&E@r;0?-X@W$?W_DD)WNte^Zd0Yemh)T4dCIF)Z zCC+eSJmfqFyU?ER#X0(UWJzI>`Em$4$mhot6W$Mju`F^Ag5M}K*VO|dA<#0>oB**z zFNHzb_=0i`C72tQE396Lp%+fA4#SlVWj}X!4o{=lyxwModzZ5JfQ-2K<^6n4H{=1_ z6G@ND)$n>!2#TI_#^iRLv#EPdHF(vN#EuF_$!TDMQ2gX}2;B5qb~#Vm%JqRpKeg;~Q7UZn5ifRhi{Hj#Qt0d4RJ{4P) zfJMQ#2&xh=e@6@!!a3~+^O)9-(RTF5m^AktjU?Q9ItU1c@vV7YHDm!W9t9m`5%?4|1!onRI;b=G0yriZatmc&`A`2^vKLHYV3#kYc$B zrn{N}&(M{Us9GnXb#iSjDDfeobaI;|ti$^_)P}iamKy$|i26|LbUFk6GIn8q*~aYl=8SU{|WVk$Fky7`p=V3QmfvnC&Vs{vD2)7UgiFWh>Fw&DF~F4 z7oYFgszGX9!FJESShCE#f|Iin6zvv{N-tC0zLF;Iei{DH~yA0+4wd zWo$jb6bqLl094zU=t>GLGG3EYpy&EpsWX$JiP2UmW+Q`N!tGx6`L5vFSq zy)mcW<`@8|U;&1PA&!NUrEEG5iyeiVGi`qPcXiNUDV7=&0VY6P3YV?Lu39c(2EVNa zbwaL!8imTd_6&g`T|rwy#QwB$E`}ZDrN1KTwCkrtwsXv*Z>vMFu>20~B4z&cwrU?# zCyv&S=*m)aY1&W)gHz_C@2Gf8XB@ucP=j5;>XjX>Ok zwiBcA97?Lp!wZ<#8Ep2M039|3=zwnEJPpzJC|-9JPmX+0G0Ia;R>HQ?MKNyh2M}Eu zkN^rLFh^S)vQcEE+48PB@JM>a(3CYiP$-O!iMVYpml?KL_|2l^EzoPhY(#bvNqz}u zL*N+qAGq5HVShXdQv4StgmEt5eHg4eBES;_Fy1hN5k$ji)d_?&cb9yoAQ1B;9#Pb* z$n+B9C|V^erimX_!B+`A)A}Cnc)al&D7KiYEg|2c!E~enNI@dcr>#7nmLs!hg{B$M z6Lk0=5~}T`cIr62NY#51ssWTxs1{w@3f1lZ3O_iZ3R1gC)q4@DX<3my(nF|@3qLr1 zPeL_KFO`iIO5!lESbmW6oPqc_UZsHF??9CiA9GjIfU21KdC|c$qm>D=}ZrEM@_B| z;2zEP#j2RIP_PuM05J$s(qrP`ym4s0w|N5#dIRCUFUKdU)`L?3B?_mWf(Z%Jtum(M zDqAC4hdZ?L)AAgU91JnEBqYsA+ts1Xpv?1>%omuuYxW@tnmhpvvuV3(S5fo!c6AWR zE^I8=Z~{&5Da(q_;OxOJWYsrcHPpmTWbGiSL4j;2z7iC9Aen06L3 zk%a;_;flAlOQ0(0R+WO4Bc+K{@v@vZ2AfV|tOo2(x|0~I-}tSq*7 zRz|NtWxs~33~Sw!l~KKkftAI83xRsGlvkxakI*Pd>@HFEMFLcy z2z5U2KG3P%8YB^`9uPIFO1o9L&~|O}wR}RsO4(MSXh|<*3)QXT15}u=gkIvgLm+hs zOhIb&8D;D&i9!V}5>qdDZ#cBWhOM-);f-+lNhydGIQT=wfj{{UJ&`-xE|!4VyKOEM zsYrevz*W_Mnl;8mpayyl`Lzn#fo~v*>aJxIlyO0kzynKB2YiA2Jz!I3 zGTc?zP#H;tF_n0-bNAJRjbN8$w9AJ*1N4xK@L?Zimq|9)4-kxIn|tYNj|kZ&`l{{A zVq_IUa^avIoy;kjC4W~9Q0?tTDNjN$haG~LhtQ>DU{zUh;b6&9z!_T2_k;x%B+Q2D zZrD?RUIYk^42ni7NL6SY)ZK5hUds*H&}l zWR_!l2~5c4Lfk%s<3PVcZ!j*jAmie0#?)kG zt3|K~#2wo}fVg1;f_-Q}$RQ>m1k2JUieNI#5@j8Zkv0I4yXRmndhqgI`QB?*GdP+O_6 z1RBBsaKu`uQ1}Z(03eG2X3IQ^Sfp9#8`r9O6C2U}zia_1$<3F2@+F#nR9|_%gccAR!*~=XDiKgc zY{UinQ6SD(KfE1QEjA|0RuSZk0L@5Jq{B(k;l)~tji3auj35kK_#s3DoI^{6R3MEZ zy}kNm2JCP|P5eJ4CSeFB`4UJdSa2sF2Cab0+Gcp7L%NUBB9s&hNG-%l zkP9`Bu%+@+6WTZe6hbImV@VD{Q--_+OCimbs?QLkXDX46Xm2I-mHJShwj71qh&3b;VT z#6UYH#0PsZY>Bq=o+J9FO;PcTTI-`wKi*$|93zGJfhCfOQAS*kpClhp z3{n*69G*iGqzcjO3{1I1iBPacjAVcTYhaZ92@lXIK`+ux44RkWQpFf#1KUnnPD4>N zBZz@!5OiLek;Oz4wN{?6P;Rsk#&IZd)$ns86hB}i1K=r5S!13pEP-E>JeotvCtMjw zEwlr3Qz7oDARY~O0oHL=9F0&3jHWgi4InNPI*{84k-2fMFIR}-;-0jR+mS(MI6YKM z+n|m~4+n=Jvo+bidABu5aV&78K)x4oOk#c(@g3s84u@0gB9Y(L`*$;CEWFRNP=s6PC@wt>@kBeMnUzb9ZI|bd-t&$ByIhMhFay=I5xRV>~ zKr6~&vU5a~<77bs0|Q+jVWAZRT?sM0!Sy5ve;|tWAqkae=j8;DLJ4PIPJm7)vD|Hf zWj)+O0i?KKA{g7nm2X@mU0lbS2WuqFn&R?<;LxW;_0Y}~>)VHxM~TrOKX^hFV+W*2 zFXV_5a329<*pNlZXf8tAZ)zN{j(!F!14eUl8zqyb_BFrxo zJ^NUTWgj!S0r3j}+<#f}{PzXVe5oRN3a10c;8+IF8&Ea>j~!^+qu|*r_jh~oy+!se zc>?6UNS;`_o(9YRQ+;oz!dFrjGo!#~IkQo1m;}v5nZgI~z2yg*mtKcC=Kts3w;}uP zeFMY>|4Fs%lmBf{4j$Y8@xSfO|Mog%zf?YSpZ$;jt%v{Z!o0ZraYXTd{BPjx|9j47 zL!t-`DPnN8>`Z*`|4DXs=pOl*To3AnotdYSy0x^YlO*6<7d#5aiIxOH0mi51af9QKlWKqt7MoUQAz5(cO|3*1+03;4XvlFS`<$* zliYe-gl3Qqc|+7|2K9#=hM@kuNr1nIq&8QFeakHc6lss(ZlWV!#zK+u=WH7&V%Ec& zLvgVr1t4P9Llg}J$_C1P^(a;TjWw)?92&@%VDt?X6fr9K)`pZ1J=6`>L)~EIM1DsA zrbqy@o*rcU#l*_e7^Z{Z3a3yS>qL{GG}d6HG20Sr!h{G9C+?BqzF~sKPzf1>zdK=7 z4DTD_7%|hUQnpIUwyKofFBg^wzdhV8#5}|Bsg*Oz_JXEFGAehy8Ul8Y>w>)SH?boE zV{n{7qITe#AHyQN#tVtKf>^|4yw`M>w_#NY*S_Ci@=CPfLFH2Z+23_>K?3yHyJ? zu~s2?pOutqIBb#>0J&UdqohZR*;+&U+= zqaGg%xSGIq5P`+_bhEJq8X~>ihAg5}Z>7|K7;UaXKD5`mq~j_q{zU3dxNa1!flnvlZ=O%@W=LR+qulB%942n{=VXtE$N3 z6;&x&^z_ll#c%mQ2%h#M5VE3$8W_&;VX-ubQJN(8D>&|lK|xzAX0eWFh(|jMFgECQ5%ug2_w=@b7Aj7I_@aHLsuTmpNP`R6tK!J2AShw*QXX>>uMV(SD`SC zEG*J{o0TRH=iM%}X5MJl%{Xp!;TSby1dlz!s@YYnLreSuTM|~=x*%*We!?lwK_V_S z2FYwhWH4Sq^((<*2I#@e%ec9FC<(v1%%;e$@ih-Sks_-GRi=B%V=#Vxm@$b!x-3!P z=}A;`Q`iz$W3Ea0EUXkkpe!3}4{9-NL@0&<29b1GfS=agwT&Q>u4EI4SPsMsPGRC) zCB*fUuS?=&3HpZb;zq6_%p7^bmETYq>Np7GgcMx=6|+_?F{Y4YKKm-#xmYkI%V0_p zOpOx-O436P_K#Icng-9R^$=#1=EXU5E8u5hCSIo(YQg*dX{&H3^2?Xt%hiqQs@8a? zx>lm>*LHaU%G-rwe(3Q28tUvtRi3fUn@Z1P8~1Bd9CqlN1fN`9*6FeX*o=h13tWj>3m3NH5Wh z@Fl^^3wu9AS?iAeWeTl$)Ak~+GPMR1{whH=T`&( zAYKH308j23g#dW;cZVqTJAeD{8~bnhx`>Jh`L{KA6CR8&-umtz-qwG=+i%%6D!{t?V_ z&-Jr=O3gaViUNz8#xY=v*W$X8tP`z8IE%yuM+ z3(4DN)_+MKtzI+le@P#od5!600^SaD+7;U9o%fiN=0^IM$d&pD1QPn`mHN{N7xd^= z`cQMmY<&eh&i>ptCYaWep3V2Z+b5XqB|WfQuQ*2+Q2_@O4=~f`=)*o11{LCIRYVGv zGkBa82nv|uYQa$riU~Q3ndMM(w!C?Hj$VdwTs{|Hs<_vzovTNhZ_U;9{`v2<@uiRd z-aC!!Cwy5qC}f{~m7Z)zdx9OqxC6T%0($4Xr};>^4By~A%lB>k19yfu@7s9UZmyW8 zKiu%tdc4=sN=5D z*EH|^8F2`br?=s8z9Cj9DaM>l=7t~W0ZrTftJmyJX3zqCmR`EX%wC|6QR~dc1^QU^ zlsRjm9$}7Ns2hOm^|2;-9pz?2T*x?p&#*|oN6A-$lDv3RRdNSQroH$0z-Ex;dcd{` zzd&`#xhHU`a=jL%q>D!LLHCPUvex?=AH)y9c{Sf3=AU5X-R8Eh=*Dw5F{$_d;f1U2 z|2dY-^x8cRZB&>19ZM#?*ZBZBu_!orG4%C6+nh4ef#C@5?l%3mUQFMh4Gd`s>Ui7|`U$Y^&8vx(P{KQV1y3jcjGf`W{QV!|7W=rqP#`?ndVQ}Sd_PnKkN7tY*=}B@n<7{ zViwB#K7aP%PneCAw~0R+_!Glpw;{&8!i=={hCEz;q{7>YcT6N>-o9R+mbv%4#OW-u z-Zf_~(FbN8t4dhRgsoKx-AKsJ`Chro`en=X0hv{m1k-v0s=QK_@ChWScg^e@^bEDg zOui8tY}k!@m|Da4OR-OXaicy=FZhnh`+D1Ps~^R9W!5sy@9?M0TBi9k{tTyCy$Zi& zM%sH_9u~EBnvXBlD|$vcH1{ow6iv-d`kdX<_cPzPNuQWq-5pMD!S^}2?8d4Dv;Pf9 zS%6+F$QFFxoQ4#=@=;T|L60&2wM@?(@=aCDliWe)YJhg`@(?nP z0VWjsc)v3j7(GYdwb^Vpdd9%JHg`K+hdKz@H|BkH60|o&pr(3=gHR|^TCVqF(N)3o z$>90M|5MzT$7Nk*|9?LB2!en-h$0Bc1Gu25xbLPPmr2`P+uVZU(MSbE+{%PzES-rA zw+@z;Gg(<-S!xeDE|i#j(~>DmODdaaBqhbNGPCjbKA+|B0h`~vzQ2Ed_`05Z?m2fm z_ug~QU7q`~VdQ#?-rt7P)~gSMzw6Vg-7sI$(N@w%Gpxg#8qIvk+d0SBMG5#t_Zj_3}<;pfLUU*GgjC!{$<0U=T*F3=k4&kYM~_MfiI|+ z)Uto_*Dt8a9qYc50V9VEkKv|D9AKFl5-leTFk58)$1#OB^F_5$$1JS2s3GI4edTWk zF`AfE&%o-|xFWQF2qufNqJKGG;P=tS_T)aiKj@jc!ZX)D>5CgAY z8%MZY$kl%2Kq2Efqo(**=dItOZqT8w(q2(ds#Js%|{-Rh6h$@%&fS zsL;CoQrQ$V3ADqzud1G^sGKjqs_u31J5W+Cyv~aCBNX~OJiAnN(Y?IB6tX+OUVz9I z!V~WQg6n&Hx>O|woe~1xEN9nNm8^fvy|=1VRan6pTUDIe@*@{)Rby1~kNn~>ffTI0txkVYx2HjmH129cwKeVk9%`pS2K0nAd~W2 z23dFbQcQ!aew)uAyN+DN$#0-C$9dcvYA8VQ8>+p_u>#dF+u}R;hAQ~aCf(FGRf6wX zQ9H(;-&App!?wSvMvtie9}%-yF^=76+A|gJp)VYjo`FvZTTi_^o*Oiu0d6Or__pfE zp6x2OaSkiDtHj1(d$+5h2~LfWIxJXSz72q7wYAlx8OJzwhZ+QV-?>AzgS?mQP`v=Q z?NA-YY&l%6b<(tcnq?FioBVMM*Ajoc*oR=Y_mvtWP`LpcQ<%V{=Unyu=nEsy<86h4|L-%1;Xcir1vlLe>mP_YK;Vm@b#Z8?#u39xr% zt)G0gMsG3Ad0gXa;wzRd%tLRf$*63SS9Q4IBFdklnIFHAC&`RDUwzP-Tn`vE{x~XM z?T;Vh$GmDJjCrSqqwOwpedYM^GHf+(+H%iwFto>epk=hcOvs=YC?nQ6!y}m!6-HS!bPrKFK(N#yRPVF?J zy%;*dGykqKS~|^utuOquGpYXj_1!mMk9z(;rB%!2dz9z@dD%60uWH@6PXCK~J`ug= z{ok!(1sCsAaWTcezuYVNfDi6d>AqKd-8h$!`=|g-60xgfE+_E?M|u8t)_&Cn{qV8< zDh1f<7WUqL^+b%7^>w{y%LklWu43)HuOpY4dAH-ra&>d#nnQsMi*DE~eoeFZZM9QB z!)fneg?h%j_#G@L^>2B_0ri3Yt@q9fbx_wYaJP@tD6F3IKT_4e#vg07zg-T*URs#5s35M`*@h;JAU^A^(e4gj;h$8 za!H{nQph=~;&cZ+=v`B#o>uy~26>-rkoTU3dE4kgM&4(=pMRo$*7fuJ@d@<|Cd9d) zV$Y?PcYTUqBc12TpQ+)%Hh!k!gSJR20j_uX>R0NHpdEq*0dt?kOku`L^5&dGWQXw} z@2ggQ9ma#+E7htM@v#&5DU*LTU;lpkTkYEZ*Ys^hGyOigH~Skki1f4kN-f&ytoLHA zx`cV&``sC}yGgu%4BIJse$b*mF46eb{%iC-JZ!Al0or@CUQ| z-~NNT>sBWnXDW9=`$F6L<^-TE9~f?4NmgZ)sL`)GFBtIZy0 zrd=XlU)uhdnf99MF8O@)H}#>aIzg2t)&QphBb6eAl z3jXSLebBPuaVuUjhR!uk^Mt0z;xsR4Y9_O>DfNwQ7z2+S)9@6B z{ajOu0((FZjRLqih+^9`WDkG9jYoSHScw+~nTc->G7~=>M16ZU{MKT;paom zmVY;th9kY;FzPg^K^@!ySoVO~+;&2Yy3C#!<3H={YQ7dLGG4LKm{9zhNf`%h zG%mD-pkLZ(tURNmjLSBfAg>rGWBqX}sSfhHMrG``(G+>6KpCfPw4e2=# zJC0iMST}Vuecsh>B0akF3n`)O{;&O9d~W!#w%Ng36KR54_PG}?dGwIdoJ*!uo}Nt6 z@Gne87chfbb5$}1wCTSyLMA9??};nwIlSG>F?es2yCtS1MoBok4vG(tbe>dsP_7x+i-ua zQCd4Xnf3dr6UJP_0!`^my%AL0nR;2E9oKe-$&Ry@R2l+sV=A3Ool?5cP+%x*6ff<9 zcHGL|E;J57L0xGQz_hNE4zRDQ85rKpOb>x>Ue=Xb^1^PkNtJxfF=;d=r21>8jjDN0 z8vQ|CG6}u7HjSb}Hq~6C26v}SRrD?Abf>NzeNqqdE$eltODu(9);OzsFdyhnQ$nlG zIH@3{a}VmKO3v`)9yC6(+M$R|)edb7hJ8IKRv1q9pmc#ldeT_zeLvBY#zd|#`9s~B zJj)*hu<={|wx>C1hxMWvs)%`hFI*+W7w;cdQ*op`^zg0txJpDHBvH>9eW5>Ij(wQ^Dl`%iufY)DKu zy0>P?0jg2Qul1$a9zJf}%=WKC zFoT`qN&To=ujC&6sdr$Fu-5Rb{`A*~$~6`%mbT^^s)pkSP*2z|;|5SkSQQdNX_Mr& zpGy950Geh6bJu}%=YN#M4gXyT>Aq^=2}YE~6ap&KSOy>=bGN(#3Bh32fw`P#J?U$w zfNR1cJi!`B!8MqoV@!#dBK1j3bX*~`F&IYKMP4(QQnAF@KbU%i*e#c+qn^JGrZIh_ z8IU{JO?WG2F!36=q@_XQ15;zs$S9ucd2Big38Gm%gyMfs{N+RFB?$HY8|Y@V!j2p8 z^S4v%8A@Gxo|3i_8OzLO${Ib=Y``S*WgjIKLuZxoARo0wlO7lfwN%SzhEi;6X-kQP zcQ%^2HP;*JemUx@K`)Gf-F1=(5Xk_A@{qgbbJUI1Sw5tx~l`BOgdEShVT zB(bR}V$c!;%}zDiFgw*ugNC=VI$L9oeHO>(2GTW~M}BQ;wYJ%qP9F|~wUQSOr&~~mis5ueXTL6Oml9?I3=CS3pQOo4267?963@sHbi2z}mzzOr zg7Nh72r3vM7a-gr;KXli?aL6@mXnfMw;db-K>eU$&3h2$sIYs7ISOWtqy)8$xo9M& zgNwXtB$f{LEeif(B&NSg{$(Wf@%5-+w8nr@vDp6&4ms?zrz4 z?%Jh{O7sO7R*5cLEt3_ah06PI&D|~l;}}BBr&f$3;%g=)mq_xdI6U{jYyLoYH|Tz7 zhA0lZk%G|OqHd&BzQJksExD%Py^-#4dO_r9>S%J9SK=H^bkk@`Ze?EUz zChAvU4%(}7L;b%9wgw_LM}n}{2_i#E5P?3*ML}w9ia;OR6+!B4ia=p2FjH8z4%j7| zB+$oKB$Pt@Cm9L!v8@$kg-sFYW7{A|u}u-^W7{l9iA@n`6gYgF{7I#PNQmUR#UI%r zh=d4bn?JHg5D5`VnLkn?h=d5G+#flzt^gzn5>lm*9ORfF5+al;f23Lv2@%Q(f22kb z2@y)2Ag63ZppSAwVBW+9c}KcNUT$%2#$vdN|h^s(&_WQ$D^=wsU>$TpiI(8pFG zNLhhRDih4%J0eKAO%Z4aS&DE>kV+d7=wquEq{^lU^s$}rr{F-;^}0&LwK&Ve34fqw z3S&R&Hd8J3y^SXI^&jl!Q(BIqNP_aYHOw-Pph+4kA}Qi>U}9KqJ}W*Kd_kTEj8h0V56N5`G4=f~@{!-~W8!aEQruQYIuJ;i zSsd&XgI)NTR#aB+Cj8=|$jm@J#{6x&&uWvFD7q*MfaoR+h2F@oY(tv)&=cJrX zAXXT7VrI#$?~t)N=6YWu=B7VR-9(14Bh0=3-zJi~V3RMh$Rs2ZTHa_B_8T_k>;szs zoPkM2oZ2J>THh#@X%?Ff+Gy0M7?VaAi`%dyqDNs%;DlKO z*&MJWj#ta%d(U{SPAb&WY;nZHt3GD>(gDPl#5|-~y^4R^*fFvD0e&D5 zf&A_6gFDN}R<3BHl-{)4F|F&r@Y{D#_k=$dp@d>!);#{U=K4|@Pe?#8q=Cy(B}MGI zlLo{d`l(!#E5Z253C>a?@a&vy`XCSEUCz9dYS4xKE=aD)IUKKQaYlgqlR>!41e?Uz z#x3rq-qG9YolaJN-q*<0utkAdejL9^#^Hx|*_-bt;*86~i zlXN$Js@BBValzc)O$r#KVQ}FH-*}6UPNv5Y?T#sQJ3#3aTBO%|+fT({ZJfb`Y1kjD zMJvD>{#0%q8kH!Y(F-XhV7Ev7n=kOQ( zl|kDG_Gz$(`i7OD7m2}+GA>)gw|HoA%(07Bqu^mV6j(;Sxm~s47yiOStbfG|W>7A` z=^2z7aqVNUm>aO1_}QC0la>U8T(J|8ioG(Mmg=Xxo#xO(y4q62FJ_ZRU|0?%hSmKA z{mk5A#DjG_D2Lh#X-W=^=2G60gROxpd?JTdyDG1uvR#Z#g);1PB>P}4rA55>D9{w+ zCjrkXW8Dhgol7HC(c@3erIwS6(21=bXuLFxZWpw`2%l?Q3k@|xLmP$4Z5({ayisT~ zGqj~0%Gq97hrrgk4~cJ zADV{^r@;L(g7saO^N#2+rC zThy{2z3xSHRmb%e_k;AJzMl_0NGbaJT>l_;GZ5MR5Y0iPl@DQgeTx6}5dB#d|IBlj z5I&RoGxHKOFre3l$CqFo0{qev+<*dX^DuQtEdCh>2ew@CTcY7L+R}$#k|pwqODJ|6 zCfkgMsfVzyeHc5ZfV&>1B!QpXxLS&H4d7#!TJ-#-=oG+rFQrsK@9Cx32~x{`F_n@x ztq}DD=7oyd*+f6Y8<*oS<6TaCj9zJgwdBi>(M;?b+`F6xHliF}PLb+~ANkaB>K9)6 z3kn+G`be3J>^Hm}R#1(KJR(hE_I0QjOlWxjkmDc6R(Bac`8chJxp1W%Yg5_8#LYkR zbK`Cqe@2bBdl9{>x7qV=q$)o@kl%5T>$rKnld!X1&#sl&l3Mm}?}C-&(WA3Bi}$yBX^$x+Wgu7b%?&k3t(J;1Kj zln8KgwHXL3!P{;Px%BWd3`y%O0k=NT#YU{9`N5(zpp>>;<+s<;BO>&X>#Vk&v5uw+ zUa^ik2&`L&@I7bajl*+tJ$V`VIeArfx(;7e zkR5O@PkfnDn}vm1Rfr7b6))59FF!B$|u##M?b;KOQ~PdZQ(AhIfxm#xp_GYJb9i4 zIkPgA_MR)HBGp>c3~oajwU$4F(;R_3@2GS!c}7 zStv!!-a@rk+etTWP>;_D<|7mSgqKb?4>{HEuvyAQO5&{N=T07vNHN(!3)4e zDBA(0*Nn_skd^5fzId`HFUKsBIZ(4Rn@D`PW^iF}F1SdzIa%}ONnvMXd1hz2)6=gY zO!RC>oXc#O%=x*qv+m2t_c$D&#es%(knr%XUDTufFgsv8pvWY>iyOVxb6>tE)9uif zaQJR|Cf*%yjqe7nf+)Qa9>!1Z#evE#{N-*m(EWUMHzfzG03n7C@1;R8rSMAsy*+zY zHuSAeNOj(a{*HM1PF}MId&WC?KR}Oh30C{h0F=%-A|qQ`GdCk|p2rPcmz$G4&x2N2 z0=hKN436DPu`!#0wg7rtj(gtx`|fw&my;=6S~-se85&^LUKH*kKMoAfvhbMdaB2UH%*?zB_(l6k(eKI1)T*pFZM0cg*_o$oV$Lj0tAk(qZZR+1Puul$ zZ)!QEDO~@a@(%2?8b0t2jR?qX5Bc!e0~E_04#2M2#y20pneQcj@&KwF-N9w*lA3mw zZkmtLEaI!-(+6l`@FI|9oY(M(3c9(|F`$D4wYf_jZW}-B;OwoSw7}6FU6|lZH5f9- zGbbl+F|?qT%VQ5x$KX>S%J|OZf`in$nJdMrON$imrh_=K#RbHEhhWB(^OQq03zaz} z;4bb}NrPJ4)!C&@M%+8$WR}rVy@i#OM=f04T-v?BAAysu=IX{xj?e;qEkAUG(t3oZ zNr5zNE!buPiYAuPH+=q#8Bjr4^V~D$&z_A@2tElP$tREC>?MnDexH`ZqWb84x=+vK zejiY;nDXu}tuuJ4!Mh0XQ8Dv00mBd= zl3T*R{(~OB{ng%9Px}UgQ^v&x;L<=2Om}0}NWX@s^s)52L(j?fxN~N>wb2L{-O$Ai z+lWto2-~NaV?V-5WHaY{ME3-z_H}8kz%Y!De*^`U&Od*IQM!T$9i!yL3J_(MlhR8k za`5pO{UX&0E;vS~gHQIe6j3qfd`v@|#r3!Jyw;z~KF0l-B2NB-_3Bh?8*)u(E*lKPlL(d|2+z?9{pW*GFQL1Y&P|+$A0HvSsh0o~WKwZ~0<4vA> z66@6qTzZmjOq;2pv|C$a{BBj6W%<(P+Hvnn={F-}Ahus=H@EW3t)Z@BjW~ zw5#gWxxVK;@BN&5@wuwEpQ>6scu=H(f1ydLpbGd2O^Wgv*SK7H7rXjUPerfZvVX5= zc*+^)W=@$rdFILIo-%#vcBRYyV*9g3(BGT^@q`WTAg5>=rJmX52a{l^ECw-2nZLZbvL z)H;k8apmn1uB?pKD0WP%bQpQPL&EzMUb}96C{+l#@9`R6qtda{r<{J~%=2_8HT8_M zXPt7!tf>Ur)ha$^_LOg(gWK<`=!|ow%sel2r>dQL#;hqbzkSNLrks54l$mEwJ@br{ zM}~f?5~oa`e&)AW>|s?gc}nrAOJ!$HnQ_k4nN!X_8C6f4dd8^*WUnqyoOvqCl_yR` z6Q|5Nb0!iiPCgk^c*@CB&X^olsgqAWZOSQUo&3#H&Ylw1$vdD1FEoN?x%KT{K4R4=PF8 zY4uC>ujn5XoF{9&y8 z*XlQF!t-jgdQQEd(Az(&vp!M3(OdOdMxW(1MhC?^)uZ|s`V4Puba#D!=c==!2kFXr z-ulqcP^hn?T$Nq9>Y?~Pb>1cYXQd12NXiL05l3YU-lU-qd9D4A^%jqwmAOTg-rV9< z|I6XtSp(z=ofLnPfVVa>DMbcbWyC>YR6ME?ZyrHp+fR@D}-_Ue%xpdc{g_ zUh5EhY4FB>DegJ>YkF`0zTXSKy0`J{R+)vL>i*tq`MR3od%wcBzwf069j8C}zEma` zTiFi>T~WOWaB$<&y9)ICx$C^nruxHEDMtZ1ZV?*jcgRub-B#ugXTOn7rgS_1kQSd- zsY6P0Xl2#K@F>+eeT&t|6ot#G@fPO}ST%U?5#hSk9x4u@V&q9WX(!>X_EybrJ~7~iO?^gi0_rQXFk_h;cb0i>OUL~CW~y*~@~J*QPI_U5(@ zm0#(P_jK#!y~_Y+D+~rXr2JLSk?oL?@s~Ayx2`z#MXa8`@*1b9M>-J{qaapuf!tg+ z@S8dCRipR$ZCuS-HF(r*QSbeJvobf9<+xEmv#xPg`l8ahx@cAF-Zg5~ZU_HcB=*U* zfLP4Th=&`(VfSKh|HDR>rS*$lOh84wVMkx)Ifq}MF7uWhJ~VcjK+ju$)TC9zj<{V7 zc$Sq!WzN&-3Lu{w>BwW15-PvF)_ZSU@8omL!gb|MI=(NA zxL&}>Ygcs~xh6T_57NtBH}C-)=oM>5Tkl=#op4-BdG4KRM($gWYtZjqyK3EWwMs4W zHXT1yEn4*-$8V^~&QobD3+-k*gfPup^_yvTMAiA;oEamN=QxpOorpTxQ*-)wn`iV> z=XmeUXjA8U%`-=MGOMGf&L%}HU5)8`zZ&NX)@RnB{Sj)%-AUbsJgmtIH! zY`PEt@M+4M^3e z1zL*EzJx{lUOF9<7n8|LnzKf$KHm2)?N>_jmS5P%+jeO^hVap)7^OGjva#wu@1n~F zRIh!dD+II}5dtv{mAfH!|KWi>78a@)l@QaMeb^Xzm=lQh|H=hrAxvLty^RB-QFB@+F0lHGrbJjpypta~Ozl|Jy1K7gb^L9Y zM`Cy0hVeP8CUsuY_$LhCjI)@ zFObJs^}(;hVbgTFKDzSGMW~&V`Ch0adx81x>3Sq+#JbZp2!Z+Vblp~WuA|umBm!K) zeLLK{7Mam!=wTRM!|OTYouQ9Vi_NQN=w=j2oT>NB+_eIg#BHMS$f`~3l$kk%+WGM*(-!0 z%42pB^op`qR|&~4=Dbp+!Hc;rFkL@eVb;&kXJ(#YClj`+^UZ-X^}(5EnS?gox{mC5 zX3*iINtFohXY(fg1qU4gl-2H7A{|3#ums-7=LgM!DwDQM^6U`$DXTm$UgO4y_ddgg}MG*y=M^)aqrzL8_etH>aED}*mv~k zGH9?AlqO?GcqI3<|l+)wF!L2|_*Q6aZTS(gf_uD|e}X7a<(d)e&>#1^OfXueY1S=ID`C zoe=Iv=vEZl66$ap&DC@Csd}?9AI;I1n~k5U0s0}&y#1+aw4$mNNHu3yxsQ0)Hfl$2 z^sfD~zCN@0&t0MHCg_rQ^We4H^~F1-hF2@_ zQ&U~1M&h!mQsqpaIFz|_%=$^p;63~@R~dM$tTJ3>m94(f9F$PaD00>*C~|p1%|sC} za@H9zag?I~lLK1e3UGJ0+ivsAXC8dc=iHe;@xQ6rOWUx1}Y8oxnRwN z3Uw?9mjULo1t9GZlLcf00#Jszuit2frKM}Y+?+Wttp=#MYnGmzW27tNvKiPvcU%oq5wD=lZyMgZZ?#%Bkfh*GFA2WHklvu)G(Y z0eI-HwQ1i#W8E4z%Ov2DSO`j9hJf&8e>rYbG zVn{_C8+txr!@12H)RC#f^^W^HmEg1)7a<|iG32R%`A-AeO9 zM}VTu`Zi@Qnx+mjzdc1}t~4=3|I5GW&&KZN&2OsXEwGzS$G2qm0P#J|rfLB37;HhdTOa5)hJh-R~GC4D7ni{b0BV@I) z?A4mAid^OiCPbM4{e%fmGa=3dpaBzpv&ft~O;ESg8it=_K0diudjSWK_M_(?d9kV0PpdTJYx&uI$BU>Qy;a$tkXL04Su7!U4wQjw;eK=$}EMc2S2~JMvL8>_FAa z+)%0O3*e}r@}O2w3&YKAVPGX_kh_q>?}hvJY1u=B9_FKN<`B>*gc0TO=@XZmUb&HO)2_Oi2>pEI=$i7G8 z8qBZwEF(sTy*>WW&pb0m)kf1f=*8ZNf7nljJ@bbHQyRk(u+LTI@kcR<=a}r{z}X+I zFav*~2IKM8=T(!L`U^E6`ReU}Rb6(8zOF*;QTOkBilaTK1ipNwy@Rgk<6U}jzv~`T zgJK^sLxY*OMNQ3klyZ`OW^>D9>H*XYbhtr3T4A1kRON$q?_XgKe7w}|Wsj?t*k#{G z;e=PXXb-dXadlvi${;u7%n?thL8&Y5fc#9IJ3Ggm|Ad;Lull}u`U!Prro_SO`c98WA2?zIJp|0u}p%b(axUUdEVdFloa>zxPXWL=;5NSsA z@!zj7+kUC``}$kV2;}R|Tyva=L`SXytHqg?k4d>iM?Og`0xBhPQ71Vx6d8l1fk&{b zLm~y>Z8RGQy;1W(O7&?17Q*D0bVJ}OpPBR1({-N$bNV@^xkBbq9mzZs(Vj1KMmyZ! zv&#_}EBdlU;7h(+S#=~kg%^4kWpDc+bU+BR%GU%IEsyedOuJJ7bFizXRfd%gL*|0$ z?LNkt3H$Vp2~RLV`}B?p8<`N$J0|>!32Ed=IdSvmOubtsPWe%DImVroSAAif_my+v z-dC^a?W1;s_uA`O^X_9RolUic9Wb{bf5e=5mhNq?dP1dp;Z7OS+KinOv|s-%*q=mnpI%b8=y^`Z%*8-##Om1g2c_m#I$=K5|OW& z$c$`9soCb<&FTpKuQ!^HHmez#Voj}nMeXLD%@|VGuT?bj3)Tqy0U?A^gW{!^5i{U7 zDwdp0^4C5l6E>Z{Qv3A+wvYs)^G~p7M%JMj{wsB$S^FEcTd6gOjpv)Uegm(9(2v1p z+jHtry|TKTh{RqLgezN2$HkU`Hn?%p5Lwyo3tZVuE3RyzBOgDedYg}4P?=08UxqOR ztnu?mPTFkxDyGAD2ilvx(14bVG)KOu8e?mjp0d>L=RqD?OU!F8f@Ex95*O)6s=Stp zFezvOrYlQDGTj=0EvvWb|CGv`xlgLf%+o=|n3nU+uq|qw-h79-a0_T$_rZL)MIDlP ziMg>1LE^I)z~t52OnOdIHuHFoZ9P;Z%EKB@-ci7Y2}N6%SnGBdU*C;3-PJ}ld5 zna75K!9|`Ud=)=n=41d+F318gH}7my6Ju91DIz1Q30`L}^!pVy`c-aAL7z54f;=^JnNe)N881Guca zS_y-%!ELAN$TyJNXS`3}ANysWE=NI^g#Z%WHz7+e(&qsVE{W`?Q2T*xxd>?ZdysgP z@a2&mpa<_Cp&AN~8X6kusu_`X-Ol^{+>b+tfOMv^b7@RzMaJxZD8AVT!jr<%C6j5* z$FrAdSHo@+qn?&wdMx`?;H!HVkCtk44 zI2};zP+`PY=tzZW)(x*r3igyw)r@?M^+eiTm8*0i$-(<&>v8jA(YSKAhFHr;_HPo} z?uE7`U%d4467)BC3w1}i1xQ9HRL$h^QV2Q{?k7SB#O3%LxN5ULMuv`AV<*|GdUg=i z0|4v}+*eF($Z1G`S~^=PW0x^k%J{>Q5zdFW9WwYYYAZ;27S8%r0t9qXAf-B=#L&V>1=f(#|8z#GM!*O*z+HF%QUDnVp!X9l+1pZQK|j1wt8ip)_vH?ykoTLs2kp zP9b^*8DmB!l;ZH|gN(S9U>@l-FaXQarbL*+aj*wLpH5&C(=BLE6VMj)WWv^;lS4AN zcakIYI9$Mx4#g!lLLba3l?z4!$yT-K$&^cDSerW$$1qFdU0FfDCKk@&xXX7xGr{=inUsA#;(+ez$~!5SOUsV~7y|Q517w`+xv> zF$PGkOf3tzD&uB8u|pNdjaMR7B*wta!ah-BfHxa`#dpRecps~$xt+ShsbLSo?mf88cwHZU^T6~7{Wj>bQ#C@9 zDpN;mZ3}NAsa~c#-1%@O+agQw^!zo!(?UG0zQ#Lw$CsKH!UBcd3s9w{!7RI6p4KAQ za=Zo*tCQZ3cXZTkM}66MX#8ESI-F2;y~;$rm;ch@P5R5!>e9;%D2|uji+`Ed$m-rh zMcv;j77e55URkFW@TCG$c zqq=pa1`gQHC(u_^5+mbC+H4AZgW2+!okSiC2N0&T4~r6{eJ0{g<_^pKV+i_aI#-F; zeC4YoWJMd{j)3TVl|CA+0V_jP9==GO`=iQk)uCTo!O%kJSO^_;qNXrK?=vJW&(Km* zsN8BP5hqoyrAWUuyp!S{7_3s>;@9fHrQswPa#Vsg3A}U@f!}#L%_o#lqD!4SZ>fj za#*TdZg_>48O~kWSF;j%*am#)YbRaQwbInJdLM-j`5uBQh!)eNV#rDv7a~{4sdDG4 z4)h@7#%JMnS}sG5#eRHVr3H>sI$c($E~^YRXt4_VA3HUM}MdUawbRsWYq&Ipb(cMsX`a%tQK5_ z%}I<%B;IHvh9BTJs&M_%%}f-_QeHX`V}ZK-PywHmk>mzV5S7_DT zq_C)f^-U7^pxvg99EOc{QJ6Fd%{w9UoW@G#qj^)SJ+t7JIiMaYkBp%qea*MR>I9WG z07?`DE+2)a|9C{@k|dqz-4+B09N0G}<~i1Dp(6xX0mpJcF`>?8uP6kQ8_ZErb(o5o z>!WJSehaSd3b}h?T#zE%)qGe&p0N$M?|yJixE;G?^0XLnC&omN6dG& ztAo{a^U!uRqYp+6k+dTpN90NyQO129Pf0W8HFa`hMRuH1kzESX+^pxSJh-rB|4v7~ z!gRf+S_f2cPA#UxDi((PN2Pp0h8CaKlD~iYIo;rbPAoLl9Td{jY*0LDg3YxK!)h(`E%#a?J}*u zSH0CtGxqnY10eh1@6}!^ZnphiIn#o6urR``B)mhp+BON%4YHQ|!7GZ!pQyV;6f495 zMcu^&58B|^VMEQ%Bsi8RdZTc&kleR^dPiQ3z8K9rBux-Z&Ad0%@`kboLAGpzV0hV; zX8$+gD41!^ep8*&!Z`rceOqsoj6Y9NYHL~AN|}|vzNyBkv(4duPzx&)%#UG%e?SH| zNBp~TOyn)~byZh!(k{l<3;096IEP`jJ z+XX?ka6B|BneB+X-3qIW#eld@9#2y_@=y=5mZ`s z0_nDp2W-L%gRxnRBjFD%R&AlLBN>wE@wk9CNKlY;Ft4&lLL~+oqRnOqp?<$G>=5T)ILMH;a6OXYy0&QpR|3A{QfG$zl$IEg=++{@|5+?|%J{&#m4r%P3+E@_FZ{2wkJ_0(0ghS_&MJ4?%b;j(5^`vg?>)cG^di?Ac72 zij;jECREwHO9CQ}^Wl||XG}(Oe zmg-l4#YNZw2n70MYr=9&$hs6M4X_2H;VaG&mOad?4^-&5U8SADDs=!f%7vUOvK-+? z!D7{zpJshpX}Nyj>y`zS5G+9nyI!Y5L8HtCDNL5=4`hip363j&_8Z&OZFYrzA1hRa z+WZ%4Ib4STF#9qUwM6$1orVi+MgBtN;xAvQBMYUK+RB-E1Q`g3;!+*e7H&rR0@dNK z(bB5La%}_0DO;{wx>&A$n*s~>b}rYHELV_6M|WSYg`o`Hh5{^zzr0B4p>)zt>{I%P zua*5b42y>`EQyBmBV_=}vTB#7V(#z^Al)(Vb?jDH$p!0d+?kiuCWCre`-USO>|(bB6HjWs~n0LY`!5lp6A05)@lcLGWy^hn(8 z&xMLr02H9Lf_GK8Ys3|}hhJEVpU_2G7Z5lA4A$q-+qSOvK78us9|i>O6Tvfq8z~Q` z))EUKAYljmYu0mo;LR!mZvhD~x=1crgr43BdI9j-r{&3707I;`JRB4p8bBw+4}c6- zAb|%7LD0#j5&y}rDsTlfgN)KEf#V#!z>HI&FH*lSR`^IKC+he(0zWze19|73u~iSy6ld@zeH! z7NLM%9ctl4GD*}x{rPYiX(S4k#;!*ZzH|W5qgZFs^iqGH5dL>9i_8Bzf9?dLYPudr-szyWf%4K#$QxffU}4w>mm`F zhnqU8Uu80+!x8M|iN?sADP1zI3z=jclkrC^JQu_GqREea;JGyIXhSVaTXBtKuf=V%?ovWwGnGgO_TzUm&>U0T zzqm?}w$Y{ykTh^h{fMHH{pCYh#TEtAolH%Ci&Nl*1MGZ@)`giMeURA?r6ov*hB(A4 z9?(|}D_EAa3m{EG!~X;z{S6o$0$R`mNMv*bl1Qdl{kaOvAq-Vv%>O3vQwDr+=F0h~ zY3--#RMd>=r<`#~CXGm9>hdYFO|HM(KqM37Nz6IC9Z1&nB?{m* zAP5?wp-(^14{<#e=COY2lAN$fEkc^g9sz=~RDlKq(P<*3MC(1UXKg|J+jTk6Tc0mk z5#dmZ2*?h_2y;QiO^n4I)EHnV>f(+cD8+%g;ij!Q@X zeYYj-kfOvWsFke`u;e;G7#Uy{rsX*X(6L{RGFSD7jv6-W`>Wc0t*E^Kj6xK@IAdSrz!kvz|6LC)6Ip@Qn2fgSz5W)5Zga4zSU(pUz$`(Me1RHH-)$ zq{n;Dt2;I>5eYP-_jLwiA?Zk9>QU_V$L}^gb~ciw4Vx$fNVaA5c>+zs`yMA4<2owB}mv52C6;> zv!$KO15_<~ANFrHUSeU}YyqSh{1Zs1Acf||fvUBJ-C^($QA8Gc%s{5k7X%k%>d|#r zILavWXW#X`H_aV)TnKZv;LT1kp#xoqfccpus}Rfy z7~9_>?04KaiM)eY{qVNG2V+4SFcDhlkRqsNx9vN6;h*Cfc%iTF3 znRm$6SnWkx77J(@IKE(trDaIAv<#FI$)IHwmX?v^m53S06pV1BX(G#Nw}6-kp?Q!2 zp(Dxdlfu2;5Fvv$8+Ic+sV($#u3pGr_>5Q2dapMH4hC6eRbpxCTV)6 zKzHdv#5J>{NK^TOvXqEoyLJf#m1Q@Y^#UQe;2G=%-dQtJ zFdP_*+QMCuvC+0u?=JxYh^k$X6S>;LLik2@xSb>(WI1S0s7FDMbTeb&O@-?Q;T#fO zm<3V`1u2Rp097NXEHc2DNh)h;6D~ptf&q`o2-D$+=}MLQM5FfWD+!6@r0B(lP;oub zLV}clM!~0B;z16?H0&M&K;YA4tRW<0(#SeoAT`rEph@`j=y~8zS<&~9b3_2-&w+7) zCYS$eAQQ$U(YpXh+4y~k1O%cdKp17j34$Qbs7|{Md`VnpVJ9Hl9_j|h!n-S ztH4u%u4`HI_!T@3@J7STG74{@yE(p{fuv!V*=*PJD3bfICHK-^88H!we7?$uEw;`9 z0_0S<-NfqkZUvy#ToFicGsogF;!AzzkdOof15$8cOrSjb27e@x-IY?o94aK3mFxTS zJ4744RE`CK=4{7oYj`f}E1jG}Z6|Fe+sDu761(loE_7`KT&g1IqyF1m3Sbs-8%2st zs=&08ZTAatDTGRh8rzLa`36Y=8YeqoTXUfbP&3KWB#Cl8q;81lf4^?>_p`7Hv`iKT z$0Suh@nQnkbCsgoM^2-!i_uprO+rk_$4KV61CSMvvGhU^#TeUb4&rzqmW0bN^u)K5vjs)ba3UoU zWGc*Iu4X-3R)7ukfE!D?!i=O1$D??ChkM6mAoS}|o=t+%qg1^m^b)p#crZoqmKD~s z+jOIqPYDrv=X`NdS#zP=TqIVuX$682WMS*|wsr7bYdAu52uUzD8o?PqLeIt>5*TwM zVJjoB=H(teB$i`{8irP0E=&qnZh-yW;~nD zGD=I-$SmXEG~?eG)!8fqXw64${2Qd{ApR{uAG?izLt0BdmCxAtw~V=R2yirNYjj}M zV-y+kIK_~!7(=CylFNbJrzBnsk{!gw6ocC+xo~krvm*$rNiYQW8k>p335p_<^BHtE z$bdkvQVw)Z7FjfVpravBj`s_?V({K&5%OHF%V@TR75OEgf)5QHlY)&$#IT_Mr6{-< zl|kfb$W@2io$4U=ErweOTf;aCdTa(EVsNNgIDo4L^^`*20ytEorwn}qnP%)@g0K(} z?E(%73V@#r2MB;x!4N?Bqrz?s%0dWYV>=XZ+{YO?m$$lEQfz|n_>4o+8c=i)vsLXe^DUuc8L=kFbqoT)WLB638NF|h9UhA_)-C4UG&ZL)-os-X zduN!75iT5E0Du#`XGU99c%QNwz3a5+N-%iVcbhLjBWW zwo!l|0ikF>;+D{uwh+AVqPmIk!}c7n0A%hBKsld!FgwR?H`AiI;@FYNDz>7kG=XMt zg*$mfd}879X=tbkJ>+sH9VkekT9Ab{mAI9J5Hrb6a=&B}HlNU7QYzd*GRVgSs8zNu z1e>9WP!)9^c&PUeHQ@p>=SaD5qAfHSb^duduxF?=%Mi3$D;L$$Nniyf5N?E32$}yZ zLS7`>gf6V&Uzn0FFH&+?b>U(}$pq~Fb8*v(dr)%PV1>NncL!Jx2)U)z4v0886hJLO zIm*jD(2H@Q$5%$N2O<`uiGww`k(o3+W4c3FF~~5{XLryDIjmj35W|Wsonkl^ObZ~V zr~`#9SK|WeN!@*pM%J@ERL-_0B4w@&mJAh>P#Wwc88-AB)6HH7rV<$J%ItNhnbI&WRvNCfI96$1sl#Tpbjd_l=ff9NxdNhNs6W>o zVmm103=TB(3bz-ZhnAkOc6rP0vfo!A*XH@tW z5FA~Qr9`+A`HS)$q^t61LQ&>pJ*;`jGHV{tzlSxCDb|{&Y0WE;42fh?wB{iM7SP?m6E7|k!V2E>wfNm4*6YeaP}Q;x5mYOP3>(DTDqR$)Di57mu`4=o_M8OC-y zC0$BTB}}q|ju+)nv2oR-0;u_mNh1c}9x-OJF;EmxAOxzkKJE&NNFp2i5?lo}atQ<~ zCSb^6D&!U7n;`kFFmng1`WQ!m`f|ch~Nhicco|)JGq9I??M6l2lOxKZ114~8ut8I zg`Y(dKGQdpE4Lvo_m@)1hDZq+u;LF)h*p0QX&R)qy<|ufF=AuLw2xHvL#UubkQLh= zXm~gCAeOI3s?(0>=HWOTCNUc6$b9{X9T5+)?SnI#7qp{Pf;c;1BaI`? zSQ^ApEIQM+pE@wlBZsJgSnI!U55fWxyCLeoLz!#$Q^)H+-eTU}Pn`}=%ZdA|ehpHc zSTblUDOpaGxq5$f@Tt;GB8g`B6P(ncQideiu zu(;#|{rmBp9)7HK!S_yFW6;<>2hS_pEwU32f#_!VNR>N@W=wR6rqRGG4m`lDgYMGS zz<0E^66?djO1lOqhyXi?p78G-iVIBQ)D8A2t_3cO7}vt+ba6Yjc9)s;Bh|nHyeeRQ zf@UP1OK?x(UAAZ{vWH8wB~=!>1^sYKfBQA86kI^S4)`?j-Z}{>;RiPB;{|Q3jXqp5 z1js<(!jZ8A*e)U@xpQ%LtV5GPDCWVC^ROD1=#cnA^BE)+DUpSjg#^)sJ8#ewap4BENY*o**cira>%(RiS=kHAT-ZLrz~Z4-TRhkTzd3YZgJReyOp5WG z8lbvFEsOse(aaR&;Mt@98p{9Ig!_S|L@ks=))eEv$eMIbff!kLB^_7jPtlzZB1Ly4 zGWhPwq-B>$uv3tf0R{BRu3C|FKW`xU%3Tg6ZBZ*j)I#{VbtP&_w~o*-D8>R&IWNWs zu8)2ol0%VlyoD-UA23-Fvxp@Cwwz|rUcRr}d*-)$?2l!GT?bLI%3-Gh;}fCQU=y`+ z68?4whFUv{+c;p{!bSqVj>4bGQ^=Y?L`6H5P1~Q5lZTTr2nl+dR5i_&gG*>C!@(s| zAH!+z5}XO*&)pDzc)(m=Ht5FSKq)UP8z=aJd$!q^^0NM(ZFwycKH{xms=Hm$rJF@f zX6`iAYk)|4*mZ(H4$E{Ty55)n`kUP8s@A1Y0(bHM41i=)J4eAy?L7y19RXxFwM&-& zEP#mRu?ld}zZXV>EsQiJQ%nRk0dc8Q)`L?xbhg>-7^td_ zn`6nAh8q;b&RQ;{S?!A)(jFki_Iw&8y7==+Fs+^|H&%X}Yk zZ2z#n4`ib20~hQ1h*RhgEacK*KI{63W6(v{hqQ?G8i#4DI$lBtX|;O#v5(0Pzb`l`u$~lq>?4IgEhp|gFM%O5?usEZ==@yN zfm$#t6c}Wx@Vmnr_sTmjc1+uOv16jUWp+%d!M9^_GA!;|JEmZim}htS0%A;1I+drE z&BwE3EPu1MY@n(=Eb9oZj@VM1d{1gWn2ohM<)w zFotSpGlGIH)2>EHDBg(w35VIj{Wl}0bUXi;p3B!jGm*0!D#U-I7#9jN7u+zKz7RPa zqQITuxP>nZW#|inxf5fd|ALlJoE5+$0r0MYHk}$d7D0(Whn_mRccea;TcScXQrUgk zM=&4y61ZauJS*2n7fL;woKO0PgGb#0NlhvXe~c8eJ~0%c7MH?_4oLOgSE!0RnXp|P z$N-@kmt#25L9;;>8MezE@7=19RN2QoG1tphQ6p6xlgrqRjy>y<{&RPit>-}I9`BFJ z4bgidd*}nuiTexF07zAP?>^W#0->Flpb7-I#>j{>MUaadC@4l361D^j$O&h&^)l59 zo><=R0-i|=MLWX+M@2y;$Qr;v`i{QrqVFlfEJk$0&L?*>on;XmGf`V!2{wcmokk@H z{H@7=a}O(seoU$Qc~%{RAFd`-2R5wJy~~@hEqumY6*z^vnyehKGFrq|#WgWB6e7}w zQuHiVjYfph+%Cr5r|W`8uv0u@fPJV?h$pTO*+I1AjbhKhH`u9(;CUE7)nDYs@e?7m zh!D$BG6t-mFI-EvO6VhuiW9G_S=4NMbPQjXT4ejuoiYgo8XY>3hW<;mVnKTx2JXs^ z!vHuY=aQHQdm2VCDtj7+G?Dc88_T&EE-HfeWfa9_!6Azfg-G@U!eY8zZKnZ;@iZBs z(U?a&bFxtR4A(&h!n!T(&$(Y%*4b$}S!a{scNe5e!NDi_IY2oqBPy0_InF_Pm_Z~0 zfsT#Cqnsq&6tqUuM`4G9bM^3A3ds>0Qi$R^GSC~qnL=O{yNWIMVc?&f#vA2{5r-lR zCi7riPz^AZ+u%kqT$@7}NqP%kC{F}LhzonFus@!-BGFFVc@M!*+6LigKdS5|H0-FS z|0fCLx2AI()DV$_8VFh**ueg9eN=JKb-186SzOSYG%n~(0vGfq;#A>0AJol-S}_J^ zl{k9lObGJ!s1o)Ba!VCCyL5!68+OEsFSb7f)qDPFfp9Ou&4rHPW(epeF3kW9F7&VB z;vmWrmqyGoITd~iI3#JFWU0?{zEHTD_KiARFwQJ4fO8rbSUVE9NVjqPj^FEQf(!4Age4nUaBp`syV;q5X0^z>`fFtj2(F_jbT=Em@Mp%vf7T))`47Lq~bfKfPh|7 z^3lgz$w$JXvotx0OyF1GOGMy0Ho-D|$g9W&A&iM(tbd3pA{@_#2zC3dAY{AaJp~o` zgwfV0Dpa_RM0Zn8KRz|eZJd#V;P8EEQ-?;;8rakmWabGXt!)DL4iiT4nKlk8Cn)Rm z|1#-MLgH={)&@^J69q(q#Ora7{IF3NzOlTN zLSZB(Lu@B-aJlqndg6ox1U(WJRPp@wIY;c zm_h$@0g$UW^Rjp0IlklW9iFJ|K;GhM4Lv-ASSLL^gS~d?88odK1*ai_f+jxG7s!ca zBoTh>*#$jHv^t;XJru(Q=Z}N|DxZL@Xe&-Q1*n7jh{B0X3=zhq-iJEcloA2Z30CkR zm`X(bbl<-jz{ukP$KxHsg5z!cD!y+*q6|!+H;r`wS?tE8G$EOwJm4q5O^hX$peSuq zxXYj$js-YXhGo9Zl3k}^7Kj9G0Hh#Yw9BTs+{7-Mwsu*ZCqla{-1CBjMJxk`7ST+6 zguobBm;eF7T}CpArr!Vut@+zJlXe=N;PEl+FtAX%Ag$5X3JM`z0Bx@=8egD%7l_gV zZz|rodRkmWU&n7T&Q|KJZ`0te>=Btcsqb|`p6p+Xl? zGveZKDk$aw)^LsbwSg;OJ1$UHGhee_p#?Fqkrt$k3U81X`DCkuxa(YxI~e+-!Y@7|yQwrL0j98!oLEF~BAs?-mO@<=pQJ84{sD@%f9zeSUQ^LW ze;8B7=mC1QUKaMM7xgmZuhvno_JyxkKeZCmk&#`4i0^W@ukg5L<= z7V|c~*r+$(>HPua-u^ybR&_u7efynW<4a?Em6c(Yl11IVY^M(RfscBj$Ty{jGv*1B2iJHc0scyZWwyl!*-yIv?kD z`Ixx2W3t>p(?fYtDPqF$V>~x5UqJy4rY;EJ^l0N3=f}y}Hu(md`n;s#969SW>}yjy zVT#pb9sdb7VVqIp7r^4mM;yOSEJ(zN+GcsO(tNB(@Ih?(TB&pO=ruyh=9(Wy^svH8 z1V+gV2x;?iPg_2IF-G^_5Q2eFASyOE9LKIgaYb^6AXa5@5MexTx6jfWR^67k5{ADZfvuFX8iXDA?)D}QK)r}V+dd2UMYhf8NlkEpv30poN*(rt{{ zb>bcFL*}EDZc+D{rnDZaK3wzFw7wM0t$87%wQ3A@=F-mM4szv`BW|ipxG&#pKCIMD zdi&j`f0dqH^U2+4yA8_<-#S=*5AGMQxwA^IRqA>(sans&Sx~>N*4N<>pz~_<4*efD ztvS0^x2d`f%cK|%5`yb%E@y4aP3EU{dhsyyF(xVi!&-cDg%Ca2%noTEo*cYi00*qf zF2Sc~%zM3bJ{@D&9=?%>l!zJM8;5WEekh*4MX3nr0VMJLRiuDYC3c~3vnfd80@O;Y z`dsa|z!eh{T?Z!sF@OMFkr+DIIDN7z7==vWJ|O>C9ITdDh2J4dZDNB>1Zp7>$ij?$ zC5;%oKm)<>C6%|L_)3d5NA=R9Dq{o*GDGamddke`t*@%?)RdXsVhPFpXsCC zZDbPIr@x~C#j@8aJYl3wA@BVyM`jk1W{_m^SYq#pm-!W;^^@??vAbTz2OK`*6DK?F z;wMgec>`bR>wk*E`^GE(g6y}vvL`(2Y&o$uy@sK{O-huINQ*EZ-GZ`@Oum3g^BWSA^qtG-g~d% zYb&c7UT;^0HRMd_EW;@JkkHv7?aOr1pF$NMgURDX5htC&4|0%j6tRH*E=@mfORL zVzb6suwfu|7S1O?>g?Q}d}5?=5ytg!%OTCl)&>wp|DrrE8oz{!HSa`a+pUF)pMn}O zAF{6&-=!FV*&=uVjsP@;a@fG~#aVZ6yd9u%@BsT8tr-M|l?~AgO!y$~W1=w(91AO- z#`56s>VdcgS7T~l++rUvZ<}zt(%zz40yvlBwK-Q9j8{OVTrHoQ^1J2GIU1o9BqJU+ zS&g+_&ErU`&}~ImNj0Z0_*6k1Ue{62t%7?3(5bUKE+UvU-Y4@=qsMYKdD=CMM-`(l zgY|bg5J67ctt(*lqwJpLlgxVufz??Q7Q+@Qs)LwT8H30Wjl}`M3a4&ZsMi4@L=CyA z4)mZ;aLNGlV(ugyx2}a-IQ=tlaT*$rzy&#t&_Y{5Ha`hI1|uwtUt^n&FFa95^g8cQi8N)Ha4a5xJ~E*w+@ zHQ~cXSvw}M8;l9X9sxtaXwBH&^>Cg9y1QizSBYzob3id3Fgog(jYrNjf#_;Lmv@2a9NT0 zLAI2X6=f;dNrs%32XRm_*-97V^!d|4RSDs{I8O2yQJV-7eK2kT3${YqLccd?-bgNL zx*z!I1o=LJ5M59%P!^F$eTY|xB3U*`veQE(*J2JVDrjcGoHzv`h_TWvk(gQ};Cxx8 z1sDP+V#OH|0UXbEH2G$E%kj)t`4*mmBJ@^(T490evkP(`Spsl^+8PIPlK-D4uk~DK z|8J4kZbRxpUSIpajl9+m`EMn!_YC=8^7?-{c@-hel2-;e`Q&x@eH&u+yGeforJrn$HiiwNKp?D2U&IPF zsyx2Gj#_ONh;(Inu;-ghGGT_#R<#BHL;CzNi zjRR~`xn>lq=U{=Z7@n1+v5SO~bO?KgLL%IUf&&p05(sWs@G0EFF70<3oIj|;7pHN0 zC8h!D2kNRW>8q5(p*#7nd@y!{G%T%ll6_b=kB%G-0Y!@e5c2g)WB_plZXu9QV#b3P zMb3be25Zs=7rF|RR-VggMP)*5DWD_3pm?c8ML_;_BB{atHbUbA;6U$C4%32~LQmn% zTDg~cxbypAY%WH}HbNz(k5cceOUO>FYew_Akc@X<7~N$ZFo~m+_FE7Q;Vl71e$QUOK;T#HUV9OQkaDA*ffn7pB zP_Y>PWtE^mvU)5LpuS{Vl@B}EjisUtSrGB?3$$musW|^UTMe+b*&(ckm!m@>(QCIP z(aYHoNQXr4%kMb)8AMw9)+ecUbl7QjxD?=>K-7z-#TUj5=q)1cidKfxmHgSkwSXDp zS#H>y%E?}a$;QDT3`s@k2+WkyR{&~un;wUBbpB9WsP~EP1}H30Hs%wK1VR+%KJF#~ zIn|7?@`e5+DV{D<=KTF8TX7&_F$<`J?A2R5O>tNv>humUx(&r-ku z#6STPV~th7TK<_50@uH_NbOnyE2>M~6fn`2{y_Vf9-HA?=28AxH_d zafM;ylEbz{O4!}IXm#&iA{cO2s1*#bWow_D@|M>&9tfTeT4QzmvQTg2Xvt^tIPioV z)_!45I6o}AG}%ZYd@QPVKtXQ7jQqfEc?1PR4LL;C@)0&7exxtKIe?WaQ3~(|Q4NbJ zE0WD~H(8f262P6r6`JEgMyTi!B%>QaRxoFq7h!~B_vImdV(y86J0l(TEvCclg$FQW z9E~XE9&B6{3m3YSR^GOBEo=xjTaVI`j2=koO20G&C6-QMG<17`(t)j`Yk`3bw+;NT z3`R$giD`@jhPBS6uQLg5qVljDr6?XnC_i}@_iCUhgQC>{j#$MkjKtPQHV}-s8*t*9 zT)YI96s6!Wsa7`|Sti4cN*W)A6?1$s!^VKgSEGJ!dpg_Z2c`Ffq9kK~->%>Qlo1$y zNkIK~&4Bkz@4EeE+aQ@bSt}&!bP2oD=$C!8oE0Pm`#1w5Qrv7fKo4&K-Jh>yco3L+ zzTV5UkJ2%C0LPAkPga{5qx2rQEE@&&PUdq1_#?+fqa7>ZJy1^u%vwSCQV{wC`hn5$ z1ZE=75keDSC@ybF{n6=@aZfHkAN++u$P(NJ%3zDh zHtC966Ai@r2T33WuP(buF$BBFt!WBHL7u~9EGrQOk3T{v2$$m68B@?%eI zZ%U>wHjx~IaBGG%LrBCf<>)~$5lS?ku(h;hYqqZh_W!7f5F-val-T_(hsymkITRVx z=a~qL8fP~SB?{+1$f4+gDy?BMs6jLl0u#D(DC)8H<3oWSJJeLP23{EXq=r=?bmMEXm&pdcCA0n5MJvgY_J?v|I_x40 zj3x^sy#~cbEzrB5PfWu`B@Ltvii4lo@?q2UCEdFaCSQ_oEP=k@2y7Ck9I^``4pSWm z3zI-JDzr)Z<7{~nu=4h)iY37n@fNCB*;`Otq@i|vJwR$t*jk~%Mw$nJYjREP)IHf) zlQgG1scWmyOoW@9Fw}HPUu0T`>wf+Hwjm54sE7j?qX>6ua_-aD8z>#5`=R*U)4BbQ8=pg zPi4f<#8;vhcb_txmnbvTV~!NbE-(gVK)uOZi>wp7j)IE10Ux%9DfZx$?qJ8!_&wmw zX9y=^o#6Sp#WspQu2iNEz@*a+yJ*WI%CVo1D4av6HD4{Sy{O@1BhyYJkhw{js=al6 zIFrtpJ@(dn6eKYnXwX3!d^Ls`&vE&-7MW%0nAm>d&m@^7W--v9A@`KCdB`Q@Y#tqw zuRB`RS+>^llNRQMy>&|iRKbOo-D44#XEV?2t@kqVeRRv95Tn&2zB26hhP?#O&d}Ec zlrvx1NADR2M~0FeGjsRRjVfer+6VDXHrN--DVXCESQJXDED%Jih5V|LoD)0vZt_AH z%vgX^k{4_RvVKtk`X+th3L~umTq!TuZ;cg1V2Dsfvnnn2xZ_qdVC?u|hpoIIpQHly zw#7tVu%$#^u%+la=QN0Rj_&&Mf_$kgW#t7aLwSM1NyKTv3HY6e#M@Wb;dBQP3gjeT zc<%z?AyTd-uQUhjt9S2Do)0+#6D}RZ&S1ui;2HAAGIQ&``bz~y$e^>7enj`h*rEHD zixmjygD(B~Vg&$;xDw$e;cjvTrdf1nkt>4l1d;iPToG}{Bkar9jAerW;*rY|Aja6w zE(QA`AmvEZwk^W-1HWULT#>!Q;3KL{pDkHPymM0sgyet3`3Nc+NEVigiu1AIzf-a( zYO38N3sF@6LCFFl#I7U@@INbA)DXpe-8T;1H(reI!1>?pPCWRCJ@5Dldv1jmeV9iE z;0_@lc(V^yHMeMU16FIklEMb;x#0Au&=32_)WEg@Nh9I&bELPFM|_}SbVcL;gqUw5 z?T8i1g}6nvl7dE@vMy_8jgdX=)A#7C?6*2l+_1SMp zS|IHdHM%le#{qQt%)UTb#1@1y85fm04S6JxNYEBkYl)b#5=l@Cn3}DIks{K(eA6W^ znsOy13cU5>Nc^{~UpQKCUJ+fv=K?flwohSYr>c`d)ny&*1f3{V-y;Xa3fn{Mk#1pN^t$RC0c^kNZ=pzJNEs;$1>uRcrQ*{V})CxwU+IjbRM%(9~nS>f{J{*J|rr^2Gmy#2ZM+&tmlvn zbRhrLE~YtCQ50XwClulf45i#WDrYrNez}pVKjLTT!s!kv0E*B?Xi)&6V2&j@08J6{ z7A)8ljG0Z8HxY<0v~tA1;`g>2I>7?evki$y5>P`VDn}r}AJSoNIEkC_N9j5oOwlD+ zQmj;hpLlGm#h&u1g%PO7ocbLXgao+{W*`Y`G=LXaB(Sf$rlieqh1y40BoP0|UEnx8 zBQQybJ{sqzwgNN1Y}m9dlflM?{~`ZsG4sRgK>b_n9Djc;Fn$Krh#D{C2CMHM?+|qr zZS7KuxQiM0W{Sk)vrqu)X;$S4$Y1*3l{kC1hcP8UvBgb_Wob z5$(=}16c~HTAGwQPPVHNV9bFnYy^)N9;dh}hO`2j)d*b#dL+gG%R-oXyZusUxXl4bD(ofbT)Y{JfF3a) zZ5XU3AcU;L?-a$^6fAoh2HBK@yK9DLP|ntkuengMIiPwOU~g1KCp86|e$^V;21G!snzlszVq_S*jfRnt9m8OlcGMUI!_->&%T~mKkd0wq;yF&(u^6Xg zbQk**DH<~!!8ZPmMasrVd7~@^-c6)zElVNzK4W_#hAA88SO+={1(eW~U32(F<;8|p zLU`}Cy^#9@arg_2vQci!{Q$cHxh?l?ZfV3O#yqQe8ymg1dtIUIJ4{`UDni-y3R=2s z`NQuA#d8j1Ph{b39CWbRuW=KvD3d*u)|D@^i*hcv3Sw7daT6tWj~tqE1_MoZ6JZ(P zJv4ysR%{y<7#D~5yv8XZ77zg(Hc6&(IBbv<0J&JKOHztqQL?*}rsK67^J={G4-LcC zU}qrlA3G6o+t=Q%#BGzkUBUJpd;h$EyNJ&+p(q%94-<{#U=T+O&Ysw^&g*~?`V&CR z=|4j6;B}9-@O!-CGstiA+HZt@gI7#jE50IvTb>r+&d2oFCUHtY!F~Rk;1S0IxT}j# z*d&btw}dgTHaB)i6a6t7Ua%=!HfVw>%wO5XA#!)UY^H=O0MjT>Yf)wA-CfxD5UNgw z90hC`PYo&RE)Fv{qW?-@T_8!IL`6W`ZL~ndAcbRD4n0)1(V`dKa1cvz7dQyav^dBE z7qGlI*-Kd|jsslJ z39k3TU0-wcH&nhFmcnWIUUKZnKx&SC&7{dXM`F{AOt>^j3GO7uTRh_kSh?C0qGV=s zS=hmGTBr>H11-K%Ym}wpn9pEBQ4tSB&qZuDC6Qv-Da+FgFc17L1y6iW0{Z935eHH1 z%YzLOMLS?QhrSDQCiG`{=PEgH6(Nl7#syf@I(rpcBmJcf<+JN7Rk=Sk=Z4B0_ zN|$GPFz&QG3!fAC*qHhBbh!SQ)6X%@O&o@vD!~r_W~Bv!pl6-f|3+?!;Z(Awe5K$uAesH1 z9HGO5tWn6Gp(ds=)WK8NBpx|M7A&c7U~_LDzDNWr#?>uGvbs{5lahnN{i=|O#_+e%AYt^%io{}Q=uJs^aH5hq!2(7gv(fS3dv z4#FU==DpWEgyrdRZTb@l7?ZvK$hFgZE6IS?yZ2vJ=n5gg4Y^2E4`JOqw0tg=JOIO% zM#`)I1ZUvz=wKX!@q3k1=n+^6WjW~)Xk_+!ut9qLnZOrT9&vF732}$S8p&H!E`)^< zGJlDvVTCfXE&LxDgKU0j$bH!x$Y0-CK-V&EANUHFM- z*ihdv6Hiy`^<%fK8F+@8G5~viZ@EhKOT*0xQG%g3PGZeH3)R2rUA-}QbKRPWi}4vM z{lu;2+;wX9fItF@xt}0LBM^Y(P$CFGCjF3F)F47laP$&GpXB%;cf;Lg)kCT)HUCCR zO|zVkyTn}dQ#D1eyT>hw&(st8rA6lIpR4`U@6D4xS5w-2V8^&M#s@a#?Q&qp+=nU3 zbpy7!_(HvI4&i3Eo*Ak2NlOutC~aO6g$x%|NkEc)0qEAhF{Go3$3$H7nt@^`{V zK&C`sINxkCUn}T?Vyk(-+T2*s6Vy8MZb5%D^$3#WBQx$gGjXmStGdjJx%$Xd7t=|J z-3{iGx!S0WX30F9u5_tcN(jywA0#rj_LfSL1M{iJ?Cc_+R*&RjcR_eZ`}^FinC zGk=(`PyTXn{t^A>_$oXVHxLORv#Y=o?viLTI$j`M@MZBU@;1M@>=GP#bgvn3sT{#{ z{H5s7efZQzof^sOrb;zv%^xq-^$K0_wmxwZ61{_-Y&B*9IwC#T&AhZg58QppkATY= z_f}pYY?Q%W5c_Xv;aX(;Y z?l<4g=cj@v$O)40!H>-P%XPC_YyNP#-d8O)&i8Z&;C;pSAc%kRpy_pmUei106?MmHSEik8FsSnr7JIzs7>AlU{ zNYh>ZL)#*~r+&NBOkSiX=*18CITkU8|Il_79yZIvNjRMAzN_?9wUU=Fo3AZK?T?t# z7o+wqKQupHtPe}=_+ik6btZGQo_^ZgRe)rbdlfH`Pzdv-xX=DcPLII;A22Z<5v<&m z%#!VvbFH6~`{K%SZeY#|_gP-BBU274FaE;_x&{ccWRl zM4yzJ`xByO8flx1x>oO=T3VK{HxpKuB}`$$=CTCCgdJrGk27H{`V>_9F%tBqe>KBz z)T7O}uhYZy)-}dlr>Cp==DO>!U`87p?AB$@H+nz4WvzM8=r;y_(uMxY7-djbuE(Q{ zQ3iFpS+^8}TEo-|cfDLJo@_L4EY-_0oBxc7*+dyxxeuDFuh*CFoRl|*-Jr*(KY2Ll z>Xvn8>9u;d^fI(AE_UhH*VBU?N2s!;T)AvuGamre^>3@ zny5E>FVmCs$D7Qx%k<3tALCWW@DR>%8~v#|8X^x|(bRGf0D~+|H|asldYFGb!@qj| zb*+DW*}v+W^)H$K*_&~w9(TXp|jvD3ERnA?Y; zD)#s&#O$EDV{g@Wm$La_bP(KN{K^5SbzB{S~wHQpWE<%9Mf{yqdBT({xc)B}7tCB+RNiSVbe z8!pa_8GNTLG1k9M^{-d>*L&}TB+<3z$vbt8X3ekOrSH_wZ!-&ipikJnYa15^;|(r_ zmfDExLP@Dd)C6N8$hB+S4QrBj>zfqV;hp#B1NZMN_P+vPlqU|)h34gM;=5<~M0t8^ z@kzUwf!EA{dv))Ixv%?qu$062f)iqR+z9>_nogbQb+RjX zZEjtr>(@MZuO6U4Yc}7fuhMV))J(ZwPu2?`Hn()@p=QVZ*cr6K^zGDR(p^FoxUn5H zU|OgClHMx0zL|aN{}lJ_aamT`zwfgbC|7wARIc)Zf+*hbhIf1vOT3qvQ`(3LPIv*q zTc$IBY3az6spBHUvN@iHDReNgm-2>&MrETV&5)UwhDj|f?Puk0vhjS^b9uQ`r{DSO z@cC@kUVE**_TFo+ec#W1kD}9Y;)Pc%Z_xQ3<>0-lr`mW7Z_0-F5%ys4xwNJ;&)Tb^ zL(U1a`5dgV+|%^uxp=RN^{G4tLK|l-@863@JO9of?Nv#xx;IhOFXgSWQMfzPRkono zU@eK8#G!HC`t6(C^;MOw8g6p#t7^?O>E8@rYA^T-qx=#&m-v~)q z*f`{I&0RI{7xHKO@Kj{IyF;b=jW*GoV@dJMIhMTUo+xuHWI!fSKnKhpZGPV?I}$w+ zU{1V#6lWLL?#Dx;_596#l?pKMH5Ko)XM1XtHM3iANJa44*Hl*6&&}UhbE_E71E*HB z-fk7uI_y_&H7=~;Z81e3l+d0e8grEru5zpB)-g^TSKZjJN=3FN^siE}t-~I!QmHX^ z{>9Q{wrZ?g(LBZa9eNp8SE*r8`Ryvz6)KN?UG)c;{<=y?zx__Nqr1bA;=pPGvnu^& za~#dNu{qx0LBwqBMA2d~Mdq5<)lzlt9nL$b9^=Y4R2NHii7+p_)-DjeDI zJ)q){kDdoqlxM!JS6dTqT#EPdBw?v{;Q{p^BD{4#C5)_n7dzn&<0sbSH3z*Kc=Li( zHOEnqispD3CmmF2+D=}4P?i0BKKmXr@;UwxraEN|n}}@6=h>!wYOVA6@*%ZRYY^cX zyzQ_`{rMEG9af!M*XXcgKQ@UGM}BNrn~tdg{M-@sK-jL6rghnhww55}98j(1gxd9_ zu+gJz123xnv3b2*t^U`~$vVhcM^)A@EOtixTw}4@>C>cX@;E6rR(S`1 za_mVJb;k>#2j(y}!lE7}R(c|{HKvDiVIzy84Eqn_B~J zDw{hIZ84Cy)f=lg`z91s$WPx?YucCWff}sWsZWc)oV$FZ9tyOEXlw#1=TY|`zEOv? zUueSveyI)X)?ls4E~Y(Nzxo}<)FQs{ozaZ`{hj)iXW+EQZ22j9^uxP&{w)>d$wVt^ z-6{7Aw^WXTHMaX+EfK3+b6W+ez%#~OVcApDoM*NKj~UNb{-d61UyX@F9|!i}d}Vo0 zdc!eZe@7*E^n`oMqSFiE(24h!pf1yVYh=t$bHM3u;XTM z#k9F91#i10H9g6n9GdxUt3itP^3ty!b3fIVe6==}t|$Xa($qY%jk9#*12U)I>>1t ztsNa@7id~LBY_p|j0B!<_oD1qN!mkCu`FRl#3E7DRRkrmjJogjrTUE?NB)^0;85x)%h~Xt3-FrtSds z!4#EJec9%eO@q@O48Q%YU-V#jZdku=V{s0>ij&$?9=0NPw5OR}Zykc+2H*%ATR&?L z!@m{(%$@mjvMba}zjBD9LMWpB`VT>n%@e%@KD`HagU5x?aDFj_61DgFoe&zR6>bZq zP`j5T>4&UdG9i>!XvOa5LoqY)jL0au%xHIapq#LZGv++QTin>U+P5j@wR+$7>xm#9!6gkoI@T5sYE?azEx5Be=Iayez6dP z+TTrTQ~-W`Q|bFGG*YgvD*bO38Y7RsDgBy-Cdfx^O5gGiGj5_h5~lP67Mdd86e;~{ z6D`oY$p=76f41J_9&CQO_Pz(jC0wO%_{gO8Ha1*!w}ploo2dFJ3k@|bbR2!~J+)d4KbJ_MCVhr~nIR1~6Z8^p-<^7+4eQ-$T#!BB>xH-{ z2@5RgPTSDw_UVCExQFlWK@Z}WEB5xFo|2N@n+BL5jFWmA30gtm=){{^1fB0meVgK> z^=gj2+yZmGMT0#=$&M`4%M~f48ZVtlF#<10o;g_i-4O=#0%W+85PA>2GHH=;uTIFNWHpwH0tA78EfdjNWMJr zEReyxZXnGJ*!8)c5JDOUQg79Gm7@mHJs}k~MK&3_qTawzIEW&JVaFiK5Qyu1p&XJz z!?002C56&M&RrF80WRamqkI5vT;W$zFh*4IsT7*0E^gzL!MJ9&jPus0S=w@(jZH$? z&J3X`;Waql!$F*U!GVh&UOMIJbaxGAkR?7c1oCdV164om2HG*CYF5P0X zVohqSbE^2l2!<&fx93`&PwrlA^KYPNL1LlZT!_pn(;qZ&B$NYN;gkA@g@i| zXJ`eb`;k(f9YvATEoR&=m9tR6nri^4ade8kFk{~ZQ|>nuWEuJ~6ztKTbaZtl|0JHJ zQxwPRXkfKGU8f}M_Z8`s>~B>mzR@e?Lpr5*korLio|yPFxo#Urj;8Ro=Rne-pkbpa z`ll*k&1m{FRNG?==5nRHd<;GztmJNK)U#uy)R<^mhBZUuFw}C+PQ%oxlGml7=Q+sb zz&c6g2?L%-@^d+yd(|VlT8g}#PorG$OddvCSSDb!fnMnp zqw2TuGTYE|1ci&!)o3=p66TpFj_^PzluEkxxw^AJ|a+1bW8P5)CVmqx_W<>3+L^`fwt3GdPS}Qg%NSFp0Vt zHV>V6VZ%rg6@}=voHhw#W(_X^hrejtXtogg;v~E$DoQajCKC>{P`Ul*hs}P}1}HEv zU}#je{P`q`aY~q|9lw@iB*5X5X^gA6mLSG761l=c-pfO3dyn35$>H# zdJARzFxjw=s40|EU^LV_a*_ELlv)M#8rCnY)q+Ud5=5YfQY*+oiz3j&c3O}ciy~0i z3JeMLf}ONT0zG^e1*x+r0zGV31UY9>1bW!63({aw1bWzR3DRg$1nLDg-_7Qv!asr} zAyT~CLa~wcLXi-mtZj~L5=26TQrsLV5kx|Svb8y~^N$4}Nsy3Ag=8aTf=Gx^b~Q&T z1d$M-ls8AJ1d$M-R0~pRAp$*=T0st)lmf%!;X5s)8k1x|n@_J7%1MhN(8G37kUEPZ z(8G2`kaHGApoi_cAPxA3JE5k>!*@$ajrb=Nfd-!-g=iW2O^YJX!?s>1w=If558Ec8 zti?YOAkf2BB1mzLMJg7|=G!UAR*ND~7qUnw6QtBa1bWyi1leU#1bW!Yn^E}mc+Anz z)a&mxdca%v(tU%Pw{7{7nCyNb4*kreKyx1SlYLGPclk6-$g$}*W;%_++1uLb)D<(f zzf7m@b4xIvK^LIk!C%`vuTjn&#@ELBdNUk7j`(z`0hflejh6fv%eQ(M#b=$F09wJ= zDdU0nQ%u38Yt>MW%qMRdvr;E~=(Q^mY#fFmVU+2YrAZ>jD1f6DjKnSTgDZ}Z17#E& zY}mi?H}mh{GxyVK6ng3mn$y9aUSlVuO$uSbZrqDHF$1?(8?Nz<8T1f1r~HbBq%;`0 z_JUq9m6O9JxeM$+MZd+LUHQ%o2HQL0zjd869;P`>G0lCQQxDTpRre*2ol9fmO1=hTpne;9 z(NQsanczk852}``SkL8iX^4OEH)fHcVZJ_>)~Q>c^NLJNL)P+3nbd1UiJ?Cja2(7B z7vV73bHT!#&ONd-Rrdu1Ch0ZOM(dgd)R_VNVjhjx{+nlJ(XX+e`bHMb)(YJb^QeL_ zYkxPJ1_d^5Hs|TcV*O@rH=kC9m)$h$10U8Pzov1bBe;Hxcg`o)_H&OHD3YfwfGYR% zUlveOaML{_bnjR_eCz(#0$T0uf7+5HgdaIHIFzBS|%U4mh1YcSOjg+ujO`BB1H@tN< zO;q(a-JhLHP|c#T(t&2$p-j>h1aa134#YdZqf%mPHBR#ew>m3-G6x;dqb-Jmizo# z%M9>z3$B*1lpON8qV*8?sIt|uJkC@pw<1Gm##Wzq-%Jin3>x>x!-9li)W z1lU#>0lfjyG#vqOUT}TklKI9<*qV*u zcT*y-_!H@Td^ZKhhxnWFqX0z{ir|=CDP`z@hE<14<-2>2e}Qzz3b1L_t5C{2H;Yn>sGW|fRfxDi_bg2>F@{c1oQ)p z0F=`AgR?c!AN~QRCI%XsP*nl^#$PEeI5g1daDv(uP-2C$cLg@iM)5rr^yI)n2$4Uj zI^3Ib42By5cVG6RtR+k5ELsddh8Rye!{HxcrZdt=N87~D?4^{xZGxPJ!sjeroS(Zq z%L23KEL`YtG`5orI2<{-OI;Qr)19-Qik17(zfif>BQwO*`$E7VFfLh~m6Ms3@36y* z5iS~87{ZfZp^gRRz{M8!wvM-SPX5x_bLK70%3qkhD0`{RXUnYvzi9G;72lR`^R=e8 z#&cKXWaZD!<$u0H58XQ;)Xem73#I{z!P=Rc1UwMx@l8Qq=Pk@#Az2*EpB$i0(G$TUvd84+ zfVc!r+ml&GraSl`J+8I?Ji;`X8-SwQ?;`l6L$tdq<%4;e71~j#y@Ka5cKPLcXV( zI^l+Jwg7wuR&*2_>>GGDfN$3rv;KzirK1$%I~AztaVYy9qsZ__fwl)aIoGvh+1y85 zb8|DZM5SAK1jt%BKX44m)$&SU_yU0cb_Bb8UcCPprG|HPIpt=eV|vbl95eurvS9;n z(vgC5Ad7Ck0F-L^-h%$Irg?V)l(yR$Fa*%BxcscVW$0fr5hm?8+v3U3TCzAdXGxYF zUWjmMDswV3^Go2D{!6kxJ3G^{%ZwA@Sdg8QS!oe-7dRZ%@QaCMa#juP(+0T1k5eDz zQx*qV2dP$sdr@eW);Vuq%PiDyE`2b zmYkCm?^^|Y4){`7|9~F!6P<}rM^BD@kA}7H*~9605abzf(lyofaOb>7`4rvI%jtL+ z0Yz|9=QjRZ_=Dj>pZfS-?2YV$^a#KBK8!A`kJ-Ay`0e*`j530Ud_YfP z)^zj(nyU@w_%qZ$d~08)F(;@1@1uyi4o(JY%&pGQ0(GS?pFcwh!S^Mbo#z}t=~U-) zhdNA_*K&FtMfRvdsB~r?DsU*)k)E?0-ASfvF$@On*U^y7Pu0<51-C)Z13e$EJDiO} zBgTBf#%0nI*^Ise{_tk_KKPAZ%#v3DTx{Boe-?h34B7Za6QAY@xY~;0>sI*pt#B`t zs=2^G56)*lq~8@x?eBEtAkH>88Eb631pZOYaE8A*eS0hX`BwM~t?(y-$HUq3*TbJA z?Z6Hgg#gjqRKEIm+Bm&nfN5a=LhF^rvKY8jkPS0j=>0RA@Y|qEKW)=S?y`9RzoPgit*i5MmP`cQSfKs+%_qva9Uap1n(R0)-e!@_*sSX}u4unHzVg$4N8K6m&3=aH+ zW_B(G>H>NYP_#7^h|PL&C_nKD&C^o&+9&j10GG~FH?1%GUZBX}zK9@Nk3^v&0Q>U5 z3pB>Je7Gs+Fc)2*PQKTHN*)gLix()#=^SBpDG7jL6MX3ct=dvJ&l`(}CwTTnEHjVu z_KP$rcKk?lkeUuC5d-B=_n>Pr~Z5_#t(N(sI%)oECkWM6um``lM9(LV3su(3{K4KWpAiEv?Dewl`KSd3s{ i9RMfe=d5L`9E;tzFVnjeG8fw20QVByNw}|vIR6jlVve)` diff --git a/x/evm/client/cli/query.go b/x/evm/client/cli/query.go index 6209125b7..ad8806f81 100644 --- a/x/evm/client/cli/query.go +++ b/x/evm/client/cli/query.go @@ -43,6 +43,7 @@ func GetQueryCmd(_ string) *cobra.Command { cmd.AddCommand(CmdQueryERC20()) cmd.AddCommand(CmdQueryPayload()) cmd.AddCommand(CmdQueryPointer()) + cmd.AddCommand(CmdQueryPointerVersion()) return cmd } @@ -301,8 +302,9 @@ func CmdQueryPointer() *cobra.Command { return err } queryClient := types.NewQueryClient(clientCtx) + ctx := cmd.Context() - res, err := queryClient.Pointer(context.Background(), &types.QueryPointerRequest{ + res, err := queryClient.Pointer(ctx, &types.QueryPointerRequest{ PointerType: types.PointerType(types.PointerType_value[args[0]]), Pointee: args[1], }) if err != nil { @@ -317,3 +319,32 @@ func CmdQueryPointer() *cobra.Command { return cmd } + +func CmdQueryPointerVersion() *cobra.Command { + cmd := &cobra.Command{ + Use: "pointer-version [type]", + Short: "Query for the current pointer version and stored code ID (if applicable)", + Args: cobra.ExactArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + clientCtx, err := client.GetClientQueryContext(cmd) + if err != nil { + return err + } + + queryClient := types.NewQueryClient(clientCtx) + ctx := cmd.Context() + + req := types.QueryPointerVersionRequest{PointerType: types.PointerType(types.PointerType_value[args[0]])} + res, err := queryClient.PointerVersion(ctx, &req) + if err != nil { + return err + } + + return clientCtx.PrintProto(res) + }, + } + + flags.AddQueryFlagsToCmd(cmd) + + return cmd +} diff --git a/x/evm/keeper/evm.go b/x/evm/keeper/evm.go index 357746c42..23db1e18e 100644 --- a/x/evm/keeper/evm.go +++ b/x/evm/keeper/evm.go @@ -40,13 +40,16 @@ func (k *Keeper) HandleInternalEVMCall(ctx sdk.Context, req *types.MsgInternalEV } func (k *Keeper) HandleInternalEVMDelegateCall(ctx sdk.Context, req *types.MsgInternalEVMDelegateCall) (*sdk.Result, error) { - if !k.IsCWCodeHashWhitelistedForEVMDelegateCall(ctx, req.CodeHash) { - return nil, errors.New("code hash not authorized to make EVM delegate call") - } var to *common.Address if req.To != "" { addr := common.HexToAddress(req.To) to = &addr + } else { + return nil, errors.New("cannot use a CosmWasm contract to delegate-create an EVM contract") + } + addr, _, exists := k.GetPointerInfo(ctx, types.PointerReverseRegistryKey(common.BytesToAddress([]byte(req.FromContract)))) + if !exists || common.BytesToAddress(addr).Cmp(*to) != 0 { + return nil, errors.New("only pointer contract can make delegatecalls") } zeroInt := sdk.ZeroInt() senderAddr, err := sdk.AccAddressFromBech32(req.Sender) diff --git a/x/evm/keeper/grpc_query.go b/x/evm/keeper/grpc_query.go index 451e2998e..9fc3da36c 100644 --- a/x/evm/keeper/grpc_query.go +++ b/x/evm/keeper/grpc_query.go @@ -7,6 +7,11 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" "github.com/ethereum/go-ethereum/common" + "github.com/sei-protocol/sei-chain/x/evm/artifacts/cw20" + "github.com/sei-protocol/sei-chain/x/evm/artifacts/cw721" + "github.com/sei-protocol/sei-chain/x/evm/artifacts/erc20" + "github.com/sei-protocol/sei-chain/x/evm/artifacts/erc721" + "github.com/sei-protocol/sei-chain/x/evm/artifacts/native" "github.com/sei-protocol/sei-chain/x/evm/types" ) @@ -111,3 +116,33 @@ func (q Querier) Pointer(c context.Context, req *types.QueryPointerRequest) (*ty return nil, errors.ErrUnsupported } } + +func (q Querier) PointerVersion(c context.Context, req *types.QueryPointerVersionRequest) (*types.QueryPointerVersionResponse, error) { + ctx := sdk.UnwrapSDKContext(c) + switch req.PointerType { + case types.PointerType_NATIVE: + return &types.QueryPointerVersionResponse{ + Version: uint32(native.CurrentVersion), + }, nil + case types.PointerType_CW20: + return &types.QueryPointerVersionResponse{ + Version: uint32(cw20.CurrentVersion), + }, nil + case types.PointerType_CW721: + return &types.QueryPointerVersionResponse{ + Version: uint32(cw721.CurrentVersion), + }, nil + case types.PointerType_ERC20: + return &types.QueryPointerVersionResponse{ + Version: uint32(erc20.CurrentVersion), + CwCodeId: q.GetStoredPointerCodeID(ctx, types.PointerType_ERC20), + }, nil + case types.PointerType_ERC721: + return &types.QueryPointerVersionResponse{ + Version: uint32(erc721.CurrentVersion), + CwCodeId: q.GetStoredPointerCodeID(ctx, types.PointerType_ERC721), + }, nil + default: + return nil, errors.ErrUnsupported + } +} diff --git a/x/evm/keeper/msg_server.go b/x/evm/keeper/msg_server.go index f8f0f426a..234018cb3 100644 --- a/x/evm/keeper/msg_server.go +++ b/x/evm/keeper/msg_server.go @@ -2,7 +2,6 @@ package keeper import ( "context" - "encoding/binary" "encoding/json" "fmt" "math" @@ -10,7 +9,6 @@ import ( "runtime/debug" "github.com/armon/go-metrics" - "github.com/cosmos/cosmos-sdk/store/prefix" "github.com/cosmos/cosmos-sdk/telemetry" sdk "github.com/cosmos/cosmos-sdk/types" bankkeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper" @@ -24,7 +22,6 @@ import ( "github.com/sei-protocol/sei-chain/utils" "github.com/sei-protocol/sei-chain/x/evm/artifacts/erc20" "github.com/sei-protocol/sei-chain/x/evm/artifacts/erc721" - artifactsutils "github.com/sei-protocol/sei-chain/x/evm/artifacts/utils" "github.com/sei-protocol/sei-chain/x/evm/state" "github.com/sei-protocol/sei-chain/x/evm/types" ) @@ -289,19 +286,16 @@ func (server msgServer) RegisterPointer(goCtx context.Context, msg *types.MsgReg if exists && existingVersion >= currentVersion { return nil, fmt.Errorf("pointer %s already registered at version %d", existingPointer.String(), existingVersion) } - store := server.PrefixStore(ctx, types.PointerCWCodePrefix) payload := map[string]interface{}{} switch msg.PointerType { case types.PointerType_ERC20: - store = prefix.NewStore(store, types.PointerCW20ERC20Prefix) payload["erc20_address"] = msg.ErcAddress case types.PointerType_ERC721: - store = prefix.NewStore(store, types.PointerCW721ERC721Prefix) payload["erc721_address"] = msg.ErcAddress default: panic("unknown pointer type") } - codeID := binary.BigEndian.Uint64(store.Get(artifactsutils.GetVersionBz(currentVersion))) + codeID := server.GetStoredPointerCodeID(ctx, msg.PointerType) bz, err := json.Marshal(payload) if err != nil { return nil, err diff --git a/x/evm/keeper/params.go b/x/evm/keeper/params.go index 211e387d4..a70a52d86 100644 --- a/x/evm/keeper/params.go +++ b/x/evm/keeper/params.go @@ -46,7 +46,3 @@ func (k *Keeper) ChainID(ctx sdk.Context) *big.Int { return config.GetEVMChainID(ctx.ChainID()) } - -func (k *Keeper) WhitelistedCwCodeHashesForDelegateCall(ctx sdk.Context) [][]byte { - return k.GetParams(ctx).WhitelistedCwCodeHashesForDelegateCall -} diff --git a/x/evm/keeper/pointer.go b/x/evm/keeper/pointer.go index e9b2e1a07..58f175304 100644 --- a/x/evm/keeper/pointer.go +++ b/x/evm/keeper/pointer.go @@ -14,6 +14,7 @@ import ( "github.com/sei-protocol/sei-chain/x/evm/artifacts/erc20" "github.com/sei-protocol/sei-chain/x/evm/artifacts/erc721" "github.com/sei-protocol/sei-chain/x/evm/artifacts/native" + artifactsutils "github.com/sei-protocol/sei-chain/x/evm/artifacts/utils" "github.com/sei-protocol/sei-chain/x/evm/types" ) @@ -205,3 +206,23 @@ func (k *Keeper) deletePointerInfo(ctx sdk.Context, pref []byte, version uint16) binary.BigEndian.PutUint16(versionBz, version) store.Delete(versionBz) } + +func (k *Keeper) GetStoredPointerCodeID(ctx sdk.Context, pointerType types.PointerType) uint64 { + store := k.PrefixStore(ctx, types.PointerCWCodePrefix) + var versionBz []byte + switch pointerType { + case types.PointerType_ERC20: + store = prefix.NewStore(store, types.PointerCW20ERC20Prefix) + versionBz = artifactsutils.GetVersionBz(erc20.CurrentVersion) + case types.PointerType_ERC721: + store = prefix.NewStore(store, types.PointerCW721ERC721Prefix) + versionBz = artifactsutils.GetVersionBz(erc721.CurrentVersion) + default: + return 0 + } + bz := store.Get(versionBz) + if bz == nil { + return 0 + } + return binary.BigEndian.Uint64(bz) +} diff --git a/x/evm/keeper/whitelist.go b/x/evm/keeper/whitelist.go deleted file mode 100644 index 5e85bfbf4..000000000 --- a/x/evm/keeper/whitelist.go +++ /dev/null @@ -1,16 +0,0 @@ -package keeper - -import ( - "bytes" - - sdk "github.com/cosmos/cosmos-sdk/types" -) - -func (k *Keeper) IsCWCodeHashWhitelistedForEVMDelegateCall(ctx sdk.Context, h []byte) bool { - for _, w := range k.WhitelistedCwCodeHashesForDelegateCall(ctx) { - if bytes.Equal(w, h) { - return true - } - } - return false -} diff --git a/x/evm/keeper/whitelist_test.go b/x/evm/keeper/whitelist_test.go deleted file mode 100644 index f25db274b..000000000 --- a/x/evm/keeper/whitelist_test.go +++ /dev/null @@ -1,14 +0,0 @@ -package keeper_test - -import ( - "testing" - - keepertest "github.com/sei-protocol/sei-chain/testutil/keeper" - "github.com/stretchr/testify/require" -) - -func TestWhitelist(t *testing.T) { - k, ctx := keepertest.MockEVMKeeper() - require.True(t, k.IsCWCodeHashWhitelistedForEVMDelegateCall(ctx, k.WhitelistedCwCodeHashesForDelegateCall(ctx)[0])) - require.False(t, k.IsCWCodeHashWhitelistedForEVMDelegateCall(ctx, []byte("1"))) -} diff --git a/x/evm/migrations/store_cw_pointer_code.go b/x/evm/migrations/store_cw_pointer_code.go index 2e188ec24..3dea8ed44 100644 --- a/x/evm/migrations/store_cw_pointer_code.go +++ b/x/evm/migrations/store_cw_pointer_code.go @@ -10,23 +10,27 @@ import ( "github.com/sei-protocol/sei-chain/x/evm/types" ) -func StoreCWPointerCode(ctx sdk.Context, k *keeper.Keeper) error { - erc20CodeID, err := k.WasmKeeper().Create(ctx, k.AccountKeeper().GetModuleAddress(types.ModuleName), erc20.GetBin(), nil) - if err != nil { - panic(err) +func StoreCWPointerCode(ctx sdk.Context, k *keeper.Keeper, store20 bool, store721 bool) error { + if store20 { + erc20CodeID, err := k.WasmKeeper().Create(ctx, k.AccountKeeper().GetModuleAddress(types.ModuleName), erc20.GetBin(), nil) + if err != nil { + panic(err) + } + prefix.NewStore(k.PrefixStore(ctx, types.PointerCWCodePrefix), types.PointerCW20ERC20Prefix).Set( + artifactsutils.GetVersionBz(erc20.CurrentVersion), + artifactsutils.GetCodeIDBz(erc20CodeID), + ) } - prefix.NewStore(k.PrefixStore(ctx, types.PointerCWCodePrefix), types.PointerCW20ERC20Prefix).Set( - artifactsutils.GetVersionBz(erc20.CurrentVersion), - artifactsutils.GetCodeIDBz(erc20CodeID), - ) - erc721CodeID, err := k.WasmKeeper().Create(ctx, k.AccountKeeper().GetModuleAddress(types.ModuleName), erc721.GetBin(), nil) - if err != nil { - panic(err) + if store721 { + erc721CodeID, err := k.WasmKeeper().Create(ctx, k.AccountKeeper().GetModuleAddress(types.ModuleName), erc721.GetBin(), nil) + if err != nil { + panic(err) + } + prefix.NewStore(k.PrefixStore(ctx, types.PointerCWCodePrefix), types.PointerCW721ERC721Prefix).Set( + artifactsutils.GetVersionBz(erc721.CurrentVersion), + artifactsutils.GetCodeIDBz(erc721CodeID), + ) } - prefix.NewStore(k.PrefixStore(ctx, types.PointerCWCodePrefix), types.PointerCW721ERC721Prefix).Set( - artifactsutils.GetVersionBz(erc721.CurrentVersion), - artifactsutils.GetCodeIDBz(erc721CodeID), - ) return nil } diff --git a/x/evm/module.go b/x/evm/module.go index 1c834bcea..0e42a94ba 100644 --- a/x/evm/module.go +++ b/x/evm/module.go @@ -141,12 +141,16 @@ func (am AppModule) RegisterServices(cfg module.Configurator) { }) _ = cfg.RegisterMigration(types.ModuleName, 4, func(ctx sdk.Context) error { - return migrations.StoreCWPointerCode(ctx, am.keeper) + return migrations.StoreCWPointerCode(ctx, am.keeper, true, true) }) _ = cfg.RegisterMigration(types.ModuleName, 5, func(ctx sdk.Context) error { return migrations.FixTotalSupply(ctx, am.keeper) }) + + _ = cfg.RegisterMigration(types.ModuleName, 6, func(ctx sdk.Context) error { + return migrations.StoreCWPointerCode(ctx, am.keeper, false, true) + }) } // RegisterInvariants registers the capability module's invariants. @@ -171,7 +175,7 @@ func (am AppModule) ExportGenesis(ctx sdk.Context, cdc codec.JSONCodec) json.Raw } // ConsensusVersion implements ConsensusVersion. -func (AppModule) ConsensusVersion() uint64 { return 6 } +func (AppModule) ConsensusVersion() uint64 { return 7 } // BeginBlock executes all ABCI BeginBlock logic respective to the capability module. func (am AppModule) BeginBlock(ctx sdk.Context, _ abci.RequestBeginBlock) { diff --git a/x/evm/module_test.go b/x/evm/module_test.go index 4082dcb86..d91c6e109 100644 --- a/x/evm/module_test.go +++ b/x/evm/module_test.go @@ -45,13 +45,13 @@ func TestModuleExportGenesis(t *testing.T) { module := evm.NewAppModule(nil, k) jsonMsg := module.ExportGenesis(ctx, types.ModuleCdc) jsonStr := string(jsonMsg) - assert.Equal(t, "{\"params\":{\"priority_normalizer\":\"1.000000000000000000\",\"base_fee_per_gas\":\"0.000000000000000000\",\"minimum_fee_per_gas\":\"1000000000.000000000000000000\",\"whitelisted_cw_code_hashes_for_delegate_call\":[\"ol1416zS7kfMOcIk4WL+ebU+a75u0qVujAqGWT6+YQI=\",\"lM3Zw+hcJvfOxDwjv7SzsrLXGgqNhcWN8S/+wHQf68g=\"]},\"address_associations\":[{\"sei_address\":\"sei17xpfvakm2amg962yls6f84z3kell8c5la4jkdu\",\"eth_address\":\"0x27F7B8B8B5A4e71E8E9aA671f4e4031E3773303F\"}],\"codes\":[],\"states\":[],\"nonces\":[],\"serialized\":[{\"prefix\":\"Fg==\",\"key\":\"AwAB\",\"value\":\"AAAAAAAAAAM=\"},{\"prefix\":\"Fg==\",\"key\":\"BAAB\",\"value\":\"AAAAAAAAAAQ=\"}]}", jsonStr) + assert.Equal(t, "{\"params\":{\"priority_normalizer\":\"1.000000000000000000\",\"base_fee_per_gas\":\"0.000000000000000000\",\"minimum_fee_per_gas\":\"1000000000.000000000000000000\",\"whitelisted_cw_code_hashes_for_delegate_call\":[]},\"address_associations\":[{\"sei_address\":\"sei17xpfvakm2amg962yls6f84z3kell8c5la4jkdu\",\"eth_address\":\"0x27F7B8B8B5A4e71E8E9aA671f4e4031E3773303F\"}],\"codes\":[],\"states\":[],\"nonces\":[],\"serialized\":[{\"prefix\":\"Fg==\",\"key\":\"AwAB\",\"value\":\"AAAAAAAAAAM=\"},{\"prefix\":\"Fg==\",\"key\":\"BAAC\",\"value\":\"AAAAAAAAAAQ=\"}]}", jsonStr) } func TestConsensusVersion(t *testing.T) { k, _ := testkeeper.MockEVMKeeper() module := evm.NewAppModule(nil, k) - assert.Equal(t, uint64(6), module.ConsensusVersion()) + assert.Equal(t, uint64(7), module.ConsensusVersion()) } func TestABCI(t *testing.T) { diff --git a/x/evm/types/params.go b/x/evm/types/params.go index ff99431f5..faff9e9ec 100644 --- a/x/evm/types/params.go +++ b/x/evm/types/params.go @@ -1,7 +1,6 @@ package types import ( - "encoding/hex" "errors" fmt "fmt" @@ -11,9 +10,10 @@ import ( ) var ( - KeyPriorityNormalizer = []byte("KeyPriorityNormalizer") - KeyBaseFeePerGas = []byte("KeyBaseFeePerGas") - KeyMinFeePerGas = []byte("KeyMinFeePerGas") + KeyPriorityNormalizer = []byte("KeyPriorityNormalizer") + KeyBaseFeePerGas = []byte("KeyBaseFeePerGas") + KeyMinFeePerGas = []byte("KeyMinFeePerGas") + // deprecated KeyWhitelistedCwCodeHashesForDelegateCall = []byte("KeyWhitelistedCwCodeHashesForDelegateCall") ) @@ -120,7 +120,5 @@ func validateWhitelistedCwHashesForDelegateCall(i interface{}) error { } func generateDefaultWhitelistedCwCodeHashesForDelegateCall() [][]byte { - cw20, _ := hex.DecodeString("A25D78D7ACD2EE47CC39C224E162FE79B53E6BBE6ED2A56E8C0A86593EBE6102") - cw721, _ := hex.DecodeString("94CDD9C3E85C26F7CEC43C23BFB4B3B2B2D71A0A8D85C58DF12FFEC0741FEBC8") - return [][]byte{cw20, cw721} + return [][]byte(nil) } diff --git a/x/evm/types/query.pb.go b/x/evm/types/query.pb.go index 5c80febcc..a13d53789 100644 --- a/x/evm/types/query.pb.go +++ b/x/evm/types/query.pb.go @@ -428,6 +428,102 @@ func (m *QueryPointerResponse) GetExists() bool { return false } +type QueryPointerVersionRequest struct { + PointerType PointerType `protobuf:"varint,1,opt,name=pointer_type,json=pointerType,proto3,enum=seiprotocol.seichain.evm.PointerType" json:"pointer_type,omitempty"` +} + +func (m *QueryPointerVersionRequest) Reset() { *m = QueryPointerVersionRequest{} } +func (m *QueryPointerVersionRequest) String() string { return proto.CompactTextString(m) } +func (*QueryPointerVersionRequest) ProtoMessage() {} +func (*QueryPointerVersionRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_11c0d37eed5339f7, []int{8} +} +func (m *QueryPointerVersionRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QueryPointerVersionRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QueryPointerVersionRequest.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 *QueryPointerVersionRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryPointerVersionRequest.Merge(m, src) +} +func (m *QueryPointerVersionRequest) XXX_Size() int { + return m.Size() +} +func (m *QueryPointerVersionRequest) XXX_DiscardUnknown() { + xxx_messageInfo_QueryPointerVersionRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_QueryPointerVersionRequest proto.InternalMessageInfo + +func (m *QueryPointerVersionRequest) GetPointerType() PointerType { + if m != nil { + return m.PointerType + } + return PointerType_ERC20 +} + +type QueryPointerVersionResponse struct { + Version uint32 `protobuf:"varint,1,opt,name=version,proto3" json:"version,omitempty"` + CwCodeId uint64 `protobuf:"varint,2,opt,name=cw_code_id,json=cwCodeId,proto3" json:"cw_code_id,omitempty"` +} + +func (m *QueryPointerVersionResponse) Reset() { *m = QueryPointerVersionResponse{} } +func (m *QueryPointerVersionResponse) String() string { return proto.CompactTextString(m) } +func (*QueryPointerVersionResponse) ProtoMessage() {} +func (*QueryPointerVersionResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_11c0d37eed5339f7, []int{9} +} +func (m *QueryPointerVersionResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QueryPointerVersionResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QueryPointerVersionResponse.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 *QueryPointerVersionResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryPointerVersionResponse.Merge(m, src) +} +func (m *QueryPointerVersionResponse) XXX_Size() int { + return m.Size() +} +func (m *QueryPointerVersionResponse) XXX_DiscardUnknown() { + xxx_messageInfo_QueryPointerVersionResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_QueryPointerVersionResponse proto.InternalMessageInfo + +func (m *QueryPointerVersionResponse) GetVersion() uint32 { + if m != nil { + return m.Version + } + return 0 +} + +func (m *QueryPointerVersionResponse) GetCwCodeId() uint64 { + if m != nil { + return m.CwCodeId + } + return 0 +} + func init() { proto.RegisterType((*QuerySeiAddressByEVMAddressRequest)(nil), "seiprotocol.seichain.evm.QuerySeiAddressByEVMAddressRequest") proto.RegisterType((*QuerySeiAddressByEVMAddressResponse)(nil), "seiprotocol.seichain.evm.QuerySeiAddressByEVMAddressResponse") @@ -437,47 +533,54 @@ func init() { proto.RegisterType((*QueryStaticCallResponse)(nil), "seiprotocol.seichain.evm.QueryStaticCallResponse") proto.RegisterType((*QueryPointerRequest)(nil), "seiprotocol.seichain.evm.QueryPointerRequest") proto.RegisterType((*QueryPointerResponse)(nil), "seiprotocol.seichain.evm.QueryPointerResponse") + proto.RegisterType((*QueryPointerVersionRequest)(nil), "seiprotocol.seichain.evm.QueryPointerVersionRequest") + proto.RegisterType((*QueryPointerVersionResponse)(nil), "seiprotocol.seichain.evm.QueryPointerVersionResponse") } func init() { proto.RegisterFile("evm/query.proto", fileDescriptor_11c0d37eed5339f7) } var fileDescriptor_11c0d37eed5339f7 = []byte{ - // 547 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x53, 0xcd, 0x6e, 0xd3, 0x4c, - 0x14, 0x8d, 0xf3, 0x7d, 0x6d, 0xe9, 0x6d, 0x29, 0xd2, 0x80, 0x42, 0x14, 0x21, 0x53, 0x99, 0x1f, - 0x45, 0x48, 0xb6, 0xa1, 0x6c, 0xcb, 0x82, 0xa0, 0x0a, 0x36, 0x48, 0x60, 0x10, 0x0b, 0x36, 0xd1, - 0xc4, 0xb9, 0xa4, 0x23, 0xc5, 0x1e, 0xd7, 0x33, 0xb1, 0xea, 0x2d, 0x4f, 0x80, 0x04, 0x2f, 0xc0, - 0xc3, 0x20, 0xb1, 0xac, 0x60, 0xc3, 0x12, 0x25, 0x3c, 0x08, 0xf2, 0x78, 0x9c, 0xb8, 0x6d, 0x62, - 0xb7, 0xec, 0xe6, 0x8e, 0xe7, 0x9c, 0x7b, 0xce, 0xf5, 0xb9, 0x70, 0x0d, 0x93, 0xc0, 0x3d, 0x9a, - 0x60, 0x9c, 0x3a, 0x51, 0xcc, 0x25, 0x27, 0x6d, 0x81, 0x4c, 0x9d, 0x7c, 0x3e, 0x76, 0x04, 0x32, - 0xff, 0x90, 0xb2, 0xd0, 0xc1, 0x24, 0xe8, 0xdc, 0x1a, 0x71, 0x3e, 0x1a, 0xa3, 0x4b, 0x23, 0xe6, - 0xd2, 0x30, 0xe4, 0x92, 0x4a, 0xc6, 0x43, 0x91, 0xe3, 0x3a, 0x8a, 0x08, 0xc3, 0x49, 0xa0, 0x2f, - 0xac, 0x03, 0xb0, 0x5e, 0x67, 0xbc, 0x6f, 0x90, 0x3d, 0x1d, 0x0e, 0x63, 0x14, 0xa2, 0x97, 0x1e, - 0xbc, 0x7b, 0xa9, 0xcf, 0x1e, 0x1e, 0x4d, 0x50, 0x48, 0x72, 0x1b, 0xb6, 0x30, 0x09, 0xfa, 0x34, - 0xbf, 0x6d, 0x1b, 0xbb, 0x46, 0x77, 0xd3, 0x03, 0x4c, 0x02, 0xfd, 0xce, 0xfa, 0x00, 0x77, 0x2a, - 0x69, 0x44, 0xc4, 0x43, 0x81, 0x19, 0x8f, 0x40, 0x76, 0x96, 0x47, 0xcc, 0x41, 0xc4, 0x04, 0xa0, - 0x42, 0x70, 0x9f, 0x51, 0x89, 0xc3, 0x76, 0x73, 0xd7, 0xe8, 0x5e, 0xf1, 0x4a, 0x37, 0x73, 0xb9, - 0x0b, 0xee, 0x5e, 0xa9, 0x67, 0x49, 0x6e, 0x65, 0x9b, 0xb9, 0xdc, 0x55, 0x34, 0x0b, 0xb9, 0x95, - 0xb6, 0x6b, 0xe5, 0xee, 0x43, 0x2b, 0x1f, 0x4b, 0xf6, 0x17, 0xfc, 0x67, 0x74, 0x3c, 0x2e, 0x24, - 0x12, 0xf8, 0x7f, 0x48, 0x25, 0x55, 0x9c, 0xdb, 0x9e, 0x3a, 0x93, 0x1d, 0x68, 0x4a, 0xae, 0x58, - 0x36, 0xbd, 0xa6, 0xe4, 0x96, 0x0d, 0x37, 0xcf, 0xa1, 0xb5, 0xb2, 0x25, 0x70, 0x2b, 0x85, 0xeb, - 0xea, 0xf9, 0x2b, 0xce, 0x42, 0x89, 0x71, 0xd1, 0xe9, 0x05, 0x6c, 0x47, 0xf9, 0x4d, 0x5f, 0xa6, - 0x11, 0x2a, 0xc8, 0xce, 0xde, 0x3d, 0x67, 0x55, 0x82, 0x1c, 0x8d, 0x7f, 0x9b, 0x46, 0xe8, 0x6d, - 0x45, 0x8b, 0x82, 0xb4, 0x61, 0x23, 0x2f, 0x51, 0x8b, 0x2c, 0x4a, 0x6b, 0x00, 0x37, 0x4e, 0xb7, - 0xd6, 0x32, 0xe7, 0x88, 0x58, 0x0f, 0xaf, 0x28, 0xb3, 0x2f, 0x09, 0xc6, 0x82, 0xf1, 0x50, 0x71, - 0x5d, 0xf5, 0x8a, 0x92, 0xb4, 0x60, 0x1d, 0x8f, 0x99, 0x90, 0xa2, 0xfd, 0x9f, 0x9a, 0xa7, 0xae, - 0xf6, 0x7e, 0xac, 0xc1, 0x9a, 0x6a, 0x42, 0xbe, 0x19, 0xd0, 0x5a, 0x1e, 0x34, 0xb2, 0xbf, 0xda, - 0x56, 0x7d, 0xcc, 0x3b, 0x4f, 0xfe, 0x11, 0x9d, 0xbb, 0xb5, 0x9c, 0x8f, 0x3f, 0xff, 0x7c, 0x6e, - 0x76, 0xc9, 0x7d, 0x57, 0x20, 0xb3, 0x0b, 0x1e, 0xb7, 0xe0, 0x71, 0xb3, 0xdd, 0x2b, 0xe5, 0x52, - 0xf9, 0x58, 0x9e, 0xc0, 0x5a, 0x1f, 0x95, 0xf9, 0xaf, 0xf5, 0x51, 0x1d, 0xfb, 0x0b, 0xf9, 0x28, - 0xed, 0x05, 0xf9, 0x6a, 0x00, 0x2c, 0x32, 0x4a, 0x1e, 0xd6, 0x4d, 0xf1, 0xec, 0x32, 0x74, 0x1e, - 0x5d, 0x02, 0x71, 0x99, 0x59, 0x2b, 0x58, 0xdf, 0xcf, 0x44, 0x7d, 0x31, 0x60, 0x43, 0xa7, 0x93, - 0xd8, 0x35, 0xed, 0x4e, 0x2f, 0x50, 0xc7, 0xb9, 0xe8, 0x73, 0x2d, 0xed, 0x81, 0x92, 0x76, 0x97, - 0x58, 0x15, 0xd2, 0xf4, 0x1a, 0xf4, 0x9e, 0x7f, 0x9f, 0x9a, 0xc6, 0xc9, 0xd4, 0x34, 0x7e, 0x4f, - 0x4d, 0xe3, 0xd3, 0xcc, 0x6c, 0x9c, 0xcc, 0xcc, 0xc6, 0xaf, 0x99, 0xd9, 0x78, 0x6f, 0x8f, 0x98, - 0x3c, 0x9c, 0x0c, 0x1c, 0x9f, 0x07, 0xe7, 0x78, 0xec, 0x9c, 0xe8, 0x58, 0x51, 0x65, 0x4b, 0x2d, - 0x06, 0xeb, 0xea, 0xfb, 0xe3, 0xbf, 0x01, 0x00, 0x00, 0xff, 0xff, 0x7d, 0xec, 0x65, 0x60, 0x2a, - 0x06, 0x00, 0x00, + // 627 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x94, 0xcd, 0x6e, 0xd3, 0x4e, + 0x14, 0xc5, 0xeb, 0xfc, 0xfb, 0xef, 0xc7, 0x6d, 0x29, 0xd2, 0x80, 0x4a, 0x64, 0x2a, 0x53, 0x99, + 0x0f, 0x55, 0x15, 0xb1, 0xa1, 0xc0, 0xae, 0x2c, 0x68, 0x55, 0x01, 0x0b, 0x24, 0x30, 0xd0, 0x05, + 0x1b, 0xcb, 0xb5, 0x6f, 0xdb, 0x91, 0x62, 0x8f, 0xeb, 0x99, 0xa4, 0xcd, 0x96, 0x05, 0x6b, 0x24, + 0x78, 0x01, 0x1e, 0x81, 0x87, 0x40, 0x62, 0x59, 0x89, 0x0d, 0x4b, 0xd4, 0xf0, 0x20, 0xc8, 0xe3, + 0x71, 0xe2, 0xb4, 0x89, 0x9d, 0x20, 0x76, 0x73, 0x27, 0x73, 0xce, 0xfd, 0xdd, 0xc9, 0x1c, 0xc3, + 0x65, 0x6c, 0x87, 0xf6, 0x51, 0x0b, 0x93, 0x8e, 0x15, 0x27, 0x4c, 0x30, 0x52, 0xe7, 0x48, 0xe5, + 0xca, 0x67, 0x4d, 0x8b, 0x23, 0xf5, 0x0f, 0x3d, 0x1a, 0x59, 0xd8, 0x0e, 0xf5, 0x95, 0x03, 0xc6, + 0x0e, 0x9a, 0x68, 0x7b, 0x31, 0xb5, 0xbd, 0x28, 0x62, 0xc2, 0x13, 0x94, 0x45, 0x3c, 0xd3, 0xe9, + 0xd2, 0x08, 0xa3, 0x56, 0xa8, 0x36, 0xcc, 0x1d, 0x30, 0x5f, 0xa5, 0xbe, 0xaf, 0x91, 0x3e, 0x09, + 0x82, 0x04, 0x39, 0xdf, 0xea, 0xec, 0xec, 0xbe, 0x50, 0x6b, 0x07, 0x8f, 0x5a, 0xc8, 0x05, 0xb9, + 0x01, 0x0b, 0xd8, 0x0e, 0x5d, 0x2f, 0xdb, 0xad, 0x6b, 0xab, 0xda, 0xda, 0xbc, 0x03, 0xd8, 0x0e, + 0xd5, 0x39, 0x73, 0x1f, 0x6e, 0x96, 0xda, 0xf0, 0x98, 0x45, 0x1c, 0x53, 0x1f, 0x8e, 0xf4, 0xbc, + 0x0f, 0xef, 0x89, 0x88, 0x01, 0xe0, 0x71, 0xce, 0x7c, 0xea, 0x09, 0x0c, 0xea, 0xb5, 0x55, 0x6d, + 0x6d, 0xce, 0x29, 0xec, 0xf4, 0x70, 0xfb, 0xde, 0x5b, 0x85, 0x9e, 0x05, 0xdc, 0xd2, 0x36, 0x3d, + 0xdc, 0x51, 0x36, 0x7d, 0xdc, 0xd2, 0xb1, 0x2b, 0x71, 0x37, 0x61, 0x39, 0xbb, 0x96, 0xf4, 0x5f, + 0xf0, 0xb7, 0xbd, 0x66, 0x33, 0x47, 0x24, 0x30, 0x1d, 0x78, 0xc2, 0x93, 0x9e, 0x8b, 0x8e, 0x5c, + 0x93, 0x25, 0xa8, 0x09, 0x26, 0x5d, 0xe6, 0x9d, 0x9a, 0x60, 0x66, 0x03, 0xae, 0x5d, 0x50, 0x2b, + 0xb2, 0x21, 0x72, 0xb3, 0x03, 0x57, 0xe4, 0xf1, 0x97, 0x8c, 0x46, 0x02, 0x93, 0xbc, 0xd3, 0x33, + 0x58, 0x8c, 0xb3, 0x1d, 0x57, 0x74, 0x62, 0x94, 0x92, 0xa5, 0x8d, 0xdb, 0xd6, 0xa8, 0x17, 0x64, + 0x29, 0xfd, 0x9b, 0x4e, 0x8c, 0xce, 0x42, 0xdc, 0x2f, 0x48, 0x1d, 0x66, 0xb3, 0x12, 0x15, 0x64, + 0x5e, 0x9a, 0x7b, 0x70, 0x75, 0xb0, 0xb5, 0xc2, 0xec, 0x29, 0x12, 0x75, 0x79, 0x79, 0x99, 0xfe, + 0xd2, 0xc6, 0x84, 0x53, 0x16, 0x49, 0xaf, 0x4b, 0x4e, 0x5e, 0x92, 0x65, 0x98, 0xc1, 0x13, 0xca, + 0x05, 0xaf, 0xff, 0x27, 0xef, 0x53, 0x55, 0xe6, 0x3e, 0xe8, 0xc5, 0x1e, 0xbb, 0xd9, 0xf1, 0x7f, + 0x3e, 0xa5, 0xf9, 0x16, 0xae, 0x0f, 0xed, 0xd3, 0x1f, 0x29, 0x07, 0xd7, 0x06, 0xc1, 0x57, 0x00, + 0xfc, 0x63, 0xd7, 0x67, 0x01, 0xba, 0x34, 0x7b, 0x0c, 0xd3, 0xce, 0x9c, 0x7f, 0xbc, 0xcd, 0x02, + 0x7c, 0x1e, 0x6c, 0x7c, 0x98, 0x85, 0xff, 0xa5, 0x2f, 0xf9, 0xa6, 0xc1, 0xf2, 0xf0, 0x9c, 0x90, + 0xcd, 0xd1, 0xbc, 0xd5, 0x29, 0xd5, 0x1f, 0xff, 0xa5, 0x3a, 0x9b, 0xcc, 0xb4, 0xde, 0xff, 0xf8, + 0xfd, 0xa9, 0xb6, 0x46, 0xee, 0xd8, 0x1c, 0x69, 0x23, 0xf7, 0xb1, 0x73, 0x1f, 0x3b, 0xfd, 0x74, + 0x14, 0x62, 0x25, 0xe7, 0x18, 0x1e, 0xa0, 0xca, 0x39, 0x4a, 0xe3, 0x5b, 0x39, 0x47, 0x79, 0x6a, + 0xc7, 0x9a, 0xa3, 0x10, 0x6b, 0xf2, 0x45, 0x03, 0xe8, 0x47, 0x8c, 0xdc, 0xab, 0xba, 0xc5, 0xf3, + 0x59, 0xd6, 0xef, 0x4f, 0xa0, 0x98, 0xe4, 0xae, 0xa5, 0xcc, 0xf5, 0x53, 0xa8, 0xcf, 0x1a, 0xcc, + 0xaa, 0x07, 0x49, 0x1a, 0x15, 0xed, 0x06, 0xf3, 0xaf, 0x5b, 0xe3, 0x1e, 0x57, 0x68, 0xeb, 0x12, + 0xed, 0x16, 0x31, 0x4b, 0xd0, 0xf2, 0x14, 0x7f, 0xd5, 0x60, 0x69, 0x30, 0x27, 0xe4, 0xe1, 0x78, + 0xed, 0x06, 0xe3, 0xab, 0x3f, 0x9a, 0x50, 0xa5, 0x58, 0x37, 0x24, 0xeb, 0x5d, 0xb2, 0x5e, 0xcd, + 0xea, 0xaa, 0x98, 0x6e, 0x3d, 0xfd, 0x7e, 0x66, 0x68, 0xa7, 0x67, 0x86, 0xf6, 0xeb, 0xcc, 0xd0, + 0x3e, 0x76, 0x8d, 0xa9, 0xd3, 0xae, 0x31, 0xf5, 0xb3, 0x6b, 0x4c, 0xbd, 0x6b, 0x1c, 0x50, 0x71, + 0xd8, 0xda, 0xb3, 0x7c, 0x16, 0x5e, 0xf0, 0x6b, 0x64, 0x86, 0x27, 0xd2, 0x32, 0xfd, 0xc2, 0xf0, + 0xbd, 0x19, 0xf9, 0xfb, 0x83, 0x3f, 0x01, 0x00, 0x00, 0xff, 0xff, 0x5d, 0xbe, 0x8f, 0x9b, 0x9d, + 0x07, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -496,6 +599,7 @@ type QueryClient interface { EVMAddressBySeiAddress(ctx context.Context, in *QueryEVMAddressBySeiAddressRequest, opts ...grpc.CallOption) (*QueryEVMAddressBySeiAddressResponse, error) StaticCall(ctx context.Context, in *QueryStaticCallRequest, opts ...grpc.CallOption) (*QueryStaticCallResponse, error) Pointer(ctx context.Context, in *QueryPointerRequest, opts ...grpc.CallOption) (*QueryPointerResponse, error) + PointerVersion(ctx context.Context, in *QueryPointerVersionRequest, opts ...grpc.CallOption) (*QueryPointerVersionResponse, error) } type queryClient struct { @@ -542,12 +646,22 @@ func (c *queryClient) Pointer(ctx context.Context, in *QueryPointerRequest, opts return out, nil } +func (c *queryClient) PointerVersion(ctx context.Context, in *QueryPointerVersionRequest, opts ...grpc.CallOption) (*QueryPointerVersionResponse, error) { + out := new(QueryPointerVersionResponse) + err := c.cc.Invoke(ctx, "/seiprotocol.seichain.evm.Query/PointerVersion", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + // QueryServer is the server API for Query service. type QueryServer interface { SeiAddressByEVMAddress(context.Context, *QuerySeiAddressByEVMAddressRequest) (*QuerySeiAddressByEVMAddressResponse, error) EVMAddressBySeiAddress(context.Context, *QueryEVMAddressBySeiAddressRequest) (*QueryEVMAddressBySeiAddressResponse, error) StaticCall(context.Context, *QueryStaticCallRequest) (*QueryStaticCallResponse, error) Pointer(context.Context, *QueryPointerRequest) (*QueryPointerResponse, error) + PointerVersion(context.Context, *QueryPointerVersionRequest) (*QueryPointerVersionResponse, error) } // UnimplementedQueryServer can be embedded to have forward compatible implementations. @@ -566,6 +680,9 @@ func (*UnimplementedQueryServer) StaticCall(ctx context.Context, req *QueryStati func (*UnimplementedQueryServer) Pointer(ctx context.Context, req *QueryPointerRequest) (*QueryPointerResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method Pointer not implemented") } +func (*UnimplementedQueryServer) PointerVersion(ctx context.Context, req *QueryPointerVersionRequest) (*QueryPointerVersionResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method PointerVersion not implemented") +} func RegisterQueryServer(s grpc1.Server, srv QueryServer) { s.RegisterService(&_Query_serviceDesc, srv) @@ -643,6 +760,24 @@ func _Query_Pointer_Handler(srv interface{}, ctx context.Context, dec func(inter return interceptor(ctx, in, info, handler) } +func _Query_PointerVersion_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(QueryPointerVersionRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(QueryServer).PointerVersion(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/seiprotocol.seichain.evm.Query/PointerVersion", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(QueryServer).PointerVersion(ctx, req.(*QueryPointerVersionRequest)) + } + return interceptor(ctx, in, info, handler) +} + var _Query_serviceDesc = grpc.ServiceDesc{ ServiceName: "seiprotocol.seichain.evm.Query", HandlerType: (*QueryServer)(nil), @@ -663,6 +798,10 @@ var _Query_serviceDesc = grpc.ServiceDesc{ MethodName: "Pointer", Handler: _Query_Pointer_Handler, }, + { + MethodName: "PointerVersion", + Handler: _Query_PointerVersion_Handler, + }, }, Streams: []grpc.StreamDesc{}, Metadata: "evm/query.proto", @@ -955,6 +1094,67 @@ func (m *QueryPointerResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *QueryPointerVersionRequest) 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 *QueryPointerVersionRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QueryPointerVersionRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.PointerType != 0 { + i = encodeVarintQuery(dAtA, i, uint64(m.PointerType)) + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + +func (m *QueryPointerVersionResponse) 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 *QueryPointerVersionResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QueryPointerVersionResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.CwCodeId != 0 { + i = encodeVarintQuery(dAtA, i, uint64(m.CwCodeId)) + i-- + dAtA[i] = 0x10 + } + if m.Version != 0 { + i = encodeVarintQuery(dAtA, i, uint64(m.Version)) + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + func encodeVarintQuery(dAtA []byte, offset int, v uint64) int { offset -= sovQuery(v) base := offset @@ -1089,6 +1289,33 @@ func (m *QueryPointerResponse) Size() (n int) { return n } +func (m *QueryPointerVersionRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.PointerType != 0 { + n += 1 + sovQuery(uint64(m.PointerType)) + } + return n +} + +func (m *QueryPointerVersionResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Version != 0 { + n += 1 + sovQuery(uint64(m.Version)) + } + if m.CwCodeId != 0 { + n += 1 + sovQuery(uint64(m.CwCodeId)) + } + return n +} + func sovQuery(x uint64) (n int) { return (math_bits.Len64(x|1) + 6) / 7 } @@ -1885,6 +2112,163 @@ func (m *QueryPointerResponse) Unmarshal(dAtA []byte) error { } return nil } +func (m *QueryPointerVersionRequest) 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: QueryPointerVersionRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QueryPointerVersionRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field PointerType", wireType) + } + m.PointerType = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.PointerType |= PointerType(b&0x7F) << shift + if b < 0x80 { + break + } + } + 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 *QueryPointerVersionResponse) 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: QueryPointerVersionResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QueryPointerVersionResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Version", wireType) + } + m.Version = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Version |= uint32(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field CwCodeId", wireType) + } + m.CwCodeId = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.CwCodeId |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + 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 diff --git a/x/evm/types/query.pb.gw.go b/x/evm/types/query.pb.gw.go index 8d4d10c21..72c5e53f0 100644 --- a/x/evm/types/query.pb.gw.go +++ b/x/evm/types/query.pb.gw.go @@ -177,6 +177,42 @@ func local_request_Query_Pointer_0(ctx context.Context, marshaler runtime.Marsha } +var ( + filter_Query_PointerVersion_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} +) + +func request_Query_PointerVersion_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryPointerVersionRequest + 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_PointerVersion_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.PointerVersion(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_Query_PointerVersion_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryPointerVersionRequest + 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_PointerVersion_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.PointerVersion(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. @@ -275,6 +311,29 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv }) + mux.Handle("GET", pattern_Query_PointerVersion_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_PointerVersion_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_PointerVersion_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + return nil } @@ -396,6 +455,26 @@ func RegisterQueryHandlerClient(ctx context.Context, mux *runtime.ServeMux, clie }) + mux.Handle("GET", pattern_Query_PointerVersion_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_PointerVersion_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_PointerVersion_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + return nil } @@ -407,6 +486,8 @@ var ( pattern_Query_StaticCall_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"sei-protocol", "seichain", "evm", "static_call"}, "", runtime.AssumeColonVerbOpt(true))) pattern_Query_Pointer_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"sei-protocol", "seichain", "evm", "pointer"}, "", runtime.AssumeColonVerbOpt(true))) + + pattern_Query_PointerVersion_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"sei-protocol", "seichain", "evm", "pointer_version"}, "", runtime.AssumeColonVerbOpt(true))) ) var ( @@ -417,4 +498,6 @@ var ( forward_Query_StaticCall_0 = runtime.ForwardResponseMessage forward_Query_Pointer_0 = runtime.ForwardResponseMessage + + forward_Query_PointerVersion_0 = runtime.ForwardResponseMessage ) From 72b6ddecf47d5d3f96c6f39b61416d5336ab26dc Mon Sep 17 00:00:00 2001 From: codchen Date: Wed, 15 May 2024 01:17:12 +0800 Subject: [PATCH 35/51] bump sei-cosmos (#1667) --- app/app.go | 6 ++++-- go.mod | 4 +--- go.sum | 7 ++----- 3 files changed, 7 insertions(+), 10 deletions(-) diff --git a/app/app.go b/app/app.go index 2b57885f5..e6d82812e 100644 --- a/app/app.go +++ b/app/app.go @@ -1125,7 +1125,8 @@ func (app *App) FinalizeBlocker(ctx sdk.Context, req *abci.RequestFinalizeBlock) if app.EvmKeeper.EthReplayConfig.Enabled || app.EvmKeeper.EthBlockTestConfig.Enabled { return &abci.ResponseFinalizeBlock{}, nil } - appHash := app.WriteStateToCommitAndGetWorkingHash() + app.WriteState() + appHash := app.GetWorkingHash() resp := app.getFinalizeBlockResponse(appHash, app.optimisticProcessingInfo.Events, app.optimisticProcessingInfo.TxRes, app.optimisticProcessingInfo.EndBlockResp) return &resp, nil } @@ -1140,7 +1141,8 @@ func (app *App) FinalizeBlocker(ctx sdk.Context, req *abci.RequestFinalizeBlock) if app.EvmKeeper.EthReplayConfig.Enabled || app.EvmKeeper.EthBlockTestConfig.Enabled { return &abci.ResponseFinalizeBlock{}, nil } - appHash := app.WriteStateToCommitAndGetWorkingHash() + app.WriteState() + appHash := app.GetWorkingHash() resp := app.getFinalizeBlockResponse(appHash, events, txResults, endBlockResp) return &resp, nil } diff --git a/go.mod b/go.mod index abb68a669..acd28ca6e 100644 --- a/go.mod +++ b/go.mod @@ -125,7 +125,6 @@ require ( github.com/fzipp/gocyclo v0.5.1 // indirect github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff // indirect github.com/gballet/go-verkle v0.1.1-0.20231031103413-a67434b50f46 // indirect - github.com/ghodss/yaml v1.0.0 // indirect github.com/go-critic/go-critic v0.6.3 // indirect github.com/go-kit/kit v0.12.0 // indirect github.com/go-kit/log v0.2.1 // indirect @@ -173,7 +172,6 @@ require ( github.com/gostaticanalysis/nilerr v0.1.1 // indirect github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 // indirect github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 // indirect - github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.1 // indirect github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c // indirect github.com/hashicorp/errwrap v1.0.0 // indirect github.com/hashicorp/go-bexpr v0.1.10 // indirect @@ -348,7 +346,7 @@ require ( replace ( github.com/CosmWasm/wasmd => github.com/sei-protocol/sei-wasmd v0.1.3 github.com/confio/ics23/go => github.com/cosmos/cosmos-sdk/ics23/go v0.8.0 - github.com/cosmos/cosmos-sdk => github.com/sei-protocol/sei-cosmos v0.3.12 + github.com/cosmos/cosmos-sdk => github.com/sei-protocol/sei-cosmos v0.3.13 github.com/cosmos/iavl => github.com/sei-protocol/sei-iavl v0.1.9 github.com/cosmos/ibc-go/v3 => github.com/sei-protocol/sei-ibc-go/v3 v3.3.0 github.com/ethereum/go-ethereum => github.com/sei-protocol/go-ethereum v1.13.5-sei-17 diff --git a/go.sum b/go.sum index 6d4ac8704..97a8fa2d4 100644 --- a/go.sum +++ b/go.sum @@ -457,7 +457,6 @@ github.com/gballet/go-verkle v0.1.1-0.20231031103413-a67434b50f46 h1:BAIP2Gihuqh github.com/gballet/go-verkle v0.1.1-0.20231031103413-a67434b50f46/go.mod h1:QNpY22eby74jVhqH4WhDLDwxc/vqsern6pW+u2kbkpc= github.com/getkin/kin-openapi v0.53.0/go.mod h1:7Yn5whZr5kJi6t+kShccXS8ae1APpYTW6yheSwk8Yi4= github.com/ghemawat/stream v0.0.0-20171120220530-696b145b53b9/go.mod h1:106OIgooyS7OzLDOpUGgm9fA3bQENb/cFSyyBmMoJDs= -github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/gin-contrib/sse v0.0.0-20190301062529-5545eab6dad3/go.mod h1:VJ0WA2NBN22VlZ2dKZQPAPnyWw5XTlK1KymzLKsr59s= github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= @@ -766,8 +765,6 @@ github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t github.com/grpc-ecosystem/grpc-gateway v1.12.1/go.mod h1:8XEsbTttt/W+VvjtQhLACqCisSPWTxCZ7sBRjU6iH9c= github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.1 h1:/c3QmbOGMGTOumP2iT/rCwB7b0QDGLKzqOmktBjT+Is= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.1/go.mod h1:5SN9VR2LTsRFsrEC6FHgRbTWrTHu6tqPeKxEQv15giM= github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c h1:6rhixN/i8ZofjG1Y75iExal34USq5p+wiN1tpie8IrU= github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c/go.mod h1:NMPJylDgVpX0MLRlPy15sqSwOFv/U1GZ2m21JhFfek0= github.com/guptarohit/asciigraph v0.5.5/go.mod h1:dYl5wwK4gNsnFf9Zp+l06rFiDZ5YtXM6x7SRWZ3KGag= @@ -1350,8 +1347,8 @@ github.com/sei-protocol/go-ethereum v1.13.5-sei-17 h1:NQcNuL/nmLCzVJFj6Za4ZrNj1O github.com/sei-protocol/go-ethereum v1.13.5-sei-17/go.mod h1:kcRZmuzRn1lVejiFNTz4l4W7imnpq1bDAnuKS/RyhbQ= github.com/sei-protocol/goutils v0.0.2 h1:Bfa7Sv+4CVLNM20QcpvGb81B8C5HkQC/kW1CQpIbXDA= github.com/sei-protocol/goutils v0.0.2/go.mod h1:iYE2DuJfEnM+APPehr2gOUXfuLuPsVxorcDO+Tzq9q8= -github.com/sei-protocol/sei-cosmos v0.3.12 h1:MHHg9o6H3snMoepPB2zuYonW8quXf02CAlWsydtoSRE= -github.com/sei-protocol/sei-cosmos v0.3.12/go.mod h1:WWwx6XlJc9SrjdRwLW69o511hFpfUiHapYb+V9OqOG4= +github.com/sei-protocol/sei-cosmos v0.3.13 h1:YNlvDYMJZUJjI9nyIeHqxw9TULGulvbClhMJH/gh2oU= +github.com/sei-protocol/sei-cosmos v0.3.13/go.mod h1:WWwx6XlJc9SrjdRwLW69o511hFpfUiHapYb+V9OqOG4= github.com/sei-protocol/sei-db v0.0.36 h1:Qg8MlO/4btECyAB/XrbEexhpaS7OmYsrs9IUYULf+bY= github.com/sei-protocol/sei-db v0.0.36/go.mod h1:F/ZKZA8HJPcUzSZPA8yt6pfwlGriJ4RDR4eHKSGLStI= github.com/sei-protocol/sei-iavl v0.1.9 h1:y4mVYftxLNRs6533zl7N0/Ch+CzRQc04JDfHolIxgBE= From 9813872a0d4ab2673bbf571a71ce7dc68ec3cb06 Mon Sep 17 00:00:00 2001 From: Denys S <150304777+dssei@users.noreply.github.com> Date: Tue, 14 May 2024 11:36:10 -0700 Subject: [PATCH 36/51] Add memo support to ibc precompiles (#1662) * migrate ibc precompile to a different transfer * add test for memo support * self review tweaks * correct test case name * update gas wanted in test --- precompiles/common/expected_keepers.go | 13 +--- precompiles/ibc/IBC.sol | 6 +- precompiles/ibc/abi.json | 96 +------------------------- precompiles/ibc/ibc.go | 73 ++++++++++++++------ precompiles/ibc/ibc_test.go | 74 +++++++++++++++++--- 5 files changed, 123 insertions(+), 139 deletions(-) diff --git a/precompiles/common/expected_keepers.go b/precompiles/common/expected_keepers.go index f175d6719..6239cc827 100644 --- a/precompiles/common/expected_keepers.go +++ b/precompiles/common/expected_keepers.go @@ -11,7 +11,7 @@ import ( banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - clienttypes "github.com/cosmos/ibc-go/v3/modules/core/02-client/types" + ibctypes "github.com/cosmos/ibc-go/v3/modules/apps/transfer/types" "github.com/ethereum/go-ethereum/common" oracletypes "github.com/sei-protocol/sei-chain/x/oracle/types" ) @@ -72,16 +72,7 @@ type DistributionKeeper interface { } type TransferKeeper interface { - SendTransfer( - ctx sdk.Context, - sourcePort, - sourceChannel string, - token sdk.Coin, - sender sdk.AccAddress, - receiver string, - timeoutHeight clienttypes.Height, - timeoutTimestamp uint64, - ) error + Transfer(goCtx context.Context, msg *ibctypes.MsgTransfer) (*ibctypes.MsgTransferResponse, error) } type ClientKeeper interface { diff --git a/precompiles/ibc/IBC.sol b/precompiles/ibc/IBC.sol index 892652a8b..236d5d789 100644 --- a/precompiles/ibc/IBC.sol +++ b/precompiles/ibc/IBC.sol @@ -17,7 +17,8 @@ interface IBC { uint256 amount, uint64 revisionNumber, uint64 revisionHeight, - uint64 timeoutTimestamp + uint64 timeoutTimestamp, + string memo ) external returns (bool success); function transferWithDefaultTimeout( @@ -25,6 +26,7 @@ interface IBC { string memory port, string memory channel, string memory denom, - uint256 amount + uint256 amount, + string memo ) external returns (bool success); } diff --git a/precompiles/ibc/abi.json b/precompiles/ibc/abi.json index 93db335e4..f4e871a3b 100644 --- a/precompiles/ibc/abi.json +++ b/precompiles/ibc/abi.json @@ -1,95 +1 @@ -[ - { - "inputs": [ - { - "internalType": "string", - "name": "toAddress", - "type": "string" - }, - { - "internalType": "string", - "name": "port", - "type": "string" - }, - { - "internalType": "string", - "name": "channel", - "type": "string" - }, - { - "internalType": "string", - "name": "denom", - "type": "string" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - }, - { - "internalType": "uint64", - "name": "revisionNumber", - "type": "uint64" - }, - { - "internalType": "uint64", - "name": "revisionHeight", - "type": "uint64" - }, - { - "internalType": "uint64", - "name": "timeoutTimestamp", - "type": "uint64" - } - ], - "name": "transfer", - "outputs": [ - { - "internalType": "bool", - "name": "success", - "type": "bool" - } - ], - "stateMutability": "payable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "string", - "name": "toAddress", - "type": "string" - }, - { - "internalType": "string", - "name": "port", - "type": "string" - }, - { - "internalType": "string", - "name": "channel", - "type": "string" - }, - { - "internalType": "string", - "name": "denom", - "type": "string" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "transferWithDefaultTimeout", - "outputs": [ - { - "internalType": "bool", - "name": "success", - "type": "bool" - } - ], - "stateMutability": "payable", - "type": "function" - } -] +[{"inputs":[{"internalType":"string","name":"toAddress","type":"string"},{"internalType":"string","name":"port","type":"string"},{"internalType":"string","name":"channel","type":"string"},{"internalType":"string","name":"denom","type":"string"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint64","name":"revisionNumber","type":"uint64"},{"internalType":"uint64","name":"revisionHeight","type":"uint64"},{"internalType":"uint64","name":"timeoutTimestamp","type":"uint64"},{"internalType":"string","name":"memo","type":"string"}],"name":"transfer","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"string","name":"toAddress","type":"string"},{"internalType":"string","name":"port","type":"string"},{"internalType":"string","name":"channel","type":"string"},{"internalType":"string","name":"denom","type":"string"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"string","name":"memo","type":"string"}],"name":"transferWithDefaultTimeout","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"payable","type":"function"}] diff --git a/precompiles/ibc/ibc.go b/precompiles/ibc/ibc.go index 089f56ffe..d612ca171 100644 --- a/precompiles/ibc/ibc.go +++ b/precompiles/ibc/ibc.go @@ -113,7 +113,7 @@ func (p Precompile) RequiredGas(input []byte) uint64 { return p.Precompile.RequiredGas(input, p.IsTransaction(method.Name)) } -func (p Precompile) RunAndCalculateGas(evm *vm.EVM, caller common.Address, callingContract common.Address, input []byte, suppliedGas uint64, value *big.Int, _ *tracing.Hooks, readOnly bool) (ret []byte, remainingGas uint64, err error) { +func (p Precompile) RunAndCalculateGas(evm *vm.EVM, caller common.Address, callingContract common.Address, input []byte, suppliedGas uint64, _ *big.Int, _ *tracing.Hooks, readOnly bool) (ret []byte, remainingGas uint64, err error) { defer func() { if err != nil { evm.StateDB.(*state.DBImpl).SetPrecompileError(err) @@ -160,7 +160,7 @@ func (p Precompile) transfer(ctx sdk.Context, method *abi.Method, args []interfa } }() - if err := pcommon.ValidateArgsLength(args, 8); err != nil { + if err := pcommon.ValidateArgsLength(args, 9); err != nil { rerr = err return } @@ -205,15 +205,25 @@ func (p Precompile) transfer(ctx sdk.Context, method *abi.Method, args []interfa return } - err = p.transferKeeper.SendTransfer( - ctx, - validatedArgs.port, - validatedArgs.channelID, - coin, - validatedArgs.senderSeiAddr, - validatedArgs.receiverAddressString, - height, - timeoutTimestamp) + msg := types.MsgTransfer{ + SourcePort: validatedArgs.port, + SourceChannel: validatedArgs.channelID, + Token: coin, + Sender: validatedArgs.senderSeiAddr.String(), + Receiver: validatedArgs.receiverAddressString, + TimeoutHeight: height, + TimeoutTimestamp: timeoutTimestamp, + } + + msg = addMemo(args[8], msg) + + err = msg.ValidateBasic() + if err != nil { + rerr = err + return + } + + _, err = p.transferKeeper.Transfer(sdk.WrapSDKContext(ctx), &msg) if err != nil { rerr = err @@ -234,7 +244,7 @@ func (p Precompile) transferWithDefaultTimeout(ctx sdk.Context, method *abi.Meth } }() - if err := pcommon.ValidateArgsLength(args, 5); err != nil { + if err := pcommon.ValidateArgsLength(args, 6); err != nil { rerr = err return } @@ -281,15 +291,25 @@ func (p Precompile) transferWithDefaultTimeout(ctx sdk.Context, method *abi.Meth return } - err = p.transferKeeper.SendTransfer( - ctx, - validatedArgs.port, - validatedArgs.channelID, - coin, - validatedArgs.senderSeiAddr, - validatedArgs.receiverAddressString, - height, - timeoutTimestamp) + msg := types.MsgTransfer{ + SourcePort: validatedArgs.port, + SourceChannel: validatedArgs.channelID, + Token: coin, + Sender: validatedArgs.senderSeiAddr.String(), + Receiver: validatedArgs.receiverAddressString, + TimeoutHeight: height, + TimeoutTimestamp: timeoutTimestamp, + } + + msg = addMemo(args[5], msg) + + err = msg.ValidateBasic() + if err != nil { + rerr = err + return + } + + _, err = p.transferKeeper.Transfer(sdk.WrapSDKContext(ctx), &msg) if err != nil { rerr = err @@ -304,6 +324,8 @@ func (Precompile) IsTransaction(method string) bool { switch method { case TransferMethod: return true + case TransferWithDefaultTimeoutMethod: + return true default: return false } @@ -452,3 +474,12 @@ func (p Precompile) validateCommonArgs(ctx sdk.Context, args []interface{}, call amount: amount, }, nil } + +func addMemo(memoArg interface{}, transferMsg types.MsgTransfer) types.MsgTransfer { + memo := "" + if memoArg != nil { + memo = memoArg.(string) + } + transferMsg.Memo = memo + return transferMsg +} diff --git a/precompiles/ibc/ibc_test.go b/precompiles/ibc/ibc_test.go index ad8b311dc..396755b4b 100644 --- a/precompiles/ibc/ibc_test.go +++ b/precompiles/ibc/ibc_test.go @@ -1,16 +1,17 @@ package ibc_test import ( + "context" "errors" "math/big" "reflect" "testing" "time" - "github.com/cosmos/ibc-go/v3/modules/core/exported" - sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/ibc-go/v3/modules/apps/transfer/types" clienttypes "github.com/cosmos/ibc-go/v3/modules/core/02-client/types" + "github.com/cosmos/ibc-go/v3/modules/core/exported" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/vm" pcommon "github.com/sei-protocol/sei-chain/precompiles/common" @@ -23,16 +24,24 @@ import ( type MockTransferKeeper struct{} -func (tk *MockTransferKeeper) SendTransfer(ctx sdk.Context, sourcePort, sourceChannel string, token sdk.Coin, - sender sdk.AccAddress, receiver string, timeoutHeight clienttypes.Height, timeoutTimestamp uint64) error { - return nil +func (tk *MockTransferKeeper) Transfer(goCtx context.Context, msg *types.MsgTransfer) (*types.MsgTransferResponse, error) { + return nil, nil +} + +type MockMemoTransferKeeper struct { + t require.TestingT + wantMemo string +} + +func (tk *MockMemoTransferKeeper) Transfer(goCtx context.Context, msg *types.MsgTransfer) (*types.MsgTransferResponse, error) { + require.Equal(tk.t, tk.wantMemo, msg.Memo) + return nil, nil } type MockFailedTransferTransferKeeper struct{} -func (tk *MockFailedTransferTransferKeeper) SendTransfer(ctx sdk.Context, sourcePort, sourceChannel string, token sdk.Coin, - sender sdk.AccAddress, receiver string, timeoutHeight clienttypes.Height, timeoutTimestamp uint64) error { - return errors.New("failed to send transfer") +func (tk *MockFailedTransferTransferKeeper) Transfer(goCtx context.Context, msg *types.MsgTransfer) (*types.MsgTransferResponse, error) { + return nil, errors.New("failed to send transfer") } func TestPrecompile_Run(t *testing.T) { @@ -56,6 +65,7 @@ func TestPrecompile_Run(t *testing.T) { revisionNumber uint64 revisionHeight uint64 timeoutTimestamp uint64 + memo string } type args struct { caller common.Address @@ -207,6 +217,47 @@ func TestPrecompile_Run(t *testing.T) { wantErr: true, wantErrMsg: "decoding bech32 failed: invalid bech32 string length 7", }, + { + name: "memo is added to the transfer if passed", + fields: fields{transferKeeper: &MockMemoTransferKeeper{t: t, wantMemo: "test memo"}}, + args: args{ + caller: senderEvmAddress, + callingContract: senderEvmAddress, + input: &input{ + receiverAddr: receiverAddress, + sourcePort: "transfer", + sourceChannel: "channel-0", + denom: "usei", + amount: big.NewInt(100), + memo: "test memo", + }, + suppliedGas: uint64(1000000), + value: nil, + }, + wantBz: packedTrue, + wantRemainingGas: 994319, + wantErr: false, + }, + { + name: "memo is not added to the transfer if not passed", + fields: fields{transferKeeper: &MockMemoTransferKeeper{t: t, wantMemo: ""}}, + args: args{ + caller: senderEvmAddress, + callingContract: senderEvmAddress, + input: &input{ + receiverAddr: receiverAddress, + sourcePort: "transfer", + sourceChannel: "channel-0", + denom: "usei", + amount: big.NewInt(100), + }, + suppliedGas: uint64(1000000), + value: nil, + }, + wantBz: packedTrue, + wantRemainingGas: 994319, + wantErr: false, + }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { @@ -224,7 +275,8 @@ func TestPrecompile_Run(t *testing.T) { require.Nil(t, err) inputs, err := transfer.Inputs.Pack(tt.args.input.receiverAddr, tt.args.input.sourcePort, tt.args.input.sourceChannel, tt.args.input.denom, tt.args.input.amount, - tt.args.input.revisionNumber, tt.args.input.revisionHeight, tt.args.input.timeoutTimestamp) + tt.args.input.revisionNumber, tt.args.input.revisionHeight, tt.args.input.timeoutTimestamp, + tt.args.input.memo) require.Nil(t, err) gotBz, gotRemainingGas, err := p.RunAndCalculateGas(&evm, tt.args.caller, tt.args.callingContract, append(p.TransferID, inputs...), tt.args.suppliedGas, tt.args.value, nil, false) if (err != nil) != tt.wantErr { @@ -262,6 +314,7 @@ func TestTransferWithDefaultTimeoutPrecompile_Run(t *testing.T) { sourceChannel string denom string amount *big.Int + memo string } type args struct { caller common.Address @@ -402,7 +455,8 @@ func TestTransferWithDefaultTimeoutPrecompile_Run(t *testing.T) { transfer, err := p.ABI.MethodById(p.TransferWithDefaultTimeoutID) require.Nil(t, err) inputs, err := transfer.Inputs.Pack(tt.args.input.receiverAddr, - tt.args.input.sourcePort, tt.args.input.sourceChannel, tt.args.input.denom, tt.args.input.amount) + tt.args.input.sourcePort, tt.args.input.sourceChannel, tt.args.input.denom, tt.args.input.amount, + tt.args.input.memo) require.Nil(t, err) gotBz, gotRemainingGas, err := p.RunAndCalculateGas(&evm, tt.args.caller, From f130cf400473c0f17b5b808bb9be16725e367547 Mon Sep 17 00:00:00 2001 From: Denys S <150304777+dssei@users.noreply.github.com> Date: Tue, 14 May 2024 12:03:52 -0700 Subject: [PATCH 37/51] Do not modify the original value passed in executeBatch call (#1661) Do not modify the original value passed in execute_batch call --- precompiles/wasmd/wasmd.go | 15 ++++++++--- precompiles/wasmd/wasmd_test.go | 45 +++++++++++++++++++++++++++++++++ 2 files changed, 56 insertions(+), 4 deletions(-) diff --git a/precompiles/wasmd/wasmd.go b/precompiles/wasmd/wasmd.go index 6fbef9905..766164f3d 100644 --- a/precompiles/wasmd/wasmd.go +++ b/precompiles/wasmd/wasmd.go @@ -304,6 +304,13 @@ func (p Precompile) executeBatch(ctx sdk.Context, method *abi.Method, caller com rerr = errors.New("sum of coin amounts must equal value specified") return } + // Copy to avoid modifying the original value + var valueCopy *big.Int + if value != nil { + valueCopy = new(big.Int).Set(value) + } else { + valueCopy = value + } for i := 0; i < len(executeMsgs); i++ { executeMsg := ExecuteMsg(executeMsgs[i]) @@ -335,7 +342,7 @@ func (p Precompile) executeBatch(ctx sdk.Context, method *abi.Method, caller com return } useiAmt := coins.AmountOf(sdk.MustGetBaseDenom()) - if value != nil && !useiAmt.IsZero() { + if valueCopy != nil && !useiAmt.IsZero() { // process coin amount from the value provided useiAmtAsWei := useiAmt.Mul(state.SdkUseiToSweiMultiplier).BigInt() coin, err := pcommon.HandlePaymentUsei(ctx, p.evmKeeper.GetSeiAddressOrDefault(ctx, p.address), senderAddr, useiAmtAsWei, p.bankKeeper) @@ -343,8 +350,8 @@ func (p Precompile) executeBatch(ctx sdk.Context, method *abi.Method, caller com rerr = err return } - value.Sub(value, useiAmtAsWei) - if value.Sign() == -1 { + valueCopy.Sub(valueCopy, useiAmtAsWei) + if valueCopy.Sign() == -1 { rerr = errors.New("insufficient value provided for payment") return } @@ -373,7 +380,7 @@ func (p Precompile) executeBatch(ctx sdk.Context, method *abi.Method, caller com } responses = append(responses, res) } - if value != nil && value.Sign() != 0 { + if valueCopy != nil && valueCopy.Sign() != 0 { rerr = errors.New("value remaining after execution, must match provided amounts exactly") return } diff --git a/precompiles/wasmd/wasmd_test.go b/precompiles/wasmd/wasmd_test.go index 95c8ba4a7..dde3e5114 100644 --- a/precompiles/wasmd/wasmd_test.go +++ b/precompiles/wasmd/wasmd_test.go @@ -384,6 +384,51 @@ func TestExecuteBatchOneMessage(t *testing.T) { require.Equal(t, uint64(0), g) } +func TestExecuteBatchValueImmutability(t *testing.T) { + testApp := app.Setup(false, false) + mockAddr, mockEVMAddr := testkeeper.MockAddressPair() + ctx := testApp.GetContextForDeliverTx([]byte{}).WithBlockTime(time.Now()) + ctx = ctx.WithIsEVM(true) + testApp.EvmKeeper.SetAddressMapping(ctx, mockAddr, mockEVMAddr) + wasmKeeper := wasmkeeper.NewDefaultPermissionKeeper(testApp.WasmKeeper) + p, err := wasmd.NewPrecompile(&testApp.EvmKeeper, wasmKeeper, testApp.WasmKeeper, testApp.BankKeeper) + require.Nil(t, err) + code, err := os.ReadFile("../../example/cosmwasm/echo/artifacts/echo.wasm") + require.Nil(t, err) + codeID, err := wasmKeeper.Create(ctx, mockAddr, code, nil) + require.Nil(t, err) + contractAddr, _, err := wasmKeeper.Instantiate(ctx, codeID, mockAddr, mockAddr, []byte("{}"), "test", sdk.NewCoins()) + require.Nil(t, err) + + amts := sdk.NewCoins(sdk.NewCoin("usei", sdk.NewInt(1000))) + testApp.BankKeeper.MintCoins(ctx, "evm", amts) + testApp.BankKeeper.SendCoinsFromModuleToAccount(ctx, "evm", mockAddr, amts) + testApp.BankKeeper.MintCoins(ctx, "evm", amts) + testApp.BankKeeper.SendCoinsFromModuleToAccount(ctx, "evm", mockAddr, amts) + amtsbz, err := amts.MarshalJSON() + require.Nil(t, err) + executeMethod, err := p.ABI.MethodById(p.ExecuteBatchID) + require.Nil(t, err) + executeMsg := wasmd.ExecuteMsg{ + ContractAddress: contractAddr.String(), + Msg: []byte("{\"echo\":{\"message\":\"test msg\"}}"), + Coins: amtsbz, + } + args, err := executeMethod.Inputs.Pack([]wasmd.ExecuteMsg{executeMsg}) + require.Nil(t, err) + statedb := state.NewDBImpl(ctx, &testApp.EvmKeeper, true) + evm := vm.EVM{ + StateDB: statedb, + } + suppliedGas := uint64(1000000) + testApp.BankKeeper.SendCoins(ctx, mockAddr, testApp.EvmKeeper.GetSeiAddressOrDefault(ctx, common.HexToAddress(wasmd.WasmdAddress)), amts) + value := big.NewInt(1000_000_000_000_000) + valueCopy := new(big.Int).Set(value) + p.RunAndCalculateGas(&evm, mockEVMAddr, mockEVMAddr, append(p.ExecuteBatchID, args...), suppliedGas, value, nil, false) + + require.Equal(t, valueCopy, value) +} + func TestExecuteBatchMultipleMessages(t *testing.T) { testApp := app.Setup(false, false) mockAddr, mockEVMAddr := testkeeper.MockAddressPair() From 168286f4b46efd18a0a5d134cb9ea652da008637 Mon Sep 17 00:00:00 2001 From: Steven Landers Date: Tue, 14 May 2024 16:51:29 -0400 Subject: [PATCH 38/51] [EVM] Test erc20 to cw20 pointer upgrade (#1665) * verify erc20 to cw20 pointer upgrade * goimports * fix current version call from keeer * fix config test * fix test * fix tests * rename describe --- .../test/ERC20toCW20PointerTest-backup.js | 241 +++++++++++ contracts/test/ERC20toCW20PointerTest.js | 385 +++++++++++------- contracts/test/lib.js | 28 ++ docker/localnode/config/app.toml | 5 + docker/rpcnode/config/app.toml | 7 +- evmrpc/config.go | 10 + evmrpc/config_test.go | 5 + evmrpc/server.go | 14 + evmrpc/test.go | 23 ++ precompiles/pointer/pointer.go | 6 +- precompiles/pointerview/pointerview_test.go | 2 +- x/evm/artifacts/cw20/artifacts.go | 17 +- x/evm/config/config.go | 20 +- x/evm/keeper/grpc_query.go | 2 +- x/evm/keeper/grpc_query_test.go | 2 +- x/evm/keeper/pointer.go | 2 +- x/evm/keeper/pointer_test.go | 6 +- 17 files changed, 607 insertions(+), 168 deletions(-) create mode 100644 contracts/test/ERC20toCW20PointerTest-backup.js create mode 100644 evmrpc/test.go diff --git a/contracts/test/ERC20toCW20PointerTest-backup.js b/contracts/test/ERC20toCW20PointerTest-backup.js new file mode 100644 index 000000000..1617cf148 --- /dev/null +++ b/contracts/test/ERC20toCW20PointerTest-backup.js @@ -0,0 +1,241 @@ +const {setupSigners, deployErc20PointerForCw20, getAdmin, deployWasm, WASM, ABI, registerPointerForCw20, + testAPIEnabled, + incrementPointerVersion +} = require("./lib"); +const {expect} = require("chai"); + +describe("ERC20 to CW20 Pointer", function () { + let accounts; + let pointer; + let cw20Address; + let admin; + + before(async function () { + accounts = await setupSigners(await hre.ethers.getSigners()) + admin = await getAdmin() + + cw20Address = await deployWasm(WASM.CW20, accounts[0].seiAddress, "cw20", { + name: "Test", + symbol: "TEST", + decimals: 6, + initial_balances: [ + { address: admin.seiAddress, amount: "1000000" }, + { address: accounts[0].seiAddress, amount: "2000000"}, + { address: accounts[1].seiAddress, amount: "3000000"} + ], + mint: { + "minter": admin.seiAddress, "cap": "99900000000" + } + }) + + // deploy TestToken + const pointerAddr = await deployErc20PointerForCw20(hre.ethers.provider, cw20Address) + const contract = new hre.ethers.Contract(pointerAddr, ABI.ERC20, hre.ethers.provider); + pointer = contract.connect(accounts[0].signer) + }) + + describe("validation", function(){ + it("should not allow a pointer to the pointer", async function(){ + try { + await registerPointerForCw20(await pointer.getAddress()) + expect.fail(`Expected to be prevented from creating a pointer`); + } catch(e){ + expect(e.message).to.include("contract deployment failed"); + } + }) + }) + + describe("read", function(){ + it("get name", async function () { + const name = await pointer.name(); + expect(name).to.equal("Test"); + }); + + it("get symbol", async function () { + const symbol = await pointer.symbol(); + expect(symbol).to.equal("TEST"); + }); + + it("get decimals", async function () { + const decimals = await pointer.decimals(); + expect(Number(decimals)).to.equal(6); + }); + + it("get balanceOf", async function () { + expect(await pointer.balanceOf(admin.evmAddress)).to.equal(1000000) + expect(await pointer.balanceOf(accounts[0].evmAddress)).to.equal(2000000); + expect(await pointer.balanceOf(accounts[1].evmAddress)).to.equal(3000000); + }); + + it("get totalSupply", async function () { + expect(await pointer.totalSupply()).to.equal(6000000); + }); + + it("get allowance", async function () { + expect(await pointer.allowance(accounts[0].evmAddress, accounts[1].evmAddress)).to.equal(0); + }); + }) + + describe("transfer()", function () { + it("should transfer", async function () { + let sender = accounts[0]; + let recipient = accounts[1]; + + expect(await pointer.balanceOf(sender.evmAddress)).to.equal(2000000); + expect(await pointer.balanceOf(recipient.evmAddress)).to.equal(3000000); + + const tx = await pointer.transfer(recipient.evmAddress, 1); + await tx.wait(); + + expect(await pointer.balanceOf(sender.evmAddress)).to.equal(1999999); + expect(await pointer.balanceOf(recipient.evmAddress)).to.equal(3000001); + + const cleanupTx = await pointer.connect(recipient.signer).transfer(sender.evmAddress, 1) + await cleanupTx.wait(); + }); + + it("should fail transfer() if sender has insufficient balance", async function () { + const recipient = accounts[1]; + await expect(pointer.transfer(recipient.evmAddress, 20000000)).to.be.revertedWith("CosmWasm execute failed"); + }); + + it("transfer to unassociated address should fail", async function() { + const unassociatedRecipient = "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266"; + await expect(pointer.transfer(unassociatedRecipient, 1)).to.be.revertedWithoutReason; + }); + + it("transfer to contract address should succeed", async function() { + const contract = await pointer.getAddress(); + const tx = await pointer.transfer(contract, 1); + await tx.wait(); + }); + }); + + describe("approve()", function () { + it("should approve", async function () { + const owner = accounts[0].evmAddress; + const spender = accounts[1].evmAddress; + const tx = await pointer.approve(spender, 1000000); + await tx.wait(); + const allowance = await pointer.allowance(owner, spender); + expect(Number(allowance)).to.equal(1000000); + }); + + it("should lower approval", async function () { + const owner = accounts[0].evmAddress; + const spender = accounts[1].evmAddress; + const tx = await pointer.approve(spender, 0); + await tx.wait(); + const allowance = await pointer.allowance(owner, spender); + expect(Number(allowance)).to.equal(0); + }); + }); + + + describe("transferFrom()", function () { + it("should transferFrom", async function () { + const recipient = admin; + const owner = accounts[0]; + const spender = accounts[1]; + const amountToTransfer = 10; + + // capture balances before + const recipientBalanceBefore = await pointer.balanceOf(recipient.evmAddress); + const ownerBalanceBefore = await pointer.balanceOf(owner.evmAddress); + expect(Number(ownerBalanceBefore)).to.be.greaterThanOrEqual(amountToTransfer); + + // approve the amount + const tx = await pointer.approve(spender.evmAddress, amountToTransfer); + await tx.wait(); + const allowanceBefore = await pointer.allowance(owner.evmAddress, spender.evmAddress); + expect(Number(allowanceBefore)).to.be.greaterThanOrEqual(amountToTransfer); + + // transfer + const tfTx = await pointer.connect(spender.signer).transferFrom(owner.evmAddress, recipient.evmAddress, amountToTransfer); + const receipt = await tfTx.wait(); + + // capture balances after + const recipientBalanceAfter = await pointer.balanceOf(recipient.evmAddress); + const ownerBalanceAfter = await pointer.balanceOf(owner.evmAddress); + + // check balance diff to ensure transfer went through + const diff = recipientBalanceAfter - recipientBalanceBefore; + expect(diff).to.equal(amountToTransfer); + + // check balanceOf sender (deployerAddr) to ensure it went down + const diff2 = ownerBalanceBefore - ownerBalanceAfter; + expect(diff2).to.equal(amountToTransfer); + + // check that allowance has gone down by amountToTransfer + const allowanceAfter = await pointer.allowance(owner.evmAddress, spender.evmAddress); + expect(Number(allowanceBefore) - Number(allowanceAfter)).to.equal(amountToTransfer); + }); + + it("should fail transferFrom() if sender has insufficient balance", async function () { + const recipient = admin; + const owner = accounts[0]; + const spender = accounts[1]; + + const tx = await pointer.approve(spender.evmAddress, 999999999); + await tx.wait(); + + await expect(pointer.connect(spender.signer).transferFrom(owner.evmAddress, recipient.evmAddress, 999999999)).to.be.revertedWith("CosmWasm execute failed"); + }); + + it("should fail transferFrom() if allowance is too low", async function () { + const recipient = admin; + const owner = accounts[0]; + const spender = accounts[1]; + + const tx = await pointer.approve(spender.evmAddress, 10); + await tx.wait(); + + await expect(pointer.connect(spender.signer).transferFrom(owner.evmAddress, recipient.evmAddress, 20)).to.be.revertedWith("CosmWasm execute failed"); + + await (await pointer.approve(spender.evmAddress, 0)).wait() + }); + }); + + describe("upgrade behavior", function () { + + before(async function(){ + const enabled = await testAPIEnabled(ethers.provider) + if(!enabled) { + this.skip() + } + }) + + it("upgrade without version update not allowed", async function () { + try { + await deployErc20PointerForCw20(hre.ethers.provider, cw20Address) + expect.fail("Expected to be prevented from creating a pointer"); + } catch (e) { + expect(e.message).to.equal("contract deployment failed"); + } + }) + + describe("with upgrade", function(){ + let newPointer; + + before(async function(){ + await incrementPointerVersion(ethers.provider, "cw20", 1) + + // deploy a new pointer, now that the version has been incremented + const pointerAddr = await deployErc20PointerForCw20(ethers.provider, cw20Address) + const contract = new hre.ethers.Contract(pointerAddr, ABI.ERC20, hre.ethers.provider); + newPointer = contract.connect(accounts[0].signer) + }) + + it ("should have the correct balance", async function(){ + expect(await pointer.balanceOf(admin.evmAddress)).to.equal(1000010) + expect(await pointer.balanceOf(accounts[0].evmAddress)).to.equal(1999989); + expect(await pointer.balanceOf(accounts[1].evmAddress)).to.equal(3000000); + expect(await newPointer.balanceOf(admin.evmAddress)).to.equal(1000010) + expect(await newPointer.balanceOf(accounts[0].evmAddress)).to.equal(1999989); + expect(await newPointer.balanceOf(accounts[1].evmAddress)).to.equal(3000000); + }) + + }) + + }) +}) \ No newline at end of file diff --git a/contracts/test/ERC20toCW20PointerTest.js b/contracts/test/ERC20toCW20PointerTest.js index a87bb6c44..d54f5507f 100644 --- a/contracts/test/ERC20toCW20PointerTest.js +++ b/contracts/test/ERC20toCW20PointerTest.js @@ -1,16 +1,17 @@ -const {setupSigners, deployErc20PointerForCw20, getAdmin, deployWasm, WASM, ABI, registerPointerForCw20 +const { + setupSigners, deployErc20PointerForCw20, getAdmin, deployWasm, WASM, ABI, registerPointerForCw20, testAPIEnabled, + incrementPointerVersion } = require("./lib"); -const {expect} = require("chai"); +const { expect } = require("chai"); describe("ERC20 to CW20 Pointer", function () { let accounts; - let pointer; - let cw20Address; let admin; + let cw20Address; before(async function () { - accounts = await setupSigners(await hre.ethers.getSigners()) - admin = await getAdmin() + accounts = await setupSigners(await hre.ethers.getSigners()); + admin = await getAdmin(); cw20Address = await deployWasm(WASM.CW20, accounts[0].seiAddress, "cw20", { name: "Test", @@ -18,177 +19,249 @@ describe("ERC20 to CW20 Pointer", function () { decimals: 6, initial_balances: [ { address: admin.seiAddress, amount: "1000000" }, - { address: accounts[0].seiAddress, amount: "2000000"}, - { address: accounts[1].seiAddress, amount: "3000000"} + { address: accounts[0].seiAddress, amount: "2000000" }, + { address: accounts[1].seiAddress, amount: "3000000" } ], mint: { "minter": admin.seiAddress, "cap": "99900000000" } - }) - - // deploy TestToken - const pointerAddr = await deployErc20PointerForCw20(hre.ethers.provider, cw20Address) - const contract = new hre.ethers.Contract(pointerAddr, ABI.ERC20, hre.ethers.provider); - pointer = contract.connect(accounts[0].signer) - }) - - describe("validation", function(){ - it("should not allow a pointer to the pointer", async function(){ - try { - await registerPointerForCw20(await pointer.getAddress()) - expect.fail(`Expected to be prevented from creating a pointer`); - } catch(e){ - expect(e.message).to.include("contract deployment failed"); - } - }) - }) - - describe("read", function(){ - it("get name", async function () { - const name = await pointer.name(); - expect(name).to.equal("Test"); - }); - - it("get symbol", async function () { - const symbol = await pointer.symbol(); - expect(symbol).to.equal("TEST"); }); + }); - it("get decimals", async function () { - const decimals = await pointer.decimals(); - expect(Number(decimals)).to.equal(6); + async function setupPointer() { + const pointerAddr = await deployErc20PointerForCw20(hre.ethers.provider, cw20Address); + const contract = new hre.ethers.Contract(pointerAddr, ABI.ERC20, hre.ethers.provider); + return contract.connect(accounts[0].signer); + } + + function testPointer(getPointer, balances) { + describe("pointer functions", function () { + let pointer; + + beforeEach(async function () { + pointer = await getPointer(); + }); + + describe("validation", function () { + it("should not allow a pointer to the pointer", async function () { + try { + await registerPointerForCw20(await pointer.getAddress()); + expect.fail(`Expected to be prevented from creating a pointer`); + } catch (e) { + expect(e.message).to.include("contract deployment failed"); + } + }); + }); + + describe("read", function () { + it("get name", async function () { + const name = await pointer.name(); + expect(name).to.equal("Test"); + }); + + it("get symbol", async function () { + const symbol = await pointer.symbol(); + expect(symbol).to.equal("TEST"); + }); + + it("get decimals", async function () { + const decimals = await pointer.decimals(); + expect(Number(decimals)).to.equal(6); + }); + + it("get balanceOf", async function () { + expect(await pointer.balanceOf(admin.evmAddress)).to.equal(balances.admin); + expect(await pointer.balanceOf(accounts[0].evmAddress)).to.equal(balances.account0); + expect(await pointer.balanceOf(accounts[1].evmAddress)).to.equal(balances.account1); + }); + + it("get totalSupply", async function () { + expect(await pointer.totalSupply()).to.equal(6000000); + }); + + it("get allowance", async function () { + expect(await pointer.allowance(accounts[0].evmAddress, accounts[1].evmAddress)).to.equal(0); + }); + }); + + describe("transfer()", function () { + it("should transfer", async function () { + let sender = accounts[0]; + let recipient = accounts[1]; + + expect(await pointer.balanceOf(sender.evmAddress)).to.equal(balances.account0); + expect(await pointer.balanceOf(recipient.evmAddress)).to.equal(balances.account1); + + const tx = await pointer.transfer(recipient.evmAddress, 1); + await tx.wait(); + + expect(await pointer.balanceOf(sender.evmAddress)).to.equal(balances.account0-1); + expect(await pointer.balanceOf(recipient.evmAddress)).to.equal(balances.account1+1); + + const cleanupTx = await pointer.connect(recipient.signer).transfer(sender.evmAddress, 1); + await cleanupTx.wait(); + }); + + it("should fail transfer() if sender has insufficient balance", async function () { + const recipient = accounts[1]; + await expect(pointer.transfer(recipient.evmAddress, balances.account0*10)).to.be.revertedWith("CosmWasm execute failed"); + }); + + it("transfer to unassociated address should fail", async function () { + const unassociatedRecipient = "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266"; + await expect(pointer.transfer(unassociatedRecipient, 1)).to.be.revertedWithoutReason; + }); + + it("transfer to contract address should succeed", async function () { + const contract = await pointer.getAddress(); + const tx = await pointer.transfer(contract, 1); + await tx.wait(); + }); + }); + + describe("approve()", function () { + it("should approve", async function () { + const owner = accounts[0].evmAddress; + const spender = accounts[1].evmAddress; + const tx = await pointer.approve(spender, 1000000); + await tx.wait(); + const allowance = await pointer.allowance(owner, spender); + expect(Number(allowance)).to.equal(1000000); + }); + + it("should lower approval", async function () { + const owner = accounts[0].evmAddress; + const spender = accounts[1].evmAddress; + const tx = await pointer.approve(spender, 0); + await tx.wait(); + const allowance = await pointer.allowance(owner, spender); + expect(Number(allowance)).to.equal(0); + }); + }); + + describe("transferFrom()", function () { + it("should transferFrom", async function () { + const recipient = admin; + const owner = accounts[0]; + const spender = accounts[1]; + const amountToTransfer = 10; + + // capture balances before + const recipientBalanceBefore = await pointer.balanceOf(recipient.evmAddress); + const ownerBalanceBefore = await pointer.balanceOf(owner.evmAddress); + expect(Number(ownerBalanceBefore)).to.be.greaterThanOrEqual(amountToTransfer); + + // approve the amount + const tx = await pointer.approve(spender.evmAddress, amountToTransfer); + await tx.wait(); + const allowanceBefore = await pointer.allowance(owner.evmAddress, spender.evmAddress); + expect(Number(allowanceBefore)).to.be.greaterThanOrEqual(amountToTransfer); + + // transfer + const tfTx = await pointer.connect(spender.signer).transferFrom(owner.evmAddress, recipient.evmAddress, amountToTransfer); + const receipt = await tfTx.wait(); + + // capture balances after + const recipientBalanceAfter = await pointer.balanceOf(recipient.evmAddress); + const ownerBalanceAfter = await pointer.balanceOf(owner.evmAddress); + + // check balance diff to ensure transfer went through + const diff = recipientBalanceAfter - recipientBalanceBefore; + expect(diff).to.equal(amountToTransfer); + + // check balanceOf sender (deployerAddr) to ensure it went down + const diff2 = ownerBalanceBefore - ownerBalanceAfter; + expect(diff2).to.equal(amountToTransfer); + + // check that allowance has gone down by amountToTransfer + const allowanceAfter = await pointer.allowance(owner.evmAddress, spender.evmAddress); + expect(Number(allowanceBefore) - Number(allowanceAfter)).to.equal(amountToTransfer); + }); + + it("should fail transferFrom() if sender has insufficient balance", async function () { + const recipient = admin; + const owner = accounts[0]; + const spender = accounts[1]; + + const tx = await pointer.approve(spender.evmAddress, 999999999); + await tx.wait(); + + await expect(pointer.connect(spender.signer).transferFrom(owner.evmAddress, recipient.evmAddress, 999999999)).to.be.revertedWith("CosmWasm execute failed"); + }); + + it("should fail transferFrom() if allowance is too low", async function () { + const recipient = admin; + const owner = accounts[0]; + const spender = accounts[1]; + + const tx = await pointer.approve(spender.evmAddress, 10); + await tx.wait(); + + await expect(pointer.connect(spender.signer).transferFrom(owner.evmAddress, recipient.evmAddress, 20)).to.be.revertedWith("CosmWasm execute failed"); + // put it back + await (await pointer.approve(spender.evmAddress, 0)).wait() + }); + }); }); + } - it("get balanceOf", async function () { - expect(await pointer.balanceOf(admin.evmAddress)).to.equal(1000000) - expect(await pointer.balanceOf(accounts[0].evmAddress)).to.equal(2000000); - expect(await pointer.balanceOf(accounts[1].evmAddress)).to.equal(3000000); - }); + describe("Pointer Functionality", function () { + let pointer; - it("get totalSupply", async function () { - expect(await pointer.totalSupply()).to.equal(6000000); + before(async function () { + pointer = await setupPointer(); }); - it("get allowance", async function () { - expect(await pointer.allowance(accounts[0].evmAddress, accounts[1].evmAddress)).to.equal(0); + // verify pointer + testPointer(() => pointer, { + admin: 1000000, + account0: 2000000, + account1: 3000000 }); - }) - describe("transfer()", function () { - it("should transfer", async function () { - let sender = accounts[0]; - let recipient = accounts[1]; + describe("Pointer Upgrade", function () { + let newPointer; - expect(await pointer.balanceOf(sender.evmAddress)).to.equal(2000000); - expect(await pointer.balanceOf(recipient.evmAddress)).to.equal(3000000); + before(async function () { + const enabled = await testAPIEnabled(ethers.provider); + if (!enabled) { + this.skip(); + } - const tx = await pointer.transfer(recipient.evmAddress, 1); - await tx.wait(); + await incrementPointerVersion(ethers.provider, "cw20", 1); - expect(await pointer.balanceOf(sender.evmAddress)).to.equal(1999999); - expect(await pointer.balanceOf(recipient.evmAddress)).to.equal(3000001); - - const cleanupTx = await pointer.connect(recipient.signer).transfer(sender.evmAddress, 1) - await cleanupTx.wait(); - }); + const pointerAddr = await deployErc20PointerForCw20(hre.ethers.provider, cw20Address); + const contract = new hre.ethers.Contract(pointerAddr, ABI.ERC20, hre.ethers.provider); + newPointer = contract.connect(accounts[0].signer); + }); - it("should fail transfer() if sender has insufficient balance", async function () { - const recipient = accounts[1]; - await expect(pointer.transfer(recipient.evmAddress, 20000000)).to.be.revertedWith("CosmWasm execute failed"); - }); + // verify new pointer + testPointer(() => newPointer, { + admin: 1000010, + account0: 1999989, + account1: 3000000 + }); - it("transfer to unassociated address should fail", async function() { - const unassociatedRecipient = "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266"; - await expect(pointer.transfer(unassociatedRecipient, 1)).to.be.revertedWithoutReason; }); - it("transfer to contract address should succeed", async function() { - const contract = await pointer.getAddress(); - const tx = await pointer.transfer(contract, 1); - await tx.wait(); - }); + // this does not yet pass, so skip + describe.skip("Original Pointer after Upgrade", function(){ + + before(async function () { + const enabled = await testAPIEnabled(ethers.provider); + if (!enabled) { + this.skip(); + } + }); + + // original pointer + testPointer(() => pointer, { + admin: 1000020, + account0: 1999978, + account1: 3000000 + }); + }) }); - describe("approve()", function () { - it("should approve", async function () { - const owner = accounts[0].evmAddress; - const spender = accounts[1].evmAddress; - const tx = await pointer.approve(spender, 1000000); - await tx.wait(); - const allowance = await pointer.allowance(owner, spender); - expect(Number(allowance)).to.equal(1000000); - }); - - it("should lower approval", async function () { - const owner = accounts[0].evmAddress; - const spender = accounts[1].evmAddress; - const tx = await pointer.approve(spender, 0); - await tx.wait(); - const allowance = await pointer.allowance(owner, spender); - expect(Number(allowance)).to.equal(0); - }); }); - - describe("transferFrom()", function () { - it("should transferFrom", async function () { - const recipient = admin; - const owner = accounts[0]; - const spender = accounts[1]; - const amountToTransfer = 10; - - // capture balances before - const recipientBalanceBefore = await pointer.balanceOf(recipient.evmAddress); - const ownerBalanceBefore = await pointer.balanceOf(owner.evmAddress); - expect(Number(ownerBalanceBefore)).to.be.greaterThanOrEqual(amountToTransfer); - - // approve the amount - const tx = await pointer.approve(spender.evmAddress, amountToTransfer); - await tx.wait(); - const allowanceBefore = await pointer.allowance(owner.evmAddress, spender.evmAddress); - expect(Number(allowanceBefore)).to.be.greaterThanOrEqual(amountToTransfer); - - // transfer - const tfTx = await pointer.connect(spender.signer).transferFrom(owner.evmAddress, recipient.evmAddress, amountToTransfer); - const receipt = await tfTx.wait(); - - // capture balances after - const recipientBalanceAfter = await pointer.balanceOf(recipient.evmAddress); - const ownerBalanceAfter = await pointer.balanceOf(owner.evmAddress); - - // check balance diff to ensure transfer went through - const diff = recipientBalanceAfter - recipientBalanceBefore; - expect(diff).to.equal(amountToTransfer); - - // check balanceOf sender (deployerAddr) to ensure it went down - const diff2 = ownerBalanceBefore - ownerBalanceAfter; - expect(diff2).to.equal(amountToTransfer); - - // check that allowance has gone down by amountToTransfer - const allowanceAfter = await pointer.allowance(owner.evmAddress, spender.evmAddress); - expect(Number(allowanceBefore) - Number(allowanceAfter)).to.equal(amountToTransfer); - }); - - it("should fail transferFrom() if sender has insufficient balance", async function () { - const recipient = admin; - const owner = accounts[0]; - const spender = accounts[1]; - - const tx = await pointer.approve(spender.evmAddress, 999999999); - await tx.wait(); - - await expect(pointer.connect(spender.signer).transferFrom(owner.evmAddress, recipient.evmAddress, 999999999)).to.be.revertedWith("CosmWasm execute failed"); - }); - - it("should fail transferFrom() if allowance is too low", async function () { - const recipient = admin; - const owner = accounts[0]; - const spender = accounts[1]; - - const tx = await pointer.approve(spender.evmAddress, 10); - await tx.wait(); - - await expect(pointer.connect(spender.signer).transferFrom(owner.evmAddress, recipient.evmAddress, 20)).to.be.revertedWith("CosmWasm execute failed"); - }); - }); -}) \ No newline at end of file diff --git a/contracts/test/lib.js b/contracts/test/lib.js index 84366045a..6ef62fc7c 100644 --- a/contracts/test/lib.js +++ b/contracts/test/lib.js @@ -138,6 +138,32 @@ function getEventAttribute(response, type, attribute) { throw new Error("attribute not found") } +async function testAPIEnabled(provider) { + try { + // noop operation to see if it throws + await incrementPointerVersion(provider, "cw20", 0) + return true; + } catch(e){ + console.log(e) + return false; + } +} + +async function incrementPointerVersion(provider, pointerType, offset) { + if(await isDocker()) { + // must update on all nodes + for(let i=0; i<4; i++) { + const resultStr = await execCommand(`docker exec sei-node-${i} curl -s -X POST http://localhost:8545 -H "Content-Type: application/json" -d '{"jsonrpc":"2.0","method":"test_incrementPointerVersion","params":["${pointerType}", ${offset}],"id":1}'`) + const result = JSON.parse(resultStr) + if(result.error){ + throw new Error(`failed to increment pointer version: ${result.error}`) + } + } + } else { + await provider.send("test_incrementPointerVersion", [pointerType, offset]); + } +} + async function createTokenFactoryTokenAndMint(name, amount, recipient) { const command = `seid tx tokenfactory create-denom ${name} --from ${adminKeyName} --gas=5000000 --fees=1000000usei -y --broadcast-mode block -o json` const output = await execute(command); @@ -393,6 +419,8 @@ module.exports = { evmSend, waitForReceipt, isDocker, + testAPIEnabled, + incrementPointerVersion, WASM, ABI, }; diff --git a/docker/localnode/config/app.toml b/docker/localnode/config/app.toml index b9bf48fa3..a11c0c2d8 100644 --- a/docker/localnode/config/app.toml +++ b/docker/localnode/config/app.toml @@ -263,3 +263,8 @@ ss-prune-interval = 60 # ImportNumWorkers defines the concurrency for state sync import # defaults to 1 ss-import-num-workers = 1 + +[evm] + +# EnableTestAPI enables the EVM test API +enable_test_api = true \ No newline at end of file diff --git a/docker/rpcnode/config/app.toml b/docker/rpcnode/config/app.toml index ce4a0569a..c930b798a 100644 --- a/docker/rpcnode/config/app.toml +++ b/docker/rpcnode/config/app.toml @@ -260,4 +260,9 @@ ss-prune-interval = 60 # ImportNumWorkers defines the concurrency for state sync import # defaults to 1 -ss-import-num-workers = 1 \ No newline at end of file +ss-import-num-workers = 1 + +[evm] + +# EnableTestAPI enables the EVM test API +enable_test_api = true \ No newline at end of file diff --git a/evmrpc/config.go b/evmrpc/config.go index 00e2a2725..2ce7ed4a9 100644 --- a/evmrpc/config.go +++ b/evmrpc/config.go @@ -82,6 +82,9 @@ type Config struct { // max number of concurrent NewHead subscriptions MaxSubscriptionsNewHead uint64 `mapstructure:"max_subscriptions_new_head"` + + // test api enables certain override apis for integration test situations + EnableTestAPI bool `mapstructure:"enable_test_api"` } var DefaultConfig = Config{ @@ -105,6 +108,7 @@ var DefaultConfig = Config{ MaxLogNoBlock: 10000, MaxBlocksForLog: 2000, MaxSubscriptionsNewHead: 10000, + EnableTestAPI: false, } const ( @@ -128,6 +132,7 @@ const ( flagMaxLogNoBlock = "evm.max_log_no_block" flagMaxBlocksForLog = "evm.max_blocks_for_log" flagMaxSubscriptionsNewHead = "evm.max_subscriptions_new_head" + flagEnableTestAPI = "evm.enable_test_api" ) func ReadConfig(opts servertypes.AppOptions) (Config, error) { @@ -233,5 +238,10 @@ func ReadConfig(opts servertypes.AppOptions) (Config, error) { return cfg, err } } + if v := opts.Get(flagEnableTestAPI); v != nil { + if cfg.EnableTestAPI, err = cast.ToBoolE(v); err != nil { + return cfg, err + } + } return cfg, nil } diff --git a/evmrpc/config_test.go b/evmrpc/config_test.go index 6cc99b370..4035d72bb 100644 --- a/evmrpc/config_test.go +++ b/evmrpc/config_test.go @@ -29,6 +29,7 @@ type opts struct { maxLogNoBlock interface{} maxBlocksForLog interface{} maxSubscriptionsNewHead interface{} + enableTestAPI interface{} } func (o *opts) Get(k string) interface{} { @@ -92,6 +93,9 @@ func (o *opts) Get(k string) interface{} { if k == "evm.max_subscriptions_new_head" { return o.maxSubscriptionsNewHead } + if k == "evm.enable_test_api" { + return o.enableTestAPI + } panic("unknown key") } @@ -117,6 +121,7 @@ func TestReadConfig(t *testing.T) { 20000, 1000, 10000, + false, } _, err := evmrpc.ReadConfig(&goodOpts) require.Nil(t, err) diff --git a/evmrpc/server.go b/evmrpc/server.go index 5e41e1fb6..11c1ba672 100644 --- a/evmrpc/server.go +++ b/evmrpc/server.go @@ -6,6 +6,7 @@ import ( "github.com/cosmos/cosmos-sdk/client" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/ethereum/go-ethereum/rpc" + evmCfg "github.com/sei-protocol/sei-chain/x/evm/config" "github.com/sei-protocol/sei-chain/x/evm/keeper" "github.com/tendermint/tendermint/libs/log" rpcclient "github.com/tendermint/tendermint/rpc/client" @@ -42,6 +43,8 @@ func NewEVMHTTPServer( } simulateConfig := &SimulateConfig{GasCap: config.SimulationGasLimit, EVMTimeout: config.SimulationEVMTimeout} sendAPI := NewSendAPI(tmClient, txConfig, &SendConfig{slow: config.Slow}, k, ctxProvider, homeDir, simulateConfig, ConnectionTypeHTTP) + ctx := ctxProvider(LatestCtxHeight) + apis := []rpc.API{ { Namespace: "echo", @@ -96,6 +99,17 @@ func NewEVMHTTPServer( Service: NewDebugAPI(tmClient, k, ctxProvider, txConfig.TxDecoder(), simulateConfig, ConnectionTypeHTTP), }, } + // Test API can only exist on non-live chain IDs. These APIs instrument certain overrides. + if config.EnableTestAPI && !evmCfg.IsLiveChainID(ctx) { + logger.Info("Enabling Test EVM APIs") + apis = append(apis, rpc.API{ + Namespace: "test", + Service: NewTestAPI(), + }) + } else { + logger.Info("Disabling Test EVM APIs", "liveChainID", evmCfg.IsLiveChainID(ctx), "enableTestAPI", config.EnableTestAPI) + } + if err := httpServer.EnableRPC(apis, HTTPConfig{ CorsAllowedOrigins: strings.Split(config.CORSOrigins, ","), Vhosts: []string{"*"}, diff --git a/evmrpc/test.go b/evmrpc/test.go new file mode 100644 index 000000000..db9607539 --- /dev/null +++ b/evmrpc/test.go @@ -0,0 +1,23 @@ +package evmrpc + +import ( + "errors" + + "github.com/sei-protocol/sei-chain/x/evm/artifacts/cw20" +) + +type TestAPI struct{} + +func NewTestAPI() *TestAPI { + return &TestAPI{} +} + +func (a *TestAPI) IncrementPointerVersion(pointerType string, offset int16) error { + switch pointerType { + case "cw20": + cw20.SetVersionWithOffset(offset) + default: + return errors.New("invalid pointer type") + } + return nil +} diff --git a/precompiles/pointer/pointer.go b/precompiles/pointer/pointer.go index 2dfe52c4c..0dee4207c 100644 --- a/precompiles/pointer/pointer.go +++ b/precompiles/pointer/pointer.go @@ -199,8 +199,8 @@ func (p Precompile) AddCW20(ctx sdk.Context, method *ethabi.Method, caller commo } cwAddr := args[0].(string) existingAddr, existingVersion, exists := p.evmKeeper.GetERC20CW20Pointer(ctx, cwAddr) - if exists && existingVersion >= cw20.CurrentVersion { - return nil, 0, fmt.Errorf("pointer at %s with version %d exists when trying to set pointer for version %d", existingAddr.Hex(), existingVersion, cw20.CurrentVersion) + if exists && existingVersion >= cw20.CurrentVersion(ctx) { + return nil, 0, fmt.Errorf("pointer at %s with version %d exists when trying to set pointer for version %d", existingAddr.Hex(), existingVersion, cw20.CurrentVersion(ctx)) } cwAddress, err := sdk.AccAddressFromBech32(cwAddr) if err != nil { @@ -239,7 +239,7 @@ func (p Precompile) AddCW20(ctx sdk.Context, method *ethabi.Method, caller commo ctx.EventManager().EmitEvent(sdk.NewEvent( types.EventTypePointerRegistered, sdk.NewAttribute(types.AttributeKeyPointerType, "cw20"), sdk.NewAttribute(types.AttributeKeyPointerAddress, contractAddr.Hex()), sdk.NewAttribute(types.AttributeKeyPointee, cwAddr), - sdk.NewAttribute(types.AttributeKeyPointerVersion, fmt.Sprintf("%d", cw20.CurrentVersion)))) + sdk.NewAttribute(types.AttributeKeyPointerVersion, fmt.Sprintf("%d", cw20.CurrentVersion(ctx))))) ret, err = method.Outputs.Pack(contractAddr) return } diff --git a/precompiles/pointerview/pointerview_test.go b/precompiles/pointerview/pointerview_test.go index ad6d28bff..a520878c4 100644 --- a/precompiles/pointerview/pointerview_test.go +++ b/precompiles/pointerview/pointerview_test.go @@ -42,7 +42,7 @@ func TestPointerView(t *testing.T) { outputs, err = m.Outputs.Unpack(ret) require.Nil(t, err) require.Equal(t, pointer, outputs[0].(common.Address)) - require.Equal(t, cw20.CurrentVersion, outputs[1].(uint16)) + require.Equal(t, cw20.CurrentVersion(ctx), outputs[1].(uint16)) require.True(t, outputs[2].(bool)) ret, err = p.GetCW20(ctx, m, []interface{}{"test2"}) require.Nil(t, err) diff --git a/x/evm/artifacts/cw20/artifacts.go b/x/evm/artifacts/cw20/artifacts.go index 073971723..838c3ceb2 100644 --- a/x/evm/artifacts/cw20/artifacts.go +++ b/x/evm/artifacts/cw20/artifacts.go @@ -7,10 +7,25 @@ import ( "fmt" "strings" + sdk "github.com/cosmos/cosmos-sdk/types" "github.com/ethereum/go-ethereum/accounts/abi" + + "github.com/sei-protocol/sei-chain/x/evm/config" ) -const CurrentVersion uint16 = 1 +const currentVersion uint16 = 1 + +var versionOverride uint16 + +// SetVersionWithOffset allows for overriding the version for integration test scenarios +func SetVersionWithOffset(offset int16) { + // this allows for negative offsets to mock lower versions + versionOverride = uint16(int16(currentVersion) + offset) +} + +func CurrentVersion(ctx sdk.Context) uint16 { + return config.GetVersionWthDefault(ctx, versionOverride, currentVersion) +} //go:embed CW20ERC20Pointer.abi //go:embed CW20ERC20Pointer.bin diff --git a/x/evm/config/config.go b/x/evm/config/config.go index c0535da0f..4913571a0 100644 --- a/x/evm/config/config.go +++ b/x/evm/config/config.go @@ -1,6 +1,10 @@ package config -import "math/big" +import ( + "math/big" + + sdk "github.com/cosmos/cosmos-sdk/types" +) const DefaultChainID = int64(713715) @@ -19,3 +23,17 @@ func GetEVMChainID(cosmosChainID string) *big.Int { } return big.NewInt(DefaultChainID) } + +func GetVersionWthDefault(ctx sdk.Context, override uint16, defaultVersion uint16) uint16 { + // overrides are only available on non-live chain IDs + if override > 0 && !IsLiveChainID(ctx) { + return override + } + return defaultVersion +} + +// IsLiveChainID return true if one of the live chainIDs +func IsLiveChainID(ctx sdk.Context) bool { + _, ok := ChainIDMapping[ctx.ChainID()] + return ok +} diff --git a/x/evm/keeper/grpc_query.go b/x/evm/keeper/grpc_query.go index 9fc3da36c..095f2c3c1 100644 --- a/x/evm/keeper/grpc_query.go +++ b/x/evm/keeper/grpc_query.go @@ -126,7 +126,7 @@ func (q Querier) PointerVersion(c context.Context, req *types.QueryPointerVersio }, nil case types.PointerType_CW20: return &types.QueryPointerVersionResponse{ - Version: uint32(cw20.CurrentVersion), + Version: uint32(cw20.CurrentVersion(ctx)), }, nil case types.PointerType_CW721: return &types.QueryPointerVersionResponse{ diff --git a/x/evm/keeper/grpc_query_test.go b/x/evm/keeper/grpc_query_test.go index 5df048043..30c26af00 100644 --- a/x/evm/keeper/grpc_query_test.go +++ b/x/evm/keeper/grpc_query_test.go @@ -34,7 +34,7 @@ func TestQueryPointer(t *testing.T) { require.Equal(t, types.QueryPointerResponse{Pointer: evmAddr1.Hex(), Version: uint32(native.CurrentVersion), Exists: true}, *res) res, err = q.Pointer(goCtx, &types.QueryPointerRequest{PointerType: types.PointerType_CW20, Pointee: seiAddr2.String()}) require.Nil(t, err) - require.Equal(t, types.QueryPointerResponse{Pointer: evmAddr2.Hex(), Version: uint32(cw20.CurrentVersion), Exists: true}, *res) + require.Equal(t, types.QueryPointerResponse{Pointer: evmAddr2.Hex(), Version: uint32(cw20.CurrentVersion(ctx)), Exists: true}, *res) res, err = q.Pointer(goCtx, &types.QueryPointerRequest{PointerType: types.PointerType_CW721, Pointee: seiAddr3.String()}) require.Nil(t, err) require.Equal(t, types.QueryPointerResponse{Pointer: evmAddr3.Hex(), Version: uint32(cw721.CurrentVersion), Exists: true}, *res) diff --git a/x/evm/keeper/pointer.go b/x/evm/keeper/pointer.go index 58f175304..b3cf5372e 100644 --- a/x/evm/keeper/pointer.go +++ b/x/evm/keeper/pointer.go @@ -57,7 +57,7 @@ func (k *Keeper) DeleteERC20NativePointer(ctx sdk.Context, token string, version // ERC20 -> CW20 func (k *Keeper) SetERC20CW20Pointer(ctx sdk.Context, cw20Address string, addr common.Address) error { - return k.SetERC20CW20PointerWithVersion(ctx, cw20Address, addr, cw20.CurrentVersion) + return k.SetERC20CW20PointerWithVersion(ctx, cw20Address, addr, cw20.CurrentVersion(ctx)) } // ERC20 -> CW20 diff --git a/x/evm/keeper/pointer_test.go b/x/evm/keeper/pointer_test.go index b44fde796..3563ebeeb 100644 --- a/x/evm/keeper/pointer_test.go +++ b/x/evm/keeper/pointer_test.go @@ -31,6 +31,8 @@ type seiPointerTest struct { } func TestEVMtoCWPointers(t *testing.T) { + _, ctx := testkeeper.MockEVMKeeper() + tests := []seiPointerTest{ { name: "ERC20NativePointer prevents pointer to cw20 pointer", @@ -69,7 +71,7 @@ func TestEVMtoCWPointers(t *testing.T) { cwGetter: k.GetCW721ERC721Pointer, } }, - version: cw20.CurrentVersion, + version: cw20.CurrentVersion(ctx), }, { name: "ERC20CW20Pointer prevents pointer to cw20 pointer", @@ -82,7 +84,7 @@ func TestEVMtoCWPointers(t *testing.T) { cwGetter: k.GetCW20ERC20Pointer, } }, - version: cw20.CurrentVersion, + version: cw20.CurrentVersion(ctx), }, { name: "ERC721CW721Pointer prevents pointer to cw721 pointer", From 3be49781f0f1df5be25f843b5f295061d51e5c43 Mon Sep 17 00:00:00 2001 From: codchen Date: Wed, 15 May 2024 22:49:21 +0800 Subject: [PATCH 39/51] Support ERC/CW2981 in pointer contracts (#1669) * Support ERC/CW2981 in pointer contracts * integration tests --- contracts/src/CW721ERC721Pointer.sol | 32 +- contracts/wasm/cw2981_royalties.wasm | Bin 0 -> 357328 bytes example/contracts/README | 2 +- example/contracts/erc2981/ERC2981Example.abi | 1 + example/contracts/erc2981/ERC2981Example.bin | 1 + example/contracts/erc2981/ERC2981Example.sol | 25 + example/contracts/erc2981/erc2981.go | 1065 +++++++++++++++++ example/cosmwasm/cw721/Cargo.lock | 151 ++- example/cosmwasm/cw721/Cargo.toml | 2 + .../cosmwasm/cw721/artifacts/checksums.txt | 2 +- .../cosmwasm/cw721/artifacts/cwerc721.wasm | Bin 256986 -> 295364 bytes example/cosmwasm/cw721/src/contract.rs | 63 +- example/cosmwasm/cw721/src/msg.rs | 26 +- example/cosmwasm/cw721/src/querier.rs | 40 +- .../price-feeder/oracle/provider/mexc_test.go | 2 + precompiles/json/json.go | 14 +- precompiles/pointer/pointer.go | 12 +- wasmbinding/queries.go | 6 + x/evm/artifacts/cw721/CW721ERC721Pointer.abi | 2 +- x/evm/artifacts/cw721/CW721ERC721Pointer.bin | 2 +- x/evm/artifacts/cw721/artifacts.go | 2 +- x/evm/artifacts/cw721/cw721.go | 40 +- x/evm/artifacts/erc721/artifacts.go | 2 +- x/evm/artifacts/erc721/cwerc721.wasm | Bin 256986 -> 295364 bytes x/evm/client/wasm/bindings/queries.go | 24 + x/evm/client/wasm/query.go | 70 ++ x/evm/integration_test.go | 242 ++++ x/evm/module_test.go | 2 +- 28 files changed, 1800 insertions(+), 30 deletions(-) create mode 100644 contracts/wasm/cw2981_royalties.wasm create mode 100644 example/contracts/erc2981/ERC2981Example.abi create mode 100644 example/contracts/erc2981/ERC2981Example.bin create mode 100644 example/contracts/erc2981/ERC2981Example.sol create mode 100644 example/contracts/erc2981/erc2981.go create mode 100644 x/evm/integration_test.go diff --git a/contracts/src/CW721ERC721Pointer.sol b/contracts/src/CW721ERC721Pointer.sol index 259a13573..9f4947486 100644 --- a/contracts/src/CW721ERC721Pointer.sol +++ b/contracts/src/CW721ERC721Pointer.sol @@ -1,14 +1,16 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; +import "@openzeppelin/contracts/token/common/ERC2981.sol"; import "@openzeppelin/contracts/token/ERC721/ERC721.sol"; import "@openzeppelin/contracts/token/ERC721/IERC721.sol"; import "@openzeppelin/contracts/utils/Strings.sol"; +import {IERC165} from "@openzeppelin/contracts/utils/introspection/IERC165.sol"; import {IWasmd} from "./precompiles/IWasmd.sol"; import {IJson} from "./precompiles/IJson.sol"; import {IAddr} from "./precompiles/IAddr.sol"; -contract CW721ERC721Pointer is ERC721 { +contract CW721ERC721Pointer is ERC721,ERC2981 { address constant WASMD_PRECOMPILE_ADDRESS = 0x0000000000000000000000000000000000001002; address constant JSON_PRECOMPILE_ADDRESS = 0x0000000000000000000000000000000000001003; @@ -26,6 +28,14 @@ contract CW721ERC721Pointer is ERC721 { Cw721Address = Cw721Address_; } + function supportsInterface(bytes4 interfaceId) public pure override(ERC721, ERC2981) returns (bool) { + return + interfaceId == type(IERC2981).interfaceId || + interfaceId == type(IERC165).interfaceId || + interfaceId == type(IERC721).interfaceId || + interfaceId == type(IERC721Metadata).interfaceId; + } + // Queries function balanceOf(address owner) public view override returns (uint256) { if (owner == address(0)) { @@ -82,6 +92,26 @@ contract CW721ERC721Pointer is ERC721 { return string(uri); } + // 2981 + function royaltyInfo(uint256 tokenId, uint256 salePrice) public view override returns (address, uint256) { + bytes memory checkRoyaltyResponse = WasmdPrecompile.query(Cw721Address, bytes("{\"extension\":{\"msg\":{\"check_royalties\":{}}}}")); + bytes memory isRoyaltyImplemented = JsonPrecompile.extractAsBytes(checkRoyaltyResponse, "royalty_payments"); + if (keccak256(isRoyaltyImplemented) != keccak256("true")) { + revert("royalty info not implemented on the underlying CosmWasm contract"); + } + string memory tId = _formatPayload("token_id", _doubleQuotes(Strings.toString(tokenId))); + string memory sPrice = _formatPayload("sale_price", _doubleQuotes(Strings.toString(salePrice))); + string memory req = _curlyBrace(_formatPayload("royalty_info", _curlyBrace(_join(tId, sPrice, ",")))); + string memory fullReq = _curlyBrace(_formatPayload("extension", _curlyBrace(_formatPayload("msg", req)))); + bytes memory response = WasmdPrecompile.query(Cw721Address, bytes(fullReq)); + bytes memory addr = JsonPrecompile.extractAsBytes(response, "address"); + uint256 amt = JsonPrecompile.extractAsUint256(response, "royalty_amount"); + if (addr.length == 0) { + return (address(0), amt); + } + return (AddrPrecompile.getEvmAddr(string(addr)), amt); + } + // Transactions function transferFrom(address from, address to, uint256 tokenId) public override { if (to == address(0)) { diff --git a/contracts/wasm/cw2981_royalties.wasm b/contracts/wasm/cw2981_royalties.wasm new file mode 100644 index 0000000000000000000000000000000000000000..d139847a1f553270e29d055252d597310c431317 GIT binary patch literal 357328 zcmeFa54>GhS?9g~od19BJ^9zBZ3_DwqTWdQ8l2ihWHkFu(-y%Gg_qB3hca(lXtYgA zDIs9>(`kcLs8S$6(JF`)7}}8*i@;a}G>&B~S~Ms~6~rhNixenY$Br^D@AvmSYwdH+ zz31LEB@jj>^zME3Uh7$FJ?nX%_553FCzrhV1!8H}uF3zsIF43R#x{LGcbg#es zsBz&}%71m;+C9%3_Jdzdzu~SG?zl~2X-X#i7YiA{Yp=aFfWP+QcC16CUUh$+N?6NO zsPjv|v+KN?{$8tobjRh@)47SC-0~#5mcQ9AWb^s%D_>f_KnK<_KXTIyz=tr^X4aZC#h6kS|DV-J!!O$6HI+0JhDqa$rYAJ@Qjn77S@UH6(xtSQQ)zDF zDM{Yo_gr?W4PZXY^Z8mcy(;}8|LS>~tZAH*Uze5#4jf9l*Cpi}Kl0mly+zmNYtl~R z1-oDH!hJuUC3T~e`(L<^ z;+=~wf_pBxX!n(u=4tn$i!R%J$yFCU?~)hq&a?Jg=y92LA51U&VEUo-IsfUoFH0|c zApfQGYuRt){JQWbel@%BaQ4U9Z>GPMek}W=?Bm%dvOmc_ncbKDY4&H?r?O9HDs_GO zlj+OT*QdXj{%rc{^kDk)>6_9U)1OPMv+e=of^{Q#x@ zAU&M^M*7k857P^OKh?hrKauL6AYS;E^fTQ2W%?KCg@8Yj{#AP6gXsh57t-fElzut= zoAkn$XTOwQ_(=Lc(|=4K_J{vK(YK^Oo!yZAO!n&R#_VAFn(VdN`?9~vFZ?y6)Vs3_ zpYv<^+p^E3@5p{OdrS7y*{#`a>i%zL7hd?G?2XwkW*7d~>^<49Wd9|5Yxef+!aK9~ z(uVa$1N^P*4{fl&m;HWr;YYKNWcOx&!27?*K9GMHjD1!8`RDAy|1bOB*{gH2}xP(9c7!7A}crUDbm4%Sy>zA+0G(6 zBiUG{FWS{l%Dx`xpB|nvs+DK#ovXpXPIS}kGW&$uUsCK(%l$YC{TIA*TK5bvDnHBZLWU({&a$aOx^49sgYCF|| zUahO&$*4i`0Q;Izy=XkAPcKv;>sr&@A}Q+I^H#ZGnCm`2E7RbLJ)4v6+ty?~AN01p zqXvU+l)XKpevua0;QowX8}|&`pyZZx??!hvY}=?NtY<@evtZb17j>?~y0@qrTSlExT5dfT z$Z7e%1-3WWE$Sd=FwA=WZc+0_iap#tXrKx}^i!rY>-8wgZJXO}SKx-jPPgc2(nfW_ zozrj8;t1#lj(2%^Fcqj$T|Ai5_J(u&jqJK{k8Vmwt+^~o!Fw$Hx3p`en=0L@o}awr z@j~|IbU3GnH>X32Eo3*Pn!jam>Vi|_`2p+9cdO`ulrHla3@&6hro!Yxc0)Ss>3V%S z?3PI{odL^6AhbKIvjZ$2SebN(P2Rx+5q(bmZDH$_VG0$ehAy83p)yQFw@kV34AY`H zYVGRxCME-_kI;WX{o5Fjyg8zBJuLFPm4ET>}W(B7;#%UXzgN~Ny zJn8n@-J-pCfd3szwr5FiUHo|@)lVDb_354wb+$lnJOlGU%gZ;Xdls?;IU)FuB*v9D zrji?Z`H+5Yfv!|OFY0GySJ?cOH$ssURe2Y{UT?%VUC*JajyFVU;9t>eA+yBy)J@)) zZqEt6VELoMUy=M^LQ(X)wL<9CYorsL{V7-PLatt-;Uay+)j|xpAcl477MkiK0oZ z*tHD#01pZ!f`2s^VDIMwjH|e4VhR{p2)i? z>=KF=vZrg{Oc9c4OSW?YD5XLVy~*;P_@Dp_&&1d&H67i%qLiG-h6clM6z zu#=&w=&}A6T`SPpRWx@M*}i=|X@(9SG5j!9G(4K$o;x*VSBwVR^9vYkZ%;9AJuC*> z8J-VTBfBMKJqCM?g>2(UB8i)=5EGY$VM~|IbcRcTe!*oE%Y>F^Td@b9vw|DZL^hm5 zUDo%rvh`e;kO3D^+2g{>-{R5{V(Bty)~qL*j>eX3llqltIvVBX$d-xEMj|?^6&+yv zNHbwd$V*rUk}@JMiO55X;vH%R$jgL05m1Ug!c-v+)ZB2Mir_=7g=tEJ9QtOBQVIoIfkB}C(^Gno!TfUeNS=ATw?fIROSOt6=w3rgipOHxU z*wr7L%Da2=J;QZe@8Zg$kMc3$8tNIC-KuG9fw8*xfr%D46}DwKES!jRo}4o5 zX(C%_rc!9uh@KMlty}bLiEbI}xuR8RG_j|?3fxr_`0o=l-BmL-HQ{r(wr4m1)*-Ha zG#&k;d;U)if3P;{&egIs$xT8EOkUoW?-~4H0M(IRvR*&#t_@Gp^-yhSzdu+T_DXae zbd$RJ>s|0wn?5vDQLFZ$y1Mr7tZLmKuhoxx>u?3vd+NhAy53!PDZK=at=jVyeABxC zA0J!43?BX3AUGeajp6uMeu&!l)c1^9MPDK>Pn@g!c6SJR*pdVB^kg{khap+8c~;L=DBZa&bD zGmOlQl&zK{H=U8yHnJ z(;{XK7l9q-cWStO&46iT-X^6EWP8eg3fhycRvX9NsAwimYM`Y@GuLQnFiAsfKh@UP z)K+`2&)Pb9Mq5Uovb<){CoD6IK8Fo4sYK{>TQ|IHqOFr+TQm5`;I70+A}VO`S4Y4DM>vB-`_+TCTOoh~D7fLCOd4oy|V@nNbcJl>XU)Pm1a(sE@qJV4KAxgfe5 zKBL|i*ifrcP)F~!K2>RrQYTIE!-CJeplfP?h zgDmRGB8)UHngAT`HeIP>&ig}6#%orL9R2UnguO>hHE~kc&pEWd)tYiuigb2m%Vm91Z zk%Aln zv@59UI~}{bE^cy4H2w)avstqdWzJd}_VnCW(`cel{1*kK)=JH!(WGWs=;PPj@V6Qh zELmLKsvA!B(mD^A#R1k?ab&MVfDypGVGgD{uQ_n!TSZeEmb4fuxa_FFO5e4Lte~_g zO~qT39f(M_#Wm_fLYhNGHn?3VsNKpgWDQS#O3R@!tsqM7W;orbc_*q5X7&1AMQ0b5 z!oGdt<(_8P7@IOJ9yE?_bg(Gz9ih)5iPmVQ8%8A?qQN1s(c*xQ9N93!2x&(@#Cr#_ z5exy>n1N-_+XYWrfgCl^!*#bgYFqNdsWcd^9<}lw^9j_-BWV-?wSpq|!BvM+-lGrK z$_FrJ10&X??8eogCfp7Rt8s`L8!3x=&fnS|nJKk}jJD8r+)k;1i^z&*i(nAcwqzeS zPD;c{wLtKqq{NpHC|{gZ3w{c9TAl#I5qED-Ad0S+{$bdk-GaX@Y z%Jz6~#ei-oGX2j){%R;NAnUN9kiU*VpOkNga#MU+%y_vFUv8c8^33>h$BdUdRA2LA0$g9zs|o zW5O{Q%!IJ82oFq&F)Lz8SVS?9nPCx`sG=SOmxV;AEVa=bPG=-3P7OjLwW*NE9gCf7 zM~%heh7b)gvEI0q@Q30o0w^t}{tPIGP>4CV6oqkd4PD~QARHor6PKugxb9O#C980V z$2$mz)QZ%@A;BAdQXHfZ%M|8FM1-$g16%S!YMJ~pIrx;oV@2E;RSyKYBybX(D$JE4 zGl?cHM~DU>a_(q8cq`D%gvmaclU7=DrXMWqW1mf4`D`>O8|5?ItXl=R zns`x~0-~8@7MnhcHKtGZZIEszU=3HuIiilmm*Gdg1%Yn8ZK`wW;7rGa>X@8zsZRa% ztY32kd)3vV`CZ9|?@QYBr;EN;p1gtJ-EJ8w&cabbU3xGz`wB&(ua6pQ$uHYd$#n)8M{HN`^0lg*rgY zt>Gha5`>sw0y&fLmsA*sOXLZ%8RPyGO%%i!qFzi-ErizAi!hB|G)JxAMT%yBHmpk^ zS#+(P89TQLCs|z017Ug5wn$lB?twN@rk1&+xVS&cc-0&TR)W3|f)Yd{Ai*Fsg|21o zh|DdbNRYJ-4c65$K?;bdM>;IHYXbt>v-awuxYpncaJ3CXHV^l{z~Bn1`?@ovVMOAn zC&p|SIK|2%cN~J@2A4_mYZtwVCq-9sQBqQ5W`?PeQd?wZZkqa*Z2hoLHGpoC6SZCR z&2KBuDy&s!IE(@wFBF3lr*OX&s)ji?5Bn164JTStSW%Q}!5}GMF{{uByu4ZTFWr#Y zvIUzKiiSB})%Aw#=9)U%Si~MusG%e6bs%InWVh73wyEC+v=6uH9SSggG%3Igi`<2s zEQqbXjIaVnWadn5bXFS&rc>Rnkq41V7Rxr;7I27v&bw0cRSo0M{AXE^X2711W@>R# zngtLNR?g>fgn>8D_1YHqF7QBl--WkxO}Pl-3)hu(H!ee6|JgRmLyU-AC%U|d5EJ&i zO?PY?k2152$YvuiwVva27gY+`w8GI^m(|8J)n3=$)`dNCT&71mSci6iStp zQ!f)HNP^tfY!k;^Y26Aa$*=x&O( zAuw)9N6eq-^zD_ckXsK^*@n>kVC@(?rhKDxQ^1uP>o4IkpZdyV8e_Jr%8nerGt}O( zA)9lB?x7^Erl_l(B6W4Ojz`Eei36AI4PjDQ2i`gN7Hf9Wi%@h0sH4yZVSvpbX;@&+{jZ+OA=^j7}A@!cJ!`OXV02I?RF= zOV=?L0AQIrsrZ%w?#%{ z?e5r$Q-|+PNAq)eiqST%=JAD4uTLNciBWZ|pktDOik_$`VtM745`mAcZl7osRM3UH z(_z0%#r$EQ*1hrza@6O8&zs3mHAlF}`XV<^ZQy-*C>@c_buLsN8##x&yKvjc4Tt*% z?$+vTjvzT97eb)`-~O3YO-=#^JEe4zTQTtIWE}j6i@?`1Twm z(5R?qmYalQx|Oz-8A+AOfe{^?+h3=c^BQ9GXk}d{dz=%7yp5DKPD3)%1MZSEB!$2H z)ejZ~wVF;a_o$u(#h6J>2*`Kl1?>RCW&*5q68%qAdCKJ$09 z$?s4^lOMfxMj^8&Uu4%SGbd%-C+gKf^{Pt(lf{votEQ(??19!1v8yF>nmyXE$Aq1- z3hB?IqxGEly`?EmqM^u19{p}kqVG-WXlsRzMnauMzZmZe`0+g#Z<2m1>Ma9oi^|*^ zO5T$~b>1PEGD?|q6Ehjb5Nte04DokT2w^H6;*F$>3nKv$Dy*<% zm7&4K5RKp`Gw}Sa`sa%&3 zf+8hC^xv>3niz~gn(REPohL=LQLNpbZ{q@?Y~=#p7r3n1o)=u&XJwnXfYOazP=D8B z^kFtA6Bsl~#ftW%rB|6f*$qZlqXa8z%QAr4^ukp%0!wX+Cs+`O*mcN3g{m#q2$mEb zH7o~PQqvdWW10%jOEXGlUBlQ9*{es05(H5Ozl2GDz>yp$9U{%HP;ynvc`T&m{o_Ph z-h35)c_^gift)L_d=Twq*GcvAa7cR>GQSvj;Kc`*mq(1$=rJ=l0*|6*%=0ToAo>DF z-x`siFs}(PENQ%C9av5l#y@(E%R*WFq+HiaJmVw0Rz?f;0!P796zrhr)8&m=$j*mT zxjY+At#8RMP;ho3yLf2+iAynqcz799A|;JK?kl9k4pgHU8_{IpBH5DT8j}TMghB5` z7>NR{3tWsaFn2^4X5?(-0)3GFCBkR~!jPFM$!r}JTp9a#?SgO72!l|itT2n1nD&ZN z%hD-56*SkeK7HI39(~-xBRx@ThDUW&{SA1mD`gZD>l5F66RW)Q;Grb?elRJqN#m2_ zW^mnd6tnxdT8`OHhR~AyK&mC>TV8u8;Y#$0*@ddZ@KT&zIE8{WT{9ge)~hYASD{7q z1j(#$7~nXWq_4#k+_A-WVz&#ghoc;u&%E+V=G1N%%+0zPxzZ8q(gDq! zG@qsE-&B*iWOlQc(FPf_o&6{3DP>M!TaX~I;K__?nhmYZ7wCL)z*DHak0rD=c(S^D z!6-MIEgH@O@!U}(YaI&6W<=a)7y1#~OMlM&gW^&mte@HCr zAg=P}Sd~I2wyNL-IG!>oR;+I5C}=+y59bz9Q#`vemW{oz9*=u*wm<~HDBE2HbF>^r ztVNqJ%mo8nV{=A(!)}i3HAJ}!1ACJIiA@Pc{jgKChG++J2hB}PNi>N7H8zQIS)@E^ zv*ZVVg@ZcB_sqmmOrpINDX&6%D&;*Eof>eP$By>N0V`-=x$ha8hi##>Eh%!V1Pn(Y z$2fP;AWYdiAEJ-#PEDbZ>~s{S5Y27r^a+CX>!)PEX)6v?E=h+Q2u!7#hRW>07|ONv z1fghY?(PF-Ak_ntz49$d2OOo6y!)l;SzcjQe$~SMXjw7=GHIt?=D8DP?vG{E56I@4 zvof$5AU%aU0xvt%3j@dBs)CmS)_%Q2UGySB<(dS6LbpSXNj*#clS~fo43I39AG4_@ zdlZA54m?-8_#!+g@_Vx6`x%nz<`-|z)Fp#wYWTS5Lh@ruXR=~fZBPC^ca0|}RcYfp zW+xKFi`3Mm&YTxR(cUm(0=|_GCOVjb4K*ncjG0_V zGc~j9X@Nohy*_w5oipzRXGrEGtZfS}f!E-M>LW2!V}r#Uz083z_% z=(WYfq+o{9i5@^^v4m9jNZd%=qCseDe@11L+)$u=9><&oL?@lUquhNtH zs*0TfVXJ@C?IwT(-EIuzIO}$Y)w@Tn+pSVM=yoU43i)3*EVV)&cpal#LAf*Q#jKF& zdeZKydfx!;?)no-uT9cnQX^H_U)9Ki5ptXG)m)WU9e_-bDFA^^#{iBqo!+OOJ!(2# zrF5Xv6A@>9;aL2=@VJS;6ETn%j|cMN<2I1Hzu|mQWAU@3&>ZmW z6#XMD?|E%t1I3loa!k}|Q5n{mOmoz&RBTZBKa^ToC9+lwWu!}V zP1yEtU&Xe!YGiINsV3=PRjW{P{CrRczu{C4Z3il!N|AvAu{QS3wd~ZNb~}|HYKnHl z8t@L0=KQK_fPpc6rJlx>pkjfr5{$td=at|t_3u%y1gn$|6ni2B=#^sudgXBwpeJG= zb|is0v>Q0f@?^{z6@|=kju|nIUe8;B!DL&IF(I7IL>tT$T8WBtCaqhm19Z0&vA|w6mWL#OOvyv#;Xk(A+!Ha77mNq;g5x%jKW)TF8L8%eAPXXY z94ISlRkk#D?ebF!Sn*!x;Bg@irp=OsUD#Kt-P9DS5vdxsh`k*qm(^o$_)j+#*Wm_~@i$srzMG>Z9n&;Z};kcdZ&)sXty$#&*D(Z6F{%c5t^^3U1O#8E|-Y9%-C zViORUcMWwf)7qtW1Sy1S7CEX!1$aWR2lZXyAAzauTwKR1bFvdCYz!V>bSjthHaVXc zvYn$Q)-Id#=e*nk8AQa3Z2O-U%dBWy5=mjp=g4e_jbhKtwviA1i`mRoV{ZmR_?%w@XA&{+*`I+hagNRWmVT`q4t{OX@l zQ|OB&C5!Ii?>cbxhP@w|h3z(t2t-=-rWdBH|qf=DuSN=hF4+Jf-px&VZ50Dstro~=i6SRht5vZUcT=p@a@K08-~FN` zoRLEqSZe@l9f7r+TaC49&RT}VE+k*3e!imE(b$W*sp-fqa+i2S3^a$GDu${yiHV^| z(l>@0FzB*LC=e8Pjo;OML60&4ZXjFQSLx*pW&6ayV2$Vw3CP5o_>ZVA(cNUYj_dr= z@VsEFSF8UM^G*lnC6TO$+Lgpz49+V|8H4jpVTCB8Y8MD7^Wq3G zpznEro&%xQDg+E~D41>)3BWg9%#hP8=z_c?NKa6BGDuG{0A)_$cuGMCM^vhbb4c3j zRe@s>HGruI@5}v(VX;gAX9Nr|Jo00z18^d!t4$LnZB|>w?DD5yx6Qt07`L+Xx z{4VYo-cDyS1?B@mgur~@#(*9PN!z429hldYSE2bZ=L*e-ZU#&WeawR;J-9TWU8#y3 z@`Dqa_`Zea=chyS2E@|Zm(7Kx2>V8Lr;<0<6ov-re zb3&Yj?YmXjUg8Npw1al&D=~Q>NI{y6$ww+vN(Q@J6qDBg1iW3WSD>Fg6AJXVl>kk; zeX-8Epq`j_!Xor6Jv*detr_cRwPKCwXxpS_oF}!FL5;xfGwD+}55-Q=(7fA0AKSL0 zeAzOFzGr(1SaB!b3Bm;kMBr_rEiR_>)heA&FQoHv9qW8PF6%DJ9UxHs*ioWkY(!lF z9a5BNNGrKIGS>TQ)fz0lkJa4RRax5IqHns1biTgpe0`}*QoJ0R5U4V0jxv5kQYcex z=v7;$2CB!$qy|#K)Ie1Q%cAL(HUq^9g{ap z4ODaR19}|@^ZluwEp46Cesxm=KXL+mfOp!SG*M|f(2lX=Wc8j{cVCb6UqUYyb}8?a zr?zJfkKk7Rpq{KAbukEh4#6Bv6A)a5Eyoa!v%BwJcPsyh*smhu71MuLDJ^~W1Z5sw z9!xDL>hj}8P@iq3&Fe4&wCmM91(xFFWl2={7}!<+*#!{elO25tPL!fI-Up^s>&6D2(Gd+ZBHiS49KB3q!go#yWhpL zmMu-zGnYFYr8p-gEg%Hh9rHVbQwRGnB19iVFcmyE6&y()Ud=#7$c%nZ_jVkLZQ!Z^=gR?Wlj#&- zoav7OunsX@-DkP_bX7=x!_j!fh|L!&3AtnC5y@)z{F=QRPoIg)J2VazXGsRZ@NI(k z9*Qgy$cfFUMoOGwj#gWKMFpzeNU75?MLDlVNNWb(5cEmN1bbJ9%-*nBkl};?nWa7O zgmH)Qg!~+<^Mp~lxWK7niXY6zwQXRPAgdvlnv8HB; zt*O5&{_`bs_L}<9$e@-5{AkuxgIp_*0=ZVsgnXjb)Nc)=fCZ(VbrV?y2)*}>=VqBn z@LRl_VG?K=`T(!E%B`^6D6ke9308qLs)-hsnFLh}(tXCB?7CI`?s=^$#_lUEtM=bJKbnlithiId|~$=4tVy zb2_(0YPUT9^1B2D+=94fmU{@^Bgq(bM3QB?*8@cR@?fe{XHfZ%=x>@wSmLr8%!aW944oTFa$|0%L zBxyU+k0Rd9IjKAvorPx^Huj;+Tn3E$;A-xltXb|8hqj;smC9p4xQDE#!n2+PR&WaS z50@T?nrd<5$#6;LlS-1TVTY(@hNg!57r~MaXqAm8XHocwANO`zzuZNyOa+jy-C2;t zT#0d5dV%v$7t4yk8>V8ZUC1jD517&?^~^ug$03g9+*t@8@*{qsxwZ*8$XQfM57MVk z$1`{ixKefd=3(UruyZd>Dw$*< z+o@JntTl)l~X5~lK^z|vm zvQ8zK-9rm;S^by9>e@qJRo_qTvA@UA=2PH~IcK1Alvy3Sx-$Cl7U8xM`c369F2mcj zf&~pV8B~3i(W7e3vCeM#nR`>0MCA;sY-jpIpgtKB(~ru52_?v6a54~9Zm~Vwx3<&P ziUEjtE{0}o@}JQA=mHRv{4N(U4q*<-2tf$e>zI0^XInVV2M$^Ck0kY+^P@L4g;)6? zm*a`2E8uCxh{Hs*!Int#Oi6%NfWWkVXbhsy65|dC(B`}x9GDIst@{xof#w!O|`?{J=G#YDm6S2}s@icMo5set% zkQMFBMHi6@6(1K=PmCjQ;4A_@r zJAikhwocgbMfO}RAbfM%sOW$L7a8dT+~^{UoTRvD2`94wiDn%TXt|?S@@K!8k>zlthmysgr`nM{gY5MV_ARdv4W+?) zRzfWyEI)@Xt1>5oz%gqS|98ym`1 zi{}<+=P!jqQrXmqtS>}=s-LrEv2#-$Cp&j^FDBarz4&P3hK@c10DM#g z5$BZUa|_4R`koXQelmkV6`Hd!HDiqWI*kaJVj{FM5JLoIh@J&%2GYTYk#U?5TDzD= zNyEHaL1u>^$Q$_fadlJp=(5QxdTGlq?QwjwrwM>UkqL{eW(N|fM$cl-VNwkicW8Tj znpEgmXq@U-E7M-hD_uRFCpV%PLl$N)9#QsuC>c7nr-^T=anklB9p!)se5^dKs!vb? z;%Y4krPQ<;>pt&yss@L-PMt%=SU87Dt#T@`(q+{YeOgfih-Xd7aP?EQG-|bci&-q! zS7Gq#`$zznIjdZoEUd;YGi%8UMkK_-@A;X$ z-)tWU;Tb-boO*v|=KiQVe4WS*j8{6^0q=qP`*EF!GdI=5o1*{W&)X9KYVw&kAPigtcjfawQt)(J%`1uR3 z4nM(4%t%pW+Rr*Ee@3qdR$A6@p`%W2*Ry=^Bk1IsKqiKrJXH&v);w-OXPvCvg5_{b zwBSyb$ri?uYqP*jpyL{5s#eS9uv$Jpo)jV?j!Le_u^-D(CqJW4Bcjq)l#D8(jaj1{ za*m`d?@`UMBDG{xLl?3fJ^LONG{kqhYAns{|CWNyV5WK|p=2d6{i_@v!Ixg)&O&%z z+fL%AZU! z!3P-`kEV>xKp=9#Sx>j|OC^(Nmw?qrsZ5~i3-+oRTxsD8Ic~17a*JmqL_B?Yo$f3t zMSIjt2$>tD;;3KD(oA!~UN!d{%crWjNX=)ZmW*p<=9vBvMNS;O=1BMPvj7trQxhM= zh+vdcl`L)`^Ub`Hp7w3ZF5f_QQ%W@HR#HHLC4N<@>_*#^87O`jaN{6G-*5kc!jjs|Ak1cD-%X#}a*a2`)@>QgjF5A3V-Y9z>vx!6p>UEEG+jm*&( z{FrkBa#ArT*}hhV@IAk1xCw~bPUzooL-X5I)E8@#+xDThwHgIWx3ME%a&wkJILi?< zJe{ky>po5&d4q+r>vG6|aXR~lv7exF6qxJb{w7x0_>6dK15T}|$oJ_2G`4sjG3sd}8<3IVw8~mqlbZPtH zdj1>m-$wpBh5t_FzmxgzH1IHWTCmz=ER`YYXkPkPB)`o>lIA#?7&e8@r6uv?h)9 zU9KTKBNWL@L8$=+g&w%4P!sm&)93P?xlbLz{ajN<3;*VhZ$<3LJhSbHb~3O0+x@{0 z2*!TCMh^d8W#5Mhy)iG+{n}Uxq5`T4nvYpr?tbov-HBJ}Nc?gBbKg%9zSy6l%gak; z*}9hvO%`10+V9xM{(~xW&G0l`u9oYGlZJZrc<8k?k(@U+tydvmv%z8 zB}h$`tGb}i@PwCI57m=Xbh*qG?Mp>JUF~D-@_7$ae%y(YPd#5T^mbz}9sKDP&zeVz|0tQgjK^VNo-8Dg*TT zp9E+JpcdGfo+6P4jmKVAj_PWf^hpIsexiUrwqu=rjo^~34K+05h~yPmN`gMq6$s7t zEK;Zn$UvMy4z|oMBUpXGDyt^a46-wl1a>6g5<3-{yR*o5UJmf-KO`UX;Xm~ajYJzO z*J%CPufPjM5_OvkDKSYXwrWRh>>H%fn0J=~xP5m`26}N-S7o1KLOmC$MF^`60(N zyF+lZWh`KqkT&rb9tfk;=>jy~c$~B`|`hu&;J%BpTj&AJo+F z%m!n-I}J12)!* z;IXtbN9L4bv%3(MHFPKFl)U!tD0A(A^dna8l!9dY%!ohC&66 zilLa|WZ0A|2W+0oQ2aAm7R-kAJ4RevvK^u{WWOkF=Uyi?e%l_pj`StAPMRSu1gtTW zw8@=oseFaHW?!Juv?C+W9iCcf6{MGZc4#&5p37krQ4m%I92m0+q{CMkfmc+-*a~q0gK-e0+g^q>&$-q6Ig&n z<7uaHmzT94I*kzh<|`1owetS2+_mYcr9>~RAQ9e@hQAS_8&E_f)e<0PbiHI3>ltr# zMY;%Vi%tyQmTEhrHrR79V(&hS<8=#IR;i+c@o0<@Om)`zR+*q&3?x zWu7q3_4IJ_6>_jZvpVnO@!J1^M?sX87blB8h0lpYP&UY8Vq0K2hu>g@qfhGa4(bvb zpk<3{9)ggSPn}aMx*&vXgDx7UHFJ^^@JZq<@6||Ox>vV`wOpbj97y6HiVquR$5vRa zIyZ!^t$qlK&f4G}C^blG{FIN~D~Z3_Mye?mAhl(5UDsj*ZcxLkkF(BcPpm*Ql(~=~ z-&6^lBc`^az;iT;RpA^3DSq>gxp`Nl=S9{gjpsF;lF%Z^`C=|8+*Uv>2m$ks2cZDU zwedH+Rej?Xx07!e)~)NDz6|+y1AE~n7w(YSNBw3I4PdfH;i_Y3Ni*By6=vX;a*ep8IOYTnjO`gjkuF!_> z)8~Cr*>t&`0V11DN6eT_x0nrwXsPN{wCPd?6V9{2rn3`wfHJn}{L87b>Ff(2=sehT z_7#~-n~(0c2m?!?*&J@v&5h5ON&VCgKI;eQ?^pltl@vwAy(dIc^(ED%|7Kzh(TAbe zX*C=5TArmz$22)X&dNjSp20I5YQK;ccV9ZR>)~`bEbYsNgyXBCKd7Q~1ly|W2;wP+ zAO@H#1fd{Zs%{p(O56E4tGdP9!Z*e4j@7H%Sw7RPubr&EuzGdQ^jX@vk^-yNx2#^>M9_5WtgYkf z-?@5q)0?NOZ7z_IjT zbkrW`7_HcYO?VQk=H9C2aAO=xbHih5?$mB^TGiaU)EwW|J(lK*V`>hy{nVN47j(36K8sJNbEfkq_6~u?|*Z z3y(JOXq|bn?9l>`PUF#9OIEN)-@zkxa1SlZ$6<|lbPA8=Ek(;peLIghnu$X~v0l8? zxAEv?9`(%?Xr(su2xD_7NnS~REK#Xh(rW!sh*VDbwyCRlOEA(~(hI8x1Z7)VM`~s3 zr5@v(l*eTz*boulRP85WeEu(`Bu$ z`1Wy{2C0JCcO@U?Z~2Gm9^rGaf8TQaXnyeR%)p$@+yYu8K9l$!t<)UWVA!GwsGt~s zPrP+k@p!&rw#z+Fet4RuvBu$z#b(}~B-fO`9hg1*Z9K$_)ejH*_VC+zxN#SbE-%^B zL-hPpb`|qvv?RqyOYSIzWzZ9InE=rb(Kq9JY==9%WA#I@U45^7qL9nzRzaM%ZhZ&c zI&~M`Iq#Nx^A>n`+OA@4c(~R|ZsFmkUB$ZaaGgE;P9C1Vt5_c%x?AH3Jbc`)VgnCp zXM+{2C|c*4$?;%k$H_TC;#Ph~QNLqx;T1*aj>WH~FJCNPasBln^&=~uxIMp%i7v<= zxn0+9+n(Q|>$h(w%Zck~J1Lr6zhirL4VMM~(%zQs*`@sYPJIj-N2=xR$cI@x9>?l? zRi40KaS}gn(+|=hi<9~BX8j;ESZw6SLH(HL$0_`{UO(3G<5YfJ%{^yV7N>EqY$eVx zEjDp~G4})&i_^J(HuoF2e;oJcasPzx&z`Oe^Zflf5)WCNm^?mhd%hzG)w$pYMvV&R zowa#GpyUR&PvxgdxWv=)?p1JrU*MDTW2$tth-W!3T2^;pagQVB)og9aTfPF|ZN)N< zaLrA^%YmiYEasNJB;8l1vV~+N_zum9M_V#GDL7Hnaum8JiMOGiHLb3$R(!g&T#qE9 zaYD;K64dkztyTn&YQtMhI#v`Odi2kr861kD?;E_=VuCI7_Qv=eyq@_xn5^1H1k#S+c02!0|7Y_ zk^rZ2QHo7$Ht>1l|8~Avx%hPH3U&XUjGZEt7mW-%oc8C`t}7F!nentZA{+F~ zOFLb23D}+SCDE(pjXpiT<-jc7n&&p+PD?rv*jgx*RccraC;D za9d|3ZfjV0?6%hF^(wferx(P&_~BYh-d-Bt@-f%tb+3wV`8w_7TVeg0_>Mr- zf_~kAH|@^6dsmjFo`tlNND5L)Cz}`9;E|96#4K@2`#=FI!b9fxRg5JEOXy2aP6* z8B9UqoqJhg-q(sdqpMseBMOdm6_Tn(d7L6t98Q%C(BMSe{)=avaJM5;CV9 zcy3M2LOaPQEBkUnD_ei{v!;Q)4Xw1rOF9s&TB&TSAvA6?K?l#(d8}efip|`PRfXI#~y6<@K*%!0QM9UDE>{FI9q2kOZyx_p&=xQXOjTYUrRXM#5tF!3L&mvBA! zoNa5;Ymp0MXKw4Z<=T4eM@G{l(>vi3q2Vc9pe8{hJ9QG;UrQ${Q_fkqJ;#Un_4SmN zreRA;SU?n}wiQGi?j-0z+U|Q(t+C1AA_?gl9LB{?@REIVZvTBzb_FNoYaMe z!B3ez5R+-a$;>{}yZ}2uvqA}l5Dgd8OUqs5orH$oW!C8CxN2Cwezh2N@9$(yUnUOM z_Kw={P`kV(M;<^UBPb0ZqmC{$oT{YL41OoA zE-@=cb3D6i;@N#Xo9Ee`<7a#hCBF@;;xNoDao;ZQft%c@;Rj?mAB0O=!e*}e0X6sI zj{@sN)*`SDn?@E!LV^dfy{HxK!4DVhg^WJuWm6KkT^?3cNn*N=*qIj9l*IfuS55by}7TrzLWzD^L=UKUnN?c=1BH9nS<9@PCdwhh9fDCoG{9}065iuMIL!FIm&x@ zGNvQZ=h$7i77F3lA7x^#B{+Mi(DM8y`_`TXT$YDB^76`kPo3#?iDG<$!-m zKpv4C3|*$w88_>@gLeu~m{Eo=B>xKd61HY?q962e9C=NQge*x%ruVnYw^!P@3;p)s znd;2p+8$KOm*rXGx=bk!?3rjHWE&C<=sHqZ^vSCDj~53G&Xd z?lz+6P(mwdHtdsAPF8(C$%E2ZhP@n!z%q-c=xRe3XG&{c0b{4a@}TGq?pKbXa(0j| zf7{c65U)h{ij2*Pa^O@P>> zw)oM9bUDqX0RuIyn}b(!wqO8Irbu8r_yaYOVgd%^(P|C3rv^!i=Q3a;E^tlt+{oSB z_I%*5)dYl5<6@*kD^NQi7#ve@?|`qD*%Tb8?;Z7+gI;+U!n1|W0@}&QG74&=HGr60 z=#;Ep^pG_9=pdJwv)J6co)*{Euq7$Dwt|{f;kjCF7DC5Zzgz;oHx=fB)D-&`|J!0=~27Oqs394{C zm=SL=^xO=3ZdNx>-p*6+u63Io71!%GK^2<{Q9}hBkcaaw=#Zii(Kgl;(Bk+%7M(M0 zKpx71;oZWez4FE^N>X)%#dP_!1+T%K`8;eUnE9&C!jPFhB{n}#Qo-yJ0Ahm%Or9p{?Xca0TTSX3gH^)q? zfMO^zssTnx({(W(pZw5PVP5U!BQxp)h4=_v?1pv}4cDpF&&r|aJf%QBxL&7E48}z zG_8z9%9~NvA=V`{6`D7KKj9qzO* z`_VhO5Qzh7dAI&ah1Kp6aA3`k8x{c2cor9DE3KcA+I)o#^fm%23#Ty{f00=Md%g10 z5`EQ34nmqoeEiwRbw!YZhrn;p=mfvf_2|j>cqEhOqI8{!6vL-qMm89b|<3O_#fmL-%FP= zJyQaa-ct$bXp#U`6S8qtli?i5T-9_b;i{$$jM6UEgmI|Dbls^Tn7%tb&_`(3i#rK1 z1w!RQb|f9En(9l?Hj6fy^Sr*BMcZx;S+1-J^#_dvzB;DQ@_u{raHVnjl=sR9$4_WB zyB{6YW*lNzVa91!(%Tz00``XKtSOK{`S@6Y?3E8sE08ofp)aC9_SCniFCqwd05!%3 zQGrybTZH9`TU^b|%BdJk2DPyfNE#+sPJ}?jp*)^2zL9YfkCpixnKD)uOvzo-@lBiS zmG3o7O8mMur)iKv$IREIO}sfxB>DIkH?n0qj=Y{`S>{{4|Lo<5$hAc3(M(!?HvZDo zsh9G@mk-9L+N7BI`S%3I5!>1W&cc?KpHLAUf=q6--stpuPBe}ibXCsg0gtU1)50>{ zwRC&h2hq(r)AexX`*sJmZ`b=y69>{~(8o;fjh=oEo{GrhdZ6}HJ?HiZUPPgNPfj=k zg>f};z*(`7=4tR%!W-VC2_(=qSvDo7cW-D;dPCEm}i;+Ty#RrNCI!VcZRT`&7?W} zA zyOcN=DTuhwrczeq-jdaUh(Si6ZsE<7Ib6jc5XT$|Md$(KqC;98DITUWXIPCR9AoBo z3wkr1=u}TkbB=i%MYec7kp^5V(m&~Gjec9N=^XP^{mQ3_ApI44#sRakFgUw^zdn?x5v%v|SIDDh9hbkNh<$FL=!+zx{wk@$B%!k? zOv&I3lbX>4XbLwZAkXU9h9mGV6ze>gc@A6veHJA6XSwWg%Isu{HYXXQ)W0GlD9W(S z4$8{pJWiXdfP9-6Kp#qvXR6q^MlJw-(mZfZp|*RKpML$JWbnttEb*g! zC9~)#@gq`X26T}D>+_EglSsrf1pH2&w>zontS)wB37r!ky3a`*Kh{w6?PQJ4Hr18t zm%?)(p4y)64C5B{&dj=}3_#4z}B{Zqw8%r2PF_=N{! z++#+;@r;rG(W^l&G(9Uo{wKUM0Wo;RzmORD`?KShUGRBfPWso3)Pe`~PD)6x$~?#l zoAUo-(+fVFqVT!UsVihHHdl-sHg7@VHQO@G!YfH4hY7EBzRIWHcnBGxXnW_ZY%Apz zwPjbX*6BKGjh&jz9Tl^wiVrTWh>TYh6%ReZ?+C{3b^vgj#F`?=XJre8>Hc%l6@S zN*ulX(tm&7I~)4^o+%^mQgxk&1=Cl>^)VP#mnbd|sYGpX*(5x(j2k02}`6VkuB zwBqqW`mMDIq(|gWU%^6S@7#ReNow^@Gws;_8aTPqElINY>H_1si-o*O_)4x0--XD_s}hRy>v~QBO_N3~@ATTeZm-wlFq#&rI5tOr|9kI$+yDIiH@)X!=4b|Y zmS6oDx~^|pfc0u{YTJn9<*(wcW{`bW)!We1wESt_I$~Snw_#jqc~kXvf;IvcAcpwX zB+6UkuNibywHv9?Xv5pBkJ}CSPRn;xu%vDUVhGcfmcLQGoseA>seG(@JHbK~i9R4) zIjICu_7_$82~ifPG>`@*V6!RGFi|!ocr&zBIi9*McvGaW3*P%~q`Lc!q-ekDVE8%7 z;?;Z{&|3=&P7rQ2m+yEjZ}qigJBh=4cThE!2-;Z^qxBGgsbyGK=xxF@DFE==n0!=Jh1ouB*S zC*ONNLhVs^= zmTT)u9g`*dU8$(9&E>Am<>hTbKgeC1Q{JsG= zu)n6nN?s|60kvzvt?7baTb0gQ!_Y53{c*RZZO=tI_@}I|7iLBWN0)R|gH((f3ZdEN z3Fbi!+9&<$_FW+DAtOO_v-wpX2C7-f1Y2(Z1ot=mNwAWkI_yjB1+maBrbo4*A*>KM zh(oS%7)Guf$vEFMd^YcI{8=fIz|wp_*Jhd1hqdu1PWT19BfS^DF#5HoJh#lsj9hMR z(Y&oA%G{+tp1EtC*;)BIa-~js7$rs}mZ*lQzQB!030uAKiR5^0waZU*#&P)C(id;p zzZY+bNyJ-x!0{FzjeI|nL&O>r7wNsN)A(_WMEiTc>5N!m=FL1iu=WQkK- zDjCm6ccv2DKUAQk2B!|2_#LgF`PbTu$zo^lWpWG|e9?-(3_87Ol+Hnnh{w&&)$dj=?&6Gx)+~0?}`z5Id@z`!S1v1k#+c|pY8vr;K_4N12?k! z5Rw{{+-Zmn>(*4OfTDccdl%YJ`)VN>k!x)&w4Z&)H6$bX@Xaw=FIwV5JJz!evz8Wc zvi(77&umU_8zl#5CYOo?Z0DT&DTIqSwHKyU$m?8)EZnmPC{45qu6c6uMBb1=>^5tz zkBpRd_?Ah^r||N2OtK??}o@r)r zb5f6UnEw%RFORQHznrx&m!A>A1`jb^fd)xkQHOlwBdDHH3tz}^;Y&{e2U36^@a0dz zmto6V1mlB`r`8nGA9ud|@0P=+7^aKVU4iLRE^ZfjVP8iyAdCiJbAGVm!C#kc?fec~-_7t}5G_rx&*7Ev+2ZJbSMt z2Nj4U_-ycjaJsmyxooD<61r8=gX@A8w4hFC4Fw$+ zq}IMDl-%Dnvp1v`jrCPqM3wlkOpn(VBkA!Nr+dPO-S+4N4*P8>MLcKCv)|xK!BODQ zaYetq?=0q0+*f)fwq2nX`kVkS*V?=9=*PX34<%+i+7LubY8pd(VjEhDVqN_PeJMDs zezWi?Ponyb;-Mtw>Njh!J}l(FO~KR*7)XyN%jn>D)IwRy4MY`EmIjISWk5p>x|iD` zp35BFR^&437N~iq^x1_y<=t;GV>C`sX$*klh};|i<F(kPTAv90WZw5JllE}%F02jPE~nOqX=Uatwe*Y&)GUr0nR#a8 z2{}OE&=s$T3O8MkHW)p$n_#T;_Lfqo`g_azQ*8ufwE@Z^=$nIKn`sQ2PHmFIo^|4^3`?(YAv?mR0FgqQy-Jg15U2_@8OOb)w(9VOR|d$X0FK_#3f}KcR&IhBk*RgA|fLDDK3syGZ=8eGoOH z{o5;O%X+Nw1_L`))`{7q{M|M-16U`wWDBFFPP3Ub1N?Kil3s~~R1i?3Nf9-Ncru{u z+V}}(QRVcHY`_L@YPB2`OFZxv)M>pedr!kf5}swDhP?r@Ne?0yTBT3p%SSb(-bmOY zT(oMt^99v zsIg|?f>KzO1VuKC33SuENmK^w>#x|O^5|&jW%K|6CEeq7ND~gerdR&;GNlT{GdX1b zGI6(P;)dn*T5jL3tR`9KN^hDy)|>uCj`fSP<`pdd3!T~zjfd+&1vUzZjAcZwAGSd0ghRHD$b(@vn?~rq7b^ny;sFd2U<( zu)A0RXz`orGnT^qzEmsCVC*xNm2Pg`uGgh)8Tj$x1g6G`|Jl`E65$F~{@HzNr* zXOnQVBH`xOMZ$^>qE`P}%1U~CB*T>N{aejL+=?FJme9J?$$RUsVo$Ux4>7JUxu#W& z)pD;#MZwmi^$?qGh~Ou<>oV6)L{r`gKV9asqD$slLdv9pzSR3`GWUy<1pBWw*o@+< z9EI~yQ>Md6($|S}VE-PcAkyCq;t^QLhl-F*u|eF0*uLpa7TYIGKi1Q5t@CENo;DTR zKU&=-dYbCGw$-TgG*U<^`4HN)*nXv_Q6R+jy|qBabap~d8`m7`X(6@`y0vGX(>*~r zAsmm}p}if(4oaoG%3ofaI6hJq*z`Zeh%ES@>W-8p_I^>XI#AL;$V*?|_$x4=d;(;* z{g_olDI33jonCi%y{UTbo_Wep`%QYSjb97ZYm5W+&tBiE*YY`?S-r+8t6u+_UTeW5 z%__8wa>(nUS|oLA*mR}UmI~S%@#P@4no30`nI_PKTo)etVwn^@=)Hx$xQX;&o(57Tu+oxP>0JX)Dehuhj7B0^JYR-JIwj{RE#iY7++uc%)OlP@N&#u%7^6!~J|0(Y z-s^6v$JEI3HuOEI2t0bVgcMij&7Ba=XCB$EJ?2*_AaQ1%xHS*p(msHV@;79V|->0nPe=V^vM@4O}-UF4QSA{joiC#PuS2YEr_ z`@?$Q=RNVO_#VEl-v7DYi`yO=zvo1=>iq+HzZU1oPn%R2*d~n#{Gara?;_}fr4hIV zH<&hwUOPUP?FTSuI6l_1IhAdb*zvIvG$hPfVreC6Scrv$n!bIY5Fmd%J;yLZKf>G; z)QkA48@}{Cgj9zztx$t=LYLNnR#Q8)a)m00)1_6+ga_X%wQ~OQD#UWrlCy$Ws&eu2 zDoFdZd}QS+S1qrC3n10WWGl6DfVlV4!61Iv1+;RVgEQ(7NJw=w&PwgT+RNHu#ZT=B zzZLL&=Zrdd$(fs#+c~tn4#Z~GwrX?9He?4F9iH zuVZaxyR~Z+c;eO} z7EnrUYoZ*%VcRoDmn_}(%xoT?+@qVqK2GvuloCnT5zzX>YS&wnB=lZun3g)!D*QT% z*<_MN^7<-K0as53W$?!n7xY{H9o}rDo8d$Ot`-C1YUw0gO_)(l84XCvH7$$HTjt1L zX72Djls}4YRUg*WHzcOJwQXj%6er%f_fhmrGS_=nC@Gi-(fNLIURLUiI6)~7`MD~Y z4wK{DP97RANMZ+V7Qa@#ogkz1&*u1h)}i>m#QL9`95pFnYR zfV~QqIPcV=+p3_#CE=xwbIHqpJC*+%a4P>Xi3yIhAAD29#QH=624d771l9n7)qVF# zS$DkC$3DcWY@Tgs+t@E#QGrQ(YLWRdxHj9l^k2azzN`2fM{LBvagGXm=oLzpKqod? z25XNC4!mGThx~NZ44*33`Wt@fyi#e`3fZ*8|DD14`rLFeQtXYJ&9ce()HYTImotZ5 z_^c%vWf8lABUlyU(*WBT2n*Rxj&!u+;q~R32yK%C**L0Oz^^lS4sUe4d;{ZxN?ZN? zHv8xc^1f~MFqWZ^H$+nak(^7)NvTRT!QN38N*jZLKbWvLVcV#u9mkn|Y~|z@24F{9 z&lLo;%Vh8d?W?FT!?4F8OsuA~=nz|P5<#ii`QdG_f+vCyW?g5dSO`;EFa;V4VM@oB z>CT9%W`qiwAq5|)(6kZK7o{)yaIK%n5A|@P++oEUD1;yDDdHK9ZOdL#M`NVZ(hT+0 zpR-M(GGHdazj+}cuFOOp@IemG&Eo+ocT0wLd?0)=(E;n^MO8?cpd*>3N2eqEgfycR z9a&brj)OJuTq-)k{Ado&M_e+ugGfo7z^~s=!41IWOp6mwP*Pham?)_?O-Zs0nF-*j z8lQmGr4=Zt$(V#^%Iw?=h45-AEp?}8sqeJZgK&+OFaSkMUD1-hD=k{$^VXY(?LbTX z2(;9d$<^aaRY##ESd9rL(%q?Oi6e0|0;8qwG%YnnOR@(eEyZTUm=!HK`Op{9Qd@*2 z&k-4)@)W3sIHfgQwL>)}v&(V8snFmTQ+q=X0#29gW6-@pdNbWBaJ=u`1Z6{|W3FpA_#PWtA4?gAf<@Ijl)(R4zqrYZTO%jn$TC> z0&EDPXVPBhTe}-a86Z?~R{`vYjMVm;^`mvtE$zc<_OxBBlc*y_gfd#LS!045$DeuG z0Esg35NZyjMVQKqW1le)M1Cr$4|pAlUQ<&8=n4^OPy5!?I4aww`w|$!*Q86-&zEFI zIRrX7QYL+(I%!g=Dydi1>MD+`d@T41^u#~WV@@QqGA4X1e0D?Vneef6)Ww?i9!~jK ztlzW~5LdWQ%AR&?G|KRs^06$bv2A$`v;8p)s5db?<3?D(DwKsr%=Dl1u`Frj{AE@2 zElAC%dUqrN%@VPa_&XtTC1A2Jl2BTiALiq;PwG%c8*{n%#@w3wgP2>*tjgsJ`lOCl zpz^=H4mIoy`YJ#6f7;+Pir@J$_*1+jBxD#4t8fH7>3)^ele zpNoIJvb#(J(6YAEc1ZUd1zOhEqY4;H;fDG;!T6FNR$oYzMX}`vqJfimv*d|}vBPr3 zd>+NwxIQ(7{>H98!!4(f?jP5)+O;*MTOP#V*7_ATeV|1sZ(7(l5!jQHQre=p62Fp( z#gVNYC<}w%$$dRHl7ll3+kC)7d?ul>c!2*s^!S(Cwczt>1-We7QOH@Pl)FuU^Q>$$ z7e-wG9;$=0eFwTVCTB@?4qXaW;g0>)Tml5*Q;*a!^f~obuGVZb6V9bDdf*@zW%wsL znOAl)stD~#vjdPJ+P(`R{u0W3c${cGSOfd8g~C42A%OaZ3V%6oIZ(A2IKR)opduMk z-t`XW4NjlU_Y9uz;Aq8Q#$%AF!`6Nsk!XTMP7qiLkP5FR{9qxIe9;rjr%_ahC)@0a zZRoIu7e?CI%rLg0Nc-Ia^55@h)Jh_l%^Tx`_YJIum9A28#W3sv9lM+8_L5`vXc)&< zhl}+w_HZPRm-W$~U`(L)r489#-H<>26)U?XXg7o{fHXBB!};LR3O%3+!MD~)g> z_tNPXqW|2zKmYHZ222>?3WNg3C(;p)P$YL4RQd6Q)p3d;!I%`yyjx085u37)R+iVk zh)_-gs?5!IQj@ABp;^P@6ATB*vG^D&h;B5AT#!OlIojYmm;u#il)~cd+LJ$}$atReEs*c9yn)Mf zp7P-=%dWLk-=q|~m~i2sMVtvlG{~hHgvVfmVe?w?;DS^vCUToubVf1G7QP&w>CP@t zOrdP6Rv8O|K6o2lDY$2mdA{JZ-0(HZ9~dm#`qV`SX08mQkcL<~Z~zz$Tp`5}R4{m0 ze9<<3OHAquY}OT-J>Z!03lvxXmhb@MnTb)7K2sW7&Wfx| zxrlblwWVNhl`_&&lA;2KGI)puo&{lsMazmr1rr#M0NDsu4kGau4TzxKb%Hjw7qJn^ z>>`p`qGgAaQqk_3Vt@bt^PY3h?Y{FVjWNz>N`1~f=RNPo^FHtM{XTC{q4*3+AlAJ2 zr4A5Pcx*#;s7P<*Ef6vD0V`9aml;)+vna2jq&5L08}-gXb#DXGETcnQSVsG~(EEJ= z8sOX&RQC=~fr&1Y)F8YN8WUbHZ7sVi2=ARic<%_pyI+${j)EAn2rrWYB{v;_&nLnQ z5EJ1|f?}Wq^@Huk9^=lwggb{k-=;rN5E#rn?UGA(3Fi$ity;OZ*QJI3xyDI`xi{-8TW015K7CSi@_L&dKd&`^1 zUIDUXS|XnPL9pbZogCwZ!`Zjmn7r^LG@dNs-uj0W zs6|hU5(9-s^TY2Fw@-!vlW!TxPiuV^?ZqFLsDT)l4G7D z+(KVTQVBvp2!#m20+0alV+S46Eixp;@8s)Lo&#BiU34^;Xmdh+!R`!C^9JhYlDT;@ zL49u+OsKCTzBH9Yi29tHg=#Vh2s7$01?n#))JN*3EulV_K>a~N{Y9aECX$dJQ;V}$ad)7?dM~!SozTzI?_O6Aw82rDf~ft49HVBh@`{Q|MJsB<3vlt@ zXA=i0vjr4c{KFr2kNlx0P(V&V4G(U(O5In)ado)rnaHvFTm4o~!BXuL2TL#5S4n@G zYPwstwRs1c zY!&7*&_StP?cwi(CY^Qh5RpzXA8BJytn%?+LFM_MCEJiUO+Xecw7R7-!_VhD6sv+f zwibVl^o=29@w7dBN&8Q^{+_RT@>}^fIS`H|g4&Ytxs|I~)ayTkq3mNDFF8pcM5kGJ z{|!awsC2`OMo09Fhn?@BW-LAbDP7?CG0fbm&PTm)El)o6>#gBuHG1+Hb6>)OR5t}n zD!Om@Yw9oy&^((hs2AwX?=q~fTz3{%XpXgKwhp*X=Zim_SNYhbU^+>oaHV07Y43PM*E0%Pn_(vf^MH;aDhP71xKtWQv_A@1zZRL@>G+?L<$)IeN zZMe=|8WZ50yD7bFz*XfLSyeuZe9NpEns`-^-<0H4{;9>s^G08)K2=vfBz600HaE|I z?M|yZKcCO{^rP>{#t61nyAnrJ&dbzpyNpO}_ftWiDgKzkl44WgDs}T(D~g*~KFwRc{-Ruk$=d zXu2Cp;#vf$s(b_TDf4qc{;^-!Q2ykpwDX%&%g#)<`wo?EFD;yFT$K598Q2?|uU+-H-tqo2Yt9!YqL{B;e?G%{p^d}= z51)yK(6w`*Vc%%@@xNWZ?K_mgQkHLFoo7Z1LSs4?=7G6a0`p#)fqAi{a*XcPl46ZL zjENI2S9DlX;_|Vi2KSG6T>iqBe*R0XdX9qjq&b3dUvQ3OZ}^I=sY@6c#6lyRA{H^Q zL@adL)P>g66&cw7q}(!rd{#I`14Wjgf|{~~epyVJ-e}6WmO{TyIYB>L$VJF+WS~Yr z*xQ8g<%#fFYoQhj#U#NsMEE3v1>s|=p}prJd=lrVxIy^xn($Q%Y1UX0MV~Pip&$Ml zQHW0YZ*URS*ymB{Bv~TPgjdGCa}P`u{R#~1AJ=;>B|vw>jH7fnXiTjUQRj+SYAa$% z=ig|O&~@2{n5{FNcofzl4NBg}#C01n0^axO7y-&CMu1Crkh@bc0xB0V0`jz!fAaJO zqMVx|M1XJl;a+buYZP>dfVFPzEJzBy(hJIDsNxP0z$~8RUpYpotPT-yuOdXCa#Dl& zHUaUmLIjd4ML3f}1Q@Z@=Vba03A>ww-S3n3;j`7Nn6L2D8F<#oRng?QY(R#Ar4zBp zjs-(%0iq1EceptIRua}odO z&<-Y99>xTC$9G^Fr84=x+~9D`S>Q4%>M+<8L|_+*bFtZ@BXQcn1v2ugJ)5gEDCym* zYu)~Kz0$OXC|AjGSO)Ny$Qr5$kkC0k(Wy4FUhFhf6A?ZW&{ts6G%RWw9PSFsY-=^3 z#*>B|oYdsl$KD(6H1@MX2%-e!0#d~1uwbM+YUy|dk+3JeQ8k*T>Kn}?_c!VTVotH} zb6LggiAPwjEW6jC3g~o1zJY!c>hOwjC#R3-wNDR__%@>&p6a_Bxy*~ew2K9AIgtlX zhigA4FX=Vz+VI1Y043dFkl{Wnz?*8?n8$ruvlASU zAZ;;QWr~QEWmrh1ya`j~-;}I&4AB!ut|AZZ{sMXq;;Ov6CESd)P1J3&ev5UpK(sjFa2RVD?Z+pWn6}w zK%($U)yC73KW+H{ohAl>j#Ziu#Hlp(T&r7K)+MJG-1?B`aPDAyzbbKgGj|^RXbm`TWYq~A zk7CFgYMFG(N4WKh>DavW+GjR|Z@j=o6a=Uv0F;05O!eZm$qN9{c=0N~4#vj-q^cDw zGZc4HFQBPjF+iVNNo&l!GWe_Evu^3Qh-iHEA@2UeFRJ+ua`$_FeJ6LUaOidUzxV+p zyF4K`hGic8Q3xh+GYi0Jd`-cnKm5(MNZQ`~M0>m^{7@{!XS30@;sVcPgkW=hI>RN# z^{H&MQ`b}32qLv|#^VPjm&9?hU;Tp!6sB$-^xj%9?z za(%r$dW){Fweiq!eYHJ$tFC9-M6q&xr5#M+bbItR{eHO(h3ERk_NdVH#Wu*o^@a9m zr0er-BBi;0u00y-`dpjPKd#TTM{n2l>Gp^aYWm$C?bh{VdqmR7z4_zq(M=VO6?<%& zF7||Bx|KmGZW`?ovw+*|8UCdB;myUG2@Ma8>%+g#Q!U24HQHm09^F)|9w~Moc}Rj| z9PqLINb&agz1^;{9Y>0B{NCZ;D@Te^{9f_z){&x!-}V(TKjt=FVf?6-uk%23O_R7H z2_remb(<=HXYiKt5_Y3b29X}IG$v2kqK*6`<8#->=eMbrpyb0N#ap8r5ym(;QoJR8 z4_xK-B_TmK@c9jKqiqy~+1=Jhh zs~7wL*bMj(<=i5U7)UG`55-tQ+vm8AYSc=hD({7Caybd(FTaSvsV~ueUVcy}biQQ7 zqYf04t*9;fW)ZC4*mNLNv#FeS7N;eF2~BTpVNxB$2eO`(|LwCIa8w{fDvR&%XCR8} z^Xn({8mcq=L7q}4!#4q=zGMu?x~3-)dM!%N*I24s-rlapt=A&<)Xjs^GD3tjA!B%2 zGI7o{{gg4B!53y65h;`d4Ze`P0Nl^@1v#$O0V-D;`a%|M+4S_C&izyX`)RCqqP;K5 zt-|%yww9p2aS;0}Ai)d3eGP{#Sitp*)!rdFrWsOQmU0L4)0(4QN6X*(nT=L?3-?SC zS`Xi`@$|s4YgHXtq>?rsJj03k(6SA>($;o#(R(ggp#JJD8 z>!nR4{6r(xrU)+D6ruN6x6N(fhdvMnnUSY5iUJlkmGoj$$%Vf4rjqGzRS^x{R}Leo z6j)d%jY(}5w7Mab9HzWd!c;eGAOwGN9VyLUD>jv=iy~ZH!LOr}^fA2GrV_x#P8z$) z-3gT+)02)4n4vyo$UlnVyB0mrXH|W8=l;PD{yK{wkRF0o{tUkj=t?b$v8vL%s*b)%+j>~_`2u|%rp#t3x~HOCepXV`7SKL+{0b4UhJ zrYP`I3!M32BLBtFORm@HX%dify3#;LIz>&b_aA7DYJ|N}i`Vk-?#V#itsB*?wP?wm z?Ruc<%TNPDSr_e|J_Lz5W=-C!B{8p2&X)*^0I**8_iKz$m>|_YQ6c|FY!hySPKX)jm-r&zPI&DDxI`=O$EbUQu0?sI{D6pxTxNw+t4D1W$=t zK?&xm0OqO$Ta;85zF2Nho6x6vW&YVvs)DyRw62)YhFXS7;*U?Zi)=JUl_(`*s}Rr8 zGKBGD-!?R2zOzaou=_LDXs)cjlIKfrIb1ZXWkYEF)Wihzq2@4>h|XP z^K5w5{yn?bV6fV81%jbjLBvz)Gp!14r~Hi}WAo}94s zEl(!L7R2Sr+;od&LzCmU%a_Q$>ZL6J6=T%jfy! znbt4aPM(20$?)=dU7;aQ=}OOzbDY4l+>6ehrLWq2az>_5#^Y|n`O7bUKS3g2PzRr3 zl&#?}WJ}-3k7^`mYcaz1$uo!s>NO?S?>oRCbc<5d^$?%$YQ8Y(L-AkMDr-=Sl*kbDhF=C=S`d`?i1L%N`#$TIAbK?ZOr$91 z?)mPxAJ0A~6Y8jSUO^o8j;LTkyjyNGD*T))gtAiQ3*B)``U>`Am(YEvJ9HSc*$2Y^ zWTCn%Vg~@!1yMR~)ANY=Ivs8YUS#1V5aPy%V;b{wenvO-%yPY_;pCh|f6l198_O!>f(qql9)@weC z#lE7YuS@`6;We*?&Z^W>2eMd?jljo+dNnbS_OSxQYcg`;#+p8>N7aHz>sYwZT->ql%j0vbrcl&Rfupd{6xlL8xL6y6bAir4b9KOQNEf%h< z0e6QRg1fs^YpdAq_GF@_z3s8Agn;Np&_fBkXaOJ5rU9;|L{!D?Z6a)351A-r#kH|7 zYllYGDR!tEyqEUR)M~DnM7E_9^bB!__pmKYznDP%8Wg?5PJV$lC~rb01*rQS5G$!R z7oT?r{LRIxh!z4M(FwXyET}d$I-ok?8umCv4#`h9JO!JHo^e6pDIfd9Mr&`Yb+9Ec z;8{Aw?{~F)jAobvChy(g@V`(6&nj4l>oYc0m2;!)uycX57`a*MQ&0o3R8wQIRJDJS z1OXLGMM@AmeK(IEuLx# zvBX@DEWJYmFn1liW75?rDp{U|+XVv>Tt(?lNH{r@9#5L>iZO~zYdR7$tmLT7ojTke z?NLJ&ciFa?yDWrYc?G%4xR20T%li|V()`8yil+FBdQ$TjUbCa4!C#W`+*54+f|yz1 zlVk}aAka)C2f7?$rT{1|GvPn*9RYO)zpZ*JLf^QlYcuaj}!fGgt)HK-qJ6gdh!(=|KFs zv_>#FQzAr9(Vp>&{WXvvKq`$_8Fy69Y-b3o=!T?D*wBwHez7!@NuGajzP|#vM= zfO2^U?N<67Pwb^rpGx-LM*kws&4onXBTHCT631H;?Lo2OZ*v8OusgMWlI(pjPpV50 zCyTyR#wsG)%0+j9f~f~d>b@E2n051vxA3EKSsMt2D-zcFXkkm?^%|70h#L)EU@l~C z#2chA=GU_Fr{cVaJ$!E(%e9p7hx2b5SLKEGQ(Q$&qpBU zUW$!w2J-S}2A&*GsvI80xp;Cil7p>HSYY;P&Wb-=eE%b(J;j>1@Xb%6v@CpjbhDgW z=EHlbRGo}gHfTk^pX>02p(yToz9v-dKs~!~C7053S9_CC4N)cpHn~*j%5by5hCAnp ziGa3QfV&8Y0f*c$JDH7cLXLyL9a*}`s`9{HU_V84!HOo9-_2dPfXsN|Nt*Lb5c$TU(SCuR5{l_@AK9}vic zd*Q;_6m%Y%YM4)5A_lj-kkZJH+s|ZH4r3&#J0F5^b zK%=fgNReegTXoq+G@ZK!AQZ;sD0*>OEHJxb-jIsym}3Aw$+m1MKSo~OCb=Uo|FT0n znY3`i&?VL=dK6iFH8TM2jI^-+e| zEK5utYve04FQ#C4BAWn?0S%;lYa#c`BGP*T#shr8tm!~mE{dFI$A}IJCMB=d+rS$N z3nEv+v9uB*=5bh_KDnVq2Wndc(fp!{V_}GFG8h;fsSE;~A*~^4yw1#F@?R)cK%K{f zTOtu0AfU&qCMWtXapW^OkEJunq@#cUVUAXTy-)PSQM#cJXuQCxTB8O=ni_!NyF+w6 z14ak3JGtJ%krGsSIw7NHUetzj&%VIi>z|bAeeiVfXFPqN*j8|a*3(1;1_`l1aJIR(r6MG1XUAyZ zZWboq+KzB$6#g*zrfX)(c%Pau%3?MY79!p!`^ifno~RD=H%dG>w#sAzu0L=c!c~ zDaU#Ny$6TWP;Dlw25B{_8lN?(=J@D3`USe$Dr*apBL?MFJk@QR_tg*PO+A^KHzt_L zNYkcddms$nUesbtr&&uz05q_n zikbuU1$wiZj9#b7vjH+GnDL(WlX|J&v~vrR8khZJnfZnFo(Q&(sDT(rSaWg#gIE-K zH##0ZpLv&cymuB7789K8Y1L(pX4;0PQPsx7XM+o95h{;`KR6UJID&8axFJ-lo?XEX zad*UJm3y$VTWy3e&zPeLY+_T)711>;LcwUO z2BUIFMpVwyXGF4gR`o)h60B!*9pUzlRO`7%p}M0PD*+kIv}exMTna z?O5N$W`pRHbW04A2`={FuteNH7d)=5x+s;BfCebdl>&J_&+O@Zljiu6A2c+_7yY0{ zeH^iV(9j&^iJHUcY2TgTTc**>EcBnJi|~6UAh< zSd;Z-)0&Jxg#s-HEr=KXLnedCIFb6hf^M64XA19vxk_GH$22iqi5J6?59=BV^+Rj z!o1$Mm-skz2g_x{@)=M-jYn;pSQiWm(a8$%W8@$RuMvP%jjnv%c091L@eHlS>jvOg7TL5nRG;Dv)~6&uc6{Xu56lpLtX?1^N}xj{t%FAMiw_#*%OVb- z6!MJG(pnM``l!8&DPWMFXp;&UWW^|8Q15XGBXCnX1q>?C3t0fDAV?$EEJncKg}!yb z;Pkhui1zL)d)0A?y;;X4{xGn z^VwDqG96KcMCYdtr$g$1n)yHv31x^GP~&kmDgjS!2tlOh24ukgrJw z)|O3)!WM@@85HwZj zaO?Wz%MB@dqg}-#J?|1$wvt?Uh;XE`)%18`MueEKai#JCVCoNr8Lt?x1~Sy>W*2G& zS@z3Qa9f4w41Y5#b1XWnWbtH6S;j6|1t!*co7gQFbhWoKY+}+3D(9@`M1-7hun^V5 zq!?5;!nD^gB@*R3+5=`FRzQS%wrtT0Ab=*rtgT`fl?hSaJ3Rz@gm)O$G5hp29mcOk zOzltoBvUS1SJLI>#m_g{kuZG)KB8sVa7LU=Pv{nT0$>eUrq7i6jpb36PcFMM%s*ZAi0M1V5!L zZiqu@x1NMiKQTk`I>I$%NaNBpq@_gSV-=LC9MktU$G^N>_NnJ;u}Y7@7%)A<%gEYJaxi?F*1CuZ8+n4|Mr z`>sGY*F zTu;xR3^N@Cguq+PbO{F$w$@mKU6Cy#-g= z3UnrGt3Fjn6xW!jRZQ+O>B`(GY=}j8pN%${D{R5GO>Hn*$(eS62U8*DF`>Y4JYY8_ z>Nfsrnd4BVcF|Yftg>tdL3kF)D};RtVXpl6`%8-R7r7-PAf;H|L!Z6hZlpo4W&-Bz2Q9MBq9?}!%;?RjHf8Ux=Db`T=Yn#=1_$#@aYLYU`_)t#9#$r2KXj3Nv8Y} zV7lbnJ{MqshyW8?Q<(;$Att^Opp$7m89J=s62|H&WRi_i)F$%y*nz!0rbOX!^cRqTwV1GgE@uVo3t~Av4KxabG2ulRz%~gfo-M`F(V!#9 znP!n2oy9j{R>F!Z3?L$jgbm;{N}CNX4ZX(fOL~oU5?Glm)$Bpd6-L9})ZB5$`KV>w zt&C_4GU&d#F=9d+0mp1)HD^k!d&>83Nu~!w&i=dE5)t&E2l_w2{1#?rJ)sDaH= z0&%cu5J_U7B`3JBO@`h{+M)JS;R%|g>b7KWa@Yi0XHEgXla3;m_Y0dQOK+{T_`BV42-VXJs`LF$!XNl z5P&9fkUBJkOmf*J@qs95pYPP!aH z(>%6$Vlz*xIGRk8K!kZi9g^AwxSOZo9DbzoN!5aMLGLH%rnqa(xukC-DYeSbgfVMK zvx5-}(S8pe)D9@_ch~*pM8h zt5&AP6c&rTOo@tb>6m>iY6<{zxp4}>%)|t~;&-%U7nA*UNmhrzz>>j4{HIM;2dTq; zod@wU4P@~)dDZ%TJZMl=u*j@RI-4*`^b~Oo$3=!%&-Dab0EEex#Hk$E6X8gvpobd% zgZliGij{^vII$7+fz2ZD447w7Sdr#BTus^)q}5S4&^Lh!N&#LD{~gR$*89U9JdYa8 zT6UJ5_g)bmm@0*2?s*c%>X-{+BPjG5is+H0x9Iluu5Q%t!CS=U!cMMYjmY7(>~yHE zOE>ZyGdVpFQ%}wpKbB&|IvZ>c`7n z&7-_YqdmH^_2;H&UE$g42nd9GE>smuAHpLIh?O!<4WagHlvJg5MlCSnB&yE>48e!4 znbg-5KUb;9^i?cyH&)ULZnT|dp+soFLd4Hi$SYOye;ydNjq0``x{R+a@Z&4TlyG^291LyQDlIr{ApQ_ry5=0fQF(e#(fSMSM zpv0&;eX@%xdQTvSPoPU6&H=64PF3TlbVJn;7olprGv|Yj^_GxW4Sty5NIzF}ask5=@B{*G z1wano<6cLRWkh8yEjEA%l2`Sh)F`->UBwmX<^hHv>(nk@CPlb$YgMvVFRLHUM1SN&&1LB-rm-KsiX)(VYS~P>BHYJ65D7~?ieAW zRK02a4H7s+Z^)<|pR)n2Rq{E6>NXueX^>Vk^`M4ue_-UjAQZnoGU}-By1fU>1jyXx zHxgOcaiqy497rE~Rook^;v?uY{&1kAg0lMvOwK9YE6E>F?5M$Iy9$#-x0K@uQBMK^ zKuDYr_q6tF{ zd6f&D8FI0~WEgfp#A8VyShc8AdVc?i%rmWr9zr?}VNM-^2@Rp}0Rk(N>VSfr1_Q2U zT+sTl5+jo#)qF%U`1bPi{{W&j<~44b4=)ziiPY`Vr0PRK;TA5yWQ`(Y9b$&U_^Ay> zsH0ao6r_BokYmAlGbpCp1?6U=4LIk4>~7!f<4&ijKEc+0uTA@P%eDC6MEmIBlc9p? zdooyd0_mb5Jgp*ODafYUFE9C@0^0q-Uz8$1 zKG~vVCb)miuJNl+o}cqAxJ&v7Wh}?aA0gy1brLAJXLYpnP0U_kc>kLiE56 zaZ!SBbV;X_lkD7TB}V=!1L%Uj0Q-ZhM>eeQfQGVD^sw-oZplt==MPriGgk}KGIE(zkkaMdI&`$jKK!j6i z=L&TOd~YZm(Dnq<&HG_Q9Ng(fX^L7yw|4S_KLv&O9aRa5_%^i>+R66fjcF%HvTm2Z z4Loz`n;M%aItIOQw1Kx3K7uC_z?xGfEUVVx22kLG@GB1md^TcvapyM#;20Qf9MI43aQ0Yr80SQRLDR1 z874`#f=w#q@*A8a9m<|ICAz~5H#Px=ecl9B7>p@LAjh5(rhZUEP)Jxxr}%xGHJ?pE zLGyem<2Tfr5ErGW)#!7<03(Oy_@!L)C^T2@+tN?L?yYlcp;}6iI%<6lKMt z3L;G$Cv8ZG1{1c&a*qXfDHIBO6pKMl*3AS;VUcN`Wds&4VZNvK*4Q4j>3|`|a&b1H zmmUSRrBbpd?>hwo*@axA?B?a~>-7?^Z>(Qye>UNB3gl3cG15~CpJNARGkh+K@VRUf zK8J88qx6>WIS?I<31Ndna%^iZ&hzc2@Hu^(zPYblj<~L@T(0A~Qk$53%Rka!mQ!38 zWq_K*Ws7-=RM?#A&P%(Q>MkreAwfwJpTyMlF^LG)ni|5&4XWU+=`lxMCTazw7rk0F)g%2-zH%H$h-|4R30`SBfzTU^6@4_jBiejaFNI zy)~Mg>VvItBYmtHSLd&yJButn1g7V3Z`nz#oN2tVSJGl8FQ4~IMN}aZ`sKhHqYPUO zMS?fUeIXJ)L9UvAL=+69uiDWF+8jknR2R&PRYRPc=Nj}jNP)bK;J-X}3WMnnU(4t? z-?5O_5w7Ht#EaBwL_T^II`WY+ihSe}k&m&OsK#AXxrlr;vHqc-1)1MTO%8k%osgYd zfsYiM1U^E(D+R^uxe*_4VNBE?k_JDIFfEke)+F%JeX9Z=Ar?5crYC563st>_v4>z! z)O?Y42(ln87z?bp`UPfL-<)705pdw{I7xZ(b;z@)lV<`(C>4+r8OKYE;w?MqD6TC# zK79PR;s*v8aWAsPvw79xnf#Jkd=-lmZLkr_<_OloMYI^0{7jvAF18IcFxjH#2XxwT z=sf3CiP4V0#3Yb|dFf7c2T3T=%uQ%bozrrLaT;;*xwbJ?V3!_nB`9z*k!+#BLR;w8 zWy_WDYz8ZRF)bD|3skR*B`!wQz`00}1qrd%C(9fVxn1}qGIm()1o>8vPj~OSA#EB$ zM&IPhQ&{Jl;mZ5papfVlb%q}mZTKql#6bbw=Q@Tx>nws`R-Hh5JGBN9_Q?hRfI3l6b>$fDREF2;fb zlfqenJ4C$*uY(dMh1IYMvM_BxcdnRsx16!Vwe#uXCL60C_{1Zln{egu)tqd6a+$-; zLYWA#bI^O=hw;N}L-jWTq-|(S-NTpq+PU zG>}dlg77EoW;VisiIocAeeRWl3EFGL90wx8Ic;{IL0{R!@}@BMPkj}~=ximgfMN#n zNV`VN4`5faQ}}GA=Wm*~|Lo6vRTJ39`xVzdp-dc?#I+xjvjmu&&_QZKy>8N7Nw(=w z%Vw%+mjSX`MIWfMNSVk#VVR2H^Khdm&@_(bxlk&+X#SqGj2jzyo03-A$h(Q^?zt<- zE~2e==8EP*Kjk``CcU=%m_Nu?COVAu2mS)*Ne@^+sS@Xcp_Wr%imGw4NWO8FNGh^@ zW~&fm3uuHXIU1U2z{>VIO1M!|1Xq1UMJ2GwroE!Jd!hELxD@5D74ke|g)wk}J|I0s zoL|54#QBYgFHa;^^SD_JD@4m=k>E7vD{Scm0qtnv1OWm^7QVSe%P+Er%b(o#;0>Dc zr6CTl)>0-Z{G!vEJ40{Mj}e0=`msD#koszC#fe#7C$>Rh#Q2q3L7vE*Zz@szV?_`U z+Ij_f>KmChZ)g!=t6YSqa*1>mrF`NN^&3f}d>+*5iKOCODi#oAu~;mJRhyc000ecK z^esoyISHoA#IYoDc(RY38CzHR>h}Zeg8&r;Y?cW&_MUJhqeEG8=*B5fyVjhPlGqnb*9FDr`jBW=i3NOQETy%LGd!TX*ys>NG zHEIB1^YX89l+Qop{`jvXe7&^p|EWMS)qga&p3J{(Md)%AxzHk9MD3!j1DdcW7lpP* zgu{nG54nguC*butz97tP(-*SRdFNr<(OA(Wvh>S;lQ(RtIC zR@GMzfSDm2fMq&Q_Wy~E-=G#=zO~l;f!2IXk^FLNEuR9${+7OdeNAW?d=9B-X?GtEy`udBo^7-AZ;iovKsAvuUrOtZeh{bl? zJtx8{T!R9!Y=_rp>$-WaUHVXg>MTOiOoxktj|s=)@9D-9!qRy1Qsaqo&G?+W`YRk0 zJb9r}MkaEf$yAjQv3^d;Xf(Qcg{SeC6bvcQ&lK`=yeG1XnxHJdtmCV7o)l?Sh9BmN zD7((5fJG1%y9qL;zk0l0jS8&a@&${wq@a5f{e9GlR9C*sp zdq#Wo>t2pK<#Io#oAU4hOeXv)Mk6W$t_1$`^TzSDOeQzGy@Nn8{i{%^Ri!!E27)`} ze^tYAiXA-t*Yo;%P5w5A{1?~X+EM^`M`PfAo&XJpez%~kayKm;{t?0rPXZW8aeNAQ z+r}0-%AfCFaXqAulbRhcO1-Nh^UGP@@i9>goENpcjd@rou76kSnr{M67s|z>)V{Mq zNPR=VnLX*(@6C2afFu1jx-J-9<MQ|HH;P5t`)yv1xmt!VXW;t+yUUe-$qDo8cDl>>9b~Cbc5+#8Z0i%_vd=u zPM)<}Oo_+q@D^q3>;i! zlMFI;ln_?L$zt9KfuWk~s1^0B09fxOS@hwWQy>BTamcFgo?Rjmm4S=;_pM%Iye|Up>c$bl16XzX?_(db; z-vdxIFl136?-^GJFcJN=!gKfp3+_eYAl4YJYTTwEbXS>z&@Zw^>Q{u(+R@>TNpIQ1 zKyTG8sqe_H>H>3Oe^{bTJ%L?;1odx09Xnb58<2IOY4KZ18bsRB*MYOGawWEp5X1}; zkS9k}meF>~Q+_g$OgklqYV$l%VwKSj%g-aLJ_Zu&9;%!@qI(8(jH?f|75Ng*f7El& z(_34AM>Aca&VmNj5t&b&b^von#JqmMsC@W!{eWS06jNP2P!ujFDgZEcc?2bVMn5Tq zWD8h_!trMs0~o*EucO=JG4@nQsHCK~n}8K#IoQ*x67@0$c~0s&udW;Iw786Q^TSuy z&H2~OSre03HxEqK&4X8P-LODrts7AP^4E=c{fu=3;}3o#j{71UcL={3O5+JpXTrFO z;jOJT#vgn~zxFn{&Mn-FOLE$}Fg576eC08x$2!mi8fXdyTk|w-Tv#eQJJ|cH~ijCo3aHx8%)?T~`Jp zG&>w?&*IS1>@~x8F+`F!sjDZ+G8V$u&hBB6s%-qjvRfO7wl3oJl6xwUz?`)>itowoo5{Sy0) zAy}d6tkd<{j6gJiv|gOpcLq$#~R3E@I0cauI%BozU7M9;PjfRJva7EEl=9kc&F1cs|fE z$wfMtMsiV(T+|B@M%YoyMaxJM76O^KImYU^G}Rm{vY4xoO?UICAE+Jff&<#x!+*=( zAI&ZZjqt_i4sq3Pe!zej#Z2*j6^}X0zgM)`K78hvHdg)^BI-isI6_i;M&wf3EneRnlThUBixd|(jb`gk$2!gyc}*TmO?EAQ@f&PduEjH% zOA#9_j$v-nF&oylWvs%uR3|<3k=6U<10rL`EsU7LYrv8V+9V|>7Zz6@V7+Leh$N z$m^OhW{1A+rmtRdIhNBTSh^q8a-&pjRBPdN!1~4iT5c@Aoy^@%rqGAhpMXv1sLO#A z^q_r#l;`?e4C?Lg+*RA(y(kA_HC~jwxdlKDw5CbKvNqlYvg^yDW*2Qm+>#f}`idIU z>(RJ9?#AjAmDdh_nyhEfJl>Ffq&wBT1W;Mc2WHXykBE-2f;#-+|fSwuz097-pcCf|r1vFq0FfS)k6_)P^1a#pDkEP24_~YFWR;NF z&nO|{GO%hKb>{pO<+)SgQ3L8|{Z}Lfr?ON-3(Myx-SPW_K~c;7EQq?2`~higsRd#0 zyR+6`Q6nO2cgke2BZ@~CsO&(i>OxQE5;aPT2U{PgzJZK+?#eWq531`A2Qoh(D5?u0 zOSx{-O31WC7mM9b!lL5qgd}_&!xu!V&Q%b&-<@|gIw1uHhfW{fup>q5NRhK+d_q8@ zA~8Ga)EOTZTmqc7-3KV?{@(0PD6O{0M#)5Kmx3KGnRmsaK20@Ndr*5Hcv^ZFC_Jh6ff5mxA3eU~*0* z{@~tm5MD4OHakfQTZ(<=OVpUNAwq{#!;rL<#~gi7o{*mkBD}M~FL#Q@?ws(;oyAUN z#e!dQ6~Cmg_$3$dOQ(KF;`7d$UvhT|{BmcLU#k5#&M)a}%`bPJlV9#Mzm#k&*+!Gv z;Ll2=~f}Bg2IMp64>G~90E9o4)GJEe*c0I}kb{78PM}$q(XN(NxZNdO` zqRl%dxKemRv|Ny;Gf#QZ)E=Z-WZ)Lkm{3kCl8Y-%iOPut9pM$XQg!snd=a*5D6=DJ zYqcnK&ek(T4-zfxZT$>(oDI4`N1lcdiA4N1KW}X@suj_ZVfhrD_kf=_*|N)ISbn}D zTTM_rWwtcb>MV8(WrreqLQig`zT6*G!YN6ZTmGsjd=7<2XUrN#L@9gHT0{R-m^}XO^Uy2Yvyqk#`z@6OfYYBSr`eE^O8vdrH)N&SB*O%jCEIi3Fq-8hzwS~gnK6I=5JoXbyM3fr`L_`mzTS42npdK>@(N4^C!@CcVHh%O(07Q`PG)5%SLYdYr4acDtNYy zG{H!oX`|Jl@G5*qx>yv-?fSn{1)h_v!<7%HV)DV9Z4$0BO8+%kC@8%=ujUAo9F;MR&km0tXuUMvnD()jeU3BxT= zQK1PO)iSKV`NjF6PT48owRMJQ2!-gSg45izSQS4*$PfmWUuNA~Qp+tHSP8--d?0(+ zJz*AGpG8DG$;c`Fxg;V!X}_<(9?O11N-GY-1cfYT<knn ze8A!uvqQw0R30QenJp=W2Ai0FM0YpDE1O&MhInN|txRe0g#Z(e=!3*Nf1m@G1cJE` z@8&|h%Mrp5@6haXn=0tj=K{utyk*sZymih5c{p5Ey!E6-wJ2kIyT;CZ9Blm^hOUW{ zqI{%SIU?(!1hxoM4Dfo2YJsf@Hs=npz%~~GTXbA4Z+s;MHklGC#&h?C@%(33knz;Q z)imR=aCNzihlM_i@j#!0@hpq+B&HK5z@CHYh;YTfBCFXCca@FR5^Pqp9|Aeou$>U4 znb=R;><5-%_LCXg#eR4{VLvwF@nkgah0PAD>m;Vbi_=GU;3mC{tIY6V+s6flP)PF4y4gJNDak#18tHsa(zl% zk?X1U2;Twq*&@*F!<~9fAG*5I2XX;UMv#}SMYyGvKLL*_+8SxNqZqz8oGi0MKFg4* z$ecNIxPi3f1bH}I1^Eew6Ob!3fmKtJ>;>j?VK#7_j-oZH(a(f2jy}US%PlFi6-cH{ zJw#Fllly;gq5<8mnVXya6EpVc32FnKQn!&Z$aNP(|2S* zFvy%$p>Q+-@qbtXTD&*sjrXSi&G$qIVa))?pS20Ymf*}BIGO9}7N0gpiE1d1MFc+Q zto{!R+~9r9#I=?iOdKna<{Np~1+^Z_H0KWr&V=H5C4k~|#VF2%8~#dy34Mr8I7?{^ zsnHjEzkCGu!*aUxqYWeuWQKTWaUlUgazfUS6ATOFgiLb67&n?E3J;9dh=U>_X^C|L z(crj#*qoCom8KEG5`#u=V>?r?+lM7DWR^3O;mxKQp6B;SfXGU+Z*s);M1WwRwE(fK zauy)$qRtuuguT!{4J}C&_CjY30m44yY$8B_Z1E@w5dNSNAeKXbSPlU~Cwe15Fj3WX zCy5}Yd%KJ`8e5VG0)avzSUSRPWlIEM1t)K6>xfVEiOqNhEY&h0wS*903c+f*j@Mca z2_br>o_s|mgclnU!d(*y;R9DtLa5cqX$gU4e)-`#P>@*?0+jwTRMX5df@J+^1ywNv zmJl{6sOVEFJf)yQaViD1C*IEciG&bZy(13;G)e6>R(R<8wwTq$tQ|wPcGZgS-VnlbtHyZ zR}T?@$0y}zFyTb;p=@Ezou3rnW?$f`s7Twh#~evb4~RKMk{45N?mKN&r3nwhUN;E zYyVCCqH?$v?WHAo+^ZRw2AfO=Gr;COJ+r_znSihi%$_D%tKosTB>=Qo>)~CswWO)K zvX+{Pt?}uYq`8{8fi1yyMIfd3NR6#krqHs*VR>0`SUWbNhQwhjB@A>3?G~4)$_IzF ziRVIUvO>lQcvE-8Tx%~VI0bVxj+wdg8yq+8VI{E>LEmUlNlAoEhmSG_X3>HO9?26{ zFN3e9!Z1S5`wj1D!9qi|HUmWn$yJTCYpOu2R`O-^W{nGNR*Li%4O&6Wm#FbdN2ba* zP3LZC&=;i=caJ!j22Hwa|HWSvbr`2ktq$KYVRrAog3PW~U8k9yRoBZ^hgp%cm>uLV zn4N-G$8Ic&&)IsUnpJDXEpf$)mhxmY z!sHhEZp0P(%n01<)_3R3(H4iK8L$ZL@E(#frpJ)kcy0xi-IFG>i*P3%!<~}e$`8n_ z!}8!xj5rijisPrRx@Hzk3=)09I1EQ>nIp-MY)um@kuYj0SI5)H;A_?A6=opVj)G(hB;3owb3Q9f8_4B3WM9#$4+Erp44s@arD1+5XwiA*n;tY>oa-3{#C6EoYiBQAD-+YzTyf;kbrssx$KHh;_zcErt9jyQm^L++xy z-OA-w@JAQni<{Gkl0VLNY&90&{q@vf!>RMWrMcv5tJ}zBxC^g?bs!uwRune*?(CUB zHL^2q%6C__e@_3M-F^}_Q!^fT?tbIL!!IeLU(-8e1xfIg505kLG4Rzsys-5xIW{M} zr|0nDEj4_2foU_ncq9Qk?*uKUX(6jba^qp9obATr%)Y9sX^`TLoCQ*fTld-mQaL1+ z%3Ow_ta29CcE#H5c+N>CI9htd_U7jeN8ont1vxK%q1ZRP#TRk}ZgMMDj=-6-KEn}6 zUutWl4BAacAUM!;1ZqXkas>LEu&s_jq=)l50{vc^)5L4n;$CLRrONY@44cVy2nEfQ zT;Qw0b!e=)kn1qHNNek6jP87{!{lLn86Zsi3#kfqI@{teB;H6a!ZKq!1W5Z{jG{!| zXLdejjaVh@FS3Z*bNW#(@-J@3k!WXQ?LL$v@ey3IV9~ieiA^u$Uo?;6jtZ}4coesP zjd&C>5mq5bwhV@Lz4r>rJGDqZE$>*Qzg&3-!Dg1c0|5(pCs)W3|1Vxz*wLlPJb1-L z8|_xC0*}}gfm<KL5LG<8&q zLa_TyF-gl48D#}8V*1k5_$2guxehaGyj8tsuT`{>S=uSYkdQp;m<&Fz*>y4+2fLnB z>&KfVpuXx+8>iax!ZkVSEXgZ%nr(gvJ>oM6Jr&?9i|}L$*!G5OfQ;QO_CunIY%|tVTsnwJ!wni{*hNVzo zdWsB7B%&$N$FOB?TACFF{MK^M7vxW6pK7sviIZkW-AUM0qbW^0QP-QB@?*;(2(DYu zK$CV(DQi=7)2spMwU%xy$JCh^Ii?Px%hhx#JOBS0- zx;Il?lA7T>3>Ly@HG(jbmm&`@g?-`Lcjka8I4e=H$^V>-88t(;yq}^OvgHb!AzRVh zBxK9SKj3|+r2DBTEVg`To;OEf36m9yE&^=jwZxr4Ft z+A-mHcg3zKqEH>$_)0n^0AwXPnX8BBG`fPKQ*G9n7M*O?xm?i+sxV7*La7bW>5{ey zB^E}+N-`92H)SZg8jBUa>#MO?S7WgpXmm9e>s+x|q+z-mi}lsAHHmndiq}Ovjh*n< zT|r(~tMt>n&MN)o@;aE>EMAA`d(}*!=%=jdBDtWM;OnoN3BJ0`1hXdS!e)XhL~Y`D zXz1>?2fSf3!A~EQHX%M1%}pIWs{*oU3MnYM&NcTd$f4X7Abh zYB3XFIj%&faFtthTDgLvQ?1fZi%wSQFIRLzMw%r$VU@jVCLlOO0pwS=Y*l`%t6R33 zzJ;q>wy@CFK@AtRWy`8RR{4wGxpj5RRyt4O&o_e!{>_Tl*}oYkaizPg(?z|>8Ru%1 zewx==rN3NW2UDBD>%{3!%fBF3WaGU~KvFJD{8_7!uGA-;tdd!iQXRwrq|uhTxLRknepO)=NWjlD{t`Zp7{N}>2IckXpc!bvA+TJ=%BoqS8zg>UJ) z*a5T3D|WyDid8&A{9zajG_oN^=e3RG5Oq}BNUn=*BvFsPV{@g!#$i>Q|7ECg&KILR z|Jhyz?Dqd^ zLW~~op5mli_pfTJ)Y-T6RaqSBXOH_C8}*q~@+vSZ^ChPu^OyM>JJ*7qrL(?{tKvtp zqvfkVzQHuB@R#wsZq&bCXaST=?C>OJoBXvf}bychm+48H#T3sPKmhH z5tL^*8mxHRf$SAs-+CZBtt*FAzNG704rE`{l@#|c>Ix{yF8`cvso^YF!Ku`Fd)%IN z)6e-Y2ltlGd}c$Z)2{S*$qB~oa!EVz=QaKF3d2iiHI}KcN zt@0e;)?hs8CxEtkq8{Fn&S#^l7XYSCVcZZ<>DXA^+@NdE|NRXe#K2^-&Jm#5d|waGgUocWa9tr`lbsLqS^w7at0GEl_`|t)CnUidUE$ z_Fh(pg7Vw1(xIS^%ec0D;_pESvN%GLje30ob6o0z)%sk}O*KO1+rxjX4YH8ZYqec+ zKlO0AO~-t4Jw)x{>b|75;*7~=W4O>4g)-jyJ6Em>y~ZXZ-pDr)1zscGi^=uVzA3P# z%bR!4@x`t!U*M+K;cwdFnNB7J@~{ShpRxWP6_TS$2a@@GZk;2Rb%fkKHLZ<=vG_~# zPMtr-Lm$}@z16wloYp~ai}=L7O^0kyt0K6$_)zq+?VjkYF)@!oj_2B%v3X}Y_7RTJ zo@p2sDYlRXjs^vJewrB7M?9|ISAOotK!h)Xo8}1LCd6AeArpqfOx;AY^4pdDo2|`9 zhrgeV^qn(Xt23#;JbE#stA(Sbd`2aYnq)0#c!R8opHT*W(Ih_WBE{vO{C9NloxFv< zl}|j*k4M4XIKud4$Q-A|n*5iKJ;9H&{PDZRFL$$?19t%!#{tdySM~}qr^ESok2_Bm zox@B2`3=j1b~>JMFh5veDN&$*xI=-%?Yk-RXZ*MA6LI;L2Z@-{VeE=_(;=_`NodaG znOL;IPVKOr`N~<%qx5PjT^v=cVJomCUhPV+b{|#7(3us{1~C%u2L2;$#TAtYMxODg z=6ECpY-xt;PCn*`AQK%v*&aJ#ek*Y;(W>-~0F-@TsS^b`%~J0)G%Bi##mgJ3m&J^i zYt_qJX1v^Ay*xDI<$Cp!43S$Ky|a3YG{)O;)>+TBMA}S@e&_CF09Chfs&|`Z%v-=C zSoAx2r_44cUS$8^*301y?oKwyLQr7%;_%qnxBk1ciRN$a}$DBfK2(ehEeY8n7*G?T``Fr_K+aaWF?@dwPN1qWv< zSsiyoJAL@FpK=}{^jAbrX*c;3)OOPs`?h=`2&$026RBVP#ks5(kb^gOAY(f6w*fgF zDr&fKE@OflcN4g&xH&c_J$3zgpCe0|)G@w-KIs}ce6%Ct%}*k^-rM;&(POht^}Zzq zmhlz5dyL^5`p}cZl0df$d^_IyZTjZEviE*9&TxCfUjVh;DLkR{u*i>=uW7P-!~ZM4 zKFUPH^~ddRP9JBpKK`lKTHn-CG+bV0I)WUz1t^I(T&b*$USG860l2v{fo{e-b~Q_^fQ2N9`GDT-~7&sG))-n)4T_;Kkzkz zb>G)+XCDvMHDN~@KbJN6NZp!}^cnm{O^ssrUa7QIkfV%Zs?j|#rd zFb6^_bmx?!7AP_-l2k166>^|ux-7`Xz3sMo0e`wcFQ)t8Ci(}dGBshbQBBahU1C>U zL#EG6G8g||KkL?_SmeCgud~3Q<1ikLe5E5r6UEUFhsR)Up)+&Y?>;xRSG5(|?!kN) zcLdJwws1yGBhW}dTA)6(a;1eD{-9Ox{UgLw;7XOZan>7fb+)Vpl&4PF8vdv@36;O} zTfg2y{JS1Dm_Lk@uQU7??Xhwv6^o-byCvxGr~`9^4-bEow5!UwX z5|=yhxVjBS)}sw_k^-QVjVFevT?&-LGNLX4Lj7i5bSP*W#-(14#cW0}iZnuoHtu03 z;pJ{k@TkKF!|HH#Bv$82?;bXGbOCgyT=;gvkQeU1uiW?0ds_45LiTZ19FO0>#Av(l zy@dz-igVd`{0FUXj^`cB+23Bhn?nfhlxODBH@dCg_0T3cNBf_(>X+QtZ@ci6PI>Z& zdi7iG>$e@~W~bbErmKK*}m>eu>Fzt`4Q-v7q$zH9QHANBiosR=pu z*uQ-_pA^uqZ})&(@b~e84lF}N!hRvKr*q$b!elTYrs|I@JM~BKUCU6|Kf1+&j(C@d z*hXfKbH!X*G9Qw{urgGDi|f?XX2p%+4UJPj+XWr~ObKhkSDA;n1gf`f_SaMk(N#`1 zSyjTsp882hB{>XbJN!0%Lubn+Ww@m1-h7v27->Y5C@Nb54Gl&E6|lIjyMa^%s)*5WH!yDKV`tb1CtZyIH&M)0*k5|{>{i5WqceS&|nB0?AtPS%Rj z88E|U*MRch4pI+=2=Xh2BPAtB@bC-Sgz!<{VC1Gy)yjTQK(QgHWPhkB<5N^IVJ7GA zNijdhIlI1#44pa<0yXl=w)w=&Hh&@u&I(UMajgeca@>jtc^6a!ovqz5#*UCbAO5E9 z*flnc%K)G-FdY>W)>YyB5G@d_mrGLuFxv2wEEUQ1T10@1T6f(q)uyvIGjq)Nh6;m6 z11;%7{2o@m!T8)t8ty(Z^frHz;}EW#R&eYyODnpr3}R2u>%y8&s;_>FvY07#%zwdy zHbd6bJtp{w3&IC;%_)(4VKHdkLE6Wf`{fB<_)Mf?fhiEX#NGgd$p9b`J-i5zNO4yk z!V#w`2O5GCeH7f71W>DzQ>Nik55=-ZbC5yf8W7nGvCR+#V&24;L4Jmx1{kn~+)#No zYv&&qC~5#?>lMm$nDI{e==W`eO<>d$O|8j0X7Mk4S9 zB*G|i057mFAf@CRkWwfr*31QN87UR7B(M-9g+w*55(?E&`@L?vm!#Mpl%D=~LilPS ze0j4amVI%98xf{<1AG+X;bZIv)k&EligA0(*v1VGXF6J(Llh%}&TLU^&Z3x4Lrcf(|YzOZqauJ zbC$!|ho`oc|M(I5%KMkvNH53Z{-;#qlRA1V7yl z440$}>?t;d<(@La2bx%Z2G=@g!Gik@EXTtBVK4(E-^by@PcltHaxIiy;;xc=t2&tA zu@>9JX(rTRff^sHQo;&OuF#>g`97pz_l>_`Fy;oWLr`%bAJ`Hut{7^u^dt&gB+Lc9 z9cm*SgT-`Gz2?Yd`1YbTJ7)iL`eDu^2t@q?+@@O8(YpAwuJ=Jf&tyExPa2Lw#D2m^Z6^Y z@J$OPNmRiH#8QORu}p@bm6pjhB6uizEGFI>LmGH199ut_7ra7%-xW&@4COaYKQZFO z8nW9C=6CUQ7vV!sZGe&7LwtuHCRIjbvA}RheL|%LXN}YBu5nf_-M5^zTgY?hY$D>O ziq0IhS(0>WZKXZR z0*uIM4fO_NfHVQzDi9TEKq3L?0u4W!klP*r4@(M8YCRe%sd>_rr*m2qysRc-ER|f! z$_fEBZY~L2AD?u10z*B#3a(k$^*yt|rHB8~fa?e5v-yvAB<;M|32q?+77Gb(*%RBv z!YT=O3HoV`c=(DK2NZ5@xT-~d8>ykzH~%9%=zH|?kh33%8tl#1wIcnc>Qzu{RX_%; zsLACP53-y|Lw|r1IeLmjJj7@4zVgwZ+mQK7bs#73#ff}87h#9|cq|uNQS{JwzQ9Te z#n&+4WD<-Y<2%u-6Z#%;(KU`ybzuS&zwf9%8vclhf~p=MU2s_yu@8YrV@!>!ta$E5W5d!m8;dz zauC$Y*=%h7`|%B&wk- zehK^nW~d?R&!O=)^%u9UWMTe9u+n&&D(i_|^~7dis$)kT_aq82ws^GSQmSWtyxmMf zmH1m5HvEaDCzm9xpbNQ6g`+mYdIhkD&}Fo8)EdaMKS|KinB0vCB$3Y5iKlANdelY( z^EaVSW8~%8U*2eyqwch{>c_uL$ z${ufGv^wfflcI_c4af6NO~(L3!m=@-S5j%BL@tpi5!JXLl!*Bg38MCbGb)CFWCPj0 zrbO0Qz`6|_MKvXQzC9vV#gvHC9^Ow(kSWn}P@?A{45CCEA`qqz)M!eyj9A@=63Ou} zp+ueWHWQ?2N(3TAvx`BCXft)L01?-+7urFKHl&)F7J+g!_+qVw8L3`?Vw@FzBU4Uj zk)U!eT7=|}j8wiEw1{~Na878^aC|`hHL0=-V|0Kr)|W>6g`K-b2O$Pt`*m2n5qiHC zqOtja?}~#BIs;{Cgx_t^2<|?H?BpWhU^3u)gNh*JJIGvGrr4 zTlMp!qp>azkFL?>fzj9La{uVH-1pcmN>!YvN<+jnyx*Qr^r_27)H|Vl&w5H1~BUCmWsQZn&>>lma zr5N2%!Q2xyT0l;aT7)BEvd)U|R6~>cwb0!#Cnt$mKo`NfE&RNayrr!Ve-q&yWXAJw z8<@;7DeL2R+njXvZJ!9U66gzQ6cg_h3!$bg*y1BXzfcM6CWpnlwSxu})l&6kz=bcR zog&B|;_Nh{gZH@~V@!ZxQu*?K15aSLfaAB@!(YtdLiP^NA!t~oP($`P?;F2cidv(2 zwWw}kn57J|f-sG1b>@n7BKTQF>5_2&8f_A~E5~;E^pA3X{IL|dE4V{V&;{S?z(?`D zz4?pg>{_NQhtE5Zbp9ocWxLYJ2Ez|eU_Y-NOqYHf`a@r)Wh?+7k!4cP8)$@F$(oUf@&Z;A*#pt#vq zal?^fZ@jp{1+PC+ti|u^{rkEj#m({iI{)5vq_`=5NA&N`BgLNhy)#wpPzKpsb9I!K zWQ_4F3Gyj`*lM^doH>vx)>V4nWO&57!p=0jh;`kqT7r>Xd!%@KbR)J2U2~)u$M0+0 z%Ic9~6u(2~-EpKS$b8o-cKG#>?uMtI$(1EU#0Lu(cTLHoOR`Xik|UWVV(raEo;9eD z!Rk5QGU=7@^Stzy0yaCD;jPVZ`dthfw5;T!lSq@BKR?(oEVE*+Hmxgu4G6&rRzHmKufu@G3g0i*{Jlmt{AEx)3rce z*OknQkLr4hGc2}>kuxl|3c_}e>G`cX@2FLbb+%utxJEf3TgBHM$R6PG_5<1dT&_Kk z-OB}e_#<3)AIR?E0vG-emv@zV4`jD+`Njj;8kfC_PGK1w$Ow}Ol zWiID^Wp<kc0w4Fe>g5KIn#~;vg4^h5d^4*cv;2hm5!HJUqC&cxSagq4zBh z7VkLR{uZa0#AMq){7UOveGZnQ$jhOYNWUc1JcxGRN&KIDTCNhkV8doGnZ8C)e!6}k zXNZktearHb7eu_52jgQImdy(K+8|j@YGsP57bpoj?@Vo>0WQSdKXNl4dEYTQ{3WYw)^D?m#ER9 zkI1h&YJ6cgkY|;}*7p`fdHEA=^(7FScUBL?#6boqL0{tLSRt-S!s`>^!OZr{W9_4( zZCu&aqQm7!Iu!9_-$H*aSe#?yO8tKQ((edU(ny3e?|2dvuxy~nuVy#?OC2coZmK?i(Yx$59+yK5&JbXD#^MiUWdc`)+#c3HbwE1*pG8go~4=5Z~<6g1iI~;oma6Q@W_1S5v zq;r&A;9LN)oo~(1C-&wWJuN6XD`^*fOP`(TRm+?YdFBcl&tBr0tQjvgp1sI3MU%fc zd1iLjJD9)Vu5{Ibv%RArLU;?xlRR=f9XN|#&#%hc(kq|gSLJT$mCx~Oq8Y#AV17c8 zgyNQHu8(tHKGD+zX%qbCg52@><+cpoa;r$R9MR4(5}3 z|5R14-BJP>%0f@}WcB%3ztw$st(c82ARK;xcc*(t58EeUn55go?AdsUo?Fc2RL1ND z{lJI4K}0?uF=6Frzi$I6W%wIX7EiO#JjL`;RKtTl&Y)kKh}%`@0)2WXse1adzgw!j)2m&x~_)>|2=^g%lEJ&y6#pn4UM(LS4)fFf`>C6zf3Sa=jnh`}X z2(H}`!VEW0;1^GUFvtna27MHW)ktQP^aI2Opin=+Y64<{%iS7lg-bjE2`W4m0C@r; z)K9=mo`4M1ljw_sYEB6YKt3Zd{hk!ro1N%le(O!lYzVY+3SjwJw#TUaAA!-W+65#J z(y#MlZy)q0A6X*Bx@BG{s zzx;21>+$DpU7V>K9GDFIQuEJA2pYCcCieQ#uyuytdVAQivd|CV3H(e$5fa4a-2kFU zfp8!fAfyBeNN#eS14&e_$>Z?%?vKA3RJ_kgvEEy%qV3ayZ8=~Kn$I|%mD*)F_6w@?if^w46g%QK4G?m=ag$a z4o~HRyEU~U)++mg*6EwhH4(t3x#saZ_`QW`YTE%4JjF9*6lF)%zSz23tL6o>9oVN> zWnfx^XJ(awX$_v4Rc>aV^L)E$)t)%v3a^VWz^?*Umm?=~Ih+ zN(#Iz_Bku$YuKkX`ZoIvojcfPY4!=b6JwX{M!nUv0LZd_=5t}X@xDfH_{CxgLz|^n zlaldnCMR=B6MiIEaNB%z?bPrwO_0Q6i{o%LZee_o1o>2UG4PFv8hZXfB8W z9dnQ=u`P($GT$kBunEq!P$8hyKc*hdR96hY()CA6Tr$M!zo&I!7|=6Mm&SOOZV zU`z@hh!IWhAug5S5XO%zFIJ&D_GlE>FPUc!DH&k-Ip>e?6TpmN=}gaJpaU?98#$SQ%w5&)snCG5YDbS{S#E6R0^4h3HlaO2s4Xv!s_ z?^5gwkG+OCWsGGjBsc{nVF&DG;bL{AvM30G&X}V@Tj0znsofUxW`e7D5dXY7%#`v)Qwa zh7rqHD(!&XNbe8xZW6Ja8-*SFE`74g&hxa4Rllgem0TUa%Ka<+aXt-AztYf)5ru#2%`k$BeOATbb(7qjAN_c!kQ2;dwLI1v85gsi|$ zm?Qp?Rf(X|?*|=3ho(4S26^}8+1N4LkU^j4PbN`UQ}7(M3H_uYOG}bIBa7|Rx*}Rj zS*~vQPl|K8g0&lL)Cyph4u-!k>r?Q4so}%#T)bZ5>o=bCkCcC%#s9_Y)IqxZJOh#y zzyL5nkCh%Y06ND&(JuLS2w)xa;PnlI=U+1w&nmf+#Dd7+Ab~f8CK0G z+Y36_7^}4CdEVHnOl>Tygp}C}*`={mrM1-=_~2rGiV{8i2af3- zjD*_*jd|cfGWDY&S#rEb8CGG(c1orWtm50cI>S z&yAdpEem2?Vaz?-U9b~u#Ji3Br+HM^p5MiA>w0B!sONb5*W&G?nOga6q5*kZu^|7{ z?fX69PD`^&rb-ztJw2lvxN|VD&6jQ-7g0>11J)mk*uk)3?t``d8R%nglohk?RyS5R z3_l9de#@2#LDiZv^%nMj1K2X36T;43mM!xT>+LODCd%r?ZJEjc3u$Eu0#Tl-f8hr< zvc0!g|NP{~8)wV>JSy-@P)I1^H<~T;hPP~)jg1Mq{+HgCd7VVeuw|NG{w3SwtJ(K_ zi#>khZuR}9*yGG)vB$Ny*dt>0TkKIV*tBV|^H$%Xx7g!b>=A^?TYU#7?D3$~$xs~+ zbJr-0NwFMCXWS=UQX1q9)bSGgWK*6m+MQpK5}voD*z=;Gu_jm?nf81EaVco*3EmB7 zRj;7u=US5Qi>w`TDVW~H)9&mx+jzJ!;M4LE8JMVP_&L@HF}?E0cIPp=RBX?lk<$Zq ztJ7LSr>UtJe!d{ZE!)C4%gA<7E#oVrLx#|*A|^=ix=_j-#;NbTDOaqS`bBS}%BCoN zy?CD38=M}ci{aqSr8nAxai+qF7E7?U&=geKW4DG&2ZwQ`6s8(X8H&uElfjQ|aGW&s zOL4l`FBPZD{XVQ{T=t;b`Prg=4O0Rm*Mn59I9(MhhY?p<4iu-07iii<(8EejJa(Fv z-iXrJd}07N7!0W3jjk#%6L47^?X^kR={()f-I$PjThnQwiF}e?JDnCu7mif(Y)#Kf zA$8m?$IB^hmnJpMz|D4HhQ!c$aT2$i+hAj=rvwf*%6c!c+Do^+Ly_!W+78p}k#!U( z2)1%hVTY{9J7gs5E{4C@^&ps-H`K0O-}jSn^NJRot4RnXM3DiQI!_hu%|OM7?P6ZS4T&rTulI7X6!IuV>7okKAE+c zPetu=2^;Vnz2fK#HZ2+?56>SqlTUb-%x%-HJehXh5M>3KJKG9a|E$EEg|?W(!lnOt z#gua6dX^Of0?1tn?3arYrn8v}yY>t0*;e>)KCdfoCKpPKVP*aIRV&+sGMdrjM~Rvn z>E;oIB`uD$kRP?POgKEaF*&wS{xUISVdD$GCNJS!l9q7s0NcHSm~3ycKxI{KS(&3v z$ALtf*NBFiT1@#2t|-=Gcg1B5dcfrX!601rv9_S91247hXxn)24%E%&Rn7VUeAz^z zWD3I!-#6|tzpQ2xDg1ZFSG9o7_yXvZ5i>$%z0v;d$P|=9uk6~MOlhM2Y{*obEFIWH zmUgita%r;k&aa6q(Z)7pNm>13<8+^w7R!K+9;o)?`=b0^Y1PH9M{CK|aLc^PV2iC) zwv)eLAc2ki^^a;T%*P5l11sChj7_bs)03F^mcQWjmr^3&Y#NJ{-XgBl-as;G`w7}Jt)Hsn$#YOolhJ2QJ=r+sV^2PG zgOMp4w<|dW-Oz5Ir+zXGS?2TD^Q+}qNR0Qf;A!XR!NoT1mRUH9wq4Vmr?My9`Robz z+>|HWGq2YZ4)V$t`kH<|%81}DRZ?LvQi_(V?*>OIF$@8Y^1cn&G(DV~==ex8NX zr^{ZTOs>5zP0Cc&3!vi#?ai?^di801t=;v}_56Yg<(O!1Yg#gOWvr}SNgI)~1vSW% zvnLe-^V;YJx_LOXjh;f>A5&skDtrRJe;R>3;&axM!|CYiV6VG#Jc|YhuyA9Ltmp)N zgORhrlr;x$T=PMeWLftmNh{@u9S=u@Kf$8F?6>^InN)ubfOsDaH2E1QH+y*(1VWRB8pDYT{uBhD+y*Q>vE$b)s3SY z2**S`WKHbWJnd%2_+WfUXtTT8jdnG*>+4d*RK88G*z5Ie!Xbjd)UKbuP2#V=k|Plt zl7-w=BlzxWVd0?irN@N;EGiG7v`EpE68GeHA%B{)UHp*%EEv?2OP}G4_SGNZ(Ttkb zm+#SNw}8y_jc)olYw=dx11I|h*nG6d}qG|Q7w5lBG{zJLS(UN8oZe2@s|&U3}Y z5LGsL^P5tobE*{DwpQHPs+4fJ$*b>aRf^UpTgEXJab8NN!BgVhCSTl~D&Hl7w1Hg6 zUwe5A3Z!#(r~ubS8#94>f|Ev`fJ|!GB6b&~V&dNLn92y`d{o!>94j8y6?dJpx)Kli zpsslTk@T^rz~lRMMQ_8v(yRXJv2tBkq@GvNh0y|&Q_1!+XuBX7z=k@z2 z-Y~jW&T!bP-UTz#Z$dqv()FE46uJ^Xik{e0pyd;~LU11AT0g~TrMGyb&}z6oPYEl1 zT33;Af)LKxr7kE)idXZK2#E61AO3K++QXl^9PN@;j&40*o;Z(@B}Y3V^Ls#BLLYbHWxiFI43FV>;04s4!Q}!Tb^OP}JxlEIxi8({(oqwiR zKgag?dbHZBUuL}XNuKM~uktHPcfI;Paroxh{rs9hhWUI!5P>|4H3~9kQ0-q-*EP25 zGE?Taf+iH$N4{|x*uH)L@JARaM>~==FeD7+E#<8o{6}Svk&S}ml;S(!sMDJ0pNaM} zEzrE|lBZ(8#?BXAa&A&05IjlWo))8+SqT=H^E?Xxc10@OP8s zpz?`~U|+GFqy~9br>e05q^5)!Q9aYm)0ph!XIV4dl*MERfAn-y7Ly%8CcT>JrYt5q zf=o0I0xLlyO!%S>8fC!pDL*Jq>N}$QL2H#^FFX==xc{**DAPK{IADM**cxgY!Q9bf zf#b|9#vXVhCQ$^$CIs*i%XCeM4bViZqfCn4V-2JnS%Sf-3D)s@D4t-lwLl@8%2fS> zNL{wEo?(~>iTws^BlOXD>IxJY$($t}Z=KhTwSIP*UsEA~Qb1I_qTyap_g*wML1z*1 zUkHmAmL75}{Z~AErS?cp+&-oS(UE|B3EB;~Q>U!VOO3$ev!R!=LjqQt#ews4!Ep6TmZ6c^Zex9;P6-u9u{5VTdR{D(fE$YL%n5H*c#$KJ!8;2a5 zEL8NKnm{W4p7u)7^8U}YejyP>&Cyp&JUWm1r$alG&mclzo<{Yz=4**o)oA?EeAVvL zU1+kk-l9H_hA2(xr6wClp$PmjqPi>!2`Yup!(~rN_TF5ksgb}0m(_JElyc&?CXPrTl~e7lD`{?!_wz-TOiVE{83)=E zGOqJ9#5GL2m*m(R)LbN-Uog+^-^@Ymrs6T>%;SYmR;Lsw-|3Zf7M39+Ds)T*C z333Fln;>uA>OpltIG>S4^eJ7TiRWQ2kmE#VW2+Ma%?d`a$l(A0B~fb=X+)da~q+ctJbB(R0+yYs3FBTlzq+Tb7&? z4&$pgUsI&RKp92`Zh@~K3;``R%0Q+IVrH}C1fxy@0+XL%-C1x>OPL)Cvldv-cs>g% z@SO3Sc0VOdKq<(Jo;F9Z&vR~WLKZ!i-IE0!!pbtcSbGHQ9$>FnJ79@k3#>|8L_j)q%Q_Ln`?fFoy|AD8eZ6x04u2+ zuGSXz+LR|5g2V=lqpaN5+)JU428P&?z|zXkkV^zsFQw+4Eud8=Hsxms zW0p`0ECWMYI)YGfg0DD2r0mtJ0hJ#B#781gMN$808!9PdgP;N)w4kEA4H+sA_Y+je z+mWI2SrG1NFn9_o>eK`(z#u{8O-SF6%odB-tXPnyu`LpE!39m)Dt1H?70yJ)4oV6Z zVrhd9Q$p|yF8JC#l!jEhy@%3+;QG`CkC11$ujED6ryrVmJrIk#X#d2zJ^O3AuN@W;5pw5!Kd z%MZA}lFs!NW!D#?>Hrg;Z3~Xy9F1eT=}!X5`aa!6QZsXcNCb@<-5|4|LcnJEQj(S&(kjG_xWlFd z*HIZAgYksBT10uw%Ibh@BjKo%`dH!DLjMkodPrH^495!M=a4uQ10Nxx9gnU@@i5#l=m+O({ zU-mX~6B<)B|5{3#f2kdwe@R)!f#ItZt1lK$NV6bdll}%uZy@)zO-1WbfHKq9R&rC| zjf^v`0`GL3&IQU6N$m$12^R(Kagie+@RSc3zlf{U#qMK1Uz10cR6N@WF`Ai9I1#gK zL|inl)2w@v831@Oh^al}QxpKdcC{yFGJZZ3=PT&RS)Kq6ZKanB^|H`lfyuq`3;G~V z-`NcJ+?4RqLCgjfb0MJZfRBN#)!ffji$8aw`rLisrI3B2t5EwZl`s|B4o;b6gF0> zsKnfqH&#*b{PB4|wg}Wif6A)R0r#wuunEXjl#-(^@h&s{A-#aCk*WnG5TVlT6WrQ} zS=v!Iz07+Wyq2*BFP;&{(TMM=lTQYw*DFCfI^#r1#=Cg?ob8JuT%bF~4=~MCDJ)SLz0HPeRCNrQzqRwjpBWJ!AgyuI6whDEAQ;#yH}OE;SsAwSjA%YCh|HzsB{`0+bzlQ+ z;ufULse&Y>MNR;%*@ndRca+f}c!$SxB67~L@*#;JlF@o0qp@|AWHh$%8X2uOk{8ya_2vM! zhe8$z>=287nq0>rkTUI%rM}K z`1_+$p>Nvo;}ZkO>jTYc3>g{mbcH5hAjVxy34Y{^hKts{67j7$WM?BhkoMrgZSx1_ zI%U`V%J2Nj7iZqn;cH{80K}oGkqk(y2-BpK`{d;QyP?pehr|9OF_~ATTHt*_OADjD zP2cKdWSP^PPXL@KNUTps>)>Gs$% z>;K@nQ-Zf4FU!cOG)}T?YM+bLWWQzMo$RSQ*S68r_R4Fh4eH|_8K;{bJ=fH6#&^}E z{RKNGI%(Nb;Ls2gi*X1%1EUsjdutGY%y2^KCCPHLQe!x8LK?z8E+n(l0Tm>fSG)k~ zH3w9j_$<_;2v))T)UKmNhC%&6hjP}hXnGY5rcTB z)KU4N*;(@tOmTj!8IF5rl}CcCZr#r}OZjFw-}K@p9gWdb60NOAV{kT0Uq)2UW-*0Q zgpWLIyjKJ`y;sCkn%$xudwNhV&Jxgl%-pHV8Sr(s7p9L`P*f;|iCdN)iz& z*-deZtiwV!hWvbTjF!#6`48;JwWVM8KFpN{Y+m@ypZ$#+K2URt%bdQ4nqjy$eglYo zA2-fhHe>#^xC&7$Hkk@=T3(IZ>^U|3>8`AGi&*8j3?y}xnkTwot4lZ+X;a{Cxm7y; zjaOMWjK|RPF(Z^HcuQbPHeTI6L`4_aa!^gr>B{^*+l_H66w&_Vf{dg{0f=FRTQ?#l z2a$$kxySN#x>nAZx3pCVsBV!VVLCbqd z@33-YJChCY*8imlGSe(l#R8hLGc{;jIub^LTfl^uu<%C-Gt|4I-uGXNyjT5iTk5Do zG{TVRE2}k<;z+-NM~Sd6{pFkr&08S% zr&MdFvt!dk-ivu-vkJ2}9iXM#zO@vLSC)UAT;f#1GP>x|6rsAth-(Ih4m+?KG52G@(S*g-aHa`Nq^{{+GLpcn-gGAKPdL z>Swt4^c89j5pI)z3+0=dyAfi?wL1wGEDAm+wqLE-FnY4>x!;FPrbVV%2X*KqCY1&%=Kc1~LTNP|hQ za|b^bZs;2zo3d%MUzM_HFAf&!#{~OP{ZI?`U;8|Rrkm$E;jj$0H2**!GG@6NLg-oL zZ%T45F!qwm2f7w3!*UkA!^seI*Zq2(MuoCcc6#{!<4#Yy<3j${hDcP*^o zfT_|!?jrJwFBSRb(Kzx=gLu&gvCyq|Xo8{2RC?pIplD_lV*|4ee#>3MFZB9x1 zh_X00tvGH{FcS-FO1n+l$VzGC!ovyN7bK>tXf-V2T!P1}hCDi!6hxuYt6w68J)&n0 zO4DY3B6#{X4aj2nN&|nL=961niL9IIhywl%7R11TOtx%^bxHU1C~k_}4C3a+&%uE zhvbF$EfBkMoCF3{CnT@0u?-2cO-N#nnTOTYh`SmwOw9HHtMJ{0PZ8L9iS`A{)PARFAFAZ` zWjItf1i&EfY>x9IoJV$S_TP77+_)iWPrR!U_jK`yyTL9Is-#^P&{_?j=W5>Off-E& zcS=#jMaQIZ(eUFuF2IBJiJt+DL}V2{g-s;(EjQKJl{qA6i71t71F=dOwVX2@JsJVp z8yA$f9oiv&E7M|`l@V=~ZdtB}tR_Xvdm*Cu* z?bkZo>A`v|IAJwo@tV+B)P{zW8kruEP-x+^zu7IWzqkMCLTGfR?-LYI_zh5kJ)iKc9)N5IoZBhJ39EyydKV8XAHi@8wb5vy>}u0c&-LQo?x@m{2J%2L8tYn( z-oX1l2MlGL|eQq2|GNu;D(LU9CS~o}vfu?WmKoJaL}lX*+_i$~h;#_tR?iU7gRC-_rSQ`lJ(< z=@UT|t2L%~ZaFa~-;$&w-?Dp}Zy|g67L_62q7>v?Wc+-K6rXRA)AKFDdA>y=&$ot4 z^Z}x2Kran{A0W$%$c~#&GYK=c|1zz()fskD{mvE{N;5|~4;QjqXy$q453MGq=YrNu z{jcSn%JmCHh8G5lcXfWI_?GVNReX;(GS>P6hQRgFVl+=+>dd>kw|`3qZ@hX1x|1O7 z7*?j0$W;+0TZtECzUm3mi-NAAS)uZBd}vSZ^gT>bGrKT9H<+F2_sXK%0pcFSXb784 zX94vYyqtO%SVp_3r|KW+ko5=T)7>2U<5(zH81=NbKp*!>{b4IWcjW>&J%o*mVN#ns zS(V@Bu4^OZ2t+%+f+d%!cdz&Rj4fJ8tcN*>`zgsvlLz5@^ z%*Kh{g2=JVB;l4~Y!e(tvp|Qmhv8z!H~^5~BG!ffLBOLt(h*%OHBRGM^DtzBCSrzuQ=u@2lRC&hfx`?rKo|7Es=kXt$W9 z;qQTMM>_B0_+Fn7f;@Qhc%GG0i$d_^C|}F4vBGt<67{P5-Q(_fu0AYS&DDRRYESe= zhZc!tTVYpvI4TyQjPs&RPRXMx_1PNLI0s3w$l_h$c8*sempnTpNx579Y4@)23RQj^ zCXp4h2UiCjC7>TUVt)8G>56xIs+M}ir}gbUWBH@x7ocd9H^}Fs9i7~RN&}*cy-`=@ z9KIdZU+HKZ`RgnFF|Fg40=vH<+*7m)(|FvA`rmv8u3HZOV5+SXr39K>Q|`wyNX42Z z8;AS9R}FlO6e^UmH@U_(<8EE<)GVwOA0I8V?nZ}rAB{ivdtaIeI(*fri;fVG>Us_Y zMG7J=3VZI6!69*Q=@!3ezu??v0V>AKwA^CP{OAzm``lkhq znc*kI8kOxUO8>4(=Z2qPqF1!{vMpTL-`fT*cJ0^#m+gS76|2b-&CdfBou8iMIVM>m z!X>A0?nDV5wvJFa~t$#ry&{9Psm<_0^NGYDvDgaD& ztAqaGr*w~~3|1rgCE=qBnTO2i4K#h@hp3Ki5PJLLdfVAnZW9J~wNNSV5Xt&6-MI?6 zwfuEY)@aUoIlf7vYreZxm~@ueRLylpXcqR;R^-X@()$Q+5Iv4TZ4XJ ze3W0^J}%U`hYR(Q5m{bSm}IL%iLg`OZG5PR#^^#)8TX7<7xa1LhaLxS3Z7;`or zsh=4OLh4yLsUH2!@gc%~szYC>@4e+N?PFMYF8udaF-}_5dK*WP0lMoOwKFJlAKon0$ei2YnEnooi+Ye-R(Mx zK_X3PFjx2_TzIhk%iVaH336u-1+U&UF>ku*%%^!P6nL1k)m}wg1PmZK{jixUSc0e0 zQa~zR*vAA71#$Zt`1~~nr|=SHaZnALIpSRb5if56k&A%n3U0*RAOuGViCWLVoV%c{ ziFFPGg2R9yA)A8WFd*o*EDA((N>=(BfYQ9YGXxO~ZCi@eRn;PlPrHjn;040BerTMF zVt05nG}^Wk6XVg)DgcYwsLTZ?Rz&bz#UrT-ztDVfVkkLKEIZ_F$=cF1EE~&avqjiO z#1*gaArgYY{5m8#8(>=a=&FkrK6r8vQMfBshkRRw@PS(p0tk!xNGJFn{w>s|P^75s zs_|?HAG4Mepnw)7dLq48C1GQ}HMN)Y8kCyqCM?h|P_jBg1B+_d&Zf~>I3l|&7#d4` z_jc~qi&GN&)x)!8Bkk84egQ5|`G(6SUgZz3K|U|f!c8c7#O@2@8}#O5rA)>JCdotP z6D8}Gvd47@qB($B7~RS&3@}JOqGWEo;K9zo?Ul9i@GWdk#Rxq-L>fa(SgU<2KH(sA ze}b2AmZYM#$=I3^EunJK`9qzbK_lKMbzeWqmasU<|ISae#*&jN0kF&Y`;<3~wZimW zagL;~59>P+{w&u`gAYwYOYs%&D0k~u*cJKgIwHc%@Gk9o6;=YPr1elR^~xuz*`@v> zDzc|TOHe$M9a)^0;z!g?2cTtVm=x)n_v^}@_-S2f`+|lgp3tpN7pHJ6c4n`x1ZqgU zjZfVZ%g4&2yv_*lx+`zy-IuTqh>K{hUJ_KV2;DK1sh5*8q_wbDGXrnNV{ME|j-DD` zr2#bKv}^#_sg{Q+vliSM9*Z8@t?xrW@2&xTG1+cS%~fAa)?M2uk9GcpJJtRQV?0Sd z@K0E;N+xJP!$+Vl;~I;P#doiC&rqxI~m}j8DYOMLc9x_^1(=299+83!!bM z7Rttd0U7#sE!CPAQB&>fs+CFzJi2PC*Iq=hFD;@f zBZ&rqfzRTT8ROR#iP3->B))Be#2>i`5`(G@woN0knJm^3W3D) zQ@k6act+yl_~w5?zndA4&|3H3JdM&vCn$ZBQ5r!2j5#_kh0@&-lMqsXR59!c;$z0_ z*{JT&Sefi?LnzFqIHWvT1OUQpvLkR?%8p=}K{cz^N>H{IZ$knlqY;?fxAh>H`5d^e zl{6Nc?3!1X!*{5Iu4b&%DSyo6dsPg-hTh+TKLtOYga_&heWOKlzu{=@Kmp#~0;#3+L#36q^5m55TR_U#E^Z=4peLUK3 zOen&T&0ua{5pSJE{l<59S;TSs;WDo6hU?+&FkJME++SNBLR^vR3)h|xHa;JkE`wzA z(wP*S2VSyLT{VI_b@MKP^Qi>h^9j7?O35^N%A^W*>jzjHc6aZ3&&vkoZhb$c)XNK! z$4?jPiC@5wo!-_mRnCQAg;_Y@BMAp57LUoOB4$O}kn&bOhIO(yg6Xd-+mtsMgiOcp z$jk_F$S0#C|J=vE4Y5>Vi={h>Eap+GTVMs>LcrX)$9p{5;YDhzru(wFHUbvI3v0=9LgG1iytw zxOfcV;)j4rz)}JANw~-x&B$)Fb7r$}ak>zfeW?o=z-e>Y`QWkv294>>6D~sc58>k0 z30?lcMd&i<+7Qrbx@;-na_KV2-c&nHmqDNjU49ImDh#~a=u{9*Y)qk5>26A+vW+vF zbEQ$)c!+7G3Tj-0g=$Kh>Wbd0rY+i3*JL=vbdzD;8uvqlV^&1k?yIh&6t&Bpk%j}v-L|x1?WnZ6MFtFgilSm8kzC-oQ}~j_Gc`=& z=xCS|?wfXRT0k&Ry&RR@f#bX0wazsnL-;nnw?kX5T7!jTYrlhS>=H2;rHke;oI-q< z)dx%l$&aj`n)n1TDj@sk1XJo?ksZ1m+SCZXX}8$s_*9RugGN$4Lc5GQn8>IHuxBD3 zJgr?|UWQU<`?JufM%)&{P89e^j2wH8hb4s1u`0yO*%aWz6KKZdl&`fRZFa+OFLbkc za-Jt`-7rK3_QWI!(TufyOG4tYS`SkDUAvJ9@rU)ZX~o%Q4*!t)oT2lHP(014FTE6H zFf!v~9-g;8V8-XU+06KWB4SCXzc&AR!qz%JX4Vta>77qC%j!SY`M2~<*0mSZiV9zF zj!H8Xk~lZPznQ5JWB#UTtSs%UupXcAl=>n(r7e_C^Aro^m&;S&96Rt7XzYZiOzd=j z$z=Tl6T$H>jI2L3rnapAq)6Q08(!8=-Tbqb_2=J`_5Y&D`iZ#7cqo&FyePT-=8KT! zwoE=vmMxQCE?I{7?m(6i8-gsa$OMD$W*^x`+d0!F7z?2iM7RFaR@708rn-AKf~htf zl2eXV1_V>~v(^x?h-p63In2vr{9qm>^0;DI zRuP}JQ4o!dAf&x<^6;sPj`(5cPv(-abtu<>Odr-GQm5r(LZ9#$T^JtKV0}adaxme+ z^*N%yNn59b8AjJ~-QcI^*-RN_?6W8*9b=*TvkbE{Wakv3!_c=aoE!Lrij12w0%wP1xW8J=lKg zVHf2LkGX1pbuG4fZ-)4&*=#3a-tp9xdsE$67~yBPfI&tMV9f+u2PCWrz^*2HmrQys zA$L|fTfz)X9Ktufodx6`NWjvd#7=pk1IZhO^M4SO`!XXuRxS#8wwrdlrNmO1p4>uV zHnN7L8u%QGPMtX=7`&it&$-fO8V%zC<1ad99MHMOSEw zX$KYA4T0roC0F0b9_L&j{hEzR+2K^`9YNnp$6YT#yM+2ezIpnC#^kA~6Yk{(O?YS! z-P%OVSU`ijMd|SLkeh^E z;C{u48V~8Z3;r_XxQz$(gOQ!qm0{hdE4tpgu8G*J0~Q;1V<;v}0+Ccd=vm&W?du@9 z2lO4lz-q){W9;~*de*VxzMyYp_U+~!N#~Z8@xfN$zHE~>N4runL3-^55j$zn= zwopUN7#V>t^(AAALAgn9y$EAz>Kv732sG=ksa9#R{GnX77i2w3k8B)NU(991WI{&C zAnvmd-j|Ii24Q4Brm2+{Yqu zq1k*)Chm|dcmAub2ARN-Jh{7AbcuE#;8JXC+{}qATcb-#YEhmK{Zn0vE|G&HHOuD_ z0rf5nl3CIbP5x(<`Wot#`Dyff*%tqS9O^g9l4x=*EbVZbGkJ%>9gpAaVGf90$5XyDfBw!F+I?iMppf`ag3G7Xz3GN2< z&nBl9xdG05PE^`38$4@w$)vPpstgDuURkp?!^goU+rdZL)Rvm85opp;E%S)mwv3qc z9B^{!8Er+JOyh?`PA2#fAt$-TF8UC2loewM{h=5;e9<8%O@S3-hnzf#%L(5d!qG+= zK#DneCU1Faw2DavJUcV>4!ScxS>zFeqDHOLk>G^e7JwYy z>K)4n*e1_$AwZ)f&^>+hi2B19K3JL8&+0dib+GazG({=~E~-7L6!`SACyegO<}DbW zJe4E-C41ENPRzpQ6 zGoO8UtS6&|hNrAe3=!pWzkQx`+5|N*UrBk*m>0^cTOM8|uwQu7wrQcrd7IW08RImJ zcytl&+tyyDxv#aC%jLfC*d4ep%5QLAjKHI=_5|R-5m0;4t=eghtXNs?ct8uelZ$4v zC!j1CK!H60p4^13sdRn~dyWJb1}7&jn#9q_hJ^>iT{2&p8T0ticm+0MW;`FvSoROH zF2IO;^xVw0FJ@ed5B9~3`AkqZGmdxQ!fX)Kgf93KCRK?&*$v4+3GRyMA?`X0 zca1O>frVR1I`cI-_ps!3t3o+f7bM9f;KE^ZJrfSw6EUW`RiI}t(TVqKJlYO=vw3b4 z+!iF9mLeV5PN|s9-AqkS2M{X5Mm+uL%zd%DZV#Z@?E%D)w*!zp61UcLS<|K-$=aLn zZw^x@a1m!tj;YJRAW7VfNlp6+O@SFCmSfH{i8vO{E>c|_9y4K$rFo%;Aqy90zlaHB zZ_HBLYo}#@>S=jgeoYQ>0R@!%rjvX+xo`V)8sW`B;fGL>+_U7&89nRDnNyWybqc0z z$5?;BlB&~W-leI5-x+styaf}){ztPKi|$!-Msjut6=}DCLy_k`<4Uf;3yBK6kmPil zK9={JzY#xljqqD$HoyAId8n093uA3FBhVaJNIKxa3*H_p>Gw@|=<&AJs zb?4k=u(?!hx%OoI4JPBLKyyTD6%M;`*ibeDm#XxB%4J8U1EqTTkgjwQ4s9sPD;USt zd|VFfAoFC-@DZC%Hsw-bhR5TZm*B~_@`*UDc{0$%b_fNNbKSBmz#vdK4lj#|8XAd- zX6y_mT885=Ls|eb8mEX9=ebdyxjF^NIt7Nzuwq8QphwGl0Iy;6X++6cmyNb$#Y~6E zMbm=b({CEXhDv6J9aPc``>KmD?6zJz&9JT4UM|CCeeA%n0e&!SF)cA{sm#H!U!%$# zTs8iRIvsBq_mujq17;e={XR1hI627EBxf+=wzU^NEFLVDyoqtYd%O%&Fyjv15?VBb zug$z6dk!D6Y~bia`qgOC!L3oK+RPhOf_Dy$$ayU0y=>;)kC~#RZ=MxAoL>?X)IH9& zf(g$Luh&45I_u8&wJXQzKEci>z(M`%YM;L76z0eAdGL0=xAUv`u{64QG+wGj<4r!X z{D1_RB%$%LPRxG#vLnQnd+ttCU$`N=|L)IpwXLU^X`*&hOll`*hib(e*sX;0u&K8z z5;@X&SsBU}OsyxcB(Py_0J7O&kh^%L>OC*hhk%PD1yPqu6;0Z9prs!onA>gH4*V$@ zHE4cbADk%3Eun1|=vtFtf<|M}IrYj_qZKGv$YdnF#0+BrMOisG%h&?StOXQI04wsx zNKHdU^3d7>N}$UseXxKM$vu{g7J9S|S}a*W$wEql2VIf-5Jsf*H^Ky;*|d#k z>ojT_j2+GV#k{eKU~hd3JE}i>3RKHWdx2bU5fx@jJC}up!Vs()+GRIgo>(>5xZl!* z=T7BFBpJRFgTso~7S0px3>T@6?a^TIL`rdyTT1vPxCCP9iYAOguGqqm=arfPH0dOH z3bAw{5qZOGRSUY}hiv|6pTmbSYY_SMY#TE-o4%h-X zFC$54G1g?Uh&Lw^TC!MJLgOn-XsqLm;TEuH*7(Z2SVE(Dt!GPUP{X!_*0;2!3L1Y) z#z6%phg4v4NChTXd<=$#gr;652~F(N){f|`H;~h?LPE1K#S)snN)npBN)no;Q-%>C zku5Rw)?j3BR}$KCme7!nkkD)^DOC@)5=&&*NF-1-G`G z-Xqyi_-z|XX&Xw}wxNUw*9d<~-h_}QoDUm{Rh>p&3mb~$HK+Dq;=}0S+#ZHalGif! zXL${C3tRTc49XH|`oXFf!nEu#l+11?u}NSor%W^MAIba}FQysiA+c#DXDabpRPAq` zi3M_>B{q|LK!k~9^&%2m+ZHk{v4QfJAG!^UcaYei=OM94mo1WsWe&H?xsb44Om>d8 zT(+E8qMPL>u`tPdqd*wWIKvOa4oOLtM^R~8l^+p~b? zR1lUStl3G9=w%_z4Y>t*<| z%?sM#cd9=NUD6?PFPr*>C4_BnuHVIjRR0#Nk+3B<(CB}P1^dL}-fil)kEhmd^uIm1 zm1W*`08e+#Pb#?yx%n{iYzxNxN{cbN&=1`$Ni`YulaX zY8=xk-6ilMq8MFlmEt!Vog~72dIn)Kx`|HGGjsG*&DQLh8xjayJjhIXBNUPnLn@L)-uZ`4^!nT z-HBVnlN+`=&8=-Ix!f%?cyd$i6t@$;iKDXs_Ux4-fvD!@sw+Mi@ zFI4Y9oJ|(@=HIdkQRSgX-;M9?|tMc`|i<8)q!*dH}r9 zl|in7AKcdWqiVkRcQ#V@?&H@+^XpZ#sfU_hr|H?C{_hFMO)sxg5VyL#g5N{^!Y^!S zXs@`V8<@rQ3zT7N_xZ;+bWqjmpi^}?*5SXCW&?f@sApVh2KkDQ(m6Ysl61HZOFO@# z{wx2cCyAz~&;%)a8#H0^IAaGi(Y!w8?p+E^G~eH^mGX7Mk5MGl6~b_;)Ty9^0~`eo1Ti%niA;bHN;$BGy2 z36iP7mgjOP_3Eq7{1|KTcWKN^_`B8U3qAEuMbH)gf=?MsoVu0r-lXIOzr$fo`5j@> z3s?qjufM9gZ=?qBr+(-`e%ue{r=t#K(sKV3adgjLy&pS5|v{!kTi6Ul+$2baBI@Labo}8*#3SkXUkJ9mMR!r5dpX&ABV1 zgZkAOk$nrpZkHqhTp#O>NLk?X?EAVt(&bnst`B!fR?hWImxKyj@9$#N=6YY3L#DW{ zYjc(B-5fT><&#*3xO{x{c3nO;TGi!yM`Y+-D{kl9DK6hdMg}h5F{*UA4HFWVTSp^Z z-cJeyF7F$Sb-8)8N0+0cYjrtHkDJ-;>qf& zh@kD3bFVF3?NY~f2D=$ij&o~@%sw@-gB}V$L}~!ZTHD)6u)=-`L2^y6~7&> z$x4{>LZMwOtmSbEh^AaG^h zxYT)EJeq+}v0H=v8(S5Yz+O9J2JD0;lZcYhKNJ;SJfhVfSF3WfcoC zpUNp}+u=(->F7(gUJKR-3u@uZgJL<>%X$%c?>af7`LJ0pdxT=z$kL)2FXq)UUP`Ov zsHRqnb%5h-RIM?IcCfaJ`ZR}7DZ`^-3x-q8K&~XrRl(skr^ajq%dD8lhkD0eX!=!1 z*ddC%z?hecRASP78h-`IZW7pB% zh0}O*>~H!-^0UTkuWZE6;U!D0Ri$LJieHDRhzr?^pZaA89DvYW3>WZG8B5W<2s`{;Y^Q?=rx7k z`?y%Ylg89kkVY22)jj&iNck@Cx&XCaP=Tc9&6K8Ank(|T&ori&+ z%}~Z{7C9bbLv3^kuQYUM@IBJkxZVxn&@9ZW2`|6Js7Ih&r~DZJn>_xi9+SLy_=EO`8M0KoB&d&!oWrkpvqmMItKQR@V>t4*6_@A` zqU1MqI9WPQG&PUpA&t#>(Y55_1BhYxw8(I^XN=%dMRhJ^;XrXUgLd0YjA-*0N4I<- zs;vt2-SIns-M>2sjqVF}XJJKMfJd@i&{;E|4#teL3zUSkDM-*tQxd7D^?_F=HF&i* zr$%>UPz}cD-~rliaH=c6h;pJefpBi=ICM1-M>&io2#UNko$#t__v%5=uCHq2Ku=Ny zyMT6c0n8$ZWiEjH2TjQZ5=nKGU;adKXyEHd=?avTyF2L$tZ0_Yv#=ocXe6`-v4+d_ zfnZ;K9f>I&zhk_}a)vE&>5Y~EGw0WFR$~1Nzy50-n90?}@#1)Wb=@8QtL|7{hDH72 z7dJZf)nr8)70p}qOuRv)p|J6DkMhclUMX4m2Ts-EyWH)|cjDc9C_q;o#)Tae?bQtu zPeFLCpZ!s5ccYd1nRF-SbhO^#GEy&AR$O z=t0e~d90WG7!5+}Z)#F#!NID~sl~TUl}u69v%9+M|`_>RdXgIDc>J z%G&hB(Jfy{=WMSmO{^&GaZl>eAevhe?3N_%MO+Tze3PX)%O@JS8Mvt{ioY-e^7OK1 z9@(178Gg4u9Z0gXqnL;&WSDcLf`&HBjm5NxJPw^V>09K^LlkF_2}#L+Tdfs09V3F4 zQp>HNz%u6ySyNaX&-)8ru9i3+adiepB`H>-Yiv0}R|Hy1T&#o{^d82>W#F-KqhqAG zr1OlS6mW1n^tzz@qi}U@;zWC(M`D+c;oh?(!(v||QSEJ9vZirsl<(_I_xcL}MXmP5 zz;%MHZXe?I=b8tQhWy}xsRxjV`dEB%Kewq?=tQeljz`N6UPaU75PCJhspdMqQ@3Ao zJC7=QG5WHu+n;dh-P}FkyF0nN-*+G5Zt$Ms<0O!ww@>o2TnwMkb@5O!JXV}fw;b5K zp{n3>2p~r@fsKSgvl9v$Nn>V#W+K6mASl}`n9vkla6v<)`;sMj15y`M8&?M3J*@_1 zl$BtS$Y3N!lH`#Kv`-E-WOtghK)kFI7xOde)f6;zmxM|#pff>cnM@b7>VL!qt@?xR zo>l!fp8^X>Zi7rr2C4cqX8|vYj=``ZaXIXWxyN*+9wt=oK^Gaqp5}Mzu@oHozIY4* zsWUCXU;2mOH_wM?#9R=YCS;PQQ1db7UFEUjLb4z58!|bQ$t3kiBpW`_-LmMVsl4_@ z&$`%d(f^+yO+BWj$)cZ$MUN<&7QJX5Z!`#y7CkSdMPI(2MZd&?M}*YJi}-?wOwhGz z*ev>)YDtSeTn}JES_f&-3kLkVH?C4LkLN{<)5gB>g5)qC(7D)}Eg?SmRG9?`$c1KN zFhXq^ElHl83tb!C&nJ=UA#$k7eH>f-Y@EZ zCpCfq{Dq;X#XvT9N}3nT+eimUY_wqbu&&r@&US;_5Gvh0HT-@3(&W_&QlDXnHbL;q zz3(HZSw5nMq3L|jR8xr?czO`Yg~U~v2nSm-XC zZ!*YdSgGS(Jek1J#~=Z`qf%dPg$se=@Asr4o9oAMlEE#>f3piaLgZ1!EL`9W_t3}= zhTyWVno({p2_&?;0!xx)GJF+Zkrsk+FtoKvFcY-k6^K$$H<3bqH|xX4_DW)Eo?ENR z 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�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 PhwGPI^HF7b*ERh=Dv_oN literal 256986 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

p@(PH%&42iHz^X%1j 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

LktKy+e|0h6ilD!*1&( zfef{lK)0Bcp?AZ5mfVIVuz;QoZ7(y41xv2!1si6`#VleSm1qEs&z9+J)=L3DST+Tj z?QqIo$`#52d5|4j-5dd?j<*Z~1C!c!%|s=*q%gezhXB54qlO{p-Kf&qyQZOw@YryJ z4d_fbOo4x<2^Uf~@WU5jJQRa+mV=bRuZ6FmVr?EoXfmqS850sq%GDB3^pM_xwop*v zP7LhTlB2auFRV9At}@9bg9&1t0s%pA9Tosn@s%>Q8cUT2x5^=BTrLk4W71173x_qR zlA|BQlgF6^)+B%WeNmIDzNpAhPY?*CrJ(6(ifvJD&RGdfsjIy#7tD*I<|2P|gal+F z6Qt039seoLgoRK;%jm0YB9V@T`_vR8Wq?ecG-fD=vCqknU&P&jJRgv$sqRY`Y@jtv zO|O;58I}ul*>9mTw@CxsS{MeQqG^JGG}}XWNEd19*_~1_Bh ztAK=oinVP(08~abr1hUqxpA9||G(RI786^m_vhY)?;0lml98G|=@YdQJ+V8OC#iAO zuDGeK$(8e{azbVLb7IbAKBR(z2GxiU%uLCTEt6cj3qDH$leO`S*ME3S>!hvo}w;i5xDYt+A`qFVcVX=QPRNs;G@Dp zx6OJHpYXw5l1tS|f`%N)1tje^%TjwZ%cgvAv#h-{vn=0?j=5RZT54ul?lvao0)k3S zW?5x6vn&k=p^NrSpn|x$G9|gf#;8F5 zCOdDllV+OYxT^B(iXahPg_GcojohPxhT1g%L!cmNAHgYl@y8C+$Nk!v1cx*B`yf&X z)SYCdjXxxJceS|jr}RycG%ih0C&_6htgAPhSKRc|1!-)*4|@zWlQoC6&^VPHKg(2g zlHEQpvnGk;)m9(tA#LlUE^2D;vGu-G3e+sD5+P#k0i{8Ujj<3~in3X>gSw_7aC(ny0e(+c_Gl9?qgD;ln!!aN zy!lAkdQcKW#^4~3uM#^?qD7;>p)5fBOJRB*S|+`T+N^B@$Z?sPZW4`Zmp+81H`R26 z08SWhJi_eCx)vep^9fagsQ3V$~fgpuDZ$ zMpps+mg3It&~5Zk-?(qy_SP;p?|f^w#%h4f!09ayNSL|}DA(We0N*U-p|`$OD0JIf zIXbGxUZ@+PB=iY5Qcg#)i-7!6T{Y`s!%uVgsF*`jsx04sQ%(_1j`q(==?y^p0)&r*7T7Z)(TX{{6H2 z4o>gbIk&C6-8;2sdhXUe*X`SV)9lWzd#P;i{LZQQ>8s{$7%VDDlD|pX$vD^V*>}_Y z^z^|!mmS>m-8W6o-uivBlr}v(tJeqgV%v_X`Kj`2EXII!{q$_vmg{Ht?Wy`$fg!fu z+gT=!u!;p)|F=(BS0mJ`?ha%J>;{Xz-fp{o-|RNBS{WszW3stvpllUS?N*wy_W6A! ztYSieY@5R@z5#TX&2GQOf&4wwbNl!0ots_+d*JrEtevdlN?OL~YK>!=IQc}{PU_XS z5C^LIoIKC>X7zpRT$$qXeY0Wr?lN6pS4sQR)YszL8)L8eduMl+8EAQu`~m55m3?pz z!@gsB_w)^5z&62n8^f%@{LX#C+6w)XZ)`=I3X3UI#+V zO&=5zs}Mt$?-7d3&0jaQcV_!dbMyQ5fO0cC_ue2hSGD`6=5JKuo!4!@d1`LY_wj4_ z=JqfR%4uc;&SaULx_M^$*6Qufz1Q#CzHe@iGH#oj-*NH9hK?6s++Xu0+i&(^yZB;C zxcK4{Pa_t8yVCBQo-N8!3t{%`#YK|*IelGAU&|D8x6aK^@9BMS*4oJ#eE&BTFtvN< z|3$Bg{+dq!o2E79qx{zR9p-n0UybQhap}&v z{kx}bEq3nNzk7NQ#Y~A16|>XxH_h&y-cd~L^_CSk?S)EAZ=avuvHMmli|k3t?-;-5 z&oT(x&)>fN!V9N%TyWt7gZ|d8b{0e8wv0TqR*yj_RRzNgFJa68~%w>UGuDZL`xiPtESA+V-7H z*?n`AvVv;_I9CL%OCZKq+@mPr+<-8wZoBA`GSx2O^oBoi6W~Oug~iF*o0P__y@x>iwGD zw@%OP-8Xd|u-LhG?>+;HOjIg2EdGF@3td)WEUdalY}wxdk9`1|5#Ysa>I*Oy$myfU`Cx0T#` zZtqQdwpq{TssR)q*n9o_HeHpry!T{!<9D=aKW)=|xFuc}xQfn}efk z;GSI*8v_^ajkFLs_r7$s@KLvlBLx)?XFg`TqR3jWZ81T1+3NX%334siY+b} z!pb-=bej?&5C|p?Js3y`2_e9H0TNOu`5+KdC?7m{2_KL~_yWQ2KXdP_c4c7*#_wHo zn3+3g`kB*a_Nr$vnVq500YrOv7pOA5x_Kr|TEw{3>o z3}~;x^eQnfdWc6?0jdEtfa6w%kJ1ALVIw~5N$W6xkmh+Lu}!Ge4mFD`d+>k6ROqTYy74!!SY`Q+9vm zAUzi_4?uYIbgWqhy;=>$!U^aJNp&c&BTT9TbfU9J=Y&!Op3dww$mS$er>F|r2}TA< zGr%@M9XFw_B?!9*f?(Ht6=BRpqhXRL6U7Lbda!%g5|0LgXNHrcyatD32`JE7DO9yq z!_qbi;^5ySqvP+Fk~Ik`h|pfuOh_uhu+W!U0AJTS#Ondav#twJo}Lr2t}hnmuB&Dq z^LeCQz;}bDgma59JIeSF2o%QWK>4p*9C`V6*h0wz5sG(e2ARbPnhLZ`uKO-l! zH-10ouHdY|Xv-}&5Q#$J_4}8yust{PbJm$Dh6pnj{eHB~Vw0FBAjI|)-flZHsiBUe zBbWrgKNZ~xyS}!rUxifxW1_z!9`9F~)`j_Q0H^@sPjKD{O{qk@31l1?ZVJMXi#5f= z+emra&1?kb@~{O-TT0j>u}06J!y9rs2L=L;X1m=n*u-bG5msBH!`5tbvT~4~v3N28 zt5I8g2sE0dSuRPJj#G24v$jBkcj;ciVyw&;o#$ihj2(v;nel z7b4Bu+k-f@$J6iY=|FO;wowrw9uS3@8%JLL6iseTM@Vv@5+Uh6?UV-~KDG$37;rp$ zIJ>`JG;jVo`g{ud$L+Wd60D3tf@LvPfmVgIV5~6batWQ=jkC(&PH^Ll3C{OewxW`Y zF+oSl&0L~;W-=PlpS%ecI-MFxzucCTd{0xku|yypCK~!qJYMiOvRw@k#ER zNs)WtZt7zmy2%H(jHa2b3i!l?8gdS0+FuXIcJHh-ii4@b1wO!qbI%(e$tN?TYx&bEx z_@1WyvJ!AA;Pd)sdQg@g8qXKKr$KHkmNBhGZfyHsqi-Bk*{YN6j^9U zA#^tsR@bfV^r-{8A(f#ECu13GL3j-Kq+2sZdJsn*A@~9GdHEai$nJnb5W|QAapuiq z70}*Q$sQ`6srkif5lR_cY_5!Fl%Wc3$ft2~yj7UQLHOsXju7&wo#l}oI3Ynl)w9F# zm|xw6_q0L~DZnP3IWw)o0pyV%D|@Zb&qOR04~FqRdri+kT3@$bwroJm&fkiBecg}) z#-UHFwpMy#ITof5>%vzBW%>cM4g>)LwoJKg58%CCLsxj09$S|j^!3D&oiyF>iHCYI zwP7?(u5mcnXvVVlRS

Uo)X;gJfuY8gs^rCDi9~>F!OK$?UPx+>Fm>rg%>ILEtP2 zg@}`;hI?Z>`-b9uL&G{nspRKVp(uvb(h5!YsX}N(nUfHb4#aCkS7Y$e(K#10y0#&Y z_BFu}fMrEP4n1@p-7i)H>l@86?a>H;>86~(HJaf>BYX>eCXQgJFb5=aUwkw-pho|lMhiw1C-0iQiX7(zbH1iI-peFh4N%4 ztkcgR!usLQ+jvjw&Bh3V8RrXnOI;WU4&yKm{Y4+|ea>5r(d4|+S~nxs>1XNriQVlaI!Lx8pKg6lNZNnm}%!1jdq*U zVe@J>S#(<@8g3eih3L%Z{_0|Z_~-D*~abC6H+gX8r;h^0VhO@6u>5%1=h42k<^i zr}&H%`Kjb5oP~MFr9bSONC=#Txz!??3PX&Bc`$G;K}!JA)p*BvI)rl%cC?oopH*H9 z+Az=3`d@~ShC z@#u#(!ZUgq61lJFd9gDE;cdi8cj0xw1)kAqlZdAP$D`BkKzVvjgihN(J6EU8Zfhsn z+@-_Xm95Ly_|^4vn5K^4ESM>L17S5xCracY?W3c_ZDIJo!$~lfB)!9NT@nl@0ljf| zEQMH9O<@mbP~+hdFehNb=^6;x)Ri$XB^>s{kEX5&<9-a1S_2vfR_QhfLqJPvM04Nn z3=a=uGjm=YNHSmUNQ}<9!Nd`&u|XAz9ohk3hxw*O1_L$uHzom zQGqr-sgCSote&CNNFbV9#|L^pbWg?FSd7tmW)}^?4;_wz5@-SNUjW-@8)%d*?)p=0 zGv*aDUnHNC6c_=?DW1MUPeU2N(3rvI#BC1jv=Br)Xd<)Ls@>*j{^W*G=PtChB&+T_ z^}3JJUdEZgr*&U=4t2I>)p^&1{{MVJ`WJe74P3+6KRDiiZ&$^>j^g5)I*Kbs*cGU+ zYko01Upz6iI0D`j-%Yy9DB2+#kNmMDJM@0(9bs$;9TS9CfLDrqj!(X0!q@Nc2*tIU zoS1@;-e=1tE{BMQba_K!M)(r&INhIzcp5MUz!WW6x@>tz=ZdcGlTTTBYR{_P)oc3J zu3Nw1w2hkr1Hn*uaNAI1`d&_qHUB1uhvFB1_Chojq)FghOvPC4fP#L%4H z8XaVyjn~mu0HGH^XWYlx=42{5ks534wEAMEqx7O37a&DGq+?kQIDF-E!poA+f&4JS z0@BKup8$evScR*fY(q#g<{%=@runaI9jiKFltduuNVz9zA5iJAV6u#;8XMS-)tD^r zSoNLUx2i`o;A}XcVE5ZJQ8(T#NJD5c0kwa=e}4ZsR)EP-s21R>bmdU3UGB5nUrS%P zd}(KA-8dc-oD*vc!_9#aQ>6{_aW)pG*y*{|lTDUg`!cQe&d*UhYv|nU>MqzEm|llE;L*fsJWl`Pfygk?UuGF0aOf&Elfjyrmnj=S z-$zCQSqQ@cbb(<}N6@K2Jg#X@BY{!daqe3J$kpVH1tI!Yf)6E6YeZd~|n*7U4`j&NfkI$~g36P)P zq{(nz?rV5Qw)RrZGXZiKWU_TR@aR2-^e_@WVS~by>yC>E+6$t+-vdq%4`yzXZRGdI zUBuB;9G4QqO`78!2J+xwWEUp(cjyP%V%O>Y=!T|@+p#bb{F){fi$dXNH(BgN?miGA zX}#QO4^x6nu^|}N*gWKd#SPhreyE@^@s|PhX4p;;i&Fh-c^1KF&_xI3fLw3F)sOO+1y?e*xk|hdjL)aau2)UW&L1 zxDY`8EV3bJfAr)03C?g3^(f5L;BiiuCYl^Jn3XNf6Gf76r(4^XZ=eHYuYMhAEK?>V ztw`-3PuDhU=Rh2fL_XXlLKohXKd(W>T}H&=eh@AO@Nr#&_@#jT0B$QCK>TvR6#&lW za5|Pafb!%c{Jg(s2*S6(20A#B15PDyh$g8Wo?eZG zp*_meYmlx+`bq%JIjzlA09q%$c3+*4rhPPx%p#a5Ku$Lvxf(E8~3u;i4axpe>@60kowe zeD{$b)g9e$^jRnJIyEsAOW|iY(5l-OlIf?`LOJUXB>QnU7Pn-fOyJjv?B$PK4h~2Zzu4uq(Z1g)06$1$K#hEkJf>Q+MWid zf@{qW!~IU=(L*?Q0kjpxtz}|L19aH{N1((;X!Wu9%*#({4H0hy;iqT=f$$bW;`x3g zcwh2cwZ45D@A+EZjrd^z=?^MBd!VtYd#nxCbJcTeYY_?p;q!fdFXE@$cTGACn14_< zXant#EQ|n%{_MCqYIoXQcDKFR?y-CAK6{J9?r=Dq4wu92Xm)rUUWd=o;Dfr*XUrgd%^RRCIZjm=acDV2 z#0e-DOloU3h5BNfMhAaHI9>;S=%5o#l8_JNMbqzw| zBjW$_BP_Y^qeq22mvqbrA7RRQ6nX^q{l2^hOE=qWw$quxqR%XL6CEN2n9Z#1K3p$v zRf+4+Evy7xby90J`>u|5Xn#MhwzO;4DaH`ewX9nalBhk5kgnL=kC3+a09@-)V&t?E zwG^q-ZU@l(lQz%~cQ$azlzRsuZNI-DB&Ndapnl{q2iA%4KFnF9EfdE-YR`i4ausSV zaEUBsbglv6QMkI-sA&{GB2AJ7%67VtM!C7bCvqjX2Ty}*F!fk4ilQvygDoZ#{+6Fb zvKsQFLZw(Nk){}?mP`|;OJ&l`f=WY`xkj8LZdcBf4$JpS4@pl;&q~kbKX3W9^n&z~ z_=@3G=}qM==^gbw8bLU3bGx2fumf*4w`Q z;6slY^YW)x`4@GpzU9_m{PHH#%<|cD+ZVn0_Pa+Oe?n1Dnme!7<@0x)yt21%-TKou zZ8@Vq7#=(`vFqIPE;@9_;d>r^=I+DM*uz(zF?)|eRvP6&S!}YU_g2Y{qDp0srP{E- zuv{suPv2pjqs&oi&F;LOWn*4TsntBAwWCE2nl1KH{DJcdgSgnIoMLEFtR{e8n|iywt^$|IX10#aTXV_+bA4&~yvk{1mL4>)ykMruYV0!4x1{oxw$~e5 z4OZi7qi86W4e5&qs=LhA^et!1?#Qzm3#R&wR!@Ucmi|Fos4u_EV(sjx=rZ>ebepW{ z_dBgs@``S+Txhl$TTIq5&rDORT)AE>au%F_{a`9D{n$k-g9ZES#ijf2*t_E35B9d0 z>Xj|VdDc#Atzqikdp3tpQCdtTi-{zz`M|vI*Y%d0-yCxliB-lz#XNS&h02+R0@-3J zzM_AHCE1pK-TK=^B4VIbduZ*pbzr3_)`o7*8qcQ#b0z>;OakNn`SERAU zH6?z7IQC5a-v3Vjqi&^QRiyJvmaklx{;xKpsH`(oxTUee1|^ig-kQGKS5?rUSWHr( zF@4?nFDfN+fxJ`Mim$DSMfr*kgR3>q?ipK~UxmJS%!NR;n9@I=Yu#rQMA=|48YPp_ zY_gPCEAwXNmlqTl<`*f&@{}o4Eu~_aGDDmxmzyfYN~xw)l^4j3c{b55J0z!gt8}|` zhjOR+pVEhhe@P$9M=amowfo{rZ?VwdgQD>yj)llja61{J@-p@A3pDg50#cx*L1GvSw-~!rStB8{JH0U_uilX9#8B~ zrmmi6Yr6ID1CRXV=@(wUZt*qO+V|J|>ba+m^sL&n*<>y%p5OG&yV00;;i9D-2QKg1 zmip@cOtMmGwa8}KBuilY`3gS4XA}#k8+uF?rVS>^SeDGutDH3HzUV~C@%#+i1A*;!8 zs+>M#Zj+1THj~f1z_9m7$qaK-NuxZgXjW1B5@qi-GxMfjaFwCS&cQLQ&3_fjSOuv{S*6?`HO*LgYn`Ulwf@{VHm z)3sjk>{xrcCL9;z2n|z;p?c2WC5A5d4MgcJ(+g{NS_2C^P6skWUEN` z<2^GqGByXi`MA228pTh5nTfI$3QewB^*xjkWI;GzQH9G5{le)}ZxW`IsWtg(f6coM zH!Y~Qs|~SRUTKhS>u;?7u-_(pta@%d((n0~_^L;=&hpMFc-4DnVW6dH#=#bQWuWV? z)dyEDb_aUj+kSBMs@SYGH#~H3jqr4!FZ}GmKH;TVYlT-{U3d3ufemlJK5OGMZynsI z3h!)uPdslE?#!8lM(98i{)t_A_UXl981yAcqH>a0U9maOZ?T9o6wv}vXjmY(nd@hW zsuu+mGw8@Nble*(z1z z&(ezc`lm&#MfIo^pPCdEla$A5r7odSiPDu)3;M@fsS>+H1qaBYXckwCk}2OjAWD`z zQ@2!s`b5!ND56C}o;b%M4l1G%oswos_>72xKSd@P#Uc@NFIP#`__r8eSu%@Ko<+oN z5>wJ_afhr(7SSmG7L$P9ny5y}Y_v+Ey~d%~kv536mVA7U2nezdnJ6gx&60GjEEb3+ zYEYJ*SS*M?o+Zeaiv6l!j7Wka;=`rA68J9qK2tJ?*GT143dDKlnRzzZj@2Laq3kA;w)VnZU^iLZ%YH9+N&3`(u6h~Gl}g48Q_<~fu- zqNk`1DMJW=`+`esB}A+0mho9#3o$PLR_RD)moyoDCK`(buoyvHq^!n!e9NW``Z=x%;EySrs+Fr` z!K*mUVxd@S5Q|W239Hc%5^qA8g$icCG-49^)9-0N*`?zH(qlR7hgo|+;8%bT0M-8D F{{^};n`{68 diff --git a/example/cosmwasm/cw721/src/contract.rs b/example/cosmwasm/cw721/src/contract.rs index 8d7f678b7..f5c1cea3d 100644 --- a/example/cosmwasm/cw721/src/contract.rs +++ b/example/cosmwasm/cw721/src/contract.rs @@ -1,14 +1,18 @@ #[cfg(not(feature = "library"))] use cosmwasm_std::entry_point; use cosmwasm_std::{ - DepsMut, Deps, Env, MessageInfo, Response, Binary, StdResult, to_json_binary, + DepsMut, Deps, Env, MessageInfo, Response, Binary, StdResult, to_json_binary, Empty, Uint128, }; use cw721::{Cw721ReceiveMsg, OwnerOfResponse, Approval, ApprovalResponse, ApprovalsResponse, OperatorResponse, ContractInfoResponse, NftInfoResponse, AllNftInfoResponse}; +use cw2981_royalties::msg::{Cw2981QueryMsg, RoyaltiesInfoResponse, CheckRoyaltiesResponse}; +use cw2981_royalties::Metadata as Cw2981Metadata; use crate::msg::{EvmQueryWrapper, EvmMsg, InstantiateMsg, ExecuteMsg, QueryMsg}; use crate::querier::EvmQuerier; use crate::error::ContractError; use crate::state::ERC721_ADDRESS; +const ERC2981_ID: &str = "0x2a55205a"; + #[cfg_attr(not(feature = "library"), entry_point)] pub fn instantiate( deps: DepsMut, @@ -25,7 +29,7 @@ pub fn execute( deps: DepsMut, _env: Env, info: MessageInfo, - msg: ExecuteMsg, + msg: ExecuteMsg, Empty>, ) -> Result, ContractError> { match msg { ExecuteMsg::TransferNft { recipient, token_id } => { @@ -46,7 +50,10 @@ pub fn execute( ExecuteMsg::RevokeAll { operator } => { execute_approve_all(deps, info, operator, false) }, - ExecuteMsg::Burn { token_id: _ } => { execute_burn() } + ExecuteMsg::Burn { token_id: _ } => { execute_burn() }, + ExecuteMsg::Mint { .. } => execute_mint(), + ExecuteMsg::UpdateOwnership(_) => update_ownership(), + ExecuteMsg::Extension { .. } => execute_extension(), } } @@ -137,6 +144,18 @@ pub fn execute_burn() -> Result, ContractError> { Err(ContractError::NotSupported {}) } +pub fn execute_mint() -> Result, ContractError> { + Err(ContractError::NotSupported {}) +} + +pub fn update_ownership() -> Result, ContractError> { + Err(ContractError::NotSupported {}) +} + +pub fn execute_extension() -> Result, ContractError> { + Err(ContractError::NotSupported {}) +} + fn transfer_nft( deps: DepsMut, info: MessageInfo, @@ -161,7 +180,7 @@ fn transfer_nft( } #[cfg_attr(not(feature = "library"), entry_point)] -pub fn query(deps: Deps, env: Env, msg: QueryMsg) -> Result { +pub fn query(deps: Deps, env: Env, msg: QueryMsg) -> Result { match msg { QueryMsg::OwnerOf { token_id, include_expired: _ } => Ok(to_json_binary(&query_owner_of(deps, env, token_id)?)?), QueryMsg::Approval { token_id, spender, include_expired: _ } => Ok(query_approval(deps, env, token_id, spender)?), @@ -170,6 +189,13 @@ pub fn query(deps: Deps, env: Env, msg: QueryMsg) -> Result Ok(query_contract_info(deps, env)?), QueryMsg::NftInfo { token_id } => Ok(query_nft_info(deps, env, token_id)?), QueryMsg::AllNftInfo { token_id, include_expired: _ } => Ok(query_all_nft_info(deps, env, token_id)?), + QueryMsg::Extension { msg } => match msg { + Cw2981QueryMsg::RoyaltyInfo { + token_id, + sale_price, + } => Ok(to_json_binary(&query_royalty_info(deps, env, token_id, sale_price)?)?), + Cw2981QueryMsg::CheckRoyalties {} => Ok(to_json_binary(&query_check_royalties(deps, env)?)?), + }, _ => Err(ContractError::NotSupported { }), } } @@ -236,4 +262,33 @@ pub fn query_all_nft_info(deps: Deps, env: Env, token_id: Strin let res = querier.erc721_uri(env.clone().contract.address.into_string(), erc_addr.clone(), token_id.clone())?; let owner_of_res = query_owner_of(deps, env, token_id)?; to_json_binary(&AllNftInfoResponse{access: owner_of_res, info: NftInfoResponse{token_uri: Some(res.uri), extension: ""}}) +} + +pub fn query_royalty_info( + deps: Deps, + env: Env, + token_id: String, + sale_price: Uint128, +) -> StdResult { + let erc_addr = ERC721_ADDRESS.load(deps.storage)?; + let querier = EvmQuerier::new(&deps.querier); + let res = querier.erc721_royalty_info( + env.clone().contract.address.into_string(), + erc_addr.clone(), + token_id, + sale_price, + )?; + Ok(RoyaltiesInfoResponse { + address: res.receiver, + royalty_amount: res.royalty_amount, + }) +} + +pub fn query_check_royalties(deps: Deps, env: Env,) -> StdResult { + let erc_addr = ERC721_ADDRESS.load(deps.storage)?; + let querier = EvmQuerier::new(&deps.querier); + let res = querier.supports_interface(env.clone().contract.address.into_string(),erc_addr.clone(), ERC2981_ID.to_string())?; + Ok(CheckRoyaltiesResponse { + royalty_payments: res.supported, + }) } \ No newline at end of file diff --git a/example/cosmwasm/cw721/src/msg.rs b/example/cosmwasm/cw721/src/msg.rs index 55ccb153b..dbddfaf3f 100644 --- a/example/cosmwasm/cw721/src/msg.rs +++ b/example/cosmwasm/cw721/src/msg.rs @@ -1,9 +1,9 @@ -use cosmwasm_std::{CosmosMsg, CustomMsg, CustomQuery}; +use cosmwasm_std::{CosmosMsg, CustomMsg, CustomQuery, Uint128}; use schemars::JsonSchema; use cosmwasm_schema::cw_serde; use serde::{Deserialize, Serialize}; -pub use cw721::{Cw721ExecuteMsg as ExecuteMsg, Cw721QueryMsg as QueryMsg}; +pub use cw721_base::{ExecuteMsg, QueryMsg}; #[cw_serde] pub struct InstantiateMsg { @@ -70,6 +70,17 @@ pub enum EvmQuery { contract_address: String, token_id: String, }, + Erc721RoyaltyInfo { + caller: String, + contract_address: String, + token_id: String, + sale_price: Uint128, + }, + SupportsInterface { + caller: String, + contract_address: String, + interface_id: String, + }, } #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)] @@ -103,6 +114,17 @@ pub struct Erc721UriResponse { pub uri: String, } +#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)] +pub struct Erc721RoyaltyInfoResponse { + pub receiver: String, + pub royalty_amount: Uint128, +} + +#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)] +pub struct SupportsInterfaceResponse { + pub supported: bool, +} + // implement custom query impl CustomMsg for EvmMsg {} diff --git a/example/cosmwasm/cw721/src/querier.rs b/example/cosmwasm/cw721/src/querier.rs index 542c63f8a..22f37bebc 100644 --- a/example/cosmwasm/cw721/src/querier.rs +++ b/example/cosmwasm/cw721/src/querier.rs @@ -1,6 +1,6 @@ -use cosmwasm_std::{QuerierWrapper, StdResult}; +use cosmwasm_std::{QuerierWrapper, StdResult, Uint128}; -use crate::msg::{Route, EvmQuery, EvmQueryWrapper, ErcPayloadResponse, Erc721OwnerResponse, Erc721ApprovedResponse, Erc721IsApprovedForAllResponse, Erc721NameSymbolResponse, Erc721UriResponse}; +use crate::msg::{Route, EvmQuery, EvmQueryWrapper, ErcPayloadResponse, Erc721OwnerResponse, Erc721ApprovedResponse, Erc721IsApprovedForAllResponse, Erc721NameSymbolResponse, Erc721UriResponse, Erc721RoyaltyInfoResponse, SupportsInterfaceResponse}; pub struct EvmQuerier<'a> { querier: &'a QuerierWrapper<'a, EvmQueryWrapper>, @@ -97,4 +97,40 @@ impl<'a> EvmQuerier<'a> { self.querier.query(&request) } + + pub fn erc721_royalty_info( + &self, + caller: String, + contract_address: String, + token_id: String, + sale_price: Uint128, + ) -> StdResult { + let request = EvmQueryWrapper { + route: Route::Evm, + query_data: EvmQuery::Erc721RoyaltyInfo { + caller, + contract_address, + token_id, + sale_price, + }, + } + .into(); + + self.querier.query(&request) + } + + pub fn supports_interface( + &self, + caller: String, + contract_address: String, + interface_id: String, + ) -> StdResult { + let request = EvmQueryWrapper { + route: Route::Evm, + query_data: EvmQuery::SupportsInterface { caller, interface_id, contract_address, }, + } + .into(); + + self.querier.query(&request) + } } \ No newline at end of file diff --git a/oracle/price-feeder/oracle/provider/mexc_test.go b/oracle/price-feeder/oracle/provider/mexc_test.go index 9353a6429..9acf8672f 100644 --- a/oracle/price-feeder/oracle/provider/mexc_test.go +++ b/oracle/price-feeder/oracle/provider/mexc_test.go @@ -13,6 +13,7 @@ import ( ) func TestMexcProvider_GetTickerPrices(t *testing.T) { + t.Skip("skipping until mexc websocket endpoint is restored") p, err := NewMexcProvider( context.TODO(), zerolog.Nop(), @@ -80,6 +81,7 @@ func TestMexcProvider_GetTickerPrices(t *testing.T) { } func TestMexcProvider_SubscribeCurrencyPairs(t *testing.T) { + t.Skip("skipping until mexc websocket endpoint is restored") p, err := NewMexcProvider( context.TODO(), zerolog.Nop(), diff --git a/precompiles/json/json.go b/precompiles/json/json.go index c089013d3..8f8a35805 100644 --- a/precompiles/json/json.go +++ b/precompiles/json/json.go @@ -43,19 +43,27 @@ type Precompile struct { ExtractAsUint256ID []byte } -func NewPrecompile() (*Precompile, error) { +func ABI() (*abi.ABI, error) { abiBz, err := f.ReadFile("abi.json") if err != nil { - return nil, fmt.Errorf("error loading the staking ABI %s", err) + return nil, fmt.Errorf("error loading the json ABI %s", err) } newAbi, err := abi.JSON(bytes.NewReader(abiBz)) if err != nil { return nil, err } + return &newAbi, nil +} + +func NewPrecompile() (*Precompile, error) { + newAbi, err := ABI() + if err != nil { + return nil, err + } p := &Precompile{ - Precompile: pcommon.Precompile{ABI: newAbi}, + Precompile: pcommon.Precompile{ABI: *newAbi}, address: common.HexToAddress(JSONAddress), } diff --git a/precompiles/pointer/pointer.go b/precompiles/pointer/pointer.go index 0dee4207c..2e274ddca 100644 --- a/precompiles/pointer/pointer.go +++ b/precompiles/pointer/pointer.go @@ -52,7 +52,7 @@ type Precompile struct { AddCW721PointerID []byte } -func NewPrecompile(evmKeeper pcommon.EVMKeeper, bankKeeper pcommon.BankKeeper, wasmdKeeper pcommon.WasmdViewKeeper) (*Precompile, error) { +func ABI() (*ethabi.ABI, error) { abiBz, err := f.ReadFile("abi.json") if err != nil { return nil, fmt.Errorf("error loading the pointer ABI %s", err) @@ -62,9 +62,17 @@ func NewPrecompile(evmKeeper pcommon.EVMKeeper, bankKeeper pcommon.BankKeeper, w if err != nil { return nil, err } + return &newAbi, nil +} + +func NewPrecompile(evmKeeper pcommon.EVMKeeper, bankKeeper pcommon.BankKeeper, wasmdKeeper pcommon.WasmdViewKeeper) (*Precompile, error) { + newAbi, err := ABI() + if err != nil { + return nil, err + } p := &Precompile{ - Precompile: pcommon.Precompile{ABI: newAbi}, + Precompile: pcommon.Precompile{ABI: *newAbi}, evmKeeper: evmKeeper, bankKeeper: bankKeeper, wasmdKeeper: wasmdKeeper, diff --git a/wasmbinding/queries.go b/wasmbinding/queries.go index 6acbe57d0..485b93d0d 100644 --- a/wasmbinding/queries.go +++ b/wasmbinding/queries.go @@ -251,6 +251,12 @@ func (qp QueryPlugin) HandleEVMQuery(ctx sdk.Context, queryData json.RawMessage) case parsedQuery.GetSeiAddress != nil: c := parsedQuery.GetSeiAddress return qp.evmHandler.HandleGetSeiAddress(ctx, c.EvmAddress) + case parsedQuery.ERC721RoyaltyInfo != nil: + c := parsedQuery.ERC721RoyaltyInfo + return qp.evmHandler.HandleERC721RoyaltyInfo(ctx, c.Caller, c.ContractAddress, c.TokenID, c.SalePrice) + case parsedQuery.SupportsInterface != nil: + c := parsedQuery.SupportsInterface + return qp.evmHandler.HandleSupportsInterface(ctx, c.Caller, c.InterfaceID, c.ContractAddress) default: return nil, errors.New("unknown EVM query") } diff --git a/x/evm/artifacts/cw721/CW721ERC721Pointer.abi b/x/evm/artifacts/cw721/CW721ERC721Pointer.abi index fccb8a07a..a13566a00 100644 --- a/x/evm/artifacts/cw721/CW721ERC721Pointer.abi +++ b/x/evm/artifacts/cw721/CW721ERC721Pointer.abi @@ -1 +1 @@ -[{"inputs":[{"internalType":"string","name":"Cw721Address_","type":"string"},{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"owner","type":"address"}],"name":"ERC721IncorrectOwner","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721InsufficientApproval","type":"error"},{"inputs":[{"internalType":"address","name":"approver","type":"address"}],"name":"ERC721InvalidApprover","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"ERC721InvalidOperator","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"ERC721InvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC721InvalidReceiver","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"ERC721InvalidSender","type":"error"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721NonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"AddrPrecompile","outputs":[{"internalType":"contract IAddr","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"Cw721Address","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"JsonPrecompile","outputs":[{"internalType":"contract IJson","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WasmdPrecompile","outputs":[{"internalType":"contract IWasmd","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"approved","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","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":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"}] \ No newline at end of file +[{"inputs":[{"internalType":"string","name":"Cw721Address_","type":"string"},{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"uint256","name":"numerator","type":"uint256"},{"internalType":"uint256","name":"denominator","type":"uint256"}],"name":"ERC2981InvalidDefaultRoyalty","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC2981InvalidDefaultRoyaltyReceiver","type":"error"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"numerator","type":"uint256"},{"internalType":"uint256","name":"denominator","type":"uint256"}],"name":"ERC2981InvalidTokenRoyalty","type":"error"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC2981InvalidTokenRoyaltyReceiver","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"owner","type":"address"}],"name":"ERC721IncorrectOwner","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721InsufficientApproval","type":"error"},{"inputs":[{"internalType":"address","name":"approver","type":"address"}],"name":"ERC721InvalidApprover","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"ERC721InvalidOperator","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"ERC721InvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC721InvalidReceiver","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"ERC721InvalidSender","type":"error"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721NonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"AddrPrecompile","outputs":[{"internalType":"contract IAddr","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"Cw721Address","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"JsonPrecompile","outputs":[{"internalType":"contract IJson","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WasmdPrecompile","outputs":[{"internalType":"contract IWasmd","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"approved","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"}] \ No newline at end of file diff --git a/x/evm/artifacts/cw721/CW721ERC721Pointer.bin b/x/evm/artifacts/cw721/CW721ERC721Pointer.bin index 700510ae7..4ce131ed2 100644 --- a/x/evm/artifacts/cw721/CW721ERC721Pointer.bin +++ b/x/evm/artifacts/cw721/CW721ERC721Pointer.bin @@ -1 +1 @@ -608060405234801562000010575f80fd5b5060405162003cc638038062003cc68339818101604052810190620000369190620002c3565b8181815f9081620000489190620005b0565b5080600190816200005a9190620005b0565b50505061100260075f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061100360085f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061100460095f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508260069081620001349190620005b0565b5050505062000694565b5f604051905090565b5f80fd5b5f80fd5b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6200019f8262000157565b810181811067ffffffffffffffff82111715620001c157620001c062000167565b5b80604052505050565b5f620001d56200013e565b9050620001e3828262000194565b919050565b5f67ffffffffffffffff82111562000205576200020462000167565b5b620002108262000157565b9050602081019050919050565b5f5b838110156200023c5780820151818401526020810190506200021f565b5f8484015250505050565b5f6200025d6200025784620001e8565b620001ca565b9050828152602081018484840111156200027c576200027b62000153565b5b620002898482856200021d565b509392505050565b5f82601f830112620002a857620002a76200014f565b5b8151620002ba84826020860162000247565b91505092915050565b5f805f60608486031215620002dd57620002dc62000147565b5b5f84015167ffffffffffffffff811115620002fd57620002fc6200014b565b5b6200030b8682870162000291565b935050602084015167ffffffffffffffff8111156200032f576200032e6200014b565b5b6200033d8682870162000291565b925050604084015167ffffffffffffffff8111156200036157620003606200014b565b5b6200036f8682870162000291565b9150509250925092565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680620003c857607f821691505b602082108103620003de57620003dd62000383565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f60088302620004427fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000405565b6200044e868362000405565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f62000498620004926200048c8462000466565b6200046f565b62000466565b9050919050565b5f819050919050565b620004b38362000478565b620004cb620004c2826200049f565b84845462000411565b825550505050565b5f90565b620004e1620004d3565b620004ee818484620004a8565b505050565b5b818110156200051557620005095f82620004d7565b600181019050620004f4565b5050565b601f82111562000564576200052e81620003e4565b6200053984620003f6565b8101602085101562000549578190505b620005616200055885620003f6565b830182620004f3565b50505b505050565b5f82821c905092915050565b5f620005865f198460080262000569565b1980831691505092915050565b5f620005a0838362000575565b9150826002028217905092915050565b620005bb8262000379565b67ffffffffffffffff811115620005d757620005d662000167565b5b620005e38254620003b0565b620005f082828562000519565b5f60209050601f83116001811462000626575f841562000611578287015190505b6200061d858262000593565b8655506200068c565b601f1984166200063686620003e4565b5f5b828110156200065f5784890151825560018201915060208501945060208101905062000638565b868310156200067f57848901516200067b601f89168262000575565b8355505b6001600288020188555050505b505050505050565b61362480620006a25f395ff3fe608060405234801561000f575f80fd5b5060043610610109575f3560e01c806370a08231116100a0578063c2aed3021161006f578063c2aed302146102b3578063c87b56dd146102d1578063de4725cc14610301578063e985e9c51461031f578063f00b02551461034f57610109565b806370a082311461022d57806395d89b411461025d578063a22cb4651461027b578063b88d4fde1461029757610109565b806323b872dd116100dc57806323b872dd146101a757806342842e0e146101c35780635c4aead7146101df5780636352211e146101fd57610109565b806301ffc9a71461010d57806306fdde031461013d578063081812fc1461015b578063095ea7b31461018b575b5f80fd5b61012760048036038101906101229190612462565b61036d565b60405161013491906124a7565b60405180910390f35b61014561044e565b604051610152919061254a565b60405180910390f35b6101756004803603810190610170919061259d565b6104dd565b6040516101829190612607565b60405180910390f35b6101a560048036038101906101a0919061264a565b610837565b005b6101c160048036038101906101bc9190612688565b610a73565b005b6101dd60048036038101906101d89190612688565b610d8e565b005b6101e7610dad565b6040516101f4919061254a565b60405180910390f35b6102176004803603810190610212919061259d565b610e39565b6040516102249190612607565b60405180910390f35b610247600480360381019061024291906126d8565b6110c3565b6040516102549190612712565b60405180910390f35b6102656113b9565b604051610272919061254a565b60405180910390f35b61029560048036038101906102909190612755565b611449565b005b6102b160048036038101906102ac91906128bf565b61164c565b005b6102bb611671565b6040516102c8919061299a565b60405180910390f35b6102eb60048036038101906102e6919061259d565b611696565b6040516102f8919061254a565b60405180910390f35b610309611893565b60405161031691906129d3565b60405180910390f35b610339600480360381019061033491906129ec565b6118b8565b60405161034691906124a7565b60405180910390f35b610357611cf2565b6040516103649190612a4a565b60405180910390f35b5f7f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061043757507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610447575061044682611d17565b5b9050919050565b60605f805461045c90612a90565b80601f016020809104026020016040519081016040528092919081815260200182805461048890612a90565b80156104d35780601f106104aa576101008083540402835291602001916104d3565b820191905f5260205f20905b8154815290600101906020018083116104b657829003601f168201915b5050505050905090565b5f8061052e6040518060400160405280600881526020017f746f6b656e5f696400000000000000000000000000000000000000000000000081525061052961052486611d80565b611e4a565b611e92565b90505f61058061057b6040518060400160405280600981526020017f617070726f76616c73000000000000000000000000000000000000000000000081525061057685611ee4565b611e92565b611ee4565b90505f60075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166306d81d296006846040518363ffffffff1660e01b81526004016105e0929190612ba5565b5f60405180830381865afa1580156105fa573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906106229190612c48565b90505f60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166387cdf621836040518263ffffffff1660e01b815260040161067f9190612cd9565b5f60405180830381865afa158015610699573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906106c19190612dee565b90505f8151111561082a575f60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166308d858e5835f8151811061071d5761071c612e35565b5b60200260200101516040518263ffffffff1660e01b81526004016107419190612eac565b5f60405180830381865afa15801561075b573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906107839190612c48565b905060095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631778e539826040518263ffffffff1660e01b81526004016107df919061254a565b602060405180830381865afa1580156107fa573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061081e9190612ef3565b95505050505050610832565b5f9450505050505b919050565b5f61091a6040518060400160405280600781526020017f7370656e6465720000000000000000000000000000000000000000000000000081525061091560095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630c3c20ed876040518263ffffffff1660e01b81526004016108ce9190612607565b5f60405180830381865afa1580156108e8573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906109109190612fbc565b611e4a565b611e92565b90505f61096c6040518060400160405280600881526020017f746f6b656e5f696400000000000000000000000000000000000000000000000081525061096761096286611d80565b611e4a565b611e92565b90505f6109fd6109f86040518060400160405280600781526020017f617070726f7665000000000000000000000000000000000000000000000000008152506109f36109ee87876040518060400160405280600181526020017f2c00000000000000000000000000000000000000000000000000000000000000815250611f2c565b611ee4565b611e92565b611ee4565b9050610a0881611f7a565b50838573ffffffffffffffffffffffffffffffffffffffff16610a2a86610e39565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050505050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610ae3575f6040517f64a0ae92000000000000000000000000000000000000000000000000000000008152600401610ada9190612607565b60405180910390fd5b610aec81610e39565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614610b59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b509061304d565b60405180910390fd5b5f610c3c6040518060400160405280600981526020017f726563697069656e740000000000000000000000000000000000000000000000815250610c3760095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630c3c20ed876040518263ffffffff1660e01b8152600401610bf09190612607565b5f60405180830381865afa158015610c0a573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f82011682018060405250810190610c329190612fbc565b611e4a565b611e92565b90505f610c8e6040518060400160405280600881526020017f746f6b656e5f6964000000000000000000000000000000000000000000000000815250610c89610c8486611d80565b611e4a565b611e92565b90505f610d1f610d1a6040518060400160405280600c81526020017f7472616e736665725f6e66740000000000000000000000000000000000000000815250610d15610d1087876040518060400160405280600181526020017f2c00000000000000000000000000000000000000000000000000000000000000815250611f2c565b611ee4565b611e92565b611ee4565b9050610d2a81611f7a565b50838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050505050565b610da883838360405180602001604052805f81525061164c565b505050565b60068054610dba90612a90565b80601f0160208091040260200160405190810160405280929190818152602001828054610de690612a90565b8015610e315780601f10610e0857610100808354040283529160200191610e31565b820191905f5260205f20905b815481529060010190602001808311610e1457829003601f168201915b505050505081565b5f80610e8a6040518060400160405280600881526020017f746f6b656e5f6964000000000000000000000000000000000000000000000000815250610e85610e8086611d80565b611e4a565b611e92565b90505f610edc610ed76040518060400160405280600881526020017f6f776e65725f6f66000000000000000000000000000000000000000000000000815250610ed285611ee4565b611e92565b611ee4565b90505f60075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166306d81d296006846040518363ffffffff1660e01b8152600401610f3c929190612ba5565b5f60405180830381865afa158015610f56573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f82011682018060405250810190610f7e9190612c48565b90505f60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166308d858e5836040518263ffffffff1660e01b8152600401610fdb91906130b5565b5f60405180830381865afa158015610ff5573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f8201168201806040525081019061101d9190612c48565b905060095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631778e539826040518263ffffffff1660e01b8152600401611079919061254a565b602060405180830381865afa158015611094573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110b89190612ef3565b945050505050919050565b5f8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611134575f6040517f89c62b6400000000000000000000000000000000000000000000000000000000815260040161112b9190612607565b60405180910390fd5b5f6112176040518060400160405280600581526020017f6f776e657200000000000000000000000000000000000000000000000000000081525061121260095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630c3c20ed876040518263ffffffff1660e01b81526004016111cb9190612607565b5f60405180830381865afa1580156111e5573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f8201168201806040525081019061120d9190612fbc565b611e4a565b611e92565b90505f6112696112646040518060400160405280600681526020017f746f6b656e73000000000000000000000000000000000000000000000000000081525061125f85611ee4565b611e92565b611ee4565b90505f60075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166306d81d296006846040518363ffffffff1660e01b81526004016112c9929190612ba5565b5f60405180830381865afa1580156112e3573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f8201168201806040525081019061130b9190612c48565b90505f60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166387cdf621836040518263ffffffff1660e01b81526004016113689190613132565b5f60405180830381865afa158015611382573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906113aa9190612dee565b90508051945050505050919050565b6060600180546113c890612a90565b80601f01602080910402602001604051908101604052809291908181526020018280546113f490612a90565b801561143f5780601f106114165761010080835404028352916020019161143f565b820191905f5260205f20905b81548152906001019060200180831161142257829003601f168201915b5050505050905090565b5f61153461152f6040518060400160405280600881526020017f6f70657261746f7200000000000000000000000000000000000000000000000081525061152a60095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630c3c20ed886040518263ffffffff1660e01b81526004016114e39190612607565b5f60405180830381865afa1580156114fd573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906115259190612fbc565b611e4a565b611e92565b611ee4565b905081156115915761158b6115866115816040518060400160405280600b81526020017f617070726f76655f616c6c00000000000000000000000000000000000000000081525084611e92565b611ee4565b611f7a565b506115e2565b6115e06115db6115d66040518060400160405280600a81526020017f7265766f6b655f616c6c0000000000000000000000000000000000000000000081525084611e92565b611ee4565b611f7a565b505b8273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318460405161163f91906124a7565b60405180910390a3505050565b611657848484610a73565b61166b6116626120f8565b858585856120ff565b50505050565b60095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60606116a182610e39565b505f6116f26040518060400160405280600881526020017f746f6b656e5f69640000000000000000000000000000000000000000000000008152506116ed6116e886611d80565b611e4a565b611e92565b90505f61174461173f6040518060400160405280600881526020017f6e66745f696e666f00000000000000000000000000000000000000000000000081525061173a85611ee4565b611e92565b611ee4565b90505f60075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166306d81d296006846040518363ffffffff1660e01b81526004016117a4929190612ba5565b5f60405180830381865afa1580156117be573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906117e69190612c48565b90505f60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166308d858e5836040518263ffffffff1660e01b815260040161184391906131af565b5f60405180830381865afa15801561185d573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906118859190612c48565b905080945050505050919050565b60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f8061199c6040518060400160405280600581526020017f6f776e657200000000000000000000000000000000000000000000000000000081525061199760095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630c3c20ed886040518263ffffffff1660e01b81526004016119509190612607565b5f60405180830381865afa15801561196a573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906119929190612fbc565b611e4a565b611e92565b90505f6119ee6119e96040518060400160405280600d81526020017f616c6c5f6f70657261746f7273000000000000000000000000000000000000008152506119e485611ee4565b611e92565b611ee4565b90505f60075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166306d81d296006846040518363ffffffff1660e01b8152600401611a4e929190612ba5565b5f60405180830381865afa158015611a68573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f82011682018060405250810190611a909190612c48565b90505f60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166387cdf621836040518263ffffffff1660e01b8152600401611aed919061322c565b5f60405180830381865afa158015611b07573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f82011682018060405250810190611b2f9190612dee565b90505f5b8151811015611ce3575f60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166308d858e5848481518110611b8d57611b8c612e35565b5b60200260200101516040518263ffffffff1660e01b8152600401611bb19190612eac565b5f60405180830381865afa158015611bcb573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f82011682018060405250810190611bf39190612c48565b90508773ffffffffffffffffffffffffffffffffffffffff1660095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631778e539836040518263ffffffff1660e01b8152600401611c66919061254a565b602060405180830381865afa158015611c81573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ca59190612ef3565b73ffffffffffffffffffffffffffffffffffffffff1603611ccf5760019650505050505050611cec565b508080611cdb9061328c565b915050611b33565b505f9450505050505b92915050565b60075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60605f6001611d8e846122ab565b0190505f8167ffffffffffffffff811115611dac57611dab61279b565b5b6040519080825280601f01601f191660200182016040528015611dde5781602001600182028036833780820191505090505b5090505f82602001820190505b600115611e3f578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8581611e3457611e336132d3565b5b0494505f8503611deb575b819350505050919050565b606081604051602001611e5d9190613360565b604051602081830303815290604052604051602001611e7c9190613385565b6040516020818303038152906040529050919050565b6060611edc611ea084611e4a565b836040518060400160405280600181526020017f3a00000000000000000000000000000000000000000000000000000000000000815250611f2c565b905092915050565b606081604051602001611ef791906133d0565b604051602081830303815290604052604051602001611f16919061341b565b6040516020818303038152906040529050919050565b6060838284604051602001611f42929190613440565b604051602081830303815290604052604051602001611f62929190613440565b60405160208183030381529060405290509392505050565b60605f8061100273ffffffffffffffffffffffffffffffffffffffff166006856040518060400160405280600281526020017f5b5d000000000000000000000000000000000000000000000000000000000000815250604051602401611fe293929190613463565b6040516020818303038152906040527f44d227ae000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505060405161206c91906134e7565b5f60405180830381855af49150503d805f81146120a4576040519150601f19603f3d011682016040523d82523d5f602084013e6120a9565b606091505b5091509150816120ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120e590613547565b60405180910390fd5b8092505050919050565b5f33905090565b5f8373ffffffffffffffffffffffffffffffffffffffff163b11156122a4578273ffffffffffffffffffffffffffffffffffffffff1663150b7a02868685856040518563ffffffff1660e01b815260040161215d9493929190613565565b6020604051808303815f875af192505050801561219857506040513d601f19601f8201168201806040525081019061219591906135c3565b60015b612219573d805f81146121c6576040519150601f19603f3d011682016040523d82523d5f602084013e6121cb565b606091505b505f81510361221157836040517f64a0ae920000000000000000000000000000000000000000000000000000000081526004016122089190612607565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916146122a257836040517f64a0ae920000000000000000000000000000000000000000000000000000000081526004016122999190612607565b60405180910390fd5b505b5050505050565b5f805f90507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310612307577a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083816122fd576122fc6132d3565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310612344576d04ee2d6d415b85acef8100000000838161233a576123396132d3565b5b0492506020810190505b662386f26fc10000831061237357662386f26fc100008381612369576123686132d3565b5b0492506010810190505b6305f5e100831061239c576305f5e1008381612392576123916132d3565b5b0492506008810190505b61271083106123c15761271083816123b7576123b66132d3565b5b0492506004810190505b606483106123e457606483816123da576123d96132d3565b5b0492506002810190505b600a83106123f3576001810190505b80915050919050565b5f604051905090565b5f80fd5b5f80fd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6124418161240d565b811461244b575f80fd5b50565b5f8135905061245c81612438565b92915050565b5f6020828403121561247757612476612405565b5b5f6124848482850161244e565b91505092915050565b5f8115159050919050565b6124a18161248d565b82525050565b5f6020820190506124ba5f830184612498565b92915050565b5f81519050919050565b5f82825260208201905092915050565b5f5b838110156124f75780820151818401526020810190506124dc565b5f8484015250505050565b5f601f19601f8301169050919050565b5f61251c826124c0565b61252681856124ca565b93506125368185602086016124da565b61253f81612502565b840191505092915050565b5f6020820190508181035f8301526125628184612512565b905092915050565b5f819050919050565b61257c8161256a565b8114612586575f80fd5b50565b5f8135905061259781612573565b92915050565b5f602082840312156125b2576125b1612405565b5b5f6125bf84828501612589565b91505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6125f1826125c8565b9050919050565b612601816125e7565b82525050565b5f60208201905061261a5f8301846125f8565b92915050565b612629816125e7565b8114612633575f80fd5b50565b5f8135905061264481612620565b92915050565b5f80604083850312156126605761265f612405565b5b5f61266d85828601612636565b925050602061267e85828601612589565b9150509250929050565b5f805f6060848603121561269f5761269e612405565b5b5f6126ac86828701612636565b93505060206126bd86828701612636565b92505060406126ce86828701612589565b9150509250925092565b5f602082840312156126ed576126ec612405565b5b5f6126fa84828501612636565b91505092915050565b61270c8161256a565b82525050565b5f6020820190506127255f830184612703565b92915050565b6127348161248d565b811461273e575f80fd5b50565b5f8135905061274f8161272b565b92915050565b5f806040838503121561276b5761276a612405565b5b5f61277885828601612636565b925050602061278985828601612741565b9150509250929050565b5f80fd5b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6127d182612502565b810181811067ffffffffffffffff821117156127f0576127ef61279b565b5b80604052505050565b5f6128026123fc565b905061280e82826127c8565b919050565b5f67ffffffffffffffff82111561282d5761282c61279b565b5b61283682612502565b9050602081019050919050565b828183375f83830152505050565b5f61286361285e84612813565b6127f9565b90508281526020810184848401111561287f5761287e612797565b5b61288a848285612843565b509392505050565b5f82601f8301126128a6576128a5612793565b5b81356128b6848260208601612851565b91505092915050565b5f805f80608085870312156128d7576128d6612405565b5b5f6128e487828801612636565b94505060206128f587828801612636565b935050604061290687828801612589565b925050606085013567ffffffffffffffff81111561292757612926612409565b5b61293387828801612892565b91505092959194509250565b5f819050919050565b5f61296261295d612958846125c8565b61293f565b6125c8565b9050919050565b5f61297382612948565b9050919050565b5f61298482612969565b9050919050565b6129948161297a565b82525050565b5f6020820190506129ad5f83018461298b565b92915050565b5f6129bd82612969565b9050919050565b6129cd816129b3565b82525050565b5f6020820190506129e65f8301846129c4565b92915050565b5f8060408385031215612a0257612a01612405565b5b5f612a0f85828601612636565b9250506020612a2085828601612636565b9150509250929050565b5f612a3482612969565b9050919050565b612a4481612a2a565b82525050565b5f602082019050612a5d5f830184612a3b565b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680612aa757607f821691505b602082108103612aba57612ab9612a63565b5b50919050565b5f819050815f5260205f209050919050565b5f8154612ade81612a90565b612ae881866124ca565b9450600182165f8114612b025760018114612b1857612b4a565b60ff198316865281151560200286019350612b4a565b612b2185612ac0565b5f5b83811015612b4257815481890152600182019150602081019050612b23565b808801955050505b50505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f612b7782612b53565b612b818185612b5d565b9350612b918185602086016124da565b612b9a81612502565b840191505092915050565b5f6040820190508181035f830152612bbd8185612ad2565b90508181036020830152612bd18184612b6d565b90509392505050565b5f612bec612be784612813565b6127f9565b905082815260208101848484011115612c0857612c07612797565b5b612c138482856124da565b509392505050565b5f82601f830112612c2f57612c2e612793565b5b8151612c3f848260208601612bda565b91505092915050565b5f60208284031215612c5d57612c5c612405565b5b5f82015167ffffffffffffffff811115612c7a57612c79612409565b5b612c8684828501612c1b565b91505092915050565b7f617070726f76616c7300000000000000000000000000000000000000000000005f82015250565b5f612cc36009836124ca565b9150612cce82612c8f565b602082019050919050565b5f6040820190508181035f830152612cf18184612b6d565b90508181036020830152612d0481612cb7565b905092915050565b5f67ffffffffffffffff821115612d2657612d2561279b565b5b602082029050602081019050919050565b5f80fd5b5f612d4d612d4884612d0c565b6127f9565b90508083825260208201905060208402830185811115612d7057612d6f612d37565b5b835b81811015612db757805167ffffffffffffffff811115612d9557612d94612793565b5b808601612da28982612c1b565b85526020850194505050602081019050612d72565b5050509392505050565b5f82601f830112612dd557612dd4612793565b5b8151612de5848260208601612d3b565b91505092915050565b5f60208284031215612e0357612e02612405565b5b5f82015167ffffffffffffffff811115612e2057612e1f612409565b5b612e2c84828501612dc1565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f7370656e646572000000000000000000000000000000000000000000000000005f82015250565b5f612e966007836124ca565b9150612ea182612e62565b602082019050919050565b5f6040820190508181035f830152612ec48184612b6d565b90508181036020830152612ed781612e8a565b905092915050565b5f81519050612eed81612620565b92915050565b5f60208284031215612f0857612f07612405565b5b5f612f1584828501612edf565b91505092915050565b5f67ffffffffffffffff821115612f3857612f3761279b565b5b612f4182612502565b9050602081019050919050565b5f612f60612f5b84612f1e565b6127f9565b905082815260208101848484011115612f7c57612f7b612797565b5b612f878482856124da565b509392505050565b5f82601f830112612fa357612fa2612793565b5b8151612fb3848260208601612f4e565b91505092915050565b5f60208284031215612fd157612fd0612405565b5b5f82015167ffffffffffffffff811115612fee57612fed612409565b5b612ffa84828501612f8f565b91505092915050565b7f6066726f6d60206d75737420626520746865206f776e657200000000000000005f82015250565b5f6130376018836124ca565b915061304282613003565b602082019050919050565b5f6020820190508181035f8301526130648161302b565b9050919050565b7f6f776e65720000000000000000000000000000000000000000000000000000005f82015250565b5f61309f6005836124ca565b91506130aa8261306b565b602082019050919050565b5f6040820190508181035f8301526130cd8184612b6d565b905081810360208301526130e081613093565b905092915050565b7f746f6b656e7300000000000000000000000000000000000000000000000000005f82015250565b5f61311c6006836124ca565b9150613127826130e8565b602082019050919050565b5f6040820190508181035f83015261314a8184612b6d565b9050818103602083015261315d81613110565b905092915050565b7f746f6b656e5f75726900000000000000000000000000000000000000000000005f82015250565b5f6131996009836124ca565b91506131a482613165565b602082019050919050565b5f6040820190508181035f8301526131c78184612b6d565b905081810360208301526131da8161318d565b905092915050565b7f6f70657261746f727300000000000000000000000000000000000000000000005f82015250565b5f6132166009836124ca565b9150613221826131e2565b602082019050919050565b5f6040820190508181035f8301526132448184612b6d565b905081810360208301526132578161320a565b905092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6132968261256a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036132c8576132c761325f565b5b600182019050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f81905092915050565b5f613314826124c0565b61331e8185613300565b935061332e8185602086016124da565b80840191505092915050565b7f2200000000000000000000000000000000000000000000000000000000000000815250565b5f61336b828461330a565b91506133768261333a565b60018201915081905092915050565b5f61338f8261333a565b60018201915061339f828461330a565b915081905092915050565b7f7d00000000000000000000000000000000000000000000000000000000000000815250565b5f6133db828461330a565b91506133e6826133aa565b60018201915081905092915050565b7f7b00000000000000000000000000000000000000000000000000000000000000815250565b5f613425826133f5565b600182019150613435828461330a565b915081905092915050565b5f61344b828561330a565b9150613457828461330a565b91508190509392505050565b5f6060820190508181035f83015261347b8186612ad2565b9050818103602083015261348f8185612b6d565b905081810360408301526134a38184612b6d565b9050949350505050565b5f81905092915050565b5f6134c182612b53565b6134cb81856134ad565b93506134db8185602086016124da565b80840191505092915050565b5f6134f282846134b7565b915081905092915050565b7f436f736d5761736d2065786563757465206661696c65640000000000000000005f82015250565b5f6135316017836124ca565b915061353c826134fd565b602082019050919050565b5f6020820190508181035f83015261355e81613525565b9050919050565b5f6080820190506135785f8301876125f8565b61358560208301866125f8565b6135926040830185612703565b81810360608301526135a48184612b6d565b905095945050505050565b5f815190506135bd81612438565b92915050565b5f602082840312156135d8576135d7612405565b5b5f6135e5848285016135af565b9150509291505056fea2646970667358221220a2c419c1e43b74d07c7e3f63d55af936cde414fdc186470d597ab1da5b53412e64736f6c63430008150033 \ No newline at end of file +608060405234801562000010575f80fd5b506040516200465d3803806200465d8339818101604052810190620000369190620002c3565b8181815f9081620000489190620005b0565b5080600190816200005a9190620005b0565b50505061100260095f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611003600a5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611004600b5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508260089081620001349190620005b0565b5050505062000694565b5f604051905090565b5f80fd5b5f80fd5b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6200019f8262000157565b810181811067ffffffffffffffff82111715620001c157620001c062000167565b5b80604052505050565b5f620001d56200013e565b9050620001e3828262000194565b919050565b5f67ffffffffffffffff82111562000205576200020462000167565b5b620002108262000157565b9050602081019050919050565b5f5b838110156200023c5780820151818401526020810190506200021f565b5f8484015250505050565b5f6200025d6200025784620001e8565b620001ca565b9050828152602081018484840111156200027c576200027b62000153565b5b620002898482856200021d565b509392505050565b5f82601f830112620002a857620002a76200014f565b5b8151620002ba84826020860162000247565b91505092915050565b5f805f60608486031215620002dd57620002dc62000147565b5b5f84015167ffffffffffffffff811115620002fd57620002fc6200014b565b5b6200030b8682870162000291565b935050602084015167ffffffffffffffff8111156200032f576200032e6200014b565b5b6200033d8682870162000291565b925050604084015167ffffffffffffffff8111156200036157620003606200014b565b5b6200036f8682870162000291565b9150509250925092565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680620003c857607f821691505b602082108103620003de57620003dd62000383565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f60088302620004427fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000405565b6200044e868362000405565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f62000498620004926200048c8462000466565b6200046f565b62000466565b9050919050565b5f819050919050565b620004b38362000478565b620004cb620004c2826200049f565b84845462000411565b825550505050565b5f90565b620004e1620004d3565b620004ee818484620004a8565b505050565b5b818110156200051557620005095f82620004d7565b600181019050620004f4565b5050565b601f82111562000564576200052e81620003e4565b6200053984620003f6565b8101602085101562000549578190505b620005616200055885620003f6565b830182620004f3565b50505b505050565b5f82821c905092915050565b5f620005865f198460080262000569565b1980831691505092915050565b5f620005a0838362000575565b9150826002028217905092915050565b620005bb8262000379565b67ffffffffffffffff811115620005d757620005d662000167565b5b620005e38254620003b0565b620005f082828562000519565b5f60209050601f83116001811462000626575f841562000611578287015190505b6200061d858262000593565b8655506200068c565b601f1984166200063686620003e4565b5f5b828110156200065f5784890151825560018201915060208501945060208101905062000638565b868310156200067f57848901516200067b601f89168262000575565b8355505b6001600288020188555050505b505050505050565b613fbb80620006a25f395ff3fe608060405234801561000f575f80fd5b5060043610610114575f3560e01c806370a08231116100a0578063c2aed3021161006f578063c2aed302146102ef578063c87b56dd1461030d578063de4725cc1461033d578063e985e9c51461035b578063f00b02551461038b57610114565b806370a082311461026957806395d89b4114610299578063a22cb465146102b7578063b88d4fde146102d357610114565b806323b872dd116100e757806323b872dd146101b25780632a55205a146101ce57806342842e0e146101ff5780635c4aead71461021b5780636352211e1461023957610114565b806301ffc9a71461011857806306fdde0314610148578063081812fc14610166578063095ea7b314610196575b5f80fd5b610132600480360381019061012d9190612b24565b6103a9565b60405161013f9190612b69565b60405180910390f35b61015061054a565b60405161015d9190612c0c565b60405180910390f35b610180600480360381019061017b9190612c5f565b6105d9565b60405161018d9190612cc9565b60405180910390f35b6101b060048036038101906101ab9190612d0c565b610933565b005b6101cc60048036038101906101c79190612d4a565b610b6f565b005b6101e860048036038101906101e39190612d9a565b610e8a565b6040516101f6929190612de7565b60405180910390f35b61021960048036038101906102149190612d4a565b6114bb565b005b6102236114da565b6040516102309190612c0c565b60405180910390f35b610253600480360381019061024e9190612c5f565b611566565b6040516102609190612cc9565b60405180910390f35b610283600480360381019061027e9190612e0e565b6117f0565b6040516102909190612e39565b60405180910390f35b6102a1611ae6565b6040516102ae9190612c0c565b60405180910390f35b6102d160048036038101906102cc9190612e7c565b611b76565b005b6102ed60048036038101906102e89190612fe6565b611d79565b005b6102f7611d96565b60405161030491906130c1565b60405180910390f35b61032760048036038101906103229190612c5f565b611dbb565b6040516103349190612c0c565b60405180910390f35b610345611fb8565b60405161035291906130fa565b60405180910390f35b61037560048036038101906103709190613113565b611fdd565b6040516103829190612b69565b60405180910390f35b610393612417565b6040516103a09190613171565b60405180910390f35b5f7f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061047357507f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806104db57507f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061054357507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60605f8054610558906131b7565b80601f0160208091040260200160405190810160405280929190818152602001828054610584906131b7565b80156105cf5780601f106105a6576101008083540402835291602001916105cf565b820191905f5260205f20905b8154815290600101906020018083116105b257829003601f168201915b5050505050905090565b5f8061062a6040518060400160405280600881526020017f746f6b656e5f69640000000000000000000000000000000000000000000000008152506106256106208661243c565b612506565b61254e565b90505f61067c6106776040518060400160405280600981526020017f617070726f76616c730000000000000000000000000000000000000000000000815250610672856125a0565b61254e565b6125a0565b90505f60095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166306d81d296008846040518363ffffffff1660e01b81526004016106dc9291906132cc565b5f60405180830381865afa1580156106f6573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f8201168201806040525081019061071e919061336f565b90505f600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166387cdf621836040518263ffffffff1660e01b815260040161077b9190613400565b5f60405180830381865afa158015610795573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906107bd9190613515565b90505f81511115610926575f600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166308d858e5835f815181106108195761081861355c565b5b60200260200101516040518263ffffffff1660e01b815260040161083d91906135d3565b5f60405180830381865afa158015610857573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f8201168201806040525081019061087f919061336f565b9050600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631778e539826040518263ffffffff1660e01b81526004016108db9190612c0c565b602060405180830381865afa1580156108f6573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061091a919061361a565b9550505050505061092e565b5f9450505050505b919050565b5f610a166040518060400160405280600781526020017f7370656e64657200000000000000000000000000000000000000000000000000815250610a11600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630c3c20ed876040518263ffffffff1660e01b81526004016109ca9190612cc9565b5f60405180830381865afa1580156109e4573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f82011682018060405250810190610a0c91906136e3565b612506565b61254e565b90505f610a686040518060400160405280600881526020017f746f6b656e5f6964000000000000000000000000000000000000000000000000815250610a63610a5e8661243c565b612506565b61254e565b90505f610af9610af46040518060400160405280600781526020017f617070726f766500000000000000000000000000000000000000000000000000815250610aef610aea87876040518060400160405280600181526020017f2c000000000000000000000000000000000000000000000000000000000000008152506125e8565b6125a0565b61254e565b6125a0565b9050610b0481612636565b50838573ffffffffffffffffffffffffffffffffffffffff16610b2686611566565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050505050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610bdf575f6040517f64a0ae92000000000000000000000000000000000000000000000000000000008152600401610bd69190612cc9565b60405180910390fd5b610be881611566565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614610c55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4c90613774565b60405180910390fd5b5f610d386040518060400160405280600981526020017f726563697069656e740000000000000000000000000000000000000000000000815250610d33600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630c3c20ed876040518263ffffffff1660e01b8152600401610cec9190612cc9565b5f60405180830381865afa158015610d06573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f82011682018060405250810190610d2e91906136e3565b612506565b61254e565b90505f610d8a6040518060400160405280600881526020017f746f6b656e5f6964000000000000000000000000000000000000000000000000815250610d85610d808661243c565b612506565b61254e565b90505f610e1b610e166040518060400160405280600c81526020017f7472616e736665725f6e66740000000000000000000000000000000000000000815250610e11610e0c87876040518060400160405280600181526020017f2c000000000000000000000000000000000000000000000000000000000000008152506125e8565b6125a0565b61254e565b6125a0565b9050610e2681612636565b50838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050505050565b5f805f60095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166306d81d2960086040518060600160405280602c8152602001613f5a602c91396040518363ffffffff1660e01b8152600401610f029291906132cc565b5f60405180830381865afa158015610f1c573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f82011682018060405250810190610f44919061336f565b90505f600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166308d858e5836040518263ffffffff1660e01b8152600401610fa191906137dc565b5f60405180830381865afa158015610fbb573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f82011682018060405250810190610fe3919061336f565b90507f6273151f959616268004b58dbb21e5c851b7b8d04498b4aabee12291d22fc03481805190602001201461104e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110459061387f565b60405180910390fd5b5f61109e6040518060400160405280600881526020017f746f6b656e5f69640000000000000000000000000000000000000000000000008152506110996110948a61243c565b612506565b61254e565b90505f6110f06040518060400160405280600a81526020017f73616c655f7072696365000000000000000000000000000000000000000000008152506110eb6110e68a61243c565b612506565b61254e565b90505f61118161117c6040518060400160405280600c81526020017f726f79616c74795f696e666f000000000000000000000000000000000000000081525061117761117287876040518060400160405280600181526020017f2c000000000000000000000000000000000000000000000000000000000000008152506125e8565b6125a0565b61254e565b6125a0565b90505f61121161120c6040518060400160405280600981526020017f657874656e73696f6e00000000000000000000000000000000000000000000008152506112076112026040518060400160405280600381526020017f6d736700000000000000000000000000000000000000000000000000000000008152508761254e565b6125a0565b61254e565b6125a0565b90505f60095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166306d81d296008846040518363ffffffff1660e01b81526004016112719291906132cc565b5f60405180830381865afa15801561128b573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906112b3919061336f565b90505f600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166308d858e5836040518263ffffffff1660e01b815260040161131091906138e7565b5f60405180830381865afa15801561132a573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f82011682018060405250810190611352919061336f565b90505f600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635a558982846040518263ffffffff1660e01b81526004016113af9190613964565b602060405180830381865afa1580156113ca573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113ee91906139ab565b90505f82510361140c575f819a509a505050505050505050506114b4565b600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631778e539836040518263ffffffff1660e01b81526004016114669190612c0c565b602060405180830381865afa158015611481573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114a5919061361a565b819a509a505050505050505050505b9250929050565b6114d583838360405180602001604052805f815250611d79565b505050565b600880546114e7906131b7565b80601f0160208091040260200160405190810160405280929190818152602001828054611513906131b7565b801561155e5780601f106115355761010080835404028352916020019161155e565b820191905f5260205f20905b81548152906001019060200180831161154157829003601f168201915b505050505081565b5f806115b76040518060400160405280600881526020017f746f6b656e5f69640000000000000000000000000000000000000000000000008152506115b26115ad8661243c565b612506565b61254e565b90505f6116096116046040518060400160405280600881526020017f6f776e65725f6f660000000000000000000000000000000000000000000000008152506115ff856125a0565b61254e565b6125a0565b90505f60095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166306d81d296008846040518363ffffffff1660e01b81526004016116699291906132cc565b5f60405180830381865afa158015611683573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906116ab919061336f565b90505f600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166308d858e5836040518263ffffffff1660e01b81526004016117089190613a20565b5f60405180830381865afa158015611722573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f8201168201806040525081019061174a919061336f565b9050600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631778e539826040518263ffffffff1660e01b81526004016117a69190612c0c565b602060405180830381865afa1580156117c1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117e5919061361a565b945050505050919050565b5f8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611861575f6040517f89c62b640000000000000000000000000000000000000000000000000000000081526004016118589190612cc9565b60405180910390fd5b5f6119446040518060400160405280600581526020017f6f776e657200000000000000000000000000000000000000000000000000000081525061193f600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630c3c20ed876040518263ffffffff1660e01b81526004016118f89190612cc9565b5f60405180830381865afa158015611912573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f8201168201806040525081019061193a91906136e3565b612506565b61254e565b90505f6119966119916040518060400160405280600681526020017f746f6b656e73000000000000000000000000000000000000000000000000000081525061198c856125a0565b61254e565b6125a0565b90505f60095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166306d81d296008846040518363ffffffff1660e01b81526004016119f69291906132cc565b5f60405180830381865afa158015611a10573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f82011682018060405250810190611a38919061336f565b90505f600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166387cdf621836040518263ffffffff1660e01b8152600401611a959190613a9d565b5f60405180830381865afa158015611aaf573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f82011682018060405250810190611ad79190613515565b90508051945050505050919050565b606060018054611af5906131b7565b80601f0160208091040260200160405190810160405280929190818152602001828054611b21906131b7565b8015611b6c5780601f10611b4357610100808354040283529160200191611b6c565b820191905f5260205f20905b815481529060010190602001808311611b4f57829003601f168201915b5050505050905090565b5f611c61611c5c6040518060400160405280600881526020017f6f70657261746f72000000000000000000000000000000000000000000000000815250611c57600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630c3c20ed886040518263ffffffff1660e01b8152600401611c109190612cc9565b5f60405180830381865afa158015611c2a573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f82011682018060405250810190611c5291906136e3565b612506565b61254e565b6125a0565b90508115611cbe57611cb8611cb3611cae6040518060400160405280600b81526020017f617070726f76655f616c6c0000000000000000000000000000000000000000008152508461254e565b6125a0565b612636565b50611d0f565b611d0d611d08611d036040518060400160405280600a81526020017f7265766f6b655f616c6c000000000000000000000000000000000000000000008152508461254e565b6125a0565b612636565b505b8273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3184604051611d6c9190612b69565b60405180910390a3505050565b611d84848484610b6f565b611d90848484846127b4565b50505050565b600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6060611dc682611566565b505f611e176040518060400160405280600881526020017f746f6b656e5f6964000000000000000000000000000000000000000000000000815250611e12611e0d8661243c565b612506565b61254e565b90505f611e69611e646040518060400160405280600881526020017f6e66745f696e666f000000000000000000000000000000000000000000000000815250611e5f856125a0565b61254e565b6125a0565b90505f60095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166306d81d296008846040518363ffffffff1660e01b8152600401611ec99291906132cc565b5f60405180830381865afa158015611ee3573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f82011682018060405250810190611f0b919061336f565b90505f600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166308d858e5836040518263ffffffff1660e01b8152600401611f689190613b1a565b5f60405180830381865afa158015611f82573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f82011682018060405250810190611faa919061336f565b905080945050505050919050565b600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f806120c16040518060400160405280600581526020017f6f776e65720000000000000000000000000000000000000000000000000000008152506120bc600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630c3c20ed886040518263ffffffff1660e01b81526004016120759190612cc9565b5f60405180830381865afa15801561208f573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906120b791906136e3565b612506565b61254e565b90505f61211361210e6040518060400160405280600d81526020017f616c6c5f6f70657261746f727300000000000000000000000000000000000000815250612109856125a0565b61254e565b6125a0565b90505f60095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166306d81d296008846040518363ffffffff1660e01b81526004016121739291906132cc565b5f60405180830381865afa15801561218d573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906121b5919061336f565b90505f600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166387cdf621836040518263ffffffff1660e01b81526004016122129190613b97565b5f60405180830381865afa15801561222c573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906122549190613515565b90505f5b8151811015612408575f600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166308d858e58484815181106122b2576122b161355c565b5b60200260200101516040518263ffffffff1660e01b81526004016122d691906135d3565b5f60405180830381865afa1580156122f0573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f82011682018060405250810190612318919061336f565b90508773ffffffffffffffffffffffffffffffffffffffff16600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631778e539836040518263ffffffff1660e01b815260040161238b9190612c0c565b602060405180830381865afa1580156123a6573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123ca919061361a565b73ffffffffffffffffffffffffffffffffffffffff16036123f45760019650505050505050612411565b50808061240090613bf7565b915050612258565b505f9450505050505b92915050565b60095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60605f600161244a84612966565b0190505f8167ffffffffffffffff81111561246857612467612ec2565b5b6040519080825280601f01601f19166020018201604052801561249a5781602001600182028036833780820191505090505b5090505f82602001820190505b6001156124fb578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a85816124f0576124ef613c3e565b5b0494505f85036124a7575b819350505050919050565b6060816040516020016125199190613ccb565b6040516020818303038152906040526040516020016125389190613cf0565b6040516020818303038152906040529050919050565b606061259861255c84612506565b836040518060400160405280600181526020017f3a000000000000000000000000000000000000000000000000000000000000008152506125e8565b905092915050565b6060816040516020016125b39190613d3b565b6040516020818303038152906040526040516020016125d29190613d86565b6040516020818303038152906040529050919050565b60608382846040516020016125fe929190613dab565b60405160208183030381529060405260405160200161261e929190613dab565b60405160208183030381529060405290509392505050565b60605f8061100273ffffffffffffffffffffffffffffffffffffffff166008856040518060400160405280600281526020017f5b5d00000000000000000000000000000000000000000000000000000000000081525060405160240161269e93929190613dce565b6040516020818303038152906040527f44d227ae000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516127289190613e52565b5f60405180830381855af49150503d805f8114612760576040519150601f19603f3d011682016040523d82523d5f602084013e612765565b606091505b5091509150816127aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127a190613eb2565b60405180910390fd5b8092505050919050565b5f8373ffffffffffffffffffffffffffffffffffffffff163b1115612960578273ffffffffffffffffffffffffffffffffffffffff1663150b7a026127f7612ab7565b8685856040518563ffffffff1660e01b81526004016128199493929190613ed0565b6020604051808303815f875af192505050801561285457506040513d601f19601f820116820180604052508101906128519190613f2e565b60015b6128d5573d805f8114612882576040519150601f19603f3d011682016040523d82523d5f602084013e612887565b606091505b505f8151036128cd57836040517f64a0ae920000000000000000000000000000000000000000000000000000000081526004016128c49190612cc9565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161461295e57836040517f64a0ae920000000000000000000000000000000000000000000000000000000081526004016129559190612cc9565b60405180910390fd5b505b50505050565b5f805f90507a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083106129c2577a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083816129b8576129b7613c3e565b5b0492506040810190505b6d04ee2d6d415b85acef810000000083106129ff576d04ee2d6d415b85acef810000000083816129f5576129f4613c3e565b5b0492506020810190505b662386f26fc100008310612a2e57662386f26fc100008381612a2457612a23613c3e565b5b0492506010810190505b6305f5e1008310612a57576305f5e1008381612a4d57612a4c613c3e565b5b0492506008810190505b6127108310612a7c576127108381612a7257612a71613c3e565b5b0492506004810190505b60648310612a9f5760648381612a9557612a94613c3e565b5b0492506002810190505b600a8310612aae576001810190505b80915050919050565b5f33905090565b5f604051905090565b5f80fd5b5f80fd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612b0381612acf565b8114612b0d575f80fd5b50565b5f81359050612b1e81612afa565b92915050565b5f60208284031215612b3957612b38612ac7565b5b5f612b4684828501612b10565b91505092915050565b5f8115159050919050565b612b6381612b4f565b82525050565b5f602082019050612b7c5f830184612b5a565b92915050565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015612bb9578082015181840152602081019050612b9e565b5f8484015250505050565b5f601f19601f8301169050919050565b5f612bde82612b82565b612be88185612b8c565b9350612bf8818560208601612b9c565b612c0181612bc4565b840191505092915050565b5f6020820190508181035f830152612c248184612bd4565b905092915050565b5f819050919050565b612c3e81612c2c565b8114612c48575f80fd5b50565b5f81359050612c5981612c35565b92915050565b5f60208284031215612c7457612c73612ac7565b5b5f612c8184828501612c4b565b91505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f612cb382612c8a565b9050919050565b612cc381612ca9565b82525050565b5f602082019050612cdc5f830184612cba565b92915050565b612ceb81612ca9565b8114612cf5575f80fd5b50565b5f81359050612d0681612ce2565b92915050565b5f8060408385031215612d2257612d21612ac7565b5b5f612d2f85828601612cf8565b9250506020612d4085828601612c4b565b9150509250929050565b5f805f60608486031215612d6157612d60612ac7565b5b5f612d6e86828701612cf8565b9350506020612d7f86828701612cf8565b9250506040612d9086828701612c4b565b9150509250925092565b5f8060408385031215612db057612daf612ac7565b5b5f612dbd85828601612c4b565b9250506020612dce85828601612c4b565b9150509250929050565b612de181612c2c565b82525050565b5f604082019050612dfa5f830185612cba565b612e076020830184612dd8565b9392505050565b5f60208284031215612e2357612e22612ac7565b5b5f612e3084828501612cf8565b91505092915050565b5f602082019050612e4c5f830184612dd8565b92915050565b612e5b81612b4f565b8114612e65575f80fd5b50565b5f81359050612e7681612e52565b92915050565b5f8060408385031215612e9257612e91612ac7565b5b5f612e9f85828601612cf8565b9250506020612eb085828601612e68565b9150509250929050565b5f80fd5b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b612ef882612bc4565b810181811067ffffffffffffffff82111715612f1757612f16612ec2565b5b80604052505050565b5f612f29612abe565b9050612f358282612eef565b919050565b5f67ffffffffffffffff821115612f5457612f53612ec2565b5b612f5d82612bc4565b9050602081019050919050565b828183375f83830152505050565b5f612f8a612f8584612f3a565b612f20565b905082815260208101848484011115612fa657612fa5612ebe565b5b612fb1848285612f6a565b509392505050565b5f82601f830112612fcd57612fcc612eba565b5b8135612fdd848260208601612f78565b91505092915050565b5f805f8060808587031215612ffe57612ffd612ac7565b5b5f61300b87828801612cf8565b945050602061301c87828801612cf8565b935050604061302d87828801612c4b565b925050606085013567ffffffffffffffff81111561304e5761304d612acb565b5b61305a87828801612fb9565b91505092959194509250565b5f819050919050565b5f61308961308461307f84612c8a565b613066565b612c8a565b9050919050565b5f61309a8261306f565b9050919050565b5f6130ab82613090565b9050919050565b6130bb816130a1565b82525050565b5f6020820190506130d45f8301846130b2565b92915050565b5f6130e482613090565b9050919050565b6130f4816130da565b82525050565b5f60208201905061310d5f8301846130eb565b92915050565b5f806040838503121561312957613128612ac7565b5b5f61313685828601612cf8565b925050602061314785828601612cf8565b9150509250929050565b5f61315b82613090565b9050919050565b61316b81613151565b82525050565b5f6020820190506131845f830184613162565b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806131ce57607f821691505b6020821081036131e1576131e061318a565b5b50919050565b5f819050815f5260205f209050919050565b5f8154613205816131b7565b61320f8186612b8c565b9450600182165f8114613229576001811461323f57613271565b60ff198316865281151560200286019350613271565b613248856131e7565b5f5b838110156132695781548189015260018201915060208101905061324a565b808801955050505b50505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f61329e8261327a565b6132a88185613284565b93506132b8818560208601612b9c565b6132c181612bc4565b840191505092915050565b5f6040820190508181035f8301526132e481856131f9565b905081810360208301526132f88184613294565b90509392505050565b5f61331361330e84612f3a565b612f20565b90508281526020810184848401111561332f5761332e612ebe565b5b61333a848285612b9c565b509392505050565b5f82601f83011261335657613355612eba565b5b8151613366848260208601613301565b91505092915050565b5f6020828403121561338457613383612ac7565b5b5f82015167ffffffffffffffff8111156133a1576133a0612acb565b5b6133ad84828501613342565b91505092915050565b7f617070726f76616c7300000000000000000000000000000000000000000000005f82015250565b5f6133ea600983612b8c565b91506133f5826133b6565b602082019050919050565b5f6040820190508181035f8301526134188184613294565b9050818103602083015261342b816133de565b905092915050565b5f67ffffffffffffffff82111561344d5761344c612ec2565b5b602082029050602081019050919050565b5f80fd5b5f61347461346f84613433565b612f20565b905080838252602082019050602084028301858111156134975761349661345e565b5b835b818110156134de57805167ffffffffffffffff8111156134bc576134bb612eba565b5b8086016134c98982613342565b85526020850194505050602081019050613499565b5050509392505050565b5f82601f8301126134fc576134fb612eba565b5b815161350c848260208601613462565b91505092915050565b5f6020828403121561352a57613529612ac7565b5b5f82015167ffffffffffffffff81111561354757613546612acb565b5b613553848285016134e8565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f7370656e646572000000000000000000000000000000000000000000000000005f82015250565b5f6135bd600783612b8c565b91506135c882613589565b602082019050919050565b5f6040820190508181035f8301526135eb8184613294565b905081810360208301526135fe816135b1565b905092915050565b5f8151905061361481612ce2565b92915050565b5f6020828403121561362f5761362e612ac7565b5b5f61363c84828501613606565b91505092915050565b5f67ffffffffffffffff82111561365f5761365e612ec2565b5b61366882612bc4565b9050602081019050919050565b5f61368761368284613645565b612f20565b9050828152602081018484840111156136a3576136a2612ebe565b5b6136ae848285612b9c565b509392505050565b5f82601f8301126136ca576136c9612eba565b5b81516136da848260208601613675565b91505092915050565b5f602082840312156136f8576136f7612ac7565b5b5f82015167ffffffffffffffff81111561371557613714612acb565b5b613721848285016136b6565b91505092915050565b7f6066726f6d60206d75737420626520746865206f776e657200000000000000005f82015250565b5f61375e601883612b8c565b91506137698261372a565b602082019050919050565b5f6020820190508181035f83015261378b81613752565b9050919050565b7f726f79616c74795f7061796d656e7473000000000000000000000000000000005f82015250565b5f6137c6601083612b8c565b91506137d182613792565b602082019050919050565b5f6040820190508181035f8301526137f48184613294565b90508181036020830152613807816137ba565b905092915050565b7f726f79616c747920696e666f206e6f7420696d706c656d656e746564206f6e205f8201527f74686520756e6465726c79696e6720436f736d5761736d20636f6e7472616374602082015250565b5f613869604083612b8c565b91506138748261380f565b604082019050919050565b5f6020820190508181035f8301526138968161385d565b9050919050565b7f61646472657373000000000000000000000000000000000000000000000000005f82015250565b5f6138d1600783612b8c565b91506138dc8261389d565b602082019050919050565b5f6040820190508181035f8301526138ff8184613294565b90508181036020830152613912816138c5565b905092915050565b7f726f79616c74795f616d6f756e740000000000000000000000000000000000005f82015250565b5f61394e600e83612b8c565b91506139598261391a565b602082019050919050565b5f6040820190508181035f83015261397c8184613294565b9050818103602083015261398f81613942565b905092915050565b5f815190506139a581612c35565b92915050565b5f602082840312156139c0576139bf612ac7565b5b5f6139cd84828501613997565b91505092915050565b7f6f776e65720000000000000000000000000000000000000000000000000000005f82015250565b5f613a0a600583612b8c565b9150613a15826139d6565b602082019050919050565b5f6040820190508181035f830152613a388184613294565b90508181036020830152613a4b816139fe565b905092915050565b7f746f6b656e7300000000000000000000000000000000000000000000000000005f82015250565b5f613a87600683612b8c565b9150613a9282613a53565b602082019050919050565b5f6040820190508181035f830152613ab58184613294565b90508181036020830152613ac881613a7b565b905092915050565b7f746f6b656e5f75726900000000000000000000000000000000000000000000005f82015250565b5f613b04600983612b8c565b9150613b0f82613ad0565b602082019050919050565b5f6040820190508181035f830152613b328184613294565b90508181036020830152613b4581613af8565b905092915050565b7f6f70657261746f727300000000000000000000000000000000000000000000005f82015250565b5f613b81600983612b8c565b9150613b8c82613b4d565b602082019050919050565b5f6040820190508181035f830152613baf8184613294565b90508181036020830152613bc281613b75565b905092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f613c0182612c2c565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613c3357613c32613bca565b5b600182019050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f81905092915050565b5f613c7f82612b82565b613c898185613c6b565b9350613c99818560208601612b9c565b80840191505092915050565b7f2200000000000000000000000000000000000000000000000000000000000000815250565b5f613cd68284613c75565b9150613ce182613ca5565b60018201915081905092915050565b5f613cfa82613ca5565b600182019150613d0a8284613c75565b915081905092915050565b7f7d00000000000000000000000000000000000000000000000000000000000000815250565b5f613d468284613c75565b9150613d5182613d15565b60018201915081905092915050565b7f7b00000000000000000000000000000000000000000000000000000000000000815250565b5f613d9082613d60565b600182019150613da08284613c75565b915081905092915050565b5f613db68285613c75565b9150613dc28284613c75565b91508190509392505050565b5f6060820190508181035f830152613de681866131f9565b90508181036020830152613dfa8185613294565b90508181036040830152613e0e8184613294565b9050949350505050565b5f81905092915050565b5f613e2c8261327a565b613e368185613e18565b9350613e46818560208601612b9c565b80840191505092915050565b5f613e5d8284613e22565b915081905092915050565b7f436f736d5761736d2065786563757465206661696c65640000000000000000005f82015250565b5f613e9c601783612b8c565b9150613ea782613e68565b602082019050919050565b5f6020820190508181035f830152613ec981613e90565b9050919050565b5f608082019050613ee35f830187612cba565b613ef06020830186612cba565b613efd6040830185612dd8565b8181036060830152613f0f8184613294565b905095945050505050565b5f81519050613f2881612afa565b92915050565b5f60208284031215613f4357613f42612ac7565b5b5f613f5084828501613f1a565b9150509291505056fe7b22657874656e73696f6e223a7b226d7367223a7b22636865636b5f726f79616c74696573223a7b7d7d7d7da26469706673582212208e5bf5b10dbd07520ba4eabc456fe6d4e15af90bab1225519bcf4381501a7ffd64736f6c63430008150033 \ No newline at end of file diff --git a/x/evm/artifacts/cw721/artifacts.go b/x/evm/artifacts/cw721/artifacts.go index 18e5f812a..1d222efc5 100644 --- a/x/evm/artifacts/cw721/artifacts.go +++ b/x/evm/artifacts/cw721/artifacts.go @@ -10,7 +10,7 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi" ) -const CurrentVersion uint16 = 2 +const CurrentVersion uint16 = 3 //go:embed CW721ERC721Pointer.abi //go:embed CW721ERC721Pointer.bin diff --git a/x/evm/artifacts/cw721/cw721.go b/x/evm/artifacts/cw721/cw721.go index d7d3efcbc..4ea2671b6 100644 --- a/x/evm/artifacts/cw721/cw721.go +++ b/x/evm/artifacts/cw721/cw721.go @@ -31,7 +31,7 @@ var ( // Cw721MetaData contains all meta data concerning the Cw721 contract. var Cw721MetaData = &bind.MetaData{ - ABI: "[{\"inputs\":[{\"internalType\":\"string\",\"name\":\"Cw721Address_\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"name_\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"symbol_\",\"type\":\"string\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"ERC721IncorrectOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721InsufficientApproval\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"approver\",\"type\":\"address\"}],\"name\":\"ERC721InvalidApprover\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"ERC721InvalidOperator\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"ERC721InvalidOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"ERC721InvalidReceiver\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"ERC721InvalidSender\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721NonexistentToken\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"approved\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"ApprovalForAll\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"AddrPrecompile\",\"outputs\":[{\"internalType\":\"contractIAddr\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"Cw721Address\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"JsonPrecompile\",\"outputs\":[{\"internalType\":\"contractIJson\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"WasmdPrecompile\",\"outputs\":[{\"internalType\":\"contractIWasmd\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"approved\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"getApproved\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"isApprovedForAll\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ownerOf\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"safeTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"setApprovalForAll\",\"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\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"tokenURI\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", + ABI: "[{\"inputs\":[{\"internalType\":\"string\",\"name\":\"Cw721Address_\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"name_\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"symbol_\",\"type\":\"string\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"numerator\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"denominator\",\"type\":\"uint256\"}],\"name\":\"ERC2981InvalidDefaultRoyalty\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"ERC2981InvalidDefaultRoyaltyReceiver\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"numerator\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"denominator\",\"type\":\"uint256\"}],\"name\":\"ERC2981InvalidTokenRoyalty\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"ERC2981InvalidTokenRoyaltyReceiver\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"ERC721IncorrectOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721InsufficientApproval\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"approver\",\"type\":\"address\"}],\"name\":\"ERC721InvalidApprover\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"ERC721InvalidOperator\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"ERC721InvalidOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"ERC721InvalidReceiver\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"ERC721InvalidSender\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721NonexistentToken\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"approved\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"ApprovalForAll\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"AddrPrecompile\",\"outputs\":[{\"internalType\":\"contractIAddr\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"Cw721Address\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"JsonPrecompile\",\"outputs\":[{\"internalType\":\"contractIJson\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"WasmdPrecompile\",\"outputs\":[{\"internalType\":\"contractIWasmd\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"approved\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"getApproved\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"isApprovedForAll\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ownerOf\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"salePrice\",\"type\":\"uint256\"}],\"name\":\"royaltyInfo\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"safeTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"setApprovalForAll\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"tokenURI\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", } // Cw721ABI is the input ABI used to generate the binding from. @@ -459,9 +459,41 @@ func (_Cw721 *Cw721CallerSession) OwnerOf(tokenId *big.Int) (common.Address, err return _Cw721.Contract.OwnerOf(&_Cw721.CallOpts, tokenId) } +// RoyaltyInfo is a free data retrieval call binding the contract method 0x2a55205a. +// +// Solidity: function royaltyInfo(uint256 tokenId, uint256 salePrice) view returns(address, uint256) +func (_Cw721 *Cw721Caller) RoyaltyInfo(opts *bind.CallOpts, tokenId *big.Int, salePrice *big.Int) (common.Address, *big.Int, error) { + var out []interface{} + err := _Cw721.contract.Call(opts, &out, "royaltyInfo", tokenId, salePrice) + + if err != nil { + return *new(common.Address), *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + out1 := *abi.ConvertType(out[1], new(*big.Int)).(**big.Int) + + return out0, out1, err + +} + +// RoyaltyInfo is a free data retrieval call binding the contract method 0x2a55205a. +// +// Solidity: function royaltyInfo(uint256 tokenId, uint256 salePrice) view returns(address, uint256) +func (_Cw721 *Cw721Session) RoyaltyInfo(tokenId *big.Int, salePrice *big.Int) (common.Address, *big.Int, error) { + return _Cw721.Contract.RoyaltyInfo(&_Cw721.CallOpts, tokenId, salePrice) +} + +// RoyaltyInfo is a free data retrieval call binding the contract method 0x2a55205a. +// +// Solidity: function royaltyInfo(uint256 tokenId, uint256 salePrice) view returns(address, uint256) +func (_Cw721 *Cw721CallerSession) RoyaltyInfo(tokenId *big.Int, salePrice *big.Int) (common.Address, *big.Int, error) { + return _Cw721.Contract.RoyaltyInfo(&_Cw721.CallOpts, tokenId, salePrice) +} + // SupportsInterface is a free data retrieval call binding the contract method 0x01ffc9a7. // -// Solidity: function supportsInterface(bytes4 interfaceId) view returns(bool) +// Solidity: function supportsInterface(bytes4 interfaceId) pure returns(bool) func (_Cw721 *Cw721Caller) SupportsInterface(opts *bind.CallOpts, interfaceId [4]byte) (bool, error) { var out []interface{} err := _Cw721.contract.Call(opts, &out, "supportsInterface", interfaceId) @@ -478,14 +510,14 @@ func (_Cw721 *Cw721Caller) SupportsInterface(opts *bind.CallOpts, interfaceId [4 // SupportsInterface is a free data retrieval call binding the contract method 0x01ffc9a7. // -// Solidity: function supportsInterface(bytes4 interfaceId) view returns(bool) +// Solidity: function supportsInterface(bytes4 interfaceId) pure returns(bool) func (_Cw721 *Cw721Session) SupportsInterface(interfaceId [4]byte) (bool, error) { return _Cw721.Contract.SupportsInterface(&_Cw721.CallOpts, interfaceId) } // SupportsInterface is a free data retrieval call binding the contract method 0x01ffc9a7. // -// Solidity: function supportsInterface(bytes4 interfaceId) view returns(bool) +// Solidity: function supportsInterface(bytes4 interfaceId) pure returns(bool) func (_Cw721 *Cw721CallerSession) SupportsInterface(interfaceId [4]byte) (bool, error) { return _Cw721.Contract.SupportsInterface(&_Cw721.CallOpts, interfaceId) } diff --git a/x/evm/artifacts/erc721/artifacts.go b/x/evm/artifacts/erc721/artifacts.go index 9bae2456a..d4d099995 100644 --- a/x/evm/artifacts/erc721/artifacts.go +++ b/x/evm/artifacts/erc721/artifacts.go @@ -2,7 +2,7 @@ package erc721 import "embed" -const CurrentVersion uint16 = 2 +const CurrentVersion uint16 = 3 //go:embed cwerc721.wasm var f embed.FS diff --git a/x/evm/artifacts/erc721/cwerc721.wasm b/x/evm/artifacts/erc721/cwerc721.wasm index f5ba0432f868a852f8860cc34a5357431ff53918..475accb7a5de8dd00b33ac26143c2ddf8970d9df 100644 GIT binary patch literal 295364 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�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 PhwGPI^HF7b*ERh=Dv_oN literal 256986 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

p@(PH%&42iHz^X%1j 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

LktKy+e|0h6ilD!*1&( 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 F{{^};n`{68 diff --git a/x/evm/client/wasm/bindings/queries.go b/x/evm/client/wasm/bindings/queries.go index efb74a4f0..2e1ad292a 100644 --- a/x/evm/client/wasm/bindings/queries.go +++ b/x/evm/client/wasm/bindings/queries.go @@ -22,6 +22,8 @@ type SeiEVMQuery struct { ERC721Uri *ERC721UriRequest `json:"erc721_uri,omitempty"` GetEvmAddress *GetEvmAddressRequest `json:"get_evm_address,omitempty"` GetSeiAddress *GetSeiAddressRequest `json:"get_sei_address,omitempty"` + ERC721RoyaltyInfo *ERC721RoyaltyInfoRequest `json:"erc721_royalty_info,omitempty"` + SupportsInterface *SupportsInterfaceRequest `json:"supports_interface,omitempty"` } type StaticCallRequest struct { @@ -116,6 +118,19 @@ type GetSeiAddressRequest struct { EvmAddress string `json:"evm_address"` } +type ERC721RoyaltyInfoRequest struct { + Caller string `json:"caller"` + ContractAddress string `json:"contract_address"` + TokenID string `json:"token_id"` + SalePrice *sdk.Int `json:"sale_price"` +} + +type SupportsInterfaceRequest struct { + Caller string `json:"caller"` + ContractAddress string `json:"contract_address"` + InterfaceID string `json:"interface_id"` +} + type StaticCallResponse struct { EncodedData string `json:"encoded_data"` } @@ -169,3 +184,12 @@ type GetSeiAddressResponse struct { SeiAddress string `json:"sei_address"` Associated bool `json:"associated"` } + +type ERC721RoyaltyInfoResponse struct { + Receiver string `json:"receiver"` + RoyaltyAmount *sdk.Int `json:"royalty_amount"` +} + +type SupportsInterfaceResponse struct { + Supported bool `json:"supported"` +} diff --git a/x/evm/client/wasm/query.go b/x/evm/client/wasm/query.go index 294fd65ff..1fba5c5b3 100644 --- a/x/evm/client/wasm/query.go +++ b/x/evm/client/wasm/query.go @@ -2,10 +2,12 @@ package wasm import ( "encoding/base64" + "encoding/hex" "encoding/json" "errors" "fmt" "math/big" + "strings" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/ethereum/go-ethereum/common" @@ -503,3 +505,71 @@ func (h *EVMQueryHandler) HandleGetSeiAddress(ctx sdk.Context, evmAddr string) ( response := bindings.GetSeiAddressResponse{SeiAddress: seiAddr.String(), Associated: associated} return json.Marshal(response) } + +func (h *EVMQueryHandler) HandleERC721RoyaltyInfo(ctx sdk.Context, caller string, contractAddress string, tokenId string, salePrice *sdk.Int) ([]byte, error) { + callerAddr, err := sdk.AccAddressFromBech32(caller) + if err != nil { + return nil, err + } + t, ok := sdk.NewIntFromString(tokenId) + if !ok { + return nil, errors.New("invalid token ID for ERC721, must be a big Int") + } + contract := common.HexToAddress(contractAddress) + abi, err := cw721.Cw721MetaData.GetAbi() + if err != nil { + return nil, err + } + bz, err := abi.Pack("royaltyInfo", t.BigInt(), salePrice.BigInt()) + if err != nil { + return nil, err + } + res, err := h.k.StaticCallEVM(ctx, callerAddr, &contract, bz) + if err != nil { + return nil, err + } + typed, err := abi.Unpack("royaltyInfo", res) + if err != nil { + return nil, err + } + + typedReceiver := typed[0].(common.Address) + receiver := "" + if (typedReceiver != common.Address{}) { + receiver = h.k.GetSeiAddressOrDefault(ctx, typedReceiver).String() + } + royaltyAmount := sdk.NewIntFromBigInt(typed[1].(*big.Int)) + response := bindings.ERC721RoyaltyInfoResponse{Receiver: receiver, RoyaltyAmount: &royaltyAmount} + return json.Marshal(response) +} + +func (h *EVMQueryHandler) HandleSupportsInterface(ctx sdk.Context, caller string, id string, contractAddress string) ([]byte, error) { + callerAddr, err := sdk.AccAddressFromBech32(caller) + if err != nil { + return nil, err + } + contract := common.HexToAddress(contractAddress) + abi, err := cw721.Cw721MetaData.GetAbi() + if err != nil { + return nil, err + } + aid := [4]byte{} + idbz, err := hex.DecodeString(strings.TrimPrefix(id, "0x")) + if err != nil { + return nil, err + } + copy(aid[:], idbz) + bz, err := abi.Pack("supportsInterface", aid) + if err != nil { + return nil, err + } + res, err := h.k.StaticCallEVM(ctx, callerAddr, &contract, bz) + if err != nil { + return nil, err + } + typed, err := abi.Unpack("supportsInterface", res) + if err != nil { + return nil, err + } + return json.Marshal(bindings.SupportsInterfaceResponse{Supported: typed[0].(bool)}) +} diff --git a/x/evm/integration_test.go b/x/evm/integration_test.go new file mode 100644 index 000000000..f28397768 --- /dev/null +++ b/x/evm/integration_test.go @@ -0,0 +1,242 @@ +package evm_test + +import ( + "bytes" + "crypto/sha256" + "encoding/hex" + "encoding/json" + "fmt" + "math/big" + "os" + "testing" + "time" + + sdk "github.com/cosmos/cosmos-sdk/types" + ethabi "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/crypto" + "github.com/sei-protocol/sei-chain/precompiles/pointer" + testkeeper "github.com/sei-protocol/sei-chain/testutil/keeper" + "github.com/sei-protocol/sei-chain/x/evm/artifacts/cw721" + "github.com/sei-protocol/sei-chain/x/evm/keeper" + "github.com/sei-protocol/sei-chain/x/evm/types" + "github.com/sei-protocol/sei-chain/x/evm/types/ethtx" + "github.com/stretchr/testify/require" + abci "github.com/tendermint/tendermint/abci/types" +) + +func TestERC2981PointerToCW2981(t *testing.T) { + k := testkeeper.EVMTestApp.EvmKeeper + ctx := testkeeper.EVMTestApp.GetContextForDeliverTx([]byte{}).WithBlockTime(time.Now()) + adminSeiAddr, adminEvmAddr := testkeeper.MockAddressPair() + k.SetAddressMapping(ctx, adminSeiAddr, adminEvmAddr) + // deploy cw2981 + bz, err := os.ReadFile("../../contracts/wasm/cw2981_royalties.wasm") + if err != nil { + panic(err) + } + codeID, err := k.WasmKeeper().Create(ctx, adminSeiAddr, bz, nil) + require.Nil(t, err) + instantiateMsg, err := json.Marshal(map[string]interface{}{"name": "test", "symbol": "TEST", "minter": adminSeiAddr.String()}) + require.Nil(t, err) + cw2981Addr, _, err := k.WasmKeeper().Instantiate(ctx, codeID, adminSeiAddr, adminSeiAddr, instantiateMsg, "cw2981", sdk.NewCoins()) + require.Nil(t, err) + require.NotEmpty(t, cw2981Addr) + // mint a NFT and set royalty info to 1% + executeMsg, err := json.Marshal(map[string]interface{}{ + "mint": map[string]interface{}{ + "token_id": "1", + "owner": adminSeiAddr.String(), + "extension": map[string]interface{}{ + "royalty_percentage": 1, + "royalty_payment_address": adminSeiAddr.String(), + }, + }, + }) + require.Nil(t, err) + _, err = k.WasmKeeper().Execute(ctx, cw2981Addr, adminSeiAddr, executeMsg, sdk.NewCoins()) + require.Nil(t, err) + // deploy pointer to cw2981 + privKey := testkeeper.MockPrivateKey() + seiAddr, evmAddr := testkeeper.PrivateKeyToAddresses(privKey) + k.SetAddressMapping(ctx, seiAddr, evmAddr) + require.Nil(t, k.BankKeeper().AddCoins(ctx, seiAddr, sdk.NewCoins(sdk.NewCoin("usei", sdk.NewInt(10000000))), true)) + testPrivHex := hex.EncodeToString(privKey.Bytes()) + key, _ := crypto.HexToECDSA(testPrivHex) + to := common.HexToAddress(pointer.PointerAddress) + abi, err := pointer.ABI() + require.Nil(t, err) + data, err := abi.Pack("addCW721Pointer", cw2981Addr.String()) + require.Nil(t, err) + txData := ethtypes.LegacyTx{ + Nonce: 0, + GasPrice: big.NewInt(1000000000), + Gas: 5000000, + To: &to, + Data: data, + } + chainID := k.ChainID(ctx) + chainCfg := types.DefaultChainConfig() + ethCfg := chainCfg.EthereumConfig(chainID) + blockNum := big.NewInt(ctx.BlockHeight()) + signer := ethtypes.MakeSigner(ethCfg, blockNum, uint64(ctx.BlockTime().Unix())) + tx, err := ethtypes.SignTx(ethtypes.NewTx(&txData), signer, key) + require.Nil(t, err) + typedTx, err := ethtx.NewLegacyTx(tx) + require.Nil(t, err) + msg, err := types.NewMsgEVMTransaction(typedTx) + require.Nil(t, err) + txBuilder := testkeeper.EVMTestApp.GetTxConfig().NewTxBuilder() + txBuilder.SetMsgs(msg) + cosmosTx := txBuilder.GetTx() + txbz, err := testkeeper.EVMTestApp.GetTxConfig().TxEncoder()(cosmosTx) + require.Nil(t, err) + res := testkeeper.EVMTestApp.DeliverTx(ctx, abci.RequestDeliverTx{Tx: txbz}, cosmosTx, sha256.Sum256(txbz)) + require.Equal(t, uint32(0), res.Code) + pointerAddr, _, exists := k.GetERC721CW721Pointer(ctx, cw2981Addr.String()) + require.True(t, exists) + require.NotEmpty(t, pointerAddr) + // call pointer to get royalty info + abi, err = cw721.Cw721MetaData.GetAbi() + require.Nil(t, err) + data, err = abi.Pack("royaltyInfo", big.NewInt(1), big.NewInt(1000)) + require.Nil(t, err) + txData = ethtypes.LegacyTx{ + Nonce: 2, + GasPrice: big.NewInt(1000000000), + Gas: 1000000, + To: &pointerAddr, + Data: data, + } + tx, err = ethtypes.SignTx(ethtypes.NewTx(&txData), signer, key) + require.Nil(t, err) + typedTx, err = ethtx.NewLegacyTx(tx) + require.Nil(t, err) + msg, err = types.NewMsgEVMTransaction(typedTx) + require.Nil(t, err) + txBuilder = testkeeper.EVMTestApp.GetTxConfig().NewTxBuilder() + txBuilder.SetMsgs(msg) + cosmosTx = txBuilder.GetTx() + txbz, err = testkeeper.EVMTestApp.GetTxConfig().TxEncoder()(cosmosTx) + require.Nil(t, err) + res = testkeeper.EVMTestApp.DeliverTx(ctx, abci.RequestDeliverTx{Tx: txbz}, cosmosTx, sha256.Sum256(txbz)) + require.Equal(t, uint32(0), res.Code) + typedTxData := sdk.TxMsgData{} + require.Nil(t, typedTxData.Unmarshal(res.Data)) + typedMsgData := types.MsgEVMTransactionResponse{} + require.Nil(t, typedMsgData.Unmarshal(typedTxData.Data[0].Data)) + ret, err := abi.Unpack("royaltyInfo", typedMsgData.ReturnData) + require.Nil(t, err) + require.Equal(t, big.NewInt(10), ret[1].(*big.Int)) + require.Equal(t, adminEvmAddr.Hex(), ret[0].(common.Address).Hex()) +} + +func TestCW2981PointerToERC2981(t *testing.T) { + k := testkeeper.EVMTestApp.EvmKeeper + ctx := testkeeper.EVMTestApp.GetContextForDeliverTx([]byte{}).WithBlockTime(time.Now()) + // deploy erc2981 + privKey := testkeeper.MockPrivateKey() + seiAddr, evmAddr := testkeeper.PrivateKeyToAddresses(privKey) + k.SetAddressMapping(ctx, seiAddr, evmAddr) + require.Nil(t, k.BankKeeper().AddCoins(ctx, seiAddr, sdk.NewCoins(sdk.NewCoin("usei", sdk.NewInt(10000000))), true)) + testPrivHex := hex.EncodeToString(privKey.Bytes()) + key, _ := crypto.HexToECDSA(testPrivHex) + abiBz, err := os.ReadFile("../../example/contracts/erc2981/ERC2981Example.abi") + require.Nil(t, err) + abi, err := ethabi.JSON(bytes.NewReader(abiBz)) + require.Nil(t, err) + code, err := os.ReadFile("../../example/contracts/erc2981/ERC2981Example.bin") + require.Nil(t, err) + bz, err := hex.DecodeString(string(code)) + require.Nil(t, err) + data, err := abi.Pack("", "test", "TEST") + require.Nil(t, err) + txData := ethtypes.LegacyTx{ + Nonce: 0, + GasPrice: big.NewInt(1000000000), + Gas: 5000000, + To: nil, + Data: append(bz, data...), + } + chainID := k.ChainID(ctx) + chainCfg := types.DefaultChainConfig() + ethCfg := chainCfg.EthereumConfig(chainID) + blockNum := big.NewInt(ctx.BlockHeight()) + signer := ethtypes.MakeSigner(ethCfg, blockNum, uint64(ctx.BlockTime().Unix())) + tx, err := ethtypes.SignTx(ethtypes.NewTx(&txData), signer, key) + require.Nil(t, err) + typedTx, err := ethtx.NewLegacyTx(tx) + require.Nil(t, err) + msg, err := types.NewMsgEVMTransaction(typedTx) + require.Nil(t, err) + txBuilder := testkeeper.EVMTestApp.GetTxConfig().NewTxBuilder() + txBuilder.SetMsgs(msg) + cosmosTx := txBuilder.GetTx() + txbz, err := testkeeper.EVMTestApp.GetTxConfig().TxEncoder()(cosmosTx) + require.Nil(t, err) + res := testkeeper.EVMTestApp.DeliverTx(ctx, abci.RequestDeliverTx{Tx: txbz}, cosmosTx, sha256.Sum256(txbz)) + require.Equal(t, uint32(0), res.Code) + receipt, err := k.GetReceipt(ctx, tx.Hash()) + require.Nil(t, err) + require.NotEmpty(t, receipt.ContractAddress) + require.Empty(t, receipt.VmError) + // set royalty + data, err = abi.Pack("setDefaultRoyalty", evmAddr) + require.Nil(t, err) + to := common.HexToAddress(receipt.ContractAddress) + txData = ethtypes.LegacyTx{ + Nonce: 1, + GasPrice: big.NewInt(1000000000), + Gas: 1000000, + To: &to, + Data: data, + } + tx, err = ethtypes.SignTx(ethtypes.NewTx(&txData), signer, key) + require.Nil(t, err) + typedTx, err = ethtx.NewLegacyTx(tx) + require.Nil(t, err) + msg, err = types.NewMsgEVMTransaction(typedTx) + require.Nil(t, err) + txBuilder = testkeeper.EVMTestApp.GetTxConfig().NewTxBuilder() + txBuilder.SetMsgs(msg) + cosmosTx = txBuilder.GetTx() + txbz, err = testkeeper.EVMTestApp.GetTxConfig().TxEncoder()(cosmosTx) + require.Nil(t, err) + res = testkeeper.EVMTestApp.DeliverTx(ctx, abci.RequestDeliverTx{Tx: txbz}, cosmosTx, sha256.Sum256(txbz)) + require.Equal(t, uint32(0), res.Code) + // deploy CW->ERC pointer + res2, err := keeper.NewMsgServerImpl(&k).RegisterPointer(sdk.WrapSDKContext(ctx), &types.MsgRegisterPointer{ + Sender: seiAddr.String(), + PointerType: types.PointerType_ERC721, + ErcAddress: receipt.ContractAddress, + }) + require.Nil(t, err) + require.NotEmpty(t, res2.PointerAddress) + // call pointer to get royalty info + query, err := json.Marshal(map[string]interface{}{ + "extension": map[string]interface{}{ + "msg": map[string]interface{}{ + "check_royalties": map[string]interface{}{}, + }, + }, + }) + require.Nil(t, err) + ret, err := testkeeper.EVMTestApp.WasmKeeper.QuerySmart(ctx, sdk.MustAccAddressFromBech32(res2.PointerAddress), query) + require.Nil(t, err) + require.Equal(t, "{\"royalty_payments\":true}", string(ret)) + query, err = json.Marshal(map[string]interface{}{ + "extension": map[string]interface{}{ + "msg": map[string]interface{}{ + "royalty_info": map[string]interface{}{ + "token_id": "1", + "sale_price": "1000", + }, + }, + }, + }) + require.Nil(t, err) + ret, err = testkeeper.EVMTestApp.WasmKeeper.QuerySmart(ctx, sdk.MustAccAddressFromBech32(res2.PointerAddress), query) + require.Nil(t, err) + require.Equal(t, fmt.Sprintf("{\"address\":\"%s\",\"royalty_amount\":\"1000\"}", seiAddr.String()), string(ret)) +} diff --git a/x/evm/module_test.go b/x/evm/module_test.go index d91c6e109..4a5403577 100644 --- a/x/evm/module_test.go +++ b/x/evm/module_test.go @@ -45,7 +45,7 @@ func TestModuleExportGenesis(t *testing.T) { module := evm.NewAppModule(nil, k) jsonMsg := module.ExportGenesis(ctx, types.ModuleCdc) jsonStr := string(jsonMsg) - assert.Equal(t, "{\"params\":{\"priority_normalizer\":\"1.000000000000000000\",\"base_fee_per_gas\":\"0.000000000000000000\",\"minimum_fee_per_gas\":\"1000000000.000000000000000000\",\"whitelisted_cw_code_hashes_for_delegate_call\":[]},\"address_associations\":[{\"sei_address\":\"sei17xpfvakm2amg962yls6f84z3kell8c5la4jkdu\",\"eth_address\":\"0x27F7B8B8B5A4e71E8E9aA671f4e4031E3773303F\"}],\"codes\":[],\"states\":[],\"nonces\":[],\"serialized\":[{\"prefix\":\"Fg==\",\"key\":\"AwAB\",\"value\":\"AAAAAAAAAAM=\"},{\"prefix\":\"Fg==\",\"key\":\"BAAC\",\"value\":\"AAAAAAAAAAQ=\"}]}", jsonStr) + assert.Equal(t, "{\"params\":{\"priority_normalizer\":\"1.000000000000000000\",\"base_fee_per_gas\":\"0.000000000000000000\",\"minimum_fee_per_gas\":\"1000000000.000000000000000000\",\"whitelisted_cw_code_hashes_for_delegate_call\":[]},\"address_associations\":[{\"sei_address\":\"sei17xpfvakm2amg962yls6f84z3kell8c5la4jkdu\",\"eth_address\":\"0x27F7B8B8B5A4e71E8E9aA671f4e4031E3773303F\"}],\"codes\":[],\"states\":[],\"nonces\":[],\"serialized\":[{\"prefix\":\"Fg==\",\"key\":\"AwAB\",\"value\":\"AAAAAAAAAAM=\"},{\"prefix\":\"Fg==\",\"key\":\"BAAD\",\"value\":\"AAAAAAAAAAQ=\"}]}", jsonStr) } func TestConsensusVersion(t *testing.T) { From 045251bd6f6196adf1e5f62d6cab730a1388e847 Mon Sep 17 00:00:00 2001 From: Jeremy Wei Date: Wed, 15 May 2024 15:05:16 -0400 Subject: [PATCH 40/51] Add sei_getCosmosTx endpoint (#1672) * Add sei_getCosmosTx endpoint * fix * add invocation of sei_getCosmosTx to test --------- Co-authored-by: Steven Landers --- contracts/test/EVMCompatabilityTest.js | 7 +++-- contracts/test/lib.js | 5 +++ evmrpc/association.go | 42 ++++++++++++++++++++++++++ evmrpc/association_test.go | 6 ++++ 4 files changed, 58 insertions(+), 2 deletions(-) diff --git a/contracts/test/EVMCompatabilityTest.js b/contracts/test/EVMCompatabilityTest.js index ac9ce24c3..335d103c5 100644 --- a/contracts/test/EVMCompatabilityTest.js +++ b/contracts/test/EVMCompatabilityTest.js @@ -3,7 +3,7 @@ const {isBigNumber} = require("hardhat/common"); const {uniq, shuffle} = require("lodash"); const { ethers, upgrades } = require('hardhat'); const { getImplementationAddress } = require('@openzeppelin/upgrades-core'); -const { deployEvmContract, setupSigners, fundAddress} = require("./lib") +const { deployEvmContract, setupSigners, fundAddress, getCosmosTx} = require("./lib") const axios = require("axios"); function sleep(ms) { @@ -315,7 +315,10 @@ describe("EVM Test", function () { it("Should set the string correctly and emit an event", async function () { await delay() const txResponse = await evmTester.setStringVar("test"); - await txResponse.wait(); // Wait for the transaction to be mined + const receipt = await txResponse.wait(); // Wait for the transaction to be mined + + const cosmosTx = await getCosmosTx(ethers.provider, receipt.hash) + expect(cosmosTx.length).to.be.equal(64) await expect(txResponse) .to.emit(evmTester, 'StringSet') diff --git a/contracts/test/lib.js b/contracts/test/lib.js index 6ef62fc7c..86f59dc2c 100644 --- a/contracts/test/lib.js +++ b/contracts/test/lib.js @@ -50,6 +50,10 @@ async function delay() { await sleep(1000) } +async function getCosmosTx(provider, evmTxHash) { + return await provider.send("sei_getCosmosTx", [evmTxHash]) +} + async function fundAddress(addr, amount="10000000000000000000") { const result = await evmSend(addr, adminKeyName, amount) await delay() @@ -418,6 +422,7 @@ module.exports = { bankSend, evmSend, waitForReceipt, + getCosmosTx, isDocker, testAPIEnabled, incrementPointerVersion, diff --git a/evmrpc/association.go b/evmrpc/association.go index fb3fda479..5d8af571e 100644 --- a/evmrpc/association.go +++ b/evmrpc/association.go @@ -11,6 +11,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/rpc" "github.com/sei-protocol/sei-chain/x/evm/keeper" "github.com/sei-protocol/sei-chain/x/evm/types" "github.com/sei-protocol/sei-chain/x/evm/types/ethtx" @@ -118,3 +119,44 @@ func decodeHexString(hexString string) ([]byte, error) { } return hex.DecodeString(trimmed) } + +func (t *AssociationAPI) GetCosmosTx(ctx context.Context, ethHash common.Hash) (result string, returnErr error) { + startTime := time.Now() + defer recordMetrics("sei_getCosmosTx", t.connectionType, startTime, returnErr == nil) + receipt, err := t.keeper.GetReceipt(t.ctxProvider(LatestCtxHeight), ethHash) + if err != nil { + return "", err + } + height := int64(receipt.BlockNumber) + number := rpc.BlockNumber(height) + numberPtr, err := getBlockNumber(ctx, t.tmClient, number) + if err != nil { + return "", err + } + block, err := blockByNumberWithRetry(ctx, t.tmClient, numberPtr, 1) + if err != nil { + return "", err + } + blockRes, err := blockResultsWithRetry(ctx, t.tmClient, &height) + if err != nil { + return "", err + } + for i := range blockRes.TxsResults { + tmTx := block.Block.Txs[i] + decoded, err := t.txDecoder(block.Block.Txs[i]) + if err != nil { + return "", err + } + for _, msg := range decoded.GetMsgs() { + switch m := msg.(type) { + case *types.MsgEVMTransaction: + ethtx, _ := m.AsTransaction() + hash := ethtx.Hash() + if hash == ethHash { + return fmt.Sprintf("%X", tmTx.Hash()), nil + } + } + } + } + return "", fmt.Errorf("transaction not found") +} diff --git a/evmrpc/association_test.go b/evmrpc/association_test.go index f9f6f03e5..893ac8365 100644 --- a/evmrpc/association_test.go +++ b/evmrpc/association_test.go @@ -43,3 +43,9 @@ func TestGetEvmAddress(t *testing.T) { body := sendRequestGoodWithNamespace(t, "sei", "getEVMAddress", "sei1mf0llhmqane5w2y8uynmghmk2w4mh0xll9seym") require.Equal(t, body["result"], "0x1df809C639027b465B931BD63Ce71c8E5834D9d6") } + +func TestGetCosmosTx(t *testing.T) { + body := sendRequestGoodWithNamespace(t, "sei", "getCosmosTx", "0xf02362077ac075a397344172496b28e913ce5294879d811bb0269b3be20a872e") + fmt.Println(body) + require.Equal(t, body["result"], "690D39ADF56D4C811B766DFCD729A415C36C4BFFE80D63E305373B9518EBFB14") +} From b096dc75f36d3d4ccac549c29507b9263c643800 Mon Sep 17 00:00:00 2001 From: dvli2007 Date: Wed, 15 May 2024 21:23:12 -0400 Subject: [PATCH 41/51] Update ERC721 pointer contract (#1671) * Update ERC721 pointer contract * Handle contract compile warnings * Add abi/bin for ERC721 pointer * Fix tests * Fix bug: handle str from extractAsBytes that preserves `"` * Fix test and update binary for CW721ERC721Pointer --- contracts/src/CW721ERC721Pointer.sol | 65 +++++++++++--- contracts/test/CW721ERC721PointerTest.t.sol | 34 +++++-- x/evm/artifacts/cw721/CW721ERC721Pointer.abi | 2 +- x/evm/artifacts/cw721/CW721ERC721Pointer.bin | 2 +- x/evm/artifacts/cw721/cw721.go | 95 +++++++++++++++++++- 5 files changed, 177 insertions(+), 21 deletions(-) diff --git a/contracts/src/CW721ERC721Pointer.sol b/contracts/src/CW721ERC721Pointer.sol index 9f4947486..f02adce37 100644 --- a/contracts/src/CW721ERC721Pointer.sol +++ b/contracts/src/CW721ERC721Pointer.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; +pragma solidity ^0.8.4; import "@openzeppelin/contracts/token/common/ERC2981.sol"; import "@openzeppelin/contracts/token/ERC721/ERC721.sol"; @@ -21,6 +21,9 @@ contract CW721ERC721Pointer is ERC721,ERC2981 { IJson public JsonPrecompile; IAddr public AddrPrecompile; + error NotImplementedOnCosmwasmContract(string method); + error NotImplemented(string method); + constructor(string memory Cw721Address_, string memory name_, string memory symbol_) ERC721(name_, symbol_) { WasmdPrecompile = IWasmd(WASMD_PRECOMPILE_ADDRESS); JsonPrecompile = IJson(JSON_PRECOMPILE_ADDRESS); @@ -41,11 +44,22 @@ contract CW721ERC721Pointer is ERC721,ERC2981 { if (owner == address(0)) { revert ERC721InvalidOwner(address(0)); } + uint256 numTokens = 0; + string memory startAfter; string memory ownerAddr = _formatPayload("owner", _doubleQuotes(AddrPrecompile.getSeiAddr(owner))); string memory req = _curlyBrace(_formatPayload("tokens", _curlyBrace(ownerAddr))); bytes memory response = WasmdPrecompile.query(Cw721Address, bytes(req)); bytes[] memory tokens = JsonPrecompile.extractAsBytesList(response, "tokens"); - return tokens.length; + uint256 tokensLength = tokens.length; + while (tokensLength > 0) { + numTokens += tokensLength; + startAfter = _formatPayload("start_after", string(tokens[tokensLength-1])); + req = _curlyBrace(_formatPayload("tokens", _curlyBrace(_join(ownerAddr, startAfter, ",")))); + response = WasmdPrecompile.query(Cw721Address, bytes(req)); + tokens = JsonPrecompile.extractAsBytesList(response, "tokens"); + tokensLength = tokens.length; + } + return numTokens; } function ownerOf(uint256 tokenId) public view override returns (address) { @@ -82,22 +96,12 @@ contract CW721ERC721Pointer is ERC721,ERC2981 { return false; } - function tokenURI(uint256 tokenId) public view override returns (string memory) { - // revert if token isn't owned - ownerOf(tokenId); - string memory tId = _formatPayload("token_id", _doubleQuotes(Strings.toString(tokenId))); - string memory req = _curlyBrace(_formatPayload("nft_info", _curlyBrace(tId))); - bytes memory response = WasmdPrecompile.query(Cw721Address, bytes(req)); - bytes memory uri = JsonPrecompile.extractAsBytes(response, "token_uri"); - return string(uri); - } - // 2981 function royaltyInfo(uint256 tokenId, uint256 salePrice) public view override returns (address, uint256) { bytes memory checkRoyaltyResponse = WasmdPrecompile.query(Cw721Address, bytes("{\"extension\":{\"msg\":{\"check_royalties\":{}}}}")); bytes memory isRoyaltyImplemented = JsonPrecompile.extractAsBytes(checkRoyaltyResponse, "royalty_payments"); if (keccak256(isRoyaltyImplemented) != keccak256("true")) { - revert("royalty info not implemented on the underlying CosmWasm contract"); + revert NotImplementedOnCosmwasmContract("royalty_info"); } string memory tId = _formatPayload("token_id", _doubleQuotes(Strings.toString(tokenId))); string memory sPrice = _formatPayload("sale_price", _doubleQuotes(Strings.toString(salePrice))); @@ -112,6 +116,31 @@ contract CW721ERC721Pointer is ERC721,ERC2981 { return (AddrPrecompile.getEvmAddr(string(addr)), amt); } + function tokenURI(uint256 tokenId) public view override returns (string memory) { + // revert if token isn't owned + ownerOf(tokenId); + string memory tId = _formatPayload("token_id", _doubleQuotes(Strings.toString(tokenId))); + string memory req = _curlyBrace(_formatPayload("nft_info", _curlyBrace(tId))); + bytes memory response = WasmdPrecompile.query(Cw721Address, bytes(req)); + bytes memory uri = JsonPrecompile.extractAsBytes(response, "token_uri"); + return string(uri); + } + + // 721-Enumerable + function totalSupply() public view virtual returns (uint256) { + string memory req = _curlyBrace(_formatPayload("num_tokens", "{}")); + bytes memory response = WasmdPrecompile.query(Cw721Address, bytes(req)); + return JsonPrecompile.extractAsUint256(response, "count"); + } + + function tokenOfOwnerByIndex(address, uint256) public view virtual returns (uint256) { + revert NotImplemented("tokenOfOwnerByIndex"); + } + + function tokenByIndex(uint256) public view virtual returns (uint256) { + revert NotImplemented("tokenByIndex"); + } + // Transactions function transferFrom(address from, address to, uint256 tokenId) public override { if (to == address(0)) { @@ -156,6 +185,16 @@ contract CW721ERC721Pointer is ERC721,ERC2981 { return ret; } + function _queryContractInfo() internal view virtual returns (string memory, string memory) { + string memory req = _curlyBrace(_formatPayload("contract_info", "{}")); + bytes memory response = WasmdPrecompile.query(Cw721Address, bytes(req)); + bytes memory respName = JsonPrecompile.extractAsBytes(response, "name"); + bytes memory respSymbol = JsonPrecompile.extractAsBytes(response, "symbol"); + string memory nameStr = string(respName); + string memory symbolStr = string(respSymbol); + return (nameStr, symbolStr); + } + function _formatPayload(string memory key, string memory value) internal pure returns (string memory) { return _join(_doubleQuotes(key), value, ":"); } diff --git a/contracts/test/CW721ERC721PointerTest.t.sol b/contracts/test/CW721ERC721PointerTest.t.sol index 9c4602e7c..d727a7e19 100644 --- a/contracts/test/CW721ERC721PointerTest.t.sol +++ b/contracts/test/CW721ERC721PointerTest.t.sol @@ -109,15 +109,39 @@ contract CW721ERC721PointerTest is Test { abi.encodeWithSignature("query(string,bytes)", MockCWContractAddress, bytes("{\"tokens\":{\"owner\":\"sei19zhelek4q5lt4zam8mcarmgv92vzgqd3ux32jw\"}}")), abi.encode("{\"tokens\":[\"a\",\"b\"]}") ); - bytes[] memory response = new bytes[](2); - response[0] = bytes("a"); - response[1] = bytes("b"); + vm.mockCall( + WASMD_PRECOMPILE_ADDRESS, + abi.encodeWithSignature("query(string,bytes)", MockCWContractAddress, bytes("{\"tokens\":{\"owner\":\"sei19zhelek4q5lt4zam8mcarmgv92vzgqd3ux32jw\",\"start_after\":\"b\"}}")), + abi.encode("{\"tokens\":[\"c\",\"d\"]}") + ); + vm.mockCall( + WASMD_PRECOMPILE_ADDRESS, + abi.encodeWithSignature("query(string,bytes)", MockCWContractAddress, bytes("{\"tokens\":{\"owner\":\"sei19zhelek4q5lt4zam8mcarmgv92vzgqd3ux32jw\",\"start_after\":\"d\"}}")), + abi.encode("{\"tokens\":[]}") + ); + bytes[] memory resp1 = new bytes[](2); + bytes[] memory resp2 = new bytes[](2); + bytes[] memory resp3 = new bytes[](0); + resp1[0] = bytes("\"a\""); + resp1[1] = bytes("\"b\""); + resp2[0] = bytes("\"c\""); + resp2[1] = bytes("\"d\""); vm.mockCall( JSON_PRECOMPILE_ADDRESS, abi.encodeWithSignature("extractAsBytesList(bytes,string)", bytes("{\"tokens\":[\"a\",\"b\"]}"), "tokens"), - abi.encode(response) + abi.encode(resp1) + ); + vm.mockCall( + JSON_PRECOMPILE_ADDRESS, + abi.encodeWithSignature("extractAsBytesList(bytes,string)", bytes("{\"tokens\":[\"c\",\"d\"]}"), "tokens"), + abi.encode(resp2) + ); + vm.mockCall( + JSON_PRECOMPILE_ADDRESS, + abi.encodeWithSignature("extractAsBytesList(bytes,string)", bytes("{\"tokens\":[]}"), "tokens"), + abi.encode(resp3) ); - assertEq(pointer.balanceOf(MockCallerEVMAddr), 2); + assertEq(pointer.balanceOf(MockCallerEVMAddr), 4); } function testOwnerOf() public { diff --git a/x/evm/artifacts/cw721/CW721ERC721Pointer.abi b/x/evm/artifacts/cw721/CW721ERC721Pointer.abi index a13566a00..7dc59839d 100644 --- a/x/evm/artifacts/cw721/CW721ERC721Pointer.abi +++ b/x/evm/artifacts/cw721/CW721ERC721Pointer.abi @@ -1 +1 @@ -[{"inputs":[{"internalType":"string","name":"Cw721Address_","type":"string"},{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"uint256","name":"numerator","type":"uint256"},{"internalType":"uint256","name":"denominator","type":"uint256"}],"name":"ERC2981InvalidDefaultRoyalty","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC2981InvalidDefaultRoyaltyReceiver","type":"error"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"numerator","type":"uint256"},{"internalType":"uint256","name":"denominator","type":"uint256"}],"name":"ERC2981InvalidTokenRoyalty","type":"error"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC2981InvalidTokenRoyaltyReceiver","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"owner","type":"address"}],"name":"ERC721IncorrectOwner","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721InsufficientApproval","type":"error"},{"inputs":[{"internalType":"address","name":"approver","type":"address"}],"name":"ERC721InvalidApprover","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"ERC721InvalidOperator","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"ERC721InvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC721InvalidReceiver","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"ERC721InvalidSender","type":"error"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721NonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"AddrPrecompile","outputs":[{"internalType":"contract IAddr","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"Cw721Address","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"JsonPrecompile","outputs":[{"internalType":"contract IJson","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WasmdPrecompile","outputs":[{"internalType":"contract IWasmd","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"approved","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"}] \ No newline at end of file +[{"inputs":[{"internalType":"string","name":"Cw721Address_","type":"string"},{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"uint256","name":"numerator","type":"uint256"},{"internalType":"uint256","name":"denominator","type":"uint256"}],"name":"ERC2981InvalidDefaultRoyalty","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC2981InvalidDefaultRoyaltyReceiver","type":"error"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"numerator","type":"uint256"},{"internalType":"uint256","name":"denominator","type":"uint256"}],"name":"ERC2981InvalidTokenRoyalty","type":"error"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC2981InvalidTokenRoyaltyReceiver","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"owner","type":"address"}],"name":"ERC721IncorrectOwner","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721InsufficientApproval","type":"error"},{"inputs":[{"internalType":"address","name":"approver","type":"address"}],"name":"ERC721InvalidApprover","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"ERC721InvalidOperator","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"ERC721InvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC721InvalidReceiver","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"ERC721InvalidSender","type":"error"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721NonexistentToken","type":"error"},{"inputs":[{"internalType":"string","name":"method","type":"string"}],"name":"NotImplemented","type":"error"},{"inputs":[{"internalType":"string","name":"method","type":"string"}],"name":"NotImplementedOnCosmwasmContract","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"AddrPrecompile","outputs":[{"internalType":"contract IAddr","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"Cw721Address","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"JsonPrecompile","outputs":[{"internalType":"contract IJson","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WasmdPrecompile","outputs":[{"internalType":"contract IWasmd","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"approved","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","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":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"}] \ No newline at end of file diff --git a/x/evm/artifacts/cw721/CW721ERC721Pointer.bin b/x/evm/artifacts/cw721/CW721ERC721Pointer.bin index 4ce131ed2..66803ded4 100644 --- a/x/evm/artifacts/cw721/CW721ERC721Pointer.bin +++ b/x/evm/artifacts/cw721/CW721ERC721Pointer.bin @@ -1 +1 @@ -608060405234801562000010575f80fd5b506040516200465d3803806200465d8339818101604052810190620000369190620002c3565b8181815f9081620000489190620005b0565b5080600190816200005a9190620005b0565b50505061100260095f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611003600a5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611004600b5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508260089081620001349190620005b0565b5050505062000694565b5f604051905090565b5f80fd5b5f80fd5b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6200019f8262000157565b810181811067ffffffffffffffff82111715620001c157620001c062000167565b5b80604052505050565b5f620001d56200013e565b9050620001e3828262000194565b919050565b5f67ffffffffffffffff82111562000205576200020462000167565b5b620002108262000157565b9050602081019050919050565b5f5b838110156200023c5780820151818401526020810190506200021f565b5f8484015250505050565b5f6200025d6200025784620001e8565b620001ca565b9050828152602081018484840111156200027c576200027b62000153565b5b620002898482856200021d565b509392505050565b5f82601f830112620002a857620002a76200014f565b5b8151620002ba84826020860162000247565b91505092915050565b5f805f60608486031215620002dd57620002dc62000147565b5b5f84015167ffffffffffffffff811115620002fd57620002fc6200014b565b5b6200030b8682870162000291565b935050602084015167ffffffffffffffff8111156200032f576200032e6200014b565b5b6200033d8682870162000291565b925050604084015167ffffffffffffffff8111156200036157620003606200014b565b5b6200036f8682870162000291565b9150509250925092565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680620003c857607f821691505b602082108103620003de57620003dd62000383565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f60088302620004427fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000405565b6200044e868362000405565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f62000498620004926200048c8462000466565b6200046f565b62000466565b9050919050565b5f819050919050565b620004b38362000478565b620004cb620004c2826200049f565b84845462000411565b825550505050565b5f90565b620004e1620004d3565b620004ee818484620004a8565b505050565b5b818110156200051557620005095f82620004d7565b600181019050620004f4565b5050565b601f82111562000564576200052e81620003e4565b6200053984620003f6565b8101602085101562000549578190505b620005616200055885620003f6565b830182620004f3565b50505b505050565b5f82821c905092915050565b5f620005865f198460080262000569565b1980831691505092915050565b5f620005a0838362000575565b9150826002028217905092915050565b620005bb8262000379565b67ffffffffffffffff811115620005d757620005d662000167565b5b620005e38254620003b0565b620005f082828562000519565b5f60209050601f83116001811462000626575f841562000611578287015190505b6200061d858262000593565b8655506200068c565b601f1984166200063686620003e4565b5f5b828110156200065f5784890151825560018201915060208501945060208101905062000638565b868310156200067f57848901516200067b601f89168262000575565b8355505b6001600288020188555050505b505050505050565b613fbb80620006a25f395ff3fe608060405234801561000f575f80fd5b5060043610610114575f3560e01c806370a08231116100a0578063c2aed3021161006f578063c2aed302146102ef578063c87b56dd1461030d578063de4725cc1461033d578063e985e9c51461035b578063f00b02551461038b57610114565b806370a082311461026957806395d89b4114610299578063a22cb465146102b7578063b88d4fde146102d357610114565b806323b872dd116100e757806323b872dd146101b25780632a55205a146101ce57806342842e0e146101ff5780635c4aead71461021b5780636352211e1461023957610114565b806301ffc9a71461011857806306fdde0314610148578063081812fc14610166578063095ea7b314610196575b5f80fd5b610132600480360381019061012d9190612b24565b6103a9565b60405161013f9190612b69565b60405180910390f35b61015061054a565b60405161015d9190612c0c565b60405180910390f35b610180600480360381019061017b9190612c5f565b6105d9565b60405161018d9190612cc9565b60405180910390f35b6101b060048036038101906101ab9190612d0c565b610933565b005b6101cc60048036038101906101c79190612d4a565b610b6f565b005b6101e860048036038101906101e39190612d9a565b610e8a565b6040516101f6929190612de7565b60405180910390f35b61021960048036038101906102149190612d4a565b6114bb565b005b6102236114da565b6040516102309190612c0c565b60405180910390f35b610253600480360381019061024e9190612c5f565b611566565b6040516102609190612cc9565b60405180910390f35b610283600480360381019061027e9190612e0e565b6117f0565b6040516102909190612e39565b60405180910390f35b6102a1611ae6565b6040516102ae9190612c0c565b60405180910390f35b6102d160048036038101906102cc9190612e7c565b611b76565b005b6102ed60048036038101906102e89190612fe6565b611d79565b005b6102f7611d96565b60405161030491906130c1565b60405180910390f35b61032760048036038101906103229190612c5f565b611dbb565b6040516103349190612c0c565b60405180910390f35b610345611fb8565b60405161035291906130fa565b60405180910390f35b61037560048036038101906103709190613113565b611fdd565b6040516103829190612b69565b60405180910390f35b610393612417565b6040516103a09190613171565b60405180910390f35b5f7f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061047357507f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806104db57507f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061054357507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60605f8054610558906131b7565b80601f0160208091040260200160405190810160405280929190818152602001828054610584906131b7565b80156105cf5780601f106105a6576101008083540402835291602001916105cf565b820191905f5260205f20905b8154815290600101906020018083116105b257829003601f168201915b5050505050905090565b5f8061062a6040518060400160405280600881526020017f746f6b656e5f69640000000000000000000000000000000000000000000000008152506106256106208661243c565b612506565b61254e565b90505f61067c6106776040518060400160405280600981526020017f617070726f76616c730000000000000000000000000000000000000000000000815250610672856125a0565b61254e565b6125a0565b90505f60095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166306d81d296008846040518363ffffffff1660e01b81526004016106dc9291906132cc565b5f60405180830381865afa1580156106f6573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f8201168201806040525081019061071e919061336f565b90505f600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166387cdf621836040518263ffffffff1660e01b815260040161077b9190613400565b5f60405180830381865afa158015610795573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906107bd9190613515565b90505f81511115610926575f600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166308d858e5835f815181106108195761081861355c565b5b60200260200101516040518263ffffffff1660e01b815260040161083d91906135d3565b5f60405180830381865afa158015610857573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f8201168201806040525081019061087f919061336f565b9050600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631778e539826040518263ffffffff1660e01b81526004016108db9190612c0c565b602060405180830381865afa1580156108f6573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061091a919061361a565b9550505050505061092e565b5f9450505050505b919050565b5f610a166040518060400160405280600781526020017f7370656e64657200000000000000000000000000000000000000000000000000815250610a11600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630c3c20ed876040518263ffffffff1660e01b81526004016109ca9190612cc9565b5f60405180830381865afa1580156109e4573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f82011682018060405250810190610a0c91906136e3565b612506565b61254e565b90505f610a686040518060400160405280600881526020017f746f6b656e5f6964000000000000000000000000000000000000000000000000815250610a63610a5e8661243c565b612506565b61254e565b90505f610af9610af46040518060400160405280600781526020017f617070726f766500000000000000000000000000000000000000000000000000815250610aef610aea87876040518060400160405280600181526020017f2c000000000000000000000000000000000000000000000000000000000000008152506125e8565b6125a0565b61254e565b6125a0565b9050610b0481612636565b50838573ffffffffffffffffffffffffffffffffffffffff16610b2686611566565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050505050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610bdf575f6040517f64a0ae92000000000000000000000000000000000000000000000000000000008152600401610bd69190612cc9565b60405180910390fd5b610be881611566565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614610c55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4c90613774565b60405180910390fd5b5f610d386040518060400160405280600981526020017f726563697069656e740000000000000000000000000000000000000000000000815250610d33600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630c3c20ed876040518263ffffffff1660e01b8152600401610cec9190612cc9565b5f60405180830381865afa158015610d06573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f82011682018060405250810190610d2e91906136e3565b612506565b61254e565b90505f610d8a6040518060400160405280600881526020017f746f6b656e5f6964000000000000000000000000000000000000000000000000815250610d85610d808661243c565b612506565b61254e565b90505f610e1b610e166040518060400160405280600c81526020017f7472616e736665725f6e66740000000000000000000000000000000000000000815250610e11610e0c87876040518060400160405280600181526020017f2c000000000000000000000000000000000000000000000000000000000000008152506125e8565b6125a0565b61254e565b6125a0565b9050610e2681612636565b50838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050505050565b5f805f60095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166306d81d2960086040518060600160405280602c8152602001613f5a602c91396040518363ffffffff1660e01b8152600401610f029291906132cc565b5f60405180830381865afa158015610f1c573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f82011682018060405250810190610f44919061336f565b90505f600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166308d858e5836040518263ffffffff1660e01b8152600401610fa191906137dc565b5f60405180830381865afa158015610fbb573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f82011682018060405250810190610fe3919061336f565b90507f6273151f959616268004b58dbb21e5c851b7b8d04498b4aabee12291d22fc03481805190602001201461104e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110459061387f565b60405180910390fd5b5f61109e6040518060400160405280600881526020017f746f6b656e5f69640000000000000000000000000000000000000000000000008152506110996110948a61243c565b612506565b61254e565b90505f6110f06040518060400160405280600a81526020017f73616c655f7072696365000000000000000000000000000000000000000000008152506110eb6110e68a61243c565b612506565b61254e565b90505f61118161117c6040518060400160405280600c81526020017f726f79616c74795f696e666f000000000000000000000000000000000000000081525061117761117287876040518060400160405280600181526020017f2c000000000000000000000000000000000000000000000000000000000000008152506125e8565b6125a0565b61254e565b6125a0565b90505f61121161120c6040518060400160405280600981526020017f657874656e73696f6e00000000000000000000000000000000000000000000008152506112076112026040518060400160405280600381526020017f6d736700000000000000000000000000000000000000000000000000000000008152508761254e565b6125a0565b61254e565b6125a0565b90505f60095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166306d81d296008846040518363ffffffff1660e01b81526004016112719291906132cc565b5f60405180830381865afa15801561128b573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906112b3919061336f565b90505f600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166308d858e5836040518263ffffffff1660e01b815260040161131091906138e7565b5f60405180830381865afa15801561132a573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f82011682018060405250810190611352919061336f565b90505f600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635a558982846040518263ffffffff1660e01b81526004016113af9190613964565b602060405180830381865afa1580156113ca573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113ee91906139ab565b90505f82510361140c575f819a509a505050505050505050506114b4565b600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631778e539836040518263ffffffff1660e01b81526004016114669190612c0c565b602060405180830381865afa158015611481573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114a5919061361a565b819a509a505050505050505050505b9250929050565b6114d583838360405180602001604052805f815250611d79565b505050565b600880546114e7906131b7565b80601f0160208091040260200160405190810160405280929190818152602001828054611513906131b7565b801561155e5780601f106115355761010080835404028352916020019161155e565b820191905f5260205f20905b81548152906001019060200180831161154157829003601f168201915b505050505081565b5f806115b76040518060400160405280600881526020017f746f6b656e5f69640000000000000000000000000000000000000000000000008152506115b26115ad8661243c565b612506565b61254e565b90505f6116096116046040518060400160405280600881526020017f6f776e65725f6f660000000000000000000000000000000000000000000000008152506115ff856125a0565b61254e565b6125a0565b90505f60095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166306d81d296008846040518363ffffffff1660e01b81526004016116699291906132cc565b5f60405180830381865afa158015611683573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906116ab919061336f565b90505f600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166308d858e5836040518263ffffffff1660e01b81526004016117089190613a20565b5f60405180830381865afa158015611722573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f8201168201806040525081019061174a919061336f565b9050600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631778e539826040518263ffffffff1660e01b81526004016117a69190612c0c565b602060405180830381865afa1580156117c1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117e5919061361a565b945050505050919050565b5f8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611861575f6040517f89c62b640000000000000000000000000000000000000000000000000000000081526004016118589190612cc9565b60405180910390fd5b5f6119446040518060400160405280600581526020017f6f776e657200000000000000000000000000000000000000000000000000000081525061193f600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630c3c20ed876040518263ffffffff1660e01b81526004016118f89190612cc9565b5f60405180830381865afa158015611912573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f8201168201806040525081019061193a91906136e3565b612506565b61254e565b90505f6119966119916040518060400160405280600681526020017f746f6b656e73000000000000000000000000000000000000000000000000000081525061198c856125a0565b61254e565b6125a0565b90505f60095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166306d81d296008846040518363ffffffff1660e01b81526004016119f69291906132cc565b5f60405180830381865afa158015611a10573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f82011682018060405250810190611a38919061336f565b90505f600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166387cdf621836040518263ffffffff1660e01b8152600401611a959190613a9d565b5f60405180830381865afa158015611aaf573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f82011682018060405250810190611ad79190613515565b90508051945050505050919050565b606060018054611af5906131b7565b80601f0160208091040260200160405190810160405280929190818152602001828054611b21906131b7565b8015611b6c5780601f10611b4357610100808354040283529160200191611b6c565b820191905f5260205f20905b815481529060010190602001808311611b4f57829003601f168201915b5050505050905090565b5f611c61611c5c6040518060400160405280600881526020017f6f70657261746f72000000000000000000000000000000000000000000000000815250611c57600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630c3c20ed886040518263ffffffff1660e01b8152600401611c109190612cc9565b5f60405180830381865afa158015611c2a573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f82011682018060405250810190611c5291906136e3565b612506565b61254e565b6125a0565b90508115611cbe57611cb8611cb3611cae6040518060400160405280600b81526020017f617070726f76655f616c6c0000000000000000000000000000000000000000008152508461254e565b6125a0565b612636565b50611d0f565b611d0d611d08611d036040518060400160405280600a81526020017f7265766f6b655f616c6c000000000000000000000000000000000000000000008152508461254e565b6125a0565b612636565b505b8273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3184604051611d6c9190612b69565b60405180910390a3505050565b611d84848484610b6f565b611d90848484846127b4565b50505050565b600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6060611dc682611566565b505f611e176040518060400160405280600881526020017f746f6b656e5f6964000000000000000000000000000000000000000000000000815250611e12611e0d8661243c565b612506565b61254e565b90505f611e69611e646040518060400160405280600881526020017f6e66745f696e666f000000000000000000000000000000000000000000000000815250611e5f856125a0565b61254e565b6125a0565b90505f60095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166306d81d296008846040518363ffffffff1660e01b8152600401611ec99291906132cc565b5f60405180830381865afa158015611ee3573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f82011682018060405250810190611f0b919061336f565b90505f600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166308d858e5836040518263ffffffff1660e01b8152600401611f689190613b1a565b5f60405180830381865afa158015611f82573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f82011682018060405250810190611faa919061336f565b905080945050505050919050565b600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f806120c16040518060400160405280600581526020017f6f776e65720000000000000000000000000000000000000000000000000000008152506120bc600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630c3c20ed886040518263ffffffff1660e01b81526004016120759190612cc9565b5f60405180830381865afa15801561208f573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906120b791906136e3565b612506565b61254e565b90505f61211361210e6040518060400160405280600d81526020017f616c6c5f6f70657261746f727300000000000000000000000000000000000000815250612109856125a0565b61254e565b6125a0565b90505f60095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166306d81d296008846040518363ffffffff1660e01b81526004016121739291906132cc565b5f60405180830381865afa15801561218d573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906121b5919061336f565b90505f600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166387cdf621836040518263ffffffff1660e01b81526004016122129190613b97565b5f60405180830381865afa15801561222c573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906122549190613515565b90505f5b8151811015612408575f600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166308d858e58484815181106122b2576122b161355c565b5b60200260200101516040518263ffffffff1660e01b81526004016122d691906135d3565b5f60405180830381865afa1580156122f0573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f82011682018060405250810190612318919061336f565b90508773ffffffffffffffffffffffffffffffffffffffff16600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631778e539836040518263ffffffff1660e01b815260040161238b9190612c0c565b602060405180830381865afa1580156123a6573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123ca919061361a565b73ffffffffffffffffffffffffffffffffffffffff16036123f45760019650505050505050612411565b50808061240090613bf7565b915050612258565b505f9450505050505b92915050565b60095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60605f600161244a84612966565b0190505f8167ffffffffffffffff81111561246857612467612ec2565b5b6040519080825280601f01601f19166020018201604052801561249a5781602001600182028036833780820191505090505b5090505f82602001820190505b6001156124fb578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a85816124f0576124ef613c3e565b5b0494505f85036124a7575b819350505050919050565b6060816040516020016125199190613ccb565b6040516020818303038152906040526040516020016125389190613cf0565b6040516020818303038152906040529050919050565b606061259861255c84612506565b836040518060400160405280600181526020017f3a000000000000000000000000000000000000000000000000000000000000008152506125e8565b905092915050565b6060816040516020016125b39190613d3b565b6040516020818303038152906040526040516020016125d29190613d86565b6040516020818303038152906040529050919050565b60608382846040516020016125fe929190613dab565b60405160208183030381529060405260405160200161261e929190613dab565b60405160208183030381529060405290509392505050565b60605f8061100273ffffffffffffffffffffffffffffffffffffffff166008856040518060400160405280600281526020017f5b5d00000000000000000000000000000000000000000000000000000000000081525060405160240161269e93929190613dce565b6040516020818303038152906040527f44d227ae000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516127289190613e52565b5f60405180830381855af49150503d805f8114612760576040519150601f19603f3d011682016040523d82523d5f602084013e612765565b606091505b5091509150816127aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127a190613eb2565b60405180910390fd5b8092505050919050565b5f8373ffffffffffffffffffffffffffffffffffffffff163b1115612960578273ffffffffffffffffffffffffffffffffffffffff1663150b7a026127f7612ab7565b8685856040518563ffffffff1660e01b81526004016128199493929190613ed0565b6020604051808303815f875af192505050801561285457506040513d601f19601f820116820180604052508101906128519190613f2e565b60015b6128d5573d805f8114612882576040519150601f19603f3d011682016040523d82523d5f602084013e612887565b606091505b505f8151036128cd57836040517f64a0ae920000000000000000000000000000000000000000000000000000000081526004016128c49190612cc9565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161461295e57836040517f64a0ae920000000000000000000000000000000000000000000000000000000081526004016129559190612cc9565b60405180910390fd5b505b50505050565b5f805f90507a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083106129c2577a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083816129b8576129b7613c3e565b5b0492506040810190505b6d04ee2d6d415b85acef810000000083106129ff576d04ee2d6d415b85acef810000000083816129f5576129f4613c3e565b5b0492506020810190505b662386f26fc100008310612a2e57662386f26fc100008381612a2457612a23613c3e565b5b0492506010810190505b6305f5e1008310612a57576305f5e1008381612a4d57612a4c613c3e565b5b0492506008810190505b6127108310612a7c576127108381612a7257612a71613c3e565b5b0492506004810190505b60648310612a9f5760648381612a9557612a94613c3e565b5b0492506002810190505b600a8310612aae576001810190505b80915050919050565b5f33905090565b5f604051905090565b5f80fd5b5f80fd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612b0381612acf565b8114612b0d575f80fd5b50565b5f81359050612b1e81612afa565b92915050565b5f60208284031215612b3957612b38612ac7565b5b5f612b4684828501612b10565b91505092915050565b5f8115159050919050565b612b6381612b4f565b82525050565b5f602082019050612b7c5f830184612b5a565b92915050565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015612bb9578082015181840152602081019050612b9e565b5f8484015250505050565b5f601f19601f8301169050919050565b5f612bde82612b82565b612be88185612b8c565b9350612bf8818560208601612b9c565b612c0181612bc4565b840191505092915050565b5f6020820190508181035f830152612c248184612bd4565b905092915050565b5f819050919050565b612c3e81612c2c565b8114612c48575f80fd5b50565b5f81359050612c5981612c35565b92915050565b5f60208284031215612c7457612c73612ac7565b5b5f612c8184828501612c4b565b91505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f612cb382612c8a565b9050919050565b612cc381612ca9565b82525050565b5f602082019050612cdc5f830184612cba565b92915050565b612ceb81612ca9565b8114612cf5575f80fd5b50565b5f81359050612d0681612ce2565b92915050565b5f8060408385031215612d2257612d21612ac7565b5b5f612d2f85828601612cf8565b9250506020612d4085828601612c4b565b9150509250929050565b5f805f60608486031215612d6157612d60612ac7565b5b5f612d6e86828701612cf8565b9350506020612d7f86828701612cf8565b9250506040612d9086828701612c4b565b9150509250925092565b5f8060408385031215612db057612daf612ac7565b5b5f612dbd85828601612c4b565b9250506020612dce85828601612c4b565b9150509250929050565b612de181612c2c565b82525050565b5f604082019050612dfa5f830185612cba565b612e076020830184612dd8565b9392505050565b5f60208284031215612e2357612e22612ac7565b5b5f612e3084828501612cf8565b91505092915050565b5f602082019050612e4c5f830184612dd8565b92915050565b612e5b81612b4f565b8114612e65575f80fd5b50565b5f81359050612e7681612e52565b92915050565b5f8060408385031215612e9257612e91612ac7565b5b5f612e9f85828601612cf8565b9250506020612eb085828601612e68565b9150509250929050565b5f80fd5b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b612ef882612bc4565b810181811067ffffffffffffffff82111715612f1757612f16612ec2565b5b80604052505050565b5f612f29612abe565b9050612f358282612eef565b919050565b5f67ffffffffffffffff821115612f5457612f53612ec2565b5b612f5d82612bc4565b9050602081019050919050565b828183375f83830152505050565b5f612f8a612f8584612f3a565b612f20565b905082815260208101848484011115612fa657612fa5612ebe565b5b612fb1848285612f6a565b509392505050565b5f82601f830112612fcd57612fcc612eba565b5b8135612fdd848260208601612f78565b91505092915050565b5f805f8060808587031215612ffe57612ffd612ac7565b5b5f61300b87828801612cf8565b945050602061301c87828801612cf8565b935050604061302d87828801612c4b565b925050606085013567ffffffffffffffff81111561304e5761304d612acb565b5b61305a87828801612fb9565b91505092959194509250565b5f819050919050565b5f61308961308461307f84612c8a565b613066565b612c8a565b9050919050565b5f61309a8261306f565b9050919050565b5f6130ab82613090565b9050919050565b6130bb816130a1565b82525050565b5f6020820190506130d45f8301846130b2565b92915050565b5f6130e482613090565b9050919050565b6130f4816130da565b82525050565b5f60208201905061310d5f8301846130eb565b92915050565b5f806040838503121561312957613128612ac7565b5b5f61313685828601612cf8565b925050602061314785828601612cf8565b9150509250929050565b5f61315b82613090565b9050919050565b61316b81613151565b82525050565b5f6020820190506131845f830184613162565b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806131ce57607f821691505b6020821081036131e1576131e061318a565b5b50919050565b5f819050815f5260205f209050919050565b5f8154613205816131b7565b61320f8186612b8c565b9450600182165f8114613229576001811461323f57613271565b60ff198316865281151560200286019350613271565b613248856131e7565b5f5b838110156132695781548189015260018201915060208101905061324a565b808801955050505b50505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f61329e8261327a565b6132a88185613284565b93506132b8818560208601612b9c565b6132c181612bc4565b840191505092915050565b5f6040820190508181035f8301526132e481856131f9565b905081810360208301526132f88184613294565b90509392505050565b5f61331361330e84612f3a565b612f20565b90508281526020810184848401111561332f5761332e612ebe565b5b61333a848285612b9c565b509392505050565b5f82601f83011261335657613355612eba565b5b8151613366848260208601613301565b91505092915050565b5f6020828403121561338457613383612ac7565b5b5f82015167ffffffffffffffff8111156133a1576133a0612acb565b5b6133ad84828501613342565b91505092915050565b7f617070726f76616c7300000000000000000000000000000000000000000000005f82015250565b5f6133ea600983612b8c565b91506133f5826133b6565b602082019050919050565b5f6040820190508181035f8301526134188184613294565b9050818103602083015261342b816133de565b905092915050565b5f67ffffffffffffffff82111561344d5761344c612ec2565b5b602082029050602081019050919050565b5f80fd5b5f61347461346f84613433565b612f20565b905080838252602082019050602084028301858111156134975761349661345e565b5b835b818110156134de57805167ffffffffffffffff8111156134bc576134bb612eba565b5b8086016134c98982613342565b85526020850194505050602081019050613499565b5050509392505050565b5f82601f8301126134fc576134fb612eba565b5b815161350c848260208601613462565b91505092915050565b5f6020828403121561352a57613529612ac7565b5b5f82015167ffffffffffffffff81111561354757613546612acb565b5b613553848285016134e8565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f7370656e646572000000000000000000000000000000000000000000000000005f82015250565b5f6135bd600783612b8c565b91506135c882613589565b602082019050919050565b5f6040820190508181035f8301526135eb8184613294565b905081810360208301526135fe816135b1565b905092915050565b5f8151905061361481612ce2565b92915050565b5f6020828403121561362f5761362e612ac7565b5b5f61363c84828501613606565b91505092915050565b5f67ffffffffffffffff82111561365f5761365e612ec2565b5b61366882612bc4565b9050602081019050919050565b5f61368761368284613645565b612f20565b9050828152602081018484840111156136a3576136a2612ebe565b5b6136ae848285612b9c565b509392505050565b5f82601f8301126136ca576136c9612eba565b5b81516136da848260208601613675565b91505092915050565b5f602082840312156136f8576136f7612ac7565b5b5f82015167ffffffffffffffff81111561371557613714612acb565b5b613721848285016136b6565b91505092915050565b7f6066726f6d60206d75737420626520746865206f776e657200000000000000005f82015250565b5f61375e601883612b8c565b91506137698261372a565b602082019050919050565b5f6020820190508181035f83015261378b81613752565b9050919050565b7f726f79616c74795f7061796d656e7473000000000000000000000000000000005f82015250565b5f6137c6601083612b8c565b91506137d182613792565b602082019050919050565b5f6040820190508181035f8301526137f48184613294565b90508181036020830152613807816137ba565b905092915050565b7f726f79616c747920696e666f206e6f7420696d706c656d656e746564206f6e205f8201527f74686520756e6465726c79696e6720436f736d5761736d20636f6e7472616374602082015250565b5f613869604083612b8c565b91506138748261380f565b604082019050919050565b5f6020820190508181035f8301526138968161385d565b9050919050565b7f61646472657373000000000000000000000000000000000000000000000000005f82015250565b5f6138d1600783612b8c565b91506138dc8261389d565b602082019050919050565b5f6040820190508181035f8301526138ff8184613294565b90508181036020830152613912816138c5565b905092915050565b7f726f79616c74795f616d6f756e740000000000000000000000000000000000005f82015250565b5f61394e600e83612b8c565b91506139598261391a565b602082019050919050565b5f6040820190508181035f83015261397c8184613294565b9050818103602083015261398f81613942565b905092915050565b5f815190506139a581612c35565b92915050565b5f602082840312156139c0576139bf612ac7565b5b5f6139cd84828501613997565b91505092915050565b7f6f776e65720000000000000000000000000000000000000000000000000000005f82015250565b5f613a0a600583612b8c565b9150613a15826139d6565b602082019050919050565b5f6040820190508181035f830152613a388184613294565b90508181036020830152613a4b816139fe565b905092915050565b7f746f6b656e7300000000000000000000000000000000000000000000000000005f82015250565b5f613a87600683612b8c565b9150613a9282613a53565b602082019050919050565b5f6040820190508181035f830152613ab58184613294565b90508181036020830152613ac881613a7b565b905092915050565b7f746f6b656e5f75726900000000000000000000000000000000000000000000005f82015250565b5f613b04600983612b8c565b9150613b0f82613ad0565b602082019050919050565b5f6040820190508181035f830152613b328184613294565b90508181036020830152613b4581613af8565b905092915050565b7f6f70657261746f727300000000000000000000000000000000000000000000005f82015250565b5f613b81600983612b8c565b9150613b8c82613b4d565b602082019050919050565b5f6040820190508181035f830152613baf8184613294565b90508181036020830152613bc281613b75565b905092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f613c0182612c2c565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613c3357613c32613bca565b5b600182019050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f81905092915050565b5f613c7f82612b82565b613c898185613c6b565b9350613c99818560208601612b9c565b80840191505092915050565b7f2200000000000000000000000000000000000000000000000000000000000000815250565b5f613cd68284613c75565b9150613ce182613ca5565b60018201915081905092915050565b5f613cfa82613ca5565b600182019150613d0a8284613c75565b915081905092915050565b7f7d00000000000000000000000000000000000000000000000000000000000000815250565b5f613d468284613c75565b9150613d5182613d15565b60018201915081905092915050565b7f7b00000000000000000000000000000000000000000000000000000000000000815250565b5f613d9082613d60565b600182019150613da08284613c75565b915081905092915050565b5f613db68285613c75565b9150613dc28284613c75565b91508190509392505050565b5f6060820190508181035f830152613de681866131f9565b90508181036020830152613dfa8185613294565b90508181036040830152613e0e8184613294565b9050949350505050565b5f81905092915050565b5f613e2c8261327a565b613e368185613e18565b9350613e46818560208601612b9c565b80840191505092915050565b5f613e5d8284613e22565b915081905092915050565b7f436f736d5761736d2065786563757465206661696c65640000000000000000005f82015250565b5f613e9c601783612b8c565b9150613ea782613e68565b602082019050919050565b5f6020820190508181035f830152613ec981613e90565b9050919050565b5f608082019050613ee35f830187612cba565b613ef06020830186612cba565b613efd6040830185612dd8565b8181036060830152613f0f8184613294565b905095945050505050565b5f81519050613f2881612afa565b92915050565b5f60208284031215613f4357613f42612ac7565b5b5f613f5084828501613f1a565b9150509291505056fe7b22657874656e73696f6e223a7b226d7367223a7b22636865636b5f726f79616c74696573223a7b7d7d7d7da26469706673582212208e5bf5b10dbd07520ba4eabc456fe6d4e15af90bab1225519bcf4381501a7ffd64736f6c63430008150033 \ No newline at end of file +608060405234801561000f575f80fd5b50604051614c26380380614c268339818101604052810190610031919061027f565b8181815f90816100419190610530565b5080600190816100519190610530565b50505061100260095f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611003600a5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611004600b5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082600890816101299190610530565b505050506105ff565b5f604051905090565b5f80fd5b5f80fd5b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6101918261014b565b810181811067ffffffffffffffff821117156101b0576101af61015b565b5b80604052505050565b5f6101c2610132565b90506101ce8282610188565b919050565b5f67ffffffffffffffff8211156101ed576101ec61015b565b5b6101f68261014b565b9050602081019050919050565b8281835e5f83830152505050565b5f61022361021e846101d3565b6101b9565b90508281526020810184848401111561023f5761023e610147565b5b61024a848285610203565b509392505050565b5f82601f83011261026657610265610143565b5b8151610276848260208601610211565b91505092915050565b5f805f606084860312156102965761029561013b565b5b5f84015167ffffffffffffffff8111156102b3576102b261013f565b5b6102bf86828701610252565b935050602084015167ffffffffffffffff8111156102e0576102df61013f565b5b6102ec86828701610252565b925050604084015167ffffffffffffffff81111561030d5761030c61013f565b5b61031986828701610252565b9150509250925092565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061037157607f821691505b6020821081036103845761038361032d565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026103e67fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826103ab565b6103f086836103ab565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f61043461042f61042a84610408565b610411565b610408565b9050919050565b5f819050919050565b61044d8361041a565b6104616104598261043b565b8484546103b7565b825550505050565b5f90565b610475610469565b610480818484610444565b505050565b5b818110156104a3576104985f8261046d565b600181019050610486565b5050565b601f8211156104e8576104b98161038a565b6104c28461039c565b810160208510156104d1578190505b6104e56104dd8561039c565b830182610485565b50505b505050565b5f82821c905092915050565b5f6105085f19846008026104ed565b1980831691505092915050565b5f61052083836104f9565b9150826002028217905092915050565b61053982610323565b67ffffffffffffffff8111156105525761055161015b565b5b61055c825461035a565b6105678282856104a7565b5f60209050601f831160018114610598575f8415610586578287015190505b6105908582610515565b8655506105f7565b601f1984166105a68661038a565b5f5b828110156105cd578489015182556001820191506020850194506020810190506105a8565b868310156105ea57848901516105e6601f8916826104f9565b8355505b6001600288020188555050505b505050505050565b61461a8061060c5f395ff3fe608060405234801561000f575f80fd5b5060043610610135575f3560e01c80635c4aead7116100b6578063b88d4fde1161007a578063b88d4fde14610372578063c2aed3021461038e578063c87b56dd146103ac578063de4725cc146103dc578063e985e9c5146103fa578063f00b02551461042a57610135565b80635c4aead7146102ba5780636352211e146102d857806370a082311461030857806395d89b4114610338578063a22cb4651461035657610135565b806323b872dd116100fd57806323b872dd146101f15780632a55205a1461020d5780632f745c591461023e57806342842e0e1461026e5780634f6ccce71461028a57610135565b806301ffc9a71461013957806306fdde0314610169578063081812fc14610187578063095ea7b3146101b757806318160ddd146101d3575b5f80fd5b610153600480360381019061014e9190613057565b610448565b604051610160919061309c565b60405180910390f35b6101716105e9565b60405161017e9190613125565b60405180910390f35b6101a1600480360381019061019c9190613178565b610678565b6040516101ae91906131e2565b60405180910390f35b6101d160048036038101906101cc9190613225565b6109d2565b005b6101db610c0e565b6040516101e89190613272565b60405180910390f35b61020b6004803603810190610206919061328b565b610dd0565b005b610227600480360381019061022291906132db565b6110eb565b604051610235929190613319565b60405180910390f35b61025860048036038101906102539190613225565b61171c565b6040516102659190613272565b60405180910390f35b6102886004803603810190610283919061328b565b611758565b005b6102a4600480360381019061029f9190613178565b611777565b6040516102b19190613272565b60405180910390f35b6102c26117b3565b6040516102cf9190613125565b60405180910390f35b6102f260048036038101906102ed9190613178565b61183f565b6040516102ff91906131e2565b60405180910390f35b610322600480360381019061031d9190613340565b611ac9565b60405161032f9190613272565b60405180910390f35b61034061201f565b60405161034d9190613125565b60405180910390f35b610370600480360381019061036b9190613395565b6120af565b005b61038c600480360381019061038791906134ff565b6122b2565b005b6103966122cf565b6040516103a391906135da565b60405180910390f35b6103c660048036038101906103c19190613178565b6122f4565b6040516103d39190613125565b60405180910390f35b6103e46124f1565b6040516103f19190613613565b60405180910390f35b610414600480360381019061040f919061362c565b612516565b604051610421919061309c565b60405180910390f35b61043261294a565b60405161043f919061368a565b60405180910390f35b5f7f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061051257507f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061057a57507f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806105e257507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60605f80546105f7906136d0565b80601f0160208091040260200160405190810160405280929190818152602001828054610623906136d0565b801561066e5780601f106106455761010080835404028352916020019161066e565b820191905f5260205f20905b81548152906001019060200180831161065157829003601f168201915b5050505050905090565b5f806106c96040518060400160405280600881526020017f746f6b656e5f69640000000000000000000000000000000000000000000000008152506106c46106bf8661296f565b612a39565b612a81565b90505f61071b6107166040518060400160405280600981526020017f617070726f76616c73000000000000000000000000000000000000000000000081525061071185612ad3565b612a81565b612ad3565b90505f60095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166306d81d296008846040518363ffffffff1660e01b815260040161077b9291906137e5565b5f60405180830381865afa158015610795573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906107bd9190613888565b90505f600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166387cdf621836040518263ffffffff1660e01b815260040161081a9190613919565b5f60405180830381865afa158015610834573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f8201168201806040525081019061085c9190613a2e565b90505f815111156109c5575f600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166308d858e5835f815181106108b8576108b7613a75565b5b60200260200101516040518263ffffffff1660e01b81526004016108dc9190613aec565b5f60405180830381865afa1580156108f6573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f8201168201806040525081019061091e9190613888565b9050600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631778e539826040518263ffffffff1660e01b815260040161097a9190613125565b602060405180830381865afa158015610995573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109b99190613b33565b955050505050506109cd565b5f9450505050505b919050565b5f610ab56040518060400160405280600781526020017f7370656e64657200000000000000000000000000000000000000000000000000815250610ab0600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630c3c20ed876040518263ffffffff1660e01b8152600401610a6991906131e2565b5f60405180830381865afa158015610a83573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f82011682018060405250810190610aab9190613bfc565b612a39565b612a81565b90505f610b076040518060400160405280600881526020017f746f6b656e5f6964000000000000000000000000000000000000000000000000815250610b02610afd8661296f565b612a39565b612a81565b90505f610b98610b936040518060400160405280600781526020017f617070726f766500000000000000000000000000000000000000000000000000815250610b8e610b8987876040518060400160405280600181526020017f2c00000000000000000000000000000000000000000000000000000000000000815250612b1b565b612ad3565b612a81565b612ad3565b9050610ba381612b69565b50838573ffffffffffffffffffffffffffffffffffffffff16610bc58661183f565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050505050565b5f80610c8c610c876040518060400160405280600a81526020017f6e756d5f746f6b656e73000000000000000000000000000000000000000000008152506040518060400160405280600281526020017f7b7d000000000000000000000000000000000000000000000000000000000000815250612a81565b612ad3565b90505f60095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166306d81d296008846040518363ffffffff1660e01b8152600401610cec9291906137e5565b5f60405180830381865afa158015610d06573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f82011682018060405250810190610d2e9190613888565b9050600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635a558982826040518263ffffffff1660e01b8152600401610d8a9190613c8d565b602060405180830381865afa158015610da5573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610dc99190613cd4565b9250505090565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610e40575f6040517f64a0ae92000000000000000000000000000000000000000000000000000000008152600401610e3791906131e2565b60405180910390fd5b610e498161183f565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614610eb6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ead90613d49565b60405180910390fd5b5f610f996040518060400160405280600981526020017f726563697069656e740000000000000000000000000000000000000000000000815250610f94600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630c3c20ed876040518263ffffffff1660e01b8152600401610f4d91906131e2565b5f60405180830381865afa158015610f67573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f82011682018060405250810190610f8f9190613bfc565b612a39565b612a81565b90505f610feb6040518060400160405280600881526020017f746f6b656e5f6964000000000000000000000000000000000000000000000000815250610fe6610fe18661296f565b612a39565b612a81565b90505f61107c6110776040518060400160405280600c81526020017f7472616e736665725f6e6674000000000000000000000000000000000000000081525061107261106d87876040518060400160405280600181526020017f2c00000000000000000000000000000000000000000000000000000000000000815250612b1b565b612ad3565b612a81565b612ad3565b905061108781612b69565b50838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050505050565b5f805f60095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166306d81d2960086040518060600160405280602c81526020016145b9602c91396040518363ffffffff1660e01b81526004016111639291906137e5565b5f60405180830381865afa15801561117d573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906111a59190613888565b90505f600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166308d858e5836040518263ffffffff1660e01b81526004016112029190613db1565b5f60405180830381865afa15801561121c573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906112449190613888565b90507f6273151f959616268004b58dbb21e5c851b7b8d04498b4aabee12291d22fc0348180519060200120146112af576040517f438c4bcb0000000000000000000000000000000000000000000000000000000081526004016112a690613e2e565b60405180910390fd5b5f6112ff6040518060400160405280600881526020017f746f6b656e5f69640000000000000000000000000000000000000000000000008152506112fa6112f58a61296f565b612a39565b612a81565b90505f6113516040518060400160405280600a81526020017f73616c655f70726963650000000000000000000000000000000000000000000081525061134c6113478a61296f565b612a39565b612a81565b90505f6113e26113dd6040518060400160405280600c81526020017f726f79616c74795f696e666f00000000000000000000000000000000000000008152506113d86113d387876040518060400160405280600181526020017f2c00000000000000000000000000000000000000000000000000000000000000815250612b1b565b612ad3565b612a81565b612ad3565b90505f61147261146d6040518060400160405280600981526020017f657874656e73696f6e00000000000000000000000000000000000000000000008152506114686114636040518060400160405280600381526020017f6d7367000000000000000000000000000000000000000000000000000000000081525087612a81565b612ad3565b612a81565b612ad3565b90505f60095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166306d81d296008846040518363ffffffff1660e01b81526004016114d29291906137e5565b5f60405180830381865afa1580156114ec573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906115149190613888565b90505f600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166308d858e5836040518263ffffffff1660e01b81526004016115719190613e96565b5f60405180830381865afa15801561158b573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906115b39190613888565b90505f600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635a558982846040518263ffffffff1660e01b81526004016116109190613f13565b602060405180830381865afa15801561162b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061164f9190613cd4565b90505f82510361166d575f819a509a50505050505050505050611715565b600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631778e539836040518263ffffffff1660e01b81526004016116c79190613125565b602060405180830381865afa1580156116e2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117069190613b33565b819a509a505050505050505050505b9250929050565b5f6040517f74115a7400000000000000000000000000000000000000000000000000000000815260040161174f90613f90565b60405180910390fd5b61177283838360405180602001604052805f8152506122b2565b505050565b5f6040517f74115a740000000000000000000000000000000000000000000000000000000081526004016117aa90613ff8565b60405180910390fd5b600880546117c0906136d0565b80601f01602080910402602001604051908101604052809291908181526020018280546117ec906136d0565b80156118375780601f1061180e57610100808354040283529160200191611837565b820191905f5260205f20905b81548152906001019060200180831161181a57829003601f168201915b505050505081565b5f806118906040518060400160405280600881526020017f746f6b656e5f696400000000000000000000000000000000000000000000000081525061188b6118868661296f565b612a39565b612a81565b90505f6118e26118dd6040518060400160405280600881526020017f6f776e65725f6f660000000000000000000000000000000000000000000000008152506118d885612ad3565b612a81565b612ad3565b90505f60095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166306d81d296008846040518363ffffffff1660e01b81526004016119429291906137e5565b5f60405180830381865afa15801561195c573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906119849190613888565b90505f600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166308d858e5836040518263ffffffff1660e01b81526004016119e19190614060565b5f60405180830381865afa1580156119fb573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f82011682018060405250810190611a239190613888565b9050600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631778e539826040518263ffffffff1660e01b8152600401611a7f9190613125565b602060405180830381865afa158015611a9a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611abe9190613b33565b945050505050919050565b5f8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611b3a575f6040517f89c62b64000000000000000000000000000000000000000000000000000000008152600401611b3191906131e2565b60405180910390fd5b5f60605f611c206040518060400160405280600581526020017f6f776e6572000000000000000000000000000000000000000000000000000000815250611c1b600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630c3c20ed896040518263ffffffff1660e01b8152600401611bd491906131e2565b5f60405180830381865afa158015611bee573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f82011682018060405250810190611c169190613bfc565b612a39565b612a81565b90505f611c72611c6d6040518060400160405280600681526020017f746f6b656e730000000000000000000000000000000000000000000000000000815250611c6885612ad3565b612a81565b612ad3565b90505f60095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166306d81d296008846040518363ffffffff1660e01b8152600401611cd29291906137e5565b5f60405180830381865afa158015611cec573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f82011682018060405250810190611d149190613888565b90505f600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166387cdf621836040518263ffffffff1660e01b8152600401611d7191906140dd565b5f60405180830381865afa158015611d8b573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f82011682018060405250810190611db39190613a2e565b90505f815190505b5f811115612010578087611dcf919061413d565b9650611e366040518060400160405280600b81526020017f73746172745f616674657200000000000000000000000000000000000000000081525083600184611e189190614170565b81518110611e2957611e28613a75565b5b6020026020010151612a81565b9550611ec6611ec16040518060400160405280600681526020017f746f6b656e730000000000000000000000000000000000000000000000000000815250611ebc611eb7898b6040518060400160405280600181526020017f2c00000000000000000000000000000000000000000000000000000000000000815250612b1b565b612ad3565b612a81565b612ad3565b935060095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166306d81d296008866040518363ffffffff1660e01b8152600401611f259291906137e5565b5f60405180830381865afa158015611f3f573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f82011682018060405250810190611f679190613888565b9250600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166387cdf621846040518263ffffffff1660e01b8152600401611fc391906140dd565b5f60405180830381865afa158015611fdd573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906120059190613a2e565b915081519050611dbb565b86975050505050505050919050565b60606001805461202e906136d0565b80601f016020809104026020016040519081016040528092919081815260200182805461205a906136d0565b80156120a55780601f1061207c576101008083540402835291602001916120a5565b820191905f5260205f20905b81548152906001019060200180831161208857829003601f168201915b5050505050905090565b5f61219a6121956040518060400160405280600881526020017f6f70657261746f72000000000000000000000000000000000000000000000000815250612190600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630c3c20ed886040518263ffffffff1660e01b815260040161214991906131e2565b5f60405180830381865afa158015612163573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f8201168201806040525081019061218b9190613bfc565b612a39565b612a81565b612ad3565b905081156121f7576121f16121ec6121e76040518060400160405280600b81526020017f617070726f76655f616c6c00000000000000000000000000000000000000000081525084612a81565b612ad3565b612b69565b50612248565b61224661224161223c6040518060400160405280600a81526020017f7265766f6b655f616c6c0000000000000000000000000000000000000000000081525084612a81565b612ad3565b612b69565b505b8273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31846040516122a5919061309c565b60405180910390a3505050565b6122bd848484610dd0565b6122c984848484612ce7565b50505050565b600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60606122ff8261183f565b505f6123506040518060400160405280600881526020017f746f6b656e5f696400000000000000000000000000000000000000000000000081525061234b6123468661296f565b612a39565b612a81565b90505f6123a261239d6040518060400160405280600881526020017f6e66745f696e666f00000000000000000000000000000000000000000000000081525061239885612ad3565b612a81565b612ad3565b90505f60095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166306d81d296008846040518363ffffffff1660e01b81526004016124029291906137e5565b5f60405180830381865afa15801561241c573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906124449190613888565b90505f600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166308d858e5836040518263ffffffff1660e01b81526004016124a191906141ed565b5f60405180830381865afa1580156124bb573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906124e39190613888565b905080945050505050919050565b600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f806125fa6040518060400160405280600581526020017f6f776e65720000000000000000000000000000000000000000000000000000008152506125f5600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630c3c20ed886040518263ffffffff1660e01b81526004016125ae91906131e2565b5f60405180830381865afa1580156125c8573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906125f09190613bfc565b612a39565b612a81565b90505f61264c6126476040518060400160405280600d81526020017f616c6c5f6f70657261746f72730000000000000000000000000000000000000081525061264285612ad3565b612a81565b612ad3565b90505f60095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166306d81d296008846040518363ffffffff1660e01b81526004016126ac9291906137e5565b5f60405180830381865afa1580156126c6573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906126ee9190613888565b90505f600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166387cdf621836040518263ffffffff1660e01b815260040161274b919061426a565b5f60405180830381865afa158015612765573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f8201168201806040525081019061278d9190613a2e565b90505f5b815181101561293b575f600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166308d858e58484815181106127eb576127ea613a75565b5b60200260200101516040518263ffffffff1660e01b815260040161280f9190613aec565b5f60405180830381865afa158015612829573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906128519190613888565b90508773ffffffffffffffffffffffffffffffffffffffff16600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631778e539836040518263ffffffff1660e01b81526004016128c49190613125565b602060405180830381865afa1580156128df573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906129039190613b33565b73ffffffffffffffffffffffffffffffffffffffff160361292d5760019650505050505050612944565b508080600101915050612791565b505f9450505050505b92915050565b60095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60605f600161297d84612e99565b0190505f8167ffffffffffffffff81111561299b5761299a6133db565b5b6040519080825280601f01601f1916602001820160405280156129cd5781602001600182028036833780820191505090505b5090505f82602001820190505b600115612a2e578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8581612a2357612a2261429d565b5b0494505f85036129da575b819350505050919050565b606081604051602001612a4c919061432a565b604051602081830303815290604052604051602001612a6b919061434f565b6040516020818303038152906040529050919050565b6060612acb612a8f84612a39565b836040518060400160405280600181526020017f3a00000000000000000000000000000000000000000000000000000000000000815250612b1b565b905092915050565b606081604051602001612ae6919061439a565b604051602081830303815290604052604051602001612b0591906143e5565b6040516020818303038152906040529050919050565b6060838284604051602001612b3192919061440a565b604051602081830303815290604052604051602001612b5192919061440a565b60405160208183030381529060405290509392505050565b60605f8061100273ffffffffffffffffffffffffffffffffffffffff166008856040518060400160405280600281526020017f5b5d000000000000000000000000000000000000000000000000000000000000815250604051602401612bd19392919061442d565b6040516020818303038152906040527f44d227ae000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051612c5b91906144b1565b5f60405180830381855af49150503d805f8114612c93576040519150601f19603f3d011682016040523d82523d5f602084013e612c98565b606091505b509150915081612cdd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cd490614511565b60405180910390fd5b8092505050919050565b5f8373ffffffffffffffffffffffffffffffffffffffff163b1115612e93578273ffffffffffffffffffffffffffffffffffffffff1663150b7a02612d2a612fea565b8685856040518563ffffffff1660e01b8152600401612d4c949392919061452f565b6020604051808303815f875af1925050508015612d8757506040513d601f19601f82011682018060405250810190612d84919061458d565b60015b612e08573d805f8114612db5576040519150601f19603f3d011682016040523d82523d5f602084013e612dba565b606091505b505f815103612e0057836040517f64a0ae92000000000000000000000000000000000000000000000000000000008152600401612df791906131e2565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612e9157836040517f64a0ae92000000000000000000000000000000000000000000000000000000008152600401612e8891906131e2565b60405180910390fd5b505b50505050565b5f805f90507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310612ef5577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381612eeb57612eea61429d565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310612f32576d04ee2d6d415b85acef81000000008381612f2857612f2761429d565b5b0492506020810190505b662386f26fc100008310612f6157662386f26fc100008381612f5757612f5661429d565b5b0492506010810190505b6305f5e1008310612f8a576305f5e1008381612f8057612f7f61429d565b5b0492506008810190505b6127108310612faf576127108381612fa557612fa461429d565b5b0492506004810190505b60648310612fd25760648381612fc857612fc761429d565b5b0492506002810190505b600a8310612fe1576001810190505b80915050919050565b5f33905090565b5f604051905090565b5f80fd5b5f80fd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61303681613002565b8114613040575f80fd5b50565b5f813590506130518161302d565b92915050565b5f6020828403121561306c5761306b612ffa565b5b5f61307984828501613043565b91505092915050565b5f8115159050919050565b61309681613082565b82525050565b5f6020820190506130af5f83018461308d565b92915050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f6130f7826130b5565b61310181856130bf565b93506131118185602086016130cf565b61311a816130dd565b840191505092915050565b5f6020820190508181035f83015261313d81846130ed565b905092915050565b5f819050919050565b61315781613145565b8114613161575f80fd5b50565b5f813590506131728161314e565b92915050565b5f6020828403121561318d5761318c612ffa565b5b5f61319a84828501613164565b91505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6131cc826131a3565b9050919050565b6131dc816131c2565b82525050565b5f6020820190506131f55f8301846131d3565b92915050565b613204816131c2565b811461320e575f80fd5b50565b5f8135905061321f816131fb565b92915050565b5f806040838503121561323b5761323a612ffa565b5b5f61324885828601613211565b925050602061325985828601613164565b9150509250929050565b61326c81613145565b82525050565b5f6020820190506132855f830184613263565b92915050565b5f805f606084860312156132a2576132a1612ffa565b5b5f6132af86828701613211565b93505060206132c086828701613211565b92505060406132d186828701613164565b9150509250925092565b5f80604083850312156132f1576132f0612ffa565b5b5f6132fe85828601613164565b925050602061330f85828601613164565b9150509250929050565b5f60408201905061332c5f8301856131d3565b6133396020830184613263565b9392505050565b5f6020828403121561335557613354612ffa565b5b5f61336284828501613211565b91505092915050565b61337481613082565b811461337e575f80fd5b50565b5f8135905061338f8161336b565b92915050565b5f80604083850312156133ab576133aa612ffa565b5b5f6133b885828601613211565b92505060206133c985828601613381565b9150509250929050565b5f80fd5b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b613411826130dd565b810181811067ffffffffffffffff821117156134305761342f6133db565b5b80604052505050565b5f613442612ff1565b905061344e8282613408565b919050565b5f67ffffffffffffffff82111561346d5761346c6133db565b5b613476826130dd565b9050602081019050919050565b828183375f83830152505050565b5f6134a361349e84613453565b613439565b9050828152602081018484840111156134bf576134be6133d7565b5b6134ca848285613483565b509392505050565b5f82601f8301126134e6576134e56133d3565b5b81356134f6848260208601613491565b91505092915050565b5f805f806080858703121561351757613516612ffa565b5b5f61352487828801613211565b945050602061353587828801613211565b935050604061354687828801613164565b925050606085013567ffffffffffffffff81111561356757613566612ffe565b5b613573878288016134d2565b91505092959194509250565b5f819050919050565b5f6135a261359d613598846131a3565b61357f565b6131a3565b9050919050565b5f6135b382613588565b9050919050565b5f6135c4826135a9565b9050919050565b6135d4816135ba565b82525050565b5f6020820190506135ed5f8301846135cb565b92915050565b5f6135fd826135a9565b9050919050565b61360d816135f3565b82525050565b5f6020820190506136265f830184613604565b92915050565b5f806040838503121561364257613641612ffa565b5b5f61364f85828601613211565b925050602061366085828601613211565b9150509250929050565b5f613674826135a9565b9050919050565b6136848161366a565b82525050565b5f60208201905061369d5f83018461367b565b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806136e757607f821691505b6020821081036136fa576136f96136a3565b5b50919050565b5f819050815f5260205f209050919050565b5f815461371e816136d0565b61372881866130bf565b9450600182165f811461374257600181146137585761378a565b60ff19831686528115156020028601935061378a565b61376185613700565b5f5b8381101561378257815481890152600182019150602081019050613763565b808801955050505b50505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f6137b782613793565b6137c1818561379d565b93506137d18185602086016130cf565b6137da816130dd565b840191505092915050565b5f6040820190508181035f8301526137fd8185613712565b9050818103602083015261381181846137ad565b90509392505050565b5f61382c61382784613453565b613439565b905082815260208101848484011115613848576138476133d7565b5b6138538482856130cf565b509392505050565b5f82601f83011261386f5761386e6133d3565b5b815161387f84826020860161381a565b91505092915050565b5f6020828403121561389d5761389c612ffa565b5b5f82015167ffffffffffffffff8111156138ba576138b9612ffe565b5b6138c68482850161385b565b91505092915050565b7f617070726f76616c7300000000000000000000000000000000000000000000005f82015250565b5f6139036009836130bf565b915061390e826138cf565b602082019050919050565b5f6040820190508181035f83015261393181846137ad565b90508181036020830152613944816138f7565b905092915050565b5f67ffffffffffffffff821115613966576139656133db565b5b602082029050602081019050919050565b5f80fd5b5f61398d6139888461394c565b613439565b905080838252602082019050602084028301858111156139b0576139af613977565b5b835b818110156139f757805167ffffffffffffffff8111156139d5576139d46133d3565b5b8086016139e2898261385b565b855260208501945050506020810190506139b2565b5050509392505050565b5f82601f830112613a1557613a146133d3565b5b8151613a2584826020860161397b565b91505092915050565b5f60208284031215613a4357613a42612ffa565b5b5f82015167ffffffffffffffff811115613a6057613a5f612ffe565b5b613a6c84828501613a01565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f7370656e646572000000000000000000000000000000000000000000000000005f82015250565b5f613ad66007836130bf565b9150613ae182613aa2565b602082019050919050565b5f6040820190508181035f830152613b0481846137ad565b90508181036020830152613b1781613aca565b905092915050565b5f81519050613b2d816131fb565b92915050565b5f60208284031215613b4857613b47612ffa565b5b5f613b5584828501613b1f565b91505092915050565b5f67ffffffffffffffff821115613b7857613b776133db565b5b613b81826130dd565b9050602081019050919050565b5f613ba0613b9b84613b5e565b613439565b905082815260208101848484011115613bbc57613bbb6133d7565b5b613bc78482856130cf565b509392505050565b5f82601f830112613be357613be26133d3565b5b8151613bf3848260208601613b8e565b91505092915050565b5f60208284031215613c1157613c10612ffa565b5b5f82015167ffffffffffffffff811115613c2e57613c2d612ffe565b5b613c3a84828501613bcf565b91505092915050565b7f636f756e740000000000000000000000000000000000000000000000000000005f82015250565b5f613c776005836130bf565b9150613c8282613c43565b602082019050919050565b5f6040820190508181035f830152613ca581846137ad565b90508181036020830152613cb881613c6b565b905092915050565b5f81519050613cce8161314e565b92915050565b5f60208284031215613ce957613ce8612ffa565b5b5f613cf684828501613cc0565b91505092915050565b7f6066726f6d60206d75737420626520746865206f776e657200000000000000005f82015250565b5f613d336018836130bf565b9150613d3e82613cff565b602082019050919050565b5f6020820190508181035f830152613d6081613d27565b9050919050565b7f726f79616c74795f7061796d656e7473000000000000000000000000000000005f82015250565b5f613d9b6010836130bf565b9150613da682613d67565b602082019050919050565b5f6040820190508181035f830152613dc981846137ad565b90508181036020830152613ddc81613d8f565b905092915050565b7f726f79616c74795f696e666f00000000000000000000000000000000000000005f82015250565b5f613e18600c836130bf565b9150613e2382613de4565b602082019050919050565b5f6020820190508181035f830152613e4581613e0c565b9050919050565b7f61646472657373000000000000000000000000000000000000000000000000005f82015250565b5f613e806007836130bf565b9150613e8b82613e4c565b602082019050919050565b5f6040820190508181035f830152613eae81846137ad565b90508181036020830152613ec181613e74565b905092915050565b7f726f79616c74795f616d6f756e740000000000000000000000000000000000005f82015250565b5f613efd600e836130bf565b9150613f0882613ec9565b602082019050919050565b5f6040820190508181035f830152613f2b81846137ad565b90508181036020830152613f3e81613ef1565b905092915050565b7f746f6b656e4f664f776e65724279496e646578000000000000000000000000005f82015250565b5f613f7a6013836130bf565b9150613f8582613f46565b602082019050919050565b5f6020820190508181035f830152613fa781613f6e565b9050919050565b7f746f6b656e4279496e64657800000000000000000000000000000000000000005f82015250565b5f613fe2600c836130bf565b9150613fed82613fae565b602082019050919050565b5f6020820190508181035f83015261400f81613fd6565b9050919050565b7f6f776e65720000000000000000000000000000000000000000000000000000005f82015250565b5f61404a6005836130bf565b915061405582614016565b602082019050919050565b5f6040820190508181035f83015261407881846137ad565b9050818103602083015261408b8161403e565b905092915050565b7f746f6b656e7300000000000000000000000000000000000000000000000000005f82015250565b5f6140c76006836130bf565b91506140d282614093565b602082019050919050565b5f6040820190508181035f8301526140f581846137ad565b90508181036020830152614108816140bb565b905092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61414782613145565b915061415283613145565b925082820190508082111561416a57614169614110565b5b92915050565b5f61417a82613145565b915061418583613145565b925082820390508181111561419d5761419c614110565b5b92915050565b7f746f6b656e5f75726900000000000000000000000000000000000000000000005f82015250565b5f6141d76009836130bf565b91506141e2826141a3565b602082019050919050565b5f6040820190508181035f83015261420581846137ad565b90508181036020830152614218816141cb565b905092915050565b7f6f70657261746f727300000000000000000000000000000000000000000000005f82015250565b5f6142546009836130bf565b915061425f82614220565b602082019050919050565b5f6040820190508181035f83015261428281846137ad565b9050818103602083015261429581614248565b905092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f81905092915050565b5f6142de826130b5565b6142e881856142ca565b93506142f88185602086016130cf565b80840191505092915050565b7f2200000000000000000000000000000000000000000000000000000000000000815250565b5f61433582846142d4565b915061434082614304565b60018201915081905092915050565b5f61435982614304565b60018201915061436982846142d4565b915081905092915050565b7f7d00000000000000000000000000000000000000000000000000000000000000815250565b5f6143a582846142d4565b91506143b082614374565b60018201915081905092915050565b7f7b00000000000000000000000000000000000000000000000000000000000000815250565b5f6143ef826143bf565b6001820191506143ff82846142d4565b915081905092915050565b5f61441582856142d4565b915061442182846142d4565b91508190509392505050565b5f6060820190508181035f8301526144458186613712565b9050818103602083015261445981856137ad565b9050818103604083015261446d81846137ad565b9050949350505050565b5f81905092915050565b5f61448b82613793565b6144958185614477565b93506144a58185602086016130cf565b80840191505092915050565b5f6144bc8284614481565b915081905092915050565b7f436f736d5761736d2065786563757465206661696c65640000000000000000005f82015250565b5f6144fb6017836130bf565b9150614506826144c7565b602082019050919050565b5f6020820190508181035f830152614528816144ef565b9050919050565b5f6080820190506145425f8301876131d3565b61454f60208301866131d3565b61455c6040830185613263565b818103606083015261456e81846137ad565b905095945050505050565b5f815190506145878161302d565b92915050565b5f602082840312156145a2576145a1612ffa565b5b5f6145af84828501614579565b9150509291505056fe7b22657874656e73696f6e223a7b226d7367223a7b22636865636b5f726f79616c74696573223a7b7d7d7d7da2646970667358221220022186fd49994512b40a064b258280560e068a8c6981dfd1fb2f9992b6d7212664736f6c63430008190033 \ No newline at end of file diff --git a/x/evm/artifacts/cw721/cw721.go b/x/evm/artifacts/cw721/cw721.go index 4ea2671b6..570c13a89 100644 --- a/x/evm/artifacts/cw721/cw721.go +++ b/x/evm/artifacts/cw721/cw721.go @@ -31,7 +31,7 @@ var ( // Cw721MetaData contains all meta data concerning the Cw721 contract. var Cw721MetaData = &bind.MetaData{ - ABI: "[{\"inputs\":[{\"internalType\":\"string\",\"name\":\"Cw721Address_\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"name_\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"symbol_\",\"type\":\"string\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"numerator\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"denominator\",\"type\":\"uint256\"}],\"name\":\"ERC2981InvalidDefaultRoyalty\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"ERC2981InvalidDefaultRoyaltyReceiver\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"numerator\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"denominator\",\"type\":\"uint256\"}],\"name\":\"ERC2981InvalidTokenRoyalty\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"ERC2981InvalidTokenRoyaltyReceiver\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"ERC721IncorrectOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721InsufficientApproval\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"approver\",\"type\":\"address\"}],\"name\":\"ERC721InvalidApprover\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"ERC721InvalidOperator\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"ERC721InvalidOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"ERC721InvalidReceiver\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"ERC721InvalidSender\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721NonexistentToken\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"approved\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"ApprovalForAll\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"AddrPrecompile\",\"outputs\":[{\"internalType\":\"contractIAddr\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"Cw721Address\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"JsonPrecompile\",\"outputs\":[{\"internalType\":\"contractIJson\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"WasmdPrecompile\",\"outputs\":[{\"internalType\":\"contractIWasmd\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"approved\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"getApproved\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"isApprovedForAll\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ownerOf\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"salePrice\",\"type\":\"uint256\"}],\"name\":\"royaltyInfo\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"safeTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"setApprovalForAll\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"tokenURI\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", + ABI: "[{\"inputs\":[{\"internalType\":\"string\",\"name\":\"Cw721Address_\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"name_\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"symbol_\",\"type\":\"string\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"numerator\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"denominator\",\"type\":\"uint256\"}],\"name\":\"ERC2981InvalidDefaultRoyalty\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"ERC2981InvalidDefaultRoyaltyReceiver\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"numerator\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"denominator\",\"type\":\"uint256\"}],\"name\":\"ERC2981InvalidTokenRoyalty\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"ERC2981InvalidTokenRoyaltyReceiver\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"ERC721IncorrectOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721InsufficientApproval\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"approver\",\"type\":\"address\"}],\"name\":\"ERC721InvalidApprover\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"ERC721InvalidOperator\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"ERC721InvalidOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"ERC721InvalidReceiver\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"ERC721InvalidSender\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721NonexistentToken\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"method\",\"type\":\"string\"}],\"name\":\"NotImplemented\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"method\",\"type\":\"string\"}],\"name\":\"NotImplementedOnCosmwasmContract\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"approved\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"ApprovalForAll\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"AddrPrecompile\",\"outputs\":[{\"internalType\":\"contractIAddr\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"Cw721Address\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"JsonPrecompile\",\"outputs\":[{\"internalType\":\"contractIJson\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"WasmdPrecompile\",\"outputs\":[{\"internalType\":\"contractIWasmd\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"approved\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"getApproved\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"isApprovedForAll\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ownerOf\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"salePrice\",\"type\":\"uint256\"}],\"name\":\"royaltyInfo\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"safeTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"setApprovalForAll\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"tokenByIndex\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"tokenOfOwnerByIndex\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"tokenURI\",\"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\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", } // Cw721ABI is the input ABI used to generate the binding from. @@ -553,6 +553,68 @@ func (_Cw721 *Cw721CallerSession) Symbol() (string, error) { return _Cw721.Contract.Symbol(&_Cw721.CallOpts) } +// TokenByIndex is a free data retrieval call binding the contract method 0x4f6ccce7. +// +// Solidity: function tokenByIndex(uint256 ) view returns(uint256) +func (_Cw721 *Cw721Caller) TokenByIndex(opts *bind.CallOpts, arg0 *big.Int) (*big.Int, error) { + var out []interface{} + err := _Cw721.contract.Call(opts, &out, "tokenByIndex", arg0) + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// TokenByIndex is a free data retrieval call binding the contract method 0x4f6ccce7. +// +// Solidity: function tokenByIndex(uint256 ) view returns(uint256) +func (_Cw721 *Cw721Session) TokenByIndex(arg0 *big.Int) (*big.Int, error) { + return _Cw721.Contract.TokenByIndex(&_Cw721.CallOpts, arg0) +} + +// TokenByIndex is a free data retrieval call binding the contract method 0x4f6ccce7. +// +// Solidity: function tokenByIndex(uint256 ) view returns(uint256) +func (_Cw721 *Cw721CallerSession) TokenByIndex(arg0 *big.Int) (*big.Int, error) { + return _Cw721.Contract.TokenByIndex(&_Cw721.CallOpts, arg0) +} + +// TokenOfOwnerByIndex is a free data retrieval call binding the contract method 0x2f745c59. +// +// Solidity: function tokenOfOwnerByIndex(address , uint256 ) view returns(uint256) +func (_Cw721 *Cw721Caller) TokenOfOwnerByIndex(opts *bind.CallOpts, arg0 common.Address, arg1 *big.Int) (*big.Int, error) { + var out []interface{} + err := _Cw721.contract.Call(opts, &out, "tokenOfOwnerByIndex", arg0, arg1) + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// TokenOfOwnerByIndex is a free data retrieval call binding the contract method 0x2f745c59. +// +// Solidity: function tokenOfOwnerByIndex(address , uint256 ) view returns(uint256) +func (_Cw721 *Cw721Session) TokenOfOwnerByIndex(arg0 common.Address, arg1 *big.Int) (*big.Int, error) { + return _Cw721.Contract.TokenOfOwnerByIndex(&_Cw721.CallOpts, arg0, arg1) +} + +// TokenOfOwnerByIndex is a free data retrieval call binding the contract method 0x2f745c59. +// +// Solidity: function tokenOfOwnerByIndex(address , uint256 ) view returns(uint256) +func (_Cw721 *Cw721CallerSession) TokenOfOwnerByIndex(arg0 common.Address, arg1 *big.Int) (*big.Int, error) { + return _Cw721.Contract.TokenOfOwnerByIndex(&_Cw721.CallOpts, arg0, arg1) +} + // TokenURI is a free data retrieval call binding the contract method 0xc87b56dd. // // Solidity: function tokenURI(uint256 tokenId) view returns(string) @@ -584,6 +646,37 @@ func (_Cw721 *Cw721CallerSession) TokenURI(tokenId *big.Int) (string, error) { return _Cw721.Contract.TokenURI(&_Cw721.CallOpts, tokenId) } +// TotalSupply is a free data retrieval call binding the contract method 0x18160ddd. +// +// Solidity: function totalSupply() view returns(uint256) +func (_Cw721 *Cw721Caller) TotalSupply(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _Cw721.contract.Call(opts, &out, "totalSupply") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// TotalSupply is a free data retrieval call binding the contract method 0x18160ddd. +// +// Solidity: function totalSupply() view returns(uint256) +func (_Cw721 *Cw721Session) TotalSupply() (*big.Int, error) { + return _Cw721.Contract.TotalSupply(&_Cw721.CallOpts) +} + +// TotalSupply is a free data retrieval call binding the contract method 0x18160ddd. +// +// Solidity: function totalSupply() view returns(uint256) +func (_Cw721 *Cw721CallerSession) TotalSupply() (*big.Int, error) { + return _Cw721.Contract.TotalSupply(&_Cw721.CallOpts) +} + // Approve is a paid mutator transaction binding the contract method 0x095ea7b3. // // Solidity: function approve(address approved, uint256 tokenId) returns() From 915e44c58636adead7b4ede35d6ad50a5d2489f2 Mon Sep 17 00:00:00 2001 From: codchen Date: Thu, 16 May 2024 10:52:44 +0800 Subject: [PATCH 42/51] Copy of https://github.com/sei-protocol/sei-chain/pull/1668 (#1673) * POC - bring CW721 pointer contract up to spec * fixes to cw721 bindings * uses cw2981 ExecuteMsg/QueryMsg and implements extensions * attempt fix royalty info response * Update dummy ERC721.sol * Update EVM bindings for 721 queries * Fix bigInt handling * Fix up typing * Tidy up cwerc721 queries * Add more tests * Bug fixes * Update cwerc721.wasm builds * Fix contract syntax * Fix query_test for EVM query handlers * minor fixes * Update cwerc721 build * Add more cwerc721 pointer tests * Implement check_royalties * syncs up events with whats emitted by current cw nfts * adds evm_address extension query * no op query_all_operators * Update build * Update pointer contract api/bin/wasm files * Fix typo in contract test ABI * rebase --------- Co-authored-by: davyli Co-authored-by: shab --- contracts/src/ERC721.sol | 14 ++ contracts/test/CW721toERC721PointerTest.js | 53 ++--- contracts/test/lib.js | 1 + contracts/wasm/cwerc721.wasm | Bin 255724 -> 307670 bytes example/contracts/erc721/DummyERC721.abi | 2 +- example/contracts/erc721/DummyERC721.bin | 2 +- example/contracts/erc721/ERC721.sol | 9 + example/cosmwasm/cw721/Cargo.lock | 2 +- example/cosmwasm/cw721/Cargo.toml | 2 +- .../cosmwasm/cw721/artifacts/checksums.txt | 2 +- .../cosmwasm/cw721/artifacts/cwerc721.wasm | Bin 295364 -> 313709 bytes example/cosmwasm/cw721/src/contract.rs | 186 ++++++++++++++++-- example/cosmwasm/cw721/src/error.rs | 2 +- example/cosmwasm/cw721/src/msg.rs | 50 ++++- example/cosmwasm/cw721/src/querier.rs | 22 ++- wasmbinding/queries.go | 9 +- x/evm/artifacts/erc721/artifacts.go | 2 +- x/evm/artifacts/erc721/cwerc721.wasm | Bin 295364 -> 313709 bytes x/evm/client/wasm/bindings/queries.go | 36 ++-- x/evm/client/wasm/query.go | 37 +++- x/evm/client/wasm/query_test.go | 35 ++++ x/evm/module_test.go | 2 +- 22 files changed, 394 insertions(+), 74 deletions(-) diff --git a/contracts/src/ERC721.sol b/contracts/src/ERC721.sol index c7e89c265..0ad6278a0 100644 --- a/contracts/src/ERC721.sol +++ b/contracts/src/ERC721.sol @@ -51,6 +51,9 @@ contract ERC721 is IERC721 { bool approved ); + // Keeps track of current token supply + uint256 internal _totalSupply = 0; + // Mapping from token ID to owner address mapping(uint => address) internal _ownerOf; @@ -79,6 +82,10 @@ contract ERC721 is IERC721 { return _balanceOf[owner]; } + function totalSupply() external view returns (uint256) { + return _totalSupply; + } + function setApprovalForAll(address operator, bool approved) external { isApprovedForAll[msg.sender][operator] = approved; emit ApprovalForAll(msg.sender, operator, approved); @@ -158,6 +165,7 @@ contract ERC721 is IERC721 { require(_ownerOf[id] == address(0), "already minted"); _balanceOf[to]++; + _totalSupply++; _ownerOf[id] = to; emit Transfer(address(0), to, id); @@ -168,6 +176,7 @@ contract ERC721 is IERC721 { require(owner != address(0), "not minted"); _balanceOf[owner] -= 1; + _totalSupply--; delete _ownerOf[id]; delete _approvals[id]; @@ -222,4 +231,9 @@ contract MyNFT is ERC721 { require(msg.sender == _ownerOf[id], "not owner"); _burn(id); } + + function royaltyInfo(uint, uint256 salePrice) external pure returns (address receiver, uint256 royaltyAmount) { + receiver = 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266; + royaltyAmount = (salePrice * 500) / 10_000; + } } diff --git a/contracts/test/CW721toERC721PointerTest.js b/contracts/test/CW721toERC721PointerTest.js index d0e0c36d0..98a27e5c3 100644 --- a/contracts/test/CW721toERC721PointerTest.js +++ b/contracts/test/CW721toERC721PointerTest.js @@ -73,39 +73,48 @@ describe("CW721 to ERC721 Pointer", function () { }); }); + it("should retrieve number of circulating tokens", async function () { + const result = await queryWasm(pointer, "num_tokens", {}); + expect(result).to.deep.equal({data:{count:3}}); + }); + it("should retrieve contract information", async function () { const result = await queryWasm(pointer, "contract_info", {}); expect(result).to.deep.equal({data:{name:"MyNFT",symbol:"MYNFT"}}); }); - it("should fetch NFT info based on token ID", async function () { - const result = await queryWasm(pointer, "nft_info", { token_id: "1" }); - expect(result).to.deep.equal({ data: { token_uri: 'https://sei.io/token/1', extension: '' } }); - }); - it("should fetch all information about an NFT", async function () { const result = await queryWasm(pointer, "all_nft_info", { token_id: "1" }); - expect(result).to.deep.equal({ - data: { - access: { - owner: accounts[0].seiAddress, - approvals: [ - { - spender: accounts[1].seiAddress, - expires: { - never: {} - } - } - ] - }, - info: { - token_uri: "https://sei.io/token/1", - extension: "" + expect(result.data.access).to.deep.equal({ + owner: accounts[0].seiAddress, + approvals: [ + { + spender: accounts[1].seiAddress, + expires: { + never: {} + } } - } + ] }); + expect(result.data.info.token_uri).to.equal('https://sei.io/token/1'); + expect(result.data.info.extension.royalty_percentage).to.equal(5); + expect(result.data.info.extension.royalty_payment_address).to.include("sei1"); + }); + + it("should retrieve all minted NFT token ids", async function () { + const result = await queryWasm(pointer, "all_tokens", {}); + expect(result).to.deep.equal({data:{tokens:["1","2","3"]}}); }); + it("should retrieve list of 1 minted NFT token id after token id 1", async function () { + const result = await queryWasm(pointer, "all_tokens", { start_after: "1", limit: 1 }); + expect(result).to.deep.equal({data:{tokens:["2"]}}); + }); + + it("should retrieve list of NFT token ids owned by admin", async function () { + const result = await queryWasm(pointer, "tokens", { owner: admin.seiAddress }); + expect(result).to.deep.equal({data:{tokens:["3"]}}); + }); }) describe("execute operations", function () { diff --git a/contracts/test/lib.js b/contracts/test/lib.js index 86f59dc2c..2b078817e 100644 --- a/contracts/test/lib.js +++ b/contracts/test/lib.js @@ -23,6 +23,7 @@ const ABI = { "function symbol() view returns (string)", "function totalSupply() view returns (uint256)", "function tokenURI(uint256 tokenId) view returns (string)", + "function royaltyInfo(uint256 tokenId, uint256 salePrice) view returns (address, uint256)", "function balanceOf(address owner) view returns (uint256 balance)", "function ownerOf(uint256 tokenId) view returns (address owner)", "function getApproved(uint256 tokenId) view returns (address operator)", diff --git a/contracts/wasm/cwerc721.wasm b/contracts/wasm/cwerc721.wasm index 318ada77bc67874fa3f7386116c2d75127549b30..a578175b00b65f04d6717056e9220bc6ad5b902a 100644 GIT binary patch literal 307670 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≧P!s)!S*OxxXZPlU)3xfVTgmg*yIf|rRX!VUNft!s4yvvT&BmP$~} z$0tdkHkBSEl{w3P6T&C7xo7K zy$q;=RS9@=%b&<};qfD=Q)AK*d!1peT+}yIh9c2#vOMqTbdUij?5UxFjZ(h5Mw@HajHxl7?QcgMR$K zm;d)Mjoj{GFMDz@{FMQ-FH6ygJv24OpRNL+%8PP1m!`eLE@wy9%6@aVr>DAeO|}~M zd-7J_j*5FOPR?91GD1(4&6`_9*{S31vs$BKu}T9OQCK347=fF%^JAz^rZ6pZ~Ps^M#_yZXOayY(8$boG%w}rh;KPx0r2%jY}6UQ*IL%*ELz1Ny2KT z#WCO9tBRRmakwA1T6I!}F-&=ikR>5HoRozU-y%eTf^fy&Zh*z!XXkMCJkb@+uH1Jr zq{QzK(B_q_2?qqa*mSa-_YtE+&~5wleGB`DVlN#p_Qk>1sL&}jcGD8e)puTF%Y3P1 zjf6U3_z{f@bl|%%1yt}l*>l3(5baPmTJ_~RpQyShYTw(A`UF4|XgUz#7OuWHRjeAW z1uZzJT#xPw4^8|vkhSS(>;rAYapP^>Q7y={ZUd_gv%c;)ZA02OCeU9%lul8!p@&67 zp6_&OPK--OC(I3fGy;a^gVnoPQp0`P;yeLO%7=T@QKKjq5<8x=?tEpfweNiGiG~IN zc|sb8ZnsJFB-2k%ix%-}_8rm>JV*1_=}j%2I+}gMxEz}F6g(CV&8;8%xtk_i|P~~Ci&+ler^N*1oy>2wZBC6#6N>S zj-4mP&Pseai_VO0rV@t&`9&;9I0S&j=U5z;*~Ib9TDM4I1*Z!7HnY~-TTxyM-29lo zo3Tx}e)Y}uDCur9Ol}g^Xs_n+MvDonyn*I`g%=O=NIgts7Nmq2rG{|a-d9QJ(fh76 z65|tI)mEBpy|qp$N&1)sA>^~#47DoJ^Axb)@zM}pNu;HpLSzdpsr49%jo9zdQX_j@ za;UKBqQhg6*gl^s%wDr~8ki|{hB!N+)F5CcY_L+pCXOXjTXF#k+EoZXR;YZ!ht{u^ z4vg;%_^$D=EHY~e^@vo;7_Y(|Qj?Yuy4i-&G8}=9?=c?i{+p@@L?YK&M24Q6&I4H0 z6PENJJ6P-vYsdpdZR*E7pjpcF2QMshRy+2JKR(h(`?4OvjUH>nZ111HAJ~;4?e7n1 z{{WdVN6>so>^6iPdcU=4Y50Xb5&v_i-Iyo7vj|52xYFNeFs7GlG$rv7ntgPiX~@%?DL zXJ?C}+532}=B~>g(Np5rGMJ85pu6X!6@)E`MKW4Yd_-X*8G+_#4+o?}D`2`xVWG8x z1)f&E)LmnewF2@;E8r2wnH^nxA&pAeLM!MtT7mKYlnNxRAgSYxR^Ye_(wJ(j)zrz7 zRsU9{P`8qg)(W)H5Q{Mf(2t;Mew^f2trc`bD^S+Z3PP!K#B;58^%Eh6UfqT`HH%iT zEOW%-IJ#f06?C-&;&2}AL55a9aaxc^OGXw1bOB-{RnhK+CNX?zX$1y@wE~qz{xkeE z`f=^`(96&S<`L|DXv(ABDP=&RF|l3~i3-t++NBK41Cyby27H3qjx)NzQ8%^M@^+F! zXBvfow^|{2! zQqBy(hdFRVC?EIXki+4|JBKSt1@N+E4(HU^XnUvu+mjj~QJ3;ya`msJ19Z>4i{n6X*iaXh>j`ge*mMk^uM5pyIcW_^zYX}j11{t zV^CMe(!VqCW!n&qAv!u&OaBXekn}%~^uHj9%H18d&#=121b2>=W+DCamZX0-ZGmPW z=^smor2iC)W4N8S*m~Wqq$K^XaMZ6OO=)-aFCQ{wLi*?Y$5KfDOXW%<{jX3*NdGRg z{laC+-QqgB5Lf(WsgeGd8tI>NtCIdX-8z>373V%=FCU=-TqlJZ^=xS(5w@~#3x9){ zIZ6LFmvaHQC1F54-@wdTz(jdDM>TUUiliEglShjiBqRvWDE2jKb4?g>lN>H*v{NyY z+^U)~Hykalr8K)PM}!Buu7^xW@CnUcEDgv(nW^m77{^IWp!|ACv;|IX)<=-sJwjrT zgjyr0me070E3GafP*UmfXyS%w;#>M6N0ZnKUAmqgBWWJvfq}H?zi>`kuh+owsNsg; zHVvH~ctvIy`&XEIdy1ZV+Mk0MFC0# zEiLPo=7akUXP~SWXqgz&4*^J#TGL=@40RbPxx8Pk0$h$hM6Xru#nL`lia{c%JB%zF z=@^GKMF5mH0YL#}Yh7ZqYN$>|=&N~PEMMipXb#Iep{trBO$329%gB| z-@`mo4>MGX7^V7Ym4c@wCSl&bG?I@C^U6J_6bP@vac@(3>l)!KuvT)81~f^cK9qhI$rnIT&AA9{)e~A<1eA#e)zI7Dd_b;BAJ7%`c7mi&A#N4`HqANv z%Kl(YISN1N57u$xgCtr-q;85}wYC`De2@$)XS@1?1#d@R#D$@d@ot0T+1X+}gS*J+ zHL}k(USjJXP5lR2q=+n7aOLk=YC#qr@am2XUW4?DJJgA#0y70FpS33G_k4X^MhSAt zieGC6wc=Fj6C-N63XHiZk=VC)l=g=S#Yxn}0s5@|%n^>2I7SnVoQgKU94br`n9911 zC&&BsF^@E{cJU@Ov1jwi31-d6l0?d(L|jk|G&*US_C}L1ly>^{+QE_oY#Adrj@6E6 z6(AABM)`sMuqgctM~M4#Uct9>da_#2>WTH@9{P#`b5}fWi^ogiaUvc!#N${zu8v0; zkDb)Qh=H6i7p2mhzAcw)A0mlSyc~0)$H-{X7+Kp`x!@loixhPE`6RWheEEovefR;TzQoi;+!2-Bo8`^caP?zpE78%vi&9!!q z=Bjtm_0~#KztVQnoVSzaDi-G9&?23fwv#vrrRC2(bhJL#>@3YmCoFrK9Ly3&JLgHR zu+qubht9*#tXAept(=8^`OMF#BeilC(oH_VIpR{gq*kIHl}worR`~ErqgMI=gVjp% zNUh`%YUM0#d9FqLlr7Xsj{Lm-yf>TF5}Qp@y<)RTN0VryAxP-}MWa@_MjcE_YuuGW zSxO37t>goBiXzaDP%Hg7$*)?i^x>1^>QGWEXFc17fXztsb7+O|HcWsyYUQG~w^=xd z8=@Xv1ZCb>QFG>aLOrkOh!nBrLj}pA87@Qu5cONn2zb4C&R=#rphAT zrlB|dPTfy%kdC>Aw|uQ*8U(u=9n(V0l#aOoiN1>eyZo;>@@H8^jlMax`Gm-sHlKK_ zbxj1oq-%0sLim()%>_}Go#>ucIVG4jDyO%fsA5v(TnUxaD%)7)gh5E>lwlW+ff<`} z`}v-&S9NxJBA=%UNgMIo^SgkaMsU&LAkp+Rl*>q?_GsvnbT zqchO%wjpX%)Y+-kMy&N#8<$WU^Tj0z>u`lyZCqw1mP^%G_bHy`@-LYJSeRLNr zNUlhIR2(n5y9~;K8Tj)oC-rfslB7P4>(oxhX)fi>^+o z@gz^j8^YxKNUoNBFrUu@dEfZt68f^0SO_C;kUrgCYy=m?nGhn~K28xHi4HP3MM6ZZkV zxv*p0hEEc945^-R3S4@U@KqDX=D}+5GP%}W^%i-W3qL^V>TRlESrvq43nHh@&>1bA z8{8-A5QVdnsA{wsiWewYmj+44ITjTH@0y67!BQ&M?-m$S$mWc$%d>9A2m)U`$w#f?XrKAd(NCez}yDBWY7qX7IW=s6(X>fy)d+{sq0uR zdbk0E?Az4v<4%iJI|>|9`?rligA??W(OGEFY_rOu>ney?2(OTFB7j0X_mVx?#e!HT zvOQcolET2(W1tYfj{ujAmJ4vnmJ6&M&=O$FC3J@<0RG`SBWz%Nx=l2&6JHUDyo-|a zKs(7Y9Dg+qFG|mnq_b|Brn_Fg78m{U{&UpEkNc^+_m&~Jg$3j7TGj2sg3{_%R=S4+DACj;6&VbVx9!ywRHg7jyXUutTLel}@@=qHoL zwBT2pG+Kh+6JgS@IM)b%AyE1`=4yvLWdzSvE+JWkaGF<1!XWVimNvN@5wM z3i>{SCQ_87Kh2YqMJd~-u=$ZBJ*3vKY-q5L#Ac~Sdo912z^i%GmJN@#w3zGB9${e6 z4z(^RcVe*Wt_>VK8w1A`X+WSgIC=mB2U^Lhi1{3K@P`gC>`=c^KUgdvvCw}nKfF*t zWy%}@d9Z6G6mtj!uMw29Q>tw>?XP;b64XSc6kg8NH>HqaF7k!7Z$GVW+*rMoPQ^(E z){uMEqgSkn)YoX&D`T_HW;$f9l|ip;gqZHVda2puscvd2Jye>~o}Uyyk%?OWY*{U= z5sKd{6J0|k6%?h4qjz{+dgIq51VgLO@`?S0IrEd5Jl5LF|RoDBp zzjGBHnM?9oKg&LCQVBO|)JZS|PuQoeLv4t@ad&954XU+?=|$rS-Ad}_XrC=r`Xo5C zj94f}PC5}<_<_*E4=N)auok|jrG?KnhONfA^*{jq@PEV9n=o27<%nHyx1Fx=_xY9xe(Q zm#SA6-)HCkdN%lcf!s(pw&{}4HB3xAj-Oz+q1@J8 zTc;SES}eESG2&0TcwodzzkM_)=bi@+0+rj@sGvpuE!=WowBK#3Pc$TtWD2jS`#a?v z>5aH*;TB5nto|T7Ev2p6|9twqvpRaZx|hep_19Yt4Cge4oz;i3)6FhkweWnV;=uaC ztID~zuYWPW?;biVhe!+@gyK_Y&?rxj_NxB_YG9^nC?GQK2TE`JT>_*13hDw~qtnk{ z%A`{=y^BER2!_J-tOPcKOJ5Z1iuP}4$Ca($u)kJjQ)~*^mci2;o~P*|h7|x?-h&C? zz{$7Y6F&#{jIM0`%3xN^&j||IZ3V=VyKI;DF<)UsC91R566+_a19ZUjt z5P%&_0Cq)y9T>3eKGubq1_O4b4OoR%piORxE*GD>lmpK(Kzjn=fs!%t=f!mRiuIiF zMdz>7JFwC~uG0HeCq%WFjIK};X-*h3uF+pLTVZIlx~J^SfCUy`^LC}^i!XS)f;UD{ zJ;ZEQ-w>1fUg>~+kpKx;h>}_j^Dzy>gO*BIpu;P8^Av$Ph*^W-l?-E-@-pq;j?KWE zsJ#C}j0PRe{|iaMzc&86_l0K|^p)rMd}gV$Uvd#d=r|AhM0@K0F|OOm$}3+vqQgg6 zb_-sm2^vZ|@Jbn}kBOKF;RGaozT%Z!6w{$qK3{P{TXov~0ckrN!4RJy*4w?WVd(Uj z_0G4ddy~p4*W89&95O<=&7wm$Z5HYis>qNTNO7S=wFxV-uL$*ZC?xA z=BrsYoyae-M$^S(Cy$T)qCDOPyz#)O#mf;g?xj718_`G!H_O2ty?cWdWL_H%paDes zksQpEs~CGBn*Wm5*fSW8c$Jxzug_7|NAuxVmD|CD*o={s7sHhZRln`6-}GTX4RniG zI>wOmd^*D93?ZP%`d8}zTMkqx0S88X;Xk2api(LY>96uLxZBQFzl9xXfhS#Io6<38 zphk|91o?Mw@e2~emlFmbXc4*4EppOJU#N`}gEDV6ah~plvCF9>H(!x-sUwJcBSL;c--m7Sq42VzE;W!r<`CVkm8l#OVNAAaW?s=J5~ZaA`G2-jpF12tgX9Q z9@fEy^LTjl>cA`Mzeb8;;wySRdU`8xdHl_XRefOm^#_e;4M?fxR;DN7lCA@u?neYL>#`|nJc=0m^td|F&KPUAmdF^a-7hy zgQTarcOxIYyV1y1OYBzGn;KWZ&XW|yvc*5nQq(I#h`IwDdJqw8)?${OF zfG55v;-K=aghh`25tZ>cNl8Aj5X7 zy3}IFHXz>$>7T$4I^s1ly z;9EbK-BKa9?ox58mAz~cGbDjyQuG~GmiH_m#z71~-Mt`txuevH8ay#y55h~D<|sAI z3JqyUy;sRNj0cMsimO-MN~cy{p@rKOpt+69L8&5Wl~#@jID=Jm7M?OTE;^nK;Cm#U zM+fudG?73=W=0M@W@cqvt{x{WKw6)3)uZDd266RB`@{MAhZPC!WOJ^JNebc$#hDB7 zjM4F9FHDlh0M1Fiy>Lz*mL-DHnd9>*8-2B@)jgxHDZlz85V^8ESYCP0=-@w+L97;y zaLbXXI+2EE+1L92hb1Coc?FWyw|y6F9~3$sEW5C@gD^Ii+n9^}BaBUvIzt5^ntdCv z?pL3Hp;mvldh;(K2wP^##lQD5kq~ReLa-*DmtO-br^9k96LK4!n1(g;vHHaAusj6L zdYZ~Ul0EVvlcrPoQh4f9pSD6AtJgi1sA3*l9xmJ?{8>`eA8(3CyPn~u43x77Tc#%D z86ZxIJ)OUyi`F_eGKu+Sn){@l)}8@$2RfY5Q``dRrrnt|0gX7IX-`4|TB#+2D>Seq zM1(K3!KFH6xCj|&yMU9VhpACY`P8hWRWz~|ujQ#CVM>y24`41uwcp*ZEo*Jn9+|1rR^6RmAm29bHqRbdI2Ka-ZqHy}FtmDB>vUt7sPH7Nj?bGM25OUF!_}ufCZamxPp&-Ca8uZ~z9^yCtniP0!bSn7 zLu(|lrE{DEZ>iP9MhUeI;!=Q zq#2*zkIUJqT+#H2KPeLy3sF9093UdXq+)nzSq5{l81&Q%sy#7{y5-9V?N`56i{NrX zd!FU^okEdkG^E94K*kT913W#h`_cA~8NW9};cy`RH5u1O+B&L_+5FdMI*iKH>rV0{ zLQ+gdI3HI_Wwf|)#*pDG@IrK9!1NYo9Y*&!1t)}&!JI#VFedJ%`3ckJ)SSO!br7c2 z=gnqA$}m+cAmY5>Kckz3xEF;TCVh!JF~T0J2DEkToIB|;Tf%e)hZV)L8XFHU#zSt^<-JQ z36$lsO0DXLsm+pBzwc+kEX5h#A9>K@G{k7|bllIS!lu;Ig%hQA`j}GB zg{&;+m$VOq2c2X5fo@EvVACD^m%Km_PO#N^3D8*X0hlrPx^qOOfQlm{M6m}9&~`T7 zZj2b-8W7_cc{rx-@+xXT%KVeO0i*_K>IWe>wGV0T0M&6vkoXGlcvw_9h)2t?b_A{} zLlflh&4Vvk81&9+x`ijiA@9~-cqIrY8CXKtSRE`9FH)~5=(5(I$SW{FbTiJ`CS!tq z;q~X6fxP}W;;i*&>y9+9SbxG{7!KG8*y0)`)*lR8Us~&L`iiKu{u*@8DB$(yC5AWX zPRn;1hl_gsjh9%Qd+xusAP|2bMI6VUmX(+-57!v%CC1x$iFL%0MY^gV7q&7T2udo$ zkeW15i%ZL{kMANi!Vn$B9g`Z4*zOZ?G`;AINeww0Qqwfs4ArEj(;ljewn)tuiDNi) zJPZ9F+)*qyQe*grO+%tt5MBgYi6GY)62@L3VDxK936B})vuwn-LotdswflCfaPqLfO@6%id`0c243;%Y=@ zV-EWk2d=C`cyfAy3>K1=4wKsg8L&8j42TBOAud*S3K>*3l{w8$l{r(dT4<0VwORIV zuYTK*O2|MS3@$3H(aKsYgz7ao(QDyEtBwXINUw21C!chx+C%ppqBUOlI?u%bm>i&W z;+tj!DS=o4=7W26f_t$qZJbCK9S&zfIkt1ey#SroR(0rQY?;m8IP7#_S&X(1WMOSQ z%(lp;#iy^<*?6fJA6qSawYA02X4JD&G_*f))2KjlX;k#n-)|)Afg>u@rlQqr40Wiv zZ-8{N6fq57*!|Cx9P&?1g8_@G8Pi(euP;Gs?ZZ1wYh_hHtZUKQ*>WJU4vs|8L~F-I zgVwUvw@!p1ZJ9_?lKFxVYl?KET@MF@A@*(5>6Pjb+kA=J&-T6F*KmB>Uwz4?q&n$S z_9@so+9oZ_J|OF{&#J9+sYBI;43(f%IETq|6wx*}jHUrn!=(&M~ zxJJ*-dUwWOm!sL`G{%Ks`KCP59ctq6gr*MjlY9kg>cBM+P5Q@`&Te?cbp~~MEH_h* z>hnq$?ZM_-r=w&w83D)DHfj9UkZk>pK-PVcXd0SSC-{#hdSX8%8WPxm* zh-|)fBI{%8MApaFiQvjpAf7&`uzHw50*ERS3vq75Fw+OQ1`E zj`fAD^MQ^MY*=!LB${#@5yxT~I_p?0o4y${NuZ4klu?DJoY7KQnsQ5Yt(!3!?UspS zu`I;x{@e4oC#t{^ygq!*zR|aeInh~dZu0D+4CHvKz>clBiW(X;!ER9PFfrwWe`OsZ z$K+^@9M(^~@cu}&ACXkbwl!KqDsu(62*i*gMfRG|U^PsCbGD}2AIbA>lBN+}B&x8k zFzw-}3UFX7Bh>l3Myw3}b=i(U2_uKLBOHwsbtzejBt>0vhq{%G_akhR?O>Ia zwK?`9ia@;&e<`EeD_t?Ke*3K-{5#%j=>Z!LPOK&d6?-kuz_D?emBz-7PPx^@^>AP3 zI?FH1y!}R=cb+0v%G5e%ti1QTs;llEcI(*^F)}J%csOA9UmF^JAmLYxWz#O}3KIqclBlJ1C5nT^gU5z-WeUN%s&`DM z*A)oRT34M|SO0oPu`P5@g*^#1oZZg|hNwK?O&tc2MoV}5Niv8cG$+$g%TpLc^5|q5 zk2smuL1Qr$V9_%aN3QCWl&w#usg1arG@VR~U}UiJw1=d4VIF?-n;JF7`nM{Trvx8; zGEFvuGM!8_h+o17AbpZYeKO6!J+2O+6Y0ox$0ySqc}yMv>gSL-!I59~B~GS6xFbwy zGHr~ZjgiBF^_Y@okZ~A|;>?`)Bglf5C347yu&l7Wf#=hQ(I}C^AgZh-aF4b*jHVu^ zp_kxc9r}=OBrxg}{ZQMeiKWU(*3l2k&=lmG5?fQ$oNqiig(+Y)PEPSwA41FJ4e1Do zg$|(=5`?wyG1~+@$#uS~D}>1v@Px7oei&gy!JCney5VqQQ$v0FtPAjU_>7>l?bwH% zH7%@$=WZJJ&`xGPnqGbO)#qgd|8^OXPq4M_fG6E_z6F(#&x%OlXw86EPL1_&d;$T< zJOw<7aEFBgT|~G;zxrIAHr_Z>@>!2;9Pq>$=zJ^OVXsQz4y8!c0Z$4AJaKnxo3KsF zuF->C+ceyvn|8Rv{!d+7(?Zpd6(xI>p&x^NjC=(&V&hq#Y1_U2sKe94-@ z=on@{&Gkv4Mm<|}Rh~r=@I-+GbTUcC{+r7lSK$G;d7+!K`8az&j#o{TcfgZ+&b10v zV-xU1cm}AyMs2PMLmcpg_(}aka3N@O&SpKyRctT~j#yC#m zKE^KxJlV33AbC1~<*10Q&PuFHT_n_a(?!YcP}6AQhG>F-Cy=AG7!&qFiLPh7ge^YC z196Su3v&NBVw{5z#~L^uHQb=zz5pH(Aw?V>RhFNp)o(aoF5E%xivLBW1?I%t~t)~AD7%oo^-`-Wa1w<|HJ7kZeP^LI0zi^veif;39H z+YIwsego>OdDO>(JWQk#K6#i&>R}@AG^12Mj|*4zVJC7AC=h}IPpeE~ zu|@w`(d}8$O>$E6PZa!_CA$6P_ng;7_0NiK$kG+(6*y$E5~ACqKV`^Vn&{>-OVtI- zd?kx+3C*4r-JTWQw7Q;QqT2)i6jCsJR&)#5%(CAzMRfboXRT|`TGz$`8iwp=oQU>4 z_d$IWhR165v(`04v^k4toS3S91_K+<7hd!(5f@pyV3Dt60WBffvjW<)0@^cBK>PkT zKq9~DSpn@CD4>0^D2m4QR=b}Z44E6Tp^iCFj*nQE<%p-RcFE@jN4(GC;z(A14o^I6 zeC!W#f69ZPLa#orf=$oPGM7}TPX}#MXNga`cMFrhgxu0qvAj;yS@r{(&e~;HUvb31 z@b1pWL7~jfA`^YKl{7XETh2R}E9JZs!GUBRw?P~mba-^@SIo0_9G_ajFuh{Z{IR+E zR&sn$wG-x%#7=2|-Tsd;5}cc2B%6TUhcfc&2j2*$xH1TY9C~|hWf0Aw#~-J`Fy}+^Rjluoh<7edmR$# z#&JH*PBtg$nG zO_u2#Ux(Y1*glk3$NT>;PxPPUatYOkU(<(Tzy}asAKtAGv-*H3Umt#69~Sx0r^@;O z#TEycyx)=zFgc2vk7D@iT-nzO0KBXKd5-ExMogyy27m#{)0HDvj8b31eNCsWm{?Xy z9AFZzXs;+%UgNQdOD4NK8U;m@``Wl@v+uQKqE3lK*R;Js*V5SzFM=uuux`I(~Akmk!kBYq>+?;m^p8ai6LUkZ&#hyP(4 zW2Dua)`voDC!X+EHQ{I$zg{jxFFvah_{r9;)bh1~y@)zgf37t7@8XF4_oGIRMCoOW zf4HEgw*Tuy+m}SF>IUlCS?L>U*O!(*?ndnP26ICTwH3& zp*YB$F~bR^Kl3B>Vo7IS!TC!&*zmnSN)gr*9I9SY8`g{+zMmdyj+fi_tD%0~H%P$K zT_`wPTvV#qII3tcF^}mrqAD9I@+Ngu+z}^*uQebqxh#d)z-GT&(C2C?hPXwG@_<&0 zdG!`GH+LD}0u{L2a8Z>FTznjiL$>yS%4!ahQD`lkhY6Xf)t%&OORfW z(D{hK1S8Owpl&oLTx>B3RrR-(^1b&mQ@-<}d`%dF%b{OvMfo8$TuXQ%I`o223L3bT$XjX$nfxyi`Xng;skmyUJnp@+!&&gbXu54Wr zlutzGUutjyT5B;rEvZFIRdrlQWP9@GX-vnS8bDt<;YeU+4g$=IZM*dV$DHurXn>-s zh@7Iv(c;q@qTHS?^AJ_#G$u7eydZEwU~AK=uT(nr`jyKo!ToTk1AhZL(4#>?~#qHT@LbV(}852?r`Rl_7KdX|nmtlyog3CQbRoM*jUFxV#jUj!8 z9qoePnJD|KD$6+=Dof(-jZ1g|Zz*PRL?D6Z*WBu50MDgJ^vx{7MB)tg1&25x(SOkM z$PkZR5_l%cZUoPzxBC&bE6gKsLD(ZMz3d;VT(fQ6muv5KC(QKCiyGUlF6o3?kklUzwR;{B;O%sym&b` zEjCvwtWub-22=ZUiK;v6wWBj;7nA&6WA%qM-Uzp-2~*fq6O_FAfa>2@*MCV2eWUce zQPmJiK23%$jD4C#FQ{;bpt^%=MoWek3_80OW^c!3YcOSdBQgkK4P%T6H2nD1e#at_qqe!BYZJF5<{b@|zQ zF83ookLm{SWj3BtncnHL^V|cePENP}bfMgXA1^q*`nICImt+AnAN<=w=*Yo5>SA`D zeCxwH7_Up~y46SPA1JwlpC}|BsHPcW&WzZpyM+%tPWyb%S$@K(25&4BQC}@`tf#2- znPWH#X!Po{bGLZGl-=ju$*pAUGh`!#RQi59(PWG2s@oZCS6~4MqryQ~)s$4f-f0fS z6V%di0a%|5rs7nO00YH1t)HBO>Q*14%l_lt!E)yG?IWF!sy?Of`lCjf4E_NprF>i| z`lA$1+VHQqMJb#WOHkDzeolx!mjN;lf+M}>1XA*aU=XqT&cB5G22*+KHx@111m>f-BOO(Za0FeQ)beqK#p0kI_T_ z0dUo;*lX+D{oPbd7`VViP|962z}ll1zyQJkfVszWe4yt`;`D=mUTEg&HuE4Xs$Nmu z!^^)d4hRw04=+2n93a#YxXt-6ip(lwD`CG=`0mOnxS!%b#cdH^ofT`Yly&F`5IL)Z zbWR$vC@J+t^`ifxCIXuSUX?;CkdrXJ3Qg*}Vq^ib5tn1fg^zr(o9H*~UxUyOz3aU4 za38?0gK6G;?7w)rUch#ls(xL+=-)f9>vLEk>Ko0ZPQ z&AAU8Ne5BYzX!M)gRLgt)yx_WiA6aiV!D)#%h!cGdV+|)=gCD(mNx%5xo z;)n=KF&y}s?!y`Jna%UE{q+@_eZ0f@`c*!h32+r_kS(_QS)!fq95MMUgwD%u=BzsS zToCSLM38V%kglLbWOlH)C-Nh3amBh9I16EYVYu88_~Rt~@@Qpz(G9@9eaP?+cW#Sb z>v;WWdHpQ^4G6-HHp=kkxC=+491c8~s|E0+j#CGo}%n^;0bWeB9IJ&?#ijlt7 zqyIGRSmDAOPI*@aCAx;V>?b*fmSNU`RYfc%n9p>nh487cb zYq`YP`5gq{-$}Jxj8g6zZPU~7z?V+I>}Yohtf1XNv}?zJ3$|PmwA?h%m&M1_ewetO8Y8~#{*;fr7V;_RJVN>p}-8RHUGjffcJlebVtBEb>X(Y=S~ z33!O2Y+p>GuL+&LnGfIE4F>lNG+Rv33RA=*UiUJ~3UL)!)_13z7L0K-K} zQH`tAaHgsx49V7soeL#0%&hDS2F5-yiMTAIVnpSRfnZ9m1$R#iB)6at5bERGwp6Nb(&1w=}dc?Ox&xJYU)jA+S_F6 zHJN6nGwo|K%`};2r!(y*(+dr+Su%NP8`fp-?Yc;_`}XxYZq~%}3UkN|mwSy?%AM=i zzP8-4e%))&mAlrzmcP5#SNXeVeZ=3r>j(L}Z+-V`&%sXiuMc?cSl|0vGqbZ#{Db=_ zJ{P|}e${>FsAukerG0AUKHm50{d2SazRLR-I{JF-{&VNfaUTl^2R{et1^i-q@@BYI zTgmg&$)3Qa8Sqre3)9J-I+FWN?oTIs(nwx(a@=m#YTMIA@{*I6rb~OGNM3gG@^rGN zh~yO~uS_Rva$bPSv{KD*pU9UD>;w01Fx|UYGc(mTCvTfhuEDABe?$QkGt&c&YI#p%WNB#;K?pN!uJuowW zc#l2=yQw~=9RASoFIbjbSj~o(t2u<3GKYW7A+x3n6oZYy311-rPhsCNL%_roqx!pp zm*H3*yo|DNvYv=xXPOuyMkY?yN~$>-!pj+0u{D+8WUWj!CnFkFlPNe^D^tzM@~YEh z3QpF_RC6-Icr}@VleIF{oGh<;O{U;vtxPp1%d43tQ*g3Yrr=~4W2#v)wK!RBPS$BS z8K#_97_`;rno0DHAhYoyCJ}(+PWpyV)zfT;d1^@)a$wh7Ajjsyl((Y0&s$RH@69Et zr6uaXp1Dkp&Bdst6>`ixZ%HwJH; z6Vcm-M9a*HDuEZHz6{v2WuJ3s|8Tb=}LVZ@%;GNSo)}Dav3N*sio*xqLJC*lAk@ zRe$yXqg+8NrE1zz25#JLH7mt+%LpBwH36e|J;{|hXF z=<-&JvFt9-&t$WCk#)MgtRKo@CM^=p(c2`v?QGs2{oHw*n6fywMEoj#9wf^{Ur@r{ zQU!H$;Vy1z&tYT=#0W2~+pU(!C?h3Yae?8M6Dghni#zNsE z4KXno4n%dV@=Z-xmkDDA(uB>G1L=HoQQ?vMqe3(>tVrI`2yTbXN!hq^UhS@?Z0KS| zIlpDLGG#*>Bg)p6+4iPv=wn5>vSqeG$_DKQN(dLST5)KF;Yh>RU8&j48Wrnmfa&EC z&E2nrRB`q***E4bfarvo%lX7v1E&s9>o4w*D+nMZx}~g8v(=l#$&Apt8e@hV7h0?h z^L9J7@ja;kS*0$B}03oK{umm@-BPWt7%39jo1)@4rT zy>ZqNRyX89z9vBzit52%5j_}?`p#bt%20%HS}dV@h*VRCElR)f;R}`i6sb`fMiV{N zaiQosZ`!?LyXA+PU5|g?jS$>xSkp|}f`)~iJC1tjHejH8ULAX)fDDqC!B$*0P+(sJ zcI<+F?sX4C7WIqh;+V0vb+V<5WVP;);Ybz=Mq5;G0+0&rtm8m{LDlfi$Lo0j-D`Qg z;h#QCKaTLmW7U}lWIhHX(OwU}H@~h;D3PQ9wjMe?KxekiXX}sr>=PgOwb%acZ@unb zT@>6j{jV-l)7ns=!9`G~s1DuERR993=QzDWJ2kqJwk5_o2z2!$sd*lnec+)X^U#n# z3IH!QWZz53&Vcrf%8m${Y?&J{m(8;rN)9ZM;{svXfQy+=voDN~;$a_UQmJ*NUp>w& zS4WxdW4BiiVEL;)#-G6lMRV%4@Nae&#j6%sJnSGyq|)M%u;;x<3n*FeO7^#^Uwm&E zGke9oSRmP_`A#g0SjE5CxwFKcn6de%t7O3@W)_k1WmqU#y8DAkWEJq?bAHo-Gs@$2 zPUmF%eO@2%vm%A%jFaINYxO@}i^2GS5-(l0fNYGNS8-&HZ`BT(Hd`|pW9Nwv3wgCX zKo#`yfDQY+>}ONEq}OoB1yzmk#3lfiOAA~wYKn?u)I?;#lxfKd17}Y*IqoaQAhv$& zwWH4Zb@#ue`rLmAGpghpF;@6QfsM`!?d;j}U(D`1N6u@>`48@#%3MU|w!yAw8|+l@ zYd0&{p&&eUlPVR{etooA3T%hU8~b0;vj5TFWdCDa*#AbwTSonA_uU(NjG)IZ^Ck&M zc&x^A>jyV$8X`Xn7rY?g=AR1S7M?EPkUX~l9Ae5AfLn^jE){fJz+f2wZ3Wept)R*V zpTfdk5OCX~dzXfBn0kbsPaWfS2t1o&+)kxzigCLy2gdE$3O2hggmJ$6cl(6_x9_O{ zj!liH2e<=U0`B0JfV(0Z`w}tkN@E=1hc{WSS9yznLjp=BLYS`78}-;kLRrxUJ7e!w z@BB3E!UF3l1lC9N%N9A2NocP>C>e5kFaK})49$@wrVXHkk5U?=@BFe12HLtU1Jy6`+XS(P)-XS1OIqU^09 z^20l>$z;2k>alo+_{=TXSEM2T@Mi$6wGh`NPaDNyt)gNrBgRjEHt0$Wr`bj7J z!8te!P<=|t9;A$|_c!$`?ZM`k(%#wpVszCb^{=V}V1eab)%ACZ`=j~XRUNrg`$|F* zeoydaSxwMulF;H{Dj-z1P*fF+CQ=45?PWq+q?w$}?>k4n?A$In-Rhgf-9en2kU9}p zq}lqT_CAaF$RmA3c=cYQvOe_1G*GM($d>G+%3BX7MD8iV)8aP@2{LRUV;MSJEFxFP z4~5M-Kg$>ByF6R=@*t@C&iFOpQLr^#{nGjK63$g!^?tp7gg+tFNd>8{sXnF;A7EX^ z4K@;uto8`BZ~h(9q@`95@mBqv>LdD~%8$xF=ZO>aR$2l6)90SpEN6 z6#3M(9gikMADz;ArPqltJQ> z%S-j9-=kYk$byNhQ$Dy)8bb9BJ|fTRXhiify+88*kW2C`-$Yug#|YhDWa&0|w>9d< zk#=~!#L6;@(Cj!_9tE@=1vMWCnNkI7rzx*|xa}P79E&`N+j9JTKM9;W=1od~hCq$2 z%RL@_ue7-neCKi88IO=rmwOzuKixRMILjj+{1RGfwabmI7ROk)0O@*bxf*D|y?24Rb9dqJ`MKFU&*=T` ziml%}dE0yUnKPqV1-+8)H3UTv`f<)ehPIuF87OC|^%e-VbKn~xsZWx<r*$T(~5)m}_Wr_KaH3AaFEhc~zaX%cmz_OSbL?7$4vc%B{Ho&*P2;LJVgI9`c<0)yS%OHTSUC4;g3?x4aY*%a?nEj zVn;s9fDs4^dIgNcYE+Kh955DJ zG;_#vke++fvrNy`^gNQD$NcQxp8lhi4yq#!V6){)dpI2*u0IXb(c-|VxGqv{@E)E5 zWFA|*wbB`vwEE&M#EHNVZR=@1zID`*F3W|I$&;^;rY2?|K&_F1+Xk{y-haT0tH8K5 zh7r~%jaen(E?%N{pTVMOtVB+eIpH)5ff=9!3KwJ(5Y$grEY%=a#jxzOKJh#^&tYc_mPPN?VEy)sh>;_;9!2WG`VN-eIzVYf9gkR`}n7L zA3Uk`YuBs(XFC%Eh(&b?18AGr>(vVbqxM)`XCH~xn^1x&1dM|}^k_FP`^d%10-DXs zK6LT2z;W}kZ@hR}p-e-qOjsDDNX92TN>P(7$7@j6l&)R&(TkVWbWXOL7~ca;*;sIJ zOWn~?&;8ZBwdvW_;6uqGOmm=Gk3fX``^W~GB;R0BaouN(d9nX6j%#95VN(ohQ2*63 zLW(-=do;8K!vYjdk*pzyZy1+)E#jh`6`q54$*u?xK4iERTrM1>x!@+2`t5PjY>0fn zFsEf?G|yHAYJx?|o4EEd22{xA_=m-ifv*;OC5Q1m=qKb{E#vGC)?C&Oe&W}keg}b& zJ19ss9RxM&4vGc=98a@>linVkY7^gM?P3WQ+PgZ|KxJW2L=66ij{5zLa zGiW{4Q;G@y-qh6hBxK256IWQB=$BY!!kMl5b+)O;rHe}&v3ezwDSH5anrAh}#*?Jk z)5}XmkN@&suaot9T@%~)f^pSg@C9?K>bL7(U{ew?Q9Rix(lwePa)SNwJFosoxfdyG zmDhI#p~Tjyf1%V_rE0h-wOgnDyi!+4#q1d}!Kd|Qhw^Lfr2M_qwjub2-yp}#;EBB5 z8=R55{j+)AYh5T9Vu^f!i#6CF8cRO-KM~2XkB4r=+g`S{c_2K)SmBpFi>%sE9(MUT z98BRfXvy>vMQE5qDG={q_#ugREYtPh-l=0T)?~vheb5`_)F$q(mUF%7Mo%8{ zQjBd6)h8@QWWek$v$!aLiAe#m8g&P6)pAF!EMnoviyeI9@?4zz7f`22SjGB4EA+2G z=JQSDY>~6#beEFOGlwQrl;lU~#|fEAWs{~iF6iZX2&jmh&}S`H0YM-{1Y%A=Mr_R* zj)9|74EALX)@votK!GP{EQ>rsGN}QkZr51K92VNBNQ)dXmFgK(6}w3#Z?PA(${R^s zSqVt0@ov)QrDG>+tJ2L**1Z$>!e9{%JDXq&8UTY3wjlMiu*F*xKq9cFfFq39lMX}~ z&I)F;hM5u1@Gw26aN{%n5cx@_6M7VoZ}&@cE1X*0HvIeDp)|Fs1`u_vZniW0-pX^FO2n445e zD3nNO$7vJMaZC81N8RV$Qst%F?#fD?VME{Q4^hSTyXD6I@u;P%RpqV#6&A**lO$l) zNs@r^A@>N}Gi}q6qJWv;8-0bs3!CIm&k}vNJKSbhLX3ygdN zlGJ4(FC$Jm>6EnP)tFUJ{FWG*q`b#Jpf`L*qPya()q5UGI%zZN=H=^}zUYe8=Ci=4 zPWjOg(QE)>3YPEE+*MF9jhHdRmg*t-JOJkfRN4<5YCL~Tz&KYLIOInI=K+z`_@O&8 zM9#=3XP~=ZO_tSUIm^7y>P=1vQtDD2!VO0I7-JmMd-fyiO~>(z%1I;YWO@HDJF%Y8 zCX9VCkoqs{|7?MJRu77a#4s6y@m|`uE7* z)+xF_rQtKGM(bGp4*_$xkdi=)CrWfCTg61$s1;r%Vt7b z(3Z4XOWtZ`7i{!hK`PC+JXhJ`12jb#NRAT=ZlY>*wJW z2D-Y%%V2h7Z;nKySO|<*j9zjDES$l|oLEvYf_Qe!m|1o)Yl4vw>rk}YLag%}5bL2a zq8PE>+5Qb;op1jJHjlJ_bKT6N{Kk$atAY{jkPr<#fvd79EtJlM!&o)Y25c(DsuUpmITtrJczfiYgI00LP|s-E78AQ?3tY{k5Q zNrN;vcr-|Zgs}eM7ScdVg*Nb3u{qGh%*_b%l<}rLZJMtyY1$t6?WaF&4eOOg-(KDZ z%EYvRJ+-j;G}iZHMO&n(!Hn7fSlK2Jvic#n4-w)z2Y3w~78~Mwa3fTTRtAANEQ}3`Ub2F1`C(FH#cU4CcYNqVrQbzrz21zKPj8j|v*b>x@D408CR@@X z$oi9rQh2x4)(DRM%71X7o-0IesGH3ZqCDPC#d;v*lkfvO>7^=4Su#RL=5cTsD;!BR zQ8$)}sGEiHPHFVb73%>v=2XLx*a2BZbfJc;Ijx>Jne}g|s%l`XTdNeYpFXrHW4x=Y zsA7wwxsCLZ@)CNU3VnP}mTVKb?l!OG!IUqB zO?gu!N6pwsS1mNp)JjW`*&aXpPy_T<(S&(^F8F62;R05$VAXodQ`F3sLNoj1|599W zZ%60RAHvwtP;0@yo~)~A^{SxQesuXIZdhJ5SeA&FH*yD5OZl*CSYq`G(wi~GBM^!W z_t4r|TH68I?f`9vB2_x;mSiMJOX1?F4X7tT@L6)gEr7ybvTdbpz->W<_K~npm_IxC zEW2>>69&8Y#bxcrbl&Hwc_d%&g3D>-6tQjndr`99oFDD@4Ea9U;ARK^DOXXJ4%v6h zmaeh5f@h>QX9u6i86=YAb_Th9+(&x3UA^o?FF9DFD>G7t zPv_%AIS+5ImUW1bOztu9KQxehQD1hlE~!aIFdhe4tlLP=7n^a`K_RxOaTc3K$52`E zX`C}LPIb8+CT&7u+@0ZpG=0kqU|F-K`9vt#&+q*kW^I3K)_9+1fS$EZnzds6we4Bk z9}xL1&D#DkJUDEfd;|8UDJwK(RA>P3)Ua)9+MlLO*ygYovNl<>GI{JyP8oBG2T6O% zCNneeG-Zr%7bDy??jT*G!aDy=D# z^0+Hana4SEO^V~8#x2NrsGdBJ6Vp3lhOsP-7U52-rv8UljW)s@h*tYd!%mt-oUBP> z7U%i!aaLuI4?R(QExx+Ao+Ykut5xpvSl48SHGiPQX4o&SW#0389{-_CaRvlLs>O+K zcJODsU6UQc{aY@8ii%Q>7PZm~FrJjXG$NB&PvlSsO$YkAj|pBPWw_93M&)iWAb{)g640>?#U<7Jwo< z5ZKANi-W4jvI!*4_VoeIdhza-kEY3Q6dntcOrf`Kv`Xx$ru+Zj>FFzd`~*w@N{HXl^GCNRVhB08Np6`S$K zL?h@#daop6{q?i~k<@7)VmkU z;O#&)^@Ple47ZUib(JkVl>!gY@-5Nz!kaG0sCMwyz_}S=>Kukk{*19~PVR(rl3!zN zm=N&QJb4s%3BTPS$3S~&;+I*oS>7<`K_YSRj7buP@;Yxig)^Hdoo*!}=V~3St)u?W zv3SFYf^;T*j!gA$TJGQ=Y2&gZ!PWg54TZ+hpV26sDv=#T4iMx5V~FbSGE~Bjs%yJX0jDMp>Axkh&-F zLp*b?#WS%CrMY8n%rj-p(9Wi6LfpLby6kFxfS{|i&9d(>!GptUQ)tGu#h|qu^{&Zo z5I2oHtHml?)CebaCgCC;cSyHFy+rY7<8T4OT`L2X{b9SJnUp!Aif<-NKEm1h(gq(_kwmcUW|2zbSTRB9bEw1gstt~v5h8aT6Ui?hK+v) zWrC^`^Fx@}NnQH7x=YswH*$}zl`A(2uY^Vvfv7q)xtd)iBIeHE3n67CBz^T<)eF%D z9|w7>u`ht{H9n&?KGRy`Gg{*_tu@ZM-L%I2<~0tzm5yZ@LHNX5tZ|Hu<2BCf#2VLz zJ2{&*t{ql>H)}k^;qe+r<`}Q>8M_>$e#IJ({=^!$u<139q~^ViW{rpV&W=a3{CeXx zjs&AM&Lh^ix)XBz<|)83t#RBTg^Ov8Mb0*7)kQTr9LsQZa8ErDBw+MQXp`3a_PNDmVl>np^{ka zV{{H_7+d3=!}(36;eJTN{Ui+!i5a=b!H;=M!!wd_u{t2o`gI|A1o%?7H|E{o|m@rAe5?# z;b=V{4%I#!RCrhsutTd!A}x<3(t1%zRxmFK<}t-u;3bKBhFELBnIj0!A=XC!s74UA z{MzOgFbl*a@!2f|R|!uY9Z13IqGKLVBe*^?YCX@AQRm{sz_^L&S~U!fHYUGeox-=k z3(JpYjWzG`X^*r*(FGd$v?ty*p#_O|^;*2knw8~KznOPAJ}#O|BcCd8rsPuul`-#< zTG5tI&AViCNb;w7my89?Z^k5BLH%3GL@l3&f;GXrqCZcAceUhGU?JYcBY2m(6TEBl z6j0<6c~>-I-nDsE;$54k)QwE?E^9Q%r%po;E?EQBRmnJp9)H&~IjRv6y4x|TSS6NECA#99bM)z(AuPf63 zy5gE@RdtW`ze1ZReA%Ym%&4wmH-N&j2+Zir$MSpSm-U7j8dfZM<|Mvv;h<)G06 zc}u$@?t<;yE7Ai8u`4o2yCO@Nz(WtbLP^>cscS7syRlR3DX2*z;i( z;EbOz`!kZL;;p;_hui8;$iwpmGCMEn%#8P_*j>__P6X8dXgHL|RufB`HR0V!H^GGn z(@k`u3F#%#1oV`=B0+rXhi=I?tasXL;bp8__HA6%=}JztNUH@~<4sSWytzVF(WPW7 ziEpaHdoxTO`zFGvQzN#PW$goz(%y_vs?kNu4(3-TvAOR~#4%pnoP?}sjTTwUTsk#UNu|+Pb$W9&<8SuDL9t~{$ z%G%E<4B725s%lEM36a-Mt6Sc|=}Hal9!8zU^v%|+wiLQDfE`)H3V5Nc-hGIyWpSed zn`)9Ukw#ZnLX&rA>$$NiT|+`Tt!AsyERG4K3~91a*s%gHN~Mdg5Y$7&qTS0y8w3F)U;#u-xQ5y< zcWTsfZkZmnrmcmOP&AJ+D-XJzgbImC*TY_EjT#KCLGR73Nf3C%XKt+GT@L=1FjplP`oPfxoqF5saqnjE&~NLWTz(VR%q?VqA`CwT^2Q*X=5eH^LvF-eEZE%A6+;_-4zJYJS~yxbCx zxpXm!$9}VT%w>-fkGYp7>{z_j;_>oWJmz&mJU$@tczG-yACTI&OwZCj9QP3Gce5{d zfR>wmxn+sRb-zM9j{byrd_Wq3#p44Z9v^6YN)C*@dNzv3z(V3Nj}VX5oe+;VPpKu> zyajv-tkK98;_>EHso3Tzbt9AF@p6dAcHIx%22cC|5PtQ5cKaB#cE;a62CWYqY;Qm- ztwDv0opQg4vj;o?;dZ8fyr-=50ybr0fD11*-4YT8xiDlV1gPp$6-lM^sS0VCs9{t7 z`LAXh;LSOk?J`1H%1xJQ^t3Pp3O0((x|MV~tD@Xm9m&OBQYY`f^UT-O0(m|##? z>*avsjXY?kT=ZqAN&fDdm9dL{%M(v0KVU~}%MOw^oObJqT2RxtD1gfeUW$a7JQRw`awLraU@aCGpx5$>65Vkb8|pk|;QL0< z{bucR^tTCiz~$0l2V5=&J0bffT&L@g3GeW@nzMZ;VH&<2$sVus3Sp1O>qX}f71%ah z6~neKyzr3+Z4V?TWZPEcP9455+JH;WDt?P&(Q`5TGFXKz+*Xvv)rt~TZkusfG&{-=DZd({G+q889QEeysto9V))p;x(YHw&( z_=oOmfT@^GYn*SGm3?bg44k{=8lRk5F>r1t$~YgCT)!cHiG};kEPPg$=Yh}30qalV zMXXBgjhmNyeQC4|)O(pNGBqZxz2e!kbS3fZy;^+fDsJ)%gtOw*?f}gPr;cWWQ}1m! z_1@srd*kREFxLIu;oTF}+G$vQpiL0NrzaveJ(SaKpcYiQ;7B(oy1SiBw4OfWTcfT7 zcjpn@T^$dvo6S?eV|(2&_bq46*`g)0REnG2e)o32-hAWIsvXdG{AAi20VKN zz8(BY;M$|1?BGxQ7Gmwt=D?1$LqioisIyqadyA{iBfNtwBT%`AehG#Be#JgwACC*T z6sUJc9ensWU$~c>AWu6Kqqm7ZyhD@G8GJrx-RuCZoPmA61Wh&8IewH;uaykzShb7j z;Cj1WbXQ#?qY-`2`u*Vl*=;dc`NuO@j+ozX-sy394aSHMcUBv42&Akojg(8;vF{Oe z#6$Ce^%N0#2Pifj5t*QjTr>}k=Nb|R6czm?bv#$dMj)?5wutz9tcEc$M*ZQ)_ydq3 zM}x#JTt!}AnN020l99VPrc1dUupzuKXvB$#PZ@`kQW2RNS&RV2U3JEb=e!adCublY1vC7 z@5vi|PaOl|6PqFNNjIOwC$^B{(_-_9eVF*fGv#9IB0eoNpV-dPCqtX6>S^cODFr}q zk7$xT(51Q%;76_z{I#-7^SS255p##SRvuOuK*sOFNb#C+0 zO;CjD9iS4Szlkf9gX#M5$Ok~Ki2YrI`zm@&mWQ-X`bUT+#h`u48SLk9n_yQeirc7j zfZx7gNX+>FLB0O0=-*C(8o5e`-pWIl$rQVo&{nyinc_&X3e!RRhFYz;ZL_I<=$fa188JOdqnOZrJoCpVBgHhHYKp5SZEilEeu@n6&!sx4? z#7@lzf8@Y#`QVQu032UFS**z6Kqt?o;AGJ0VZl$bcSRWpYQ0vhL3RvYYO#dNVc6;j zlgnKxooeMy4rS?{`WYBEa>DxH#Xy0G`<%~luG;V6%{iH1G_UJI;sjudcK-K{Pc>RR6p_hhtq9su!-s&{Hnl_vP+z=yv$B>;e7O1(Q%&ch(1Jr zE@4Py`+Zj&$Dwym;lg{OR63EEHi})1klwuTD`Lx1Jp8CTm59JwF}&a`d8$ z_eN9kH`AT|BK;Fo1*z7LPZs@ykuqvXQ4l9`0{5*GAx$r8Lc$Q~5|U*qV@GWMmEK5|}ph^PJQ1y3m){TENyOUFa8F|YVis@8a-1I94qTm_(T z{RE26iz2R%fC9#l^2VX7R7?bXsYLu5pQK!FQR+R=`V4R3lcey_!aXI`IuJ?nNfIuS z_uuJ48})=7*3tPQ)kJBqH{@MrBWW*LbFQS2z9UgZ4Ok5jC+(uW$SPvco$C~xEr(F7 z)&DNfU{o9ME96==Kc6FQU=7Kt&-~8$jOR^p(wVE8`E7421cWTykpQIpl;-V5Rl|T) z>8cdb7-3aB@)OGQxeFKLJYFrG{|~@Ob)A>fNpi}!{;HhgdvvX z-qh+i#F`UP7v==b!*h4R>}eMM<`C(j4T$v6E(Wr)&DsHyD7%tbGd4ln_(K- z)Bx^23(>@N7Wu}sY>zO>=I;@@lp2> z;T_2^A98UAAE7SwU}S}0;1B3Fpuzt~pI3_qa&Aww6CnLMT)YwEh%_NA9=caEkxH!` zjhZDN3nosfae`6Zq;a*i!%s{&4n#D4l0XNR{gp@b~ibn(U3# zpfwj~RukluAfHwqI_?OcRzqHxkP|vZ0PVB+(ToM}4zE&~j_2lS?mS#5rn+u|VPmBz zaZp>+UHMCTwcA)Jnoz{GL3E=IPI+#qW>s_Z9qKJb0n|h%#~t+XZkPU_ z>%yNyJ!}f!758E>QK#DT^c|WeW+tXlt8`-0O#R!FSmP|G-x{3N@(>DK1ZO?T8<}h1 zvBvdgD{7BHycF=RIoB)giA@F}KBwz2$i-z3oksoaR8Mm8lXT3E^sWI9-OZ#E_#NyN zie;)dU0|>pSvbsB8!2?4Zw|8Llil|0n0IyjLBrTT|!3V*O-OcJr9m5}2@Fx=o797)>fh->3=Vbm9eRI{{zw+3t7@Wp zfBj+c_EuNFH(^77rmc}1MEp_gqz?88Q3?I(pM&V#wi*i^$xPZ0h}& zPqZYYHApZ?*x=D_@Q1;u|DU^efwQYB@Ba7M`?eibij9|tY$8m#&;h)@Vll2H??a+6eKrh?;50>q)vLYSgsN99In{aVU(b&6n$bG zpidClXgwRodab99|GkX$eUT$VIhhLR%P>0;J6b8D8mRt%@f?%2o7zI&Xx#lgR2CG$wan7&z>k8 zbVQZS$UrJiL0{^z#n}lEdRXtA48l3Ug&@^gN^l&Vr6d?qc*Pw6lxKoma02-mb;#A1 z6!KO5lR%z>pnx2wycE#7SSv^!bD#_G)ZOA29SU;MPmqtBn;3+#NY8eV;!Oy;@?zOcJMBN2ywa;DR{HNxzf$~{lUMr4!xJDCe|?&evVbvprT0IFO0iH( zIOIirJ%>tVbV?s-&^;zWxd>M%zjpsEJp+`R{rmF$?bq!#-Ke6*G8=L#O%1sWKrgdDm0Pa@F@}z)it~QkXOO-4oUr+*vYV52gpfB0ng%7)T z8qG7adG^5=UC@l0w34e;NqgPsOAV*VD$x}2m1xi({}He9t!O14V^46cK^NUOl>C;8 zv^SM}$d?o`H_&^WV1O#+|A%Aexf|C>zvcUKVIlMXn;wc9ppvLkAj1W;6qJ-ADPXKz=ri}p!MKUy zaCO^wwY0kJ^2=^by7=-K@^W<>(E|xy31UUHbWd}vaa7$WZF4a}U6o(t?3uo0OCEbs z6(~e~E&h8#*0_pB{d|m1Fc)mCf=%O5a*%@dSbvM+QYWLqLTEX;BAK2%`0tR#m(`&T z=ZA*vs5`E8CAb;&$@F~X=dOKJQ3t@*q$<$eQ~PeQYZExyVNQ02J&rbFU?X#_%?Vg} zXDuCiFpsO8a=d0^JU7s{(%1$XB}eV(OWd8^-r0JvRFi0 zoa8TO&h!TZx&2sz9KVOCx}w;gP!)4B@cxkXpoOGPz}C}zNikDk$_0iz|E;)j^o_WX zlIOpXAGrSeR$!e^v+qWV8F?M(rC&C+;wbg`@5^INt;qHCLJa=DHMIicenDFKMN=!B zRPH@2P=-f7w zwEIX%Z8ecnXZ0Nj;FZl24g1s(jK?z*^a1Jir={1YvXk~~jzQMjMYY`yjik>NM!i`=~{(LT=->eNuLvZ{NCEIB-j3UgD z2;n40xM04lQ)CF*%~xG?9EkE6ydm{c3b=xLAwyoPyx*1wT~?WQv?fTNqZx&}NTYOA zjvmJ#ra8`K1)LPfa-^+7VV>5kqu;2<8nQf~4hRtZm|73Fbtm+~(P};hnmE69CX3RH zP*Pf_t1Cv5qjq-Yc_(7Pf!Mraaze^OBWsGD;9fAz%nVxD44Uz_a_~4*11hAIQBE{t z9Z-i*UbT4QR-RpuCINcHNME8;Oo?#~U*!yO+WByv?d)`6I-Dh$w9mk zZJisi07oEZa@e|r4vZ%6L2mEhcz^h9j<%qIv^itA$)R#fm-ps!EmtJ0_J>xZXG!@g zBHtS00GDu8v?`<-E5rU1HAQr0Yd>G13G#XVpZM4KD9V*pJuom%MEnWo-Pg!2QrT+vZM zCzDrHS#S^s)uKCW-ssaKFKI(L;nN-V32erT7V<(rd*bwguwrH&YEYo>*3LYoI7A+T zmc=u9U1>EA(6$thcAo9~b9|`t09Y(|5;80bhYN!siuixx-z1NGk*C6_7^cQFqn$cJ z%MTtDwr2)>(XkRY>gl+fsLWT}vT+A}78+${qv4QaSN;x@|RyLH{y$ys{l!;L)<2_9H4Et6j27YV#Mw(askRVfT4D;Mfaxc zI%?CNAB`%b7Z>^~-(Y(e!nq>{Q6oFpw`AM;0^AUuGwE%3ncgng+nt;h#QU8c04U(| z{95?6^3z^E@5)(~qQ<2_KVvIANUicsZOMk!7QbYlm4tzblXb7tUwOZOX+BPeXdM=iyjgI)xP)%QSn8ty%%qkC z9!3lWyQYww;LQ%2S7S_1HDqnKX!LT)_tV?;9r_01cY=P7f45Ht@h#fUh+13gUDMbr zeDC~VYQtaCO~dm^FJ0jrd7;mbNb^$*I#N)=*?BJD!_o>D7Za-t*%1`^G`j9c zBIvX>tU35Sgpu6;Q}1SDu$M8`5HMGzomHZcIOj4WOCCpcT5;xg1Fgsk7p=59?m|ti z%q<-GR$awcS9+$^m9pwe4b{!?)#aXPbxy}sKQ;5U%)n7#`0?bSgOW7`^P|JIO^oZ| z&dd!*@5UdGb|m9>L~^gu@ZM+#lWF{pFQJK!Uw7vfYdHWBCd(ATrQwZ6gx)CCZWA*~MWu4^ zlA42;w1Npr2ejz|366#;J|Q?_s6k4)bI*`gB&iw!bIk&n+4q&i0^S=7WPm=D!wn5k zK-tibX^F+Nwt!MwK0!+*Ot=ikGadocFbf~(v1D*h?*qNWllEL5VZftucq?C>k+gxC zaL^~xM{)s4BCoUxPZ#&Q^s&+S0y zwmWg+PPs$)yVDY-1|)~NKv{wd^;{Jz>YP*`h++;v81%$!4<4v0g)cH1wo0HtA&D=o z3Zynk(*hzgk6M%QN7F^mM{%xOxPX~PWU)kWHM#ENv=Y?}pM40kX!5$zh_zk6)2ma= zh_&vq{a)HCf_;j+5^`x$leg)8>s{0P8V7sY@VY}20!&rN>NKt6aqZDoeX@>`4f6k7 z{U3n*H+qcX;O_3xo${Vgcd|UYQ{Fa=2=OGy+4(duATm7)B$^(D#Lu+neN}fxhEbPf zt(yqalu-ZxR$r6Mk?1?1J^*@O(I-% zp#RKnR#eF$jZq~XQ>Ip?9dz*YLyTg+_@6fRNwxhD5zwFc+r!&APcls2>ThSYAFSKQ ze&GtwY(Gf1_xanSbc9!!e8k@#+g{P_Zht%5WOwqlpSyRLX_IT1{Heb^P8(dqK2Y=gc%pm!!znv+M2cgf| ztt4#njmKP7_t{A$Ve&42f0AYq(SVQ?Gb33c;ti9V{OxiPq8tl;tI%vNZJ%bjQ!^_K zmTO!A{0;SJ!HH_^^!tsbt`D$3HgG-N7Jj$i7Ir>O7+nn+aBl9nd9Z(n+y0yV<6Pq` z0dX+A-&+4|AzU609x^We>b75NTxH$(LMlv%YjT%mu)-Vrh-eUXFVCCV1arYRU;85(Hcku0QYqKVxZ$nB-kk*`pnfI>DI>q)+q)kdC}P;;e?RSF=c z3JfcGFnfz?^cF8`Ft7ZnsqOg3$PnRR56TIFNpMFZIwgX>pD@figj>R4!1 zpcvIS&e;*HzV|O5y6lL=Ef_xkf3~i8H&v+a0m>yKV07JrLK7JLnOBxOt zB}NMVhZCBBn7sErZ=7(j}Q?o=h-$?vGdj?EFAT5}Q*C}Zi8g+Yc-tHC_Tn-XoE z>Qv{LKQ1nZ4$vOjJBp~P13xUO18XCKrltr=jYtkXqhy0s=}_2URdOVSW^7|E*-K{O zVfj!+gN4_TM9!QOP7P8PO4k92=4`HVjg18nLpC%9bEH*Uv*{?q^fCPhI@6kK^1N*+ zznPg0x=_>VyVcKtB!S9CzYcEX!DSIA16KxuP#gg%kF~~LZZM)WwO;vj=%BoORGlPIYeDW)$Lc)pH99I2$rNe8Yv4s_}V5J&c5<&$A&U=U*~ zGZ^OX49v+wTY2O*weL`=3^D|3Gaj0PokNdd43_s#JlQ#wcW)wDVKdzPNDP<}h0+J&nv76x3+QN`7qmsh^> z36a??;SuE@b%s-&KOPmKkKdiQ-fjA9RmZvDoUeR195rWpl;Hi3sN6=Q3S*&i2qcfoBhG1Ijr_P!&Ec2U zc#3|}M#W*Uu_=hTn;f|_$?t$L96vvu!%yPEOq3HmTeK1fC;+xf8*!`(^OX%LvXx;u zadEVA6DF7I?T#u=4^*1Uhr%t*K=Zg90ix){Mm5f_7wSa2xwSj0v<5{ps9fYIaz|LT zM&W$4mrova4OD}(C?kZf-vKdDfg^^na(x)q=b6I$l=l%4U9R#`iR|%EOi;IfXyPE3 zT(Tqi`fXs9b)qYhZ}|pb{S=ONj#h1RFfveXOUo8?!;B>P=-)a#bUxZy&Fw_YMm8xkWSpg=7@#kYeBqu4``|v* zBoze$h|p^5cQ$h!_UTr%j$@02cd*8V#>fu<&^sJU`dlA+)*((N7GxNP%D`|oLVQ_7 z-%QPr8zc`q)OJQ$r-~q%^$w8S!q$136PC5`0%_umh58Z4^mnw%I~pQUt5kNSfau1p zYK~lPg?U?NuMbrrxjYUo-r=|jwML^11%Q4cWD4lRKR}Qp9JHDf{c7AscL;O)v?@7a ztv9y{&Rna0ysc|#{~Fr%IC4m2!U+;leZCQ8ihqbE!x%beS|^O3HVtQycC8!AQo>}S z8es+ska9Gr$zS}@wB}vO&g|k4wWEz$WK2&l26@9Lx~;7lAlH5xH4l27|-2vyyCrSQ#-S_Yz(&z~MXZ$)iF#*LjFt*Fa>^ z6PU4TQ2z*S5h?R?t$Jb{;t`htuy-;=I)ezJsQd-Uw=MKicEv%(bDr>31gB9$Zrw27 zh{oj}R6Z3-I#m7~@j#S@NJ?6#ueaKA7G6$T1u|A7*C7qdFmbD_ULz=@N&|{Z;;};y zjX(q#EQmRw>lf&=> zi0AUXX=o*G>5qj`QG$CAZbhkY(Kr;L>?tNfQZ=A8RRdtvPL{VDZ1hgtqsno*sP$BAyJ9r&M zuzxE`P(Jx3l|s554k*myXS zRQXs3n?{fd_9|_%GoQw)(p=)HiVy&wEo-#YOq-mGCW#PGu<|jLbuv^>kfBg;P-j|= ztSU;N3S(7)Se1O4nG6Le<1V>!Cxjzg5;u(!Ilzo#Q9TchLNz(1pcoE}K&5wUX4_cc zs$eXn-DqSO0NoKLE13JS=iH>!trt|VF`lbW`K>6ZDbdA_KvO}r1_36jN8TnmzAP4k zE$J*QAUYiaK`0UL-N(k&osh8a8WD$}-q;tCvwo*+9MK>q?j@5#Q>7<+omM9zYWBI& z5>=&qk#f%2A;cOzrChsMcH}3W$RZT2hO}q&Rl_V#t$IxugJ_Wkoo=KlV2ocJ!df-; z(0cC>odLkq=DbUaiAgXN!nngfxUPmY(&;Ax_-=qigGuqU>2w-QqHU{?NK#s9IO#Ny z2TF|D;m6pq*9#l*BXv(I7d=DQg{1>5)GM`HoP-BZZ$pWEorpOBARQ=1o03Mvg-PVC zQv?qrZ_`%b!B1*5_a3DQ`P7s20Vb*GH!Av&ZlnR}MroGwh;APAIZCr)kL%`PpQAJ@ z_JnR8^*KtjV&fm-=9fN4X;$oNRE=PB(g@oKH92+@%{mQO=!>H}~pBPn2^{|Wj6>2s83#qQV5Jw8WiR_yDIIbP0Y42B(ZUNCsx z+9*53yTo*ixi-jg`Th#X@f>p83m?xrpA!R<(VR;=o$TnrI;Eq^$HmGY28om*RMvtPB>Wf* zf4!NND(uwG3mOm^qrU%Y3^J0>A&S5v%AQO+s!|9%o=NK0DWq7n)LoIQ7+SV?Pewuh zf;>KZ5(8&e=5nek{6+}J=bo^j#=CK_W+wBQ*Vs?tma)=1j_=XH>K|T{@y_QkOhYqD zhiYf&QKc%HG}tYeiO13bohuFB3l(#d={w3U|7mD5QZceXz^JHD=KfP0nRox;I44K$ zztFk=!p!{#uC&M95{s6q457x{!Q7_JGc&>9lN?*-6H13x}f<8s71M@x{Qt&i$NJfderDHn| zsh3|k4jDp-DUWnb!c9C?h|7T;hTUdQov-hYPilXQgI+9W|9rBc+(bT!2@iDvlQG2* zv;kqt6my;_`eB19rmj2(V#*W&B4bS{`6>K|aLVbPekpBVy+&(>LNgxAefl&HtDF1^OFZ_erN<1@rR)^OP=(ckCh)yQ@Q)8?TD!oGhtn-Of>P?4UY#m+{eU+^iva` zDeI=Xu^R6mS7P4Ck>JI)2_VPn-c7gOt>7Ia*)-%Qr}G&d%TBJnQi`nN*^PB@iZJQX zuKGD7xhw!HmmXRs7s;o2%|%4&a|G<%{0DJlnq~1fI6BajNj^u@pj^y&Z;{?qu7%~{ zlDf@5SDFZY9mX*xlt)G-pLQh~NL?ileDyBjF}cG(4(-Z%!ZfA&XYhhS(hMP@hB~01 z+trxXc^#~#nuM!jTP-%88BEJVzbXYod3k<5R?T`+ubB4TZ)|4cy-o(}e1f8@`)IB)TCDku z2IC%R_OTAc-krdLL(&Kl1!HKN7kRjRZ839Yz;}hz`g9Vwz0TLWeviv)i7mA@a$p_0#=OlKLITlgtrsdQEXVmFDl{BA9#XYEi(Pq~Th0@w-pFk*1^b>rx zF*Fai2z&sVJ0=r)NL3=@xxo%ngm)6s{vEdM5`C%~a3Ay!m)qP$9PB6`#AR|g*v#$h z=ij5&%p_M5L0&2XgcN1S3F|l}cV-#69p$pmV1=-J9M|p*t)mSmp?CR#hV;3flwYKB zSO)vaZg0pgD}ai!srOJPP1Aq6tVt~3E@!Dte#L#u6z$cmWta9_3T}PcUp`!s7j%$t zbwyP(Do&*?`~J1F99X~HX*gg^tcP36kL3L8tVTm@X#}81MD4n5_b43V@8A0%B*+JI zfET_rE#eg#BPzB-C2f7JoN0y`&)YjtLB z&;gGc;qTSg_t25=sLyE3h+qiPLi-T%l?TL( z)m-_#3ca%WJ0+fJFETkv=v7EBl6``&bbbeqb#4dka=A}T(SE~&%-bv@0-yl@e=aQR zaeTdy1>%Av&~SlCM?(6VnRHuLaGYWLJcMQ8mu^JVzTs*U0nCmicP?fEP>@igNctRMhNu_y)e0U8UES18G`y2B(1CFsSv(v82G zIO-)Z3HFmn=*e=}B3p#mQ_NxN2@a471O)`E@E?$zgqFxw%B`pY`Si#bZlyI)45q{HnY4)s$-C#DG>fRxG)aC)hPrwiE>dh7-hmz3#O4 z=nN`#NM*|)SXF)CG*V+vg;lxD60quVTG7E~+8%7E6~v0PbnrIx*Q!5>fJ4n6c5!DN z){>|POel9%yJ2ZpMb7{Wan^fnq-yH5MrWVSV%9RPg^uO*LsS@fVnHMKokNIFq9SCN z>l@@!x^AKsjXef(dQ$#>MC=uVxUox6LPb9AKcX9m-%ertf>`xaZ2PfqIBp>l3(0E@<9+8iz_QI)>_EGHe2MTSnfB7p+Y91&@X zXGBiH>><;~&W2={AjRpQ4&MT6@KwMmG84*!YDdvfwZhwF7{_?xsL}0G)N>7q zYE&E2S{##c9E8fnLCpUrO&wk!hpxBl^lfAAGdquYXgSjE*%)y1p1XOK;@El2`Rid> z$s!)i-kRL2>&L~z>@$5j2OHg`-^>}W3q{#bJHefEe8c?nIq{7gO{cx0_e>2qk$uB6 z@Oog{2XVplgL`^MJwDH|V6Tr!tCB4%tCs%b<4$gR3m|qRdz4@^ke&SUDz4v}KA?x! zam`VqA{N0v1%}6{9TBa;=J1Qu|1M2@&So8!a_ zP>Lo`ri4LGN)GEsXxV0;Y2rk*Y))g?Nh&85vS!evV9@Zm23~^R{J#daz8g|;+in;< z2Q*y}q94T=-EV1YJ2@e_Q|^kdic;mw;KA+bgI#VQVG$_0q5)NoO0AAZlB_hNtNOP> z*!1G|a>2~rDwOLhAtd^uh;vIZlOT1uOt{jn7d_Acp)o1A4b3O@oLYYP9S3gNnzY8B z&zASR^EtHq=3=hoNX3Y;jR+f!oxU%hJ6(nnM5{|Jry!yD-nq92WwfwHqE!ltXf*)q z8}=x_7Mr>WdK0JCIiLl{vRDStmzY$W9oiYq4eT6H9bL*fpe%y8b3lo_9*s-GR??jV zN=Z8hv}EUis=S>8%2_sc4ydYh=YZzx=YaA~gyq9xEN6!f1B316*J&yYLK&`#fa%|g zm~lBekw^yx8RT?8aEsN_#KyJ5{JVYau(Tl}#4-P}(?-))JcNRrOEbAR|6o|B3vh-2 z>^l^aioy-YwxGE%4G|M@(K+hvj@a$3G@Gn~6QT}?cPs46;(s+Ix!`%5#pk+N-C3kk zSd|N-2`k^%E(Xe&M#jR7)5s8r1uKU*Wv8^7W@;ldR5H2LiA#GD(Ld{Y@}(8JIYtPS=jO;wDi zwauWJS?8=7V|tRd5^~fD!}F}qi4)J;$P#CqMMAdmHH5eEyyt_P zeeSvNlw;IAY1ypYU?yFAtBV+ib3Ad2yR3Z0eJ^u~Fj4uhu>9rFIcdkGG1WCg>4Gz= zkhr;Q!X(x%gCKp2a0iahaH9-`gp88ZX8%=Ez5~k9;-VsbVm8_;)i;C;P|SF~j(_+p zsn&3KIxc6NK1(W5oMaz~wc5x_cvIgYr9o*_MppYaxa@^!PoxBR$<5awFaHnna^fvU zjy|mw2j&0H=i0n-?TCo;5)d}#Zy(Pui(;tB(TWo2NCc!veeO#Bq(iC9)i!ZDuS;kb z17r-DcY=9sk(Ea<)66yV;8N1q1JLiMU{!iCIt8|^XdPC;Wb*SVJ;v1Ju3rmbF4{>+ zXw7QGHoW5Sb^OBklynbU(?@q3?GzFm2>7-phalGk0o=0=fuv+&c~Ou#Oxvr7anTG^4Vs1%qe`{d`0-EE5Yo0b79{GEQ}oB& z>}3%T#h9=PMv-~_wa`0Wr5(ttiZlpCdy1cM+zj-hOsO8x zmQ^Z{wNO@mON;3)w!o$-niOFkVga1as}HfW;?MpAW_%k1XnKkp!1}*2t%w4u#bm~4 zGGnaDQ0vU{HbfH=C~jl#!Z7rok6W?G2(bp~s5$kRkF+Y#buTPabtQanH9}}{LWg8j z6GxSQb$Ll*#mx*gb>NBf~$wR4(ijoclk(t=8aO7169qa)uyEk0hy!SXX zQ^*BDAofs7rosVHQbO&Ukemk)RIoETTJ4ULLJInBot5cY%lBj@xRZBY@$!x~#gG@0 zjXRQ?t~i|xcu#@LvpW<90Nt08qugul(l|;iG9-fpHCVM)iHtbA(RJJTv@Vog1) z;^a@LXGW)y9me!wkjcFi5{DpO-)vmeeV!hMYE#jZQfHfz3NnBaD2yuueItuHXX*QU zg_tik=mS~hWzlSsHi+nlTfUV@mu9IBP zayaSKW*yo7NW!?Nqk|!CKF)^--j+EbOaeCwSO&+%IPh+&-8DLjZ?}HS8>}HE`G7HY z^gO^6LNi6P6sMSA0!@e9C4klG*1r2vjX64Ifq+E;fyKh(XI}#B@$^~ ziay$V2@2VXF9m#r$pZ5&#wvp(3H`JA^sDE zT)FPXZTANwcw?^^LGgk8 zmijrx&#~cvBiTG_76og5V~+D5mDpGCZB5f}QI<0~=lvx!y=T z(g*c`z-Y0@ykfD8BAAle6KOM;r<%y7u?P|11)Sj1OLC3q$g$_U5g)vk$UIckUf8Kq z6Tt!-17#@CWa%^;o?*jy&fyd&3~WB-;!G2Uiw)nLW2V4J1v|Eishj#_)wQE8P(53Q z#AEVtTgr4Lj#_0k^GZJocDpW4*MbR%K<|{A(Y6Lc;-EA719uk|i)jT4Qle1_Ve`ZO zZ5VPqua^&SCg3TA^rk^RaIgOyi(n$pV1S*JDBv0a)g*e&DVV_2sR6mfrdvee>b-m4^!r=><@?iK1sMdZ z_ul=T`4^z47tnKbFeKxLKN~e70JZ{j&JhuDK*90xJ@(powSIm1W!2K^hlBBIEB{`3 zD*-LZXMkrb>t9;^iW2r+mR4W)&0u^#`6cDwwdbY#%WqTu_?N#kfBe?u;b8l|4YXT< zdp~*8G5aeq#Y)_C{hz)4NQ!8&X0n>3-KnYZpSi5@z z`&r42Z})y>hcV93^cWM|!WJoSfXau1L1=uEYH>jJgDx;N_!Jj>Gti5W}UpGFrg{ zLM!@8l3I2}n+vJM$TAQnKeR?8=Pm?BUUrS<4MqBQKefQG4URU^vWS&8O)br7Ez@T< zx2yD_TR0bBCbCi(6l(Msi+nDR6mDMb zEYYD>$FJbP5@6Ot^Niv`m1k6($&NO+6yvVbmB~4;C_LU)up@ay@o04BBIIzKlTvOz zP_Dc;lq>HI<;r_QwOashC_Y?`S<%E%88Opb2~q$is$%fK{%YBZwIEZ_fK%?PlfNB< z5u+%=g-oC#Jla5ARQUlXv6wK@3-nSNqgy*Qrz)rK?m)B`r6{y?LLFjMaWzN7-m3}( z_$_jw*(qf2x0$@GCY1QN#i0g^XeXePnB!G8n(K@Qk={|+EEu)w>DI$7>EdQbUa+oDwY!o#fWUcq$VC1-+6gWi-lhu254$=7gH9O`PXz9oPnwxOtZp zGhw5X7&bZ*h`+}U0f6rD+*$_#WeGG|8x#7{l61wblk^4C2hD>Va~%hCf%C3uBIa`o zv&?slyO~;53b<6N{Nr3^G`Lkov_r{z`DMIUE{*acWo1}nIqt%{utpogyL4CoER*h< zPk(X_1v*XtAtA`A{&t7mH6GE$bZIOwH7!sNC-d#44_p<^M^u%utmuiYre5g!>6}E= zMnB~bvL)wclcZq@nl`*vpxD9WcGx@bG=(eqRa&S*hF$sJoAD`H z<#{t#o;OocyjcMv*-DknqUK6ERSb3lj}^<(8H+Ft1WsoFI3>z+R|EpWa(u(MGx1Xj zZ0I-z!5&&)?4g53$9!{a)K2tg$!CjB322c8Gl|2yBzEuO*bc-o{nyD;?EjKb%O_7F z{ECtZ9tjdL;V28SdO#PPf8KF1I}We7la93P95&Nz$5!y@1jv3e(5=~m)2^8*|cgZmO?NbAHBz!n8Ep=-zi zh5+3{+C^2P;_#BAJRT~yhUu-;Cn-c&ko>E{22e?!O$PA`i-=AEospN$6@O}I41Z7p zQ^F*q;qa-khU9SA(uL?G6#j%Mp+ss;P7@?Y!x)a)$JqV2BJk*<8|b@* zIc`vaPe&8Nv5pHy*fB2*CvuyIpkfOUq8nwYTD|X(b|xa$y_S}}_g#16k4Op<<2=K) zFe3!_c=q)LS0c0&9FQ)d#d0gF2QlGUAU3v8MH08zPh+kjx6mJT%5|)M$3k7TMGVhq z9@w~u;6-Fa^5w9OV4(6(#DOU-AjILq>a?-xH0DIrphUH}&reuX2CAFP3laf>i(b7> zd(2XjWfVh)WMgvG2#2)5@u3{i*O9HtxXO76T@*;PAN=h&4TduM3TgYPv={D7>1J&d!*X{Y!D zjBe;0Q(+t`V{3tUpfoZrG0k-|j?b-3XN^YWM-+~A3uK!1K<@&FXs58*=DGG(fE$q()W_e0ol%PTCFDDL; z+|%mJ<4ldGHx90KLF8H&L}!RnWF+51$K1CCL?F_<^OYZ>RM<34PT)?#Vxk^dWj>SU zyD&7(C#x+nQuUZ;y1?gTjHcNatqk!prxQM1&2t}TxO4&SB&q1@o>+12F5Zz8c9#D- zm#Onb7~3Q;bxMTWHW#>+wz**B$%$>>br6$;c-Y|5iM10KwV4HM_{}Vk7*nh>Oz5T7 zL}8~v)j)B+I<=N=YEfSu5{$zs$8Tz>=SVA&Zf@=iHnn`U4t#mPz+)6@j}Eg&z%wQS zo`bURg=E0Xa^mc*wzMB**AEigl=J-egX6&(`oYEn3&_WN#&_!WGYC^$Kc={TOmY2~ zvfqBt({|k3`nJ1z#WHt1MZL-?Nw*pyKv}7N&Z9D=sWG(L$ zFNrMBD)BFrhUMfjrRsrw*@tubv`Kj~MZi{wGey9b113o6(>WK=>n5p`MpY0G#Ji@` z;9^EoOim6XqS#pEjc|i?qDH|X1T|=RFz9Scv7r>DKmrY&k*mFX|Bucg#vjBf$pO$S z&gFN!5rBhod_c&{eR2E(|l(jrNQAHPf&y zr#%spvC%gQkgx)x@M{+pt6GewreU5=Otd5qy&b6|F~bNonplk*8#Ez|r$fNF`60+P z41rc$tU1jzwQm|PB@kwhr;YqHw5@zenWH^Ulcj}NAltz(;h14=WbW3mJSTvtaKhut;@f1OkB5lht^;9bmxg<6{ zkY;ErYv_=j%zW~wEcs3W=#G+)D3^35kK6*5zAP-^fKK6}IIYlcisbsCiUydm$$}jK zh~|$J16*hgV_w=Yn3tIt(uDo9j-eBTZm}^J8Hw7mpSqA-_aPTlLp)PlV6{*#tUT{F zz{KFt!D=WoG=_Vb-n*mx!(2eiK@y{$h3Mu`6Jjoqvc`pI&1R-9wVcYcJN~AcA?{49`uy$BS4<;Y@Ww}53L0Qkg{~azrIKyWU0P}&z+t%>>!|&($6#tk2nuos8 zCR!8iB%l9dRwm{o@BR~#dveLQ-$(l8sPbza?EylP&p+1IpYW|f511zB<8K;WYerLY zX~@cWq}T)8F{c#nC}fB`x)ZNSU^m92 z=m4x%BVZ4yGphpXu@Qx}MX)wlZcK=?e@(n5NP$=CIgMDG)*kj@ZIM_T%tDjS%Dd^) z%-SNcw!pErNUTjUrm!~22d-1rCQD7E;}{$I>v6GA>^K*bloM`w#W)v6Z_2q?v?Uak z6RsID$GIq`6>yn#dY>8M*oX^{T@Yw&36E_LDB$;eWH+pM2IU*_ESlIbS6jfL6ha@8 zA8Fbv2w$rGzEN(Fn?pnTFRI|g5H>6$_%3Hl5Sqso-(HX~zKf-kn7#YFLJ#Jo%0ZHQ-Utj#r&ju|S34QRwq za0Rg0Z*sU{r<5R|>nTb^C>NT&Su~vOId;)-PVt#67On|QE9Ro$fcHQ^iGfFKOo-Tf z4KEN;U@|-Js$T$>$k&6M;ak?11|{NIyUH>KDB_YkvWSTsBcI)$j)1-wLMBPheQ7jP zM_4o+Tvk%_6@qM zE$4AGbqQO^;v{S(Qq9ml^G{Q(AXr&nu)xl|0z279FGV@hViURO7f1v;jyh_~m#iep zL96pp6^X}}k@ex;R=Pl}tO-+ZjwaW_kDWzIksal`!?55!Xu!6mJoeOaVlsHnS+70c zSer-`q~;Y32ysGR{Xk*`#;Zk@)2cKa$*qZNX}WpkR7Bk`(=gfJdMvob1q(ZMaRhPE zqT4~K)|P)5D7-hM4hT$8u-TO7)S9)ZCGml$STAsGz~StSrf28TiVr7 zJJi8{9SY!>7E{l?#i$$(J;+9VK*u^T3Ym#h{(6Y7(4-RsYR5{9(*#(~7zc%Cz>eK6 zfxzt&2tU4hZ|+S-{l=9cuz&%e{e}$!;lvFB2p=>NI>9W^AW0{R*ezhX1zZoNvF|nk ztCPHh0kv%c3f7deYg@W zAVn;0b{1X0Y7PrM(prM{_U7jXB^pL)k@aFr^6nZs@#`2GY#*GIFj+-37HIUJ7{`3C zA_;j~m}&N|vyZe?%#wbx=bF3KJLIg%3w6-m{<*AbmMOCinkk^xg;&KIAXT7X#Vh5q zcqN+lE0Z~%x_Bj?l;D#j6-A)S2O29t)xflPCEQnXSLWhY#Vh3$wiJ_S#S^D8ki&0T z5^aE0dZ7qB4MgSIM=cTjrSG|m-ANkcTofw$jW(gp=*)$#e^s+*88G!42Zi=ROn13% zV;`jtH&3-Y9fcA$n!glU04+lcQpx39hd$7h(`mXOb4DklFqjse{}+-uf`QeWsS*fG zUV(soVxF*o!MAVVx7zYePV52{k$%vgqS|19{)6gFI(^Gr3vwpA`DP3Y9aY4Nm@E=T z{FLgn>jcl5-1iFO5Ro8XXpL31(Q0ddGDF)86^d-Gb9iaoip9k}UVOe%?2xE;z$pRd zXq#$PFk7`?&IFlpC&^e)zE9~g0*tj8 zKKHKkJQJn zVv4sjZ&9+C^X*DnKq52zGE8Gsqsw%C{>Lw4bb?n?cQJ0=gSv#K_L>9|JBNb{(JVAw zF#-s9d)ZZS%j(?Kd+=4Xl2Uz1Ny#>!hl0&m7O+9#kkl(MxL{jxeq8i>`DIL|{Aw-L zS6)NKDcxx3uQICHQ_ZPo;}Xx8U&d2CV7T=t;&m!j(MUjYb#>eVD68SawnXB};g?rQ z>Bf99K~Y{Wi}Sl~trGmfzkKXr6>h0`%9@#zpbK=u+6+%Z7a^U|Ds>BlQF%$2idF~b ziT{8+z`=+xgjv76&%<}XG7Jj_4w_?&@F#@rVKfRt91~ngi{X!cFkgUN%N>4%h0eU8 znB--Qr(sVR9KWKoXuz?dK)^AJE~|zqaIFH4S++->GB+q$%$~4I25ej-Bj5~!L`&HK zYhd>)`kbW2R4ii5A@bXdWQS9kM<1> z4t8&=b&rk?_iY**t&MEz?&-g1n74a3^b8FQ4R;Sxfr{y^T|;A|W1DKa93I-$Jutd! z!}i*6Pi=6NhO#H!ySDLULw9fQaBXB{)4)(qKQIoCboZ#9o}oeRdPcX@`Yzfs3XHX$ zE!};C8~S=jYJW_gp9!v;BiGqhHE{2+xyg$ zfsxwqSZ!=zfSxT|xFGFE4aj?Iy&JZ7?;05D?(N>beRybRje*#ZUXF}y-#)NwWY@M$ zLj$xxjkUg=wc!*mZcJ2YXn3?n9|vk1wh#C9)Yfk5dBs?5co%pW9IOragx;ti$w1%8 z=m!6EBnYA)2ul3&{#PJv;aB9>n5QzzYvtF*@4T^1XN_FcC!}1|J+i^@He3VZ4MT(H zDqT z3>TuBC#X_g%SEp03%OT!dxl1~UEDpgZNtcD@5+?|Xk_Ke(*}3;T+CpuT)9J-Ub%9; zCyTUGJr^%rv3$V>H&%Um1vIT(d9G18_iG0?57o;y)|3nkoV|IpG5@5Vq2b!fl|weW z)Rf5nqwYa?R=qkx}IvkmUa%9W@1 zc}KmJ0LDf%ZR#8B7Ft$Y>fqV1se6QO7#@s1p&okSW`%!#%EhPIBuVr4ee<+SYCZ53 zd-oZlWlr1-WY)Ku=#fEHLW@lh0na&ZhSE`^*Jk8C_pxe1oF^yi|G72pMnLTZh<0wX z>Rub zOnT+Y5rn`XRDYhOlh%9w5DZcv59~@`o=|S>Aj}!r(`|#^jC=CaeP3T5+hi zRjmg_XJD80h1X5O<0lH{508zE_RQ~H(!G4)rcJ#Im(~_^_b%VGY;o6u%}cwNEm+>Y zqG!pno)t@1bS+uDe9`=YzD>i(r}@UG=8p{b%y+D6-tb6pPg^BeN1czL3`if?);BT& z7mGLd)dqUwjT>W5CKl}TNu^+zri8* z4){sS4N&e-%Jq(IAL#3W; z_xc7=_4|5bN$91ESH}5vM=zoo{i!|C$-(@l^An8v({s^{>NuR=5&UNIo5ioO%#qx` zh~H8CVt$?cs{CHe?`VFFWsl+hywUD{aBj2MAd|-Jr?6&q_H3lLHc-3BXvSYj#~j#D ze>}2j2&KQ5CzvtEQg=#+$8jxv@VU@oBizq79iG|IOo!IRbR@N4gs1d+WN>WT2D4>GGDWWsWpHpa1_P6|+dtOs$dK7b8AQfEyPAc=`=cIz`zevST!>JCwc2bQ+#iuEp)4A82!a`$& zdIp9@YN;Vsx6%yU?U>EAQ8R(CO)!(w4vh|_2Bc%bRCT^9;S6K0(U-PuuRmWcgPA_| z$vSl=kI{%%FJ;^GZR(K)%tWef?;hR4wWePWOm%46CdBEsk&A+(D;2YwRIt%h?&7)n zej=%4q>Vr6IsSfPz7fs7rggBL^1|&Uq?(iIeOgcYd}4iReo9kmId7n6^*lhm8nZOt z!GT>pNn1})R&~x zR_c=Mxs+6M=URV%%8lxZMcR{VEXX(NfD|$DrsP!ygxM+T= z?$5yOJF&d#5J#)$km~)@&OHUIGwvO#jiC08##_2~)}#rd=kAb+57pqN zv`K;t=VOO zJ9bnJ5AQNRZkp>|i6cxD?>aDw9&Va5IEu1txVUdORr#eWqzu09ko1M*B{h3`gIvTL zoMY2J8I>PkgCH2#1kR1G+a+;$W3pW(*jRt3j3CEc;oZNT0 z&M0j17ftS$<`g6c`&v@bqMSV9M{85!O1tUFuGSj_yD2M~2SuVEc_khdNuv)LOC2If zsl1WsdgOYjyIZN_lhh?Ve4bQ1=&PjSJ+JUMeKo0c$>sb~9<_pNmO!5qk2;a}_4h*X zsEvm=^C-6hlF3!C>%zU$#fO@kZ{BnYzQ_9-3qKW{;_Ip1KWkQq#jMhKlTIh&VCh5k zGkNIKc-TL6OxGm~yO%6k*tMiPNo@_cNaEF|^PBw8#wJE=KGfYoHYr`*c=gh1Qc6iP z)=zM@r{yv?;J$7>Enl7DJ=Tr>j5_t7-RyMF)WgiMN%nEfOMMYL+&m;j1LhWw?1GtZ zb1sXOF_?bsOlQ%j1yWv`7P*vsS1v? zS%&?yt?we-dNpYpS}&u4Z7e#~eZu~st?~_YZ^9km76{IBHVjP-vxI3*f*Oic-F48* zB3Ong)(Cx>G`)acxs{f|Aw%MZoi!xSCXmoKI5@PcHWIvyF-bYcDy}7+SMz(eUaeDj zSAQ=A=eXm@X3pWAvMKMDPuZ<5)=lW(RA7mcwI~ zhle+#+Qb)csSU>TtY>Th?GTQ!X>2nJN<7l{#@e$-v~&K=?V7i6!MtV8f*53`)#h&- z>IKDXy^rvf=dVFzz8w6>6DZn{*8HQRD#5EsujD5SBfb9vu48`ZV$5I#ZO3Rsw~YJH zgIN*Bs*4?eeD+|cqcp+#*;d;&G`vg3PjDk`yapH~-DM$qSj>?z5_gXpC@E;;q%$YlHe%FG9i=Jk)FKn@7^(m*Gw&wIR*1mk*nP;87{+w5wd*1o4yx_uDz4|rX zn|gX{n=jhZx3zy@+u+dl9m6A|V>>UtWY-%7yu-r@^BJVn&`X`kt!7P$Ve+r=;=w`#U?%voxjt6Rk7maQSg0BOY^o8xDuOpR}Dy{mJex<^! zdnp!2JB>J<+3;<#m|gMq?qQ4q=IOlHYwZ}QrVfm(jJt4U^u`P3;q~WzS;Xo4+s8Js zYN1$-7&8n8P2Q_0b9h6Uk-m!tyII>|Wy6YGO1|`;w2m#^BU{q9ZzS(v@=izk6W8KY zChkASbMctf-J?BQ{L}k+CT-vM5l@Tt(sYJb@;sGe7jW&{LV{U$ksaOJ{Ihe$HUU1X zxIph8otHw~^z;nibPqgqv}o{(5=Zlk)B)PjbrB0;4t}kAhz%j&UNaj31zkR%m`kDjqhWY^G!8 zk9B-FE$5^fof%>Y-_#@oo|UfOx`t4X1TmO)kk#*dYkqBPtd5YhmSwajYitdv3+g7S|$Q z(s^1wyNKW$d@3jlqk4w=KZ+7Df=h}pJgx@gG3X~NI*b6tOC?nsCNnQSa|lI)1p&f( z;?rvc+Hva|aGW8QU&IQ~k_mYD)5W!c0SMZMs7cn!>$Po2E4?rm(s*cdJT!(zAiaQK zLU*CKl@Y-tCfD01?S?lL0}^kljb2lN+e)Utuwx`7H z#e+rXDQ}hTypdlwzfJu52Dd|MqeDaSfM`c3(Ns;XE~u*E#_{o5FO2QFmpGoazxN@F zp+Ov@n9Ht?#s>}ce2aQ!3LdqyWo#Rvr*C9Zh^JXQPxy9x@Z0%ALq_A-4BCRfp*9E= z2>JZq&D6OF`m}+);H-HwPN8ml zG|p^NB3?*r1Tz;s0Aj0Uv=evDTd-vRz*FbfsXJ+?`(qQ}|N4aczw`Icp1vkCF~rSH zO%KkPQwb!i#dqiO8w~QRn$@XoD#dJV{yzlAHb+ z&(-c6>l>Q*ntHu`JMn7An|8%-Bm((4bd?o#Y^eoZ^SaEI+B61-n@$ zR{_a~0S6!29p43#8=`$CRs{P3#crGDNaHVCuc7&wz5j=zk)nkXS zKYjU+lL}80qleOHp0wQ8DJNZ8u;@?tNXKRe*QwrVV*{UU?|N?f|IxhPsQ*vY?R&}J zpKia0Jn3~FCfJ!lW%_y}+y~It52T#K1{8rV*F)OtAlOUW;?t)#P4$)WtOZUNUGM!Y zpeR_(Gp!N;Aaji%_RLEwojz8P;0(%0$KF6H-r~wi9hZ*8v>!49ARZ-O_(;o{nzmV6 zBkE&zqi^pNuliu4z>VZ{fhDn>!d2&@)ztXsD1R(Ia`M&JCYuaEUd40i^WLb6u?1xZ zW=P*o{-NYw00z@V%{2Eq@&spnu+kA2K`SFdfV`BB#lzjWt={z-*j{7a2zlw7jn8F= zrvCLBgX3zo9WHn)G5<#NRPitP%QdWL4~?$Tu!u`}M7(lz^KyTAM(q-Rbt(uw4;htC zTH0xBcZ_?7USHlJvu-eYWI3Y~5GK68llw+|sYGM_7n6V9mVxuO44*S}@mXVpQEy6m zdp+eiF=4j)FBUl)=f6p{;Ky`;+SkHFY3>8=gut=}dl&e0;lAT!H8jC? z3GbO*kP@<+YpGlfb}x2z?K??DZ;fMGhi9<&XTbU>zn}2?H-10l_Yl7acu#+;o#zwn zY_s_jAM*8X*0!5xFTI)Qy|uYpN3bxoI)WfyGH;>DadNyvH258DN&o#GKlxW)h~|3f z#2|aCy0<$eX<$jkbn9bi?+||YujgvcC+D5Ac5O@$nYKcqBzU$GJVbfvn_g45 z@lB06K5qMr=Gl8Vi%^6xqqcR&ws*^l4s>JK8tq9}#~$n^(8o-rZQa}JFUoqncuOBV zl~_A;EJB|L#IG|PQn&VlS)EqhJYx#9h&h8HHpaA3#2g0TmOi;`WO~XRRkH@4EN!03 z;FLA)Hhf9RgrCn{K5zY|t+Fh|C!t@Jf;}7Wp63|`nth)M0Q<+B=UJ8*Ray*nZ4(Ay zdh6%~X@$cElVILyK609_&`{PvL1IpD+BJAxFYBeTe$A&;L*oPy-SNgzcCw*{Y_#dc zg-p75qg?qLpQ;u0KC9!nImZzZWiK9g*>Mf;39%Q~@fy!Q^^~rzAB?}})HQ3?9REzK z2dv{>-(0&a@22XPyXsdTxO&yLQnjsLqtV9vPsMvP>L$tdBRa{OgYl42z@)WmliobD zVul79hRo)*2+UX8U@y3_l1D?n6fGES?AlnTO;3gF&_f@`W5UG3$Wd`8`AkRIr@FK% zO-usi@a8}?4CiyGW)XeMS!1uw?=_teYiv8P4FHGqhNJnV_tJv^J-Zjrm+qD3-^jJC5BT@*;9fEz&HoFo zr5~sF^D$_oFZ@5~TP8owJgE}&(dH_Cf<3)o&9z`p@8808+;A`XBH5Vce}L;{6Yk}= zO7lO+b>sbeCzRKHWBv`?ui}@!|3?$@|HR*?tav*{FQge<^3rBo%Y>8*yNY3>n>Wid zJ1+>Xqnvc%n@Ocpe4JGFjUSu0#{F?y++tJpp)`ayu(aj*6S?W-L8 zKSHS&582I6`n~M8EBU>NpLD|XneeMQtbF}6f8WYa{qI5CK!zKiM(l=L?T>kZ0BYMo z2G0DzZ$`1J^T7}%sUKS`=FO?QD2Hf^fCz0EMpO8hz<$kkYT6^{P)ZFUmV`WkN; z8tQke9^J0@+BAVg)uQaF)UkMyHtbE6qn&Ze$X9n2KedzIpUmLOmQL?q>hG`NS?Vvl zmTTcH#pBz#eg{8EG2!u@{I28ISms^azuP|}G1_?#>Gk|l{Qn`>;(6k0jnBpRQhXVn z3}cEu+gaMVEdoJ!m9?e zd}#Z^vU!_4ln>CBd@Q}RC7k~3OJ6vC-?G5$$@lnpWXsSP8~e~{PI{@_$?2I5@Ta9{OL#a$X+qYE8D^0(0CMM|ds;HkO zP76)d#(i|H}o8)mJzCaqOhJjJArAnvJY7BT1yq|Yt@b(2# z@t2kS?g0P#dx&Qmk2H024GzMx<8jB$;p;Fizm+ti+=ulNe|qOn`K9%2M9`(zODGE| zS=n^%-OT-;@w($&?qple~*qOQeVOS+bJE$dp|wPHcnf&~i}E?Bf+@q#4_mM&mZ z>w*;vyB023xNza3g^L$1S-5oJvW3eRu2|HyXu+a|ixw?fylBayrHhs=TE1w-;;zLD z7B5`9Xz}93OBOF(ylnCE#VeL{Em^Q+;gUs57B5+{Wa*M+OO`KLv9xRHf~55`>Omo8hneCdj1UCS0MTexh|vc=1mEL*y4*|O!!RxIyYzF_&n<%^atUcO}c(&fvR zFJHc51t6}V`4v>nMq3K4SkbLxKa3qaCcH9!31<9od~&>C1$^H3`$r6b_=3hG#o29K ze}vyh`Av#CuPNTM#^LUbO!gO1Hof1?z4XR?-W@?&A-ihZdbSLM``~m(Pg^K^96w_H zF;1LS?8uYVX`@eShPaD5M2o9Qt63dHy?Wj;%5za@n(y9swbz5tjM#a} zBGQ8Ec}MVnlvF$=_doo{2W9z!M0rv8lz-8Lzr6l}MBim8f9H_b&YL&y^`?w^%rc>y zCckjHF$lhKhKuESfK)hG44r6>ZX$+oP+VH5ovn-GT_~gwD$&ckrL|7BA4)1(I)YTV zPwS|ATI2?COoyG|C&prl@~)3)^)H_7bjITiq7By~ z72ZZ!&G8}~F@K!jfu6Ag@9CM(2|jFsN2e8W2En&@?-)|l7n3pR{Sn;H=Ere0g+dF5 zr?r%dt<&0Ol@D(}qN6gUeQLfE9dyvat%v3g%g@Li9vxAfnVS_Jb!Z%&5X~*m%XLKy z!iBk8!;gd?&3~-)oA9@V--W-A_O^cfl3mxl{li@szUrE5ubcI~DO1;-`P(Pw&41bJ zUccc7d*1$zcfI=~pZfe?f90!x`?Y_0_(yw#{Ir9PU$A)D$`fC@_T{hN^A0jU{rSKC z>es$`-@`xRljc(_cjbwvty%l>H}ux_yz71M|J!fg*D>vQ9<9CbwXb^vf$ML7*GG8e zD}Vd15C7=#j%lZ@?X8XP`SUx!_@#gR&f`CS)0?lk`Iaw!=_`M8-#>r%j2pi2jjw+5 zzO`qszwp&>*zneOyz^6^`RteO{_5X+XWF5Mz4mp#{;%Kf9pAR&U;cHzv3^y@~wY-@bRDjYIx+Gqhs$qcHaD3Kl#}& z{mp&f`PV;L^+z{!z4NGl_|`Y~p1uAxuPv6QR*swh*v|%smc8_4t53V`UFTgicJJTb z|Mw64(~p0@H;6Y>ul(2im8X_w=3A!izJ1F0#|lTa?w%PPUdrX?=NIRTQLflhoYr>E z)PstzEJpcRZLLu$Dn=nQqdi}U$}PDmhZN2(&MaP73|kIsKPP`mG&joSr?pINUztDh zm<{o^{MKW}?=4(;M|4EXmA{K#T|BgPM(gzU>Frxv+FFiid3EuG!kV@@e0eq(Ehx{) zAJI~d#&0KU{(`fj@taF0MN^}bipxtU6t3JmZANMSw7F5|)Xu5n*XFPMqr=OGTz!3E ze&NJoIAuob_!q0A?c?7*qP;M_w=n*%?Z0?`w5)aa>!y!?t~CC4g|-{DjZolDtB~l zYra4HWb~=<&hWnQ@567k|6}X7!|#OuoO`J7{qV>6N5aSA$Ma8wzlnaEYd`M9lh0oN z&JTRxgMV<%d*1uuKmYtypK2+#E`90A7yRe_f1jT|W9hOBF1+HSpZMe#mOOOOTi*JP z4`jqBT0DDwZ|!xT`RvSD#Zp^&`e92~ti0_b5ByW>vg_V;Te0oLlQ;Lh^WD>iHhk%^ zpS@<&FQ43d-uZv>zIpSHoBhi7-}IqBz4_MLKK}VT?`bKwA9Cc%m!0;CTWKFe9s%Ie^7|>bEC~sZvMRSE02s8Or4cKy7fhc6AGv1r@UnRqb*10kIv67 zEiRvZ%I;;YhqjewoOs%bsHfE0btng|&n)CtEzhqj%+I$KTZ^mWC&>EoYRDYaJ`EKKUgrCl=aT zUeS^(RHDN8HJe^^MyYN5mN!&SE4Q_D9K5onZRwo+VdH;wQtx@~XSBAhIc??{rSm%0 z7Td;uy{7HR==8PAqA8`emKDXe-AfNIo*2!#AUAbk$D7`_d8|Bs&)d%I>0q7r(06|H z%F{peS68kmz9j#;mSfx2w9PIYeB~Xlt*y(iC{9}?lK7)1N_)QjlGYFZc=w{Ixg%Sq zLGj1IjW^) z{2xy!oZOk)J~uidAMRdt)U=g_-0u5da^=5`|JU(n=KpV5*Y+C46~@o+J7;Fj%2kN#$uv&1Og%2F<4* zM_2v-#rw4w{?9)7xRPPqz2?T}Gz}-uzH#a8#D6|ev3^fj~F1Dr)ohwb>df1v)&l)oeKecAm^U@LZ za%J|xtHzhV|5BR!@z>T|QN5m9#pPq_JeMMN5ReErOvcrXIV>=miNJh>Lih1_EDX_U z5OVN)+w~sX--+Td8H{Dr3L?p4%&{9wl1Mf|WRy|D2%{tlq7l2gM*?h+cE%7=Q?^B* zBPn1vc~j&pQ#_?=k0BO5t6e zws(n#?_|@uG`85TctBU#Hj%B^PtOZ;_FC-3CzQ%8=WKVsSiE*_1Hn@+=cX}ug>OBj z*-BH^26rf5$zgpU9yDL0mfgm7MtYDk1B~lF4|Xq;$PR@ZKA6|em2?VjLEDXqXMuKP z0_{Dvt}z|XtL!UB2l#oitAJogKJR`G_Wu+L2KxEhcSf@OZHV66lN^9@sK znq3wdw0p=>YFi@FJB4NPj2n6&I2)*XbCu5|59Ja}wT~FhtsOY5=dhaFua!m4F+XS7 M>gJj(FZSpD1_!`a1poj5 diff --git a/example/cosmwasm/cw721/artifacts/checksums.txt b/example/cosmwasm/cw721/artifacts/checksums.txt index 367512654..c02325416 100644 --- a/example/cosmwasm/cw721/artifacts/checksums.txt +++ b/example/cosmwasm/cw721/artifacts/checksums.txt @@ -1 +1 @@ -dc05f927aaacb4d0f500ef7712607e06a55fa2d812cd21505bd1e98ed942273b cwerc721.wasm +4355b9f7c6a3337ee6994512155435bdfc80bd151a57e78fd50f9d41e62a8aaa cwerc721.wasm diff --git a/example/cosmwasm/cw721/artifacts/cwerc721.wasm b/example/cosmwasm/cw721/artifacts/cwerc721.wasm index 4867847483346c72be619446a6699c96f5b88b2f..a1cfac086240001e54a0de7f855cae0e40704a8a 100644 GIT binary patch literal 304424 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 literal 313709 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 z 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 Zuln|Z?#JGNR$SKhAPgZ~L5MB3{srCxIE?@R diff --git a/example/cosmwasm/cw721/src/contract.rs b/example/cosmwasm/cw721/src/contract.rs index 1b010145e..f7515787e 100644 --- a/example/cosmwasm/cw721/src/contract.rs +++ b/example/cosmwasm/cw721/src/contract.rs @@ -64,8 +64,11 @@ pub fn execute_transfer_nft( recipient: String, token_id: String, ) -> Result, ContractError> { - let mut res = transfer_nft(deps, info, recipient, token_id)?; - res = res.add_attribute("action", "transfer_nft"); + let mut res = transfer_nft(deps, &info, &recipient, &token_id)?; + res = res.add_attribute("action", "transfer_nft") + .add_attribute("sender", info.sender) + .add_attribute("recipient", recipient) + .add_attribute("token_id", token_id); Ok(res) } @@ -76,15 +79,18 @@ pub fn execute_send_nft( token_id: String, msg: Binary, ) -> Result, ContractError> { - let mut res = transfer_nft(deps, info.clone(), recipient.clone(), token_id.clone())?; + let mut res = transfer_nft(deps, &info, &recipient, &token_id)?; let send = Cw721ReceiveMsg { sender: info.sender.to_string(), - token_id: token_id.clone(), + token_id: token_id.to_string(), msg, }; res = res .add_message(send.into_cosmos_msg(recipient.clone())?) - .add_attribute("action", "send_nft"); + .add_attribute("action", "send_nft") + .add_attribute("sender", info.sender) + .add_attribute("recipient", recipient) + .add_attribute("token_id", token_id); Ok(res) } @@ -159,23 +165,19 @@ pub fn execute_extension() -> Result, ContractError> { fn transfer_nft( deps: DepsMut, - info: MessageInfo, - recipient: String, - token_id: String, + info: &MessageInfo, + recipient: &str, + token_id: &str, ) -> Result, ContractError> { - deps.api.addr_validate(&recipient)?; + deps.api.addr_validate(recipient)?; let erc_addr = ERC721_ADDRESS.load(deps.storage)?; let querier = EvmQuerier::new(&deps.querier); - let owner = querier.erc721_owner(info.sender.clone().into_string(), erc_addr.clone(), token_id.clone())?.owner; - let payload = querier.erc721_transfer_payload(owner, recipient.clone(), token_id.clone())?; + let owner = querier.erc721_owner(info.sender.to_string(), erc_addr.to_string(), token_id.to_string())?.owner; + let payload = querier.erc721_transfer_payload(owner, recipient.to_string(), token_id.to_string())?; let msg = EvmMsg::DelegateCallEvm { to: erc_addr, data: payload.encoded_payload }; - let res = Response::new() - .add_attribute("sender", info.sender) - .add_attribute("recipient", recipient) - .add_attribute("token_id", token_id) - .add_message(msg); + let res = Response::new().add_message(msg); Ok(res) } diff --git a/x/evm/artifacts/erc721/artifacts.go b/x/evm/artifacts/erc721/artifacts.go index cf2e08e9b..04b51cf6b 100644 --- a/x/evm/artifacts/erc721/artifacts.go +++ b/x/evm/artifacts/erc721/artifacts.go @@ -2,7 +2,7 @@ package erc721 import "embed" -const CurrentVersion uint16 = 4 +const CurrentVersion uint16 = 5 //go:embed cwerc721.wasm var f embed.FS diff --git a/x/evm/artifacts/erc721/cwerc721.wasm b/x/evm/artifacts/erc721/cwerc721.wasm index 4867847483346c72be619446a6699c96f5b88b2f..a1cfac086240001e54a0de7f855cae0e40704a8a 100644 GIT binary patch literal 304424 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 literal 313709 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 z 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 Zuln|Z?#JGNR$SKhAPgZ~L5MB3{srCxIE?@R diff --git a/x/evm/module_test.go b/x/evm/module_test.go index 402825718..d63463838 100644 --- a/x/evm/module_test.go +++ b/x/evm/module_test.go @@ -45,7 +45,7 @@ func TestModuleExportGenesis(t *testing.T) { module := evm.NewAppModule(nil, k) jsonMsg := module.ExportGenesis(ctx, types.ModuleCdc) jsonStr := string(jsonMsg) - assert.Equal(t, "{\"params\":{\"priority_normalizer\":\"1.000000000000000000\",\"base_fee_per_gas\":\"0.000000000000000000\",\"minimum_fee_per_gas\":\"1000000000.000000000000000000\",\"whitelisted_cw_code_hashes_for_delegate_call\":[]},\"address_associations\":[{\"sei_address\":\"sei17xpfvakm2amg962yls6f84z3kell8c5la4jkdu\",\"eth_address\":\"0x27F7B8B8B5A4e71E8E9aA671f4e4031E3773303F\"}],\"codes\":[],\"states\":[],\"nonces\":[],\"serialized\":[{\"prefix\":\"Fg==\",\"key\":\"AwAB\",\"value\":\"AAAAAAAAAAM=\"},{\"prefix\":\"Fg==\",\"key\":\"BAAE\",\"value\":\"AAAAAAAAAAQ=\"}]}", jsonStr) + assert.Equal(t, "{\"params\":{\"priority_normalizer\":\"1.000000000000000000\",\"base_fee_per_gas\":\"0.000000000000000000\",\"minimum_fee_per_gas\":\"1000000000.000000000000000000\",\"whitelisted_cw_code_hashes_for_delegate_call\":[]},\"address_associations\":[{\"sei_address\":\"sei17xpfvakm2amg962yls6f84z3kell8c5la4jkdu\",\"eth_address\":\"0x27F7B8B8B5A4e71E8E9aA671f4e4031E3773303F\"}],\"codes\":[],\"states\":[],\"nonces\":[],\"serialized\":[{\"prefix\":\"Fg==\",\"key\":\"AwAB\",\"value\":\"AAAAAAAAAAM=\"},{\"prefix\":\"Fg==\",\"key\":\"BAAF\",\"value\":\"AAAAAAAAAAQ=\"}]}", jsonStr) } func TestConsensusVersion(t *testing.T) { From 16a2b18aefc30b9074f0e034638966516dae8fe9 Mon Sep 17 00:00:00 2001 From: dvli2007 Date: Fri, 17 May 2024 10:26:51 -0400 Subject: [PATCH 48/51] Gas optimization: minor erc721 pointer (#1680) * Make `balanceOf` more gas efficient (~20% gas savings) * Make `tokenSupply` more gas efficient * Update CW721ERC721Pointer bin and bump version --- contracts/src/CW721ERC721Pointer.sol | 31 ++++++++++++-------- contracts/test/CW721ERC721PointerTest.t.sol | 20 +++++++++++-- x/evm/artifacts/cw721/CW721ERC721Pointer.bin | 2 +- x/evm/artifacts/cw721/artifacts.go | 2 +- 4 files changed, 38 insertions(+), 17 deletions(-) diff --git a/contracts/src/CW721ERC721Pointer.sol b/contracts/src/CW721ERC721Pointer.sol index f02adce37..3898b69e3 100644 --- a/contracts/src/CW721ERC721Pointer.sol +++ b/contracts/src/CW721ERC721Pointer.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.4; +pragma solidity ^0.8.12; import "@openzeppelin/contracts/token/common/ERC2981.sol"; import "@openzeppelin/contracts/token/ERC721/ERC721.sol"; @@ -46,18 +46,26 @@ contract CW721ERC721Pointer is ERC721,ERC2981 { } uint256 numTokens = 0; string memory startAfter; - string memory ownerAddr = _formatPayload("owner", _doubleQuotes(AddrPrecompile.getSeiAddr(owner))); - string memory req = _curlyBrace(_formatPayload("tokens", _curlyBrace(ownerAddr))); + string memory qb = string.concat( + string.concat("\"limit\":1000,\"owner\":\"", AddrPrecompile.getSeiAddr(owner)), + "\"" + ); + bytes32 terminator = keccak256("{\"tokens\":[]}"); + + bytes[] memory tokens; + uint256 tokensLength; + string memory req = string.concat(string.concat("{\"tokens\":{", qb), "}}"); bytes memory response = WasmdPrecompile.query(Cw721Address, bytes(req)); - bytes[] memory tokens = JsonPrecompile.extractAsBytesList(response, "tokens"); - uint256 tokensLength = tokens.length; - while (tokensLength > 0) { - numTokens += tokensLength; - startAfter = _formatPayload("start_after", string(tokens[tokensLength-1])); - req = _curlyBrace(_formatPayload("tokens", _curlyBrace(_join(ownerAddr, startAfter, ",")))); - response = WasmdPrecompile.query(Cw721Address, bytes(req)); + while (keccak256(response) != terminator) { tokens = JsonPrecompile.extractAsBytesList(response, "tokens"); tokensLength = tokens.length; + numTokens += tokensLength; + startAfter = string.concat(",\"start_after\":", string(tokens[tokensLength-1])); + req = string.concat( + string.concat("{\"tokens\":{", string.concat(qb, startAfter)), + "}}" + ); + response = WasmdPrecompile.query(Cw721Address, bytes(req)); } return numTokens; } @@ -128,8 +136,7 @@ contract CW721ERC721Pointer is ERC721,ERC2981 { // 721-Enumerable function totalSupply() public view virtual returns (uint256) { - string memory req = _curlyBrace(_formatPayload("num_tokens", "{}")); - bytes memory response = WasmdPrecompile.query(Cw721Address, bytes(req)); + bytes memory response = WasmdPrecompile.query(Cw721Address, bytes("{\"num_tokens\":{}}")); return JsonPrecompile.extractAsUint256(response, "count"); } diff --git a/contracts/test/CW721ERC721PointerTest.t.sol b/contracts/test/CW721ERC721PointerTest.t.sol index d727a7e19..59baad9f8 100644 --- a/contracts/test/CW721ERC721PointerTest.t.sol +++ b/contracts/test/CW721ERC721PointerTest.t.sol @@ -106,17 +106,17 @@ contract CW721ERC721PointerTest is Test { function testBalanceOf() public { vm.mockCall( WASMD_PRECOMPILE_ADDRESS, - abi.encodeWithSignature("query(string,bytes)", MockCWContractAddress, bytes("{\"tokens\":{\"owner\":\"sei19zhelek4q5lt4zam8mcarmgv92vzgqd3ux32jw\"}}")), + abi.encodeWithSignature("query(string,bytes)", MockCWContractAddress, bytes("{\"tokens\":{\"limit\":1000,\"owner\":\"sei19zhelek4q5lt4zam8mcarmgv92vzgqd3ux32jw\"}}")), abi.encode("{\"tokens\":[\"a\",\"b\"]}") ); vm.mockCall( WASMD_PRECOMPILE_ADDRESS, - abi.encodeWithSignature("query(string,bytes)", MockCWContractAddress, bytes("{\"tokens\":{\"owner\":\"sei19zhelek4q5lt4zam8mcarmgv92vzgqd3ux32jw\",\"start_after\":\"b\"}}")), + abi.encodeWithSignature("query(string,bytes)", MockCWContractAddress, bytes("{\"tokens\":{\"limit\":1000,\"owner\":\"sei19zhelek4q5lt4zam8mcarmgv92vzgqd3ux32jw\",\"start_after\":\"b\"}}")), abi.encode("{\"tokens\":[\"c\",\"d\"]}") ); vm.mockCall( WASMD_PRECOMPILE_ADDRESS, - abi.encodeWithSignature("query(string,bytes)", MockCWContractAddress, bytes("{\"tokens\":{\"owner\":\"sei19zhelek4q5lt4zam8mcarmgv92vzgqd3ux32jw\",\"start_after\":\"d\"}}")), + abi.encodeWithSignature("query(string,bytes)", MockCWContractAddress, bytes("{\"tokens\":{\"limit\":1000,\"owner\":\"sei19zhelek4q5lt4zam8mcarmgv92vzgqd3ux32jw\",\"start_after\":\"d\"}}")), abi.encode("{\"tokens\":[]}") ); bytes[] memory resp1 = new bytes[](2); @@ -158,6 +158,20 @@ contract CW721ERC721PointerTest is Test { assertEq(pointer.ownerOf(1), 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266); } + function testTotalSupply() public { + vm.mockCall( + WASMD_PRECOMPILE_ADDRESS, + abi.encodeWithSignature("query(string,bytes)", MockCWContractAddress, bytes("{\"num_tokens\":{}}")), + abi.encode("{\"count\":100}") + ); + vm.mockCall( + JSON_PRECOMPILE_ADDRESS, + abi.encodeWithSignature("extractAsUint256(bytes,string)", bytes("{\"count\":100}"), "count"), + abi.encode(100) + ); + assertEq(pointer.totalSupply(), 100); + } + function testGetApproved() public { vm.mockCall( WASMD_PRECOMPILE_ADDRESS, diff --git a/x/evm/artifacts/cw721/CW721ERC721Pointer.bin b/x/evm/artifacts/cw721/CW721ERC721Pointer.bin index 66803ded4..8c67fd57d 100644 --- a/x/evm/artifacts/cw721/CW721ERC721Pointer.bin +++ b/x/evm/artifacts/cw721/CW721ERC721Pointer.bin @@ -1 +1 @@ -608060405234801561000f575f80fd5b50604051614c26380380614c268339818101604052810190610031919061027f565b8181815f90816100419190610530565b5080600190816100519190610530565b50505061100260095f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611003600a5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611004600b5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082600890816101299190610530565b505050506105ff565b5f604051905090565b5f80fd5b5f80fd5b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6101918261014b565b810181811067ffffffffffffffff821117156101b0576101af61015b565b5b80604052505050565b5f6101c2610132565b90506101ce8282610188565b919050565b5f67ffffffffffffffff8211156101ed576101ec61015b565b5b6101f68261014b565b9050602081019050919050565b8281835e5f83830152505050565b5f61022361021e846101d3565b6101b9565b90508281526020810184848401111561023f5761023e610147565b5b61024a848285610203565b509392505050565b5f82601f83011261026657610265610143565b5b8151610276848260208601610211565b91505092915050565b5f805f606084860312156102965761029561013b565b5b5f84015167ffffffffffffffff8111156102b3576102b261013f565b5b6102bf86828701610252565b935050602084015167ffffffffffffffff8111156102e0576102df61013f565b5b6102ec86828701610252565b925050604084015167ffffffffffffffff81111561030d5761030c61013f565b5b61031986828701610252565b9150509250925092565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061037157607f821691505b6020821081036103845761038361032d565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026103e67fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826103ab565b6103f086836103ab565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f61043461042f61042a84610408565b610411565b610408565b9050919050565b5f819050919050565b61044d8361041a565b6104616104598261043b565b8484546103b7565b825550505050565b5f90565b610475610469565b610480818484610444565b505050565b5b818110156104a3576104985f8261046d565b600181019050610486565b5050565b601f8211156104e8576104b98161038a565b6104c28461039c565b810160208510156104d1578190505b6104e56104dd8561039c565b830182610485565b50505b505050565b5f82821c905092915050565b5f6105085f19846008026104ed565b1980831691505092915050565b5f61052083836104f9565b9150826002028217905092915050565b61053982610323565b67ffffffffffffffff8111156105525761055161015b565b5b61055c825461035a565b6105678282856104a7565b5f60209050601f831160018114610598575f8415610586578287015190505b6105908582610515565b8655506105f7565b601f1984166105a68661038a565b5f5b828110156105cd578489015182556001820191506020850194506020810190506105a8565b868310156105ea57848901516105e6601f8916826104f9565b8355505b6001600288020188555050505b505050505050565b61461a8061060c5f395ff3fe608060405234801561000f575f80fd5b5060043610610135575f3560e01c80635c4aead7116100b6578063b88d4fde1161007a578063b88d4fde14610372578063c2aed3021461038e578063c87b56dd146103ac578063de4725cc146103dc578063e985e9c5146103fa578063f00b02551461042a57610135565b80635c4aead7146102ba5780636352211e146102d857806370a082311461030857806395d89b4114610338578063a22cb4651461035657610135565b806323b872dd116100fd57806323b872dd146101f15780632a55205a1461020d5780632f745c591461023e57806342842e0e1461026e5780634f6ccce71461028a57610135565b806301ffc9a71461013957806306fdde0314610169578063081812fc14610187578063095ea7b3146101b757806318160ddd146101d3575b5f80fd5b610153600480360381019061014e9190613057565b610448565b604051610160919061309c565b60405180910390f35b6101716105e9565b60405161017e9190613125565b60405180910390f35b6101a1600480360381019061019c9190613178565b610678565b6040516101ae91906131e2565b60405180910390f35b6101d160048036038101906101cc9190613225565b6109d2565b005b6101db610c0e565b6040516101e89190613272565b60405180910390f35b61020b6004803603810190610206919061328b565b610dd0565b005b610227600480360381019061022291906132db565b6110eb565b604051610235929190613319565b60405180910390f35b61025860048036038101906102539190613225565b61171c565b6040516102659190613272565b60405180910390f35b6102886004803603810190610283919061328b565b611758565b005b6102a4600480360381019061029f9190613178565b611777565b6040516102b19190613272565b60405180910390f35b6102c26117b3565b6040516102cf9190613125565b60405180910390f35b6102f260048036038101906102ed9190613178565b61183f565b6040516102ff91906131e2565b60405180910390f35b610322600480360381019061031d9190613340565b611ac9565b60405161032f9190613272565b60405180910390f35b61034061201f565b60405161034d9190613125565b60405180910390f35b610370600480360381019061036b9190613395565b6120af565b005b61038c600480360381019061038791906134ff565b6122b2565b005b6103966122cf565b6040516103a391906135da565b60405180910390f35b6103c660048036038101906103c19190613178565b6122f4565b6040516103d39190613125565b60405180910390f35b6103e46124f1565b6040516103f19190613613565b60405180910390f35b610414600480360381019061040f919061362c565b612516565b604051610421919061309c565b60405180910390f35b61043261294a565b60405161043f919061368a565b60405180910390f35b5f7f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061051257507f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061057a57507f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806105e257507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60605f80546105f7906136d0565b80601f0160208091040260200160405190810160405280929190818152602001828054610623906136d0565b801561066e5780601f106106455761010080835404028352916020019161066e565b820191905f5260205f20905b81548152906001019060200180831161065157829003601f168201915b5050505050905090565b5f806106c96040518060400160405280600881526020017f746f6b656e5f69640000000000000000000000000000000000000000000000008152506106c46106bf8661296f565b612a39565b612a81565b90505f61071b6107166040518060400160405280600981526020017f617070726f76616c73000000000000000000000000000000000000000000000081525061071185612ad3565b612a81565b612ad3565b90505f60095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166306d81d296008846040518363ffffffff1660e01b815260040161077b9291906137e5565b5f60405180830381865afa158015610795573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906107bd9190613888565b90505f600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166387cdf621836040518263ffffffff1660e01b815260040161081a9190613919565b5f60405180830381865afa158015610834573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f8201168201806040525081019061085c9190613a2e565b90505f815111156109c5575f600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166308d858e5835f815181106108b8576108b7613a75565b5b60200260200101516040518263ffffffff1660e01b81526004016108dc9190613aec565b5f60405180830381865afa1580156108f6573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f8201168201806040525081019061091e9190613888565b9050600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631778e539826040518263ffffffff1660e01b815260040161097a9190613125565b602060405180830381865afa158015610995573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109b99190613b33565b955050505050506109cd565b5f9450505050505b919050565b5f610ab56040518060400160405280600781526020017f7370656e64657200000000000000000000000000000000000000000000000000815250610ab0600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630c3c20ed876040518263ffffffff1660e01b8152600401610a6991906131e2565b5f60405180830381865afa158015610a83573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f82011682018060405250810190610aab9190613bfc565b612a39565b612a81565b90505f610b076040518060400160405280600881526020017f746f6b656e5f6964000000000000000000000000000000000000000000000000815250610b02610afd8661296f565b612a39565b612a81565b90505f610b98610b936040518060400160405280600781526020017f617070726f766500000000000000000000000000000000000000000000000000815250610b8e610b8987876040518060400160405280600181526020017f2c00000000000000000000000000000000000000000000000000000000000000815250612b1b565b612ad3565b612a81565b612ad3565b9050610ba381612b69565b50838573ffffffffffffffffffffffffffffffffffffffff16610bc58661183f565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050505050565b5f80610c8c610c876040518060400160405280600a81526020017f6e756d5f746f6b656e73000000000000000000000000000000000000000000008152506040518060400160405280600281526020017f7b7d000000000000000000000000000000000000000000000000000000000000815250612a81565b612ad3565b90505f60095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166306d81d296008846040518363ffffffff1660e01b8152600401610cec9291906137e5565b5f60405180830381865afa158015610d06573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f82011682018060405250810190610d2e9190613888565b9050600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635a558982826040518263ffffffff1660e01b8152600401610d8a9190613c8d565b602060405180830381865afa158015610da5573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610dc99190613cd4565b9250505090565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610e40575f6040517f64a0ae92000000000000000000000000000000000000000000000000000000008152600401610e3791906131e2565b60405180910390fd5b610e498161183f565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614610eb6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ead90613d49565b60405180910390fd5b5f610f996040518060400160405280600981526020017f726563697069656e740000000000000000000000000000000000000000000000815250610f94600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630c3c20ed876040518263ffffffff1660e01b8152600401610f4d91906131e2565b5f60405180830381865afa158015610f67573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f82011682018060405250810190610f8f9190613bfc565b612a39565b612a81565b90505f610feb6040518060400160405280600881526020017f746f6b656e5f6964000000000000000000000000000000000000000000000000815250610fe6610fe18661296f565b612a39565b612a81565b90505f61107c6110776040518060400160405280600c81526020017f7472616e736665725f6e6674000000000000000000000000000000000000000081525061107261106d87876040518060400160405280600181526020017f2c00000000000000000000000000000000000000000000000000000000000000815250612b1b565b612ad3565b612a81565b612ad3565b905061108781612b69565b50838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050505050565b5f805f60095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166306d81d2960086040518060600160405280602c81526020016145b9602c91396040518363ffffffff1660e01b81526004016111639291906137e5565b5f60405180830381865afa15801561117d573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906111a59190613888565b90505f600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166308d858e5836040518263ffffffff1660e01b81526004016112029190613db1565b5f60405180830381865afa15801561121c573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906112449190613888565b90507f6273151f959616268004b58dbb21e5c851b7b8d04498b4aabee12291d22fc0348180519060200120146112af576040517f438c4bcb0000000000000000000000000000000000000000000000000000000081526004016112a690613e2e565b60405180910390fd5b5f6112ff6040518060400160405280600881526020017f746f6b656e5f69640000000000000000000000000000000000000000000000008152506112fa6112f58a61296f565b612a39565b612a81565b90505f6113516040518060400160405280600a81526020017f73616c655f70726963650000000000000000000000000000000000000000000081525061134c6113478a61296f565b612a39565b612a81565b90505f6113e26113dd6040518060400160405280600c81526020017f726f79616c74795f696e666f00000000000000000000000000000000000000008152506113d86113d387876040518060400160405280600181526020017f2c00000000000000000000000000000000000000000000000000000000000000815250612b1b565b612ad3565b612a81565b612ad3565b90505f61147261146d6040518060400160405280600981526020017f657874656e73696f6e00000000000000000000000000000000000000000000008152506114686114636040518060400160405280600381526020017f6d7367000000000000000000000000000000000000000000000000000000000081525087612a81565b612ad3565b612a81565b612ad3565b90505f60095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166306d81d296008846040518363ffffffff1660e01b81526004016114d29291906137e5565b5f60405180830381865afa1580156114ec573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906115149190613888565b90505f600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166308d858e5836040518263ffffffff1660e01b81526004016115719190613e96565b5f60405180830381865afa15801561158b573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906115b39190613888565b90505f600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635a558982846040518263ffffffff1660e01b81526004016116109190613f13565b602060405180830381865afa15801561162b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061164f9190613cd4565b90505f82510361166d575f819a509a50505050505050505050611715565b600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631778e539836040518263ffffffff1660e01b81526004016116c79190613125565b602060405180830381865afa1580156116e2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117069190613b33565b819a509a505050505050505050505b9250929050565b5f6040517f74115a7400000000000000000000000000000000000000000000000000000000815260040161174f90613f90565b60405180910390fd5b61177283838360405180602001604052805f8152506122b2565b505050565b5f6040517f74115a740000000000000000000000000000000000000000000000000000000081526004016117aa90613ff8565b60405180910390fd5b600880546117c0906136d0565b80601f01602080910402602001604051908101604052809291908181526020018280546117ec906136d0565b80156118375780601f1061180e57610100808354040283529160200191611837565b820191905f5260205f20905b81548152906001019060200180831161181a57829003601f168201915b505050505081565b5f806118906040518060400160405280600881526020017f746f6b656e5f696400000000000000000000000000000000000000000000000081525061188b6118868661296f565b612a39565b612a81565b90505f6118e26118dd6040518060400160405280600881526020017f6f776e65725f6f660000000000000000000000000000000000000000000000008152506118d885612ad3565b612a81565b612ad3565b90505f60095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166306d81d296008846040518363ffffffff1660e01b81526004016119429291906137e5565b5f60405180830381865afa15801561195c573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906119849190613888565b90505f600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166308d858e5836040518263ffffffff1660e01b81526004016119e19190614060565b5f60405180830381865afa1580156119fb573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f82011682018060405250810190611a239190613888565b9050600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631778e539826040518263ffffffff1660e01b8152600401611a7f9190613125565b602060405180830381865afa158015611a9a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611abe9190613b33565b945050505050919050565b5f8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611b3a575f6040517f89c62b64000000000000000000000000000000000000000000000000000000008152600401611b3191906131e2565b60405180910390fd5b5f60605f611c206040518060400160405280600581526020017f6f776e6572000000000000000000000000000000000000000000000000000000815250611c1b600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630c3c20ed896040518263ffffffff1660e01b8152600401611bd491906131e2565b5f60405180830381865afa158015611bee573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f82011682018060405250810190611c169190613bfc565b612a39565b612a81565b90505f611c72611c6d6040518060400160405280600681526020017f746f6b656e730000000000000000000000000000000000000000000000000000815250611c6885612ad3565b612a81565b612ad3565b90505f60095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166306d81d296008846040518363ffffffff1660e01b8152600401611cd29291906137e5565b5f60405180830381865afa158015611cec573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f82011682018060405250810190611d149190613888565b90505f600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166387cdf621836040518263ffffffff1660e01b8152600401611d7191906140dd565b5f60405180830381865afa158015611d8b573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f82011682018060405250810190611db39190613a2e565b90505f815190505b5f811115612010578087611dcf919061413d565b9650611e366040518060400160405280600b81526020017f73746172745f616674657200000000000000000000000000000000000000000081525083600184611e189190614170565b81518110611e2957611e28613a75565b5b6020026020010151612a81565b9550611ec6611ec16040518060400160405280600681526020017f746f6b656e730000000000000000000000000000000000000000000000000000815250611ebc611eb7898b6040518060400160405280600181526020017f2c00000000000000000000000000000000000000000000000000000000000000815250612b1b565b612ad3565b612a81565b612ad3565b935060095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166306d81d296008866040518363ffffffff1660e01b8152600401611f259291906137e5565b5f60405180830381865afa158015611f3f573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f82011682018060405250810190611f679190613888565b9250600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166387cdf621846040518263ffffffff1660e01b8152600401611fc391906140dd565b5f60405180830381865afa158015611fdd573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906120059190613a2e565b915081519050611dbb565b86975050505050505050919050565b60606001805461202e906136d0565b80601f016020809104026020016040519081016040528092919081815260200182805461205a906136d0565b80156120a55780601f1061207c576101008083540402835291602001916120a5565b820191905f5260205f20905b81548152906001019060200180831161208857829003601f168201915b5050505050905090565b5f61219a6121956040518060400160405280600881526020017f6f70657261746f72000000000000000000000000000000000000000000000000815250612190600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630c3c20ed886040518263ffffffff1660e01b815260040161214991906131e2565b5f60405180830381865afa158015612163573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f8201168201806040525081019061218b9190613bfc565b612a39565b612a81565b612ad3565b905081156121f7576121f16121ec6121e76040518060400160405280600b81526020017f617070726f76655f616c6c00000000000000000000000000000000000000000081525084612a81565b612ad3565b612b69565b50612248565b61224661224161223c6040518060400160405280600a81526020017f7265766f6b655f616c6c0000000000000000000000000000000000000000000081525084612a81565b612ad3565b612b69565b505b8273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31846040516122a5919061309c565b60405180910390a3505050565b6122bd848484610dd0565b6122c984848484612ce7565b50505050565b600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60606122ff8261183f565b505f6123506040518060400160405280600881526020017f746f6b656e5f696400000000000000000000000000000000000000000000000081525061234b6123468661296f565b612a39565b612a81565b90505f6123a261239d6040518060400160405280600881526020017f6e66745f696e666f00000000000000000000000000000000000000000000000081525061239885612ad3565b612a81565b612ad3565b90505f60095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166306d81d296008846040518363ffffffff1660e01b81526004016124029291906137e5565b5f60405180830381865afa15801561241c573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906124449190613888565b90505f600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166308d858e5836040518263ffffffff1660e01b81526004016124a191906141ed565b5f60405180830381865afa1580156124bb573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906124e39190613888565b905080945050505050919050565b600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f806125fa6040518060400160405280600581526020017f6f776e65720000000000000000000000000000000000000000000000000000008152506125f5600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630c3c20ed886040518263ffffffff1660e01b81526004016125ae91906131e2565b5f60405180830381865afa1580156125c8573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906125f09190613bfc565b612a39565b612a81565b90505f61264c6126476040518060400160405280600d81526020017f616c6c5f6f70657261746f72730000000000000000000000000000000000000081525061264285612ad3565b612a81565b612ad3565b90505f60095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166306d81d296008846040518363ffffffff1660e01b81526004016126ac9291906137e5565b5f60405180830381865afa1580156126c6573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906126ee9190613888565b90505f600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166387cdf621836040518263ffffffff1660e01b815260040161274b919061426a565b5f60405180830381865afa158015612765573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f8201168201806040525081019061278d9190613a2e565b90505f5b815181101561293b575f600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166308d858e58484815181106127eb576127ea613a75565b5b60200260200101516040518263ffffffff1660e01b815260040161280f9190613aec565b5f60405180830381865afa158015612829573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906128519190613888565b90508773ffffffffffffffffffffffffffffffffffffffff16600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631778e539836040518263ffffffff1660e01b81526004016128c49190613125565b602060405180830381865afa1580156128df573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906129039190613b33565b73ffffffffffffffffffffffffffffffffffffffff160361292d5760019650505050505050612944565b508080600101915050612791565b505f9450505050505b92915050565b60095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60605f600161297d84612e99565b0190505f8167ffffffffffffffff81111561299b5761299a6133db565b5b6040519080825280601f01601f1916602001820160405280156129cd5781602001600182028036833780820191505090505b5090505f82602001820190505b600115612a2e578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8581612a2357612a2261429d565b5b0494505f85036129da575b819350505050919050565b606081604051602001612a4c919061432a565b604051602081830303815290604052604051602001612a6b919061434f565b6040516020818303038152906040529050919050565b6060612acb612a8f84612a39565b836040518060400160405280600181526020017f3a00000000000000000000000000000000000000000000000000000000000000815250612b1b565b905092915050565b606081604051602001612ae6919061439a565b604051602081830303815290604052604051602001612b0591906143e5565b6040516020818303038152906040529050919050565b6060838284604051602001612b3192919061440a565b604051602081830303815290604052604051602001612b5192919061440a565b60405160208183030381529060405290509392505050565b60605f8061100273ffffffffffffffffffffffffffffffffffffffff166008856040518060400160405280600281526020017f5b5d000000000000000000000000000000000000000000000000000000000000815250604051602401612bd19392919061442d565b6040516020818303038152906040527f44d227ae000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051612c5b91906144b1565b5f60405180830381855af49150503d805f8114612c93576040519150601f19603f3d011682016040523d82523d5f602084013e612c98565b606091505b509150915081612cdd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cd490614511565b60405180910390fd5b8092505050919050565b5f8373ffffffffffffffffffffffffffffffffffffffff163b1115612e93578273ffffffffffffffffffffffffffffffffffffffff1663150b7a02612d2a612fea565b8685856040518563ffffffff1660e01b8152600401612d4c949392919061452f565b6020604051808303815f875af1925050508015612d8757506040513d601f19601f82011682018060405250810190612d84919061458d565b60015b612e08573d805f8114612db5576040519150601f19603f3d011682016040523d82523d5f602084013e612dba565b606091505b505f815103612e0057836040517f64a0ae92000000000000000000000000000000000000000000000000000000008152600401612df791906131e2565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612e9157836040517f64a0ae92000000000000000000000000000000000000000000000000000000008152600401612e8891906131e2565b60405180910390fd5b505b50505050565b5f805f90507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310612ef5577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381612eeb57612eea61429d565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310612f32576d04ee2d6d415b85acef81000000008381612f2857612f2761429d565b5b0492506020810190505b662386f26fc100008310612f6157662386f26fc100008381612f5757612f5661429d565b5b0492506010810190505b6305f5e1008310612f8a576305f5e1008381612f8057612f7f61429d565b5b0492506008810190505b6127108310612faf576127108381612fa557612fa461429d565b5b0492506004810190505b60648310612fd25760648381612fc857612fc761429d565b5b0492506002810190505b600a8310612fe1576001810190505b80915050919050565b5f33905090565b5f604051905090565b5f80fd5b5f80fd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61303681613002565b8114613040575f80fd5b50565b5f813590506130518161302d565b92915050565b5f6020828403121561306c5761306b612ffa565b5b5f61307984828501613043565b91505092915050565b5f8115159050919050565b61309681613082565b82525050565b5f6020820190506130af5f83018461308d565b92915050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f6130f7826130b5565b61310181856130bf565b93506131118185602086016130cf565b61311a816130dd565b840191505092915050565b5f6020820190508181035f83015261313d81846130ed565b905092915050565b5f819050919050565b61315781613145565b8114613161575f80fd5b50565b5f813590506131728161314e565b92915050565b5f6020828403121561318d5761318c612ffa565b5b5f61319a84828501613164565b91505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6131cc826131a3565b9050919050565b6131dc816131c2565b82525050565b5f6020820190506131f55f8301846131d3565b92915050565b613204816131c2565b811461320e575f80fd5b50565b5f8135905061321f816131fb565b92915050565b5f806040838503121561323b5761323a612ffa565b5b5f61324885828601613211565b925050602061325985828601613164565b9150509250929050565b61326c81613145565b82525050565b5f6020820190506132855f830184613263565b92915050565b5f805f606084860312156132a2576132a1612ffa565b5b5f6132af86828701613211565b93505060206132c086828701613211565b92505060406132d186828701613164565b9150509250925092565b5f80604083850312156132f1576132f0612ffa565b5b5f6132fe85828601613164565b925050602061330f85828601613164565b9150509250929050565b5f60408201905061332c5f8301856131d3565b6133396020830184613263565b9392505050565b5f6020828403121561335557613354612ffa565b5b5f61336284828501613211565b91505092915050565b61337481613082565b811461337e575f80fd5b50565b5f8135905061338f8161336b565b92915050565b5f80604083850312156133ab576133aa612ffa565b5b5f6133b885828601613211565b92505060206133c985828601613381565b9150509250929050565b5f80fd5b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b613411826130dd565b810181811067ffffffffffffffff821117156134305761342f6133db565b5b80604052505050565b5f613442612ff1565b905061344e8282613408565b919050565b5f67ffffffffffffffff82111561346d5761346c6133db565b5b613476826130dd565b9050602081019050919050565b828183375f83830152505050565b5f6134a361349e84613453565b613439565b9050828152602081018484840111156134bf576134be6133d7565b5b6134ca848285613483565b509392505050565b5f82601f8301126134e6576134e56133d3565b5b81356134f6848260208601613491565b91505092915050565b5f805f806080858703121561351757613516612ffa565b5b5f61352487828801613211565b945050602061353587828801613211565b935050604061354687828801613164565b925050606085013567ffffffffffffffff81111561356757613566612ffe565b5b613573878288016134d2565b91505092959194509250565b5f819050919050565b5f6135a261359d613598846131a3565b61357f565b6131a3565b9050919050565b5f6135b382613588565b9050919050565b5f6135c4826135a9565b9050919050565b6135d4816135ba565b82525050565b5f6020820190506135ed5f8301846135cb565b92915050565b5f6135fd826135a9565b9050919050565b61360d816135f3565b82525050565b5f6020820190506136265f830184613604565b92915050565b5f806040838503121561364257613641612ffa565b5b5f61364f85828601613211565b925050602061366085828601613211565b9150509250929050565b5f613674826135a9565b9050919050565b6136848161366a565b82525050565b5f60208201905061369d5f83018461367b565b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806136e757607f821691505b6020821081036136fa576136f96136a3565b5b50919050565b5f819050815f5260205f209050919050565b5f815461371e816136d0565b61372881866130bf565b9450600182165f811461374257600181146137585761378a565b60ff19831686528115156020028601935061378a565b61376185613700565b5f5b8381101561378257815481890152600182019150602081019050613763565b808801955050505b50505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f6137b782613793565b6137c1818561379d565b93506137d18185602086016130cf565b6137da816130dd565b840191505092915050565b5f6040820190508181035f8301526137fd8185613712565b9050818103602083015261381181846137ad565b90509392505050565b5f61382c61382784613453565b613439565b905082815260208101848484011115613848576138476133d7565b5b6138538482856130cf565b509392505050565b5f82601f83011261386f5761386e6133d3565b5b815161387f84826020860161381a565b91505092915050565b5f6020828403121561389d5761389c612ffa565b5b5f82015167ffffffffffffffff8111156138ba576138b9612ffe565b5b6138c68482850161385b565b91505092915050565b7f617070726f76616c7300000000000000000000000000000000000000000000005f82015250565b5f6139036009836130bf565b915061390e826138cf565b602082019050919050565b5f6040820190508181035f83015261393181846137ad565b90508181036020830152613944816138f7565b905092915050565b5f67ffffffffffffffff821115613966576139656133db565b5b602082029050602081019050919050565b5f80fd5b5f61398d6139888461394c565b613439565b905080838252602082019050602084028301858111156139b0576139af613977565b5b835b818110156139f757805167ffffffffffffffff8111156139d5576139d46133d3565b5b8086016139e2898261385b565b855260208501945050506020810190506139b2565b5050509392505050565b5f82601f830112613a1557613a146133d3565b5b8151613a2584826020860161397b565b91505092915050565b5f60208284031215613a4357613a42612ffa565b5b5f82015167ffffffffffffffff811115613a6057613a5f612ffe565b5b613a6c84828501613a01565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f7370656e646572000000000000000000000000000000000000000000000000005f82015250565b5f613ad66007836130bf565b9150613ae182613aa2565b602082019050919050565b5f6040820190508181035f830152613b0481846137ad565b90508181036020830152613b1781613aca565b905092915050565b5f81519050613b2d816131fb565b92915050565b5f60208284031215613b4857613b47612ffa565b5b5f613b5584828501613b1f565b91505092915050565b5f67ffffffffffffffff821115613b7857613b776133db565b5b613b81826130dd565b9050602081019050919050565b5f613ba0613b9b84613b5e565b613439565b905082815260208101848484011115613bbc57613bbb6133d7565b5b613bc78482856130cf565b509392505050565b5f82601f830112613be357613be26133d3565b5b8151613bf3848260208601613b8e565b91505092915050565b5f60208284031215613c1157613c10612ffa565b5b5f82015167ffffffffffffffff811115613c2e57613c2d612ffe565b5b613c3a84828501613bcf565b91505092915050565b7f636f756e740000000000000000000000000000000000000000000000000000005f82015250565b5f613c776005836130bf565b9150613c8282613c43565b602082019050919050565b5f6040820190508181035f830152613ca581846137ad565b90508181036020830152613cb881613c6b565b905092915050565b5f81519050613cce8161314e565b92915050565b5f60208284031215613ce957613ce8612ffa565b5b5f613cf684828501613cc0565b91505092915050565b7f6066726f6d60206d75737420626520746865206f776e657200000000000000005f82015250565b5f613d336018836130bf565b9150613d3e82613cff565b602082019050919050565b5f6020820190508181035f830152613d6081613d27565b9050919050565b7f726f79616c74795f7061796d656e7473000000000000000000000000000000005f82015250565b5f613d9b6010836130bf565b9150613da682613d67565b602082019050919050565b5f6040820190508181035f830152613dc981846137ad565b90508181036020830152613ddc81613d8f565b905092915050565b7f726f79616c74795f696e666f00000000000000000000000000000000000000005f82015250565b5f613e18600c836130bf565b9150613e2382613de4565b602082019050919050565b5f6020820190508181035f830152613e4581613e0c565b9050919050565b7f61646472657373000000000000000000000000000000000000000000000000005f82015250565b5f613e806007836130bf565b9150613e8b82613e4c565b602082019050919050565b5f6040820190508181035f830152613eae81846137ad565b90508181036020830152613ec181613e74565b905092915050565b7f726f79616c74795f616d6f756e740000000000000000000000000000000000005f82015250565b5f613efd600e836130bf565b9150613f0882613ec9565b602082019050919050565b5f6040820190508181035f830152613f2b81846137ad565b90508181036020830152613f3e81613ef1565b905092915050565b7f746f6b656e4f664f776e65724279496e646578000000000000000000000000005f82015250565b5f613f7a6013836130bf565b9150613f8582613f46565b602082019050919050565b5f6020820190508181035f830152613fa781613f6e565b9050919050565b7f746f6b656e4279496e64657800000000000000000000000000000000000000005f82015250565b5f613fe2600c836130bf565b9150613fed82613fae565b602082019050919050565b5f6020820190508181035f83015261400f81613fd6565b9050919050565b7f6f776e65720000000000000000000000000000000000000000000000000000005f82015250565b5f61404a6005836130bf565b915061405582614016565b602082019050919050565b5f6040820190508181035f83015261407881846137ad565b9050818103602083015261408b8161403e565b905092915050565b7f746f6b656e7300000000000000000000000000000000000000000000000000005f82015250565b5f6140c76006836130bf565b91506140d282614093565b602082019050919050565b5f6040820190508181035f8301526140f581846137ad565b90508181036020830152614108816140bb565b905092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61414782613145565b915061415283613145565b925082820190508082111561416a57614169614110565b5b92915050565b5f61417a82613145565b915061418583613145565b925082820390508181111561419d5761419c614110565b5b92915050565b7f746f6b656e5f75726900000000000000000000000000000000000000000000005f82015250565b5f6141d76009836130bf565b91506141e2826141a3565b602082019050919050565b5f6040820190508181035f83015261420581846137ad565b90508181036020830152614218816141cb565b905092915050565b7f6f70657261746f727300000000000000000000000000000000000000000000005f82015250565b5f6142546009836130bf565b915061425f82614220565b602082019050919050565b5f6040820190508181035f83015261428281846137ad565b9050818103602083015261429581614248565b905092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f81905092915050565b5f6142de826130b5565b6142e881856142ca565b93506142f88185602086016130cf565b80840191505092915050565b7f2200000000000000000000000000000000000000000000000000000000000000815250565b5f61433582846142d4565b915061434082614304565b60018201915081905092915050565b5f61435982614304565b60018201915061436982846142d4565b915081905092915050565b7f7d00000000000000000000000000000000000000000000000000000000000000815250565b5f6143a582846142d4565b91506143b082614374565b60018201915081905092915050565b7f7b00000000000000000000000000000000000000000000000000000000000000815250565b5f6143ef826143bf565b6001820191506143ff82846142d4565b915081905092915050565b5f61441582856142d4565b915061442182846142d4565b91508190509392505050565b5f6060820190508181035f8301526144458186613712565b9050818103602083015261445981856137ad565b9050818103604083015261446d81846137ad565b9050949350505050565b5f81905092915050565b5f61448b82613793565b6144958185614477565b93506144a58185602086016130cf565b80840191505092915050565b5f6144bc8284614481565b915081905092915050565b7f436f736d5761736d2065786563757465206661696c65640000000000000000005f82015250565b5f6144fb6017836130bf565b9150614506826144c7565b602082019050919050565b5f6020820190508181035f830152614528816144ef565b9050919050565b5f6080820190506145425f8301876131d3565b61454f60208301866131d3565b61455c6040830185613263565b818103606083015261456e81846137ad565b905095945050505050565b5f815190506145878161302d565b92915050565b5f602082840312156145a2576145a1612ffa565b5b5f6145af84828501614579565b9150509291505056fe7b22657874656e73696f6e223a7b226d7367223a7b22636865636b5f726f79616c74696573223a7b7d7d7d7da2646970667358221220022186fd49994512b40a064b258280560e068a8c6981dfd1fb2f9992b6d7212664736f6c63430008190033 \ No newline at end of file +608060405234801561000f575f80fd5b50604051614c2c380380614c2c8339818101604052810190610031919061027f565b8181815f90816100419190610530565b5080600190816100519190610530565b50505061100260095f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611003600a5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611004600b5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082600890816101299190610530565b505050506105ff565b5f604051905090565b5f80fd5b5f80fd5b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6101918261014b565b810181811067ffffffffffffffff821117156101b0576101af61015b565b5b80604052505050565b5f6101c2610132565b90506101ce8282610188565b919050565b5f67ffffffffffffffff8211156101ed576101ec61015b565b5b6101f68261014b565b9050602081019050919050565b8281835e5f83830152505050565b5f61022361021e846101d3565b6101b9565b90508281526020810184848401111561023f5761023e610147565b5b61024a848285610203565b509392505050565b5f82601f83011261026657610265610143565b5b8151610276848260208601610211565b91505092915050565b5f805f606084860312156102965761029561013b565b5b5f84015167ffffffffffffffff8111156102b3576102b261013f565b5b6102bf86828701610252565b935050602084015167ffffffffffffffff8111156102e0576102df61013f565b5b6102ec86828701610252565b925050604084015167ffffffffffffffff81111561030d5761030c61013f565b5b61031986828701610252565b9150509250925092565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061037157607f821691505b6020821081036103845761038361032d565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026103e67fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826103ab565b6103f086836103ab565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f61043461042f61042a84610408565b610411565b610408565b9050919050565b5f819050919050565b61044d8361041a565b6104616104598261043b565b8484546103b7565b825550505050565b5f90565b610475610469565b610480818484610444565b505050565b5b818110156104a3576104985f8261046d565b600181019050610486565b5050565b601f8211156104e8576104b98161038a565b6104c28461039c565b810160208510156104d1578190505b6104e56104dd8561039c565b830182610485565b50505b505050565b5f82821c905092915050565b5f6105085f19846008026104ed565b1980831691505092915050565b5f61052083836104f9565b9150826002028217905092915050565b61053982610323565b67ffffffffffffffff8111156105525761055161015b565b5b61055c825461035a565b6105678282856104a7565b5f60209050601f831160018114610598575f8415610586578287015190505b6105908582610515565b8655506105f7565b601f1984166105a68661038a565b5f5b828110156105cd578489015182556001820191506020850194506020810190506105a8565b868310156105ea57848901516105e6601f8916826104f9565b8355505b6001600288020188555050505b505050505050565b6146208061060c5f395ff3fe608060405234801561000f575f80fd5b5060043610610135575f3560e01c80635c4aead7116100b6578063b88d4fde1161007a578063b88d4fde14610372578063c2aed3021461038e578063c87b56dd146103ac578063de4725cc146103dc578063e985e9c5146103fa578063f00b02551461042a57610135565b80635c4aead7146102ba5780636352211e146102d857806370a082311461030857806395d89b4114610338578063a22cb4651461035657610135565b806323b872dd116100fd57806323b872dd146101f15780632a55205a1461020d5780632f745c591461023e57806342842e0e1461026e5780634f6ccce71461028a57610135565b806301ffc9a71461013957806306fdde0314610169578063081812fc14610187578063095ea7b3146101b757806318160ddd146101d3575b5f80fd5b610153600480360381019061014e9190612f31565b610448565b6040516101609190612f76565b60405180910390f35b6101716105e9565b60405161017e9190612fff565b60405180910390f35b6101a1600480360381019061019c9190613052565b610678565b6040516101ae91906130bc565b60405180910390f35b6101d160048036038101906101cc91906130ff565b6109d2565b005b6101db610c0e565b6040516101e8919061314c565b60405180910390f35b61020b60048036038101906102069190613165565b610d85565b005b610227600480360381019061022291906131b5565b6110a0565b6040516102359291906131f3565b60405180910390f35b610258600480360381019061025391906130ff565b6116d1565b604051610265919061314c565b60405180910390f35b61028860048036038101906102839190613165565b61170d565b005b6102a4600480360381019061029f9190613052565b61172c565b6040516102b1919061314c565b60405180910390f35b6102c2611768565b6040516102cf9190612fff565b60405180910390f35b6102f260048036038101906102ed9190613052565b6117f4565b6040516102ff91906130bc565b60405180910390f35b610322600480360381019061031d919061321a565b611a7e565b60405161032f919061314c565b60405180910390f35b610340611ef9565b60405161034d9190612fff565b60405180910390f35b610370600480360381019061036b919061326f565b611f89565b005b61038c600480360381019061038791906133d9565b61218c565b005b6103966121a9565b6040516103a391906134b4565b60405180910390f35b6103c660048036038101906103c19190613052565b6121ce565b6040516103d39190612fff565b60405180910390f35b6103e46123cb565b6040516103f191906134ed565b60405180910390f35b610414600480360381019061040f9190613506565b6123f0565b6040516104219190612f76565b60405180910390f35b610432612824565b60405161043f9190613564565b60405180910390f35b5f7f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061051257507f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061057a57507f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806105e257507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60605f80546105f7906135aa565b80601f0160208091040260200160405190810160405280929190818152602001828054610623906135aa565b801561066e5780601f106106455761010080835404028352916020019161066e565b820191905f5260205f20905b81548152906001019060200180831161065157829003601f168201915b5050505050905090565b5f806106c96040518060400160405280600881526020017f746f6b656e5f69640000000000000000000000000000000000000000000000008152506106c46106bf86612849565b612913565b61295b565b90505f61071b6107166040518060400160405280600981526020017f617070726f76616c730000000000000000000000000000000000000000000000815250610711856129ad565b61295b565b6129ad565b90505f60095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166306d81d296008846040518363ffffffff1660e01b815260040161077b9291906136bf565b5f60405180830381865afa158015610795573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906107bd9190613762565b90505f600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166387cdf621836040518263ffffffff1660e01b815260040161081a91906137f3565b5f60405180830381865afa158015610834573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f8201168201806040525081019061085c9190613908565b90505f815111156109c5575f600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166308d858e5835f815181106108b8576108b761394f565b5b60200260200101516040518263ffffffff1660e01b81526004016108dc91906139c6565b5f60405180830381865afa1580156108f6573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f8201168201806040525081019061091e9190613762565b9050600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631778e539826040518263ffffffff1660e01b815260040161097a9190612fff565b602060405180830381865afa158015610995573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109b99190613a0d565b955050505050506109cd565b5f9450505050505b919050565b5f610ab56040518060400160405280600781526020017f7370656e64657200000000000000000000000000000000000000000000000000815250610ab0600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630c3c20ed876040518263ffffffff1660e01b8152600401610a6991906130bc565b5f60405180830381865afa158015610a83573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f82011682018060405250810190610aab9190613ad6565b612913565b61295b565b90505f610b076040518060400160405280600881526020017f746f6b656e5f6964000000000000000000000000000000000000000000000000815250610b02610afd86612849565b612913565b61295b565b90505f610b98610b936040518060400160405280600781526020017f617070726f766500000000000000000000000000000000000000000000000000815250610b8e610b8987876040518060400160405280600181526020017f2c000000000000000000000000000000000000000000000000000000000000008152506129f5565b6129ad565b61295b565b6129ad565b9050610ba381612a43565b50838573ffffffffffffffffffffffffffffffffffffffff16610bc5866117f4565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050505050565b5f8060095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166306d81d2960086040518060400160405280601181526020017f7b226e756d5f746f6b656e73223a7b7d7d0000000000000000000000000000008152506040518363ffffffff1660e01b8152600401610ca29291906136bf565b5f60405180830381865afa158015610cbc573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f82011682018060405250810190610ce49190613762565b9050600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635a558982826040518263ffffffff1660e01b8152600401610d409190613b67565b602060405180830381865afa158015610d5b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d7f9190613bae565b91505090565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610df5575f6040517f64a0ae92000000000000000000000000000000000000000000000000000000008152600401610dec91906130bc565b60405180910390fd5b610dfe816117f4565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614610e6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6290613c23565b60405180910390fd5b5f610f4e6040518060400160405280600981526020017f726563697069656e740000000000000000000000000000000000000000000000815250610f49600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630c3c20ed876040518263ffffffff1660e01b8152600401610f0291906130bc565b5f60405180830381865afa158015610f1c573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f82011682018060405250810190610f449190613ad6565b612913565b61295b565b90505f610fa06040518060400160405280600881526020017f746f6b656e5f6964000000000000000000000000000000000000000000000000815250610f9b610f9686612849565b612913565b61295b565b90505f61103161102c6040518060400160405280600c81526020017f7472616e736665725f6e6674000000000000000000000000000000000000000081525061102761102287876040518060400160405280600181526020017f2c000000000000000000000000000000000000000000000000000000000000008152506129f5565b6129ad565b61295b565b6129ad565b905061103c81612a43565b50838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050505050565b5f805f60095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166306d81d2960086040518060600160405280602c81526020016145bf602c91396040518363ffffffff1660e01b81526004016111189291906136bf565b5f60405180830381865afa158015611132573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f8201168201806040525081019061115a9190613762565b90505f600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166308d858e5836040518263ffffffff1660e01b81526004016111b79190613c8b565b5f60405180830381865afa1580156111d1573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906111f99190613762565b90507f6273151f959616268004b58dbb21e5c851b7b8d04498b4aabee12291d22fc034818051906020012014611264576040517f438c4bcb00000000000000000000000000000000000000000000000000000000815260040161125b90613d08565b60405180910390fd5b5f6112b46040518060400160405280600881526020017f746f6b656e5f69640000000000000000000000000000000000000000000000008152506112af6112aa8a612849565b612913565b61295b565b90505f6113066040518060400160405280600a81526020017f73616c655f7072696365000000000000000000000000000000000000000000008152506113016112fc8a612849565b612913565b61295b565b90505f6113976113926040518060400160405280600c81526020017f726f79616c74795f696e666f000000000000000000000000000000000000000081525061138d61138887876040518060400160405280600181526020017f2c000000000000000000000000000000000000000000000000000000000000008152506129f5565b6129ad565b61295b565b6129ad565b90505f6114276114226040518060400160405280600981526020017f657874656e73696f6e000000000000000000000000000000000000000000000081525061141d6114186040518060400160405280600381526020017f6d736700000000000000000000000000000000000000000000000000000000008152508761295b565b6129ad565b61295b565b6129ad565b90505f60095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166306d81d296008846040518363ffffffff1660e01b81526004016114879291906136bf565b5f60405180830381865afa1580156114a1573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906114c99190613762565b90505f600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166308d858e5836040518263ffffffff1660e01b81526004016115269190613d70565b5f60405180830381865afa158015611540573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906115689190613762565b90505f600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635a558982846040518263ffffffff1660e01b81526004016115c59190613ded565b602060405180830381865afa1580156115e0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116049190613bae565b90505f825103611622575f819a509a505050505050505050506116ca565b600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631778e539836040518263ffffffff1660e01b815260040161167c9190612fff565b602060405180830381865afa158015611697573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116bb9190613a0d565b819a509a505050505050505050505b9250929050565b5f6040517f74115a7400000000000000000000000000000000000000000000000000000000815260040161170490613e6a565b60405180910390fd5b61172783838360405180602001604052805f81525061218c565b505050565b5f6040517f74115a7400000000000000000000000000000000000000000000000000000000815260040161175f90613ed2565b60405180910390fd5b60088054611775906135aa565b80601f01602080910402602001604051908101604052809291908181526020018280546117a1906135aa565b80156117ec5780601f106117c3576101008083540402835291602001916117ec565b820191905f5260205f20905b8154815290600101906020018083116117cf57829003601f168201915b505050505081565b5f806118456040518060400160405280600881526020017f746f6b656e5f696400000000000000000000000000000000000000000000000081525061184061183b86612849565b612913565b61295b565b90505f6118976118926040518060400160405280600881526020017f6f776e65725f6f6600000000000000000000000000000000000000000000000081525061188d856129ad565b61295b565b6129ad565b90505f60095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166306d81d296008846040518363ffffffff1660e01b81526004016118f79291906136bf565b5f60405180830381865afa158015611911573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906119399190613762565b90505f600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166308d858e5836040518263ffffffff1660e01b81526004016119969190613f3a565b5f60405180830381865afa1580156119b0573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906119d89190613762565b9050600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631778e539826040518263ffffffff1660e01b8152600401611a349190612fff565b602060405180830381865afa158015611a4f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a739190613a0d565b945050505050919050565b5f8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611aef575f6040517f89c62b64000000000000000000000000000000000000000000000000000000008152600401611ae691906130bc565b60405180910390fd5b5f60605f600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630c3c20ed866040518263ffffffff1660e01b8152600401611b4d91906130bc565b5f60405180830381865afa158015611b67573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f82011682018060405250810190611b8f9190613ad6565b604051602001611b9f9190613fcd565b604051602081830303815290604052604051602001611bbe9190614018565b60405160208183030381529060405290505f7fcc1a5a473fb6da314e591eaff47c9e633c2fdb385df3a7900f90f8a3ce756bdd905060605f8084604051602001611c089190614063565b604051602081830303815290604052604051602001611c2791906140ae565b60405160208183030381529060405290505f60095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166306d81d296008846040518363ffffffff1660e01b8152600401611c969291906136bf565b5f60405180830381865afa158015611cb0573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f82011682018060405250810190611cd89190613762565b90505b84818051906020012014611ee957600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166387cdf621826040518263ffffffff1660e01b8152600401611d43919061411d565b5f60405180830381865afa158015611d5d573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f82011682018060405250810190611d859190613908565b9350835192508288611d97919061417d565b975083600184611da791906141b0565b81518110611db857611db761394f565b5b6020026020010151604051602001611dd09190614209565b60405160208183030381529060405296508587604051602001611df492919061422e565b604051602081830303815290604052604051602001611e139190614063565b604051602081830303815290604052604051602001611e3291906140ae565b604051602081830303815290604052915060095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166306d81d296008846040518363ffffffff1660e01b8152600401611ea09291906136bf565b5f60405180830381865afa158015611eba573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f82011682018060405250810190611ee29190613762565b9050611cdb565b8798505050505050505050919050565b606060018054611f08906135aa565b80601f0160208091040260200160405190810160405280929190818152602001828054611f34906135aa565b8015611f7f5780601f10611f5657610100808354040283529160200191611f7f565b820191905f5260205f20905b815481529060010190602001808311611f6257829003601f168201915b5050505050905090565b5f61207461206f6040518060400160405280600881526020017f6f70657261746f7200000000000000000000000000000000000000000000000081525061206a600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630c3c20ed886040518263ffffffff1660e01b815260040161202391906130bc565b5f60405180830381865afa15801561203d573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906120659190613ad6565b612913565b61295b565b6129ad565b905081156120d1576120cb6120c66120c16040518060400160405280600b81526020017f617070726f76655f616c6c0000000000000000000000000000000000000000008152508461295b565b6129ad565b612a43565b50612122565b61212061211b6121166040518060400160405280600a81526020017f7265766f6b655f616c6c000000000000000000000000000000000000000000008152508461295b565b6129ad565b612a43565b505b8273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318460405161217f9190612f76565b60405180910390a3505050565b612197848484610d85565b6121a384848484612bc1565b50505050565b600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60606121d9826117f4565b505f61222a6040518060400160405280600881526020017f746f6b656e5f696400000000000000000000000000000000000000000000000081525061222561222086612849565b612913565b61295b565b90505f61227c6122776040518060400160405280600881526020017f6e66745f696e666f000000000000000000000000000000000000000000000000815250612272856129ad565b61295b565b6129ad565b90505f60095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166306d81d296008846040518363ffffffff1660e01b81526004016122dc9291906136bf565b5f60405180830381865afa1580156122f6573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f8201168201806040525081019061231e9190613762565b90505f600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166308d858e5836040518263ffffffff1660e01b815260040161237b919061429b565b5f60405180830381865afa158015612395573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906123bd9190613762565b905080945050505050919050565b600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f806124d46040518060400160405280600581526020017f6f776e65720000000000000000000000000000000000000000000000000000008152506124cf600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630c3c20ed886040518263ffffffff1660e01b815260040161248891906130bc565b5f60405180830381865afa1580156124a2573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906124ca9190613ad6565b612913565b61295b565b90505f6125266125216040518060400160405280600d81526020017f616c6c5f6f70657261746f72730000000000000000000000000000000000000081525061251c856129ad565b61295b565b6129ad565b90505f60095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166306d81d296008846040518363ffffffff1660e01b81526004016125869291906136bf565b5f60405180830381865afa1580156125a0573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906125c89190613762565b90505f600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166387cdf621836040518263ffffffff1660e01b81526004016126259190614318565b5f60405180830381865afa15801561263f573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906126679190613908565b90505f5b8151811015612815575f600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166308d858e58484815181106126c5576126c461394f565b5b60200260200101516040518263ffffffff1660e01b81526004016126e991906139c6565b5f60405180830381865afa158015612703573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f8201168201806040525081019061272b9190613762565b90508773ffffffffffffffffffffffffffffffffffffffff16600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631778e539836040518263ffffffff1660e01b815260040161279e9190612fff565b602060405180830381865afa1580156127b9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906127dd9190613a0d565b73ffffffffffffffffffffffffffffffffffffffff1603612807576001965050505050505061281e565b50808060010191505061266b565b505f9450505050505b92915050565b60095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60605f600161285784612d73565b0190505f8167ffffffffffffffff811115612875576128746132b5565b5b6040519080825280601f01601f1916602001820160405280156128a75781602001600182028036833780820191505090505b5090505f82602001820190505b600115612908578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a85816128fd576128fc61434b565b5b0494505f85036128b4575b819350505050919050565b6060816040516020016129269190614018565b6040516020818303038152906040526040516020016129459190614378565b6040516020818303038152906040529050919050565b60606129a561296984612913565b836040518060400160405280600181526020017f3a000000000000000000000000000000000000000000000000000000000000008152506129f5565b905092915050565b6060816040516020016129c091906143c3565b6040516020818303038152906040526040516020016129df919061440e565b6040516020818303038152906040529050919050565b6060838284604051602001612a0b92919061422e565b604051602081830303815290604052604051602001612a2b92919061422e565b60405160208183030381529060405290509392505050565b60605f8061100273ffffffffffffffffffffffffffffffffffffffff166008856040518060400160405280600281526020017f5b5d000000000000000000000000000000000000000000000000000000000000815250604051602401612aab93929190614433565b6040516020818303038152906040527f44d227ae000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051612b3591906144b7565b5f60405180830381855af49150503d805f8114612b6d576040519150601f19603f3d011682016040523d82523d5f602084013e612b72565b606091505b509150915081612bb7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bae90614517565b60405180910390fd5b8092505050919050565b5f8373ffffffffffffffffffffffffffffffffffffffff163b1115612d6d578273ffffffffffffffffffffffffffffffffffffffff1663150b7a02612c04612ec4565b8685856040518563ffffffff1660e01b8152600401612c269493929190614535565b6020604051808303815f875af1925050508015612c6157506040513d601f19601f82011682018060405250810190612c5e9190614593565b60015b612ce2573d805f8114612c8f576040519150601f19603f3d011682016040523d82523d5f602084013e612c94565b606091505b505f815103612cda57836040517f64a0ae92000000000000000000000000000000000000000000000000000000008152600401612cd191906130bc565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612d6b57836040517f64a0ae92000000000000000000000000000000000000000000000000000000008152600401612d6291906130bc565b60405180910390fd5b505b50505050565b5f805f90507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310612dcf577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381612dc557612dc461434b565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310612e0c576d04ee2d6d415b85acef81000000008381612e0257612e0161434b565b5b0492506020810190505b662386f26fc100008310612e3b57662386f26fc100008381612e3157612e3061434b565b5b0492506010810190505b6305f5e1008310612e64576305f5e1008381612e5a57612e5961434b565b5b0492506008810190505b6127108310612e89576127108381612e7f57612e7e61434b565b5b0492506004810190505b60648310612eac5760648381612ea257612ea161434b565b5b0492506002810190505b600a8310612ebb576001810190505b80915050919050565b5f33905090565b5f604051905090565b5f80fd5b5f80fd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612f1081612edc565b8114612f1a575f80fd5b50565b5f81359050612f2b81612f07565b92915050565b5f60208284031215612f4657612f45612ed4565b5b5f612f5384828501612f1d565b91505092915050565b5f8115159050919050565b612f7081612f5c565b82525050565b5f602082019050612f895f830184612f67565b92915050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f612fd182612f8f565b612fdb8185612f99565b9350612feb818560208601612fa9565b612ff481612fb7565b840191505092915050565b5f6020820190508181035f8301526130178184612fc7565b905092915050565b5f819050919050565b6130318161301f565b811461303b575f80fd5b50565b5f8135905061304c81613028565b92915050565b5f6020828403121561306757613066612ed4565b5b5f6130748482850161303e565b91505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6130a68261307d565b9050919050565b6130b68161309c565b82525050565b5f6020820190506130cf5f8301846130ad565b92915050565b6130de8161309c565b81146130e8575f80fd5b50565b5f813590506130f9816130d5565b92915050565b5f806040838503121561311557613114612ed4565b5b5f613122858286016130eb565b92505060206131338582860161303e565b9150509250929050565b6131468161301f565b82525050565b5f60208201905061315f5f83018461313d565b92915050565b5f805f6060848603121561317c5761317b612ed4565b5b5f613189868287016130eb565b935050602061319a868287016130eb565b92505060406131ab8682870161303e565b9150509250925092565b5f80604083850312156131cb576131ca612ed4565b5b5f6131d88582860161303e565b92505060206131e98582860161303e565b9150509250929050565b5f6040820190506132065f8301856130ad565b613213602083018461313d565b9392505050565b5f6020828403121561322f5761322e612ed4565b5b5f61323c848285016130eb565b91505092915050565b61324e81612f5c565b8114613258575f80fd5b50565b5f8135905061326981613245565b92915050565b5f806040838503121561328557613284612ed4565b5b5f613292858286016130eb565b92505060206132a38582860161325b565b9150509250929050565b5f80fd5b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6132eb82612fb7565b810181811067ffffffffffffffff8211171561330a576133096132b5565b5b80604052505050565b5f61331c612ecb565b905061332882826132e2565b919050565b5f67ffffffffffffffff821115613347576133466132b5565b5b61335082612fb7565b9050602081019050919050565b828183375f83830152505050565b5f61337d6133788461332d565b613313565b905082815260208101848484011115613399576133986132b1565b5b6133a484828561335d565b509392505050565b5f82601f8301126133c0576133bf6132ad565b5b81356133d084826020860161336b565b91505092915050565b5f805f80608085870312156133f1576133f0612ed4565b5b5f6133fe878288016130eb565b945050602061340f878288016130eb565b93505060406134208782880161303e565b925050606085013567ffffffffffffffff81111561344157613440612ed8565b5b61344d878288016133ac565b91505092959194509250565b5f819050919050565b5f61347c6134776134728461307d565b613459565b61307d565b9050919050565b5f61348d82613462565b9050919050565b5f61349e82613483565b9050919050565b6134ae81613494565b82525050565b5f6020820190506134c75f8301846134a5565b92915050565b5f6134d782613483565b9050919050565b6134e7816134cd565b82525050565b5f6020820190506135005f8301846134de565b92915050565b5f806040838503121561351c5761351b612ed4565b5b5f613529858286016130eb565b925050602061353a858286016130eb565b9150509250929050565b5f61354e82613483565b9050919050565b61355e81613544565b82525050565b5f6020820190506135775f830184613555565b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806135c157607f821691505b6020821081036135d4576135d361357d565b5b50919050565b5f819050815f5260205f209050919050565b5f81546135f8816135aa565b6136028186612f99565b9450600182165f811461361c576001811461363257613664565b60ff198316865281151560200286019350613664565b61363b856135da565b5f5b8381101561365c5781548189015260018201915060208101905061363d565b808801955050505b50505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f6136918261366d565b61369b8185613677565b93506136ab818560208601612fa9565b6136b481612fb7565b840191505092915050565b5f6040820190508181035f8301526136d781856135ec565b905081810360208301526136eb8184613687565b90509392505050565b5f6137066137018461332d565b613313565b905082815260208101848484011115613722576137216132b1565b5b61372d848285612fa9565b509392505050565b5f82601f830112613749576137486132ad565b5b81516137598482602086016136f4565b91505092915050565b5f6020828403121561377757613776612ed4565b5b5f82015167ffffffffffffffff81111561379457613793612ed8565b5b6137a084828501613735565b91505092915050565b7f617070726f76616c7300000000000000000000000000000000000000000000005f82015250565b5f6137dd600983612f99565b91506137e8826137a9565b602082019050919050565b5f6040820190508181035f83015261380b8184613687565b9050818103602083015261381e816137d1565b905092915050565b5f67ffffffffffffffff8211156138405761383f6132b5565b5b602082029050602081019050919050565b5f80fd5b5f61386761386284613826565b613313565b9050808382526020820190506020840283018581111561388a57613889613851565b5b835b818110156138d157805167ffffffffffffffff8111156138af576138ae6132ad565b5b8086016138bc8982613735565b8552602085019450505060208101905061388c565b5050509392505050565b5f82601f8301126138ef576138ee6132ad565b5b81516138ff848260208601613855565b91505092915050565b5f6020828403121561391d5761391c612ed4565b5b5f82015167ffffffffffffffff81111561393a57613939612ed8565b5b613946848285016138db565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f7370656e646572000000000000000000000000000000000000000000000000005f82015250565b5f6139b0600783612f99565b91506139bb8261397c565b602082019050919050565b5f6040820190508181035f8301526139de8184613687565b905081810360208301526139f1816139a4565b905092915050565b5f81519050613a07816130d5565b92915050565b5f60208284031215613a2257613a21612ed4565b5b5f613a2f848285016139f9565b91505092915050565b5f67ffffffffffffffff821115613a5257613a516132b5565b5b613a5b82612fb7565b9050602081019050919050565b5f613a7a613a7584613a38565b613313565b905082815260208101848484011115613a9657613a956132b1565b5b613aa1848285612fa9565b509392505050565b5f82601f830112613abd57613abc6132ad565b5b8151613acd848260208601613a68565b91505092915050565b5f60208284031215613aeb57613aea612ed4565b5b5f82015167ffffffffffffffff811115613b0857613b07612ed8565b5b613b1484828501613aa9565b91505092915050565b7f636f756e740000000000000000000000000000000000000000000000000000005f82015250565b5f613b51600583612f99565b9150613b5c82613b1d565b602082019050919050565b5f6040820190508181035f830152613b7f8184613687565b90508181036020830152613b9281613b45565b905092915050565b5f81519050613ba881613028565b92915050565b5f60208284031215613bc357613bc2612ed4565b5b5f613bd084828501613b9a565b91505092915050565b7f6066726f6d60206d75737420626520746865206f776e657200000000000000005f82015250565b5f613c0d601883612f99565b9150613c1882613bd9565b602082019050919050565b5f6020820190508181035f830152613c3a81613c01565b9050919050565b7f726f79616c74795f7061796d656e7473000000000000000000000000000000005f82015250565b5f613c75601083612f99565b9150613c8082613c41565b602082019050919050565b5f6040820190508181035f830152613ca38184613687565b90508181036020830152613cb681613c69565b905092915050565b7f726f79616c74795f696e666f00000000000000000000000000000000000000005f82015250565b5f613cf2600c83612f99565b9150613cfd82613cbe565b602082019050919050565b5f6020820190508181035f830152613d1f81613ce6565b9050919050565b7f61646472657373000000000000000000000000000000000000000000000000005f82015250565b5f613d5a600783612f99565b9150613d6582613d26565b602082019050919050565b5f6040820190508181035f830152613d888184613687565b90508181036020830152613d9b81613d4e565b905092915050565b7f726f79616c74795f616d6f756e740000000000000000000000000000000000005f82015250565b5f613dd7600e83612f99565b9150613de282613da3565b602082019050919050565b5f6040820190508181035f830152613e058184613687565b90508181036020830152613e1881613dcb565b905092915050565b7f746f6b656e4f664f776e65724279496e646578000000000000000000000000005f82015250565b5f613e54601383612f99565b9150613e5f82613e20565b602082019050919050565b5f6020820190508181035f830152613e8181613e48565b9050919050565b7f746f6b656e4279496e64657800000000000000000000000000000000000000005f82015250565b5f613ebc600c83612f99565b9150613ec782613e88565b602082019050919050565b5f6020820190508181035f830152613ee981613eb0565b9050919050565b7f6f776e65720000000000000000000000000000000000000000000000000000005f82015250565b5f613f24600583612f99565b9150613f2f82613ef0565b602082019050919050565b5f6040820190508181035f830152613f528184613687565b90508181036020830152613f6581613f18565b905092915050565b7f226c696d6974223a313030302c226f776e6572223a2200000000000000000000815250565b5f81905092915050565b5f613fa782612f8f565b613fb18185613f93565b9350613fc1818560208601612fa9565b80840191505092915050565b5f613fd782613f6d565b601682019150613fe78284613f9d565b915081905092915050565b7f2200000000000000000000000000000000000000000000000000000000000000815250565b5f6140238284613f9d565b915061402e82613ff2565b60018201915081905092915050565b7f7b22746f6b656e73223a7b000000000000000000000000000000000000000000815250565b5f61406d8261403d565b600b8201915061407d8284613f9d565b915081905092915050565b7f7d7d000000000000000000000000000000000000000000000000000000000000815250565b5f6140b98284613f9d565b91506140c482614088565b60028201915081905092915050565b7f746f6b656e7300000000000000000000000000000000000000000000000000005f82015250565b5f614107600683612f99565b9150614112826140d3565b602082019050919050565b5f6040820190508181035f8301526141358184613687565b90508181036020830152614148816140fb565b905092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6141878261301f565b91506141928361301f565b92508282019050808211156141aa576141a9614150565b5b92915050565b5f6141ba8261301f565b91506141c58361301f565b92508282039050818111156141dd576141dc614150565b5b92915050565b7f2c2273746172745f6166746572223a0000000000000000000000000000000000815250565b5f614213826141e3565b600f820191506142238284613f9d565b915081905092915050565b5f6142398285613f9d565b91506142458284613f9d565b91508190509392505050565b7f746f6b656e5f75726900000000000000000000000000000000000000000000005f82015250565b5f614285600983612f99565b915061429082614251565b602082019050919050565b5f6040820190508181035f8301526142b38184613687565b905081810360208301526142c681614279565b905092915050565b7f6f70657261746f727300000000000000000000000000000000000000000000005f82015250565b5f614302600983612f99565b915061430d826142ce565b602082019050919050565b5f6040820190508181035f8301526143308184613687565b90508181036020830152614343816142f6565b905092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f61438282613ff2565b6001820191506143928284613f9d565b915081905092915050565b7f7d00000000000000000000000000000000000000000000000000000000000000815250565b5f6143ce8284613f9d565b91506143d98261439d565b60018201915081905092915050565b7f7b00000000000000000000000000000000000000000000000000000000000000815250565b5f614418826143e8565b6001820191506144288284613f9d565b915081905092915050565b5f6060820190508181035f83015261444b81866135ec565b9050818103602083015261445f8185613687565b905081810360408301526144738184613687565b9050949350505050565b5f81905092915050565b5f6144918261366d565b61449b818561447d565b93506144ab818560208601612fa9565b80840191505092915050565b5f6144c28284614487565b915081905092915050565b7f436f736d5761736d2065786563757465206661696c65640000000000000000005f82015250565b5f614501601783612f99565b915061450c826144cd565b602082019050919050565b5f6020820190508181035f83015261452e816144f5565b9050919050565b5f6080820190506145485f8301876130ad565b61455560208301866130ad565b614562604083018561313d565b81810360608301526145748184613687565b905095945050505050565b5f8151905061458d81612f07565b92915050565b5f602082840312156145a8576145a7612ed4565b5b5f6145b58482850161457f565b9150509291505056fe7b22657874656e73696f6e223a7b226d7367223a7b22636865636b5f726f79616c74696573223a7b7d7d7d7da26469706673582212202cfa5745319dd924bc8557dfafdf484a8e400b4f43ea1d4904335aa5e8097f2c64736f6c63430008190033 \ No newline at end of file diff --git a/x/evm/artifacts/cw721/artifacts.go b/x/evm/artifacts/cw721/artifacts.go index 1d222efc5..38cb29b63 100644 --- a/x/evm/artifacts/cw721/artifacts.go +++ b/x/evm/artifacts/cw721/artifacts.go @@ -10,7 +10,7 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi" ) -const CurrentVersion uint16 = 3 +const CurrentVersion uint16 = 4 //go:embed CW721ERC721Pointer.abi //go:embed CW721ERC721Pointer.bin From c725b57131da561605b26247ee956fb7b63c74d1 Mon Sep 17 00:00:00 2001 From: codchen Date: Fri, 17 May 2024 23:11:29 +0800 Subject: [PATCH 49/51] Add message type to associate CW contract address (#1681) * Add message type to associate CW contract address * fix test * bump sei-wasmd to fix ignite --------- Co-authored-by: Philip Su --- app/app.go | 2 +- contracts/test/CW20toERC20PointerTest.js | 3 +- contracts/test/lib.js | 7 + go.mod | 2 +- go.sum | 4 +- proto/evm/tx.proto | 8 + x/evm/client/cli/native_tx.go | 29 ++ x/evm/client/cli/tx.go | 1 + x/evm/handler.go | 3 + x/evm/keeper/address.go | 7 - x/evm/keeper/address_test.go | 10 - x/evm/keeper/keeper.go | 4 +- x/evm/keeper/msg_server.go | 20 + x/evm/keeper/msg_server_test.go | 37 ++ x/evm/types/codec.go | 1 + .../message_associate_contract_address.go | 49 ++ x/evm/types/message_register_pointer.go | 2 +- x/evm/types/tx.pb.go | 475 ++++++++++++++++-- 18 files changed, 592 insertions(+), 72 deletions(-) create mode 100644 x/evm/types/message_associate_contract_address.go diff --git a/app/app.go b/app/app.go index 0f99001b3..dc635a318 100644 --- a/app/app.go +++ b/app/app.go @@ -590,7 +590,7 @@ func New( app.EvmKeeper = *evmkeeper.NewKeeper(keys[evmtypes.StoreKey], memKeys[evmtypes.MemStoreKey], app.GetSubspace(evmtypes.ModuleName), app.BankKeeper, &app.AccountKeeper, &app.StakingKeeper, - app.TransferKeeper, wasmkeeper.NewDefaultPermissionKeeper(app.WasmKeeper)) + app.TransferKeeper, wasmkeeper.NewDefaultPermissionKeeper(app.WasmKeeper), &app.WasmKeeper) app.evmRPCConfig, err = evmrpc.ReadConfig(appOpts) if err != nil { panic(fmt.Sprintf("error reading EVM config due to %s", err)) diff --git a/contracts/test/CW20toERC20PointerTest.js b/contracts/test/CW20toERC20PointerTest.js index 123c5b674..19dac07a2 100644 --- a/contracts/test/CW20toERC20PointerTest.js +++ b/contracts/test/CW20toERC20PointerTest.js @@ -1,4 +1,4 @@ -const {getAdmin, queryWasm, executeWasm, deployEvmContract, setupSigners, deployErc20PointerForCw20, deployWasm, WASM, +const {getAdmin, queryWasm, executeWasm, associateWasm, deployEvmContract, setupSigners, deployErc20PointerForCw20, deployWasm, WASM, registerPointerForCw20 } = require("./lib") const { expect } = require("chai"); @@ -102,6 +102,7 @@ describe("CW20 to ERC20 Pointer", function () { }); it("transfer to contract address should succeed", async function() { + await associateWasm(cw20Pointer); const respBefore = await queryWasm(cw20Pointer, "balance", {address: admin.seiAddress}) const balanceBefore = respBefore.data.balance; diff --git a/contracts/test/lib.js b/contracts/test/lib.js index 2b078817e..312481180 100644 --- a/contracts/test/lib.js +++ b/contracts/test/lib.js @@ -349,6 +349,12 @@ async function executeWasm(contractAddress, msg, coins = "0usei") { return JSON.parse(output); } +async function associateWasm(contractAddress) { + const command = `seid tx evm associate-contract-address ${contractAddress} --from ${adminKeyName} --gas=5000000 --fees=1000000usei -y --broadcast-mode block -o json`; + const output = await execute(command); + return JSON.parse(output); +} + async function isDocker() { return new Promise((resolve, reject) => { exec("docker ps --filter 'name=sei-node-0' --format '{{.Names}}'", (error, stdout, stderr) => { @@ -427,6 +433,7 @@ module.exports = { isDocker, testAPIEnabled, incrementPointerVersion, + associateWasm, WASM, ABI, }; diff --git a/go.mod b/go.mod index ee08f9ab5..34a45f600 100644 --- a/go.mod +++ b/go.mod @@ -344,7 +344,7 @@ require ( ) replace ( - github.com/CosmWasm/wasmd => github.com/sei-protocol/sei-wasmd v0.1.4 + github.com/CosmWasm/wasmd => github.com/sei-protocol/sei-wasmd v0.1.5 github.com/confio/ics23/go => github.com/cosmos/cosmos-sdk/ics23/go v0.8.0 github.com/cosmos/cosmos-sdk => github.com/sei-protocol/sei-cosmos v0.3.13 github.com/cosmos/iavl => github.com/sei-protocol/sei-iavl v0.1.9 diff --git a/go.sum b/go.sum index ceb870bc5..681eda8d4 100644 --- a/go.sum +++ b/go.sum @@ -1359,8 +1359,8 @@ github.com/sei-protocol/sei-tendermint v0.3.3 h1:zH6xxrSRwHERaj/AcCR76U9daVY3Ub8 github.com/sei-protocol/sei-tendermint v0.3.3/go.mod h1:4LSlJdhl3nf3OmohliwRNUFLOB1XWlrmSodrIP7fLh4= github.com/sei-protocol/sei-tm-db v0.0.5 h1:3WONKdSXEqdZZeLuWYfK5hP37TJpfaUa13vAyAlvaQY= github.com/sei-protocol/sei-tm-db v0.0.5/go.mod h1:Cpa6rGyczgthq7/0pI31jys2Fw0Nfrc+/jKdP1prVqY= -github.com/sei-protocol/sei-wasmd v0.1.4 h1:StDThZwOJvLebeK1zTot8pByPd4kdM3AsBaKxLpDQPQ= -github.com/sei-protocol/sei-wasmd v0.1.4/go.mod h1:tv+4SYNzpryEPU1dV44+JFB5dIqpDAEx32RngGFgDeI= +github.com/sei-protocol/sei-wasmd v0.1.5 h1:+yO7mihwVTG34DGr/bF1bRwszUfDeN1EnMBZEY67l3k= +github.com/sei-protocol/sei-wasmd v0.1.5/go.mod h1:vd2qO4GOslLnmlsoAk+zE4D8/OQC1AkTqDY8QBOV09U= github.com/sei-protocol/tm-db v0.0.4 h1:7Y4EU62Xzzg6wKAHEotm7SXQR0aPLcGhKHkh3qd0tnk= github.com/sei-protocol/tm-db v0.0.4/go.mod h1:PWsIWOTwdwC7Ow/GUvx8HgUJTO691pBuorIQD8JvwAs= github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= diff --git a/proto/evm/tx.proto b/proto/evm/tx.proto index 03eaa8ce9..8b00a6690 100644 --- a/proto/evm/tx.proto +++ b/proto/evm/tx.proto @@ -12,6 +12,7 @@ service Msg { rpc EVMTransaction(MsgEVMTransaction) returns (MsgEVMTransactionResponse); rpc Send(MsgSend) returns (MsgSendResponse); rpc RegisterPointer(MsgRegisterPointer) returns (MsgRegisterPointerResponse); + rpc AssociateContractAddress(MsgAssociateContractAddress) returns (MsgAssociateContractAddressResponse); } message MsgEVMTransaction { @@ -65,3 +66,10 @@ message MsgRegisterPointer { message MsgRegisterPointerResponse { string pointer_address = 1; } + +message MsgAssociateContractAddress { + string sender = 1; + string address = 2; +} + +message MsgAssociateContractAddressResponse {} \ No newline at end of file diff --git a/x/evm/client/cli/native_tx.go b/x/evm/client/cli/native_tx.go index e37b2dc40..b08518455 100644 --- a/x/evm/client/cli/native_tx.go +++ b/x/evm/client/cli/native_tx.go @@ -148,3 +148,32 @@ func RegisterEvmPointerCmd() *cobra.Command { return cmd } + +func AssociateContractAddressCmd() *cobra.Command { + cmd := &cobra.Command{ + Use: "associate-contract-address [cw-address]", + Short: `Set address association for a CosmWasm contract.`, + Args: cobra.ExactArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + clientCtx, err := client.GetClientTxContext(cmd) + if err != nil { + return err + } + + addr, err := sdk.AccAddressFromBech32(args[0]) + if err != nil { + return err + } + msg := types.NewMsgAssociateContractAddress(clientCtx.GetFromAddress(), addr) + if err := msg.ValidateBasic(); err != nil { + return err + } + + return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), msg) + }, + } + + flags.AddTxFlagsToCmd(cmd) + + return cmd +} diff --git a/x/evm/client/cli/tx.go b/x/evm/client/cli/tx.go index 42e4f7ffa..fd48a96f4 100644 --- a/x/evm/client/cli/tx.go +++ b/x/evm/client/cli/tx.go @@ -68,6 +68,7 @@ func GetTxCmd() *cobra.Command { cmd.AddCommand(NewAddERCNativePointerProposalTxCmd()) cmd.AddCommand(NewAddERCCW20PointerProposalTxCmd()) cmd.AddCommand(NewAddERCCW721PointerProposalTxCmd()) + cmd.AddCommand(AssociateContractAddressCmd()) return cmd } diff --git a/x/evm/handler.go b/x/evm/handler.go index 9cff2a1d2..03e4eaca8 100644 --- a/x/evm/handler.go +++ b/x/evm/handler.go @@ -27,6 +27,9 @@ func NewHandler(k *keeper.Keeper) sdk.Handler { case *types.MsgRegisterPointer: res, err := msgServer.RegisterPointer(sdk.WrapSDKContext(ctx), msg) return sdk.WrapServiceResult(ctx, res, err) + case *types.MsgAssociateContractAddress: + res, err := msgServer.AssociateContractAddress(sdk.WrapSDKContext(ctx), msg) + return sdk.WrapServiceResult(ctx, res, err) default: errMsg := fmt.Sprintf("unrecognized %s message type: %T", types.ModuleName, msg) return nil, sdkerrors.Wrap(sdkerrors.ErrUnknownRequest, errMsg) diff --git a/x/evm/keeper/address.go b/x/evm/keeper/address.go index 5b67c9102..ac043e33c 100644 --- a/x/evm/keeper/address.go +++ b/x/evm/keeper/address.go @@ -1,7 +1,6 @@ package keeper import ( - wasmtypes "github.com/CosmWasm/wasmd/x/wasm/types" "github.com/cosmos/cosmos-sdk/store/prefix" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/ethereum/go-ethereum/common" @@ -29,12 +28,6 @@ func (k *Keeper) DeleteAddressMapping(ctx sdk.Context, seiAddress sdk.AccAddress } func (k *Keeper) GetEVMAddress(ctx sdk.Context, seiAddress sdk.AccAddress) (common.Address, bool) { - // CW address has a different length and should always be considered associated - // Note that this association is one-way since CW address is longer than EOA address - // and would need to be cropped. - if len(seiAddress) == wasmtypes.ContractAddrLen { - return common.BytesToAddress(seiAddress), true - } store := ctx.KVStore(k.storeKey) bz := store.Get(types.SeiAddressToEVMAddressKey(seiAddress)) addr := common.Address{} diff --git a/x/evm/keeper/address_test.go b/x/evm/keeper/address_test.go index 9e9142549..825dfb565 100644 --- a/x/evm/keeper/address_test.go +++ b/x/evm/keeper/address_test.go @@ -4,8 +4,6 @@ import ( "bytes" "testing" - wasmkeeper "github.com/CosmWasm/wasmd/x/wasm/keeper" - "github.com/ethereum/go-ethereum/common" "github.com/sei-protocol/sei-chain/testutil/keeper" "github.com/stretchr/testify/require" ) @@ -52,11 +50,3 @@ func TestGetAddressOrDefault(t *testing.T) { defaultSeiAddr := k.GetSeiAddressOrDefault(ctx, evmAddr) require.True(t, bytes.Equal(defaultSeiAddr, evmAddr[:])) } - -func TestGetEVMAddressForCW(t *testing.T) { - k, ctx := keeper.MockEVMKeeper() - cwAddr := wasmkeeper.BuildContractAddress(123, 456) - cwEvmAddr, associated := k.GetEVMAddress(ctx, cwAddr) - require.True(t, associated) - require.Equal(t, common.BytesToAddress(cwAddr), cwEvmAddr) -} diff --git a/x/evm/keeper/keeper.go b/x/evm/keeper/keeper.go index b019f9c09..6a03b6083 100644 --- a/x/evm/keeper/keeper.go +++ b/x/evm/keeper/keeper.go @@ -52,6 +52,7 @@ type Keeper struct { stakingKeeper *stakingkeeper.Keeper transferKeeper ibctransferkeeper.Keeper wasmKeeper *wasmkeeper.PermissionedKeeper + wasmViewKeeper *wasmkeeper.Keeper cachedFeeCollectorAddressMtx *sync.RWMutex cachedFeeCollectorAddress *common.Address @@ -115,7 +116,7 @@ func (ctx *ReplayChainContext) GetHeader(hash common.Hash, number uint64) *ethty func NewKeeper( storeKey sdk.StoreKey, memStoreKey sdk.StoreKey, paramstore paramtypes.Subspace, bankKeeper bankkeeper.Keeper, accountKeeper *authkeeper.AccountKeeper, stakingKeeper *stakingkeeper.Keeper, - transferKeeper ibctransferkeeper.Keeper, wasmKeeper *wasmkeeper.PermissionedKeeper) *Keeper { + transferKeeper ibctransferkeeper.Keeper, wasmKeeper *wasmkeeper.PermissionedKeeper, wasmViewKeeper *wasmkeeper.Keeper) *Keeper { if !paramstore.HasKeyTable() { paramstore = paramstore.WithKeyTable(types.ParamKeyTable()) } @@ -128,6 +129,7 @@ func NewKeeper( stakingKeeper: stakingKeeper, transferKeeper: transferKeeper, wasmKeeper: wasmKeeper, + wasmViewKeeper: wasmViewKeeper, pendingTxs: make(map[string][]*PendingTx), nonceMx: &sync.RWMutex{}, cachedFeeCollectorAddressMtx: &sync.RWMutex{}, diff --git a/x/evm/keeper/msg_server.go b/x/evm/keeper/msg_server.go index 234018cb3..9ccb8779a 100644 --- a/x/evm/keeper/msg_server.go +++ b/x/evm/keeper/msg_server.go @@ -3,6 +3,7 @@ package keeper import ( "context" "encoding/json" + "errors" "fmt" "math" "math/big" @@ -323,3 +324,22 @@ func (server msgServer) RegisterPointer(goCtx context.Context, msg *types.MsgReg } return &types.MsgRegisterPointerResponse{PointerAddress: pointerAddr.String()}, err } + +func (server msgServer) AssociateContractAddress(goCtx context.Context, msg *types.MsgAssociateContractAddress) (*types.MsgAssociateContractAddressResponse, error) { + ctx := sdk.UnwrapSDKContext(goCtx) + addr := sdk.MustAccAddressFromBech32(msg.Address) // already validated + // check if address is for a contract + if server.wasmViewKeeper.GetContractInfo(ctx, addr) == nil { + return nil, errors.New("no wasm contract found at the given address") + } + evmAddr := common.BytesToAddress(addr) + existingEvmAddr, ok := server.GetEVMAddress(ctx, addr) + if ok { + if existingEvmAddr.Cmp(evmAddr) != 0 { + ctx.Logger().Error(fmt.Sprintf("unexpected associated EVM address %s exists for contract %s: expecting %s", existingEvmAddr.Hex(), addr.String(), evmAddr.Hex())) + } + return nil, errors.New("contract already has an associated address") + } + server.SetAddressMapping(ctx, addr, evmAddr) + return &types.MsgAssociateContractAddressResponse{}, nil +} diff --git a/x/evm/keeper/msg_server_test.go b/x/evm/keeper/msg_server_test.go index e6609e9a7..3ca811cfb 100644 --- a/x/evm/keeper/msg_server_test.go +++ b/x/evm/keeper/msg_server_test.go @@ -671,3 +671,40 @@ func TestEvmError(t *testing.T) { require.Nil(t, err) require.Equal(t, receipt.VmError, res.EvmTxInfo.VmError) } + +func TestAssociateContractAddress(t *testing.T) { + k, ctx := testkeeper.MockEVMKeeper() + msgServer := keeper.NewMsgServerImpl(k) + dummySeiAddr, dummyEvmAddr := testkeeper.MockAddressPair() + res, err := msgServer.RegisterPointer(sdk.WrapSDKContext(ctx), &types.MsgRegisterPointer{ + Sender: dummySeiAddr.String(), + PointerType: types.PointerType_ERC20, + ErcAddress: dummyEvmAddr.Hex(), + }) + require.Nil(t, err) + _, err = msgServer.AssociateContractAddress(sdk.WrapSDKContext(ctx), &types.MsgAssociateContractAddress{ + Sender: dummySeiAddr.String(), + Address: res.PointerAddress, + }) + require.Nil(t, err) + associatedEvmAddr, found := k.GetEVMAddress(ctx, sdk.MustAccAddressFromBech32(res.PointerAddress)) + require.True(t, found) + require.Equal(t, common.BytesToAddress(sdk.MustAccAddressFromBech32(res.PointerAddress)), associatedEvmAddr) + associatedSeiAddr, found := k.GetSeiAddress(ctx, associatedEvmAddr) + require.True(t, found) + require.Equal(t, res.PointerAddress, associatedSeiAddr.String()) + // setting for an associated address would fail + _, err = msgServer.AssociateContractAddress(sdk.WrapSDKContext(ctx), &types.MsgAssociateContractAddress{ + Sender: dummySeiAddr.String(), + Address: res.PointerAddress, + }) + require.NotNil(t, err) + require.Contains(t, err.Error(), "contract already has an associated address") + // setting for a non-contract would fail + _, err = msgServer.AssociateContractAddress(sdk.WrapSDKContext(ctx), &types.MsgAssociateContractAddress{ + Sender: dummySeiAddr.String(), + Address: dummySeiAddr.String(), + }) + require.NotNil(t, err) + require.Contains(t, err.Error(), "no wasm contract found at the given address") +} diff --git a/x/evm/types/codec.go b/x/evm/types/codec.go index c5f6a2815..bba5d881e 100644 --- a/x/evm/types/codec.go +++ b/x/evm/types/codec.go @@ -42,6 +42,7 @@ func RegisterInterfaces(registry codectypes.InterfaceRegistry) { &MsgEVMTransaction{}, &MsgSend{}, &MsgRegisterPointer{}, + &MsgAssociateContractAddress{}, ) registry.RegisterInterface( "seiprotocol.seichain.evm.TxData", diff --git a/x/evm/types/message_associate_contract_address.go b/x/evm/types/message_associate_contract_address.go new file mode 100644 index 000000000..9f560964c --- /dev/null +++ b/x/evm/types/message_associate_contract_address.go @@ -0,0 +1,49 @@ +package types + +import ( + sdk "github.com/cosmos/cosmos-sdk/types" + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" +) + +const TypeMsgAssociateContractAddress = "evm_associate_contract_address" + +var ( + _ sdk.Msg = &MsgAssociateContractAddress{} +) + +func NewMsgAssociateContractAddress(sender sdk.AccAddress, addr sdk.AccAddress) *MsgAssociateContractAddress { + return &MsgAssociateContractAddress{Sender: sender.String(), Address: addr.String()} +} + +func (msg *MsgAssociateContractAddress) Route() string { + return RouterKey +} + +func (msg *MsgAssociateContractAddress) Type() string { + return TypeMsgAssociateContractAddress +} + +func (msg *MsgAssociateContractAddress) GetSigners() []sdk.AccAddress { + from, err := sdk.AccAddressFromBech32(msg.Sender) + if err != nil { + panic(err) + } + return []sdk.AccAddress{from} +} + +func (msg *MsgAssociateContractAddress) GetSignBytes() []byte { + return sdk.MustSortJSON(ModuleCdc.MustMarshalJSON(msg)) +} + +func (msg *MsgAssociateContractAddress) ValidateBasic() error { + _, err := sdk.AccAddressFromBech32(msg.Sender) + if err != nil { + return sdkerrors.Wrapf(sdkerrors.ErrInvalidAddress, "Invalid sender address (%s)", err) + } + + if _, err := sdk.AccAddressFromBech32(msg.Address); err != nil { + return sdkerrors.ErrInvalidAddress + } + + return nil +} diff --git a/x/evm/types/message_register_pointer.go b/x/evm/types/message_register_pointer.go index 1f2c124c4..831f1a0ae 100644 --- a/x/evm/types/message_register_pointer.go +++ b/x/evm/types/message_register_pointer.go @@ -9,7 +9,7 @@ import ( const TypeMsgRegisterPointer = "evm_register_pointer" var ( - _ sdk.Msg = &MsgSend{} + _ sdk.Msg = &MsgRegisterPointer{} ) func NewMsgRegisterERC20Pointer(sender sdk.AccAddress, ercAddress common.Address) *MsgRegisterPointer { diff --git a/x/evm/types/tx.pb.go b/x/evm/types/tx.pb.go index d9989aee0..fedbdcfee 100644 --- a/x/evm/types/tx.pb.go +++ b/x/evm/types/tx.pb.go @@ -554,6 +554,94 @@ func (m *MsgRegisterPointerResponse) GetPointerAddress() string { return "" } +type MsgAssociateContractAddress struct { + Sender string `protobuf:"bytes,1,opt,name=sender,proto3" json:"sender,omitempty"` + Address string `protobuf:"bytes,2,opt,name=address,proto3" json:"address,omitempty"` +} + +func (m *MsgAssociateContractAddress) Reset() { *m = MsgAssociateContractAddress{} } +func (m *MsgAssociateContractAddress) String() string { return proto.CompactTextString(m) } +func (*MsgAssociateContractAddress) ProtoMessage() {} +func (*MsgAssociateContractAddress) Descriptor() ([]byte, []int) { + return fileDescriptor_d72e73a3d1d93781, []int{10} +} +func (m *MsgAssociateContractAddress) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgAssociateContractAddress) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgAssociateContractAddress.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 *MsgAssociateContractAddress) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgAssociateContractAddress.Merge(m, src) +} +func (m *MsgAssociateContractAddress) XXX_Size() int { + return m.Size() +} +func (m *MsgAssociateContractAddress) XXX_DiscardUnknown() { + xxx_messageInfo_MsgAssociateContractAddress.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgAssociateContractAddress proto.InternalMessageInfo + +func (m *MsgAssociateContractAddress) GetSender() string { + if m != nil { + return m.Sender + } + return "" +} + +func (m *MsgAssociateContractAddress) GetAddress() string { + if m != nil { + return m.Address + } + return "" +} + +type MsgAssociateContractAddressResponse struct { +} + +func (m *MsgAssociateContractAddressResponse) Reset() { *m = MsgAssociateContractAddressResponse{} } +func (m *MsgAssociateContractAddressResponse) String() string { return proto.CompactTextString(m) } +func (*MsgAssociateContractAddressResponse) ProtoMessage() {} +func (*MsgAssociateContractAddressResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_d72e73a3d1d93781, []int{11} +} +func (m *MsgAssociateContractAddressResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgAssociateContractAddressResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgAssociateContractAddressResponse.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 *MsgAssociateContractAddressResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgAssociateContractAddressResponse.Merge(m, src) +} +func (m *MsgAssociateContractAddressResponse) XXX_Size() int { + return m.Size() +} +func (m *MsgAssociateContractAddressResponse) XXX_DiscardUnknown() { + xxx_messageInfo_MsgAssociateContractAddressResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgAssociateContractAddressResponse proto.InternalMessageInfo + func init() { proto.RegisterType((*MsgEVMTransaction)(nil), "seiprotocol.seichain.evm.MsgEVMTransaction") proto.RegisterType((*MsgEVMTransactionResponse)(nil), "seiprotocol.seichain.evm.MsgEVMTransactionResponse") @@ -565,59 +653,64 @@ func init() { proto.RegisterType((*MsgSendResponse)(nil), "seiprotocol.seichain.evm.MsgSendResponse") proto.RegisterType((*MsgRegisterPointer)(nil), "seiprotocol.seichain.evm.MsgRegisterPointer") proto.RegisterType((*MsgRegisterPointerResponse)(nil), "seiprotocol.seichain.evm.MsgRegisterPointerResponse") + proto.RegisterType((*MsgAssociateContractAddress)(nil), "seiprotocol.seichain.evm.MsgAssociateContractAddress") + proto.RegisterType((*MsgAssociateContractAddressResponse)(nil), "seiprotocol.seichain.evm.MsgAssociateContractAddressResponse") } func init() { proto.RegisterFile("evm/tx.proto", fileDescriptor_d72e73a3d1d93781) } var fileDescriptor_d72e73a3d1d93781 = []byte{ - // 744 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x94, 0xcd, 0x4e, 0xdb, 0x48, - 0x1c, 0xc0, 0xe3, 0x24, 0x10, 0x32, 0x89, 0x12, 0x61, 0xa1, 0x55, 0x12, 0xed, 0x26, 0xac, 0xb5, - 0x1f, 0xd9, 0x0f, 0xec, 0x25, 0xac, 0xb4, 0x87, 0xbd, 0x2c, 0x81, 0x68, 0xe1, 0x10, 0x69, 0xe5, - 0x05, 0x0e, 0xbd, 0x44, 0x13, 0xfb, 0x8f, 0x63, 0x35, 0x9e, 0x89, 0x66, 0xc6, 0x11, 0x79, 0x81, - 0x9e, 0xab, 0xaa, 0x52, 0xfb, 0x0c, 0x3d, 0xf5, 0x29, 0x2a, 0x8e, 0x1c, 0x2b, 0x0e, 0xb4, 0x82, - 0x17, 0xa9, 0x66, 0xc6, 0x71, 0x4b, 0x50, 0x28, 0x9c, 0x3c, 0xf3, 0xff, 0xfc, 0xfd, 0x3f, 0xc6, - 0xa8, 0x0c, 0xd3, 0xc8, 0x11, 0x67, 0xf6, 0x84, 0x51, 0x41, 0xcd, 0x1a, 0x87, 0x50, 0x9d, 0x3c, - 0x3a, 0xb6, 0x39, 0x84, 0xde, 0x08, 0x87, 0xc4, 0x86, 0x69, 0xd4, 0xa8, 0x07, 0x94, 0x06, 0x63, - 0x70, 0x94, 0x76, 0x18, 0x9f, 0x3a, 0x98, 0xcc, 0xb4, 0x53, 0x63, 0x23, 0xa0, 0x01, 0x55, 0x47, - 0x47, 0x9e, 0x12, 0x69, 0xd3, 0xa3, 0x3c, 0xa2, 0xdc, 0x19, 0x62, 0x0e, 0xce, 0x74, 0x7b, 0x08, - 0x02, 0x6f, 0x3b, 0x1e, 0x0d, 0x49, 0xa2, 0xaf, 0xca, 0xc4, 0x40, 0xe2, 0x88, 0x6b, 0x81, 0xf5, - 0xd2, 0x40, 0xeb, 0x7d, 0x1e, 0xf4, 0x4e, 0xfa, 0x47, 0x0c, 0x13, 0x8e, 0x3d, 0x11, 0x52, 0x62, - 0xb6, 0x51, 0xde, 0xc7, 0x02, 0xd7, 0x8c, 0x4d, 0xa3, 0x5d, 0xea, 0x6c, 0xd8, 0x1a, 0xc3, 0x9e, - 0x63, 0xd8, 0xbb, 0x64, 0xe6, 0x2a, 0x0b, 0xf3, 0x18, 0x15, 0x7c, 0x60, 0xe1, 0x14, 0xfc, 0x5a, - 0x76, 0xd3, 0x68, 0x97, 0xbb, 0x7f, 0x5f, 0x5e, 0xb5, 0xfe, 0x0a, 0x42, 0x31, 0x8a, 0x87, 0xb6, - 0x47, 0x23, 0x87, 0x43, 0xb8, 0x35, 0x2f, 0x4e, 0x5d, 0x54, 0x75, 0xce, 0x99, 0x23, 0x49, 0x12, - 0x57, 0x7b, 0x5f, 0x7f, 0xdd, 0x79, 0x2c, 0xeb, 0x99, 0x81, 0xea, 0x77, 0xb0, 0x5c, 0xe0, 0x13, - 0x4a, 0x38, 0x98, 0x75, 0xb4, 0x16, 0x60, 0x3e, 0x88, 0x39, 0xf8, 0x0a, 0x31, 0xef, 0x16, 0x02, - 0xcc, 0x8f, 0x39, 0xf8, 0x52, 0x35, 0x8d, 0x06, 0xc0, 0x18, 0x65, 0x0a, 0xa8, 0xe8, 0x16, 0xa6, - 0x51, 0x4f, 0x5e, 0xcd, 0x16, 0x2a, 0x31, 0x10, 0x31, 0x23, 0x03, 0x55, 0x5b, 0x4e, 0xe2, 0xba, - 0x48, 0x8b, 0xf6, 0x65, 0x2d, 0x26, 0xca, 0x8f, 0x30, 0x1f, 0xd5, 0xf2, 0xca, 0x4f, 0x9d, 0xad, - 0x17, 0x06, 0x32, 0xfb, 0x3c, 0x38, 0x24, 0x02, 0x18, 0xc1, 0xe3, 0xde, 0x49, 0x7f, 0x0f, 0x8f, - 0xc7, 0xe6, 0x37, 0x68, 0x95, 0x03, 0xf1, 0x81, 0xa9, 0xfc, 0x45, 0x37, 0xb9, 0x99, 0xff, 0xa0, - 0x95, 0x29, 0x1e, 0xc7, 0xa0, 0x73, 0x77, 0x7f, 0xbd, 0xbc, 0x6a, 0xfd, 0xf4, 0x45, 0x33, 0x92, - 0xe9, 0xe8, 0xcf, 0x16, 0xf7, 0x9f, 0x3a, 0x62, 0x36, 0x01, 0x6e, 0x1f, 0x12, 0xe1, 0x6a, 0x47, - 0xb3, 0x82, 0xb2, 0x82, 0x2a, 0xb8, 0xa2, 0x9b, 0x15, 0x54, 0x42, 0x29, 0xdc, 0xbc, 0xc2, 0x55, - 0x67, 0xeb, 0x5b, 0xd4, 0xb8, 0xcb, 0x34, 0xef, 0x8e, 0xf5, 0xda, 0x58, 0x54, 0xef, 0xc3, 0x18, - 0x02, 0x2c, 0xe0, 0x5e, 0xf4, 0x06, 0x5a, 0xf3, 0xa8, 0x0f, 0x07, 0xb2, 0x03, 0x6a, 0x94, 0x6e, - 0x7a, 0x7f, 0x08, 0x94, 0x69, 0xa1, 0xf2, 0x29, 0xa3, 0xd1, 0x1e, 0x25, 0x82, 0x61, 0x4f, 0xd4, - 0x56, 0x94, 0xf5, 0x2d, 0x99, 0xf5, 0x03, 0xb2, 0x96, 0x93, 0xa5, 0x05, 0xbc, 0x35, 0x50, 0xa1, - 0xcf, 0x83, 0xff, 0x81, 0xf8, 0xe6, 0xf7, 0x3a, 0xea, 0x00, 0xfb, 0x3e, 0x03, 0xce, 0x13, 0xe6, - 0x92, 0x94, 0xed, 0x6a, 0x91, 0xf9, 0x1d, 0x42, 0x82, 0xa6, 0x06, 0x7a, 0xe8, 0x45, 0x41, 0xe7, - 0x6a, 0x0f, 0xad, 0xe2, 0x88, 0xc6, 0x44, 0xd4, 0x72, 0x9b, 0xb9, 0x76, 0xa9, 0x53, 0xb7, 0x75, - 0xfb, 0x6d, 0xf9, 0x46, 0xec, 0xe4, 0x8d, 0xd8, 0x7b, 0x34, 0x24, 0xdd, 0x3f, 0xce, 0xaf, 0x5a, - 0x99, 0x37, 0x1f, 0x5a, 0xed, 0x07, 0x8c, 0x4c, 0x3a, 0x70, 0x37, 0x09, 0x6d, 0xad, 0xa3, 0x6a, - 0x42, 0x9c, 0x56, 0xf1, 0x4a, 0x6f, 0x8e, 0x0b, 0x41, 0xc8, 0x05, 0xb0, 0xff, 0x68, 0x28, 0xcb, - 0x5e, 0xda, 0xfe, 0x03, 0x54, 0x9e, 0x68, 0x93, 0x81, 0x4c, 0xa0, 0xea, 0xa8, 0x74, 0x7e, 0xb4, - 0x97, 0xfd, 0x1b, 0xec, 0x24, 0xe0, 0xd1, 0x6c, 0x02, 0x6e, 0x69, 0xf2, 0xf9, 0x22, 0xf7, 0x1c, - 0x98, 0x97, 0x36, 0x44, 0x4f, 0x0d, 0x01, 0xf3, 0x92, 0x8e, 0x58, 0x3d, 0xb5, 0x1f, 0x0b, 0x60, - 0xe9, 0xe3, 0xfa, 0x19, 0x55, 0xe7, 0x20, 0xb7, 0x9b, 0x5e, 0x49, 0xc4, 0x49, 0x98, 0xce, 0xbb, - 0x2c, 0xca, 0xf5, 0x79, 0x60, 0x32, 0x54, 0x59, 0xf8, 0x7d, 0xfc, 0xb6, 0x9c, 0xfa, 0xce, 0xa3, - 0x6e, 0xec, 0x3c, 0xc2, 0x38, 0x85, 0x3c, 0x42, 0x79, 0xbd, 0x1e, 0xf7, 0x3a, 0x4b, 0x93, 0xc6, - 0x2f, 0x5f, 0x35, 0x49, 0xa3, 0xc6, 0xa8, 0xba, 0x38, 0xae, 0xdf, 0xef, 0xf5, 0x5e, 0xb0, 0x6e, - 0xfc, 0xf9, 0x18, 0xeb, 0x79, 0xda, 0xee, 0xbf, 0xe7, 0xd7, 0x4d, 0xe3, 0xe2, 0xba, 0x69, 0x7c, - 0xbc, 0x6e, 0x1a, 0xcf, 0x6f, 0x9a, 0x99, 0x8b, 0x9b, 0x66, 0xe6, 0xfd, 0x4d, 0x33, 0xf3, 0x64, - 0xeb, 0xa1, 0x3f, 0x52, 0xb5, 0x93, 0xc3, 0x55, 0xa5, 0xdf, 0xf9, 0x14, 0x00, 0x00, 0xff, 0xff, - 0x51, 0x5e, 0xb8, 0x08, 0x5f, 0x06, 0x00, 0x00, + // 798 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x95, 0x4f, 0x6f, 0xe3, 0x44, + 0x14, 0xc0, 0xeb, 0x26, 0xdb, 0x6c, 0x5f, 0xaa, 0x46, 0x6b, 0xad, 0x90, 0x63, 0x20, 0x29, 0x86, + 0x85, 0xf0, 0xa7, 0x36, 0x9b, 0x05, 0x71, 0x40, 0x48, 0x34, 0x6d, 0xc4, 0xee, 0x21, 0x02, 0x99, + 0xee, 0x1e, 0xb8, 0x44, 0x13, 0xfb, 0xad, 0x63, 0x11, 0xcf, 0x44, 0x33, 0xe3, 0x68, 0xf3, 0x05, + 0x38, 0xaf, 0x10, 0x12, 0x7c, 0x06, 0x4e, 0x7c, 0x8c, 0x3d, 0xee, 0x11, 0xf6, 0x50, 0x50, 0xfb, + 0x45, 0xd0, 0xcc, 0xd8, 0x86, 0xa6, 0x4a, 0x68, 0x39, 0x79, 0xde, 0xdf, 0xf9, 0xbd, 0xf7, 0x66, + 0xc6, 0xb0, 0x87, 0x8b, 0x2c, 0x90, 0xcf, 0xfc, 0x39, 0x67, 0x92, 0xd9, 0x8e, 0xc0, 0x54, 0xaf, + 0x22, 0x36, 0xf3, 0x05, 0xa6, 0xd1, 0x94, 0xa4, 0xd4, 0xc7, 0x45, 0xe6, 0xb6, 0x13, 0xc6, 0x92, + 0x19, 0x06, 0xda, 0x3a, 0xc9, 0x9f, 0x06, 0x84, 0x2e, 0x4d, 0x90, 0x7b, 0x37, 0x61, 0x09, 0xd3, + 0xcb, 0x40, 0xad, 0x0a, 0x6d, 0x27, 0x62, 0x22, 0x63, 0x22, 0x98, 0x10, 0x81, 0xc1, 0xe2, 0xfe, + 0x04, 0x25, 0xb9, 0x1f, 0x44, 0x2c, 0xa5, 0x85, 0xbd, 0xa5, 0x36, 0x46, 0x9a, 0x67, 0xc2, 0x28, + 0xbc, 0x9f, 0x2c, 0xb8, 0x33, 0x12, 0xc9, 0xf0, 0xc9, 0xe8, 0x94, 0x13, 0x2a, 0x48, 0x24, 0x53, + 0x46, 0xed, 0x1e, 0xd4, 0x63, 0x22, 0x89, 0x63, 0x1d, 0x58, 0xbd, 0x66, 0xff, 0xae, 0x6f, 0x30, + 0xfc, 0x12, 0xc3, 0x3f, 0xa2, 0xcb, 0x50, 0x7b, 0xd8, 0x8f, 0xa1, 0x11, 0x23, 0x4f, 0x17, 0x18, + 0x3b, 0xdb, 0x07, 0x56, 0x6f, 0x6f, 0xf0, 0xf9, 0xab, 0xb3, 0xee, 0x67, 0x49, 0x2a, 0xa7, 0xf9, + 0xc4, 0x8f, 0x58, 0x16, 0x08, 0x4c, 0x0f, 0xcb, 0xe2, 0xb4, 0xa0, 0xab, 0x0b, 0x9e, 0x05, 0x8a, + 0xa4, 0x08, 0xf5, 0x4f, 0xcc, 0x37, 0x2c, 0x73, 0x79, 0x3f, 0x58, 0xd0, 0xbe, 0x82, 0x15, 0xa2, + 0x98, 0x33, 0x2a, 0xd0, 0x6e, 0xc3, 0xed, 0x84, 0x88, 0x71, 0x2e, 0x30, 0xd6, 0x88, 0xf5, 0xb0, + 0x91, 0x10, 0xf1, 0x58, 0x60, 0xac, 0x4c, 0x8b, 0x6c, 0x8c, 0x9c, 0x33, 0xae, 0x81, 0x76, 0xc3, + 0xc6, 0x22, 0x1b, 0x2a, 0xd1, 0xee, 0x42, 0x93, 0xa3, 0xcc, 0x39, 0x1d, 0xeb, 0xda, 0x6a, 0x0a, + 0x37, 0x04, 0xa3, 0x3a, 0x51, 0xb5, 0xd8, 0x50, 0x9f, 0x12, 0x31, 0x75, 0xea, 0x3a, 0x4e, 0xaf, + 0xbd, 0x1f, 0x2d, 0xb0, 0x47, 0x22, 0x79, 0x44, 0x25, 0x72, 0x4a, 0x66, 0xc3, 0x27, 0xa3, 0x63, + 0x32, 0x9b, 0xd9, 0xaf, 0xc1, 0x8e, 0x40, 0x1a, 0x23, 0xd7, 0xfb, 0xef, 0x86, 0x85, 0x64, 0x7f, + 0x09, 0xb7, 0x16, 0x64, 0x96, 0xa3, 0xd9, 0x7b, 0xf0, 0xc1, 0xab, 0xb3, 0xee, 0xbb, 0xff, 0x6a, + 0x46, 0x31, 0x1d, 0xf3, 0x39, 0x14, 0xf1, 0xf7, 0x81, 0x5c, 0xce, 0x51, 0xf8, 0x8f, 0xa8, 0x0c, + 0x4d, 0xa0, 0xbd, 0x0f, 0xdb, 0x92, 0x69, 0xb8, 0xdd, 0x70, 0x5b, 0x32, 0x05, 0xa5, 0x71, 0xeb, + 0x1a, 0x57, 0xaf, 0xbd, 0x37, 0xc0, 0xbd, 0xca, 0x54, 0x76, 0xc7, 0xfb, 0xc5, 0x5a, 0x35, 0x9f, + 0xe0, 0x0c, 0x13, 0x22, 0x71, 0x23, 0xba, 0x0b, 0xb7, 0x23, 0x16, 0xe3, 0x43, 0xd5, 0x01, 0x3d, + 0xca, 0xb0, 0x92, 0xaf, 0x03, 0x65, 0x7b, 0xb0, 0xf7, 0x94, 0xb3, 0xec, 0x98, 0x51, 0xc9, 0x49, + 0x24, 0x9d, 0x5b, 0xda, 0xfb, 0x92, 0xce, 0x7b, 0x07, 0xbc, 0xf5, 0x64, 0x55, 0x01, 0xbf, 0x59, + 0xd0, 0x18, 0x89, 0xe4, 0x5b, 0xa4, 0xb1, 0xfd, 0x96, 0xc9, 0x3a, 0x26, 0x71, 0xcc, 0x51, 0x88, + 0x82, 0xb9, 0xa9, 0x74, 0x47, 0x46, 0x65, 0xbf, 0x09, 0x20, 0x59, 0xe5, 0x60, 0x86, 0xbe, 0x2b, + 0x59, 0x69, 0x8e, 0x60, 0x87, 0x64, 0x2c, 0xa7, 0xd2, 0xa9, 0x1d, 0xd4, 0x7a, 0xcd, 0x7e, 0xdb, + 0x37, 0xed, 0xf7, 0xd5, 0x1d, 0xf1, 0x8b, 0x3b, 0xe2, 0x1f, 0xb3, 0x94, 0x0e, 0x3e, 0x7e, 0x71, + 0xd6, 0xdd, 0xfa, 0xf5, 0xcf, 0x6e, 0xef, 0x1a, 0x23, 0x53, 0x01, 0x22, 0x2c, 0x52, 0x7b, 0x77, + 0xa0, 0x55, 0x10, 0x57, 0x55, 0xfc, 0x6c, 0x4e, 0x4e, 0x88, 0x49, 0x2a, 0x24, 0xf2, 0x6f, 0x58, + 0xaa, 0xca, 0x5e, 0xdb, 0xfe, 0x87, 0xb0, 0x37, 0x37, 0x2e, 0x63, 0xb5, 0x81, 0xae, 0x63, 0xbf, + 0x7f, 0xcf, 0x5f, 0xf7, 0x36, 0xf8, 0x45, 0xc2, 0xd3, 0xe5, 0x1c, 0xc3, 0xe6, 0xfc, 0x1f, 0x41, + 0x9d, 0x73, 0xe4, 0x51, 0xd5, 0x10, 0x33, 0x35, 0x40, 0x1e, 0x15, 0x1d, 0xf1, 0x86, 0xfa, 0x7c, + 0xac, 0x80, 0x55, 0x97, 0xeb, 0x3d, 0x68, 0x95, 0x20, 0x97, 0x9b, 0xbe, 0x5f, 0xa8, 0xcb, 0x34, + 0x5f, 0xc3, 0xeb, 0x23, 0x91, 0x1c, 0x09, 0xc1, 0xa2, 0x54, 0x8d, 0xb0, 0x18, 0x72, 0xd9, 0xf7, + 0x75, 0x85, 0x3a, 0xd0, 0xb8, 0x3c, 0xab, 0x52, 0xf4, 0xee, 0xc1, 0xdb, 0x1b, 0x12, 0x96, 0x80, + 0xfd, 0x3f, 0x6a, 0x50, 0x1b, 0x89, 0xc4, 0xe6, 0xb0, 0xbf, 0xf2, 0x6c, 0x7d, 0xb8, 0xbe, 0x5b, + 0x57, 0x1e, 0x13, 0xf7, 0xc1, 0x0d, 0x9c, 0xab, 0xe6, 0x9c, 0x42, 0xdd, 0x1c, 0xcb, 0x8d, 0xc1, + 0xca, 0xc5, 0x7d, 0xff, 0x3f, 0x5d, 0xaa, 0xac, 0x39, 0xb4, 0x56, 0x8f, 0xc9, 0x47, 0x1b, 0xa3, + 0x57, 0xbc, 0xdd, 0x4f, 0x6e, 0xe2, 0x5d, 0x6d, 0xfb, 0xdc, 0x02, 0x67, 0xed, 0xf8, 0x3e, 0xdd, + 0x98, 0x72, 0x5d, 0x98, 0xfb, 0xc5, 0xff, 0x0a, 0x2b, 0x91, 0x06, 0x5f, 0xbd, 0x38, 0xef, 0x58, + 0x2f, 0xcf, 0x3b, 0xd6, 0x5f, 0xe7, 0x1d, 0xeb, 0xf9, 0x45, 0x67, 0xeb, 0xe5, 0x45, 0x67, 0xeb, + 0xf7, 0x8b, 0xce, 0xd6, 0x77, 0x87, 0xd7, 0xfd, 0xa7, 0xe8, 0xeb, 0x39, 0xd9, 0xd1, 0xf6, 0x07, + 0x7f, 0x07, 0x00, 0x00, 0xff, 0xff, 0x16, 0xf7, 0xdd, 0x7c, 0x6a, 0x07, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -635,6 +728,7 @@ type MsgClient interface { EVMTransaction(ctx context.Context, in *MsgEVMTransaction, opts ...grpc.CallOption) (*MsgEVMTransactionResponse, error) Send(ctx context.Context, in *MsgSend, opts ...grpc.CallOption) (*MsgSendResponse, error) RegisterPointer(ctx context.Context, in *MsgRegisterPointer, opts ...grpc.CallOption) (*MsgRegisterPointerResponse, error) + AssociateContractAddress(ctx context.Context, in *MsgAssociateContractAddress, opts ...grpc.CallOption) (*MsgAssociateContractAddressResponse, error) } type msgClient struct { @@ -672,11 +766,21 @@ func (c *msgClient) RegisterPointer(ctx context.Context, in *MsgRegisterPointer, return out, nil } +func (c *msgClient) AssociateContractAddress(ctx context.Context, in *MsgAssociateContractAddress, opts ...grpc.CallOption) (*MsgAssociateContractAddressResponse, error) { + out := new(MsgAssociateContractAddressResponse) + err := c.cc.Invoke(ctx, "/seiprotocol.seichain.evm.Msg/AssociateContractAddress", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + // MsgServer is the server API for Msg service. type MsgServer interface { EVMTransaction(context.Context, *MsgEVMTransaction) (*MsgEVMTransactionResponse, error) Send(context.Context, *MsgSend) (*MsgSendResponse, error) RegisterPointer(context.Context, *MsgRegisterPointer) (*MsgRegisterPointerResponse, error) + AssociateContractAddress(context.Context, *MsgAssociateContractAddress) (*MsgAssociateContractAddressResponse, error) } // UnimplementedMsgServer can be embedded to have forward compatible implementations. @@ -692,6 +796,9 @@ func (*UnimplementedMsgServer) Send(ctx context.Context, req *MsgSend) (*MsgSend func (*UnimplementedMsgServer) RegisterPointer(ctx context.Context, req *MsgRegisterPointer) (*MsgRegisterPointerResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method RegisterPointer not implemented") } +func (*UnimplementedMsgServer) AssociateContractAddress(ctx context.Context, req *MsgAssociateContractAddress) (*MsgAssociateContractAddressResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method AssociateContractAddress not implemented") +} func RegisterMsgServer(s grpc1.Server, srv MsgServer) { s.RegisterService(&_Msg_serviceDesc, srv) @@ -751,6 +858,24 @@ func _Msg_RegisterPointer_Handler(srv interface{}, ctx context.Context, dec func return interceptor(ctx, in, info, handler) } +func _Msg_AssociateContractAddress_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(MsgAssociateContractAddress) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(MsgServer).AssociateContractAddress(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/seiprotocol.seichain.evm.Msg/AssociateContractAddress", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(MsgServer).AssociateContractAddress(ctx, req.(*MsgAssociateContractAddress)) + } + return interceptor(ctx, in, info, handler) +} + var _Msg_serviceDesc = grpc.ServiceDesc{ ServiceName: "seiprotocol.seichain.evm.Msg", HandlerType: (*MsgServer)(nil), @@ -767,6 +892,10 @@ var _Msg_serviceDesc = grpc.ServiceDesc{ MethodName: "RegisterPointer", Handler: _Msg_RegisterPointer_Handler, }, + { + MethodName: "AssociateContractAddress", + Handler: _Msg_AssociateContractAddress_Handler, + }, }, Streams: []grpc.StreamDesc{}, Metadata: "evm/tx.proto", @@ -1174,6 +1303,66 @@ func (m *MsgRegisterPointerResponse) MarshalToSizedBuffer(dAtA []byte) (int, err return len(dAtA) - i, nil } +func (m *MsgAssociateContractAddress) 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 *MsgAssociateContractAddress) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgAssociateContractAddress) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Address) > 0 { + i -= len(m.Address) + copy(dAtA[i:], m.Address) + i = encodeVarintTx(dAtA, i, uint64(len(m.Address))) + i-- + dAtA[i] = 0x12 + } + if len(m.Sender) > 0 { + i -= len(m.Sender) + copy(dAtA[i:], m.Sender) + i = encodeVarintTx(dAtA, i, uint64(len(m.Sender))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *MsgAssociateContractAddressResponse) 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 *MsgAssociateContractAddressResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgAssociateContractAddressResponse) 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 @@ -1363,6 +1552,32 @@ func (m *MsgRegisterPointerResponse) Size() (n int) { return n } +func (m *MsgAssociateContractAddress) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Sender) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + l = len(m.Address) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + return n +} + +func (m *MsgAssociateContractAddressResponse) 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 } @@ -2568,6 +2783,170 @@ func (m *MsgRegisterPointerResponse) Unmarshal(dAtA []byte) error { } return nil } +func (m *MsgAssociateContractAddress) 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: MsgAssociateContractAddress: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgAssociateContractAddress: 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 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.Sender = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + 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 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.Address = 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 *MsgAssociateContractAddressResponse) 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: MsgAssociateContractAddressResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgAssociateContractAddressResponse: 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 From 6140a56905783ee7e1c05ced31a3174f94b92597 Mon Sep 17 00:00:00 2001 From: codchen Date: Mon, 20 May 2024 16:09:49 +0800 Subject: [PATCH 50/51] Emit signer event for all cases (#1689) --- cmd/seid/cmd/debug.go | 1 + x/evm/ante/preprocess.go | 6 ++++++ 2 files changed, 7 insertions(+) diff --git a/cmd/seid/cmd/debug.go b/cmd/seid/cmd/debug.go index 9bd4bee6a..d0a7e3240 100644 --- a/cmd/seid/cmd/debug.go +++ b/cmd/seid/cmd/debug.go @@ -49,6 +49,7 @@ $ %s debug dump-iavl 12345 return cmd } +//nolint:gosec func dumpIavlCmdHandler(cmd *cobra.Command, args []string) error { var err error home, err := os.UserHomeDir() diff --git a/x/evm/ante/preprocess.go b/x/evm/ante/preprocess.go index 1fb3415e7..0789a15cd 100644 --- a/x/evm/ante/preprocess.go +++ b/x/evm/ante/preprocess.go @@ -365,16 +365,22 @@ func (p *EVMAddressDecorator) AnteHandle(ctx sdk.Context, tx sdk.Tx, simulate bo acc := p.accountKeeper.GetAccount(ctx, signer) if acc.GetPubKey() == nil { ctx.Logger().Error(fmt.Sprintf("missing pubkey for %s", signer.String())) + ctx.EventManager().EmitEvent(sdk.NewEvent(evmtypes.EventTypeSigner, + sdk.NewAttribute(evmtypes.AttributeKeySeiAddress, signer.String()))) continue } pk, err := btcec.ParsePubKey(acc.GetPubKey().Bytes(), btcec.S256()) if err != nil { ctx.Logger().Debug(fmt.Sprintf("failed to parse pubkey for %s, likely due to the fact that it isn't on secp256k1 curve", acc.GetPubKey()), "err", err) + ctx.EventManager().EmitEvent(sdk.NewEvent(evmtypes.EventTypeSigner, + sdk.NewAttribute(evmtypes.AttributeKeySeiAddress, signer.String()))) continue } evmAddr, err := pubkeyToEVMAddress(pk.SerializeUncompressed()) if err != nil { ctx.Logger().Error(fmt.Sprintf("failed to get EVM address from pubkey due to %s", err)) + ctx.EventManager().EmitEvent(sdk.NewEvent(evmtypes.EventTypeSigner, + sdk.NewAttribute(evmtypes.AttributeKeySeiAddress, signer.String()))) continue } ctx.EventManager().EmitEvent(sdk.NewEvent(evmtypes.EventTypeSigner, From c92dc5fb3b15e8a62a3fcf8b7c53cfb3ce940119 Mon Sep 17 00:00:00 2001 From: Philip Su Date: Mon, 20 May 2024 10:48:27 -0700 Subject: [PATCH 51/51] v5.5.1 & v5.5.2 release (#1685) * Add v5.5.0 release * add evm migration * Add v5.5.2 --- CHANGELOG.md | 3 +++ app/app.go | 2 +- app/upgrades.go | 3 +++ x/evm/module.go | 6 +++++- x/evm/module_test.go | 2 +- 5 files changed, 13 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8bf79f596..133e04a12 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -27,6 +27,9 @@ Ref: https://keepachangelog.com/en/1.0.0/ --> # Changelog +## v5.5.2 +sei-chain +* [#1685](https://github.com/sei-protocol/sei-chain/pull/1685) Add EVM support to v5.5.2 ## v5.4.0 sei-chain * [#1671](https://github.com/sei-protocol/sei-chain/pull/1671) Update and fixes to ERC721 contract diff --git a/app/app.go b/app/app.go index dc635a318..8315f2317 100644 --- a/app/app.go +++ b/app/app.go @@ -1006,7 +1006,7 @@ func (app *App) SetStoreUpgradeHandlers() { app.SetStoreLoader(upgradetypes.UpgradeStoreLoader(upgradeInfo.Height, &storeUpgrades)) } - if upgradeInfo.Name == "v5.1.0" && !app.UpgradeKeeper.IsSkipHeight(upgradeInfo.Height) { + if (upgradeInfo.Name == "v5.1.0" || upgradeInfo.Name == "v5.5.2") && !app.UpgradeKeeper.IsSkipHeight(upgradeInfo.Height) { storeUpgrades := storetypes.StoreUpgrades{ Added: []string{evmtypes.StoreKey}, } diff --git a/app/upgrades.go b/app/upgrades.go index af543e5e4..2a49f9acd 100644 --- a/app/upgrades.go +++ b/app/upgrades.go @@ -98,6 +98,9 @@ var upgradesList = []string{ "v5.2.2", "v5.3.0", "v5.4.0", + "v5.5.0", + "v5.5.1", + "v5.5.2", } // if there is an override list, use that instead, for integration tests diff --git a/x/evm/module.go b/x/evm/module.go index aca99e0c9..ac787ca5b 100644 --- a/x/evm/module.go +++ b/x/evm/module.go @@ -151,6 +151,10 @@ func (am AppModule) RegisterServices(cfg module.Configurator) { _ = cfg.RegisterMigration(types.ModuleName, 6, func(ctx sdk.Context) error { return migrations.StoreCWPointerCode(ctx, am.keeper, false, true) }) + + _ = cfg.RegisterMigration(types.ModuleName, 7, func(ctx sdk.Context) error { + return migrations.StoreCWPointerCode(ctx, am.keeper, false, true) + }) } // RegisterInvariants registers the capability module's invariants. @@ -175,7 +179,7 @@ func (am AppModule) ExportGenesis(ctx sdk.Context, cdc codec.JSONCodec) json.Raw } // ConsensusVersion implements ConsensusVersion. -func (AppModule) ConsensusVersion() uint64 { return 7 } +func (AppModule) ConsensusVersion() uint64 { return 8 } // BeginBlock executes all ABCI BeginBlock logic respective to the capability module. func (am AppModule) BeginBlock(ctx sdk.Context, _ abci.RequestBeginBlock) { diff --git a/x/evm/module_test.go b/x/evm/module_test.go index d63463838..02e2509ab 100644 --- a/x/evm/module_test.go +++ b/x/evm/module_test.go @@ -51,7 +51,7 @@ func TestModuleExportGenesis(t *testing.T) { func TestConsensusVersion(t *testing.T) { k, _ := testkeeper.MockEVMKeeper() module := evm.NewAppModule(nil, k) - assert.Equal(t, uint64(7), module.ConsensusVersion()) + assert.Equal(t, uint64(8), module.ConsensusVersion()) } func TestABCI(t *testing.T) {

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≧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 M>gJj(FZSpD1_!`a1poj5 literal 255724 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 diff --git a/example/contracts/erc721/DummyERC721.abi b/example/contracts/erc721/DummyERC721.abi index 9395a3fc5..ce4fea57e 100644 --- a/example/contracts/erc721/DummyERC721.abi +++ b/example/contracts/erc721/DummyERC721.abi @@ -1 +1 @@ -[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"balance","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"operator","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"owner","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"randomAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","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":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"}] \ No newline at end of file +[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"balance","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"operator","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"owner","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"randomAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","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":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"supply","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"}] \ No newline at end of file diff --git a/example/contracts/erc721/DummyERC721.bin b/example/contracts/erc721/DummyERC721.bin index faddd7a16..2eb470db0 100644 --- a/example/contracts/erc721/DummyERC721.bin +++ b/example/contracts/erc721/DummyERC721.bin @@ -1 +1 @@ -608060405273f39fd6e51aad88f6f4ce6ab8827279cfffb9226660045f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550348015610063575f80fd5b5061091f806100715f395ff3fe608060405234801561000f575f80fd5b50600436106100e8575f3560e01c806370a082311161008a578063b88d4fde11610064578063b88d4fde14610258578063c87b56dd14610274578063d5bee9f5146102a4578063e985e9c5146102c2576100e8565b806370a08231146101ee57806395d89b411461021e578063a22cb4651461023c576100e8565b8063095ea7b3116100c6578063095ea7b31461016a57806323b872dd1461018657806342842e0e146101a25780636352211e146101be576100e8565b806301ffc9a7146100ec57806306fdde031461011c578063081812fc1461013a575b5f80fd5b61010660048036038101906101019190610495565b6102f2565b60405161011391906104da565b60405180910390f35b6101246102fc565b604051610131919061057d565b60405180910390f35b610154600480360381019061014f91906105d0565b610339565b604051610161919061063a565b60405180910390f35b610184600480360381019061017f919061067d565b61033f565b005b6101a0600480360381019061019b91906106bb565b610343565b005b6101bc60048036038101906101b791906106bb565b610348565b005b6101d860048036038101906101d391906105d0565b61034d565b6040516101e5919061063a565b60405180910390f35b6102086004803603810190610203919061070b565b610377565b6040516102159190610745565b60405180910390f35b610226610381565b604051610233919061057d565b60405180910390f35b61025660048036038101906102519190610788565b6103be565b005b610272600480360381019061026d9190610827565b6103c2565b005b61028e600480360381019061028991906105d0565b6103c9565b60405161029b919061057d565b60405180910390f35b6102ac610408565b6040516102b9919061063a565b60405180910390f35b6102dc60048036038101906102d791906108ab565b61042d565b6040516102e991906104da565b60405180910390f35b5f60019050919050565b60606040518060400160405280600b81526020017f44756d6d79455243373231000000000000000000000000000000000000000000815250905090565b5f919050565b5050565b505050565b505050565b5f60045f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b5f60329050919050565b60606040518060400160405280600581526020017f44554d4d59000000000000000000000000000000000000000000000000000000815250905090565b5050565b5050505050565b60606040518060400160405280601381526020017f68747470733a2f2f6578616d706c652e636f6d000000000000000000000000008152509050919050565b60045f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f6001905092915050565b5f80fd5b5f80fd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61047481610440565b811461047e575f80fd5b50565b5f8135905061048f8161046b565b92915050565b5f602082840312156104aa576104a9610438565b5b5f6104b784828501610481565b91505092915050565b5f8115159050919050565b6104d4816104c0565b82525050565b5f6020820190506104ed5f8301846104cb565b92915050565b5f81519050919050565b5f82825260208201905092915050565b5f5b8381101561052a57808201518184015260208101905061050f565b5f8484015250505050565b5f601f19601f8301169050919050565b5f61054f826104f3565b61055981856104fd565b935061056981856020860161050d565b61057281610535565b840191505092915050565b5f6020820190508181035f8301526105958184610545565b905092915050565b5f819050919050565b6105af8161059d565b81146105b9575f80fd5b50565b5f813590506105ca816105a6565b92915050565b5f602082840312156105e5576105e4610438565b5b5f6105f2848285016105bc565b91505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f610624826105fb565b9050919050565b6106348161061a565b82525050565b5f60208201905061064d5f83018461062b565b92915050565b61065c8161061a565b8114610666575f80fd5b50565b5f8135905061067781610653565b92915050565b5f806040838503121561069357610692610438565b5b5f6106a085828601610669565b92505060206106b1858286016105bc565b9150509250929050565b5f805f606084860312156106d2576106d1610438565b5b5f6106df86828701610669565b93505060206106f086828701610669565b9250506040610701868287016105bc565b9150509250925092565b5f602082840312156107205761071f610438565b5b5f61072d84828501610669565b91505092915050565b61073f8161059d565b82525050565b5f6020820190506107585f830184610736565b92915050565b610767816104c0565b8114610771575f80fd5b50565b5f813590506107828161075e565b92915050565b5f806040838503121561079e5761079d610438565b5b5f6107ab85828601610669565b92505060206107bc85828601610774565b9150509250929050565b5f80fd5b5f80fd5b5f80fd5b5f8083601f8401126107e7576107e66107c6565b5b8235905067ffffffffffffffff811115610804576108036107ca565b5b6020830191508360018202830111156108205761081f6107ce565b5b9250929050565b5f805f805f608086880312156108405761083f610438565b5b5f61084d88828901610669565b955050602061085e88828901610669565b945050604061086f888289016105bc565b935050606086013567ffffffffffffffff8111156108905761088f61043c565b5b61089c888289016107d2565b92509250509295509295909350565b5f80604083850312156108c1576108c0610438565b5b5f6108ce85828601610669565b92505060206108df85828601610669565b915050925092905056fea2646970667358221220cac0547d8cdc2d72600e74bf9296eee8caaa1ec4c78594f3b8947dd3ec2baef364736f6c63430008140033 \ No newline at end of file +608060405273f39fd6e51aad88f6f4ce6ab8827279cfffb9226660045f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503480156062575f80fd5b50610aec806100705f395ff3fe608060405234801561000f575f80fd5b50600436106100fe575f3560e01c80636352211e11610095578063b88d4fde11610064578063b88d4fde146102bd578063c87b56dd146102d9578063d5bee9f514610309578063e985e9c514610327576100fe565b80636352211e1461022357806370a082311461025357806395d89b4114610283578063a22cb465146102a1576100fe565b806318160ddd116100d157806318160ddd1461019c57806323b872dd146101ba5780632a55205a146101d657806342842e0e14610207576100fe565b806301ffc9a71461010257806306fdde0314610132578063081812fc14610150578063095ea7b314610180575b5f80fd5b61011c6004803603810190610117919061054c565b610357565b6040516101299190610591565b60405180910390f35b61013a610361565b604051610147919061061a565b60405180910390f35b61016a6004803603810190610165919061066d565b61039e565b60405161017791906106d7565b60405180910390f35b61019a6004803603810190610195919061071a565b6103a4565b005b6101a46103a8565b6040516101b19190610767565b60405180910390f35b6101d460048036038101906101cf9190610780565b6103b0565b005b6101f060048036038101906101eb91906107d0565b6103b5565b6040516101fe92919061080e565b60405180910390f35b610221600480360381019061021c9190610780565b6103ff565b005b61023d6004803603810190610238919061066d565b610404565b60405161024a91906106d7565b60405180910390f35b61026d60048036038101906102689190610835565b61042e565b60405161027a9190610767565b60405180910390f35b61028b610438565b604051610298919061061a565b60405180910390f35b6102bb60048036038101906102b6919061088a565b610475565b005b6102d760048036038101906102d29190610929565b610479565b005b6102f360048036038101906102ee919061066d565b610480565b604051610300919061061a565b60405180910390f35b6103116104bf565b60405161031e91906106d7565b60405180910390f35b610341600480360381019061033c91906109ad565b6104e4565b60405161034e9190610591565b60405180910390f35b5f60019050919050565b60606040518060400160405280600b81526020017f44756d6d79455243373231000000000000000000000000000000000000000000815250905090565b5f919050565b5050565b5f6065905090565b505050565b5f8060045f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691506127106101f4846103ec9190610a18565b6103f69190610a86565b90509250929050565b505050565b5f60045f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b5f60329050919050565b60606040518060400160405280600581526020017f44554d4d59000000000000000000000000000000000000000000000000000000815250905090565b5050565b5050505050565b60606040518060400160405280601381526020017f68747470733a2f2f6578616d706c652e636f6d000000000000000000000000008152509050919050565b60045f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f6001905092915050565b5f80fd5b5f80fd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61052b816104f7565b8114610535575f80fd5b50565b5f8135905061054681610522565b92915050565b5f60208284031215610561576105606104ef565b5b5f61056e84828501610538565b91505092915050565b5f8115159050919050565b61058b81610577565b82525050565b5f6020820190506105a45f830184610582565b92915050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f6105ec826105aa565b6105f681856105b4565b93506106068185602086016105c4565b61060f816105d2565b840191505092915050565b5f6020820190508181035f83015261063281846105e2565b905092915050565b5f819050919050565b61064c8161063a565b8114610656575f80fd5b50565b5f8135905061066781610643565b92915050565b5f60208284031215610682576106816104ef565b5b5f61068f84828501610659565b91505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6106c182610698565b9050919050565b6106d1816106b7565b82525050565b5f6020820190506106ea5f8301846106c8565b92915050565b6106f9816106b7565b8114610703575f80fd5b50565b5f81359050610714816106f0565b92915050565b5f80604083850312156107305761072f6104ef565b5b5f61073d85828601610706565b925050602061074e85828601610659565b9150509250929050565b6107618161063a565b82525050565b5f60208201905061077a5f830184610758565b92915050565b5f805f60608486031215610797576107966104ef565b5b5f6107a486828701610706565b93505060206107b586828701610706565b92505060406107c686828701610659565b9150509250925092565b5f80604083850312156107e6576107e56104ef565b5b5f6107f385828601610659565b925050602061080485828601610659565b9150509250929050565b5f6040820190506108215f8301856106c8565b61082e6020830184610758565b9392505050565b5f6020828403121561084a576108496104ef565b5b5f61085784828501610706565b91505092915050565b61086981610577565b8114610873575f80fd5b50565b5f8135905061088481610860565b92915050565b5f80604083850312156108a05761089f6104ef565b5b5f6108ad85828601610706565b92505060206108be85828601610876565b9150509250929050565b5f80fd5b5f80fd5b5f80fd5b5f8083601f8401126108e9576108e86108c8565b5b8235905067ffffffffffffffff811115610906576109056108cc565b5b602083019150836001820283011115610922576109216108d0565b5b9250929050565b5f805f805f60808688031215610942576109416104ef565b5b5f61094f88828901610706565b955050602061096088828901610706565b945050604061097188828901610659565b935050606086013567ffffffffffffffff811115610992576109916104f3565b5b61099e888289016108d4565b92509250509295509295909350565b5f80604083850312156109c3576109c26104ef565b5b5f6109d085828601610706565b92505060206109e185828601610706565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f610a228261063a565b9150610a2d8361063a565b9250828202610a3b8161063a565b91508282048414831517610a5257610a516109eb565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f610a908261063a565b9150610a9b8361063a565b925082610aab57610aaa610a59565b5b82820490509291505056fea2646970667358221220044a679d63c6ba5d9d54e5c3a3a74e6dcad05fbb5758067ef15fc25af3a3df3e64736f6c63430008190033 \ No newline at end of file diff --git a/example/contracts/erc721/ERC721.sol b/example/contracts/erc721/ERC721.sol index 93044d8ac..b4d844a6f 100644 --- a/example/contracts/erc721/ERC721.sol +++ b/example/contracts/erc721/ERC721.sol @@ -57,6 +57,10 @@ contract DummyERC721 is IERC721 { return 50; } + function totalSupply() public view returns (uint256 supply) { + supply = 101; + } + function ownerOf(uint256 tokenId) public view override returns (address owner) { return randomAddress; } @@ -65,6 +69,11 @@ contract DummyERC721 is IERC721 { return "https://example.com"; } + function royaltyInfo(uint256 tokenId, uint256 salePrice) external view returns (address receiver, uint256 royaltyAmount) { + receiver = randomAddress; + royaltyAmount = (salePrice * 500) / 10_000; + } + function transferFrom(address from, address to, uint256 tokenId) public override {} function safeTransferFrom(address from, address to, uint256 tokenId) public override {} diff --git a/example/cosmwasm/cw721/Cargo.lock b/example/cosmwasm/cw721/Cargo.lock index 57817b7bc..83d67866f 100644 --- a/example/cosmwasm/cw721/Cargo.lock +++ b/example/cosmwasm/cw721/Cargo.lock @@ -887,4 +887,4 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" name = "zeroize" version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d" +checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d" \ No newline at end of file diff --git a/example/cosmwasm/cw721/Cargo.toml b/example/cosmwasm/cw721/Cargo.toml index 9a2cda946..0e33fb244 100644 --- a/example/cosmwasm/cw721/Cargo.toml +++ b/example/cosmwasm/cw721/Cargo.toml @@ -22,4 +22,4 @@ cw721 = "0.18.0" cw721-base = "0.18.0" schemars = "0.8.16" serde = "1.0.195" -thiserror = "1.0.56" +thiserror = "1.0.56" \ No newline at end of file diff --git a/example/cosmwasm/cw721/artifacts/checksums.txt b/example/cosmwasm/cw721/artifacts/checksums.txt index a88a66524..367512654 100644 --- a/example/cosmwasm/cw721/artifacts/checksums.txt +++ b/example/cosmwasm/cw721/artifacts/checksums.txt @@ -1 +1 @@ -c55b1a4f074e7e9f969e4d14a70a74084f3e3fd938ad979bacd3c9aef94d8a0e cwerc721.wasm +dc05f927aaacb4d0f500ef7712607e06a55fa2d812cd21505bd1e98ed942273b cwerc721.wasm diff --git a/example/cosmwasm/cw721/artifacts/cwerc721.wasm b/example/cosmwasm/cw721/artifacts/cwerc721.wasm index 475accb7a5de8dd00b33ac26143c2ddf8970d9df..4867847483346c72be619446a6699c96f5b88b2f 100644 GIT binary patch literal 313709 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 z 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 Zuln|Z?#JGNR$SKhAPgZ~L5MB3{srCxIE?@R literal 295364 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�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 PhwGPI^HF7b*ERh=Dv_oN diff --git a/example/cosmwasm/cw721/src/contract.rs b/example/cosmwasm/cw721/src/contract.rs index f5c1cea3d..1b010145e 100644 --- a/example/cosmwasm/cw721/src/contract.rs +++ b/example/cosmwasm/cw721/src/contract.rs @@ -1,15 +1,16 @@ #[cfg(not(feature = "library"))] use cosmwasm_std::entry_point; use cosmwasm_std::{ - DepsMut, Deps, Env, MessageInfo, Response, Binary, StdResult, to_json_binary, Empty, Uint128, + DepsMut, Deps, Env, MessageInfo, Response, Binary, StdResult, to_json_binary, Empty, Uint128, Int256, }; -use cw721::{Cw721ReceiveMsg, OwnerOfResponse, Approval, ApprovalResponse, ApprovalsResponse, OperatorResponse, ContractInfoResponse, NftInfoResponse, AllNftInfoResponse}; -use cw2981_royalties::msg::{Cw2981QueryMsg, RoyaltiesInfoResponse, CheckRoyaltiesResponse}; -use cw2981_royalties::Metadata as Cw2981Metadata; -use crate::msg::{EvmQueryWrapper, EvmMsg, InstantiateMsg, ExecuteMsg, QueryMsg}; -use crate::querier::EvmQuerier; +use cw721::{Cw721ReceiveMsg, OwnerOfResponse, Approval, ApprovalResponse, ApprovalsResponse, OperatorResponse, ContractInfoResponse, NftInfoResponse, AllNftInfoResponse, TokensResponse, OperatorsResponse, NumTokensResponse}; +use cw2981_royalties::msg::{RoyaltiesInfoResponse, CheckRoyaltiesResponse}; +use cw2981_royalties::{Metadata as Cw2981Metadata, Extension as Cw2981Extension}; +use crate::msg::{EvmQueryWrapper, EvmMsg, InstantiateMsg, ExecuteMsg, QueryMsg, CwErc721QueryMsg}; +use crate::querier::{EvmQuerier, DEFAULT_LIMIT, MAX_LIMIT}; use crate::error::ContractError; use crate::state::ERC721_ADDRESS; +use std::str::FromStr; const ERC2981_ID: &str = "0x2a55205a"; @@ -180,23 +181,57 @@ fn transfer_nft( } #[cfg_attr(not(feature = "library"), entry_point)] -pub fn query(deps: Deps, env: Env, msg: QueryMsg) -> Result { +pub fn query(deps: Deps, env: Env, msg: QueryMsg) -> Result { match msg { QueryMsg::OwnerOf { token_id, include_expired: _ } => Ok(to_json_binary(&query_owner_of(deps, env, token_id)?)?), QueryMsg::Approval { token_id, spender, include_expired: _ } => Ok(query_approval(deps, env, token_id, spender)?), QueryMsg::Approvals { token_id, include_expired: _ } => Ok(query_approvals(deps, env, token_id)?), QueryMsg::Operator { owner, operator, include_expired: _ } => Ok(query_operator(deps, env, owner, operator)?), + QueryMsg::AllOperators { + owner, + include_expired: _, + start_after, + limit, + } => Ok(to_json_binary(&query_all_operators( + deps, + env, + owner, + start_after, + limit, + )?)?), + QueryMsg::NumTokens {} => Ok(to_json_binary(&query_num_tokens(deps, env)?)?), + QueryMsg::Tokens { + owner, + start_after, + limit, + } => Ok(to_json_binary(&query_tokens( + deps, + env, + owner, + start_after, + limit, + )?)?), + QueryMsg::AllTokens { start_after, limit } => Ok(to_json_binary(&query_all_tokens( + deps, + env, + start_after, + limit, + )?)?), + QueryMsg::Minter {} => Ok(to_json_binary(&query_minter()?)?), + QueryMsg::Ownership {} => Ok(to_json_binary(&query_ownership()?)?), QueryMsg::ContractInfo {} => Ok(query_contract_info(deps, env)?), - QueryMsg::NftInfo { token_id } => Ok(query_nft_info(deps, env, token_id)?), - QueryMsg::AllNftInfo { token_id, include_expired: _ } => Ok(query_all_nft_info(deps, env, token_id)?), + QueryMsg::NftInfo { token_id } => Ok(to_json_binary(&query_nft_info(deps, env, token_id)?)?), + QueryMsg::AllNftInfo { token_id, include_expired: _ } => Ok(to_json_binary(&query_all_nft_info(deps, env, token_id)?)?), QueryMsg::Extension { msg } => match msg { - Cw2981QueryMsg::RoyaltyInfo { + CwErc721QueryMsg::EvmAddress {} => { + Ok(to_json_binary(&ERC721_ADDRESS.load(deps.storage)?)?) + } + CwErc721QueryMsg::RoyaltyInfo { token_id, sale_price, } => Ok(to_json_binary(&query_royalty_info(deps, env, token_id, sale_price)?)?), - Cw2981QueryMsg::CheckRoyalties {} => Ok(to_json_binary(&query_check_royalties(deps, env)?)?), + CwErc721QueryMsg::CheckRoyalties {} => Ok(to_json_binary(&query_check_royalties(deps, env)?)?), }, - _ => Err(ContractError::NotSupported { }), } } @@ -249,19 +284,102 @@ pub fn query_contract_info(deps: Deps, env: Env) -> StdResult, env: Env, token_id: String) -> StdResult { +pub fn query_nft_info( + deps: Deps, + env: Env, + token_id: String, +) -> StdResult> { let erc_addr = ERC721_ADDRESS.load(deps.storage)?; let querier = EvmQuerier::new(&deps.querier); - let res = querier.erc721_uri(env.clone().contract.address.into_string(), erc_addr.clone(), token_id.clone())?; - to_json_binary(&NftInfoResponse{token_uri: Some(res.uri), extension: ""}) + let res = querier.erc721_uri( + env.clone().contract.address.into_string(), + erc_addr.clone(), + token_id.clone(), + )?; + let royalty_info = query_royalty_info(deps, env, token_id, 100u128.into()); + Ok(NftInfoResponse { + token_uri: Some(res.uri), + extension: Some(Cw2981Metadata { + image: None, + image_data: None, + external_url: None, + description: None, + name: None, + attributes: None, + background_color: None, + animation_url: None, + youtube_url: None, + royalty_percentage: if let Ok(royalty_info) = &royalty_info { + Some(royalty_info.royalty_amount.u128() as u64) + } else { + None + }, + royalty_payment_address: if let Ok(royalty_info) = royalty_info { + Some(royalty_info.address) + } else { + None + }, + }), + }) } -pub fn query_all_nft_info(deps: Deps, env: Env, token_id: String) -> StdResult { +pub fn query_all_nft_info( + deps: Deps, + env: Env, + token_id: String, +) -> StdResult> { + let owner_of_res = query_owner_of(deps, env.clone(), token_id.to_string())?; + let nft_info_res = query_nft_info(deps, env, token_id)?; + Ok(AllNftInfoResponse { + access: owner_of_res, + info: nft_info_res, + }) +} + +pub fn query_tokens( + deps: Deps, + env: Env, + owner: String, + start_after: Option, + limit: Option, +) -> StdResult { let erc_addr = ERC721_ADDRESS.load(deps.storage)?; let querier = EvmQuerier::new(&deps.querier); - let res = querier.erc721_uri(env.clone().contract.address.into_string(), erc_addr.clone(), token_id.clone())?; - let owner_of_res = query_owner_of(deps, env, token_id)?; - to_json_binary(&AllNftInfoResponse{access: owner_of_res, info: NftInfoResponse{token_uri: Some(res.uri), extension: ""}}) + let num_tokens = query_num_tokens(deps, env.clone())?.count; + let start_after_id = Int256::from_str(&start_after.unwrap_or("-1".to_string()))?; + let limit = limit.unwrap_or(DEFAULT_LIMIT).min(MAX_LIMIT) as usize; + + let mut cur = Int256::zero(); + let mut counter = 0; + let mut tokens: Vec = vec![]; + while counter < num_tokens && tokens.len() < limit { + let cur_str = cur.to_string(); + let t_owner = match querier.erc721_owner( + env.clone().contract.address.into_string(), + erc_addr.clone(), + cur_str.to_string(), + ) { + Ok(res) => res.owner, + Err(_) => "".to_string(), + }; + if t_owner != "" { + counter += 1; + if (owner.is_empty() || t_owner == owner) && cur > start_after_id { + tokens.push(cur_str); + } + } + cur += Int256::one(); + } + Ok(TokensResponse { tokens }) +} + +pub fn query_all_tokens( + deps: Deps, + env: Env, + start_after: Option, + limit: Option, +) -> StdResult { + query_tokens(deps, env, "".to_string(), start_after, limit) } pub fn query_royalty_info( @@ -291,4 +409,32 @@ pub fn query_check_royalties(deps: Deps, env: Env,) -> StdResul Ok(CheckRoyaltiesResponse { royalty_payments: res.supported, }) -} \ No newline at end of file +} + +pub fn query_minter() -> Result, ContractError> { + Err(ContractError::NotSupported {}) +} + +pub fn query_ownership() -> Result, ContractError> { + Err(ContractError::NotSupported {}) +} + +pub fn query_all_operators( + _deps: Deps, + _env: Env, + _owner: String, + _start_after: Option, + _limit: Option, +) -> Result { + Err(ContractError::NotSupported {}) +} + +pub fn query_num_tokens(deps: Deps, env: Env) -> StdResult { + let erc_addr = ERC721_ADDRESS.load(deps.storage)?; + let querier = EvmQuerier::new(&deps.querier); + let res = querier + .erc721_total_supply(env.clone().contract.address.into_string(), erc_addr.clone())?; + Ok(NumTokensResponse { + count: res.supply.u128() as u64, + }) +} diff --git a/example/cosmwasm/cw721/src/error.rs b/example/cosmwasm/cw721/src/error.rs index 4758f75d2..bcfd0857c 100644 --- a/example/cosmwasm/cw721/src/error.rs +++ b/example/cosmwasm/cw721/src/error.rs @@ -8,4 +8,4 @@ pub enum ContractError { #[error("ERC721 does not have the requested functionality in specification")] NotSupported {}, -} \ No newline at end of file +} diff --git a/example/cosmwasm/cw721/src/msg.rs b/example/cosmwasm/cw721/src/msg.rs index dbddfaf3f..d303c35ee 100644 --- a/example/cosmwasm/cw721/src/msg.rs +++ b/example/cosmwasm/cw721/src/msg.rs @@ -1,6 +1,6 @@ use cosmwasm_std::{CosmosMsg, CustomMsg, CustomQuery, Uint128}; use schemars::JsonSchema; -use cosmwasm_schema::cw_serde; +use cosmwasm_schema::{cw_serde, QueryResponses}; use serde::{Deserialize, Serialize}; pub use cw721_base::{ExecuteMsg, QueryMsg}; @@ -81,6 +81,10 @@ pub enum EvmQuery { contract_address: String, interface_id: String, }, + Erc721TotalSupply { + caller: String, + contract_address: String, + }, } #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)] @@ -125,6 +129,11 @@ pub struct SupportsInterfaceResponse { pub supported: bool, } +#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)] +pub struct Erc721TotalSupplyResponse { + pub supply: Uint128, +} + // implement custom query impl CustomMsg for EvmMsg {} @@ -142,4 +151,41 @@ pub enum EvmMsg { to: String, data: String, // base64 encoded }, -} \ No newline at end of file +} + +#[cw_serde] +#[derive(QueryResponses)] +pub enum CwErc721QueryMsg { + #[returns(String)] + EvmAddress {}, + + // cw2981 + /// Should be called on sale to see if royalties are owed + /// by the marketplace selling the NFT, if CheckRoyalties + /// returns true + /// See https://eips.ethereum.org/EIPS/eip-2981 + #[returns(cw2981_royalties::msg::RoyaltiesInfoResponse)] + RoyaltyInfo { + token_id: String, + // the denom of this sale must also be the denom returned by RoyaltiesInfoResponse + // this was originally implemented as a Coin + // however that would mean you couldn't buy using CW20s + // as CW20 is just mapping of addr -> balance + sale_price: Uint128, + }, + /// Called against contract to determine if this NFT + /// implements royalties. Should return a boolean as part of + /// CheckRoyaltiesResponse - default can simply be true + /// if royalties are implemented at token level + /// (i.e. always check on sale) + #[returns(cw2981_royalties::msg::CheckRoyaltiesResponse)] + CheckRoyalties {}, +} + +impl Default for CwErc721QueryMsg { + fn default() -> Self { + CwErc721QueryMsg::EvmAddress {} + } +} + +impl CustomMsg for CwErc721QueryMsg {} \ No newline at end of file diff --git a/example/cosmwasm/cw721/src/querier.rs b/example/cosmwasm/cw721/src/querier.rs index 22f37bebc..f4b349f1f 100644 --- a/example/cosmwasm/cw721/src/querier.rs +++ b/example/cosmwasm/cw721/src/querier.rs @@ -1,6 +1,9 @@ use cosmwasm_std::{QuerierWrapper, StdResult, Uint128}; -use crate::msg::{Route, EvmQuery, EvmQueryWrapper, ErcPayloadResponse, Erc721OwnerResponse, Erc721ApprovedResponse, Erc721IsApprovedForAllResponse, Erc721NameSymbolResponse, Erc721UriResponse, Erc721RoyaltyInfoResponse, SupportsInterfaceResponse}; +use crate::msg::{Route, EvmQuery, EvmQueryWrapper, ErcPayloadResponse, Erc721OwnerResponse, Erc721ApprovedResponse, Erc721IsApprovedForAllResponse, Erc721NameSymbolResponse, Erc721UriResponse, Erc721RoyaltyInfoResponse, SupportsInterfaceResponse, Erc721TotalSupplyResponse}; + +pub const DEFAULT_LIMIT: u32 = 10; +pub const MAX_LIMIT: u32 = 30; pub struct EvmQuerier<'a> { querier: &'a QuerierWrapper<'a, EvmQueryWrapper>, @@ -133,4 +136,21 @@ impl<'a> EvmQuerier<'a> { self.querier.query(&request) } + + pub fn erc721_total_supply( + &self, + caller: String, + contract_address: String, + ) -> StdResult { + let request = EvmQueryWrapper { + route: Route::Evm, + query_data: EvmQuery::Erc721TotalSupply { + caller, + contract_address, + }, + } + .into(); + + self.querier.query(&request) + } } \ No newline at end of file diff --git a/wasmbinding/queries.go b/wasmbinding/queries.go index 485b93d0d..6ed1b157c 100644 --- a/wasmbinding/queries.go +++ b/wasmbinding/queries.go @@ -239,21 +239,24 @@ func (qp QueryPlugin) HandleEVMQuery(ctx sdk.Context, queryData json.RawMessage) case parsedQuery.ERC721IsApprovedForAll != nil: c := parsedQuery.ERC721IsApprovedForAll return qp.evmHandler.HandleERC721IsApprovedForAll(ctx, c.Caller, c.ContractAddress, c.Owner, c.Operator) + case parsedQuery.ERC721TotalSupply != nil: + c := parsedQuery.ERC721TotalSupply + return qp.evmHandler.HandleERC721TotalSupply(ctx, c.Caller, c.ContractAddress) case parsedQuery.ERC721NameSymbol != nil: c := parsedQuery.ERC721NameSymbol return qp.evmHandler.HandleERC721NameSymbol(ctx, c.Caller, c.ContractAddress) case parsedQuery.ERC721Uri != nil: c := parsedQuery.ERC721Uri return qp.evmHandler.HandleERC721Uri(ctx, c.Caller, c.ContractAddress, c.TokenID) + case parsedQuery.ERC721RoyaltyInfo != nil: + c := parsedQuery.ERC721RoyaltyInfo + return qp.evmHandler.HandleERC721RoyaltyInfo(ctx, c.Caller, c.ContractAddress, c.TokenID, c.SalePrice) case parsedQuery.GetEvmAddress != nil: c := parsedQuery.GetEvmAddress return qp.evmHandler.HandleGetEvmAddress(ctx, c.SeiAddress) case parsedQuery.GetSeiAddress != nil: c := parsedQuery.GetSeiAddress return qp.evmHandler.HandleGetSeiAddress(ctx, c.EvmAddress) - case parsedQuery.ERC721RoyaltyInfo != nil: - c := parsedQuery.ERC721RoyaltyInfo - return qp.evmHandler.HandleERC721RoyaltyInfo(ctx, c.Caller, c.ContractAddress, c.TokenID, c.SalePrice) case parsedQuery.SupportsInterface != nil: c := parsedQuery.SupportsInterface return qp.evmHandler.HandleSupportsInterface(ctx, c.Caller, c.InterfaceID, c.ContractAddress) diff --git a/x/evm/artifacts/erc721/artifacts.go b/x/evm/artifacts/erc721/artifacts.go index d4d099995..cf2e08e9b 100644 --- a/x/evm/artifacts/erc721/artifacts.go +++ b/x/evm/artifacts/erc721/artifacts.go @@ -2,7 +2,7 @@ package erc721 import "embed" -const CurrentVersion uint16 = 3 +const CurrentVersion uint16 = 4 //go:embed cwerc721.wasm var f embed.FS diff --git a/x/evm/artifacts/erc721/cwerc721.wasm b/x/evm/artifacts/erc721/cwerc721.wasm index 475accb7a5de8dd00b33ac26143c2ddf8970d9df..4867847483346c72be619446a6699c96f5b88b2f 100644 GIT binary patch literal 313709 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 z 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 Zuln|Z?#JGNR$SKhAPgZ~L5MB3{srCxIE?@R literal 295364 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�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 PhwGPI^HF7b*ERh=Dv_oN diff --git a/x/evm/client/wasm/bindings/queries.go b/x/evm/client/wasm/bindings/queries.go index 2e1ad292a..420f1a81a 100644 --- a/x/evm/client/wasm/bindings/queries.go +++ b/x/evm/client/wasm/bindings/queries.go @@ -18,11 +18,12 @@ type SeiEVMQuery struct { ERC721SetApprovalAllPayload *ERC721SetApprovalAllPayloadRequest `json:"erc721_set_approval_all_payload,omitempty"` ERC721Approved *ERC721ApprovedRequest `json:"erc721_approved,omitempty"` ERC721IsApprovedForAll *ERC721IsApprovedForAllRequest `json:"erc721_is_approved_for_all,omitempty"` + ERC721TotalSupply *ERC721TotalSupplyRequest `json:"erc721_total_supply,omitempty"` ERC721NameSymbol *ERC721NameSymbolRequest `json:"erc721_name_symbol,omitempty"` ERC721Uri *ERC721UriRequest `json:"erc721_uri,omitempty"` + ERC721RoyaltyInfo *ERC721RoyaltyInfoRequest `json:"erc721_royalty_info,omitempty"` GetEvmAddress *GetEvmAddressRequest `json:"get_evm_address,omitempty"` GetSeiAddress *GetSeiAddressRequest `json:"get_sei_address,omitempty"` - ERC721RoyaltyInfo *ERC721RoyaltyInfoRequest `json:"erc721_royalty_info,omitempty"` SupportsInterface *SupportsInterfaceRequest `json:"supports_interface,omitempty"` } @@ -99,6 +100,11 @@ type ERC721IsApprovedForAllRequest struct { Operator string `json:"operator"` } +type ERC721TotalSupplyRequest struct { + Caller string `json:"caller"` + ContractAddress string `json:"contract_address"` +} + type ERC721NameSymbolRequest struct { Caller string `json:"caller"` ContractAddress string `json:"contract_address"` @@ -110,6 +116,13 @@ type ERC721UriRequest struct { TokenID string `json:"token_id"` } +type ERC721RoyaltyInfoRequest struct { + Caller string `json:"caller"` + ContractAddress string `json:"contract_address"` + TokenID string `json:"token_id"` + SalePrice *sdk.Int `json:"sale_price"` +} + type GetEvmAddressRequest struct { SeiAddress string `json:"sei_address"` } @@ -118,13 +131,6 @@ type GetSeiAddressRequest struct { EvmAddress string `json:"evm_address"` } -type ERC721RoyaltyInfoRequest struct { - Caller string `json:"caller"` - ContractAddress string `json:"contract_address"` - TokenID string `json:"token_id"` - SalePrice *sdk.Int `json:"sale_price"` -} - type SupportsInterfaceRequest struct { Caller string `json:"caller"` ContractAddress string `json:"contract_address"` @@ -166,6 +172,10 @@ type ERC721IsApprovedForAllResponse struct { IsApproved bool `json:"is_approved"` } +type ERC721TotalSupplyResponse struct { + Supply *sdk.Int `json:"supply"` +} + type ERC721NameSymbolResponse struct { Name string `json:"name"` Symbol string `json:"symbol"` @@ -175,6 +185,11 @@ type ERC721UriResponse struct { Uri string `json:"uri"` } +type ERC721RoyaltyInfoResponse struct { + Receiver string `json:"receiver"` + RoyaltyAmount *sdk.Int `json:"royalty_amount"` +} + type GetEvmAddressResponse struct { EvmAddress string `json:"evm_address"` Associated bool `json:"associated"` @@ -185,11 +200,6 @@ type GetSeiAddressResponse struct { Associated bool `json:"associated"` } -type ERC721RoyaltyInfoResponse struct { - Receiver string `json:"receiver"` - RoyaltyAmount *sdk.Int `json:"royalty_amount"` -} - type SupportsInterfaceResponse struct { Supported bool `json:"supported"` } diff --git a/x/evm/client/wasm/query.go b/x/evm/client/wasm/query.go index 1fba5c5b3..f93597d90 100644 --- a/x/evm/client/wasm/query.go +++ b/x/evm/client/wasm/query.go @@ -175,7 +175,7 @@ func (h *EVMQueryHandler) HandleERC721Owner(ctx sdk.Context, caller string, cont } t, ok := sdk.NewIntFromString(tokenId) if !ok { - return nil, errors.New("invalid token ID for ERC20, must be a big Int") + return nil, errors.New("invalid token ID for ERC721, must be a big Int") } bz, err := abi.Pack("ownerOf", t.BigInt()) if err != nil { @@ -213,7 +213,7 @@ func (h *EVMQueryHandler) HandleERC721TransferPayload(ctx sdk.Context, from stri } t, ok := sdk.NewIntFromString(tokenId) if !ok { - return nil, errors.New("invalid token ID for ERC20, must be a big Int") + return nil, errors.New("invalid token ID for ERC721, must be a big Int") } bz, err := abi.Pack("transferFrom", fromEvmAddr, toEvmAddr, t.BigInt()) if err != nil { @@ -239,7 +239,7 @@ func (h *EVMQueryHandler) HandleERC721ApprovePayload(ctx sdk.Context, spender st } t, ok := sdk.NewIntFromString(tokenId) if !ok { - return nil, errors.New("invalid token ID for ERC20, must be a big Int") + return nil, errors.New("invalid token ID for ERC721, must be a big Int") } bz, err := abi.Pack("approve", spenderEvmAddr, t.BigInt()) if err != nil { @@ -362,7 +362,7 @@ func (h *EVMQueryHandler) HandleERC721Approved(ctx sdk.Context, caller string, c } t, ok := sdk.NewIntFromString(tokenId) if !ok { - return nil, errors.New("invalid token ID for ERC20, must be a big Int") + return nil, errors.New("invalid token ID for ERC721, must be a big Int") } bz, err := abi.Pack("getApproved", t.BigInt()) if err != nil { @@ -419,6 +419,33 @@ func (h *EVMQueryHandler) HandleERC721IsApprovedForAll(ctx sdk.Context, caller s return json.Marshal(response) } +func (h *EVMQueryHandler) HandleERC721TotalSupply(ctx sdk.Context, caller string, contractAddress string) ([]byte, error) { + callerAddr, err := sdk.AccAddressFromBech32(caller) + if err != nil { + return nil, err + } + contract := common.HexToAddress(contractAddress) + abi, err := cw721.Cw721MetaData.GetAbi() + if err != nil { + return nil, err + } + bz, err := abi.Pack("totalSupply") + if err != nil { + return nil, err + } + res, err := h.k.StaticCallEVM(ctx, callerAddr, &contract, bz) + if err != nil { + return nil, err + } + typed, err := abi.Unpack("totalSupply", res) + if err != nil { + return nil, err + } + totalSupply := sdk.NewIntFromBigInt(typed[0].(*big.Int)) + response := bindings.ERC721TotalSupplyResponse{Supply: &totalSupply} + return json.Marshal(response) +} + func (h *EVMQueryHandler) HandleERC721NameSymbol(ctx sdk.Context, caller string, contractAddress string) ([]byte, error) { callerAddr, err := sdk.AccAddressFromBech32(caller) if err != nil { @@ -466,7 +493,7 @@ func (h *EVMQueryHandler) HandleERC721Uri(ctx sdk.Context, caller string, contra } t, ok := sdk.NewIntFromString(tokenId) if !ok { - return nil, errors.New("invalid token ID for ERC20, must be a big Int") + return nil, errors.New("invalid token ID for ERC721, must be a big Int") } contract := common.HexToAddress(contractAddress) abi, err := cw721.Cw721MetaData.GetAbi() diff --git a/x/evm/client/wasm/query_test.go b/x/evm/client/wasm/query_test.go index 6ef307da9..194aec2cc 100644 --- a/x/evm/client/wasm/query_test.go +++ b/x/evm/client/wasm/query_test.go @@ -6,6 +6,7 @@ import ( "encoding/json" "math/big" "os" + "regexp" "strings" "testing" @@ -194,6 +195,22 @@ func TestHandleERC721IsApprovedForAll(t *testing.T) { require.NotEmpty(t, res2) } +func TestHandleERC721TotalSupply(t *testing.T) { + k, ctx := testkeeper.MockEVMKeeper() + privKey := testkeeper.MockPrivateKey() + res, _ := deployContract(t, ctx, k, "../../../../example/contracts/erc721/DummyERC721.bin", privKey) + addr1, e1 := testkeeper.MockAddressPair() + k.SetAddressMapping(ctx, addr1, e1) + receipt, err := k.GetReceipt(ctx, common.HexToHash(res.Hash)) + require.Nil(t, err) + contractAddr := common.HexToAddress(receipt.ContractAddress) + h := wasm.NewEVMQueryHandler(k) + res2, err := h.HandleERC721TotalSupply(ctx, addr1.String(), contractAddr.String()) + require.Nil(t, err) + require.NotEmpty(t, res2) + require.Equal(t, string(res2), "{\"supply\":\"101\"}") +} + func TestHandleERC721NameSymbol(t *testing.T) { k, ctx := testkeeper.MockEVMKeeper() privKey := testkeeper.MockPrivateKey() @@ -225,6 +242,24 @@ func TestHandleERC721TokenURI(t *testing.T) { require.NotEmpty(t, res2) } +func TestHandleERC721RoyaltyInfo(t *testing.T) { + k, ctx := testkeeper.MockEVMKeeper() + privKey := testkeeper.MockPrivateKey() + res, _ := deployContract(t, ctx, k, "../../../../example/contracts/erc721/DummyERC721.bin", privKey) + addr1, e1 := testkeeper.MockAddressPair() + k.SetAddressMapping(ctx, addr1, e1) + receipt, err := k.GetReceipt(ctx, common.HexToHash(res.Hash)) + require.Nil(t, err) + contractAddr := common.HexToAddress(receipt.ContractAddress) + h := wasm.NewEVMQueryHandler(k) + value := types.NewInt(100) + res2, err := h.HandleERC721RoyaltyInfo(ctx, addr1.String(), contractAddr.String(), "1", &value) + require.Nil(t, err) + require.NotEmpty(t, res2) + match, _ := regexp.MatchString(`{"receiver":"sei\w{39}","royalty_amount":"5"}`, string(res2)) + require.True(t, match) +} + func TestGetAddress(t *testing.T) { k, ctx := testkeeper.MockEVMKeeper() seiAddr1, evmAddr1 := testkeeper.MockAddressPair() diff --git a/x/evm/module_test.go b/x/evm/module_test.go index 4a5403577..f970e8a14 100644 --- a/x/evm/module_test.go +++ b/x/evm/module_test.go @@ -45,7 +45,7 @@ func TestModuleExportGenesis(t *testing.T) { module := evm.NewAppModule(nil, k) jsonMsg := module.ExportGenesis(ctx, types.ModuleCdc) jsonStr := string(jsonMsg) - assert.Equal(t, "{\"params\":{\"priority_normalizer\":\"1.000000000000000000\",\"base_fee_per_gas\":\"0.000000000000000000\",\"minimum_fee_per_gas\":\"1000000000.000000000000000000\",\"whitelisted_cw_code_hashes_for_delegate_call\":[]},\"address_associations\":[{\"sei_address\":\"sei17xpfvakm2amg962yls6f84z3kell8c5la4jkdu\",\"eth_address\":\"0x27F7B8B8B5A4e71E8E9aA671f4e4031E3773303F\"}],\"codes\":[],\"states\":[],\"nonces\":[],\"serialized\":[{\"prefix\":\"Fg==\",\"key\":\"AwAB\",\"value\":\"AAAAAAAAAAM=\"},{\"prefix\":\"Fg==\",\"key\":\"BAAD\",\"value\":\"AAAAAAAAAAQ=\"}]}", jsonStr) + assert.Equal(t, "{\"params\":{\"priority_normalizer\":\"1.000000000000000000\",\"base_fee_per_gas\":\"0.000000000000000000\",\"minimum_fee_per_gas\":\"1000000000.000000000000000000\",\"whitelisted_cw_code_hashes_for_delegate_call\":[]},\"address_associations\":[{\"sei_address\":\"sei17xpfvakm2amg962yls6f84z3kell8c5la4jkdu\",\"eth_address\":\"0x27F7B8B8B5A4e71E8E9aA671f4e4031E3773303F\"}],\"codes\":[],\"states\":[],\"nonces\":[],\"serialized\":[{\"prefix\":\"Fg==\",\"key\":\"AwAB\",\"value\":\"AAAAAAAAAAM=\"},{\"prefix\":\"Fg==\",\"key\":\"BAAE\",\"value\":\"AAAAAAAAAAQ=\"}]}", jsonStr) } func TestConsensusVersion(t *testing.T) { From 23bab217292c7a48c853aca319d8530f7b51acd0 Mon Sep 17 00:00:00 2001 From: Yiming Zang <50607998+yzang2019@users.noreply.github.com> Date: Thu, 16 May 2024 15:32:47 +0800 Subject: [PATCH 43/51] Fix genesis export command (#1653) * Fix genesis export command * Bump cosmos and seidb version * Fix go mod dependency issue --- app/app.go | 2 +- docker/rpcnode/Dockerfile | 6 +++--- go.mod | 4 ++-- go.sum | 8 ++++---- integration_test/chain_operation/snapshot_operation.yaml | 2 +- 5 files changed, 11 insertions(+), 11 deletions(-) diff --git a/app/app.go b/app/app.go index e6d82812e..336a84a4f 100644 --- a/app/app.go +++ b/app/app.go @@ -1651,7 +1651,7 @@ func (app *App) getFinalizeBlockResponse(appHash []byte, events []abci.Event, tx // LoadHeight loads a particular height func (app *App) LoadHeight(height int64) error { - return app.LoadVersion(height) + return app.LoadVersionWithoutInit(height) } // ModuleAccountAddrs returns all the app's module account addresses. diff --git a/docker/rpcnode/Dockerfile b/docker/rpcnode/Dockerfile index 56131445f..cf099206c 100644 --- a/docker/rpcnode/Dockerfile +++ b/docker/rpcnode/Dockerfile @@ -1,8 +1,8 @@ FROM ubuntu:latest RUN apt-get update && \ - apt-get install -y make git wget build-essential jq python3 curl vim -RUN wget https://go.dev/dl/go1.20.6.linux-amd64.tar.gz -RUN tar -xvf go1.20.6.linux-amd64.tar.gz + apt-get install -y make git wget build-essential jq python3 curl vim uuid-runtime +RUN wget https://go.dev/dl/go1.21.4.linux-amd64.tar.gz +RUN tar -xvf go1.21.4.linux-amd64.tar.gz RUN mv go /usr/local/ SHELL ["/bin/bash", "-c"] diff --git a/go.mod b/go.mod index acd28ca6e..70158be98 100644 --- a/go.mod +++ b/go.mod @@ -346,12 +346,12 @@ require ( replace ( github.com/CosmWasm/wasmd => github.com/sei-protocol/sei-wasmd v0.1.3 github.com/confio/ics23/go => github.com/cosmos/cosmos-sdk/ics23/go v0.8.0 - github.com/cosmos/cosmos-sdk => github.com/sei-protocol/sei-cosmos v0.3.13 + github.com/cosmos/cosmos-sdk => github.com/sei-protocol/sei-cosmos v0.3.16 github.com/cosmos/iavl => github.com/sei-protocol/sei-iavl v0.1.9 github.com/cosmos/ibc-go/v3 => github.com/sei-protocol/sei-ibc-go/v3 v3.3.0 github.com/ethereum/go-ethereum => github.com/sei-protocol/go-ethereum v1.13.5-sei-17 github.com/gogo/protobuf => github.com/regen-network/protobuf v1.3.3-alpha.regen.1 - github.com/sei-protocol/sei-db => github.com/sei-protocol/sei-db v0.0.36 + github.com/sei-protocol/sei-db => github.com/sei-protocol/sei-db v0.0.38 // Latest goleveldb is broken, we have to stick to this version github.com/syndtr/goleveldb => github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 github.com/tendermint/tendermint => github.com/sei-protocol/sei-tendermint v0.3.3 diff --git a/go.sum b/go.sum index 97a8fa2d4..88462ef61 100644 --- a/go.sum +++ b/go.sum @@ -1347,10 +1347,10 @@ github.com/sei-protocol/go-ethereum v1.13.5-sei-17 h1:NQcNuL/nmLCzVJFj6Za4ZrNj1O github.com/sei-protocol/go-ethereum v1.13.5-sei-17/go.mod h1:kcRZmuzRn1lVejiFNTz4l4W7imnpq1bDAnuKS/RyhbQ= github.com/sei-protocol/goutils v0.0.2 h1:Bfa7Sv+4CVLNM20QcpvGb81B8C5HkQC/kW1CQpIbXDA= github.com/sei-protocol/goutils v0.0.2/go.mod h1:iYE2DuJfEnM+APPehr2gOUXfuLuPsVxorcDO+Tzq9q8= -github.com/sei-protocol/sei-cosmos v0.3.13 h1:YNlvDYMJZUJjI9nyIeHqxw9TULGulvbClhMJH/gh2oU= -github.com/sei-protocol/sei-cosmos v0.3.13/go.mod h1:WWwx6XlJc9SrjdRwLW69o511hFpfUiHapYb+V9OqOG4= -github.com/sei-protocol/sei-db v0.0.36 h1:Qg8MlO/4btECyAB/XrbEexhpaS7OmYsrs9IUYULf+bY= -github.com/sei-protocol/sei-db v0.0.36/go.mod h1:F/ZKZA8HJPcUzSZPA8yt6pfwlGriJ4RDR4eHKSGLStI= +github.com/sei-protocol/sei-cosmos v0.3.16 h1:NVTpiSVExPeETJSLbARB5g3xkOG++/bgSvVtxUZHDNo= +github.com/sei-protocol/sei-cosmos v0.3.16/go.mod h1:xZYuJxxS6zdhNq+pKQPiaAjSZGU5EXe9bjrCdMBXxUQ= +github.com/sei-protocol/sei-db v0.0.38 h1:GiQl3qBd6XgGsHkJd4I8GnOmGjGoWQg3SJAS82TTNao= +github.com/sei-protocol/sei-db v0.0.38/go.mod h1:F/ZKZA8HJPcUzSZPA8yt6pfwlGriJ4RDR4eHKSGLStI= github.com/sei-protocol/sei-iavl v0.1.9 h1:y4mVYftxLNRs6533zl7N0/Ch+CzRQc04JDfHolIxgBE= github.com/sei-protocol/sei-iavl v0.1.9/go.mod h1:7PfkEVT5dcoQE+s/9KWdoXJ8VVVP1QpYYPLdxlkSXFk= github.com/sei-protocol/sei-ibc-go/v3 v3.3.0 h1:/mjpTuCSEVDJ51nUDSHU92N0bRSwt49r1rmdC/lqgp8= diff --git a/integration_test/chain_operation/snapshot_operation.yaml b/integration_test/chain_operation/snapshot_operation.yaml index 81c05eb6b..2231ef728 100644 --- a/integration_test/chain_operation/snapshot_operation.yaml +++ b/integration_test/chain_operation/snapshot_operation.yaml @@ -1,6 +1,6 @@ - name: Test validators should be able to create snapshot with custom location inputs: - # Check if snapshotd are created + # Check if snapshots are created - cmd: if [ -d "./build/generated/node_0/snapshots" ]; then echo "true"; else echo "false"; fi env: FOUND node: sei-node-0 From 3e5fdf16afab18284b7f52d38e89d3f9477b3ccd Mon Sep 17 00:00:00 2001 From: Philip Su Date: Thu, 16 May 2024 14:02:26 -0700 Subject: [PATCH 44/51] Revert "Fix genesis export command" (#1678) Revert "Fix genesis export command (#1653)" This reverts commit 23bab217292c7a48c853aca319d8530f7b51acd0. --- app/app.go | 2 +- docker/rpcnode/Dockerfile | 6 +++--- go.mod | 4 ++-- go.sum | 8 ++++---- integration_test/chain_operation/snapshot_operation.yaml | 2 +- 5 files changed, 11 insertions(+), 11 deletions(-) diff --git a/app/app.go b/app/app.go index 336a84a4f..e6d82812e 100644 --- a/app/app.go +++ b/app/app.go @@ -1651,7 +1651,7 @@ func (app *App) getFinalizeBlockResponse(appHash []byte, events []abci.Event, tx // LoadHeight loads a particular height func (app *App) LoadHeight(height int64) error { - return app.LoadVersionWithoutInit(height) + return app.LoadVersion(height) } // ModuleAccountAddrs returns all the app's module account addresses. diff --git a/docker/rpcnode/Dockerfile b/docker/rpcnode/Dockerfile index cf099206c..56131445f 100644 --- a/docker/rpcnode/Dockerfile +++ b/docker/rpcnode/Dockerfile @@ -1,8 +1,8 @@ FROM ubuntu:latest RUN apt-get update && \ - apt-get install -y make git wget build-essential jq python3 curl vim uuid-runtime -RUN wget https://go.dev/dl/go1.21.4.linux-amd64.tar.gz -RUN tar -xvf go1.21.4.linux-amd64.tar.gz + apt-get install -y make git wget build-essential jq python3 curl vim +RUN wget https://go.dev/dl/go1.20.6.linux-amd64.tar.gz +RUN tar -xvf go1.20.6.linux-amd64.tar.gz RUN mv go /usr/local/ SHELL ["/bin/bash", "-c"] diff --git a/go.mod b/go.mod index 70158be98..acd28ca6e 100644 --- a/go.mod +++ b/go.mod @@ -346,12 +346,12 @@ require ( replace ( github.com/CosmWasm/wasmd => github.com/sei-protocol/sei-wasmd v0.1.3 github.com/confio/ics23/go => github.com/cosmos/cosmos-sdk/ics23/go v0.8.0 - github.com/cosmos/cosmos-sdk => github.com/sei-protocol/sei-cosmos v0.3.16 + github.com/cosmos/cosmos-sdk => github.com/sei-protocol/sei-cosmos v0.3.13 github.com/cosmos/iavl => github.com/sei-protocol/sei-iavl v0.1.9 github.com/cosmos/ibc-go/v3 => github.com/sei-protocol/sei-ibc-go/v3 v3.3.0 github.com/ethereum/go-ethereum => github.com/sei-protocol/go-ethereum v1.13.5-sei-17 github.com/gogo/protobuf => github.com/regen-network/protobuf v1.3.3-alpha.regen.1 - github.com/sei-protocol/sei-db => github.com/sei-protocol/sei-db v0.0.38 + github.com/sei-protocol/sei-db => github.com/sei-protocol/sei-db v0.0.36 // Latest goleveldb is broken, we have to stick to this version github.com/syndtr/goleveldb => github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 github.com/tendermint/tendermint => github.com/sei-protocol/sei-tendermint v0.3.3 diff --git a/go.sum b/go.sum index 88462ef61..97a8fa2d4 100644 --- a/go.sum +++ b/go.sum @@ -1347,10 +1347,10 @@ github.com/sei-protocol/go-ethereum v1.13.5-sei-17 h1:NQcNuL/nmLCzVJFj6Za4ZrNj1O github.com/sei-protocol/go-ethereum v1.13.5-sei-17/go.mod h1:kcRZmuzRn1lVejiFNTz4l4W7imnpq1bDAnuKS/RyhbQ= github.com/sei-protocol/goutils v0.0.2 h1:Bfa7Sv+4CVLNM20QcpvGb81B8C5HkQC/kW1CQpIbXDA= github.com/sei-protocol/goutils v0.0.2/go.mod h1:iYE2DuJfEnM+APPehr2gOUXfuLuPsVxorcDO+Tzq9q8= -github.com/sei-protocol/sei-cosmos v0.3.16 h1:NVTpiSVExPeETJSLbARB5g3xkOG++/bgSvVtxUZHDNo= -github.com/sei-protocol/sei-cosmos v0.3.16/go.mod h1:xZYuJxxS6zdhNq+pKQPiaAjSZGU5EXe9bjrCdMBXxUQ= -github.com/sei-protocol/sei-db v0.0.38 h1:GiQl3qBd6XgGsHkJd4I8GnOmGjGoWQg3SJAS82TTNao= -github.com/sei-protocol/sei-db v0.0.38/go.mod h1:F/ZKZA8HJPcUzSZPA8yt6pfwlGriJ4RDR4eHKSGLStI= +github.com/sei-protocol/sei-cosmos v0.3.13 h1:YNlvDYMJZUJjI9nyIeHqxw9TULGulvbClhMJH/gh2oU= +github.com/sei-protocol/sei-cosmos v0.3.13/go.mod h1:WWwx6XlJc9SrjdRwLW69o511hFpfUiHapYb+V9OqOG4= +github.com/sei-protocol/sei-db v0.0.36 h1:Qg8MlO/4btECyAB/XrbEexhpaS7OmYsrs9IUYULf+bY= +github.com/sei-protocol/sei-db v0.0.36/go.mod h1:F/ZKZA8HJPcUzSZPA8yt6pfwlGriJ4RDR4eHKSGLStI= github.com/sei-protocol/sei-iavl v0.1.9 h1:y4mVYftxLNRs6533zl7N0/Ch+CzRQc04JDfHolIxgBE= github.com/sei-protocol/sei-iavl v0.1.9/go.mod h1:7PfkEVT5dcoQE+s/9KWdoXJ8VVVP1QpYYPLdxlkSXFk= github.com/sei-protocol/sei-ibc-go/v3 v3.3.0 h1:/mjpTuCSEVDJ51nUDSHU92N0bRSwt49r1rmdC/lqgp8= diff --git a/integration_test/chain_operation/snapshot_operation.yaml b/integration_test/chain_operation/snapshot_operation.yaml index 2231ef728..81c05eb6b 100644 --- a/integration_test/chain_operation/snapshot_operation.yaml +++ b/integration_test/chain_operation/snapshot_operation.yaml @@ -1,6 +1,6 @@ - name: Test validators should be able to create snapshot with custom location inputs: - # Check if snapshots are created + # Check if snapshotd are created - cmd: if [ -d "./build/generated/node_0/snapshots" ]; then echo "true"; else echo "false"; fi env: FOUND node: sei-node-0 From bdb98c8680a416b2370a0698d015143f1b210821 Mon Sep 17 00:00:00 2001 From: Philip Su Date: Thu, 16 May 2024 21:12:39 -0700 Subject: [PATCH 45/51] v5.4.0 release (#1674) * bump go mod * debug * debug * Add changelog --- CHANGELOG.md | 16 ++++++++++++++++ app/app.go | 1 + app/upgrades.go | 1 + go.mod | 18 +++++++++--------- go.sum | 32 ++++++++++++++++++-------------- 5 files changed, 45 insertions(+), 23 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 928df9d37..8bf79f596 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -27,6 +27,22 @@ Ref: https://keepachangelog.com/en/1.0.0/ --> # Changelog +## v5.4.0 +sei-chain +* [#1671](https://github.com/sei-protocol/sei-chain/pull/1671) Update and fixes to ERC721 contract +* [#1672](https://github.com/sei-protocol/sei-chain/pull/1672) Add sei_getCosmosTx endpoint +* [#1669](https://github.com/sei-protocol/sei-chain/pull/1669) Add ERC/CW 2981 in pointe +* [#1668](https://github.com/sei-protocol/sei-chain/pull/1673) Bring CW721 pointer contract up to spec +* [#1662](https://github.com/sei-protocol/sei-chain/pull/1662) Add memo support to ibc compiles +* [#1661](https://github.com/sei-protocol/sei-chain/pull/1661) Do not modify original value passed in executeBatch call + +sei-cosmos +*[#505](https://github.com/sei-protocol/sei-cosmos/pull/505) Fix export genesis for historical height +*[#506](https://github.com/sei-protocol/sei-cosmos/pull/506) Allow reading pairs in changeset before flush + +sei-wasmd +*[#50](https://github.com/sei-protocol/sei-wasmd/pull/50) Changes to fix runtime gas and add paramsKeeper to wasmKeeper for query gas multiplier + ## v5.2.0 sei-chain * [#1621](https://github.com/sei-protocol/sei-chain/pull/1621) Add websocket metrics diff --git a/app/app.go b/app/app.go index e6d82812e..0f99001b3 100644 --- a/app/app.go +++ b/app/app.go @@ -570,6 +570,7 @@ func New( app.WasmKeeper = wasm.NewKeeper( appCodec, keys[wasm.StoreKey], + app.ParamsKeeper, app.GetSubspace(wasm.ModuleName), app.AccountKeeper, app.BankKeeper, diff --git a/app/upgrades.go b/app/upgrades.go index e57e081f6..af543e5e4 100644 --- a/app/upgrades.go +++ b/app/upgrades.go @@ -97,6 +97,7 @@ var upgradesList = []string{ "v5.2.1", "v5.2.2", "v5.3.0", + "v5.4.0", } // if there is an override list, use that instead, for integration tests diff --git a/go.mod b/go.mod index acd28ca6e..ee08f9ab5 100644 --- a/go.mod +++ b/go.mod @@ -40,8 +40,8 @@ require ( go.opentelemetry.io/otel v1.9.0 go.opentelemetry.io/otel/trace v1.9.0 golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa - golang.org/x/sync v0.5.0 - golang.org/x/text v0.14.0 + golang.org/x/sync v0.7.0 + golang.org/x/text v0.15.0 golang.org/x/time v0.3.0 google.golang.org/genproto/googleapis/api v0.0.0-20240125205218-1f4bbc51befe google.golang.org/grpc v1.61.0 @@ -313,13 +313,13 @@ require ( go.opencensus.io v0.23.0 // indirect go.opentelemetry.io/otel/exporters/jaeger v1.9.0 // indirect go.opentelemetry.io/otel/sdk v1.9.0 // indirect - golang.org/x/crypto v0.18.0 // indirect + golang.org/x/crypto v0.23.0 // indirect golang.org/x/exp/typeparams v0.0.0-20220218215828-6cf2b201936e // indirect - golang.org/x/mod v0.14.0 // indirect - golang.org/x/net v0.20.0 // indirect - golang.org/x/sys v0.16.0 // indirect - golang.org/x/term v0.16.0 // indirect - golang.org/x/tools v0.15.0 // indirect + golang.org/x/mod v0.17.0 // indirect + golang.org/x/net v0.25.0 // indirect + golang.org/x/sys v0.20.0 // indirect + golang.org/x/term v0.20.0 // indirect + golang.org/x/tools v0.21.0 // indirect google.golang.org/genproto v0.0.0-20240116215550-a9fa1716bcac // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20240125205218-1f4bbc51befe // indirect gopkg.in/ini.v1 v1.67.0 // indirect @@ -344,7 +344,7 @@ require ( ) replace ( - github.com/CosmWasm/wasmd => github.com/sei-protocol/sei-wasmd v0.1.3 + github.com/CosmWasm/wasmd => github.com/sei-protocol/sei-wasmd v0.1.4 github.com/confio/ics23/go => github.com/cosmos/cosmos-sdk/ics23/go v0.8.0 github.com/cosmos/cosmos-sdk => github.com/sei-protocol/sei-cosmos v0.3.13 github.com/cosmos/iavl => github.com/sei-protocol/sei-iavl v0.1.9 diff --git a/go.sum b/go.sum index 97a8fa2d4..ceb870bc5 100644 --- a/go.sum +++ b/go.sum @@ -1359,8 +1359,8 @@ github.com/sei-protocol/sei-tendermint v0.3.3 h1:zH6xxrSRwHERaj/AcCR76U9daVY3Ub8 github.com/sei-protocol/sei-tendermint v0.3.3/go.mod h1:4LSlJdhl3nf3OmohliwRNUFLOB1XWlrmSodrIP7fLh4= github.com/sei-protocol/sei-tm-db v0.0.5 h1:3WONKdSXEqdZZeLuWYfK5hP37TJpfaUa13vAyAlvaQY= github.com/sei-protocol/sei-tm-db v0.0.5/go.mod h1:Cpa6rGyczgthq7/0pI31jys2Fw0Nfrc+/jKdP1prVqY= -github.com/sei-protocol/sei-wasmd v0.1.3 h1:8LtSauzetkPhjUN4uPTLMubSxr4rc7k9KWD9bnUf8xs= -github.com/sei-protocol/sei-wasmd v0.1.3/go.mod h1:CNF8PPkDFU0I/Lzw2+DbaNQhyxQj309ljOq7Waxj3fk= +github.com/sei-protocol/sei-wasmd v0.1.4 h1:StDThZwOJvLebeK1zTot8pByPd4kdM3AsBaKxLpDQPQ= +github.com/sei-protocol/sei-wasmd v0.1.4/go.mod h1:tv+4SYNzpryEPU1dV44+JFB5dIqpDAEx32RngGFgDeI= github.com/sei-protocol/tm-db v0.0.4 h1:7Y4EU62Xzzg6wKAHEotm7SXQR0aPLcGhKHkh3qd0tnk= github.com/sei-protocol/tm-db v0.0.4/go.mod h1:PWsIWOTwdwC7Ow/GUvx8HgUJTO691pBuorIQD8JvwAs= github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= @@ -1647,8 +1647,8 @@ golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98y golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= golang.org/x/crypto v0.15.0/go.mod h1:4ChreQoLWfG3xLDer1WdlH5NdlQ3+mwnQq1YTKY+72g= -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.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-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -1711,8 +1711,9 @@ 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.12.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-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -1787,8 +1788,8 @@ golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= golang.org/x/net v0.18.0/go.mod h1:/czyP5RqHAH4odGYxBJ1qz0+CE5WZ+2j1YgoEo8F2jQ= -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.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-20170207211851-4464e7848382/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= 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= @@ -1826,8 +1827,9 @@ golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/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.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.3.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/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-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -1954,8 +1956,8 @@ golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.14.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/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-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= 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= @@ -1968,8 +1970,8 @@ golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU= golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= golang.org/x/term v0.14.0/go.mod h1:TySc+nGkYR6qt8km8wUhuFRTVSMIX3XPR58y2lC8vww= -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.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= @@ -1987,8 +1989,9 @@ golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.10.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= -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= @@ -2105,8 +2108,9 @@ 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.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= -golang.org/x/tools v0.15.0 h1:zdAyfUGbYmuVokhzVmghFl2ZJh5QhcfebBgmVPFYA+8= golang.org/x/tools v0.15.0/go.mod h1:hpksKq4dtpQWS1uQ61JkdqWM3LscIS6Slf+VVkm+wQk= +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= From 2babe510f10b6653d1b9e762cf7bd058d3fdd428 Mon Sep 17 00:00:00 2001 From: Yiming Zang <50607998+yzang2019@users.noreply.github.com> Date: Fri, 17 May 2024 21:58:20 +0800 Subject: [PATCH 46/51] Add block number for receipt (#1682) Fix block number is not written to receipt --- x/evm/module.go | 1 + x/evm/module_test.go | 7 ++++--- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/x/evm/module.go b/x/evm/module.go index 0e42a94ba..aca99e0c9 100644 --- a/x/evm/module.go +++ b/x/evm/module.go @@ -227,6 +227,7 @@ func (am AppModule) EndBlock(ctx sdk.Context, _ abci.RequestEndBlock) []abci.Val TxHashHex: deferredInfo.TxHash.Hex(), TransactionIndex: uint32(deferredInfo.TxIndx), VmError: deferredInfo.Error, + BlockNumber: uint64(ctx.BlockHeight()), }) continue } diff --git a/x/evm/module_test.go b/x/evm/module_test.go index f970e8a14..402825718 100644 --- a/x/evm/module_test.go +++ b/x/evm/module_test.go @@ -74,7 +74,7 @@ func TestABCI(t *testing.T) { surplus, err := s.Finalize() require.Nil(t, err) require.Equal(t, sdk.ZeroInt(), surplus) - k.AppendToEvmTxDeferredInfo(ctx.WithTxIndex(1), ethtypes.Bloom{}, common.Hash{}, surplus) + k.AppendToEvmTxDeferredInfo(ctx.WithTxIndex(1), ethtypes.Bloom{}, common.Hash{4}, surplus) // 3rd tx s = state.NewDBImpl(ctx.WithTxIndex(3), k, false) s.SubBalance(evmAddr2, big.NewInt(5000000000000), tracing.BalanceChangeUnspecified) @@ -82,7 +82,7 @@ func TestABCI(t *testing.T) { surplus, err = s.Finalize() require.Nil(t, err) require.Equal(t, sdk.ZeroInt(), surplus) - k.AppendToEvmTxDeferredInfo(ctx.WithTxIndex(3), ethtypes.Bloom{}, common.Hash{}, surplus) + k.AppendToEvmTxDeferredInfo(ctx.WithTxIndex(3), ethtypes.Bloom{}, common.Hash{3}, surplus) k.SetTxResults([]*abci.ExecTxResult{{Code: 0}, {Code: 0}, {Code: 0}, {Code: 0}}) m.EndBlock(ctx, abci.RequestEndBlock{}) require.Equal(t, uint64(0), k.BankKeeper().GetBalance(ctx, k.AccountKeeper().GetModuleAddress(types.ModuleName), "usei").Amount.Uint64()) @@ -97,7 +97,7 @@ func TestABCI(t *testing.T) { surplus, err = s.Finalize() require.Nil(t, err) require.Equal(t, sdk.NewInt(1000000000000), surplus) - k.AppendToEvmTxDeferredInfo(ctx.WithTxIndex(2), ethtypes.Bloom{}, common.Hash{}, surplus) + k.AppendToEvmTxDeferredInfo(ctx.WithTxIndex(2), ethtypes.Bloom{}, common.Hash{2}, surplus) k.SetTxResults([]*abci.ExecTxResult{{Code: 0}, {Code: 0}, {Code: 0}}) m.EndBlock(ctx, abci.RequestEndBlock{}) require.Equal(t, uint64(1), k.BankKeeper().GetBalance(ctx, k.AccountKeeper().GetModuleAddress(types.ModuleName), "usei").Amount.Uint64()) @@ -110,6 +110,7 @@ func TestABCI(t *testing.T) { m.EndBlock(ctx, abci.RequestEndBlock{}) receipt, err := k.GetReceipt(ctx, common.Hash{1}) require.Nil(t, err) + require.Equal(t, receipt.BlockNumber, uint64(ctx.BlockHeight())) require.Equal(t, receipt.VmError, "test error") // fourth block with locked tokens in coinbase address From 96ec67295c77b2c0cc5b079aff327c23d0d7f832 Mon Sep 17 00:00:00 2001 From: Shab | Apollo DAO Date: Fri, 17 May 2024 10:12:42 -0400 Subject: [PATCH 47/51] cw721: Move transfer events after action event (#1679) * move transfer events after action event * Update compiled contract file and bump version * Update module test with new key --------- Co-authored-by: dvli2007 Co-authored-by: davyli --- contracts/wasm/cwerc721.wasm | Bin 307670 -> 304424 bytes .../cosmwasm/cw721/artifacts/checksums.txt | 2 +- .../cosmwasm/cw721/artifacts/cwerc721.wasm | Bin 313709 -> 304424 bytes example/cosmwasm/cw721/src/contract.rs | 34 +++++++++--------- x/evm/artifacts/erc721/artifacts.go | 2 +- x/evm/artifacts/erc721/cwerc721.wasm | Bin 313709 -> 304424 bytes x/evm/module_test.go | 2 +- 7 files changed, 21 insertions(+), 19 deletions(-) diff --git a/contracts/wasm/cwerc721.wasm b/contracts/wasm/cwerc721.wasm index a578175b00b65f04d6717056e9220bc6ad5b902a..a1cfac086240001e54a0de7f855cae0e40704a8a 100644 GIT binary patch literal 304424 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 literal 307670 zcmeFa3$$fdS?9YR`~5g)pL(8pBw2f>0_Q-56i}(EgaEaVb@Gs)6|6vr(IljbBvnO7 zio(V_GExzvq;1rUd$En(>F%hsI0S}i8XHv9*lJ(AjrY>Fw=arzS9`T(IA|{pAB}=~ zfB)~BbM3XyqpAWCw5ht z|K&-_gBlOGq$*L@JwKXu4UZqWD@pEZg(tjB%7Wa)lH981^pU$7D*4DGp<;i|ulx~J zXD_WY-B_W%I&;@d<)=T%9`PPM!hfpFF8P^9&Lr7C$!7Co4}4qw?l-;l)aj(A`{vO% z-FfQR-A9v#ezo}Z4^G{G`dE_cXWL%B<*na#Y*P4b_uTzJlE+UUIQEXy{%Qa2qeoBO z`E7Tfy#MIkd~emw*)u+P>jU@S!<+x*Sd!>VFMHqH-*Wc@<+H)tj@|R%%dXyc;-zX%+K_06XE@J)B0zURKF zSM{UE-t_i+eKg&N-hS-Vx8HfseRtpg0R8>5>`$^Ztz}tStEFrH*KF3C{FgPejK4ai z(^e}>k}Rq5S(erKj~C5aEy-0P$+CJ~FZ5qh%W9brD^IgLx3aZbiz>7FprrzJwMjYM z+keR%rTMI3FH#yxd6`m4y_vN-RNZZLyIDPH)Kt*^Q&E)+|7A_x)Hc*pdRu2)bz0Eq ztT8%Hd;Hf<({?-SQB9sS(puW9r5#n&Od9^5eo)eX=!-l{JB*($(NzYkM@iQAmYaFj z*tkhgXrbSv&c@8g^*l}H8r$+S>G;t{pG~@F zlJR5j|3$k#p=}_{~=BMsH{nk^-&!mI$A+?>j|ABjX zHYv!nQ}?Q_pGh~~{{UaT`R;p;39a6C|63op^8k-Kcisus-+kw?2ae`x_s%=-J9hVj zcfRTFw;ju~_W#C&jnnQ2(yu#o!z*8X)6K8?`qw;`z5cd0Jb3Hpvm-~2d_24L-=sgC z9vpup{b>5L>BrKaOMgE7h4k6<7t?>6{!&Uo{(tN7xBS1lz4dJmow{Dv-%Woq{a^Lu zU!=G4@ago2(|2Y+lKw(=h-d$2dh3s+KbHO<>8-z-{&MA$z4Kb7A4q4dM)ze@jg z$`}7v`rGM$0_y)c{dD>}R`n;+|0n%a`kU$hp8i()f%N0)-=v2Q{c85d*`e>s4&C~A z_O9&K@6MjgZha#AzU=$6*Z;%pyR+|wp#0P9sqCL+-;>??(d^%3AIYx&sqDkqv)O;h zem(nS_8+rPWS`4!{hsVUWuMM|JNt|5ce4MS{g>=7voB0_Yy99n@Vq9^KGSDe$Lhk&Ro&x%@L^4UOz9=emYKvwO-aOvc;@7Y!oy{@x?6JpSAeW*q8Q5cuXl@DK^=oHX2ZNl#ywi!mnGcMkKFF`pvHqO{OVCY8_!z@c%~BZm493- zKUOupT9?Oq*2{G_qr0p-_}MI>J9Oe_bd!yXkdAA^ zx*%8VzA|YU-2A>hsslT~Qy+gJxgHoMOa1-1df(ZXwbc4jlN#UZdQ2-p_D+s>l#OM;{>XHhei%SI9x&!tS0jn0@|3x}^ z*{70A#xuu9oq|FJ*-MH`1n{({C-&JwHV^hBZ2=aYBu++W}{w%10+CP0~$7bfL#XI)$feogA=16zlRm%tf`h_ zSV2ziS0QJ%)DWg*5jnlCI(5|n=0cHWk4*Yj)LHJMj>E8iWnvwKApx_js9%-T1%*sl z$;+n3sX_oc(?rx4^Om<2p^z1}B$(t(%djPKQ6K#Gbg4dRsh@A>t?+m;t3fpQ0buJq zp)Ue&sDwV~)5?eGg?!gtY5@MFT30=*)6HE*7Si>Q4h)STE1)4&q=TyVfm>f=1#}L! zqA#?YaggHn7&RIz(Fpp}B9P#(!m9Gd7ivKSLFt{f=joaeMGa zHFclpzzuyG8vkixd}FH~pB&Ed@dCH zX^q*fS&b2X@mkcNUp~d$1u4KfQ4?+HAq5mQ_&-xq3+#WuowNVVdex(Is*Qxy!19)Ik|Z36x}Tkf~jq0Qr8(UZpDud{xW-inoTNv}<6jLT}MIaeQT@tW%O1e!mn z)>Ici9aL({SJcD@9cT8iqmDCsP_ZVVZX$}S@AjxgIGh9rPeaW3g$LDMi zASpCaX+yK#0K#FF)P%&s4hT-f4y_Kyj+(?9+MFBzk*$S*Ny60L_;=sQ*z&>Wt2Jdy z`S3)ED%3c#X0(*S^LGqS>hfSHa&bCJ@6!seE*c`6C(^>%e=M)W^l%ucE>^n@Q_;RLy&(K7r4oDQ8fY*?(1To`>_=MJ9VlwEYbs>k*DBv|K zK-@NBS`hmxjUSzA{Eo?ptBo&YM~6m*?i#jK&mF@#RbgumvX~4vYcksqKrWIu`$<>W z7f0_56x=Ky7<&>91Rx}L?t>#c5C&q-!oK{r{mC+Sf(1nl7|a4-Jk?JOj?}1f2c2q} zv@k^&XM}$F_~Xg(#XNzQsli86_^6YVVtz3nj7}^yUI!exUjQ5C7qVSYC@#gYqlfdX z#rY_^6!Sj7WpJC@HnjW(mYb_0qMq}THbhd5^$)nPgj!rqh?Fv7tMNpUsb}*nKJS