diff --git a/.circleci/config.yml b/.circleci/config.yml index 5e5517d98d..7538b756c9 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -11,5 +11,4 @@ workflows: - path-filtering/filter: mapping: | hivesim-rs/.* hivesim-rs-ci true - simulators/portal/.* rust-ci true base-revision: origin/master diff --git a/docs/commandline.md b/docs/commandline.md index fde5f9a73c..a35509b83c 100644 --- a/docs/commandline.md +++ b/docs/commandline.md @@ -101,11 +101,6 @@ For example, the following command runs the `devp2p` simulator, limiting the run ./hive --sim devp2p --sim.limit eth/Large -This command runs the `consensus` simulator and runs only tests from the `stBugs` -directory (note the first `/`, matching any suite name): - - ./hive --sim ethereum/consensus --sim.limit /stBugs/ - `--sim.timelimit `: Simulation timeout. Hive aborts the simulator if it exceeds this time. There is no default timeout. diff --git a/docs/overview.md b/docs/overview.md index e4661fedef..3485834d19 100644 --- a/docs/overview.md +++ b/docs/overview.md @@ -43,19 +43,28 @@ continuously on the production hive instance: simulator then launches a 'sink' instance of every known client against the source and checks whether the sink can synchronize the chain from the source client. -- `ethereum/consensus`: This simulator runs the Ethereum 1 consensus tests against all - clients. While client implementers are generally expected to run these tests themselves, - they might not always run the latest tests, and may skip some of them if they take too - long. Running these tests in a hive simulation ensures that none are skipped. - - `ethereum/rpc`: The RPC simulator configures a client for clique PoA mining and runs various tests against the web3 JSON-RPC interface. These tests ensure that the client is able to receive transactions via RPC, incorporate them into its chain, and report transaction results via the standard APIs. -- `ethereum/graphql`: This simulator initializes a client with a known test chain and - enables the GraphQL API endpoint. It then performs certain queries and compares their - output to known good outputs. +- `ethereum/eels/consume-rlp`: This simulator runs modern execution layer consensus tests + generated by the EELS framework. It feeds RLP-encoded blocks to clients and verifies + that they arrive at the expected post-state. This is the replacement for the legacy + `ethereum/consensus` simulator that ran `BlockchainTests`. + +- `ethereum/eels/consume-engine`: Similar to `consume-rlp`, but delivers test payloads to + clients via the [Engine API] instead of RLP import. This verifies that clients handle + `engine_newPayloadV*` and `engine_forkchoiceUpdatedV*` calls correctly against the full + set of execution spec test fixtures. + + Both `consume-rlp` and `consume-engine` support the `fixtures` and `branch` build + arguments to pin a specific release: + + ./hive --sim ethereum/eels/consume-engine \ + --sim.buildarg fixtures=stable@v4.3.0 \ + --sim.buildarg branch=v4.3.0 \ + --client go-ethereum - `ethereum/engine`: The engine API simulator verifies specification compliance of the [Engine API] implementation of execution clients. The test suite 'pretends' to be a diff --git a/simulators/devp2p/main.go b/simulators/devp2p/main.go index ef833273f9..4dae20c042 100644 --- a/simulators/devp2p/main.go +++ b/simulators/devp2p/main.go @@ -73,16 +73,6 @@ func main() { runDiscv5Test(t, c, getBeaconENR) }, }, - hivesim.ClientTestSpec{ - Role: "portal", - Parameters: hivesim.Params{ - "HIVE_CHECK_LIVE_PORT": "8545", - }, - AlwaysRun: true, - Run: func(t *hivesim.T, c *hivesim.Client) { - runDiscv5Test(t, c, getPortalENR) - }, - }, }, } @@ -324,16 +314,3 @@ func getBeaconENR(c *hivesim.Client) (string, error) { } return responseJSON.Data.ENR, nil } - -func getPortalENR(c *hivesim.Client) (string, error) { - var nodeInfoResult struct { - ENR string `json:"enr"` - } - if err := c.RPC().Call(&nodeInfoResult, "discv5_nodeInfo"); err != nil { - return "", err - } - if nodeInfoResult.ENR == "" { - return "", fmt.Errorf("missing 'enr' in discv5_nodeInfo response") - } - return nodeInfoResult.ENR, nil -} diff --git a/simulators/eth2/engine/main.go b/simulators/eth2/engine/main.go index 75b5379732..436aac7341 100644 --- a/simulators/eth2/engine/main.go +++ b/simulators/eth2/engine/main.go @@ -20,7 +20,6 @@ var ( ) var engineTests = []testSpec{ - //{Name: "transition-testnet", Run: TransitionTestnet}, {Name: "test-rpc-error", Run: TestRPCError}, {Name: "block-latest-safe-finalized", Run: BlockLatestSafeFinalized}, {Name: "invalid-canonical-payload", Run: InvalidPayloadGen(2, Invalid)}, @@ -33,18 +32,6 @@ var engineTests = []testSpec{ {Name: "timeouts", Run: Timeouts}, } -var transitionTests = []testSpec{ - // Transition (TERMINAL_TOTAL_DIFFICULTY) tests - {Name: "invalid-transition-payload", Run: InvalidPayloadGen(1, Invalid)}, - {Name: "unknown-pow-parent-transition-payload", Run: UnknownPoWParent}, - {Name: "ttd-before-bellatrix", Run: TTDBeforeBellatrix}, - {Name: "equal-timestamp-terminal-transition-block", Run: EqualTimestampTerminalTransitionBlock}, - {Name: "invalid-terminal-block-payload-lower-ttd", Run: IncorrectTerminalBlockGen(-2)}, - {Name: "invalid-terminal-block-payload-higher-ttd", Run: IncorrectTerminalBlockGen(1)}, - {Name: "build-atop-invalid-terminal-block", Run: IncorrectTTDConfigEL}, - {Name: "no-viable-head-due-to-optimistic-sync", Run: NoViableHeadDueToOptimisticSync}, -} - func main() { // Create simulator that runs all tests sim := hivesim.New() @@ -64,23 +51,15 @@ func main() { panic("choose 1 validator client type") } // Create the test suites - var ( - engineSuite = hivesim.Suite{ - Name: "eth2-engine", - Description: `Collection of test vectors that use a ExecutionClient+BeaconNode+ValidatorClient testnet.`, - } - transitionSuite = hivesim.Suite{ - Name: "eth2-engine-transition", - Description: `Collection of test vectors that use a ExecutionClient+BeaconNode+ValidatorClient transition testnet.`, - } - ) - // Add all tests to the suites + engineSuite := hivesim.Suite{ + Name: "eth2-engine", + Description: `Collection of test vectors that use a ExecutionClient+BeaconNode+ValidatorClient testnet.`, + } + // Add all tests to the suite addAllTests(&engineSuite, c, engineTests) - addAllTests(&transitionSuite, c, transitionTests) - // Mark suites for execution + // Mark suite for execution hivesim.MustRunSuite(sim, engineSuite) - hivesim.MustRunSuite(sim, transitionSuite) } func addAllTests(suite *hivesim.Suite, c *clients.ClientDefinitionsByRole, tests []testSpec) { diff --git a/simulators/eth2/engine/scenarios.go b/simulators/eth2/engine/scenarios.go index df689550b9..5f490c8da2 100644 --- a/simulators/eth2/engine/scenarios.go +++ b/simulators/eth2/engine/scenarios.go @@ -17,7 +17,6 @@ import ( "github.com/ethereum/hive/simulators/eth2/common/config" cl "github.com/ethereum/hive/simulators/eth2/common/config/consensus" el "github.com/ethereum/hive/simulators/eth2/common/config/execution" - "github.com/ethereum/hive/simulators/eth2/common/debug" payload_spoof "github.com/ethereum/hive/simulators/eth2/common/spoofing/payload" tn "github.com/ethereum/hive/simulators/eth2/common/testnet" exec_client "github.com/marioevz/eth-clients/clients/execution" @@ -48,8 +47,6 @@ var ( Eth1Consensus: &el.ExecutionCliqueConsensus{}, } - SAFE_SLOTS_TO_IMPORT_OPTIMISTICALLY_CLIENT_OVERRIDE = map[string]*big.Int{} - MINIMAL_SLOT_TIME_CLIENTS = map[string]bool{ "lighthouse": true, "teku": true, @@ -72,55 +69,6 @@ func getClientConfig(n clients.NodeDefinition) *tn.Config { return &config } -func TransitionTestnet(t *hivesim.T, env *tn.Environment, - n clients.NodeDefinition, -) { - ctx := context.Background() - config := getClientConfig(n).Join(&tn.Config{ - NodeDefinitions: []clients.NodeDefinition{ - n, - n, - }, - }) - - testnet := tn.StartTestnet(ctx, t, env, config) - defer testnet.Stop() - - finalityCtx, cancel := testnet.Spec().EpochTimeoutContext( - ctx, - EPOCHS_TO_FINALITY+1, - ) - defer cancel() - - finalized, err := testnet.WaitForFinality(finalityCtx) - if err != nil { - t.Fatalf("FAIL: Waiting for finality: %v", err) - } - - if err := testnet.VerifyParticipation( - ctx, - tn.FirstSlotAfterCheckpoint{Checkpoint: &finalized}, - 0.95, - ); err != nil { - t.Fatalf("FAIL: Verifying participation: %v", err) - } - - if err := testnet.VerifyExecutionPayloadIsCanonical( - ctx, - tn.LastSlotAtCheckpoint{Checkpoint: &finalized}, - ); err != nil { - t.Fatalf("FAIL: Verifying execution payload is canonical: %v", err) - } - - if err := testnet.VerifyProposers( - ctx, - tn.LastSlotAtCheckpoint{Checkpoint: &finalized}, - false, - ); err != nil { - t.Fatalf("FAIL: Verifying proposers: %v", err) - } -} - func TestRPCError(t *hivesim.T, env *tn.Environment, n clients.NodeDefinition, ) { @@ -227,212 +175,6 @@ func BlockLatestSafeFinalized(t *hivesim.T, env *tn.Environment, } } -/* -Generate a testnet where the transition payload contains an unknown PoW parent. -Verify that the testnet can finalize after this. -*/ -func UnknownPoWParent(t *hivesim.T, env *tn.Environment, - n clients.NodeDefinition, -) { - ctx := context.Background() - config := getClientConfig(n).Join(&tn.Config{ - NodeDefinitions: clients.NodeDefinitions{ - n, - n, - n, - }, - }) - testnet := tn.StartTestnet(ctx, t, env, config) - defer testnet.Stop() - - var ( - getPayloadLock sync.Mutex - getPayloadCount int - invalidPayloadHash common.Hash - /* - invalidPayloadNewParent common.Hash - invalidPayloadOldParent common.Hash - */ - invalidPayloadNodeID int - ) - - // The EL mock will intercept an engine_getPayloadV1 call and set a random - // parent block in the response - getPayloadCallbackGen := func(node int) func([]byte, []byte) *spoof.Spoof { - return func(res []byte, req []byte) *spoof.Spoof { - getPayloadLock.Lock() - defer getPayloadLock.Unlock() - getPayloadCount++ - // Invalidate the transition payload - if getPayloadCount == 1 { - var spoof *spoof.Spoof - payload, err := PayloadFromResponse(res) - if err != nil { - panic(err) - } - t.Logf( - "INFO (%v): Generating payload with unknown PoW parent: %s", - t.TestID, - res, - ) - invalidPayloadHash, spoof, err = payload_spoof.GenerateInvalidPayloadSpoof( - EngineGetPayloadV1, - payload, - payload_spoof.InvalidParentHash, - VaultSigner, - ) - if err != nil { - panic(err) - } - t.Logf( - "INFO (%v): Invalidated payload hash: %v", - t.TestID, - invalidPayloadHash, - ) - invalidPayloadNodeID = node - return spoof - } - return nil - } - } - // The EL mock will intercept an engine_newPayloadV1 on the node that - // generated the invalid hash in order to validate it and broadcast it. - newPayloadCallbackGen := func(node int) func([]byte, []byte) *spoof.Spoof { - return func(res []byte, req []byte) *spoof.Spoof { - var ( - payload api.ExecutableData - spoof *spoof.Spoof - err error - ) - err = exec_client.UnmarshalFromJsonRPCRequest(req, &payload) - if err != nil { - panic(err) - } - - // Validate the new payload in the node that produced it - if invalidPayloadNodeID == node && - payload.BlockHash == invalidPayloadHash { - t.Logf( - "INFO (%v): Validating new payload: %s", - t.TestID, - payload.BlockHash, - ) - - spoof, err = payload_spoof.PayloadStatusSpoof( - EngineNewPayloadV1, - &api.PayloadStatusV1{ - Status: Valid, - LatestValidHash: &payload.BlockHash, - ValidationError: nil, - }, - ) - if err != nil { - panic(err) - } - return spoof - } - return nil - } - } - // The EL mock will intercept an engine_forkchoiceUpdatedV1 on the node - // that generated the invalid hash in order to validate and broadcast it. - fcUCallbackGen := func(node int) func([]byte, []byte) *spoof.Spoof { - return func(res []byte, req []byte) *spoof.Spoof { - var ( - fcState api.ForkchoiceStateV1 - pAttr api.PayloadAttributes - spoof *spoof.Spoof - err error - ) - err = exec_client.UnmarshalFromJsonRPCRequest( - req, - &fcState, - &pAttr, - ) - if err != nil { - panic(err) - } - - // Validate the new payload in the node that produced it - if invalidPayloadNodeID == node && - fcState.HeadBlockHash == invalidPayloadHash { - t.Logf( - "INFO (%v): Validating forkchoiceUpdated: %s", - t.TestID, - fcState.HeadBlockHash, - ) - - spoof, err = payload_spoof.ForkchoiceResponseSpoof( - EngineForkchoiceUpdatedV1, - api.PayloadStatusV1{ - Status: Valid, - LatestValidHash: &fcState.HeadBlockHash, - ValidationError: nil, - }, - nil, - ) - if err != nil { - panic(err) - } - return spoof - } - return nil - } - } - for n, p := range testnet.Proxies().Running() { - p.AddResponseCallbacks( - getPayloadCallbackGen(n), - exec_client.AllGetPayloadCalls...) - p.AddResponseCallbacks( - newPayloadCallbackGen(n), - exec_client.AllNewPayloadCalls...) - p.AddResponseCallbacks( - fcUCallbackGen(n), - exec_client.AllForkchoiceUpdatedCalls...) - } - - // Network should recover from this - finalityCtx, cancel := testnet.Spec().EpochTimeoutContext( - ctx, - EPOCHS_TO_FINALITY+1, - ) - defer cancel() - - finalized, err := testnet.WaitForFinality(finalityCtx) - if err != nil { - t.Fatalf("FAIL: Waiting for finality: %v", err) - } - - // Lowering participation requirement since we invalidated one block - // temporarily - if err := testnet.VerifyParticipation( - ctx, - tn.FirstSlotAfterCheckpoint{Checkpoint: &finalized}, - 0.80, - ); err != nil { - t.Fatalf("FAIL: Verifying participation: %v", err) - } - - if err := testnet.VerifyExecutionPayloadIsCanonical( - ctx, - tn.LastSlotAtCheckpoint{Checkpoint: &finalized}, - ); err != nil { - t.Fatalf("FAIL: Verifying execution payload is canonical: %v", err) - } - - if err := testnet.VerifyProposers( - ctx, - tn.LastSlotAtCheckpoint{Checkpoint: &finalized}, - true, - ); err != nil { - t.Fatalf("FAIL: Verifying proposers: %v", err) - } - - if err := testnet.VerifyELHeads(ctx); err != nil { - t.Fatalf("FAIL: Verifying EL Heads: %v", err) - } -} - /* Generates a testnet case where one payload is invalidated in the recipient nodes. @@ -870,21 +612,37 @@ func InvalidTimestampPayload( } } -func IncorrectTTDConfigEL( +func SyncingWithInvalidChain( t *hivesim.T, env *tn.Environment, n clients.NodeDefinition, ) { ctx := context.Background() - config := getClientConfig(n) - elTTD := config.TerminalTotalDifficulty.Int64() - 2 - config = config.Join(&tn.Config{ + config := getClientConfig(n).Join(&tn.Config{ NodeDefinitions: clients.NodeDefinitions{ + // Builder 1 + clients.NodeDefinition{ + ExecutionClient: n.ExecutionClient, + ConsensusClient: n.ConsensusClient, + ValidatorClient: n.ValidatorClient, + ValidatorShares: 1, + TestVerificationNode: false, + }, + // Builder 2 + clients.NodeDefinition{ + ExecutionClient: n.ExecutionClient, + ConsensusClient: n.ConsensusClient, + ValidatorClient: n.ValidatorClient, + ValidatorShares: 1, + TestVerificationNode: false, + }, + // Importer clients.NodeDefinition{ - // Add a node with an incorrect TTD to reject the invalid payload - ExecutionClient: n.ExecutionClient, - ConsensusClient: n.ConsensusClient, - ExecutionClientTTD: big.NewInt(elTTD), + ExecutionClient: n.ExecutionClient, + ConsensusClient: n.ConsensusClient, + ValidatorClient: n.ValidatorClient, + ValidatorShares: 0, + TestVerificationNode: true, }, }, }) @@ -893,227 +651,25 @@ func IncorrectTTDConfigEL( defer testnet.Stop() var ( - builder = testnet.BeaconClients().Running()[0] - ec = testnet.ExecutionClients().Running()[0] - ) - ttdCtx, cancel := context.WithTimeout( - ctx, - time.Duration(el.CLIQUE_PERIOD_DEFAULT*uint64(elTTD)*2)*time.Second, + transitionPayloadHeight uint64 + lastValidHash common.Hash + invalidPayloadHashes = make([]common.Hash, 0) + payloadMap = make(map[common.Hash]api.ExecutableData) + done = make(chan interface{}) ) - defer cancel() - if err := ec.WaitForTerminalTotalDifficulty(ttdCtx); err != nil { - t.Fatalf("FAIL: %v", err) - } - // Wait a couple of slots - time.Sleep(time.Duration(config.SlotTime.Uint64()*5) * time.Second) - - // Try to get the latest execution payload, must be nil - if b, err := builder.GetLatestExecutionBeaconBlock(ctx); err != nil { - t.Fatalf( - "FAIL: Unable to query for the latest execution payload: %v", - err, - ) - } else if b != nil { - t.Fatalf( - "FAIL: Execution payload was included in the beacon chain with a misconfigured TTD on the EL: %v", - b.StateRoot(), - ) - } -} - -// The produced and broadcasted transition payload has parent with an invalid total difficulty. -func IncorrectTerminalBlockGen( - ttdDelta int64, -) func(t *hivesim.T, env *tn.Environment, n clients.NodeDefinition) { - return func(t *hivesim.T, env *tn.Environment, n clients.NodeDefinition) { - ctx := context.Background() - config := getClientConfig(n) - BadTTD := big.NewInt(config.TerminalTotalDifficulty.Int64() + ttdDelta) - config = config.Join(&tn.Config{ - NodeDefinitions: clients.NodeDefinitions{ - clients.NodeDefinition{ - ExecutionClient: n.ExecutionClient, - ConsensusClient: n.ConsensusClient, - ValidatorShares: 1, - TestVerificationNode: true, - }, - clients.NodeDefinition{ - ExecutionClient: n.ExecutionClient, - ConsensusClient: n.ConsensusClient, - ValidatorShares: 1, - TestVerificationNode: true, - }, - clients.NodeDefinition{ - ExecutionClient: n.ExecutionClient, - ConsensusClient: n.ConsensusClient, - ValidatorShares: 1, - TestVerificationNode: true, - }, - clients.NodeDefinition{ - // Add a node with an incorrect TTD to reject the invalid payload - ExecutionClient: n.ExecutionClient, - ConsensusClient: n.ConsensusClient, - ValidatorShares: 0, - ExecutionClientTTD: BadTTD, - BeaconNodeTTD: BadTTD, - }, - }, - }) - - testnet := tn.StartTestnet(ctx, t, env, config) - defer testnet.Stop() - badTTDImporter := testnet.BeaconClients().Running()[3] - - // Wait for all execution clients with the correct TTD reach the merge - execPayloadCtx, cancel := testnet.Spec().SlotTimeoutContext( - ctx, - SlotsUntilMerge(ctx, testnet, config), - ) - defer cancel() - transitionPayloadHash, err := testnet.WaitForExecutionPayload( - execPayloadCtx, + // Payloads will be intercepted here and spoofed to simulate sync. + // Then after 4 payloads (p1, p2, p3, p4), the last one will be marked `INVALID` with + // `latestValidHash==p1.Hash` + newPayloadCallback := func(res []byte, req []byte) *spoof.Spoof { + var ( + payload api.ExecutableData + spoof *spoof.Spoof + err error ) + err = exec_client.UnmarshalFromJsonRPCRequest(req, &payload) if err != nil { - t.Fatalf("FAIL: Waiting for execution payload: %v", err) - } - - ec := testnet.ExecutionClients().Running()[0] - - transitionHeader, err := ec.HeaderByHash(ctx, transitionPayloadHash) - if err != nil { - t.Fatalf( - "FAIL: Unable to get transition payload header from execution client: %v", - err, - ) - } - - terminalHeader, err := ec.HeaderByHash( - ctx, - transitionHeader.ParentHash, - ) - if err != nil { - t.Fatalf( - "FAIL: Unable to get transition payload header from execution client: %v", - err, - ) - } - terminalBlockTD, err := ec.TotalDifficultyByHash( - ctx, - terminalHeader.Hash(), - ) - if err != nil { - t.Fatalf( - "FAIL: Unable to get terminal block total difficulty from execution client: %v", - err, - ) - } - - terminalParentHeader, err := ec.HeaderByHash( - ctx, - terminalHeader.ParentHash, - ) - if err != nil { - t.Fatalf( - "FAIL: Unable to get transition payload header from execution client: %v", - err, - ) - } - terminalBlockParentTD, err := ec.TotalDifficultyByHash( - ctx, - terminalParentHeader.Hash(), - ) - if err != nil { - t.Fatalf( - "FAIL: Unable to get terminal block total difficulty from execution client: %v", - err, - ) - } - - t.Logf( - "INFO: CorrectTTD=%d, BadTTD=%d, TerminalBlockTotalDifficulty=%d, TerminalBlockParentTotalDifficulty=%d", - config.TerminalTotalDifficulty, - BadTTD, - terminalBlockTD, - terminalBlockParentTD, - ) - - // Wait a couple of slots - time.Sleep(time.Duration(5*config.SlotTime.Uint64()) * time.Second) - - // Transition payload should not be part of the beacon node with bad TTD - b, err := testnet.VerifyExecutionPayloadHashInclusionNode( - ctx, - tn.LastestSlotByHead{}, - badTTDImporter, - transitionPayloadHash, - ) - if err != nil { - t.Fatalf("FAIL: Error during payload verification: %v", err) - } else if b != nil { - t.Fatalf("FAIL: Node with bad TTD included beacon block with correct TTD: %v", b) - } - } -} - -func SyncingWithInvalidChain( - t *hivesim.T, - env *tn.Environment, - n clients.NodeDefinition, -) { - ctx := context.Background() - config := getClientConfig(n).Join(&tn.Config{ - NodeDefinitions: clients.NodeDefinitions{ - // Builder 1 - clients.NodeDefinition{ - ExecutionClient: n.ExecutionClient, - ConsensusClient: n.ConsensusClient, - ValidatorClient: n.ValidatorClient, - ValidatorShares: 1, - TestVerificationNode: false, - }, - // Builder 2 - clients.NodeDefinition{ - ExecutionClient: n.ExecutionClient, - ConsensusClient: n.ConsensusClient, - ValidatorClient: n.ValidatorClient, - ValidatorShares: 1, - TestVerificationNode: false, - }, - // Importer - clients.NodeDefinition{ - ExecutionClient: n.ExecutionClient, - ConsensusClient: n.ConsensusClient, - ValidatorClient: n.ValidatorClient, - ValidatorShares: 0, - TestVerificationNode: true, - }, - }, - }) - - testnet := tn.StartTestnet(ctx, t, env, config) - defer testnet.Stop() - - var ( - transitionPayloadHeight uint64 - lastValidHash common.Hash - invalidPayloadHashes = make([]common.Hash, 0) - payloadMap = make(map[common.Hash]api.ExecutableData) - done = make(chan interface{}) - ) - - // Payloads will be intercepted here and spoofed to simulate sync. - // Then after 4 payloads (p1, p2, p3, p4), the last one will be marked `INVALID` with - // `latestValidHash==p1.Hash` - newPayloadCallback := func(res []byte, req []byte) *spoof.Spoof { - var ( - payload api.ExecutableData - spoof *spoof.Spoof - err error - ) - err = exec_client.UnmarshalFromJsonRPCRequest(req, &payload) - if err != nil { - panic(err) + panic(err) } payloadMap[payload.BlockHash] = payload if lastValidHash == (common.Hash{}) { @@ -1348,108 +904,6 @@ func BaseFeeEncodingCheck( ) } -func EqualTimestampTerminalTransitionBlock( - t *hivesim.T, - env *tn.Environment, - n clients.NodeDefinition, -) { - ctx := context.Background() - cfg := getClientConfig(n) - cfg = cfg.Join(&tn.Config{ - ForkConfig: &config.ForkConfig{ - // We are increasing the clique period, therefore we can reduce the TTD - TerminalTotalDifficulty: big.NewInt( - cfg.TerminalTotalDifficulty.Int64() / 3, - ), - }, - NodeDefinitions: []clients.NodeDefinition{ - n, - n, - }, - - // The clique period needs to be equal to the slot time to try to get the CL client to attempt to produce - // a payload with the same timestamp as the terminal block - Eth1Consensus: &el.ExecutionCliqueConsensus{ - CliquePeriod: cfg.SlotTime.Uint64(), - }, - }) - - testnet := tn.StartTestnet(ctx, t, env, cfg) - defer testnet.Stop() - - // No ForkchoiceUpdated with payload attributes should fail, which could happen if CL tries to create - // the payload with `timestamp==terminalBlock.timestamp`. - var ( - fcuLock sync.Mutex - fcUAttrCount int - fcudone = make(chan error) - fcUCountLimit = 5 - ) - - for _, p := range testnet.Proxies().Running() { - p.AddResponseCallbacks( - payload_spoof.CheckErrorOnForkchoiceUpdatedPayloadAttributes( - &fcuLock, - fcUCountLimit, - &fcUAttrCount, - fcudone, - ), - exec_client.AllForkchoiceUpdatedCalls..., - ) - } - - // Wait until we verified all subsequent forkchoiceUpdated calls - if err := <-fcudone; err != nil { - t.Fatalf("FAIL: ForkchoiceUpdated call failed: %v", err) - } -} - -func TTDBeforeBellatrix( - t *hivesim.T, - env *tn.Environment, - n clients.NodeDefinition, -) { - ctx := context.Background() - cfg := getClientConfig(n) - cfg = cfg.Join(&tn.Config{ - ForkConfig: &config.ForkConfig{ - AltairForkEpoch: common.Big1, - BellatrixForkEpoch: common.Big2, - TerminalTotalDifficulty: big.NewInt(150), - }, - NodeDefinitions: []clients.NodeDefinition{ - n, - n, - }, - }) - - testnet := tn.StartTestnet(ctx, t, env, cfg) - defer testnet.Stop() - - execPayloadCtx, cancel := testnet.Spec().SlotTimeoutContext( - ctx, - SlotsUntilMerge(ctx, testnet, cfg), - ) - defer cancel() - _, err := testnet.WaitForExecutionPayload(execPayloadCtx) - if err != nil { - for i, ec := range testnet.ExecutionClients().Running() { - if b, err := ec.BlockByNumber(ctx, nil); err == nil { - t.Logf( - "INFO: Last block on execution client %d: number=%d, hash=%s", - i, - b.NumberU64(), - b.Hash(), - ) - } - } - t.Fatalf("FAIL: Waiting for execution payload: %v", err) - } - if err := testnet.VerifyELHeads(ctx); err != nil { - t.Fatalf("FAIL: Verifying EL Heads: %v", err) - } -} - func InvalidQuantityPayloadFields( t *hivesim.T, env *tn.Environment, @@ -1695,333 +1149,3 @@ func InvalidQuantityPayloadFields( t.Logf("INFO: Success, none of the hashes were included") } } - -func NoViableHeadDueToOptimisticSync( - t *hivesim.T, - env *tn.Environment, - n clients.NodeDefinition, -) { - var ( - safeSlotsToImportOptimistically = big.NewInt(8) - // safeSlotsImportThreshold = uint64(4) - ctx = context.Background() - ) - if clientSafeSlots, ok := SAFE_SLOTS_TO_IMPORT_OPTIMISTICALLY_CLIENT_OVERRIDE[n.ConsensusClient]; ok { - safeSlotsToImportOptimistically = clientSafeSlots - } - - cfg := getClientConfig(n).Join(&tn.Config{ - NodeDefinitions: clients.NodeDefinitions{ - // Builder 1 - clients.NodeDefinition{ - ExecutionClient: n.ExecutionClient, - ConsensusClient: n.ConsensusClient, - ValidatorShares: 1, - }, - // Importer - clients.NodeDefinition{ - ExecutionClient: n.ExecutionClient, - ConsensusClient: n.ConsensusClient, - ValidatorShares: 0, - TestVerificationNode: true, - }, - // Builder 2 - clients.NodeDefinition{ - ExecutionClient: n.ExecutionClient, - ConsensusClient: n.ConsensusClient, - // We are going to duplicate keys from builder 1 - ValidatorShares: 0, - // Don't start until later in the run - DisableStartup: true, - }, - }, - ForkConfig: &config.ForkConfig{ - AltairForkEpoch: common.Big1, - BellatrixForkEpoch: big.NewInt(4), // Slot 128 - }, - Eth1Consensus: el.ExecutionEthashConsensus{ - MiningNodes: 2, - }, - ConsensusConfig: &cl.ConsensusConfig{ - SafeSlotsToImportOptimistically: safeSlotsToImportOptimistically, - }, - }) - - testnet := tn.StartTestnet(ctx, t, env, cfg) - defer testnet.Stop() - - var ( - builder1 = testnet.BeaconClients()[0] - importer = testnet.BeaconClients()[1] - builder1Proxy = testnet.Proxies().Running()[0] - importerProxy = testnet.Proxies().Running()[1] - // Not yet started - builder2 = testnet.BeaconClients()[2] - builder2Proxy *exec_client.Proxy - ) - - importerNewPayloadResponseMocker := payload_spoof.NewEngineResponseMocker( - nil, - ) - importerFcUResponseMocker := payload_spoof.NewEngineResponseMocker(nil) - importerNewPayloadResponseMocker.AddNewPayloadCallbackToProxy( - importerProxy, - ) - importerFcUResponseMocker.AddForkchoiceUpdatedCallbackToProxy( - importerProxy, - ) - - // We will count the number of payloads produced by builder 1. - // On Payload 33, the test continues. - var ( - getPayloadCount int - latestValidHash common.Hash - invalidHashes = make([]common.Hash, 0) - invalidPayload common.Hash - ) - getPayloadCallback := func(res []byte, req []byte) *spoof.Spoof { - getPayloadCount++ - payload, err := PayloadFromResponse(res) - if err != nil { - panic(err) - } - if getPayloadCount >= 10 && getPayloadCount <= 32 { - if getPayloadCount == 10 { - latestValidHash = payload.BlockHash - } else { - invalidHashes = append(invalidHashes, payload.BlockHash) - } - - // Return syncing for these payloads - importerNewPayloadResponseMocker.AddResponse( - payload.BlockHash, - &api.PayloadStatusV1{ - Status: Syncing, - LatestValidHash: nil, - }, - ) - importerFcUResponseMocker.AddResponse( - payload.BlockHash, - &api.PayloadStatusV1{ - Status: Syncing, - LatestValidHash: nil, - }, - ) - } else if getPayloadCount >= 33 { - // Invalidate these payloads - if getPayloadCount == 33 { - invalidPayload = payload.BlockHash - for _, h := range invalidHashes { - importerNewPayloadResponseMocker.AddResponse(h, &api.PayloadStatusV1{ - Status: Invalid, - LatestValidHash: &latestValidHash, - }) - importerFcUResponseMocker.AddResponse(h, &api.PayloadStatusV1{ - Status: Invalid, - LatestValidHash: &latestValidHash, - }) - } - - // Validate latest valid hash too - importerNewPayloadResponseMocker.AddResponse(latestValidHash, &api.PayloadStatusV1{ - Status: Valid, - LatestValidHash: &latestValidHash, - }) - importerFcUResponseMocker.AddResponse(latestValidHash, &api.PayloadStatusV1{ - Status: Valid, - LatestValidHash: &latestValidHash, - }) - - } - - invalidHashes = append(invalidHashes, payload.BlockHash) - importerNewPayloadResponseMocker.AddResponse(payload.BlockHash, &api.PayloadStatusV1{ - Status: Invalid, - LatestValidHash: &latestValidHash, - }) - importerFcUResponseMocker.AddResponse(payload.BlockHash, &api.PayloadStatusV1{ - Status: Invalid, - LatestValidHash: &latestValidHash, - }) - - } - return nil - } - builder1Proxy.AddResponseCallbacks( - getPayloadCallback, - exec_client.AllGetPayloadCalls...) - - execPayloadCtx, cancel := testnet.Spec().SlotTimeoutContext( - ctx, - 32, - ) - defer cancel() - if _, err := testnet.WaitForExecutionPayload(execPayloadCtx); err != nil { - t.Fatalf("Error waiting for execution payload") - } - -forloop: - for { - select { - case eR := <-importerNewPayloadResponseMocker.NewPayloadCalled: - if invalidPayload != (common.Hash{}) && eR.Hash == invalidPayload && eR.Response.Status == Invalid { - // The payload has been invalidated - t.Logf("INFO: Payload %s was correctly invalidated (NewPayload)", invalidPayload) - break forloop - } - case eR := <-importerFcUResponseMocker.ForkchoiceUpdatedCalled: - if invalidPayload != (common.Hash{}) && eR.Hash == invalidPayload { - if eR.Response.Status == Invalid { - // The payload has been invalidated - t.Logf("INFO: Payload %s was correctly invalidated (ForkchoiceUpdated)", invalidPayload) - break forloop - } else { - t.Fatalf("FAIL: Payload was not invalidated") - } - } - case <-testnet.Spec().SlotsTimeout(beacon.Slot(12)): - t.Fatalf("FAIL: Context done while waiting for invalidated payload") - } - } - - // Sleep a few seconds so the invalid payload is incorporated into the chain - time.Sleep(time.Duration(cfg.SlotTime.Int64()/2) * time.Second) - - // We need to check that the latestValidHash Block is indeed optimistic - // First look for the block on the builder - lvhBeaconBlock, err := builder1.GetBeaconBlockByExecutionHash( - ctx, - latestValidHash, - ) - if err != nil { - t.Fatalf( - "FAIL: Error querying latest valid hash from builder 1: %v", - err, - ) - } - t.Logf( - "INFO: latest valid hash from builder 1: slot %d, root %v", - lvhBeaconBlock.Slot(), - lvhBeaconBlock.StateRoot(), - ) - - lastInvalidBeaconBlock, err := builder1.GetBeaconBlockByExecutionHash( - ctx, - invalidPayload, - ) - if err != nil { - t.Fatalf( - "FAIL: Error querying latest invalid hash from builder 1: %v", - err, - ) - } - t.Logf( - "INFO: latest invalid hash from builder 1: slot %d, root %v", - lastInvalidBeaconBlock.Slot(), - lastInvalidBeaconBlock.StateRoot(), - ) - - // Check whether the importer is still optimistic for these blocks - - retriesLeft := 20 - - for { - // Retry several times in order to give the node some time to re-org if necessary - if retriesLeft--; retriesLeft == 0 { - debug.PrintAllBeaconBlocks(ctx, t, importer) - t.Fatalf("FAIL: Unable to get latestValidHash block: %v", err) - } - time.Sleep(time.Second) - t.Logf( - "INFO: retry %d to obtain beacon block at height %d", - 20-retriesLeft, - lvhBeaconBlock.Slot(), - ) - - if opt, err := importer.BlockIsOptimistic(ctx, eth2api.BlockHead); err != nil { - continue - } else if opt { - t.Logf("INFO: Head is optimistic from the importer's perspective") - break - } else { - t.Fatalf("FAIL: Head is NOT optimistic from the importer's perspective") - } - } - - // Shutdown the builder 1 - builder1.Shutdown() - - // Start builder 2 - // First start the execution node to set the proxy - if err := testnet.ExecutionClients()[2].Start(); err != nil { - t.Fatalf("FAIL: Unable to start execution client: %v", err) - } - - builder2Proxy = testnet.ExecutionClients()[2].Proxy() - - if builder2Proxy == nil { - t.Fatalf("FAIL: Proxy failed to start") - } - - importerNewPayloadResponseMocker.AddNewPayloadCallbackToProxy( - builder2Proxy, - ) - importerFcUResponseMocker.AddForkchoiceUpdatedCallbackToProxy( - builder2Proxy, - ) - - // Then start the beacon node - if err := testnet.BeaconClients()[2].Start(); err != nil { - t.Fatalf("FAIL: Unable to start beacon client: %v", err) - } - // Finally start the validator client reusing the keys of the first builder - testnet.ValidatorClients()[2].Keys = testnet.ValidatorClients()[0].Keys - if err := testnet.ValidatorClients()[2].Start(); err != nil { - t.Fatalf("FAIL: Unable to start validator client: %v", err) - } - - finalizationContext, cancel := testnet.Spec().SlotTimeoutContext( - ctx, - testnet.Spec().SLOTS_PER_EPOCH*3, - ) - defer cancel() - c, err := testnet.WaitForCurrentEpochFinalization(finalizationContext) - if err != nil { - debug.PrintAllBeaconBlocks(ctx, t, importer) - debug.PrintAllBeaconBlocks(ctx, t, builder2) - t.Fatalf( - "FAIL: Error waiting for finality after builder 2 started: %v", - err, - ) - } - t.Logf("INFO: Finality reached after builder 2 started: epoch %v", c.Epoch) - - // Check that importer is no longer optimistic - if opt, err := importer.BlockIsOptimistic(ctx, eth2api.BlockHead); err != nil { - t.Fatalf( - "FAIL: Error querying optimistic status after finalization on importer: %v", - err, - ) - } else if opt { - t.Fatalf("FAIL: Importer is still optimistic after finalization: execution_optimistic=%t", opt) - } - - // Check that neither the first invalid payload nor the last invalid payload are included in the importer - - if b, err := importer.GetBeaconBlockByExecutionHash(ctx, invalidHashes[0]); err != nil { - t.Fatalf("FAIL: Error querying invalid payload: %v", err) - } else if b != nil { - t.Fatalf( - "FAIL: Invalid payload found in importer chain: %d, %v", - b.Slot(), b.StateRoot(), - ) - } - if b, err := importer.GetBeaconBlockByExecutionHash(ctx, invalidPayload); err != nil { - t.Fatalf("FAIL: Error querying invalid payload: %v", err) - } else if b != nil { - t.Fatalf( - "FAIL: Invalid payload found in importer chain: %d, %v", - b.Slot(), b.StateRoot(), - ) - } -} diff --git a/simulators/eth2/go.work b/simulators/eth2/go.work index eda1a95dc3..bbecedf14d 100644 --- a/simulators/eth2/go.work +++ b/simulators/eth2/go.work @@ -6,6 +6,5 @@ use ( ./common ./dencun ./engine - ./testnet ./withdrawals ) diff --git a/simulators/eth2/testnet/Dockerfile b/simulators/eth2/testnet/Dockerfile deleted file mode 100644 index 79db7b3215..0000000000 --- a/simulators/eth2/testnet/Dockerfile +++ /dev/null @@ -1,19 +0,0 @@ -FROM golang:1.22-alpine AS builder -ARG GOPROXY -ENV GOPROXY=${GOPROXY} - -RUN apk --no-cache add gcc musl-dev linux-headers cmake make clang build-base clang-static clang-dev - -# Prepare workspace. -# Note: the build context of this simulator image is the parent directory! -ADD . /source - -# Build within simulator folder -WORKDIR /source/testnet -RUN go build -o ./sim . - -# Build the runner container. -FROM alpine:latest -ADD . / -COPY --from=builder /source/testnet/sim / -ENTRYPOINT ["./sim"] diff --git a/simulators/eth2/testnet/go.mod b/simulators/eth2/testnet/go.mod deleted file mode 100644 index 23c27f8bd8..0000000000 --- a/simulators/eth2/testnet/go.mod +++ /dev/null @@ -1,102 +0,0 @@ -module github.com/ethereum/hive/simulators/eth2/testnet - -go 1.21 - -toolchain go1.22.1 - -require ( - github.com/ethereum/hive v0.0.0-20240715150147-c87a99dccfce - github.com/ethereum/hive/simulators/eth2/common v0.0.0-20230316220410-1364352c32a6 -) - -require ( - github.com/go-ole/go-ole v1.3.0 // indirect - github.com/go-stack/stack v1.8.1 // indirect - github.com/shirou/gopsutil v3.21.11+incompatible // indirect - github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a // indirect - github.com/tklauser/go-sysconf v0.3.12 // indirect - golang.org/x/sys v0.20.0 // indirect -) - -require ( - github.com/DataDog/zstd v1.5.2 // indirect - github.com/Microsoft/go-winio v0.6.2 // indirect - github.com/VictoriaMetrics/fastcache v1.12.2 // indirect - github.com/beorn7/perks v1.0.1 // indirect - github.com/bits-and-blooms/bitset v1.10.0 // indirect - github.com/btcsuite/btcd/btcec/v2 v2.3.2 // indirect - github.com/cespare/xxhash/v2 v2.3.0 // indirect - github.com/cockroachdb/errors v1.11.1 // indirect - github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b // indirect - github.com/cockroachdb/pebble v1.1.0 // indirect - github.com/cockroachdb/redact v1.1.5 // indirect - github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 // indirect - github.com/consensys/bavard v0.1.13 // indirect - github.com/consensys/gnark-crypto v0.12.1 // indirect - github.com/crate-crypto/go-ipa v0.0.0-20240223125850-b1e8a79f509c // indirect - github.com/crate-crypto/go-kzg-4844 v1.0.0 // indirect - github.com/deckarep/golang-set/v2 v2.6.0 // indirect - github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 // indirect - github.com/ethereum/c-kzg-4844 v1.0.0 // indirect - github.com/ethereum/go-ethereum v1.14.5 // indirect - github.com/ethereum/go-verkle v0.1.1-0.20240306133620-7d920df305f0 // indirect - github.com/ferranbt/fastssz v0.1.2 // indirect - github.com/getsentry/sentry-go v0.18.0 // indirect - github.com/gofrs/flock v0.8.1 // indirect - github.com/gogo/protobuf v1.3.2 // indirect - github.com/golang-jwt/jwt/v4 v4.5.0 // indirect - github.com/golang/protobuf v1.5.4 // indirect - github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect - github.com/google/go-cmp v0.6.0 // indirect - github.com/google/uuid v1.3.0 // indirect - github.com/gorilla/mux v1.8.1 // indirect - github.com/gorilla/websocket v1.5.0 // indirect - github.com/herumi/bls-eth-go-binary v1.28.1 // indirect - github.com/holiman/bloomfilter/v2 v2.0.3 // indirect - github.com/holiman/uint256 v1.2.4 // indirect - github.com/julienschmidt/httprouter v1.3.0 // indirect - github.com/kilic/bls12-381 v0.1.0 // indirect - github.com/klauspost/compress v1.15.15 // indirect - github.com/klauspost/cpuid/v2 v2.2.2 // indirect - github.com/kr/pretty v0.3.1 // indirect - github.com/kr/text v0.2.0 // indirect - github.com/lithammer/dedent v1.1.0 // indirect - github.com/mattn/go-colorable v0.1.13 // indirect - github.com/mattn/go-isatty v0.0.20 // indirect - github.com/mattn/go-runewidth v0.0.14 // indirect - github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect - github.com/minio/sha256-simd v1.0.0 // indirect - github.com/mitchellh/mapstructure v1.5.0 // indirect - github.com/mmcloughlin/addchain v0.4.0 // indirect - github.com/olekukonko/tablewriter v0.0.5 // indirect - github.com/pkg/errors v0.9.1 // indirect - github.com/prometheus/client_golang v1.14.0 // indirect - github.com/prometheus/client_model v0.3.0 // indirect - github.com/prometheus/common v0.39.0 // indirect - github.com/prometheus/procfs v0.9.0 // indirect - github.com/protolambda/bls12-381-util v0.1.0 // indirect - github.com/protolambda/eth2api v0.0.0-20230316214135-5f8afbd6d05d // indirect - github.com/protolambda/go-keystorev4 v0.0.0-20211007151826-f20444f6d564 // indirect - github.com/protolambda/zrnt v0.32.2 // indirect - github.com/protolambda/ztyp v0.2.2 // indirect - github.com/rauljordan/engine-proxy v0.0.0-20230316220057-4c80c36c4c3a // indirect - github.com/rivo/uniseg v0.4.3 // indirect - github.com/rogpeppe/go-internal v1.9.0 // indirect - github.com/sirupsen/logrus v1.9.3 // indirect - github.com/supranational/blst v0.3.11 // indirect - github.com/tklauser/numcpus v0.6.1 // indirect - github.com/tyler-smith/go-bip39 v1.1.0 // indirect - github.com/wealdtech/go-bytesutil v1.2.0 // indirect - github.com/wealdtech/go-eth2-types/v2 v2.8.0 // indirect - github.com/wealdtech/go-eth2-util v1.8.0 // indirect - github.com/yusufpapurcu/wmi v1.2.2 // indirect - golang.org/x/crypto v0.22.0 // indirect - golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa // indirect - golang.org/x/sync v0.7.0 // indirect - golang.org/x/text v0.14.0 // indirect - google.golang.org/protobuf v1.33.0 // indirect - gopkg.in/inconshreveable/log15.v2 v2.0.0-20200109203555-b30bc20e4fd1 // indirect - gopkg.in/yaml.v2 v2.4.0 // indirect - gopkg.in/yaml.v3 v3.0.1 // indirect - rsc.io/tmplfunc v0.0.3 // indirect -) diff --git a/simulators/eth2/testnet/go.sum b/simulators/eth2/testnet/go.sum deleted file mode 100644 index 77038ea6e0..0000000000 --- a/simulators/eth2/testnet/go.sum +++ /dev/null @@ -1,376 +0,0 @@ -github.com/DataDog/zstd v1.5.2 h1:vUG4lAyuPCXO0TLbXvPv7EB7cNK1QV/luu55UHLrrn8= -github.com/DataDog/zstd v1.5.2/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw= -github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= -github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= -github.com/VictoriaMetrics/fastcache v1.12.2 h1:N0y9ASrJ0F6h0QaC3o6uJb3NIZ9VKLjCM7NQbSmF7WI= -github.com/VictoriaMetrics/fastcache v1.12.2/go.mod h1:AmC+Nzz1+3G2eCPapF6UcsnkThDcMsQicp4xDukwJYI= -github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= -github.com/allegro/bigcache v1.2.1 h1:hg1sY1raCwic3Vnsvje6TT7/pnZba83LeFck5NrFKSc= -github.com/allegro/bigcache v1.2.1/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= -github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= -github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/bits-and-blooms/bitset v1.10.0 h1:ePXTeiPEazB5+opbv5fr8umg2R/1NlzgDsyepwsSr88= -github.com/bits-and-blooms/bitset v1.10.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= -github.com/btcsuite/btcd/btcec/v2 v2.3.2 h1:5n0X6hX0Zk+6omWcihdYvdAlGf2DfasC0GMf7DClJ3U= -github.com/btcsuite/btcd/btcec/v2 v2.3.2/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= -github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOFYSNEs0TFnxxnS9+4U= -github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= -github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= -github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= -github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= -github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f h1:otljaYPt5hWxV3MUfO5dFPFiOXg9CyG5/kCfayTqsJ4= -github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= -github.com/cockroachdb/errors v1.11.1 h1:xSEW75zKaKCWzR3OfxXUxgrk/NtT4G1MiOv5lWZazG8= -github.com/cockroachdb/errors v1.11.1/go.mod h1:8MUxA3Gi6b25tYlFEBGLf+D8aISL+M4MIpiWMSNRfxw= -github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b h1:r6VH0faHjZeQy818SGhaone5OnYfxFR/+AzdY3sf5aE= -github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= -github.com/cockroachdb/pebble v1.1.0 h1:pcFh8CdCIt2kmEpK0OIatq67Ln9uGDYY3d5XnE0LJG4= -github.com/cockroachdb/pebble v1.1.0/go.mod h1:sEHm5NOXxyiAoKWhoFxT8xMgd/f3RA6qUqQ1BXKrh2E= -github.com/cockroachdb/redact v1.1.5 h1:u1PMllDkdFfPWaNGMyLD1+so+aq3uUItthCFqzwPJ30= -github.com/cockroachdb/redact v1.1.5/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= -github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 h1:zuQyyAKVxetITBuuhv3BI9cMrmStnpT18zmgmTxunpo= -github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06/go.mod h1:7nc4anLGjupUW/PeY5qiNYsdNXj7zopG+eqsS7To5IQ= -github.com/consensys/bavard v0.1.13 h1:oLhMLOFGTLdlda/kma4VOJazblc7IM5y5QPd2A/YjhQ= -github.com/consensys/bavard v0.1.13/go.mod h1:9ItSMtA/dXMAiL7BG6bqW2m3NdSEObYWoH223nGHukI= -github.com/consensys/gnark-crypto v0.12.1 h1:lHH39WuuFgVHONRl3J0LRBtuYdQTumFSDtJF7HpyG8M= -github.com/consensys/gnark-crypto v0.12.1/go.mod h1:v2Gy7L/4ZRosZ7Ivs+9SfUDr0f5UlG+EM5t7MPHiLuY= -github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w= -github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= -github.com/crate-crypto/go-ipa v0.0.0-20240223125850-b1e8a79f509c h1:uQYC5Z1mdLRPrZhHjHxufI8+2UG/i25QG92j0Er9p6I= -github.com/crate-crypto/go-ipa v0.0.0-20240223125850-b1e8a79f509c/go.mod h1:geZJZH3SzKCqnz5VT0q/DyIG/tvu/dZk+VIfXicupJs= -github.com/crate-crypto/go-kzg-4844 v1.0.0 h1:TsSgHwrkTKecKJ4kadtHi4b3xHW5dCFUDFnUp1TsawI= -github.com/crate-crypto/go-kzg-4844 v1.0.0/go.mod h1:1kMhvPgI0Ky3yIa+9lFySEBUBXkYxeOi8ZF1sYioxhc= -github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/deckarep/golang-set/v2 v2.6.0 h1:XfcQbWM1LlMB8BsJ8N9vW5ehnnPVIw0je80NsVHagjM= -github.com/deckarep/golang-set/v2 v2.6.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= -github.com/decred/dcrd/crypto/blake256 v1.0.0 h1:/8DMNYp9SGi5f0w7uCm6d6M4OU2rGFK09Y2A4Xv7EE0= -github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc= -github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 h1:HbphB4TFFXpv7MNrT52FGrrgVXF1owhMVTHFZIlnvd4= -github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0/go.mod h1:DZGJHZMqrU4JJqFAWUS2UO1+lbSKsdiOoYi9Zzey7Fc= -github.com/ethereum/c-kzg-4844 v1.0.0 h1:0X1LBXxaEtYD9xsyj9B9ctQEZIpnvVDeoBx8aHEwTNA= -github.com/ethereum/c-kzg-4844 v1.0.0/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= -github.com/ethereum/go-ethereum v1.14.5 h1:szuFzO1MhJmweXjoM5nSAeDvjNUH3vIQoMzzQnfvjpw= -github.com/ethereum/go-ethereum v1.14.5/go.mod h1:VEDGGhSxY7IEjn98hJRFXl/uFvpRgbIIf2PpXiyGGgc= -github.com/ethereum/go-verkle v0.1.1-0.20240306133620-7d920df305f0 h1:KrE8I4reeVvf7C1tm8elRjj4BdscTYzz/WAbYyf/JI4= -github.com/ethereum/go-verkle v0.1.1-0.20240306133620-7d920df305f0/go.mod h1:D9AJLVXSyZQXJQVk8oh1EwjISE+sJTn2duYIZC0dy3w= -github.com/ethereum/hive v0.0.0-20240715150147-c87a99dccfce h1:wgH9mh3TFSd+LFSsXO6RdTEO3niapJRywO1Xl3/IoIE= -github.com/ethereum/hive v0.0.0-20240715150147-c87a99dccfce/go.mod h1:ghNXZW+/WQClcyiwZpbTzUCyxwql7YeMacYd44v+BJE= -github.com/ethereum/hive/simulators/eth2/common v0.0.0-20230316220410-1364352c32a6 h1:LcSUNGwQuJyR/gdPcsif57yKX+3MyhpoAuChzR8k6Yk= -github.com/ethereum/hive/simulators/eth2/common v0.0.0-20230316220410-1364352c32a6/go.mod h1:FX4oxNyTNw/P+TUWrb7vva7o/rFI0pHO7OYdtG6EtN4= -github.com/ferranbt/fastssz v0.1.2 h1:Dky6dXlngF6Qjc+EfDipAkE83N5I5DE68bY6O0VLNPk= -github.com/ferranbt/fastssz v0.1.2/go.mod h1:X5UPrE2u1UJjxHA8X54u04SBwdAQjG2sFtWs39YxyWs= -github.com/fjl/memsize v0.0.2 h1:27txuSD9or+NZlnOWdKUxeBzTAUkWCVh+4Gf2dWFOzA= -github.com/fjl/memsize v0.0.2/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0= -github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= -github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= -github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= -github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff h1:tY80oXqGNY4FhTFhk+o9oFHGINQ/+vhlm8HFzi6znCI= -github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff/go.mod h1:x7DCsMOv1taUwEWCzT4cmDeAkigA5/QCwUodaVOe8Ww= -github.com/getsentry/sentry-go v0.18.0 h1:MtBW5H9QgdcJabtZcuJG80BMOwaBpkRDZkxRkNC1sN0= -github.com/getsentry/sentry-go v0.18.0/go.mod h1:Kgon4Mby+FJ7ZWHFUAZgVaIa8sxHtnRJRLTXZr51aKQ= -github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= -github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= -github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= -github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= -github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= -github.com/go-stack/stack v1.8.1 h1:ntEHSVwIt7PNXNpgPmVfMrNhLtgjlmnZha2kOpuRiDw= -github.com/go-stack/stack v1.8.1/go.mod h1:dcoOX6HbPZSZptuspn9bctJ+N/CnF5gGygcUP3XYfe4= -github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= -github.com/gofrs/flock v0.8.1 h1:+gYjHKf32LDeiEEFhQaotPbLuUXjY5ZqxKgXy7n59aw= -github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= -github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= -github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg= -github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= -github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= -github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= -github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= -github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= -github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= -github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= -github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= -github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb h1:PBC98N2aIaM3XXiurYmW7fx4GZkL8feAMVq7nEjURHk= -github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= -github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/subcommands v1.2.0/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= -github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= -github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= -github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= -github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= -github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/hashicorp/go-bexpr v0.1.10 h1:9kuI5PFotCboP3dkDYFr/wi0gg0QVbSNz5oFRpxn4uE= -github.com/hashicorp/go-bexpr v0.1.10/go.mod h1:oxlubA2vC/gFVfX1A6JGp7ls7uCDlfJn732ehYYg+g0= -github.com/herumi/bls-eth-go-binary v1.28.1 h1:fcIZ48y5EE9973k05XjE8+P3YiQgjZz4JI/YabAm8KA= -github.com/herumi/bls-eth-go-binary v1.28.1/go.mod h1:luAnRm3OsMQeokhGzpYmc0ZKwawY7o87PUEP11Z7r7U= -github.com/holiman/billy v0.0.0-20240216141850-2abb0c79d3c4 h1:X4egAf/gcS1zATw6wn4Ej8vjuVGxeHdan+bRb2ebyv4= -github.com/holiman/billy v0.0.0-20240216141850-2abb0c79d3c4/go.mod h1:5GuXa7vkL8u9FkFuWdVvfR5ix8hRB7DbOAaYULamFpc= -github.com/holiman/bloomfilter/v2 v2.0.3 h1:73e0e/V0tCydx14a0SCYS/EWCxgwLZ18CZcZKVu0fao= -github.com/holiman/bloomfilter/v2 v2.0.3/go.mod h1:zpoh+gs7qcpqrHr3dB55AMiJwo0iURXE7ZOP9L9hSkA= -github.com/holiman/uint256 v1.2.0/go.mod h1:y4ga/t+u+Xwd7CpDgZESaRcWy0I7XMlTMA25ApIH5Jw= -github.com/holiman/uint256 v1.2.4 h1:jUc4Nk8fm9jZabQuqr2JzednajVmBpC+oiTiXZJEApU= -github.com/holiman/uint256 v1.2.4/go.mod h1:EOMSn4q6Nyt9P6efbI3bueV4e1b3dGlUCXeiRV4ng7E= -github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/huin/goupnp v1.3.0 h1:UvLUlWDNpoUdYzb2TCn+MuTWtcjXKSza2n6CBdQ0xXc= -github.com/huin/goupnp v1.3.0/go.mod h1:gnGPsThkYa7bFi/KWmEysQRf48l2dvR5bxr2OFckNX8= -github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus= -github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= -github.com/julienschmidt/httprouter v1.3.0 h1:U0609e9tgbseu3rBINet9P48AI/D3oJs4dN7jwJOQ1U= -github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= -github.com/kilic/bls12-381 v0.1.0 h1:encrdjqKMEvabVQ7qYOKu1OvhqpK4s47wDYtNiPtlp4= -github.com/kilic/bls12-381 v0.1.0/go.mod h1:vDTTHJONJ6G+P2R74EhnyotQDTliQDnFEwhdmfzw1ig= -github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= -github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/compress v1.15.15 h1:EF27CXIuDsYJ6mmvtBRlEuB2UVOqHG1tAXgZ7yIO+lw= -github.com/klauspost/compress v1.15.15/go.mod h1:ZcK2JAFqKOpnBlxcLsJzYfrS9X1akm9fHZNnD9+Vo/4= -github.com/klauspost/cpuid/v2 v2.0.4/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= -github.com/klauspost/cpuid/v2 v2.2.2 h1:xPMwiykqNK9VK0NYC3+jTMYv9I6Vl3YdjZgPZKG3zO0= -github.com/klauspost/cpuid/v2 v2.2.2/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= -github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= -github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= -github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= -github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= -github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/leanovate/gopter v0.2.9 h1:fQjYxZaynp97ozCzfOyOuAGOU4aU/z37zf/tOujFk7c= -github.com/leanovate/gopter v0.2.9/go.mod h1:U2L/78B+KVFIx2VmW6onHJQzXtFb+p5y3y2Sh+Jxxv8= -github.com/lithammer/dedent v1.1.0 h1:VNzHMVCBNG1j0fh3OrsFRkVUwStdDArbgBWoPAffktY= -github.com/lithammer/dedent v1.1.0/go.mod h1:jrXYCQtgg0nJiN+StA2KgR7w6CiQNv9Fd/Z9BP0jIOc= -github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= -github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= -github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= -github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= -github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= -github.com/mattn/go-runewidth v0.0.14 h1:+xnbZSEeDbOIg5/mE6JF0w6n9duR1l3/WmbinWVwUuU= -github.com/mattn/go-runewidth v0.0.14/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= -github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo= -github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= -github.com/minio/sha256-simd v1.0.0 h1:v1ta+49hkWZyvaKwrQB8elexRqm6Y0aMLjCNsrYxo6g= -github.com/minio/sha256-simd v1.0.0/go.mod h1:OuYzVNI5vcoYIAmbIvHPl3N3jUzVedXbKy5RFepssQM= -github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= -github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/pointerstructure v1.2.0 h1:O+i9nHnXS3l/9Wu7r4NrEdwA2VFTicjUEN1uBnDo34A= -github.com/mitchellh/pointerstructure v1.2.0/go.mod h1:BRAsLI5zgXmw97Lf6s25bs8ohIXc3tViBH44KcwB2g4= -github.com/mmcloughlin/addchain v0.4.0 h1:SobOdjm2xLj1KkXN5/n0xTIWyZA2+s99UCY1iPfkHRY= -github.com/mmcloughlin/addchain v0.4.0/go.mod h1:A86O+tHqZLMNO4w6ZZ4FlVQEadcoqkyU72HC5wJ4RlU= -github.com/mmcloughlin/profile v0.1.1/go.mod h1:IhHD7q1ooxgwTgjxQYkACGA77oFTDdFVejUS1/tS/qU= -github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= -github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= -github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= -github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= -github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= -github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= -github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= -github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= -github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= -github.com/onsi/ginkgo/v2 v2.1.3/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c= -github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= -github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= -github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= -github.com/onsi/gomega v1.19.0 h1:4ieX6qQjPP/BfC3mpsAtIGGlxTWPeA3Inl/7DtXw1tw= -github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro= -github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4= -github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= -github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= -github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= -github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_golang v1.14.0 h1:nJdhIvne2eSX/XRAFV9PcvFFRbrjbcTUj0VP62TMhnw= -github.com/prometheus/client_golang v1.14.0/go.mod h1:8vpkKitgIVNcqrRBWh1C4TIUQgYNtG/XQE4E/Zae36Y= -github.com/prometheus/client_model v0.3.0 h1:UBgGFHqYdG/TPFD1B1ogZywDqEkwp3fBMvqdiQ7Xew4= -github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w= -github.com/prometheus/common v0.39.0 h1:oOyhkDq05hPZKItWVBkJ6g6AtGxi+fy7F4JvUV8uhsI= -github.com/prometheus/common v0.39.0/go.mod h1:6XBZ7lYdLCbkAVhwRsWTZn+IN5AB9F/NXd5w0BbEX0Y= -github.com/prometheus/procfs v0.9.0 h1:wzCHvIvM5SxWqYvwgVL7yJY8Lz3PKn49KQtpgMYJfhI= -github.com/prometheus/procfs v0.9.0/go.mod h1:+pB4zwohETzFnmlpe6yd2lSc+0/46IYZRB/chUwxUZY= -github.com/protolambda/bls12-381-util v0.1.0 h1:05DU2wJN7DTU7z28+Q+zejXkIsA/MF8JZQGhtBZZiWk= -github.com/protolambda/bls12-381-util v0.1.0/go.mod h1:cdkysJTRpeFeuUVx/TXGDQNMTiRAalk1vQw3TYTHcE4= -github.com/protolambda/eth2api v0.0.0-20230316214135-5f8afbd6d05d h1:35qD9zgP3ApfcHsETuJyX3G5kVOgFgAx6kaRGzPC+FY= -github.com/protolambda/eth2api v0.0.0-20230316214135-5f8afbd6d05d/go.mod h1:4WbGGB4Bv17hKsiytlJY4IQDNpRS234DvFvIBNLnd60= -github.com/protolambda/go-keystorev4 v0.0.0-20211007151826-f20444f6d564 h1:yCXGkFjrZ8EggxW+Y7ueRZesNcBk0avLU0mVU/I2KtU= -github.com/protolambda/go-keystorev4 v0.0.0-20211007151826-f20444f6d564/go.mod h1:Xda3KO8+DMyWaTr+LwUUpVRTB5SdFzoKu0ivXNI6p1s= -github.com/protolambda/zrnt v0.32.2 h1:KZ48T+3UhsPXNdtE/5QEvGc9DGjUaRI17nJaoznoIaM= -github.com/protolambda/zrnt v0.32.2/go.mod h1:A0fezkp9Tt3GBLATSPIbuY4ywYESyAuc/FFmPKg8Lqs= -github.com/protolambda/ztyp v0.2.2 h1:rVcL3vBu9W/aV646zF6caLS/dyn9BN8NYiuJzicLNyY= -github.com/protolambda/ztyp v0.2.2/go.mod h1:9bYgKGqg3wJqT9ac1gI2hnVb0STQq7p/1lapqrqY1dU= -github.com/prysmaticlabs/gohashtree v0.0.1-alpha.0.20220714111606-acbb2962fb48 h1:cSo6/vk8YpvkLbk9v3FO97cakNmUoxwi2KMP8hd5WIw= -github.com/prysmaticlabs/gohashtree v0.0.1-alpha.0.20220714111606-acbb2962fb48/go.mod h1:4pWaT30XoEx1j8KNJf3TV+E3mQkaufn7mf+jRNb/Fuk= -github.com/rauljordan/engine-proxy v0.0.0-20230316220057-4c80c36c4c3a h1:ZIfMLprHVdo2vs3WcSqSDEyz2ZsSzDhGeOyxh8VQThA= -github.com/rauljordan/engine-proxy v0.0.0-20230316220057-4c80c36c4c3a/go.mod h1:9OVXfWYnIV+wj1/SqfdREmE5mzN/OANAgdOJRtFtvpo= -github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= -github.com/rivo/uniseg v0.4.3 h1:utMvzDsuh3suAEnhH0RdHmoPbU648o6CvXxTx4SBMOw= -github.com/rivo/uniseg v0.4.3/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= -github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= -github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= -github.com/rs/cors v1.8.2 h1:KCooALfAYGs415Cwu5ABvv9n9509fSiG5SQJn/AQo4U= -github.com/rs/cors v1.8.2/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= -github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= -github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/shirou/gopsutil v3.21.11+incompatible h1:+1+c1VGhc88SSonWP6foOcLhvnKlUeu/erjjvaPEYiI= -github.com/shirou/gopsutil v3.21.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= -github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= -github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= -github.com/status-im/keycard-go v0.2.0 h1:QDLFswOQu1r5jsycloeQh3bVU8n/NatHHaZobtDnDzA= -github.com/status-im/keycard-go v0.2.0/go.mod h1:wlp8ZLbsmrF6g6WjugPAx+IzoLrkdf9+mHxBEeo3Hbg= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= -github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= -github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -github.com/supranational/blst v0.3.11 h1:LyU6FolezeWAhvQk0k6O/d49jqgO52MSDDfYgbeoEm4= -github.com/supranational/blst v0.3.11/go.mod h1:jZJtfjgudtNl4en1tzwPIV3KjUnQUvG3/j+w+fVonLw= -github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a h1:1ur3QoCqvE5fl+nylMaIr9PVV1w343YRDtsy+Rwu7XI= -github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a/go.mod h1:RRCYJbIwD5jmqPI9XoAFR0OcDxqUctll6zUj/+B4S48= -github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= -github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= -github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk= -github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= -github.com/tyler-smith/go-bip39 v1.1.0 h1:5eUemwrMargf3BSLRRCalXT93Ns6pQJIjYQN2nyfOP8= -github.com/tyler-smith/go-bip39 v1.1.0/go.mod h1:gUYDtqQw1JS3ZJ8UWVcGTGqqr6YIN3CWg+kkNaLt55U= -github.com/urfave/cli/v2 v2.25.7 h1:VAzn5oq403l5pHjc4OhD54+XGO9cdKVL/7lDjF+iKUs= -github.com/urfave/cli/v2 v2.25.7/go.mod h1:8qnjx1vcq5s2/wpsqoZFndg2CE5tNFyrTvS6SinrnYQ= -github.com/wealdtech/go-bytesutil v1.2.0 h1:GEIzvAZEIgqOoRfnEAaMRNL73gl8e+YlQzqxhFyR30Y= -github.com/wealdtech/go-bytesutil v1.2.0/go.mod h1:FHQSlwhzfSZGffu1osaUGdnNtl5C8tBKwmqvPdB66pM= -github.com/wealdtech/go-eth2-types/v2 v2.8.0 h1:Cts9J78ryXVp8jwotdSSVU75S+QWJrgVCArXreD2X8A= -github.com/wealdtech/go-eth2-types/v2 v2.8.0/go.mod h1:tJazo9o28kdQs3V/U4VafQ4neG+/sL3OBozQ8J3CWmo= -github.com/wealdtech/go-eth2-util v1.8.0 h1:hhs3h2y3Ldty18lppFdpe46nZpdDAMbY7QqiHO5BvE0= -github.com/wealdtech/go-eth2-util v1.8.0/go.mod h1:rSuE0v5zX+uyZrqW/iUmXOxeDpB7lTvhcZvAVh0KlMU= -github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 h1:bAn7/zixMGCfxrRTfdpNzjtPYqr8smhKouy9mxVdGPU= -github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673/go.mod h1:N3UwUGtsrSj3ccvlPHLoLsHnpR27oXr4ZE984MbSER8= -github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yusufpapurcu/wmi v1.2.2 h1:KBNDSne4vP5mbSWnJbO+51IMOXJB67QiYCSBrubbPRg= -github.com/yusufpapurcu/wmi v1.2.2/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.22.0 h1:g1v0xeRhjcugydODzvb3mEM9SQ0HGp9s/nh3COQ/C30= -golang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M= -golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa h1:FRnLl4eNAQl8hwxVVC17teOw8kdjVDVAiFMtgUdTSRQ= -golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa/go.mod h1:zk2irFbV9DP96SEBUUAy67IdHUaZuSnrz1n472HUCLE= -golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= -golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.24.0 h1:1PcaxkF854Fu3+lvBIx5SYn9wRlBzzcnHZSiaFFAb0w= -golang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8= -golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -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-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201101102859-da207088b7d1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= -golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -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/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= -golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -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= -golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= -google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= -google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= -google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= -google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= -google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= -google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= -google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= -google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= -gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= -gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/inconshreveable/log15.v2 v2.0.0-20200109203555-b30bc20e4fd1 h1:iiHuQZCNgYPmFQxd3BBN/Nc5+dAwzZuq5y40s20oQw0= -gopkg.in/inconshreveable/log15.v2 v2.0.0-20200109203555-b30bc20e4fd1/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s= -gopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc= -gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= -gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= -gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -rsc.io/tmplfunc v0.0.3 h1:53XFQh69AfOa8Tw0Jm7t+GV7KZhOi6jzsCzTtKbMvzU= -rsc.io/tmplfunc v0.0.3/go.mod h1:AG3sTPzElb1Io3Yg4voV9AGZJuleGAwaVRxL9M49PhA= diff --git a/simulators/eth2/testnet/hive_context.txt b/simulators/eth2/testnet/hive_context.txt deleted file mode 100644 index a96aa0ea9d..0000000000 --- a/simulators/eth2/testnet/hive_context.txt +++ /dev/null @@ -1 +0,0 @@ -.. \ No newline at end of file diff --git a/simulators/eth2/testnet/main.go b/simulators/eth2/testnet/main.go deleted file mode 100644 index 43ff7cdfea..0000000000 --- a/simulators/eth2/testnet/main.go +++ /dev/null @@ -1,92 +0,0 @@ -package main - -import ( - "fmt" - - "github.com/ethereum/hive/hivesim" - "github.com/ethereum/hive/simulators/eth2/common/clients" - cl "github.com/ethereum/hive/simulators/eth2/common/config/consensus" - "github.com/ethereum/hive/simulators/eth2/common/testnet" -) - -type testSpec struct { - Name string - About string - Run func(*hivesim.T, *testnet.Environment, clients.NodeDefinition) -} - -var tests = []testSpec{ - // {Name: "single-client-testnet", Run: Phase0Testnet}, - {Name: "transition-testnet", Run: TransitionTestnet}, -} - -func main() { - var suite = hivesim.Suite{ - Name: "eth2-testnet", - Description: `Run different eth2 testnets.`, - } - suite.Add(hivesim.TestSpec{ - Name: "eth2-testnets", - Description: "Collection of different eth2 testnet compositions and assertions.", - Run: func(t *hivesim.T) { - clientTypes, err := t.Sim.ClientTypes() - if err != nil { - t.Fatal(err) - } - c := clients.ClientsByRole(clientTypes) - if len(c.Eth1) != 1 { - t.Fatalf("choose 1 eth1 client type") - } - if len(c.Beacon) != 1 { - t.Fatalf("choose 1 beacon client type") - } - if len(c.Validator) != 1 { - t.Fatalf("choose 1 validator client type") - } - runAllTests(t, c) - }, - }) - hivesim.MustRunSuite(hivesim.New(), suite) -} - -func runAllTests(t *hivesim.T, c *clients.ClientDefinitionsByRole) { - mnemonic := "couple kiwi radio river setup fortune hunt grief buddy forward perfect empty slim wear bounce drift execute nation tobacco dutch chapter festival ice fog" - - // Generate validator keys to use for all tests. - keySrc := &cl.MnemonicsKeySource{ - From: 0, - To: 64, - Mnemonic: mnemonic, - } - keys, err := keySrc.Keys() - if err != nil { - t.Fatal(err) - } - for _, node := range c.Combinations() { - for _, test := range tests { - test := test - t.Run(hivesim.TestSpec{ - Name: fmt.Sprintf("%s-%s", test.Name, node.String()), - Description: test.About, - Run: func(t *hivesim.T) { - env := &testnet.Environment{ - Clients: c, - Validators: keys, - } - test.Run(t, env, node) - }, - }) - } - } -} - -/* - TODO More testnet ideas: - - Name: "two-client-testnet", - Description: "This runs quick eth2 testnets with combinations of 2 client types, beacon nodes matched with preferred validator type, and dummy eth1 endpoint.", - Name: "all-client-testnet", - Description: "This runs a quick eth2 testnet with all client types, beacon nodes matched with preferred validator type, and dummy eth1 endpoint.", - Name: "cross-single-client-testnet", - Description: "This runs a quick eth2 single-client testnet, but beacon nodes are matched with all validator types", -*/ diff --git a/simulators/eth2/testnet/scenarios.go b/simulators/eth2/testnet/scenarios.go deleted file mode 100644 index f7b741bab2..0000000000 --- a/simulators/eth2/testnet/scenarios.go +++ /dev/null @@ -1,91 +0,0 @@ -package main - -import ( - "context" - "math/big" - - "github.com/ethereum/hive/hivesim" - "github.com/ethereum/hive/simulators/eth2/common/clients" - "github.com/ethereum/hive/simulators/eth2/common/config" - consensus_config "github.com/ethereum/hive/simulators/eth2/common/config/consensus" - el "github.com/ethereum/hive/simulators/eth2/common/config/execution" - tn "github.com/ethereum/hive/simulators/eth2/common/testnet" -) - -var ( - VALIDATOR_COUNT = big.NewInt(64) - SLOT_TIME = big.NewInt(6) - TERMINAL_TOTAL_DIFFICULTY = big.NewInt(100) -) - -func Phase0Testnet(t *hivesim.T, env *tn.Environment, n clients.NodeDefinition) { - config := tn.Config{ - ForkConfig: &config.ForkConfig{ - AltairForkEpoch: big.NewInt(10), - BellatrixForkEpoch: big.NewInt(20), - TerminalTotalDifficulty: TERMINAL_TOTAL_DIFFICULTY, - }, - ConsensusConfig: &consensus_config.ConsensusConfig{ - ValidatorCount: VALIDATOR_COUNT, - SlotTime: SLOT_TIME, - }, - NodeDefinitions: []clients.NodeDefinition{ - n, - n, - }, - Eth1Consensus: el.ExecutionCliqueConsensus{}, - } - - ctx := context.Background() - testnet := tn.StartTestnet(ctx, t, env, &config) - - finalized, err := testnet.WaitForFinality(ctx) - if err != nil { - t.Fatalf("%v", err) - } - if err := testnet.VerifyParticipation(ctx, tn.FirstSlotAfterCheckpoint{Checkpoint: &finalized}, 0.95); err != nil { - t.Fatalf("%v", err) - } - if err := testnet.VerifyExecutionPayloadIsCanonical(ctx, tn.LastSlotAtCheckpoint{Checkpoint: &finalized}); err != nil { - t.Fatalf("%v", err) - } - if err := testnet.VerifyProposers(ctx, tn.LastSlotAtCheckpoint{Checkpoint: &finalized}, false); err != nil { - t.Fatalf("%v", err) - } -} - -func TransitionTestnet(t *hivesim.T, env *tn.Environment, n clients.NodeDefinition) { - config := tn.Config{ - ForkConfig: &config.ForkConfig{ - AltairForkEpoch: big.NewInt(0), - BellatrixForkEpoch: big.NewInt(0), - TerminalTotalDifficulty: TERMINAL_TOTAL_DIFFICULTY, - }, - ConsensusConfig: &consensus_config.ConsensusConfig{ - ValidatorCount: VALIDATOR_COUNT, - SlotTime: SLOT_TIME, - }, - NodeDefinitions: []clients.NodeDefinition{ - n, - n, - }, - Eth1Consensus: el.ExecutionCliqueConsensus{}, - } - - ctx := context.Background() - testnet := tn.StartTestnet(ctx, t, env, &config) - - finalized, err := testnet.WaitForFinality(ctx) - if err != nil { - t.Fatalf("%v", err) - } - if err := testnet.VerifyParticipation(ctx, tn.FirstSlotAfterCheckpoint{Checkpoint: &finalized}, 0.95); err != nil { - t.Fatalf("%v", err) - } - if err := testnet.VerifyExecutionPayloadIsCanonical(ctx, tn.LastSlotAtCheckpoint{Checkpoint: &finalized}); err != nil { - t.Fatalf("%v", err) - } - if err := testnet.VerifyProposers(ctx, tn.LastSlotAtCheckpoint{Checkpoint: &finalized}, false); err != nil { - t.Fatalf("%v", err) - } -} diff --git a/simulators/ethereum/consensus/Dockerfile b/simulators/ethereum/consensus/Dockerfile deleted file mode 100644 index 32088347ce..0000000000 --- a/simulators/ethereum/consensus/Dockerfile +++ /dev/null @@ -1,23 +0,0 @@ -# This simulation runs the ethereum consensus tests. -FROM golang:1-alpine as builder -ARG GOPROXY -ENV GOPROXY=${GOPROXY} -RUN apk add --update git ca-certificates gcc musl-dev linux-headers - -# Clone the tests repo. -RUN git clone --depth 1 --recurse-submodules https://github.com/ethereum/tests.git /tests - -# Build the simulator executable. -ADD . /source -WORKDIR /source -RUN go build -v . - -# Build the simulator run container. -FROM alpine:latest -ADD . /source -WORKDIR /source -COPY --from=builder /source/consensus . -COPY --from=builder /tests /tests -ENV TESTPATH /tests - -ENTRYPOINT ["./consensus"] diff --git a/simulators/ethereum/consensus/README.md b/simulators/ethereum/consensus/README.md deleted file mode 100644 index c248e8c53c..0000000000 --- a/simulators/ethereum/consensus/README.md +++ /dev/null @@ -1,63 +0,0 @@ -## Go Consensus - -This is a 'simulator', which should be run from within [hive](https://github.com/ethereum/hive). - -## Cross client testing - -Testing implementations of Ethereum clients has been a difficult task. A standard testcase repository has been maintained, -but the actual test-execution has been left unspecified. - -Each client has had to implement client-specific test-harnesses to perform the tests: - -* The actual execution of the testcase, which includes creating necessary `prestate`. -* The verificaton of the testcase, which includes verifying various things, such as: - * `poststate` state root - * `lastblock` hash - * Various `account`s, and `storage`. - -## A generalised test - -The [Ethereum Standard Testcases](https://github.com/ethereum/tests) testcases have now been transformed so that the bulk of all tests can be expressed as blocktests. The framework consists -of the following parts. - -1. The testcase sources. These are basically the current testcases (testfillers). They contain the semantics of each test, - and could e.g contain contract source code or individual transactions to be applied to a state. These tests should contain - sufficient information for a human to be able to interpret the meaning of the test, and how to go about debugging a failed test. - -2. The testcase artefacts. These are a transformation of the testcases (testfillers), onto the following form: - - `prestate` + `block(s)` => `postState`. - -3. The execution of cross-client testing is then performed using Hive. The hive framework simply performs the following. - -* For each client, for each testcase: - * Create genesis by combining 'pre' and 'genesisBlockHeader'. - * Create ruleset, according to testcase (Frontier, Homestead, Tangerine or Spurious), and set Hive `ENV` variables for the node - * Instantiate hive-node (client), and write generated files to the node filesystem - * The node will import blocks upon startup - * Verify preconditions at block(0), using standard web3 api - * Verify postconditions at block(n), using standard web3 api - * Emit testcase subresult to Hive - -This repo is responsible for souping up the tests, telling the framework to boot up new clients and then verify the results, and report back to hive, - -The Hive framework then outputs the results-report as a json-file, which can be packaged with a HTML viewer and client-logs for analysis of all test failures. - -The benefits of this approach is that there is no need for client-implementations to create a bespoke testing framework, as long as they -conform to the requirements of being a hive-node. Which are, basically: - -- Ability to import blocks. -- Ability to configure ruleset via commandline/config. -- Standard web3 methods (getBlock). - -Onboarding a client into Hive is pretty simple: - -1. Create a Docker file (as minimal as possible) which installs the client -2. Create a shell script which can boot the client according to given `ENV` variables. - * The `ENV` variables contain information about which ruleset to use (Frontier, Homestead, Tangerine etc). The script is also responsible for importing genesis and blocks from the filesystem. - -## History - -This repo is a rewrite of an older version which was implemented in python, and resides within the hive repository. - - diff --git a/simulators/ethereum/consensus/forks.go b/simulators/ethereum/consensus/forks.go deleted file mode 100644 index ed74c718e3..0000000000 --- a/simulators/ethereum/consensus/forks.go +++ /dev/null @@ -1,339 +0,0 @@ -package main - -var envForks = map[string]map[string]int{ - "Frontier": { - "HIVE_FORK_HOMESTEAD": 2000, - "HIVE_FORK_DAO_BLOCK": 2000, - "HIVE_FORK_TANGERINE": 2000, - "HIVE_FORK_SPURIOUS": 2000, - "HIVE_FORK_BYZANTIUM": 2000, - "HIVE_FORK_CONSTANTINOPLE": 2000, - "HIVE_FORK_PETERSBURG": 2000, - "HIVE_FORK_ISTANBUL": 2000, - "HIVE_FORK_BERLIN": 2000, - "HIVE_FORK_LONDON": 2000, - }, - "Homestead": { - "HIVE_FORK_HOMESTEAD": 0, - "HIVE_FORK_DAO_BLOCK": 2000, - "HIVE_FORK_TANGERINE": 2000, - "HIVE_FORK_SPURIOUS": 2000, - "HIVE_FORK_BYZANTIUM": 2000, - "HIVE_FORK_CONSTANTINOPLE": 2000, - "HIVE_FORK_PETERSBURG": 2000, - "HIVE_FORK_ISTANBUL": 2000, - "HIVE_FORK_BERLIN": 2000, - "HIVE_FORK_LONDON": 2000, - }, - "EIP150": { - "HIVE_FORK_HOMESTEAD": 0, - "HIVE_FORK_TANGERINE": 0, - "HIVE_FORK_SPURIOUS": 2000, - "HIVE_FORK_BYZANTIUM": 2000, - "HIVE_FORK_CONSTANTINOPLE": 2000, - "HIVE_FORK_PETERSBURG": 2000, - "HIVE_FORK_ISTANBUL": 2000, - "HIVE_FORK_BERLIN": 2000, - "HIVE_FORK_LONDON": 2000, - }, - "EIP158": { - "HIVE_FORK_HOMESTEAD": 0, - "HIVE_FORK_TANGERINE": 0, - "HIVE_FORK_SPURIOUS": 0, - "HIVE_FORK_BYZANTIUM": 2000, - "HIVE_FORK_CONSTANTINOPLE": 2000, - "HIVE_FORK_PETERSBURG": 2000, - "HIVE_FORK_ISTANBUL": 2000, - "HIVE_FORK_BERLIN": 2000, - "HIVE_FORK_LONDON": 2000, - }, - "Byzantium": { - "HIVE_FORK_HOMESTEAD": 0, - "HIVE_FORK_TANGERINE": 0, - "HIVE_FORK_SPURIOUS": 0, - "HIVE_FORK_BYZANTIUM": 0, - "HIVE_FORK_CONSTANTINOPLE": 2000, - "HIVE_FORK_PETERSBURG": 2000, - "HIVE_FORK_ISTANBUL": 2000, - "HIVE_FORK_BERLIN": 2000, - "HIVE_FORK_LONDON": 2000, - }, - "Constantinople": { - "HIVE_FORK_HOMESTEAD": 0, - "HIVE_FORK_TANGERINE": 0, - "HIVE_FORK_SPURIOUS": 0, - "HIVE_FORK_BYZANTIUM": 0, - "HIVE_FORK_CONSTANTINOPLE": 0, - "HIVE_FORK_PETERSBURG": 2000, - "HIVE_FORK_ISTANBUL": 2000, - "HIVE_FORK_BERLIN": 2000, - "HIVE_FORK_LONDON": 2000, - }, - "ConstantinopleFix": { - "HIVE_FORK_HOMESTEAD": 0, - "HIVE_FORK_TANGERINE": 0, - "HIVE_FORK_SPURIOUS": 0, - "HIVE_FORK_BYZANTIUM": 0, - "HIVE_FORK_CONSTANTINOPLE": 0, - "HIVE_FORK_PETERSBURG": 0, - "HIVE_FORK_ISTANBUL": 2000, - "HIVE_FORK_BERLIN": 2000, - "HIVE_FORK_LONDON": 2000, - }, - "Istanbul": { - "HIVE_FORK_HOMESTEAD": 0, - "HIVE_FORK_TANGERINE": 0, - "HIVE_FORK_SPURIOUS": 0, - "HIVE_FORK_BYZANTIUM": 0, - "HIVE_FORK_CONSTANTINOPLE": 0, - "HIVE_FORK_PETERSBURG": 0, - "HIVE_FORK_ISTANBUL": 0, - "HIVE_FORK_BERLIN": 2000, - "HIVE_FORK_LONDON": 2000, - }, - "Berlin": { - "HIVE_FORK_HOMESTEAD": 0, - "HIVE_FORK_TANGERINE": 0, - "HIVE_FORK_SPURIOUS": 0, - "HIVE_FORK_BYZANTIUM": 0, - "HIVE_FORK_CONSTANTINOPLE": 0, - "HIVE_FORK_PETERSBURG": 0, - "HIVE_FORK_ISTANBUL": 0, - "HIVE_FORK_BERLIN": 0, - "HIVE_FORK_LONDON": 2000, - }, - "FrontierToHomesteadAt5": { - "HIVE_FORK_HOMESTEAD": 5, - "HIVE_FORK_DAO_BLOCK": 2000, - "HIVE_FORK_TANGERINE": 2000, - "HIVE_FORK_SPURIOUS": 2000, - "HIVE_FORK_BYZANTIUM": 2000, - "HIVE_FORK_CONSTANTINOPLE": 2000, - "HIVE_FORK_PETERSBURG": 2000, - "HIVE_FORK_ISTANBUL": 2000, - "HIVE_FORK_BERLIN": 2000, - "HIVE_FORK_LONDON": 2000, - }, - "HomesteadToEIP150At5": { - "HIVE_FORK_HOMESTEAD": 0, - "HIVE_FORK_TANGERINE": 5, - "HIVE_FORK_SPURIOUS": 2000, - "HIVE_FORK_BYZANTIUM": 2000, - "HIVE_FORK_CONSTANTINOPLE": 2000, - "HIVE_FORK_PETERSBURG": 2000, - "HIVE_FORK_ISTANBUL": 2000, - "HIVE_FORK_BERLIN": 2000, - "HIVE_FORK_LONDON": 2000, - }, - "HomesteadToDaoAt5": { - "HIVE_FORK_HOMESTEAD": 0, - "HIVE_FORK_DAO_BLOCK": 5, - "HIVE_FORK_TANGERINE": 2000, - "HIVE_FORK_SPURIOUS": 2000, - "HIVE_FORK_BYZANTIUM": 2000, - "HIVE_FORK_CONSTANTINOPLE": 2000, - "HIVE_FORK_PETERSBURG": 2000, - "HIVE_FORK_ISTANBUL": 2000, - "HIVE_FORK_BERLIN": 2000, - "HIVE_FORK_LONDON": 2000, - }, - "EIP158ToByzantiumAt5": { - "HIVE_FORK_HOMESTEAD": 0, - "HIVE_FORK_TANGERINE": 0, - "HIVE_FORK_SPURIOUS": 0, - "HIVE_FORK_BYZANTIUM": 5, - "HIVE_FORK_CONSTANTINOPLE": 2000, - "HIVE_FORK_PETERSBURG": 2000, - "HIVE_FORK_ISTANBUL": 2000, - "HIVE_FORK_BERLIN": 2000, - "HIVE_FORK_LONDON": 2000, - }, - "ByzantiumToConstantinopleAt5": { - "HIVE_FORK_HOMESTEAD": 0, - "HIVE_FORK_TANGERINE": 0, - "HIVE_FORK_SPURIOUS": 0, - "HIVE_FORK_BYZANTIUM": 0, - "HIVE_FORK_CONSTANTINOPLE": 5, - "HIVE_FORK_PETERSBURG": 2000, - "HIVE_FORK_ISTANBUL": 2000, - "HIVE_FORK_BERLIN": 2000, - "HIVE_FORK_LONDON": 2000, - }, - "ByzantiumToConstantinopleFixAt5": { - "HIVE_FORK_HOMESTEAD": 0, - "HIVE_FORK_TANGERINE": 0, - "HIVE_FORK_SPURIOUS": 0, - "HIVE_FORK_BYZANTIUM": 0, - "HIVE_FORK_CONSTANTINOPLE": 5, - "HIVE_FORK_PETERSBURG": 5, - "HIVE_FORK_ISTANBUL": 2000, - "HIVE_FORK_BERLIN": 2000, - "HIVE_FORK_LONDON": 2000, - }, - "ConstantinopleFixToIstanbulAt5": { - "HIVE_FORK_HOMESTEAD": 0, - "HIVE_FORK_TANGERINE": 0, - "HIVE_FORK_SPURIOUS": 0, - "HIVE_FORK_BYZANTIUM": 0, - "HIVE_FORK_CONSTANTINOPLE": 0, - "HIVE_FORK_PETERSBURG": 0, - "HIVE_FORK_ISTANBUL": 5, - "HIVE_FORK_BERLIN": 2000, - "HIVE_FORK_LONDON": 2000, - }, - "IstanbulToBerlinAt5": { - "HIVE_FORK_HOMESTEAD": 0, - "HIVE_FORK_TANGERINE": 0, - "HIVE_FORK_SPURIOUS": 0, - "HIVE_FORK_BYZANTIUM": 0, - "HIVE_FORK_CONSTANTINOPLE": 0, - "HIVE_FORK_PETERSBURG": 0, - "HIVE_FORK_ISTANBUL": 0, - "HIVE_FORK_BERLIN": 5, - "HIVE_FORK_LONDON": 2000, - }, - "BerlinToLondonAt5": { - "HIVE_FORK_HOMESTEAD": 0, - "HIVE_FORK_TANGERINE": 0, - "HIVE_FORK_SPURIOUS": 0, - "HIVE_FORK_BYZANTIUM": 0, - "HIVE_FORK_CONSTANTINOPLE": 0, - "HIVE_FORK_PETERSBURG": 0, - "HIVE_FORK_ISTANBUL": 0, - "HIVE_FORK_BERLIN": 0, - "HIVE_FORK_LONDON": 5, - }, - "London": { - "HIVE_FORK_HOMESTEAD": 0, - "HIVE_FORK_TANGERINE": 0, - "HIVE_FORK_SPURIOUS": 0, - "HIVE_FORK_BYZANTIUM": 0, - "HIVE_FORK_CONSTANTINOPLE": 0, - "HIVE_FORK_PETERSBURG": 0, - "HIVE_FORK_ISTANBUL": 0, - "HIVE_FORK_BERLIN": 0, - "HIVE_FORK_LONDON": 0, - }, - "ArrowGlacierToMergeAtDiffC0000": { - "HIVE_FORK_HOMESTEAD": 0, - "HIVE_FORK_TANGERINE": 0, - "HIVE_FORK_SPURIOUS": 0, - "HIVE_FORK_BYZANTIUM": 0, - "HIVE_FORK_CONSTANTINOPLE": 0, - "HIVE_FORK_PETERSBURG": 0, - "HIVE_FORK_ISTANBUL": 0, - "HIVE_FORK_BERLIN": 0, - "HIVE_FORK_LONDON": 0, - "HIVE_TERMINAL_TOTAL_DIFFICULTY": 786432, - }, - "ArrowGlacierToParisAtDiffC0000": { - "HIVE_FORK_HOMESTEAD": 0, - "HIVE_FORK_TANGERINE": 0, - "HIVE_FORK_SPURIOUS": 0, - "HIVE_FORK_BYZANTIUM": 0, - "HIVE_FORK_CONSTANTINOPLE": 0, - "HIVE_FORK_PETERSBURG": 0, - "HIVE_FORK_ISTANBUL": 0, - "HIVE_FORK_BERLIN": 0, - "HIVE_FORK_LONDON": 0, - "HIVE_TERMINAL_TOTAL_DIFFICULTY": 786432, - }, - "Merge": { // Remove once Paris replaces Merge - "HIVE_FORK_HOMESTEAD": 0, - "HIVE_FORK_TANGERINE": 0, - "HIVE_FORK_SPURIOUS": 0, - "HIVE_FORK_BYZANTIUM": 0, - "HIVE_FORK_CONSTANTINOPLE": 0, - "HIVE_FORK_PETERSBURG": 0, - "HIVE_FORK_ISTANBUL": 0, - "HIVE_FORK_BERLIN": 0, - "HIVE_FORK_LONDON": 0, - "HIVE_FORK_MERGE": 0, - "HIVE_TERMINAL_TOTAL_DIFFICULTY": 0, - }, - "Paris": { - "HIVE_FORK_HOMESTEAD": 0, - "HIVE_FORK_TANGERINE": 0, - "HIVE_FORK_SPURIOUS": 0, - "HIVE_FORK_BYZANTIUM": 0, - "HIVE_FORK_CONSTANTINOPLE": 0, - "HIVE_FORK_PETERSBURG": 0, - "HIVE_FORK_ISTANBUL": 0, - "HIVE_FORK_BERLIN": 0, - "HIVE_FORK_LONDON": 0, - "HIVE_FORK_MERGE": 0, - "HIVE_TERMINAL_TOTAL_DIFFICULTY": 0, - }, - "Shanghai": { - "HIVE_FORK_HOMESTEAD": 0, - "HIVE_FORK_TANGERINE": 0, - "HIVE_FORK_SPURIOUS": 0, - "HIVE_FORK_BYZANTIUM": 0, - "HIVE_FORK_CONSTANTINOPLE": 0, - "HIVE_FORK_PETERSBURG": 0, - "HIVE_FORK_ISTANBUL": 0, - "HIVE_FORK_BERLIN": 0, - "HIVE_FORK_LONDON": 0, - "HIVE_FORK_MERGE": 0, - "HIVE_TERMINAL_TOTAL_DIFFICULTY": 0, - "HIVE_SHANGHAI_TIMESTAMP": 0, - }, - "MergeToShanghaiAtTime15k": { - "HIVE_FORK_HOMESTEAD": 0, - "HIVE_FORK_TANGERINE": 0, - "HIVE_FORK_SPURIOUS": 0, - "HIVE_FORK_BYZANTIUM": 0, - "HIVE_FORK_CONSTANTINOPLE": 0, - "HIVE_FORK_PETERSBURG": 0, - "HIVE_FORK_ISTANBUL": 0, - "HIVE_FORK_BERLIN": 0, - "HIVE_FORK_LONDON": 0, - "HIVE_FORK_MERGE": 0, - "HIVE_TERMINAL_TOTAL_DIFFICULTY": 0, - "HIVE_SHANGHAI_TIMESTAMP": 15000, - }, - "ParisToShanghaiAtTime15k": { - "HIVE_FORK_HOMESTEAD": 0, - "HIVE_FORK_TANGERINE": 0, - "HIVE_FORK_SPURIOUS": 0, - "HIVE_FORK_BYZANTIUM": 0, - "HIVE_FORK_CONSTANTINOPLE": 0, - "HIVE_FORK_PETERSBURG": 0, - "HIVE_FORK_ISTANBUL": 0, - "HIVE_FORK_BERLIN": 0, - "HIVE_FORK_LONDON": 0, - "HIVE_FORK_MERGE": 0, - "HIVE_TERMINAL_TOTAL_DIFFICULTY": 0, - "HIVE_SHANGHAI_TIMESTAMP": 15000, - }, - "Cancun": { - "HIVE_FORK_HOMESTEAD": 0, - "HIVE_FORK_TANGERINE": 0, - "HIVE_FORK_SPURIOUS": 0, - "HIVE_FORK_BYZANTIUM": 0, - "HIVE_FORK_CONSTANTINOPLE": 0, - "HIVE_FORK_PETERSBURG": 0, - "HIVE_FORK_ISTANBUL": 0, - "HIVE_FORK_BERLIN": 0, - "HIVE_FORK_LONDON": 0, - "HIVE_FORK_MERGE": 0, - "HIVE_TERMINAL_TOTAL_DIFFICULTY": 0, - "HIVE_SHANGHAI_TIMESTAMP": 0, - "HIVE_CANCUN_TIMESTAMP": 0, - }, - "ShanghaiToCancunAtTime15k": { - "HIVE_FORK_HOMESTEAD": 0, - "HIVE_FORK_TANGERINE": 0, - "HIVE_FORK_SPURIOUS": 0, - "HIVE_FORK_BYZANTIUM": 0, - "HIVE_FORK_CONSTANTINOPLE": 0, - "HIVE_FORK_PETERSBURG": 0, - "HIVE_FORK_ISTANBUL": 0, - "HIVE_FORK_BERLIN": 0, - "HIVE_FORK_LONDON": 0, - "HIVE_FORK_MERGE": 0, - "HIVE_TERMINAL_TOTAL_DIFFICULTY": 0, - "HIVE_SHANGHAI_TIMESTAMP": 0, - "HIVE_CANCUN_TIMESTAMP": 15000, - }, -} diff --git a/simulators/ethereum/consensus/genesis_test.go b/simulators/ethereum/consensus/genesis_test.go deleted file mode 100644 index dd2a614f04..0000000000 --- a/simulators/ethereum/consensus/genesis_test.go +++ /dev/null @@ -1,65 +0,0 @@ -package main - -import ( - "fmt" - "math/big" - "testing" - - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/types" -) - -func TestGenesisParsing(t *testing.T) { - // Taken from a failing nethermind test - genesisResponse := `{ - "author": "0x2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", - "baseFeePerGas": "0x3b9aca00", - "difficulty": "0x20000", - "extraData": "0x00", - "gasLimit": "0x5f5e100", - "gasUsed": "0x0", - "hash": "0xa29ba2a76546b56f331f02e70b24c4a1452b1b392e1d2fe51828ff57f551d62e", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "miner": "0x2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", - "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000", - "nonce": "0x0000000000000000", - "number": "0x0", - "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000", - "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", - "sha3Uncles": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", - "size": "0x201", - "stateRoot": "0xf3d3787e33cb7913a304f188002f59e7b7a1e1fe3a712988c7092a213f8c2e8f", - "timestamp": "0x0", - "totalDifficulty": "0x20000", - "transactions": [], - "transactionsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", - "uncles": [] -}` - // Taken from https://github.com/ethereum/tests/blob/develop/BlockchainTests/GeneralStateTests/VMTests/vmArithmeticTest/add.json - expHeader := btHeader{ - Bloom: types.Bloom{}, - Coinbase: common.HexToAddress("0x2adc25665018aa1fe0e6bc666dac8fc2697ff9ba"), - MixHash: common.Hash{}, - Nonce: types.BlockNonce{}, - Number: new(big.Int), - Hash: common.HexToHash("0xafa8fc2deb658d8120f4011e459159a6472b88e2dfed6518640be01dbbfd20a9"), - ParentHash: common.Hash{}, - ReceiptTrie: common.HexToHash("0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"), - StateRoot: common.HexToHash("0xf3d3787e33cb7913a304f188002f59e7b7a1e1fe3a712988c7092a213f8c2e8f"), - TransactionsTrie: common.HexToHash("0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"), - UncleHash: common.HexToHash("0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347"), - ExtraData: []byte{0x0}, - Difficulty: big.NewInt(0x20000), - GasLimit: 0x05f5e100, - GasUsed: 0, - Timestamp: new(big.Int), - BaseFee: big.NewInt(11), - } - wantHash := common.HexToHash("0xafa8fc2deb658d8120f4011e459159a6472b88e2dfed6518640be01dbbfd20a9") - gotHash := common.HexToHash("0xa29ba2a76546b56f331f02e70b24c4a1452b1b392e1d2fe51828ff57f551d62e") - - fmt.Printf("genesis hash mismatch:\n want 0x%x\n got 0x%x\n", wantHash, gotHash) - if diffs, err := compareGenesis(genesisResponse, expHeader); err == nil { - fmt.Printf(diffs) - } -} diff --git a/simulators/ethereum/consensus/go.mod b/simulators/ethereum/consensus/go.mod deleted file mode 100644 index 5823d17785..0000000000 --- a/simulators/ethereum/consensus/go.mod +++ /dev/null @@ -1,76 +0,0 @@ -module github.com/ethereum/hive/simulators/ethereum/consensus - -go 1.21 - -toolchain go1.22.1 - -require ( - github.com/ethereum/go-ethereum v1.14.5 - github.com/ethereum/hive v0.0.0-20240715150147-c87a99dccfce -) - -require ( - github.com/DataDog/zstd v1.5.2 // indirect - github.com/Microsoft/go-winio v0.6.2 // indirect - github.com/VictoriaMetrics/fastcache v1.12.2 // indirect - github.com/beorn7/perks v1.0.1 // indirect - github.com/bits-and-blooms/bitset v1.10.0 // indirect - github.com/btcsuite/btcd/btcec/v2 v2.3.2 // indirect - github.com/cespare/xxhash/v2 v2.3.0 // indirect - github.com/cockroachdb/errors v1.11.1 // indirect - github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b // indirect - github.com/cockroachdb/pebble v1.1.0 // indirect - github.com/cockroachdb/redact v1.1.5 // indirect - github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 // indirect - github.com/consensys/bavard v0.1.13 // indirect - github.com/consensys/gnark-crypto v0.12.1 // indirect - github.com/crate-crypto/go-ipa v0.0.0-20240223125850-b1e8a79f509c // indirect - github.com/crate-crypto/go-kzg-4844 v1.0.0 // indirect - github.com/deckarep/golang-set/v2 v2.6.0 // indirect - github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 // indirect - github.com/ethereum/c-kzg-4844 v1.0.0 // indirect - github.com/ethereum/go-verkle v0.1.1-0.20240306133620-7d920df305f0 // indirect - github.com/getsentry/sentry-go v0.18.0 // indirect - github.com/go-ole/go-ole v1.3.0 // indirect - github.com/go-stack/stack v1.8.1 // indirect - github.com/gofrs/flock v0.8.1 // indirect - github.com/gogo/protobuf v1.3.2 // indirect - github.com/golang-jwt/jwt/v4 v4.5.0 // indirect - github.com/golang/protobuf v1.5.4 // indirect - github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect - github.com/google/go-cmp v0.6.0 // indirect - github.com/gorilla/websocket v1.5.0 // indirect - github.com/holiman/bloomfilter/v2 v2.0.3 // indirect - github.com/holiman/uint256 v1.2.4 // indirect - github.com/klauspost/compress v1.15.15 // indirect - github.com/kr/pretty v0.3.1 // indirect - github.com/kr/text v0.2.0 // indirect - github.com/lithammer/dedent v1.1.0 // indirect - github.com/mattn/go-colorable v0.1.13 // indirect - github.com/mattn/go-isatty v0.0.20 // indirect - github.com/mattn/go-runewidth v0.0.14 // indirect - github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect - github.com/mmcloughlin/addchain v0.4.0 // indirect - github.com/olekukonko/tablewriter v0.0.5 // indirect - github.com/pkg/errors v0.9.1 // indirect - github.com/prometheus/client_golang v1.14.0 // indirect - github.com/prometheus/client_model v0.3.0 // indirect - github.com/prometheus/common v0.39.0 // indirect - github.com/prometheus/procfs v0.9.0 // indirect - github.com/rivo/uniseg v0.4.3 // indirect - github.com/rogpeppe/go-internal v1.9.0 // indirect - github.com/shirou/gopsutil v3.21.11+incompatible // indirect - github.com/supranational/blst v0.3.11 // indirect - github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a // indirect - github.com/tklauser/go-sysconf v0.3.12 // indirect - github.com/tklauser/numcpus v0.6.1 // indirect - github.com/yusufpapurcu/wmi v1.2.2 // indirect - golang.org/x/crypto v0.22.0 // indirect - golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa // indirect - golang.org/x/sync v0.7.0 // indirect - golang.org/x/sys v0.20.0 // indirect - golang.org/x/text v0.14.0 // indirect - google.golang.org/protobuf v1.33.0 // indirect - gopkg.in/inconshreveable/log15.v2 v2.0.0-20200109203555-b30bc20e4fd1 // indirect - rsc.io/tmplfunc v0.0.3 // indirect -) diff --git a/simulators/ethereum/consensus/go.sum b/simulators/ethereum/consensus/go.sum deleted file mode 100644 index a8dbafb7b9..0000000000 --- a/simulators/ethereum/consensus/go.sum +++ /dev/null @@ -1,295 +0,0 @@ -github.com/DataDog/zstd v1.5.2 h1:vUG4lAyuPCXO0TLbXvPv7EB7cNK1QV/luu55UHLrrn8= -github.com/DataDog/zstd v1.5.2/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw= -github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= -github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= -github.com/VictoriaMetrics/fastcache v1.12.2 h1:N0y9ASrJ0F6h0QaC3o6uJb3NIZ9VKLjCM7NQbSmF7WI= -github.com/VictoriaMetrics/fastcache v1.12.2/go.mod h1:AmC+Nzz1+3G2eCPapF6UcsnkThDcMsQicp4xDukwJYI= -github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= -github.com/allegro/bigcache v1.2.1 h1:hg1sY1raCwic3Vnsvje6TT7/pnZba83LeFck5NrFKSc= -github.com/allegro/bigcache v1.2.1/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= -github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= -github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/bits-and-blooms/bitset v1.10.0 h1:ePXTeiPEazB5+opbv5fr8umg2R/1NlzgDsyepwsSr88= -github.com/bits-and-blooms/bitset v1.10.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= -github.com/btcsuite/btcd/btcec/v2 v2.3.2 h1:5n0X6hX0Zk+6omWcihdYvdAlGf2DfasC0GMf7DClJ3U= -github.com/btcsuite/btcd/btcec/v2 v2.3.2/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= -github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOFYSNEs0TFnxxnS9+4U= -github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= -github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= -github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= -github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= -github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f h1:otljaYPt5hWxV3MUfO5dFPFiOXg9CyG5/kCfayTqsJ4= -github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= -github.com/cockroachdb/errors v1.11.1 h1:xSEW75zKaKCWzR3OfxXUxgrk/NtT4G1MiOv5lWZazG8= -github.com/cockroachdb/errors v1.11.1/go.mod h1:8MUxA3Gi6b25tYlFEBGLf+D8aISL+M4MIpiWMSNRfxw= -github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b h1:r6VH0faHjZeQy818SGhaone5OnYfxFR/+AzdY3sf5aE= -github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= -github.com/cockroachdb/pebble v1.1.0 h1:pcFh8CdCIt2kmEpK0OIatq67Ln9uGDYY3d5XnE0LJG4= -github.com/cockroachdb/pebble v1.1.0/go.mod h1:sEHm5NOXxyiAoKWhoFxT8xMgd/f3RA6qUqQ1BXKrh2E= -github.com/cockroachdb/redact v1.1.5 h1:u1PMllDkdFfPWaNGMyLD1+so+aq3uUItthCFqzwPJ30= -github.com/cockroachdb/redact v1.1.5/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= -github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 h1:zuQyyAKVxetITBuuhv3BI9cMrmStnpT18zmgmTxunpo= -github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06/go.mod h1:7nc4anLGjupUW/PeY5qiNYsdNXj7zopG+eqsS7To5IQ= -github.com/consensys/bavard v0.1.13 h1:oLhMLOFGTLdlda/kma4VOJazblc7IM5y5QPd2A/YjhQ= -github.com/consensys/bavard v0.1.13/go.mod h1:9ItSMtA/dXMAiL7BG6bqW2m3NdSEObYWoH223nGHukI= -github.com/consensys/gnark-crypto v0.12.1 h1:lHH39WuuFgVHONRl3J0LRBtuYdQTumFSDtJF7HpyG8M= -github.com/consensys/gnark-crypto v0.12.1/go.mod h1:v2Gy7L/4ZRosZ7Ivs+9SfUDr0f5UlG+EM5t7MPHiLuY= -github.com/crate-crypto/go-ipa v0.0.0-20240223125850-b1e8a79f509c h1:uQYC5Z1mdLRPrZhHjHxufI8+2UG/i25QG92j0Er9p6I= -github.com/crate-crypto/go-ipa v0.0.0-20240223125850-b1e8a79f509c/go.mod h1:geZJZH3SzKCqnz5VT0q/DyIG/tvu/dZk+VIfXicupJs= -github.com/crate-crypto/go-kzg-4844 v1.0.0 h1:TsSgHwrkTKecKJ4kadtHi4b3xHW5dCFUDFnUp1TsawI= -github.com/crate-crypto/go-kzg-4844 v1.0.0/go.mod h1:1kMhvPgI0Ky3yIa+9lFySEBUBXkYxeOi8ZF1sYioxhc= -github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/deckarep/golang-set/v2 v2.6.0 h1:XfcQbWM1LlMB8BsJ8N9vW5ehnnPVIw0je80NsVHagjM= -github.com/deckarep/golang-set/v2 v2.6.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= -github.com/decred/dcrd/crypto/blake256 v1.0.0 h1:/8DMNYp9SGi5f0w7uCm6d6M4OU2rGFK09Y2A4Xv7EE0= -github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc= -github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 h1:HbphB4TFFXpv7MNrT52FGrrgVXF1owhMVTHFZIlnvd4= -github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0/go.mod h1:DZGJHZMqrU4JJqFAWUS2UO1+lbSKsdiOoYi9Zzey7Fc= -github.com/ethereum/c-kzg-4844 v1.0.0 h1:0X1LBXxaEtYD9xsyj9B9ctQEZIpnvVDeoBx8aHEwTNA= -github.com/ethereum/c-kzg-4844 v1.0.0/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= -github.com/ethereum/go-ethereum v1.14.5 h1:szuFzO1MhJmweXjoM5nSAeDvjNUH3vIQoMzzQnfvjpw= -github.com/ethereum/go-ethereum v1.14.5/go.mod h1:VEDGGhSxY7IEjn98hJRFXl/uFvpRgbIIf2PpXiyGGgc= -github.com/ethereum/go-verkle v0.1.1-0.20240306133620-7d920df305f0 h1:KrE8I4reeVvf7C1tm8elRjj4BdscTYzz/WAbYyf/JI4= -github.com/ethereum/go-verkle v0.1.1-0.20240306133620-7d920df305f0/go.mod h1:D9AJLVXSyZQXJQVk8oh1EwjISE+sJTn2duYIZC0dy3w= -github.com/ethereum/hive v0.0.0-20240715150147-c87a99dccfce h1:wgH9mh3TFSd+LFSsXO6RdTEO3niapJRywO1Xl3/IoIE= -github.com/ethereum/hive v0.0.0-20240715150147-c87a99dccfce/go.mod h1:ghNXZW+/WQClcyiwZpbTzUCyxwql7YeMacYd44v+BJE= -github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= -github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= -github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= -github.com/getsentry/sentry-go v0.18.0 h1:MtBW5H9QgdcJabtZcuJG80BMOwaBpkRDZkxRkNC1sN0= -github.com/getsentry/sentry-go v0.18.0/go.mod h1:Kgon4Mby+FJ7ZWHFUAZgVaIa8sxHtnRJRLTXZr51aKQ= -github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= -github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= -github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= -github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= -github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= -github.com/go-stack/stack v1.8.1 h1:ntEHSVwIt7PNXNpgPmVfMrNhLtgjlmnZha2kOpuRiDw= -github.com/go-stack/stack v1.8.1/go.mod h1:dcoOX6HbPZSZptuspn9bctJ+N/CnF5gGygcUP3XYfe4= -github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= -github.com/gofrs/flock v0.8.1 h1:+gYjHKf32LDeiEEFhQaotPbLuUXjY5ZqxKgXy7n59aw= -github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= -github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= -github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg= -github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= -github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= -github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= -github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= -github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= -github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= -github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= -github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= -github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb h1:PBC98N2aIaM3XXiurYmW7fx4GZkL8feAMVq7nEjURHk= -github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= -github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/subcommands v1.2.0/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= -github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= -github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= -github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= -github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/holiman/bloomfilter/v2 v2.0.3 h1:73e0e/V0tCydx14a0SCYS/EWCxgwLZ18CZcZKVu0fao= -github.com/holiman/bloomfilter/v2 v2.0.3/go.mod h1:zpoh+gs7qcpqrHr3dB55AMiJwo0iURXE7ZOP9L9hSkA= -github.com/holiman/uint256 v1.2.4 h1:jUc4Nk8fm9jZabQuqr2JzednajVmBpC+oiTiXZJEApU= -github.com/holiman/uint256 v1.2.4/go.mod h1:EOMSn4q6Nyt9P6efbI3bueV4e1b3dGlUCXeiRV4ng7E= -github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= -github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/compress v1.15.15 h1:EF27CXIuDsYJ6mmvtBRlEuB2UVOqHG1tAXgZ7yIO+lw= -github.com/klauspost/compress v1.15.15/go.mod h1:ZcK2JAFqKOpnBlxcLsJzYfrS9X1akm9fHZNnD9+Vo/4= -github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= -github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= -github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= -github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= -github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/leanovate/gopter v0.2.9 h1:fQjYxZaynp97ozCzfOyOuAGOU4aU/z37zf/tOujFk7c= -github.com/leanovate/gopter v0.2.9/go.mod h1:U2L/78B+KVFIx2VmW6onHJQzXtFb+p5y3y2Sh+Jxxv8= -github.com/lithammer/dedent v1.1.0 h1:VNzHMVCBNG1j0fh3OrsFRkVUwStdDArbgBWoPAffktY= -github.com/lithammer/dedent v1.1.0/go.mod h1:jrXYCQtgg0nJiN+StA2KgR7w6CiQNv9Fd/Z9BP0jIOc= -github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= -github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= -github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= -github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= -github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= -github.com/mattn/go-runewidth v0.0.14 h1:+xnbZSEeDbOIg5/mE6JF0w6n9duR1l3/WmbinWVwUuU= -github.com/mattn/go-runewidth v0.0.14/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= -github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo= -github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= -github.com/mmcloughlin/addchain v0.4.0 h1:SobOdjm2xLj1KkXN5/n0xTIWyZA2+s99UCY1iPfkHRY= -github.com/mmcloughlin/addchain v0.4.0/go.mod h1:A86O+tHqZLMNO4w6ZZ4FlVQEadcoqkyU72HC5wJ4RlU= -github.com/mmcloughlin/profile v0.1.1/go.mod h1:IhHD7q1ooxgwTgjxQYkACGA77oFTDdFVejUS1/tS/qU= -github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= -github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= -github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= -github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= -github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= -github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= -github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= -github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= -github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= -github.com/onsi/ginkgo/v2 v2.1.3/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c= -github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= -github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= -github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= -github.com/onsi/gomega v1.19.0 h1:4ieX6qQjPP/BfC3mpsAtIGGlxTWPeA3Inl/7DtXw1tw= -github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro= -github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4= -github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= -github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= -github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= -github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_golang v1.14.0 h1:nJdhIvne2eSX/XRAFV9PcvFFRbrjbcTUj0VP62TMhnw= -github.com/prometheus/client_golang v1.14.0/go.mod h1:8vpkKitgIVNcqrRBWh1C4TIUQgYNtG/XQE4E/Zae36Y= -github.com/prometheus/client_model v0.3.0 h1:UBgGFHqYdG/TPFD1B1ogZywDqEkwp3fBMvqdiQ7Xew4= -github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w= -github.com/prometheus/common v0.39.0 h1:oOyhkDq05hPZKItWVBkJ6g6AtGxi+fy7F4JvUV8uhsI= -github.com/prometheus/common v0.39.0/go.mod h1:6XBZ7lYdLCbkAVhwRsWTZn+IN5AB9F/NXd5w0BbEX0Y= -github.com/prometheus/procfs v0.9.0 h1:wzCHvIvM5SxWqYvwgVL7yJY8Lz3PKn49KQtpgMYJfhI= -github.com/prometheus/procfs v0.9.0/go.mod h1:+pB4zwohETzFnmlpe6yd2lSc+0/46IYZRB/chUwxUZY= -github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= -github.com/rivo/uniseg v0.4.3 h1:utMvzDsuh3suAEnhH0RdHmoPbU648o6CvXxTx4SBMOw= -github.com/rivo/uniseg v0.4.3/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= -github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= -github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= -github.com/shirou/gopsutil v3.21.11+incompatible h1:+1+c1VGhc88SSonWP6foOcLhvnKlUeu/erjjvaPEYiI= -github.com/shirou/gopsutil v3.21.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= -github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= -github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -github.com/supranational/blst v0.3.11 h1:LyU6FolezeWAhvQk0k6O/d49jqgO52MSDDfYgbeoEm4= -github.com/supranational/blst v0.3.11/go.mod h1:jZJtfjgudtNl4en1tzwPIV3KjUnQUvG3/j+w+fVonLw= -github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a h1:1ur3QoCqvE5fl+nylMaIr9PVV1w343YRDtsy+Rwu7XI= -github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a/go.mod h1:RRCYJbIwD5jmqPI9XoAFR0OcDxqUctll6zUj/+B4S48= -github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= -github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= -github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk= -github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= -github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yusufpapurcu/wmi v1.2.2 h1:KBNDSne4vP5mbSWnJbO+51IMOXJB67QiYCSBrubbPRg= -github.com/yusufpapurcu/wmi v1.2.2/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.22.0 h1:g1v0xeRhjcugydODzvb3mEM9SQ0HGp9s/nh3COQ/C30= -golang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M= -golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa h1:FRnLl4eNAQl8hwxVVC17teOw8kdjVDVAiFMtgUdTSRQ= -golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa/go.mod h1:zk2irFbV9DP96SEBUUAy67IdHUaZuSnrz1n472HUCLE= -golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= -golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.24.0 h1:1PcaxkF854Fu3+lvBIx5SYn9wRlBzzcnHZSiaFFAb0w= -golang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8= -golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -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-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= -golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -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/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -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= -golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= -google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= -google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= -google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= -google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= -google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= -google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= -google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= -google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= -gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= -gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/inconshreveable/log15.v2 v2.0.0-20200109203555-b30bc20e4fd1 h1:iiHuQZCNgYPmFQxd3BBN/Nc5+dAwzZuq5y40s20oQw0= -gopkg.in/inconshreveable/log15.v2 v2.0.0-20200109203555-b30bc20e4fd1/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= -gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= -gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= -gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -rsc.io/tmplfunc v0.0.3 h1:53XFQh69AfOa8Tw0Jm7t+GV7KZhOi6jzsCzTtKbMvzU= -rsc.io/tmplfunc v0.0.3/go.mod h1:AG3sTPzElb1Io3Yg4voV9AGZJuleGAwaVRxL9M49PhA= diff --git a/simulators/ethereum/consensus/main.go b/simulators/ethereum/consensus/main.go deleted file mode 100644 index 946e4af233..0000000000 --- a/simulators/ethereum/consensus/main.go +++ /dev/null @@ -1,373 +0,0 @@ -package main - -import ( - "bytes" - "crypto/sha1" - "encoding/json" - "fmt" - "os" - "path/filepath" - "regexp" - "strconv" - "strings" - "sync" - "time" - - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core" - "github.com/ethereum/go-ethereum/rpc" - "github.com/ethereum/hive/hivesim" -) - -func main() { - suites := []hivesim.Suite{ - makeSuite("consensus", "BlockchainTests"), - makeSuite("legacy", "LegacyTests/Constantinople/BlockchainTests"), - makeSuite("legacy-cancun", "LegacyTests/Cancun/BlockchainTests"), - } - client := hivesim.New() - for _, suite := range suites { - hivesim.MustRunSuite(client, suite) - } -} - -func makeSuite(name string, testsDirectory string) hivesim.Suite { - suite := hivesim.Suite{ - Name: name, - Description: "The '" + name + "' test suite executes BlockchainTests from the " + - "official test repository (https://github.com/ethereum/tests). For every test, it starts an instance of the client, " + - "and makes it import the RLP blocks. After import phase, the node is queried about it's latest blocks, which is matched " + - "to the expected last blockhash according to the test.", - } - suite.Add(hivesim.TestSpec{ - Name: "test file loader", - Description: "This is a meta-test. It loads the blockchain test files and " + - "launches the actual client tests. Any errors in test files will be reported " + - "through this test.", - Run: func(t *hivesim.T) { - runTestsLoader(t, testsDirectory) - }, - AlwaysRun: true, - }) - return suite -} - -// runTestsLoader loads the blockchain test files and spawns the client tests. -func runTestsLoader(t *hivesim.T, testsDirectory string) { - clientTypes, err := t.Sim.ClientTypes() - if err != nil { - t.Fatal("can't get client types:", err) - } - - parallelism := 16 - if val, ok := os.LookupEnv("HIVE_PARALLELISM"); ok { - if p, err := strconv.Atoi(val); err != nil { - t.Logf("Warning: invalid HIVE_PARALLELISM value %q", val) - } else { - parallelism = p - } - } - t.Log("parallelism:", parallelism) - - // Find the tests directory. - basePath, isset := os.LookupEnv("TESTPATH") - if !isset { - t.Fatal("$TESTPATH not set") - } - t.Log("testsDirectory:", testsDirectory) - fileRoot := filepath.Join(basePath, testsDirectory) - - // Spawn workers. - var wg sync.WaitGroup - var testCh = make(chan *testcase) - wg.Add(parallelism) - for i := 0; i < parallelism; i++ { - go func() { - defer wg.Done() - for test := range testCh { - t.Run(hivesim.TestSpec{ - Name: test.name, - Description: "Test source: " + testLink(test.filepath), - Run: test.run, - // Regexp matching on Name is disabled here because it's already done - // in loadTests. Matching in loadTests is better because it has access - // to the full test file path. - AlwaysRun: true, - }) - } - }() - } - - _, testPattern := t.Sim.TestPattern() - re := regexp.MustCompile(testPattern) - - // Deliver test cases. - loadTests(t, fileRoot, re, func(tc testcase) { - for _, client := range clientTypes { - if !client.HasRole("eth1") { - continue - } - tc := tc // shallow copy - tc.clientType = client.Name - testCh <- &tc - } - }) - close(testCh) - - // Wait for workers to finish. - wg.Wait() -} - -// testLink turns a test path into a link to the tests repo. -func testLink(filepath string) string { - // Convert ./tests/BlockchainTests/InvalidBlocks/bcExpectSection/lastblockhash.json - // into - // BlockchainTests/InvalidBlocks/bcExpectSection/lastblockhash.json - path := strings.TrimPrefix(filepath, ".") - path = strings.TrimPrefix(path, "/tests/") - // Link to - // https://github.com/ethereum/tests/blob/develop/BlockchainTests/InvalidBlocks/bcExpectSection/lastblockhash.json - return fmt.Sprintf("https://github.com/ethereum/tests/blob/develop/%v", path) -} - -// loadTests loads the files in 'root', running the given function for each test. -func loadTests(t *hivesim.T, root string, re *regexp.Regexp, fn func(testcase)) { - filepath.Walk(root, func(path string, info os.FileInfo, err error) error { - if err != nil { - t.Errorf("unable to walk path: %s", err) - return err - } - if info.IsDir() { - return nil - } - if fname := info.Name(); !strings.HasSuffix(fname, ".json") { - return nil - } - pathname := strings.TrimSuffix(strings.TrimPrefix(path, root), ".json") - if !re.MatchString(pathname) { - fmt.Println("skip", pathname) - return nil // skip - } - - var tests map[string]BlockTest - if err := common.LoadJSON(path, &tests); err != nil { - t.Logf("invalid test file: %v", err) - return nil - } - - for name, blocktest := range tests { - tc := testcase{blockTest: blocktest, name: name, filepath: path} - if err := tc.validate(); err != nil { - t.Errorf("test validation failed for %s: %v", tc.name, err) - continue - } - fn(tc) - } - return nil - }) -} - -type testcase struct { - name string - clientType string - blockTest BlockTest - filepath string -} - -// validate returns error if the test's chain rules are not supported. -func (tc *testcase) validate() error { - net := tc.blockTest.json.Network - if _, exist := envForks[net]; !exist { - return fmt.Errorf("network `%v` not defined in ruleset", net) - } - return nil -} - -// run launches the client and runs the test case against it. -func (tc *testcase) run(t *hivesim.T) { - start := time.Now() - root, genesis, blocks, err := tc.artefacts() - if err != nil { - t.Fatal("can't prepare artefacts:", err) - } - - // update the parameters with test-specific stuff - env := hivesim.Params{ - "HIVE_FORK_DAO_VOTE": "1", - "HIVE_CHAIN_ID": "1", - } - tc.updateEnv(env) - genesisTarget := strings.Replace(genesis, root, "", 1) - files := map[string]string{ - genesisTarget: genesis, - } - for _, filename := range blocks { - fileTarget := strings.Replace(filename, root, "", 1) - files[fileTarget] = filename - } - - t1 := time.Now() - client := t.StartClient(tc.clientType, env, hivesim.WithStaticFiles(files)) - - t2 := time.Now() - genesisHash, genesisResponse, err := getBlock(client.RPC(), "0x0") - if err != nil { - t.Fatalf("can't get genesis: %v", err) - } - wantGenesis := tc.blockTest.json.Genesis.Hash - if !bytes.Equal(wantGenesis[:], genesisHash) { - t.Errorf("genesis hash mismatch:\n want 0x%x\n got 0x%x", wantGenesis, genesisHash) - if diffs, err := compareGenesis(genesisResponse, tc.blockTest.json.Genesis); err == nil { - t.Logf("Found differences: %v", diffs) - } - return - } - - // verify postconditions - t3 := time.Now() - lastHash, lastResponse, err := getBlock(client.RPC(), "latest") - if err != nil { - t.Fatal("can't get latest block:", err) - } - wantBest := tc.blockTest.json.BestBlock - if !bytes.Equal(wantBest[:], lastHash) { - t.Errorf("last block hash mismatch:\n want 0x%x\n got 0x%x", wantBest, lastHash) - t.Log("block response:", lastResponse) - return - } - - t4 := time.Now() - t.Logf(`test timing: - artefacts %v - startClient %v - checkGenesis %v - checkLatest %v`, t1.Sub(start), t2.Sub(t1), t3.Sub(t2), t4.Sub(t3)) -} - -// updateEnv sets environment variables from the test -func (tc *testcase) updateEnv(env hivesim.Params) { - // Environment variables for fork rules - forks := envForks[tc.blockTest.json.Network] - for k, v := range forks { - env[k] = fmt.Sprintf("%d", v) - } - // Possibly disable POW. - if tc.blockTest.json.SealEngine == "NoProof" { - env["HIVE_SKIP_POW"] = "1" - } -} - -// toGethGenesis creates the genesis specification from a test block. -func toGethGenesis(test *btJSON) *core.Genesis { - genesis := &core.Genesis{ - Nonce: test.Genesis.Nonce.Uint64(), - Timestamp: test.Genesis.Timestamp.Uint64(), - ExtraData: test.Genesis.ExtraData, - GasLimit: test.Genesis.GasLimit, - Difficulty: test.Genesis.Difficulty, - Mixhash: test.Genesis.MixHash, - Coinbase: test.Genesis.Coinbase, - Alloc: test.Pre, - BaseFee: test.Genesis.BaseFee, - ExcessBlobGas: test.Genesis.ExcessBlobGas, - } - return genesis -} - -// artefacts generates the test files which are copied into the client container. -func (tc *testcase) artefacts() (string, string, []string, error) { - key := fmt.Sprintf("%x", sha1.Sum([]byte(tc.filepath+tc.name))) - rootDir := filepath.Join(tc.clientType, key) - blockDir := filepath.Join(rootDir, "blocks") - - if err := os.MkdirAll(blockDir, 0700); err != nil { - return "", "", nil, err - } - genesis := toGethGenesis(&tc.blockTest.json) - genBytes, _ := json.Marshal(genesis) - genesisFile := filepath.Join(rootDir, "genesis.json") - if err := os.WriteFile(genesisFile, genBytes, 0777); err != nil { - return rootDir, "", nil, fmt.Errorf("failed writing genesis: %v", err) - } - - var blocks []string - for i, block := range tc.blockTest.json.Blocks { - rlpdata := common.FromHex(block.Rlp) - fname := fmt.Sprintf("%s/%04d.rlp", blockDir, i+1) - if err := os.WriteFile(fname, rlpdata, 0777); err != nil { - return rootDir, genesisFile, blocks, fmt.Errorf("failed writing block %d: %v", i, err) - } - blocks = append(blocks, fname) - } - return rootDir, genesisFile, blocks, nil -} - -// getBlock fetches a block from the client under test. -func getBlock(client *rpc.Client, arg string) (blockhash []byte, responseJSON string, err error) { - blockData := make(map[string]interface{}) - if err := client.Call(&blockData, "eth_getBlockByNumber", arg, false); err != nil { - // Make one more attempt - fmt.Println("Client connect failed, making one more attempt...") - if err = client.Call(&blockData, "eth_getBlockByNumber", arg, false); err != nil { - return nil, "", err - } - } - - // Capture all response data. - resp, _ := json.MarshalIndent(blockData, "", " ") - responseJSON = string(resp) - - hash, ok := blockData["hash"] - if !ok { - return nil, responseJSON, fmt.Errorf("no block hash found in response") - } - hexHash, ok := hash.(string) - if !ok { - return nil, responseJSON, fmt.Errorf("block hash in response is not a string: `%v`", hash) - } - return common.HexToHash(hexHash).Bytes(), responseJSON, nil -} - -// compareGenesis is a helper utility to print out diffs in the genesis returned from the client, -// and print out the differences found. This is to avoid gigantic outputs where 40K tests all -// spit out all the fields. -func compareGenesis(have string, want btHeader) (string, error) { - var haveGenesis btHeader - if err := json.Unmarshal([]byte(have), &haveGenesis); err != nil { - return "", err - } - output := "" - cmp := func(have, want interface{}, name string) { - if haveStr, wantStr := fmt.Sprintf("%v", have), fmt.Sprintf("%v", want); haveStr != wantStr { - output += fmt.Sprintf("genesis.%v - have %v, want %v \n", name, haveStr, wantStr) - } - } - // No need to output the hash difference -- it's already printed before entering here - //cmp(haveGenesis.Hash, want.Hash, "hash") - cmp(haveGenesis.MixHash, want.MixHash, "mixHash") - cmp(haveGenesis.ParentHash, want.ParentHash, "parentHash") - cmp(haveGenesis.ReceiptTrie, want.ReceiptTrie, "receiptsRoot") - cmp(haveGenesis.TransactionsTrie, want.TransactionsTrie, "transactionsRoot") - cmp(haveGenesis.UncleHash, want.UncleHash, "sha3Uncles") - cmp(haveGenesis.Bloom, want.Bloom, "bloom") - cmp(haveGenesis.Number, want.Number, "number") - cmp(haveGenesis.Coinbase, want.Coinbase, "miner") - cmp(haveGenesis.ExtraData, want.ExtraData, "extraData") - cmp(haveGenesis.Difficulty, want.Difficulty, "difficulty") - cmp(haveGenesis.Timestamp, want.Timestamp, "timestamp") - cmp(haveGenesis.GasLimit, want.GasLimit, "gasLimit") - cmp(haveGenesis.GasUsed, want.GasUsed, "gasUsed") - cmp(haveGenesis.Nonce, want.Nonce, "nonce") - cmp(haveGenesis.BaseFee, want.BaseFee, "baseFeePerGas") - if haveGenesis.ExcessBlobGas != nil && want.ExcessBlobGas != nil { - cmp(*haveGenesis.ExcessBlobGas, *want.ExcessBlobGas, "excessBlobGas") - } else { - cmp(haveGenesis.ExcessBlobGas, want.ExcessBlobGas, "excessBlobGas") - } - if haveGenesis.BlobGasUsed != nil && want.BlobGasUsed != nil { - cmp(*haveGenesis.BlobGasUsed, *want.BlobGasUsed, "blobGasUsed") - } else { - cmp(haveGenesis.BlobGasUsed, want.BlobGasUsed, "blobGasUsed") - } - return output, nil -} diff --git a/simulators/ethereum/consensus/types.go b/simulators/ethereum/consensus/types.go deleted file mode 100644 index 48c51ed594..0000000000 --- a/simulators/ethereum/consensus/types.go +++ /dev/null @@ -1,163 +0,0 @@ -package main - -import ( - "encoding/json" - "math/big" - - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/common/hexutil" - "github.com/ethereum/go-ethereum/common/math" - "github.com/ethereum/go-ethereum/core" - "github.com/ethereum/go-ethereum/core/types" -) - -// A BlockTest checks handling of entire blocks. -type BlockTest struct { - json btJSON -} - -// UnmarshalJSON implements json.Unmarshaler interface. -func (t *BlockTest) UnmarshalJSON(in []byte) error { - return json.Unmarshal(in, &t.json) -} - -type btJSON struct { - Blocks []btBlock `json:"blocks"` - Genesis btHeader `json:"genesisBlockHeader"` - Pre core.GenesisAlloc `json:"pre"` - Post core.GenesisAlloc `json:"-"` - BestBlock common.UnprefixedHash `json:"lastblockhash"` - Network string `json:"network"` - SealEngine string `json:"sealEngine"` -} - -type btBlock struct { - BlockHeader *btHeader - Rlp string - UncleHeaders []*btHeader -} - -type btHeader struct { - Bloom types.Bloom `json:"bloom"` - Coinbase common.Address `json:"miner"` - MixHash common.Hash `json:"mixHash"` - Nonce types.BlockNonce `json:"nonce"` - Number *big.Int `json:"number"` - Hash common.Hash `json:"hash"` - ParentHash common.Hash `json:"parentHash"` - ReceiptTrie common.Hash `json:"receiptsRoot"` - StateRoot common.Hash `json:"stateRoot"` - TransactionsTrie common.Hash `json:"transactionsRoot"` - UncleHash common.Hash `json:"sha3Uncles"` - ExtraData []byte `json:"extraData"` - Difficulty *big.Int `json:"difficulty"` - GasLimit uint64 `json:"gasLimit"` - GasUsed uint64 `json:"gasUsed"` - Timestamp *big.Int `json:"timestamp"` - BaseFee *big.Int `json:"baseFeePerGas"` // EIP-1559 - ExcessBlobGas *uint64 `json:"excessBlobGas"` // EIP-4844 - BlobGasUsed *uint64 `json:"blobGasUsed"` // EIP-4844 -} - -func (b *btHeader) UnmarshalJSON(input []byte) error { - type btHeader struct { - Bloom *types.Bloom `json:"bloom"` - Coinbase *common.Address `json:"coinbase"` // name in blocktests - CoinbaseAlt *common.Address `json:"author"` // nethermind/parity/oe name - CoinbaseAlt2 *common.Address `json:"miner"` // geth/besu name - MixHash *common.Hash `json:"mixHash"` - Nonce *types.BlockNonce `json:"nonce"` - Number *math.HexOrDecimal256 `json:"number"` - Hash *common.Hash `json:"hash"` - ParentHash *common.Hash `json:"parentHash"` - ReceiptTrie *common.Hash `json:"receiptsRoot"` // name in std json - ReceiptTrieAlt *common.Hash `json:"receiptTrie"` // name in blocktests - StateRoot *common.Hash `json:"stateRoot"` - TransactionsTrie *common.Hash `json:"transactionsRoot"` // name in std json - TransactionsTrieAlt *common.Hash `json:"transactionsTrie"` // name in blocktests - UncleHash *common.Hash `json:"sha3Uncles"` // name in std json - UncleHashAlt *common.Hash `json:"uncleHash"` // name in blocktests - ExtraData *hexutil.Bytes `json:"extraData"` - Difficulty *math.HexOrDecimal256 `json:"difficulty"` - GasLimit *math.HexOrDecimal64 `json:"gasLimit"` - GasUsed *math.HexOrDecimal64 `json:"gasUsed"` - Timestamp *math.HexOrDecimal256 `json:"timestamp"` - BaseFee *math.HexOrDecimal256 `json:"baseFeePerGas"` - ExcessBlobGas *math.HexOrDecimal64 `json:"excessBlobGas"` - BlobGasUsed *math.HexOrDecimal64 `json:"blobGasUsed"` - } - var dec btHeader - if err := json.Unmarshal(input, &dec); err != nil { - return err - } - if dec.Bloom != nil { - b.Bloom = *dec.Bloom - } - if dec.Coinbase != nil { - b.Coinbase = *dec.Coinbase - } else if dec.CoinbaseAlt != nil { - b.Coinbase = *dec.CoinbaseAlt - } else if dec.CoinbaseAlt2 != nil { - b.Coinbase = *dec.CoinbaseAlt2 - } - if dec.MixHash != nil { - b.MixHash = *dec.MixHash - } - if dec.Nonce != nil { - b.Nonce = *dec.Nonce - } - if dec.Number != nil { - b.Number = (*big.Int)(dec.Number) - } - if dec.Hash != nil { - b.Hash = *dec.Hash - } - if dec.ParentHash != nil { - b.ParentHash = *dec.ParentHash - } - if dec.ReceiptTrie != nil { - b.ReceiptTrie = *dec.ReceiptTrie - } else if dec.ReceiptTrieAlt != nil { - b.ReceiptTrie = *dec.ReceiptTrieAlt - } - if dec.StateRoot != nil { - b.StateRoot = *dec.StateRoot - } - if dec.TransactionsTrie != nil { - b.TransactionsTrie = *dec.TransactionsTrie - } else if dec.TransactionsTrieAlt != nil { - b.TransactionsTrie = *dec.TransactionsTrieAlt - } - if dec.UncleHash != nil { - b.UncleHash = *dec.UncleHash - } else if dec.UncleHashAlt != nil { - b.UncleHash = *dec.UncleHashAlt - } - if dec.ExtraData != nil { - b.ExtraData = *dec.ExtraData - } - if dec.Difficulty != nil { - b.Difficulty = (*big.Int)(dec.Difficulty) - } - if dec.GasLimit != nil { - b.GasLimit = uint64(*dec.GasLimit) - } - if dec.GasUsed != nil { - b.GasUsed = uint64(*dec.GasUsed) - } - if dec.Timestamp != nil { - b.Timestamp = (*big.Int)(dec.Timestamp) - } - if dec.BaseFee != nil { - b.BaseFee = (*big.Int)(dec.BaseFee) - } - if dec.ExcessBlobGas != nil { - ebg := uint64(*dec.ExcessBlobGas) - b.ExcessBlobGas = &ebg - } - if dec.BlobGasUsed != nil { - bgu := uint64(*dec.BlobGasUsed) - b.BlobGasUsed = &bgu - } - return nil -} diff --git a/simulators/ethereum/graphql/Dockerfile b/simulators/ethereum/graphql/Dockerfile deleted file mode 100644 index cd8492e4bd..0000000000 --- a/simulators/ethereum/graphql/Dockerfile +++ /dev/null @@ -1,18 +0,0 @@ -# This simulation runs GraphQL tests. -FROM golang:1-alpine as builder -ARG GOPROXY -ENV GOPROXY=${GOPROXY} - -RUN apk add --update git gcc musl-dev linux-headers - -# Build the simulator executable. -ADD . /source -WORKDIR /source -RUN go build -v . - -# Build the simulator run container. -FROM alpine:latest -ADD . /source -WORKDIR /source -COPY --from=builder /source/graphql . -ENTRYPOINT ["./graphql"] diff --git a/simulators/ethereum/graphql/README.md b/simulators/ethereum/graphql/README.md deleted file mode 100644 index 73225707ec..0000000000 --- a/simulators/ethereum/graphql/README.md +++ /dev/null @@ -1,7 +0,0 @@ -# GraphQL - -This simulator tests the GraphQL endpoint of Ethereum clients to validate they are following the [specification](https://github.com/ethereum/execution-apis/tree/main#graphql). - -## Adding a test - -This step-by-step [example](https://notes.ethereum.org/@s1na/By9rdtex6) shows how to add a new test to the GraphQL simulator. \ No newline at end of file diff --git a/simulators/ethereum/graphql/go.mod b/simulators/ethereum/graphql/go.mod deleted file mode 100644 index e391840268..0000000000 --- a/simulators/ethereum/graphql/go.mod +++ /dev/null @@ -1,76 +0,0 @@ -module github.com/ethereum/hive/simulators/ethereum/graphql - -go 1.21 - -toolchain go1.22.1 - -require ( - github.com/ethereum/go-ethereum v1.14.5 - github.com/ethereum/hive v0.0.0-20240715150147-c87a99dccfce -) - -require ( - github.com/DataDog/zstd v1.5.2 // indirect - github.com/Microsoft/go-winio v0.6.2 // indirect - github.com/VictoriaMetrics/fastcache v1.12.2 // indirect - github.com/beorn7/perks v1.0.1 // indirect - github.com/bits-and-blooms/bitset v1.10.0 // indirect - github.com/btcsuite/btcd/btcec/v2 v2.3.2 // indirect - github.com/cespare/xxhash/v2 v2.3.0 // indirect - github.com/cockroachdb/errors v1.11.1 // indirect - github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b // indirect - github.com/cockroachdb/pebble v1.1.0 // indirect - github.com/cockroachdb/redact v1.1.5 // indirect - github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 // indirect - github.com/consensys/bavard v0.1.13 // indirect - github.com/consensys/gnark-crypto v0.12.1 // indirect - github.com/crate-crypto/go-ipa v0.0.0-20240223125850-b1e8a79f509c // indirect - github.com/crate-crypto/go-kzg-4844 v1.0.0 // indirect - github.com/deckarep/golang-set/v2 v2.6.0 // indirect - github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 // indirect - github.com/ethereum/c-kzg-4844 v1.0.0 // indirect - github.com/ethereum/go-verkle v0.1.1-0.20240306133620-7d920df305f0 // indirect - github.com/getsentry/sentry-go v0.18.0 // indirect - github.com/go-ole/go-ole v1.3.0 // indirect - github.com/go-stack/stack v1.8.1 // indirect - github.com/gofrs/flock v0.8.1 // indirect - github.com/gogo/protobuf v1.3.2 // indirect - github.com/golang-jwt/jwt/v4 v4.5.0 // indirect - github.com/golang/protobuf v1.5.4 // indirect - github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect - github.com/google/go-cmp v0.6.0 // indirect - github.com/gorilla/websocket v1.5.0 // indirect - github.com/holiman/bloomfilter/v2 v2.0.3 // indirect - github.com/holiman/uint256 v1.2.4 // indirect - github.com/klauspost/compress v1.15.15 // indirect - github.com/kr/pretty v0.3.1 // indirect - github.com/kr/text v0.2.0 // indirect - github.com/lithammer/dedent v1.1.0 // indirect - github.com/mattn/go-colorable v0.1.13 // indirect - github.com/mattn/go-isatty v0.0.20 // indirect - github.com/mattn/go-runewidth v0.0.14 // indirect - github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect - github.com/mmcloughlin/addchain v0.4.0 // indirect - github.com/olekukonko/tablewriter v0.0.5 // indirect - github.com/pkg/errors v0.9.1 // indirect - github.com/prometheus/client_golang v1.14.0 // indirect - github.com/prometheus/client_model v0.3.0 // indirect - github.com/prometheus/common v0.39.0 // indirect - github.com/prometheus/procfs v0.9.0 // indirect - github.com/rivo/uniseg v0.4.3 // indirect - github.com/rogpeppe/go-internal v1.9.0 // indirect - github.com/shirou/gopsutil v3.21.11+incompatible // indirect - github.com/supranational/blst v0.3.11 // indirect - github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a // indirect - github.com/tklauser/go-sysconf v0.3.12 // indirect - github.com/tklauser/numcpus v0.6.1 // indirect - github.com/yusufpapurcu/wmi v1.2.2 // indirect - golang.org/x/crypto v0.22.0 // indirect - golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa // indirect - golang.org/x/sync v0.7.0 // indirect - golang.org/x/sys v0.20.0 // indirect - golang.org/x/text v0.14.0 // indirect - google.golang.org/protobuf v1.33.0 // indirect - gopkg.in/inconshreveable/log15.v2 v2.0.0-20200109203555-b30bc20e4fd1 // indirect - rsc.io/tmplfunc v0.0.3 // indirect -) diff --git a/simulators/ethereum/graphql/go.sum b/simulators/ethereum/graphql/go.sum deleted file mode 100644 index a8dbafb7b9..0000000000 --- a/simulators/ethereum/graphql/go.sum +++ /dev/null @@ -1,295 +0,0 @@ -github.com/DataDog/zstd v1.5.2 h1:vUG4lAyuPCXO0TLbXvPv7EB7cNK1QV/luu55UHLrrn8= -github.com/DataDog/zstd v1.5.2/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw= -github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= -github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= -github.com/VictoriaMetrics/fastcache v1.12.2 h1:N0y9ASrJ0F6h0QaC3o6uJb3NIZ9VKLjCM7NQbSmF7WI= -github.com/VictoriaMetrics/fastcache v1.12.2/go.mod h1:AmC+Nzz1+3G2eCPapF6UcsnkThDcMsQicp4xDukwJYI= -github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= -github.com/allegro/bigcache v1.2.1 h1:hg1sY1raCwic3Vnsvje6TT7/pnZba83LeFck5NrFKSc= -github.com/allegro/bigcache v1.2.1/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= -github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= -github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/bits-and-blooms/bitset v1.10.0 h1:ePXTeiPEazB5+opbv5fr8umg2R/1NlzgDsyepwsSr88= -github.com/bits-and-blooms/bitset v1.10.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= -github.com/btcsuite/btcd/btcec/v2 v2.3.2 h1:5n0X6hX0Zk+6omWcihdYvdAlGf2DfasC0GMf7DClJ3U= -github.com/btcsuite/btcd/btcec/v2 v2.3.2/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= -github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOFYSNEs0TFnxxnS9+4U= -github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= -github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= -github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= -github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= -github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f h1:otljaYPt5hWxV3MUfO5dFPFiOXg9CyG5/kCfayTqsJ4= -github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= -github.com/cockroachdb/errors v1.11.1 h1:xSEW75zKaKCWzR3OfxXUxgrk/NtT4G1MiOv5lWZazG8= -github.com/cockroachdb/errors v1.11.1/go.mod h1:8MUxA3Gi6b25tYlFEBGLf+D8aISL+M4MIpiWMSNRfxw= -github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b h1:r6VH0faHjZeQy818SGhaone5OnYfxFR/+AzdY3sf5aE= -github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= -github.com/cockroachdb/pebble v1.1.0 h1:pcFh8CdCIt2kmEpK0OIatq67Ln9uGDYY3d5XnE0LJG4= -github.com/cockroachdb/pebble v1.1.0/go.mod h1:sEHm5NOXxyiAoKWhoFxT8xMgd/f3RA6qUqQ1BXKrh2E= -github.com/cockroachdb/redact v1.1.5 h1:u1PMllDkdFfPWaNGMyLD1+so+aq3uUItthCFqzwPJ30= -github.com/cockroachdb/redact v1.1.5/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= -github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 h1:zuQyyAKVxetITBuuhv3BI9cMrmStnpT18zmgmTxunpo= -github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06/go.mod h1:7nc4anLGjupUW/PeY5qiNYsdNXj7zopG+eqsS7To5IQ= -github.com/consensys/bavard v0.1.13 h1:oLhMLOFGTLdlda/kma4VOJazblc7IM5y5QPd2A/YjhQ= -github.com/consensys/bavard v0.1.13/go.mod h1:9ItSMtA/dXMAiL7BG6bqW2m3NdSEObYWoH223nGHukI= -github.com/consensys/gnark-crypto v0.12.1 h1:lHH39WuuFgVHONRl3J0LRBtuYdQTumFSDtJF7HpyG8M= -github.com/consensys/gnark-crypto v0.12.1/go.mod h1:v2Gy7L/4ZRosZ7Ivs+9SfUDr0f5UlG+EM5t7MPHiLuY= -github.com/crate-crypto/go-ipa v0.0.0-20240223125850-b1e8a79f509c h1:uQYC5Z1mdLRPrZhHjHxufI8+2UG/i25QG92j0Er9p6I= -github.com/crate-crypto/go-ipa v0.0.0-20240223125850-b1e8a79f509c/go.mod h1:geZJZH3SzKCqnz5VT0q/DyIG/tvu/dZk+VIfXicupJs= -github.com/crate-crypto/go-kzg-4844 v1.0.0 h1:TsSgHwrkTKecKJ4kadtHi4b3xHW5dCFUDFnUp1TsawI= -github.com/crate-crypto/go-kzg-4844 v1.0.0/go.mod h1:1kMhvPgI0Ky3yIa+9lFySEBUBXkYxeOi8ZF1sYioxhc= -github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/deckarep/golang-set/v2 v2.6.0 h1:XfcQbWM1LlMB8BsJ8N9vW5ehnnPVIw0je80NsVHagjM= -github.com/deckarep/golang-set/v2 v2.6.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= -github.com/decred/dcrd/crypto/blake256 v1.0.0 h1:/8DMNYp9SGi5f0w7uCm6d6M4OU2rGFK09Y2A4Xv7EE0= -github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc= -github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 h1:HbphB4TFFXpv7MNrT52FGrrgVXF1owhMVTHFZIlnvd4= -github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0/go.mod h1:DZGJHZMqrU4JJqFAWUS2UO1+lbSKsdiOoYi9Zzey7Fc= -github.com/ethereum/c-kzg-4844 v1.0.0 h1:0X1LBXxaEtYD9xsyj9B9ctQEZIpnvVDeoBx8aHEwTNA= -github.com/ethereum/c-kzg-4844 v1.0.0/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= -github.com/ethereum/go-ethereum v1.14.5 h1:szuFzO1MhJmweXjoM5nSAeDvjNUH3vIQoMzzQnfvjpw= -github.com/ethereum/go-ethereum v1.14.5/go.mod h1:VEDGGhSxY7IEjn98hJRFXl/uFvpRgbIIf2PpXiyGGgc= -github.com/ethereum/go-verkle v0.1.1-0.20240306133620-7d920df305f0 h1:KrE8I4reeVvf7C1tm8elRjj4BdscTYzz/WAbYyf/JI4= -github.com/ethereum/go-verkle v0.1.1-0.20240306133620-7d920df305f0/go.mod h1:D9AJLVXSyZQXJQVk8oh1EwjISE+sJTn2duYIZC0dy3w= -github.com/ethereum/hive v0.0.0-20240715150147-c87a99dccfce h1:wgH9mh3TFSd+LFSsXO6RdTEO3niapJRywO1Xl3/IoIE= -github.com/ethereum/hive v0.0.0-20240715150147-c87a99dccfce/go.mod h1:ghNXZW+/WQClcyiwZpbTzUCyxwql7YeMacYd44v+BJE= -github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= -github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= -github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= -github.com/getsentry/sentry-go v0.18.0 h1:MtBW5H9QgdcJabtZcuJG80BMOwaBpkRDZkxRkNC1sN0= -github.com/getsentry/sentry-go v0.18.0/go.mod h1:Kgon4Mby+FJ7ZWHFUAZgVaIa8sxHtnRJRLTXZr51aKQ= -github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= -github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= -github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= -github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= -github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= -github.com/go-stack/stack v1.8.1 h1:ntEHSVwIt7PNXNpgPmVfMrNhLtgjlmnZha2kOpuRiDw= -github.com/go-stack/stack v1.8.1/go.mod h1:dcoOX6HbPZSZptuspn9bctJ+N/CnF5gGygcUP3XYfe4= -github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= -github.com/gofrs/flock v0.8.1 h1:+gYjHKf32LDeiEEFhQaotPbLuUXjY5ZqxKgXy7n59aw= -github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= -github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= -github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg= -github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= -github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= -github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= -github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= -github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= -github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= -github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= -github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= -github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb h1:PBC98N2aIaM3XXiurYmW7fx4GZkL8feAMVq7nEjURHk= -github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= -github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/subcommands v1.2.0/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= -github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= -github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= -github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= -github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/holiman/bloomfilter/v2 v2.0.3 h1:73e0e/V0tCydx14a0SCYS/EWCxgwLZ18CZcZKVu0fao= -github.com/holiman/bloomfilter/v2 v2.0.3/go.mod h1:zpoh+gs7qcpqrHr3dB55AMiJwo0iURXE7ZOP9L9hSkA= -github.com/holiman/uint256 v1.2.4 h1:jUc4Nk8fm9jZabQuqr2JzednajVmBpC+oiTiXZJEApU= -github.com/holiman/uint256 v1.2.4/go.mod h1:EOMSn4q6Nyt9P6efbI3bueV4e1b3dGlUCXeiRV4ng7E= -github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= -github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/compress v1.15.15 h1:EF27CXIuDsYJ6mmvtBRlEuB2UVOqHG1tAXgZ7yIO+lw= -github.com/klauspost/compress v1.15.15/go.mod h1:ZcK2JAFqKOpnBlxcLsJzYfrS9X1akm9fHZNnD9+Vo/4= -github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= -github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= -github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= -github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= -github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/leanovate/gopter v0.2.9 h1:fQjYxZaynp97ozCzfOyOuAGOU4aU/z37zf/tOujFk7c= -github.com/leanovate/gopter v0.2.9/go.mod h1:U2L/78B+KVFIx2VmW6onHJQzXtFb+p5y3y2Sh+Jxxv8= -github.com/lithammer/dedent v1.1.0 h1:VNzHMVCBNG1j0fh3OrsFRkVUwStdDArbgBWoPAffktY= -github.com/lithammer/dedent v1.1.0/go.mod h1:jrXYCQtgg0nJiN+StA2KgR7w6CiQNv9Fd/Z9BP0jIOc= -github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= -github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= -github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= -github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= -github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= -github.com/mattn/go-runewidth v0.0.14 h1:+xnbZSEeDbOIg5/mE6JF0w6n9duR1l3/WmbinWVwUuU= -github.com/mattn/go-runewidth v0.0.14/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= -github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo= -github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= -github.com/mmcloughlin/addchain v0.4.0 h1:SobOdjm2xLj1KkXN5/n0xTIWyZA2+s99UCY1iPfkHRY= -github.com/mmcloughlin/addchain v0.4.0/go.mod h1:A86O+tHqZLMNO4w6ZZ4FlVQEadcoqkyU72HC5wJ4RlU= -github.com/mmcloughlin/profile v0.1.1/go.mod h1:IhHD7q1ooxgwTgjxQYkACGA77oFTDdFVejUS1/tS/qU= -github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= -github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= -github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= -github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= -github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= -github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= -github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= -github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= -github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= -github.com/onsi/ginkgo/v2 v2.1.3/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c= -github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= -github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= -github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= -github.com/onsi/gomega v1.19.0 h1:4ieX6qQjPP/BfC3mpsAtIGGlxTWPeA3Inl/7DtXw1tw= -github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro= -github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4= -github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= -github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= -github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= -github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_golang v1.14.0 h1:nJdhIvne2eSX/XRAFV9PcvFFRbrjbcTUj0VP62TMhnw= -github.com/prometheus/client_golang v1.14.0/go.mod h1:8vpkKitgIVNcqrRBWh1C4TIUQgYNtG/XQE4E/Zae36Y= -github.com/prometheus/client_model v0.3.0 h1:UBgGFHqYdG/TPFD1B1ogZywDqEkwp3fBMvqdiQ7Xew4= -github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w= -github.com/prometheus/common v0.39.0 h1:oOyhkDq05hPZKItWVBkJ6g6AtGxi+fy7F4JvUV8uhsI= -github.com/prometheus/common v0.39.0/go.mod h1:6XBZ7lYdLCbkAVhwRsWTZn+IN5AB9F/NXd5w0BbEX0Y= -github.com/prometheus/procfs v0.9.0 h1:wzCHvIvM5SxWqYvwgVL7yJY8Lz3PKn49KQtpgMYJfhI= -github.com/prometheus/procfs v0.9.0/go.mod h1:+pB4zwohETzFnmlpe6yd2lSc+0/46IYZRB/chUwxUZY= -github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= -github.com/rivo/uniseg v0.4.3 h1:utMvzDsuh3suAEnhH0RdHmoPbU648o6CvXxTx4SBMOw= -github.com/rivo/uniseg v0.4.3/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= -github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= -github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= -github.com/shirou/gopsutil v3.21.11+incompatible h1:+1+c1VGhc88SSonWP6foOcLhvnKlUeu/erjjvaPEYiI= -github.com/shirou/gopsutil v3.21.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= -github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= -github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -github.com/supranational/blst v0.3.11 h1:LyU6FolezeWAhvQk0k6O/d49jqgO52MSDDfYgbeoEm4= -github.com/supranational/blst v0.3.11/go.mod h1:jZJtfjgudtNl4en1tzwPIV3KjUnQUvG3/j+w+fVonLw= -github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a h1:1ur3QoCqvE5fl+nylMaIr9PVV1w343YRDtsy+Rwu7XI= -github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a/go.mod h1:RRCYJbIwD5jmqPI9XoAFR0OcDxqUctll6zUj/+B4S48= -github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= -github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= -github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk= -github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= -github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yusufpapurcu/wmi v1.2.2 h1:KBNDSne4vP5mbSWnJbO+51IMOXJB67QiYCSBrubbPRg= -github.com/yusufpapurcu/wmi v1.2.2/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.22.0 h1:g1v0xeRhjcugydODzvb3mEM9SQ0HGp9s/nh3COQ/C30= -golang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M= -golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa h1:FRnLl4eNAQl8hwxVVC17teOw8kdjVDVAiFMtgUdTSRQ= -golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa/go.mod h1:zk2irFbV9DP96SEBUUAy67IdHUaZuSnrz1n472HUCLE= -golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= -golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.24.0 h1:1PcaxkF854Fu3+lvBIx5SYn9wRlBzzcnHZSiaFFAb0w= -golang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8= -golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -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-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= -golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -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/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -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= -golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= -google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= -google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= -google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= -google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= -google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= -google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= -google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= -google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= -gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= -gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/inconshreveable/log15.v2 v2.0.0-20200109203555-b30bc20e4fd1 h1:iiHuQZCNgYPmFQxd3BBN/Nc5+dAwzZuq5y40s20oQw0= -gopkg.in/inconshreveable/log15.v2 v2.0.0-20200109203555-b30bc20e4fd1/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= -gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= -gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= -gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -rsc.io/tmplfunc v0.0.3 h1:53XFQh69AfOa8Tw0Jm7t+GV7KZhOi6jzsCzTtKbMvzU= -rsc.io/tmplfunc v0.0.3/go.mod h1:AG3sTPzElb1Io3Yg4voV9AGZJuleGAwaVRxL9M49PhA= diff --git a/simulators/ethereum/graphql/graphql.go b/simulators/ethereum/graphql/graphql.go deleted file mode 100644 index 86059bee2e..0000000000 --- a/simulators/ethereum/graphql/graphql.go +++ /dev/null @@ -1,242 +0,0 @@ -package main - -import ( - "bytes" - "encoding/json" - "fmt" - "io" - "net/http" - "os" - "path" - "path/filepath" - "reflect" - "strconv" - "strings" - "sync" - - "github.com/ethereum/go-ethereum/core" - "github.com/ethereum/hive/hivesim" -) - -func main() { - var ( - genesisPath = "./init/testGenesis.json" - genesis = loadGenesis(genesisPath) - params = getParameters(genesis) - ) - - suite := hivesim.Suite{ - Name: "graphql", - Description: `Test suite covering the graphql API surface. -The GraphQL tests were initially imported from the Besu codebase.`, - } - suite.Add(hivesim.ClientTestSpec{ - Role: "eth1", - Name: "client launch", - Description: `This is a meta-test. It launches the client with the test chain -and reads the test case files. The individual test cases are run as sub-tests against -the client launched by this test.`, - Parameters: params, - Files: map[string]string{ - // The chain has originated from the Besu client. It consisted of Frontier blocks. - // It has been since extended with post-merge blocks. - "/genesis.json": genesisPath, - "/chain.rlp": "./init/testBlockchain.blocks", - }, - Run: graphqlTest, - }) - hivesim.MustRunSuite(hivesim.New(), suite) -} - -func graphqlTest(t *hivesim.T, c *hivesim.Client) { - parallelism := 16 - if val, ok := os.LookupEnv("HIVE_PARALLELISM"); ok { - if p, err := strconv.Atoi(val); err != nil { - t.Logf("Warning: invalid HIVE_PARALLELISM value %q", val) - } else { - parallelism = p - } - } - - var wg sync.WaitGroup - testCh := deliverTests(t, &wg, -1) - for i := 0; i < parallelism; i++ { - wg.Add(1) - go func() { - defer wg.Done() - for test := range testCh { - url := "https://github.com/ethereum/hive/blob/master/simulators/ethereum/graphql/testcases" - t.Run(hivesim.TestSpec{ - Name: fmt.Sprintf("%s (%s)", test.name, c.Type), - Description: fmt.Sprintf("Test case source: %s/%v.json", url, test.name), - Run: func(t *hivesim.T) { test.run(t, c) }, - }) - } - }() - } - wg.Wait() -} - -// deliverTests reads the test case files, sending them to the output channel. -func deliverTests(t *hivesim.T, wg *sync.WaitGroup, limit int) <-chan *testCase { - out := make(chan *testCase) - var i = 0 - wg.Add(1) - go func() { - defer wg.Done() - filepath.Walk("./testcases", func(filepath string, info os.FileInfo, err error) error { - if limit >= 0 && i >= limit { - return nil - } - if info.IsDir() { - return nil - } - if fname := info.Name(); !strings.HasSuffix(fname, ".json") { - return nil - } - data, err := os.ReadFile(filepath) - if err != nil { - t.Logf("Warning: can't read test file %s: %v", filepath, err) - return nil - } - var gqlTest graphQLTest - if err = json.Unmarshal(data, &gqlTest); err != nil { - t.Logf("Warning: can't unmarshal test file %s: %v", filepath, err) - return nil - } - i = i + 1 - t := testCase{ - name: strings.TrimSuffix(info.Name(), path.Ext(info.Name())), - gqlTest: &gqlTest, - } - out <- &t - return nil - }) - close(out) - }() - return out -} - -type testCase struct { - name string - gqlTest *graphQLTest -} - -// graphQLTest is the JSON object structure of a test case file. -type graphQLTest struct { - Request string `json:"request"` - Responses []interface{} `json:"responses"` - StatusCode int `json:"statusCode"` -} - -type qlQuery struct { - Query string `json:"query"` -} - -// prepareRunTest administers the hive-specific test stuff, registering the suite and reporting back the suite results -func (tc *testCase) run(t *hivesim.T, c *hivesim.Client) { - // Example of working queries: - // curl 'http://127.0.0.1:8545/graphql' --data-binary '{"query":"query blockNumber {\n block {\n number\n }\n}\n"}' - // curl 'http://127.0.0.1:8545/graphql' --data-binary '{"query":"query blockNumber {\n block {\n number\n }\n}\n","variables":null,"operationName":"blockNumber"}' - postData, err := json.Marshal(qlQuery{Query: tc.gqlTest.Request}) - if err != nil { - t.Fatal("can't marshal query:", err) - } - url := fmt.Sprintf("http://%v:8545/graphql", c.IP) - resp, err := http.Post(url, "application/json", bytes.NewReader(postData)) - if err != nil { - t.Fatal("HTTP post failed:", err) - } - respBytes, err := io.ReadAll(resp.Body) - if err != nil { - t.Fatal("can't read HTTP response:", err) - } - resp.Body.Close() - - if resp.StatusCode != tc.gqlTest.StatusCode { - t.Errorf("HTTP response code is %d, want %d \n response body: %s", resp.StatusCode, tc.gqlTest.StatusCode, string(respBytes)) - } - if resp.StatusCode != 200 { - // Test expects HTTP error, and the client sent one, test done. - // We don't bother to check the exact error messages, those aren't fully specified. - return - } - - tc.responseMatch(t, resp.Status, respBytes) -} - -func (tc *testCase) responseMatch(t *hivesim.T, respStatus string, respBytes []byte) error { - // Check that the response matches. - var got interface{} - if err := json.Unmarshal(respBytes, &got); err != nil { - t.Fatal("can't decode response:", err) - } - // return if a response matches. If not, error out. - for _, response := range tc.gqlTest.Responses { - if reflect.DeepEqual(response, got) { - return nil - } - } - - prettyQuery, ok := reindentJSON(tc.gqlTest.Request) - prettyResponse, _ := json.MarshalIndent(got, "", " ") - - t.Log("Test failed.") - t.Log("HTTP response code:", respStatus) - if ok { - t.Log("query:", prettyQuery) - } - t.Log("expected value(s):") - - for _, expected := range tc.gqlTest.Responses { - prettyExpected, _ := json.MarshalIndent(expected, "", " ") - t.Log(string(prettyExpected), "\n_____________________\n") - } - - t.Log("got:", string(prettyResponse)) - t.Fail() - - return fmt.Errorf("test failed") -} - -func reindentJSON(text string) (string, bool) { - var obj interface{} - if json.Unmarshal([]byte(text), &obj) != nil { - return "", false - } - indented, _ := json.MarshalIndent(&obj, "", " ") - return string(indented), true -} - -func loadGenesis(path string) core.Genesis { - contents, err := os.ReadFile(path) - if err != nil { - panic(fmt.Errorf("can't to read genesis file: %v", err)) - } - var genesis core.Genesis - if err := json.Unmarshal(contents, &genesis); err != nil { - panic(fmt.Errorf("can't parse genesis JSON: %v", err)) - } - return genesis -} - -func getParameters(genesis core.Genesis) hivesim.Params { - return hivesim.Params{ - "HIVE_CHAIN_ID": genesis.Config.ChainID.String(), - "HIVE_GRAPHQL_ENABLED": "1", - "HIVE_ALLOW_UNPROTECTED_TX": "1", - "HIVE_FORK_FRONTIER": "0", - "HIVE_FORK_HOMESTEAD": genesis.Config.HomesteadBlock.String(), - "HIVE_FORK_TANGERINE": genesis.Config.EIP150Block.String(), - "HIVE_FORK_SPURIOUS": genesis.Config.EIP155Block.String(), - "HIVE_FORK_BYZANTIUM": genesis.Config.ByzantiumBlock.String(), - "HIVE_FORK_CONSTANTINOPLE": genesis.Config.ConstantinopleBlock.String(), - "HIVE_FORK_PETERSBURG": genesis.Config.PetersburgBlock.String(), - "HIVE_FORK_ISTANBUL": genesis.Config.IstanbulBlock.String(), - "HIVE_FORK_MUIR_GLACIER": genesis.Config.MuirGlacierBlock.String(), - "HIVE_FORK_BERLIN": genesis.Config.BerlinBlock.String(), - "HIVE_FORK_LONDON": genesis.Config.LondonBlock.String(), - "HIVE_TERMINAL_TOTAL_DIFFICULTY": genesis.Config.TerminalTotalDifficulty.String(), - "HIVE_SHANGHAI_TIMESTAMP": fmt.Sprintf("%d", *genesis.Config.ShanghaiTime), - } -} diff --git a/simulators/ethereum/graphql/graphql_test.go b/simulators/ethereum/graphql/graphql_test.go deleted file mode 100644 index 32bef3a3ba..0000000000 --- a/simulators/ethereum/graphql/graphql_test.go +++ /dev/null @@ -1,94 +0,0 @@ -package main - -import ( - "encoding/json" - "os" - "strconv" - "testing" - - "github.com/ethereum/hive/hivesim" -) - -type testResponse struct { - Data gasPrice `json:"data"` -} - -type gasPrice struct { - GasPrice string `json:"gasPrice"` -} - -// Test_responseMatch tests whether the graphql tests are able -// to successfully compare a response to an array of valid expected -// responses. -func Test_responseMatch(t *testing.T) { - // create hivesim tester - hivesimT := &hivesim.T{} - // unmarshal JSON test file - fp := "./testcases/07_eth_gasPrice.json" - data, err := os.ReadFile(fp) - if err != nil { - t.Fatalf("Warning: can't read test file %s: %v", fp, err) - } - var gqlTest graphQLTest - if err = json.Unmarshal(data, &gqlTest); err != nil { - t.Fatalf("Warning: can't unmarshal test file %s: %v", fp, err) - } - // build test case - tc := testCase{ - name: "test1", - gqlTest: &gqlTest, - } - // create valid tests - var tests = []struct { - resp testResponse - status string - expectedFailure bool // true == failure expected - }{ - { - resp: testResponse{ - Data: gasPrice{GasPrice: "0x1"}, - }, - status: "200", - }, - { - resp: testResponse{ - Data: gasPrice{GasPrice: "0x10"}, - }, - status: "200", - }, - { - resp: testResponse{ - Data: gasPrice{GasPrice: "0x12"}, - }, - status: "400", - expectedFailure: true, - }, - { - resp: testResponse{ - Data: gasPrice{GasPrice: "0x11"}, - }, - status: "400", - expectedFailure: true, - }, - { - resp: testResponse{ - Data: gasPrice{GasPrice: "failfailfail"}, - }, - status: "200", - expectedFailure: true, - }, - } - - for i, tt := range tests { - t.Run(strconv.Itoa(i), func(t *testing.T) { - resp, err := json.Marshal(tt.resp) - if err != nil { - t.Fatal("could not marshal data: ", err) - } - err = tc.responseMatch(hivesimT, "200", resp) - if err != nil && !tt.expectedFailure { - t.Fatal(err) - } - }) - } -} diff --git a/simulators/ethereum/graphql/init/testBlockchain.blocks b/simulators/ethereum/graphql/init/testBlockchain.blocks deleted file mode 100755 index 8504fd7a8c..0000000000 Binary files a/simulators/ethereum/graphql/init/testBlockchain.blocks and /dev/null differ diff --git a/simulators/ethereum/graphql/init/testGenesis.json b/simulators/ethereum/graphql/init/testGenesis.json deleted file mode 100644 index af76522190..0000000000 --- a/simulators/ethereum/graphql/init/testGenesis.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "config" : { - "chainId": 1, - "frontierBlock": 0, - "homesteadBlock": 33, - "eip150Block": 33, - "eip155Block" : 33, - "eip158Block" : 33, - "byzantiumBlock" : 33, - "constantinopleBlock" : 33, - "petersburgBlock" : 33, - "istanbulBlock" : 33, - "muirGlacierBlock": 33, - "berlinBlock" : 33, - "londonBlock" : 33, - "terminalTotalDifficulty": 4357120, - "shanghaiTime": 1444660030, - "cancunTime": 1444660040, - "terminalTotalDifficultyPassed": true - }, - "coinbase" : "0x8888f1f195afa192cfee860698584c030f4c9db1", - "difficulty" : "0x020000", - "extraData" : "0x42", - "gasLimit" : "0x2fefd8", - "mixHash" : "0x2c85bcbce56429100b2108254bb56906257582aeafcbd682bc9af67a9f5aee46", - "nonce" : "0x78cc16f7b4f65485", - "parentHash" : "0x0000000000000000000000000000000000000000000000000000000000000000", - "timestamp" : "0x54c98c81", - "alloc" : { - "a94f5374fce5edbc8e2a8697c15331677e6ebf0b": { - "balance" : "0x09184e72a000" - } - } -} diff --git a/simulators/ethereum/graphql/testcases/01_eth_blockNumber.json b/simulators/ethereum/graphql/testcases/01_eth_blockNumber.json deleted file mode 100644 index 8ff5d2aa9e..0000000000 --- a/simulators/ethereum/graphql/testcases/01_eth_blockNumber.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "request": - "{ block { number } }", - - "responses": [{ - "data" : { - "block" : { - "number" : "0x21" - } - } - }], - "statusCode": 200 -} diff --git a/simulators/ethereum/graphql/testcases/02_eth_call_Block8.json b/simulators/ethereum/graphql/testcases/02_eth_call_Block8.json deleted file mode 100644 index fdcac0dee6..0000000000 --- a/simulators/ethereum/graphql/testcases/02_eth_call_Block8.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "request": "{block(number :8) {number call (data : {from : \"0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b\", to: \"0x6295ee1b4f6dd65047762f924ecd367c17eabf8f\", data :\"0x12a7b914\"}){data status}}}" - , - "responses":[{ - "data" : { - "block" : { - "number" : "0x8", - "call" : { - "data" : "0x0000000000000000000000000000000000000000000000000000000000000000", - "status" : "0x1" - } - } - } - }], - "statusCode": 200 -} diff --git a/simulators/ethereum/graphql/testcases/03_eth_call_BlockLatest.json b/simulators/ethereum/graphql/testcases/03_eth_call_BlockLatest.json deleted file mode 100644 index b3a19b2699..0000000000 --- a/simulators/ethereum/graphql/testcases/03_eth_call_BlockLatest.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "request": "{block {number call (data : {from : \"0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b\", to: \"0x6295ee1b4f6dd65047762f924ecd367c17eabf8f\", data :\"0x12a7b914\"}){data status}}}" - , - "responses":[{ - "data" : { - "block" : { - "number" : "0x21", - "call" : { - "data" : "0x0000000000000000000000000000000000000000000000000000000000000001", - "status" : "0x1" - } - } - } - }], - "statusCode": 200 -} diff --git a/simulators/ethereum/graphql/testcases/04_eth_estimateGas_contractDeploy.json b/simulators/ethereum/graphql/testcases/04_eth_estimateGas_contractDeploy.json deleted file mode 100644 index e478559af5..0000000000 --- a/simulators/ethereum/graphql/testcases/04_eth_estimateGas_contractDeploy.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "request" :"{block(number: 32) {estimateGas (data: {from :\"0x6295ee1b4f6dd65047762f924ecd367c17eabf8f\", data :\"0x608060405234801561001057600080fd5b50610157806100206000396000f30060806040526004361061004c576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680633bdab8bf146100515780639ae97baa14610068575b600080fd5b34801561005d57600080fd5b5061006661007f565b005b34801561007457600080fd5b5061007d6100b9565b005b7fa53887c1eed04528e23301f55ad49a91634ef5021aa83a97d07fd16ed71c039a60016040518082815260200191505060405180910390a1565b7fa53887c1eed04528e23301f55ad49a91634ef5021aa83a97d07fd16ed71c039a60026040518082815260200191505060405180910390a17fa53887c1eed04528e23301f55ad49a91634ef5021aa83a97d07fd16ed71c039a60036040518082815260200191505060405180910390a15600a165627a7a7230582010ddaa52e73a98c06dbcd22b234b97206c1d7ed64a7c048e10c2043a3d2309cb0029\"})}}", - "responses":[{ - "data" : { - "block" : { - "estimateGas" : "0x1b551" - } - } - }], - "statusCode": 200 -} diff --git a/simulators/ethereum/graphql/testcases/05_eth_estimateGas_noParams.json b/simulators/ethereum/graphql/testcases/05_eth_estimateGas_noParams.json deleted file mode 100644 index 9eb5656b58..0000000000 --- a/simulators/ethereum/graphql/testcases/05_eth_estimateGas_noParams.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "request" :"{block(number: 32) { estimateGas(data:{}) }}", - "responses":[{ - "data" : { - "block" : { - "estimateGas" : "0x5208" - } - } - }], - "statusCode": 200 -} diff --git a/simulators/ethereum/graphql/testcases/06_eth_estimateGas_transfer.json b/simulators/ethereum/graphql/testcases/06_eth_estimateGas_transfer.json deleted file mode 100644 index c35dbadf46..0000000000 --- a/simulators/ethereum/graphql/testcases/06_eth_estimateGas_transfer.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "request" :"{block{estimateGas (data: {from :\"0x6295ee1b4f6dd65047762f924ecd367c17eabf8f\", to :\"0x8888f1f195afa192cfee860698584c030f4c9db1\"})}}", - "responses":[{ - "data" : { - "block" : { - "estimateGas" : "0x5208" - } - } - }], - "statusCode": 200 -} diff --git a/simulators/ethereum/graphql/testcases/07_eth_gasPrice.json b/simulators/ethereum/graphql/testcases/07_eth_gasPrice.json deleted file mode 100644 index e54d5b2800..0000000000 --- a/simulators/ethereum/graphql/testcases/07_eth_gasPrice.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "request": - "{ gasPrice }", - "responses": [ - { - "data" : { - "gasPrice" : "0x10" - } - }, - { - "data" : { - "gasPrice" : "0x1" - } - } - ], - "statusCode": 200 -} \ No newline at end of file diff --git a/simulators/ethereum/graphql/testcases/08_eth_getBalance_0x19.json b/simulators/ethereum/graphql/testcases/08_eth_getBalance_0x19.json deleted file mode 100644 index 6e17cfb97b..0000000000 --- a/simulators/ethereum/graphql/testcases/08_eth_getBalance_0x19.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "request": "{block (number : 25) {account(address: \"0x6295ee1b4f6dd65047762f924ecd367c17eabf8f\") { balance } }}", - "responses": [{ - "data": { - "block": { - "account": { - "balance": "0xfa" - } - } - } - }], - "statusCode": 200 -} - diff --git a/simulators/ethereum/graphql/testcases/09_eth_getBalance_invalidAccountBlockNumber.json b/simulators/ethereum/graphql/testcases/09_eth_getBalance_invalidAccountBlockNumber.json deleted file mode 100644 index e22db98583..0000000000 --- a/simulators/ethereum/graphql/testcases/09_eth_getBalance_invalidAccountBlockNumber.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "request": "{block (number: 25) {account(address: \"0xdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef\") { balance } }}", - "responses": [{ - "data": { - "block": { - "account": { - "balance": "0x0" - } - } - } - }], - "statusCode": 200 -} diff --git a/simulators/ethereum/graphql/testcases/10_eth_getBalance_invalidAccountLatest.json b/simulators/ethereum/graphql/testcases/10_eth_getBalance_invalidAccountLatest.json deleted file mode 100644 index 885795588e..0000000000 --- a/simulators/ethereum/graphql/testcases/10_eth_getBalance_invalidAccountLatest.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "request": "{block{account(address: \"0xdeaff00ddeaff00ddeaff00ddeaff00ddeaff00d\") { balance } }}", - "responses": [{ - "data": { - "block": { - "account": { - "balance": "0x0" - } - } - } - }], - "statusCode": 200 -} diff --git a/simulators/ethereum/graphql/testcases/11_eth_getBalance_latest.json b/simulators/ethereum/graphql/testcases/11_eth_getBalance_latest.json deleted file mode 100644 index 6dfdb27d9a..0000000000 --- a/simulators/ethereum/graphql/testcases/11_eth_getBalance_latest.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "request": "{block{account(address: \"0x6295ee1b4f6dd65047762f924ecd367c17eabf8f\") { balance } }}", - "responses":[{ - "data": { - "block": { - "account": { - "balance": "0x140" - } - } - } - }], - "statusCode": 200 -} - diff --git a/simulators/ethereum/graphql/testcases/12_eth_getBalance_toobig_bn.json b/simulators/ethereum/graphql/testcases/12_eth_getBalance_toobig_bn.json deleted file mode 100644 index 39d4c98b00..0000000000 --- a/simulators/ethereum/graphql/testcases/12_eth_getBalance_toobig_bn.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "request": "{block (number: 33) {account(address: \"0x6295ee1b4f6dd65047762f924ecd367c17eabf8f\") { balance } }}", - "responses": [{ - "errors": [ - { - "message": "Exception while fetching data (/account) : Invalid params", - "locations": [ - { - "line": 1, - "column": 2 - } - ], - "path": [ - "account" - ], - "extensions": { - "errorCode": -32602, - "errorMessage": "Invalid params", - "classification": "DataFetchingException" - } - } - ], - "data": null - }, - { - "data": { - "block": null - } - }], - "statusCode": 400 -} - diff --git a/simulators/ethereum/graphql/testcases/13_eth_getBalance_without_addr.json b/simulators/ethereum/graphql/testcases/13_eth_getBalance_without_addr.json deleted file mode 100644 index 54bb700d1c..0000000000 --- a/simulators/ethereum/graphql/testcases/13_eth_getBalance_without_addr.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "request": "{block{account { balance } }}", - "responses": [{ - "errors": [ - { - "message": "Validation error of type MissingFieldArgument: Missing field argument address @ 'account'", - "locations": [ - { - "line": 1, - "column": 2 - } - ], - "extensions": { - "classification": "ValidationError" - } - } - ] - }], - "statusCode": 400 -} - diff --git a/simulators/ethereum/graphql/testcases/14_eth_getBlock_byHash.json b/simulators/ethereum/graphql/testcases/14_eth_getBlock_byHash.json deleted file mode 100644 index decf15c17a..0000000000 --- a/simulators/ethereum/graphql/testcases/14_eth_getBlock_byHash.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "request": - - "{block (hash : \"0xc8df1f061abb4d0c107b2b1a794ade8780b3120e681f723fe55a7be586d95ba6\") {number transactions{hash} timestamp difficulty totalDifficulty gasUsed gasLimit hash nonce ommerCount logsBloom mixHash ommerHash extraData stateRoot receiptsRoot transactionCount transactionsRoot}} ", - - - "responses": [{ - "data" : { - "block" : { - "number" : "0x1e", - "transactions" : [ { - "hash" : "0x9cc6c7e602c56aa30c554bb691377f8703d778cec8845f4b88c0f72516b304f4" - } ], - "timestamp" : "0x561bc336", - "difficulty" : "0x20740", - "totalDifficulty" : "0x3e6cc0", - "gasUsed" : "0x5c21", - "gasLimit" : "0x2fefd8", - "hash" : "0xc8df1f061abb4d0c107b2b1a794ade8780b3120e681f723fe55a7be586d95ba6", - "nonce" : "0x5c321bd9e9f040f1", - "ommerCount" : "0x0", - "logsBloom" : "0x00000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000080000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000400000000000000000200000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000800000000040000000000000000000000000000000000000000010000000000000000000000000", - "mixHash" : "0x6ce1c4afb4f85fefd1b0ed966b20cd248f08d9a5b0df773f75c6c2f5cc237b7c", - "ommerHash" : "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", - "extraData" : "0x", - "stateRoot" : "0xdb46d6bb168130fe2cb60b4b24346137b5741f11283e0d7edace65c5f5466b2e", - "receiptsRoot" : "0x88b3b304b058b39791c26fdb94a05cc16ce67cf8f84f7348cb3c60c0ff342d0d", - "transactionCount" : "0x1", - "transactionsRoot" : "0x5a8d5d966b48e1331ae19eb459eb28882cdc7654e615d37774b79204e875dc01" - } - } - }], - "statusCode": 200 -} diff --git a/simulators/ethereum/graphql/testcases/15_eth_getBlock_byHashInvalid.json b/simulators/ethereum/graphql/testcases/15_eth_getBlock_byHashInvalid.json deleted file mode 100644 index a53a108341..0000000000 --- a/simulators/ethereum/graphql/testcases/15_eth_getBlock_byHashInvalid.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "request": "{block (hash : \"0x123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0\") {number } }", - "responses": [{ - "errors": [ - { - "message": "Exception while fetching data (/block) : Block hash 0x123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0 was not found", - "locations": [ - { - "line": 1, - "column": 2 - } - ], - "path": [ - "block" - ], - "extensions": { - "classification": "DataFetchingException" - } - } - ], - "data": null - }], - "statusCode": 400 -} \ No newline at end of file diff --git a/simulators/ethereum/graphql/testcases/16_eth_getBlock_byNumber.json b/simulators/ethereum/graphql/testcases/16_eth_getBlock_byNumber.json deleted file mode 100644 index 34244dbc5c..0000000000 --- a/simulators/ethereum/graphql/testcases/16_eth_getBlock_byNumber.json +++ /dev/null @@ -1,44 +0,0 @@ -{ - "request": - - "{block (number : 30) {transactions{hash} timestamp difficulty totalDifficulty gasUsed gasLimit hash nonce ommerCount logsBloom mixHash ommerHash extraData stateRoot receiptsRoot transactionCount transactionsRoot ommers{hash} ommerAt(index : 1){hash} miner{address} account(address: \"0x6295ee1b4f6dd65047762f924ecd367c17eabf8f\"){balance} parent{hash} }} ", - - - "responses":[{ - "data" : { - "block" : { - "transactions" : [ { - "hash" : "0x9cc6c7e602c56aa30c554bb691377f8703d778cec8845f4b88c0f72516b304f4" - } ], - "timestamp" : "0x561bc336", - "difficulty" : "0x20740", - "totalDifficulty" : "0x3e6cc0", - "gasUsed" : "0x5c21", - "gasLimit" : "0x2fefd8", - "hash" : "0xc8df1f061abb4d0c107b2b1a794ade8780b3120e681f723fe55a7be586d95ba6", - "nonce" : "0x5c321bd9e9f040f1", - "ommerCount" : "0x0", - "logsBloom" : "0x00000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000080000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000400000000000000000200000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000800000000040000000000000000000000000000000000000000010000000000000000000000000", - "mixHash" : "0x6ce1c4afb4f85fefd1b0ed966b20cd248f08d9a5b0df773f75c6c2f5cc237b7c", - "ommerHash" : "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", - "extraData" : "0x", - "stateRoot" : "0xdb46d6bb168130fe2cb60b4b24346137b5741f11283e0d7edace65c5f5466b2e", - "receiptsRoot" : "0x88b3b304b058b39791c26fdb94a05cc16ce67cf8f84f7348cb3c60c0ff342d0d", - "transactionCount" : "0x1", - "transactionsRoot" : "0x5a8d5d966b48e1331ae19eb459eb28882cdc7654e615d37774b79204e875dc01", - "ommers" : [ ], - "ommerAt" : null, - "miner" : { - "address" : "0x8888f1f195afa192cfee860698584c030f4c9db1" - }, - "account" : { - "balance" : "0x12c" - }, - "parent" : { - "hash" : "0xf8cfa377bd766cdf22edb388dd08cc149e85d24f2796678c835f3c54ab930803" - } - } - } - }], - "statusCode": 200 -} diff --git a/simulators/ethereum/graphql/testcases/17_eth_getBlock_byNumberInvalid.json b/simulators/ethereum/graphql/testcases/17_eth_getBlock_byNumberInvalid.json deleted file mode 100644 index 90eefbaf91..0000000000 --- a/simulators/ethereum/graphql/testcases/17_eth_getBlock_byNumberInvalid.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "request": "{block (number: 88888888) {number }} ", - "responses": [ - { - "errors": [ - { - "message": "Exception while fetching data (/block) : Block number 88888888 was not found", - "locations": [ - { - "line": 1, - "column": 2 - } - ], - "path": [ - "block" - ], - "extensions": { - "classification": "DataFetchingException" - } - } - ], - "data": null - }, - { - "data": { - "block": null - } - } - ], - "statusCode": 400 -} \ No newline at end of file diff --git a/simulators/ethereum/graphql/testcases/18_eth_getBlock_wrongParams.json b/simulators/ethereum/graphql/testcases/18_eth_getBlock_wrongParams.json deleted file mode 100644 index f2e7f663af..0000000000 --- a/simulators/ethereum/graphql/testcases/18_eth_getBlock_wrongParams.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "request": "{block (number: \"0x03\", hash : \"0xc8df1f061abb4d0c107b2b1a794ade8780b3120e681f723fe55a7be586d95ba6\") {number transactions{hash} timestamp difficulty totalDifficulty gasUsed gasLimit hash nonce ommerCount logsBloom mixHash ommerHash extraData stateRoot receiptsRoot transactionCount transactionsRoot}} ", - "responses": [{ - "errors": [ - { - "message": "Exception while fetching data (/block) : Invalid params", - "locations": [ - { - "line": 1, - "column": 2 - } - ], - "path": [ - "block" - ], - "extensions": { - "errorCode": -32602, - "errorMessage": "Invalid params", - "classification": "DataFetchingException" - } - } - ], - "data": null - }], - "statusCode": 400 -} \ No newline at end of file diff --git a/simulators/ethereum/graphql/testcases/19_eth_getBlockTransactionCount_byHash.json b/simulators/ethereum/graphql/testcases/19_eth_getBlockTransactionCount_byHash.json deleted file mode 100644 index 3a31866f19..0000000000 --- a/simulators/ethereum/graphql/testcases/19_eth_getBlockTransactionCount_byHash.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "request": - - "{block (hash : \"0xc8df1f061abb4d0c107b2b1a794ade8780b3120e681f723fe55a7be586d95ba6\") {transactionCount}} ", - - - "responses": [{ - "data" : { - "block" : { - "transactionCount" : "0x1" - } - } - }], - "statusCode": 200 -} \ No newline at end of file diff --git a/simulators/ethereum/graphql/testcases/20_eth_getBlockTransactionCount_byNumber.json b/simulators/ethereum/graphql/testcases/20_eth_getBlockTransactionCount_byNumber.json deleted file mode 100644 index 4573355dae..0000000000 --- a/simulators/ethereum/graphql/testcases/20_eth_getBlockTransactionCount_byNumber.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "request": - - "{block (number : 30) {transactions{hash} timestamp difficulty totalDifficulty gasUsed gasLimit hash nonce ommerCount logsBloom mixHash ommerHash extraData stateRoot receiptsRoot transactionCount transactionsRoot}} ", - - - "responses": [{ - "data" : { - "block" : { - "transactions" : [ { - "hash" : "0x9cc6c7e602c56aa30c554bb691377f8703d778cec8845f4b88c0f72516b304f4" - } ], - "timestamp" : "0x561bc336", - "difficulty" : "0x20740", - "totalDifficulty" : "0x3e6cc0", - "gasUsed" : "0x5c21", - "gasLimit" : "0x2fefd8", - "hash" : "0xc8df1f061abb4d0c107b2b1a794ade8780b3120e681f723fe55a7be586d95ba6", - "nonce" : "0x5c321bd9e9f040f1", - "ommerCount" : "0x0", - "logsBloom" : "0x00000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000080000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000400000000000000000200000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000800000000040000000000000000000000000000000000000000010000000000000000000000000", - "mixHash" : "0x6ce1c4afb4f85fefd1b0ed966b20cd248f08d9a5b0df773f75c6c2f5cc237b7c", - "ommerHash" : "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", - "extraData" : "0x", - "stateRoot" : "0xdb46d6bb168130fe2cb60b4b24346137b5741f11283e0d7edace65c5f5466b2e", - "receiptsRoot" : "0x88b3b304b058b39791c26fdb94a05cc16ce67cf8f84f7348cb3c60c0ff342d0d", - "transactionCount" : "0x1", - "transactionsRoot" : "0x5a8d5d966b48e1331ae19eb459eb28882cdc7654e615d37774b79204e875dc01" - } - } - }], - "statusCode": 200 -} diff --git a/simulators/ethereum/graphql/testcases/21_eth_getCode_noCode.json b/simulators/ethereum/graphql/testcases/21_eth_getCode_noCode.json deleted file mode 100644 index f70d77d1d1..0000000000 --- a/simulators/ethereum/graphql/testcases/21_eth_getCode_noCode.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "request" : "{block{ account(address: \"0x8888f1f195afa192cfee860698584c030f4c9db1\") { code } }}", - - "responses": [{ - "data": { - "block": { - "account": { - "code": "0x" - } - } - } - }], - "statusCode": 200 -} \ No newline at end of file diff --git a/simulators/ethereum/graphql/testcases/22_eth_getCode.json b/simulators/ethereum/graphql/testcases/22_eth_getCode.json deleted file mode 100644 index e8babeb9bf..0000000000 --- a/simulators/ethereum/graphql/testcases/22_eth_getCode.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "request" : "{block{ account(address: \"0x6295ee1b4f6dd65047762f924ecd367c17eabf8f\") { code } }}", - - "responses": [{ - "data": { - "block": { - "account": { - "code": "0x6000357c010000000000000000000000000000000000000000000000000000000090048063102accc11461012c57806312a7b9141461013a5780631774e6461461014c5780631e26fd331461015d5780631f9030371461016e578063343a875d1461018057806338cc4831146101955780634e7ad367146101bd57806357cb2fc4146101cb57806365538c73146101e057806368895979146101ee57806376bc21d9146102005780639a19a9531461020e5780639dc2c8f51461021f578063a53b1c1e1461022d578063a67808571461023e578063b61c05031461024c578063c2b12a731461025a578063d2282dc51461026b578063e30081a01461027c578063e8beef5b1461028d578063f38b06001461029b578063f5b53e17146102a9578063fd408767146102bb57005b6101346104d6565b60006000f35b61014261039b565b8060005260206000f35b610157600435610326565b60006000f35b6101686004356102c9565b60006000f35b610176610442565b8060005260206000f35b6101886103d3565b8060ff1660005260206000f35b61019d610413565b8073ffffffffffffffffffffffffffffffffffffffff1660005260206000f35b6101c56104c5565b60006000f35b6101d36103b7565b8060000b60005260206000f35b6101e8610454565b60006000f35b6101f6610401565b8060005260206000f35b61020861051f565b60006000f35b6102196004356102e5565b60006000f35b610227610693565b60006000f35b610238600435610342565b60006000f35b610246610484565b60006000f35b610254610493565b60006000f35b61026560043561038d565b60006000f35b610276600435610350565b60006000f35b61028760043561035e565b60006000f35b6102956105b4565b60006000f35b6102a3610547565b60006000f35b6102b16103ef565b8060005260206000f35b6102c3610600565b60006000f35b80600060006101000a81548160ff021916908302179055505b50565b80600060016101000a81548160ff02191690837f01000000000000000000000000000000000000000000000000000000000000009081020402179055505b50565b80600060026101000a81548160ff021916908302179055505b50565b806001600050819055505b50565b806002600050819055505b50565b80600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908302179055505b50565b806004600050819055505b50565b6000600060009054906101000a900460ff1690506103b4565b90565b6000600060019054906101000a900460000b90506103d0565b90565b6000600060029054906101000a900460ff1690506103ec565b90565b600060016000505490506103fe565b90565b60006002600050549050610410565b90565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905061043f565b90565b60006004600050549050610451565b90565b7f65c9ac8011e286e89d02a269890f41d67ca2cc597b2c76c7c69321ff492be5806000602a81526020016000a15b565b6000602a81526020016000a05b565b60017f81933b308056e7e85668661dcd102b1f22795b4431f9cf4625794f381c271c6b6000602a81526020016000a25b565b60016000602a81526020016000a15b565b3373ffffffffffffffffffffffffffffffffffffffff1660017f0e216b62efbb97e751a2ce09f607048751720397ecfb9eef1e48a6644948985b6000602a81526020016000a35b565b3373ffffffffffffffffffffffffffffffffffffffff1660016000602a81526020016000a25b565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6001023373ffffffffffffffffffffffffffffffffffffffff1660017f317b31292193c2a4f561cc40a95ea0d97a2733f14af6d6d59522473e1f3ae65f6000602a81526020016000a45b565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6001023373ffffffffffffffffffffffffffffffffffffffff1660016000602a81526020016000a35b565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6001023373ffffffffffffffffffffffffffffffffffffffff1660017fd5f0a30e4be0c6be577a71eceb7464245a796a7e6a55c0d971837b250de05f4e60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe98152602001602a81526020016000a45b565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6001023373ffffffffffffffffffffffffffffffffffffffff16600160007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe98152602001602a81526020016000a35b56" - } - } - } - }], - "statusCode": 200 -} \ No newline at end of file diff --git a/simulators/ethereum/graphql/testcases/23_eth_getLogs_matchTopic.json b/simulators/ethereum/graphql/testcases/23_eth_getLogs_matchTopic.json deleted file mode 100644 index cf7f6e4b15..0000000000 --- a/simulators/ethereum/graphql/testcases/23_eth_getLogs_matchTopic.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "request": "{ block(number: 23) { logs( filter: { topics : [[\"0x000000000000000000000000a94f5374fce5edbc8e2a8697c15331677e6ebf0b\", \"0x65c9ac8011e286e89d02a269890f41d67ca2cc597b2c76c7c69321ff492be580\"]]}) { index topics data account{address} transaction{hash} } } }", - "responses": [{ - "data" : { - "block" : { - "logs" : [ { - "index" : "0x0", - "topics" : [ "0x65c9ac8011e286e89d02a269890f41d67ca2cc597b2c76c7c69321ff492be580" ], - "data" : "0x000000000000000000000000000000000000000000000000000000000000002a", - "account" : { - "address" : "0x6295ee1b4f6dd65047762f924ecd367c17eabf8f" - }, - "transaction" : { - "hash" : "0x97a385bf570ced7821c6495b3877ddd2afd5c452f350f0d4876e98d9161389c6" - } - } ] - } - } - }], - - "statusCode": 200 -} \ No newline at end of file diff --git a/simulators/ethereum/graphql/testcases/24_eth_getLogs_range.json b/simulators/ethereum/graphql/testcases/24_eth_getLogs_range.json deleted file mode 100644 index 6b04466744..0000000000 --- a/simulators/ethereum/graphql/testcases/24_eth_getLogs_range.json +++ /dev/null @@ -1,40 +0,0 @@ -{ - "request": "{ logs( filter: { fromBlock:20, toBlock: 24, topics : [], addresses : []}) { index topics data account{address} transaction{hash block {number}} } }", - "responses": [{ - "data": { - "logs": [ - { - "index": "0x0", - "topics": [ - "0x65c9ac8011e286e89d02a269890f41d67ca2cc597b2c76c7c69321ff492be580" - ], - "data": "0x000000000000000000000000000000000000000000000000000000000000002a", - "account": { - "address": "0x6295ee1b4f6dd65047762f924ecd367c17eabf8f" - }, - "transaction": { - "hash": "0x97a385bf570ced7821c6495b3877ddd2afd5c452f350f0d4876e98d9161389c6", - "block": { - "number": "0x17" - } - } - }, - { - "index": "0x0", - "topics": [], - "data": "0x000000000000000000000000000000000000000000000000000000000000002a", - "account": { - "address": "0x6295ee1b4f6dd65047762f924ecd367c17eabf8f" - }, - "transaction": { - "hash": "0x5ecd942096ab3f70c5bcc8f3a98f88c4ff0a3bd986417df9948eb1819db76d0e", - "block": { - "number": "0x18" - } - } - } - ] - } - }], - "statusCode": 200 -} diff --git a/simulators/ethereum/graphql/testcases/25_eth_getStorageAt_illegalRangeGreaterThan.json b/simulators/ethereum/graphql/testcases/25_eth_getStorageAt_illegalRangeGreaterThan.json deleted file mode 100644 index 4995192765..0000000000 --- a/simulators/ethereum/graphql/testcases/25_eth_getStorageAt_illegalRangeGreaterThan.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "request": "{block{ account(address: \"0x6295ee1b4f6dd65047762f924ecd367c17eabf8f\") { storage(slot: \"0x0000000000000000000000000000000000000000000000000000000000000021\") } }}", - "responses": [ - { - "data": { - "block": { - "account": { - "storage": "0x0000000000000000000000000000000000000000000000000000000000000000" - } - } - } - } - ], - "statusCode": 200 -} \ No newline at end of file diff --git a/simulators/ethereum/graphql/testcases/26_eth_getStorageAt.json b/simulators/ethereum/graphql/testcases/26_eth_getStorageAt.json deleted file mode 100644 index 57ae719114..0000000000 --- a/simulators/ethereum/graphql/testcases/26_eth_getStorageAt.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "request": "{block{ account(address: \"0x6295ee1b4f6dd65047762f924ecd367c17eabf8f\") { storage(slot: \"0x0000000000000000000000000000000000000000000000000000000000000004\") } }}", - "responses": [ - { - "data": { - "block": { - "account": { - "storage": "0xaabbccffffffffffffffffffffffffffffffffffffffffffffffffffffffffee" - } - } - } - } - ], - "statusCode": 200 -} \ No newline at end of file diff --git a/simulators/ethereum/graphql/testcases/27_eth_getTransaction_byBlockHashAndIndex.json b/simulators/ethereum/graphql/testcases/27_eth_getTransaction_byBlockHashAndIndex.json deleted file mode 100644 index a445305c3c..0000000000 --- a/simulators/ethereum/graphql/testcases/27_eth_getTransaction_byBlockHashAndIndex.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "request": - - "{ block(hash: \"0xc8df1f061abb4d0c107b2b1a794ade8780b3120e681f723fe55a7be586d95ba6\") { transactionAt(index: 0) {block{hash} hash } } }", - - "responses":[{ - "data" : { - "block" : { - "transactionAt" : { - "block" : { - "hash" : "0xc8df1f061abb4d0c107b2b1a794ade8780b3120e681f723fe55a7be586d95ba6" - }, - "hash" : "0x9cc6c7e602c56aa30c554bb691377f8703d778cec8845f4b88c0f72516b304f4" - } - } - } - }], - - "statusCode": 200 -} \ No newline at end of file diff --git a/simulators/ethereum/graphql/testcases/28_eth_getTransaction_byBlockNumberAndIndex.json b/simulators/ethereum/graphql/testcases/28_eth_getTransaction_byBlockNumberAndIndex.json deleted file mode 100644 index 00a41f132d..0000000000 --- a/simulators/ethereum/graphql/testcases/28_eth_getTransaction_byBlockNumberAndIndex.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "request": - - "{ block(number: 30) { transactionAt(index: 0) {block{hash} hash} } }", - - "responses":[{ - "data" : { - "block" : { - "transactionAt" : { - "block" : { - "hash" : "0xc8df1f061abb4d0c107b2b1a794ade8780b3120e681f723fe55a7be586d95ba6" - }, - "hash" : "0x9cc6c7e602c56aa30c554bb691377f8703d778cec8845f4b88c0f72516b304f4" - } - } - } - }], - - "statusCode": 200 -} \ No newline at end of file diff --git a/simulators/ethereum/graphql/testcases/29_eth_getTransaction_byBlockNumberAndInvalidIndex.json b/simulators/ethereum/graphql/testcases/29_eth_getTransaction_byBlockNumberAndInvalidIndex.json deleted file mode 100644 index f7dd2b9529..0000000000 --- a/simulators/ethereum/graphql/testcases/29_eth_getTransaction_byBlockNumberAndInvalidIndex.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "request": - - "{ block(number: 30) { transactionAt(index: 1) {block{hash} hash} } }", - - "responses":[{ - "data" : { - "block" : { - "transactionAt" : null - } - } - }], - "statusCode": 200 -} \ No newline at end of file diff --git a/simulators/ethereum/graphql/testcases/30_eth_getTransaction_byHash.json b/simulators/ethereum/graphql/testcases/30_eth_getTransaction_byHash.json deleted file mode 100644 index b5607f0fbd..0000000000 --- a/simulators/ethereum/graphql/testcases/30_eth_getTransaction_byHash.json +++ /dev/null @@ -1,64 +0,0 @@ -{ - "request": "{transaction (hash : \"0x9cc6c7e602c56aa30c554bb691377f8703d778cec8845f4b88c0f72516b304f4\") { block{hash} gas gasPrice hash inputData nonce index value from {address} to {address} logs{index} status createdContract{address} } } ", - "responses": [ - { - "data": { - "transaction": { - "block": { - "hash": "0xc8df1f061abb4d0c107b2b1a794ade8780b3120e681f723fe55a7be586d95ba6" - }, - "gas": "0x4cb2f", - "gasPrice": "0x1", - "hash": "0x9cc6c7e602c56aa30c554bb691377f8703d778cec8845f4b88c0f72516b304f4", - "inputData": "0xe8beef5b", - "nonce": "0x1d", - "index": "0x0", - "value": "0xa", - "from": { - "address": "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b" - }, - "to": { - "address": "0x6295ee1b4f6dd65047762f924ecd367c17eabf8f" - }, - "logs": [ - { - "index": "0x0" - } - ], - "status": null, - "createdContract": null - } - } - }, - { - "data": { - "transaction": { - "block": { - "hash": "0xc8df1f061abb4d0c107b2b1a794ade8780b3120e681f723fe55a7be586d95ba6" - }, - "createdContract": null, - "from": { - "address": "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b" - }, - "gas": "0x4cb2f", - "gasPrice": "0x1", - "hash": "0x9cc6c7e602c56aa30c554bb691377f8703d778cec8845f4b88c0f72516b304f4", - "index": 0, - "inputData": "0xe8beef5b", - "logs": [ - { - "index": 0 - } - ], - "nonce": "0x1d", - "status": "0x0", - "to": { - "address": "0x6295ee1b4f6dd65047762f924ecd367c17eabf8f" - }, - "value": "0xa" - } - } - } - ], - "statusCode": 200 -} diff --git a/simulators/ethereum/graphql/testcases/31_eth_getTransaction_byHashNull.json b/simulators/ethereum/graphql/testcases/31_eth_getTransaction_byHashNull.json deleted file mode 100644 index cf238cb74e..0000000000 --- a/simulators/ethereum/graphql/testcases/31_eth_getTransaction_byHashNull.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "request": - - "{transaction (hash : \"0xffc6c7e602c56aa30c554bb691377f8703d778cec8845f4b88c0f72516b304f4\") { block{hash} gas gasPrice hash inputData nonce index value }} ", - - - "responses": [{ - "data" : { - "transaction" : null - } - }], - "statusCode": 200 -} \ No newline at end of file diff --git a/simulators/ethereum/graphql/testcases/32_eth_getTransactionCount.json b/simulators/ethereum/graphql/testcases/32_eth_getTransactionCount.json deleted file mode 100644 index 7234ea96b1..0000000000 --- a/simulators/ethereum/graphql/testcases/32_eth_getTransactionCount.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "request": "{block{ account(address: \"0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b\") { transactionCount } }}", - "responses": [{ - "data": { - "block": { - "account": { - "transactionCount": "0x21" - } - } - } - }], - "statusCode": 200 -} diff --git a/simulators/ethereum/graphql/testcases/33_eth_getTransactionReceipt.json b/simulators/ethereum/graphql/testcases/33_eth_getTransactionReceipt.json deleted file mode 100644 index e481c1d7ee..0000000000 --- a/simulators/ethereum/graphql/testcases/33_eth_getTransactionReceipt.json +++ /dev/null @@ -1,52 +0,0 @@ -{ - "request": "{ transaction(hash: \"0x812742182a79a8e67733edc58cfa3767aa2d7ad06439d156ddbbb33e3403b4ed\") {block{hash logsBloom} hash createdContract{address} cumulativeGasUsed gas gasUsed logs{topics} from{address} to{address} index } }", - "responses": [ - { - "data": { - "transaction": { - "block": { - "hash": "0x10aaf14a53caf27552325374429d3558398a36d3682ede6603c2c6511896e9f9", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - }, - "createdContract": { - "address": "0x6295ee1b4f6dd65047762f924ecd367c17eabf8f" - }, - "cumulativeGasUsed": "0x78674", - "from": { - "address": "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b" - }, - "gas": "0x2fefd8", - "gasUsed": "0x78674", - "hash": "0x812742182a79a8e67733edc58cfa3767aa2d7ad06439d156ddbbb33e3403b4ed", - "index": "0x0", - "logs": [], - "to": null - } - } - }, - { - "data": { - "transaction": { - "block": { - "hash": "0x10aaf14a53caf27552325374429d3558398a36d3682ede6603c2c6511896e9f9", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - }, - "createdContract": { - "address": "0x6295ee1b4f6dd65047762f924ecd367c17eabf8f" - }, - "cumulativeGasUsed": "0x78674", - "from": { - "address": "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b" - }, - "gas": "0x2fefd8", - "gasUsed": "0x78674", - "hash": "0x812742182a79a8e67733edc58cfa3767aa2d7ad06439d156ddbbb33e3403b4ed", - "index": 0, - "logs": [], - "to": null - } - } - } - ], - "statusCode": 200 -} diff --git a/simulators/ethereum/graphql/testcases/34_eth_sendRawTransaction_contractCreation.json b/simulators/ethereum/graphql/testcases/34_eth_sendRawTransaction_contractCreation.json deleted file mode 100644 index 2f710211aa..0000000000 --- a/simulators/ethereum/graphql/testcases/34_eth_sendRawTransaction_contractCreation.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "request" : "mutation { sendRawTransaction(data: \"0xf901ca3285174876e800830fffff8080b90177608060405234801561001057600080fd5b50610157806100206000396000f30060806040526004361061004c576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680633bdab8bf146100515780639ae97baa14610068575b600080fd5b34801561005d57600080fd5b5061006661007f565b005b34801561007457600080fd5b5061007d6100b9565b005b7fa53887c1eed04528e23301f55ad49a91634ef5021aa83a97d07fd16ed71c039a60016040518082815260200191505060405180910390a1565b7fa53887c1eed04528e23301f55ad49a91634ef5021aa83a97d07fd16ed71c039a60026040518082815260200191505060405180910390a17fa53887c1eed04528e23301f55ad49a91634ef5021aa83a97d07fd16ed71c039a60036040518082815260200191505060405180910390a15600a165627a7a7230582010ddaa52e73a98c06dbcd22b234b97206c1d7ed64a7c048e10c2043a3d2309cb00291ca05d71c687073e23402e59853d85c587f6eebc735082f40a450e407451b42ee2a4a07d4f2db1717dc9be745b991962193fa0d5f6059b9c92350dba3efe3a99df6b52\") }", - "responses":[{ - "data" : { - "sendRawTransaction" : "0xf9a25e1d6202e9ea1d984f76939e9bb3609bfb9aea2541ae8a629270343fbb2f" - } - }], - "statusCode": 200 -} \ No newline at end of file diff --git a/simulators/ethereum/graphql/testcases/35_graphql_pending.json b/simulators/ethereum/graphql/testcases/35_graphql_pending.json deleted file mode 100644 index 7aceb90647..0000000000 --- a/simulators/ethereum/graphql/testcases/35_graphql_pending.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "request": - "{ pending { transactionCount transactions { nonce gas } account(address:\"0x6295ee1b4f6dd65047762f924ecd367c17eabf8f\") { balance} estimateGas(data:{}) call (data : {from : \"0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b\", to: \"0x6295ee1b4f6dd65047762f924ecd367c17eabf8f\", data :\"0x12a7b914\"}){data status}} }", - - "responses": [{ - "data": { - "pending": { - "transactionCount": "0x1", - "transactions": [ - { - "nonce": "0x32", - "gas": "0xfffff" - } - ], - "account": { - "balance": "0x140" - }, - "estimateGas": "0x5208", - "call": { - "data": "0x0000000000000000000000000000000000000000000000000000000000000001", - "status": "0x1" - } - } - } - }], - "statusCode": 200 -} diff --git a/simulators/ethereum/graphql/testcases/36_eth_sendRawTransaction_messageCall.json b/simulators/ethereum/graphql/testcases/36_eth_sendRawTransaction_messageCall.json deleted file mode 100644 index e5eace1ff7..0000000000 --- a/simulators/ethereum/graphql/testcases/36_eth_sendRawTransaction_messageCall.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "request" : "mutation { sendRawTransaction(data: \"0xf8693785174876e800830fffff94450b61224a7df4d8a70f3e20d4fd6a6380b920d180843bdab8bf1ba054b00220864ab58246bbe0a6f6d50166f9bd0ba3f1711912f79c073da6368ca5a04f84bc3231ee4406b8ceb8740d6d8d1900f87b67b9f4a0a38bc55062121a94c6\") }", - "responses":[{ - "data" : { - "sendRawTransaction" : "0x6ad12f495251471d1834852623c2eeb2cb04d2fb9e1a5d6cff481cfec7b233a8" - } - }], - - "statusCode": 200 -} \ No newline at end of file diff --git a/simulators/ethereum/graphql/testcases/37_eth_sendRawTransaction_nonceTooLow.json b/simulators/ethereum/graphql/testcases/37_eth_sendRawTransaction_nonceTooLow.json deleted file mode 100644 index 5d677670fc..0000000000 --- a/simulators/ethereum/graphql/testcases/37_eth_sendRawTransaction_nonceTooLow.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "request": "mutation { sendRawTransaction(data: \"0xf86410018304cb2f946295ee1b4f6dd65047762f924ecd367c17eabf8f0a8457cb2fc41ca0060dc80554e845b572ab6b88dab08f7491f83b4405fea2f067a80b3742127fb0a0246160f01d027a0335be590d443335ecb2cf5d9f9589c8efffa4acbda4acafea\") }", - "responses": [{ - "errors": [ - { - "message": "Exception while fetching data (/sendRawTransaction) : Nonce too low", - "locations": [ - { - "line": 1, - "column": 12 - } - ], - "path": [ - "sendRawTransaction" - ], - "extensions": { - "errorCode": -32001, - "errorMessage": "Nonce too low", - "classification": "DataFetchingException" - } - } - ], - "data": null - }], - "statusCode": 400 -} \ No newline at end of file diff --git a/simulators/ethereum/graphql/testcases/38_eth_sendRawTransaction_transferEther.json b/simulators/ethereum/graphql/testcases/38_eth_sendRawTransaction_transferEther.json deleted file mode 100644 index 466d22f7f6..0000000000 --- a/simulators/ethereum/graphql/testcases/38_eth_sendRawTransaction_transferEther.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "request" : "mutation { sendRawTransaction(data: \"0xf86d3785174876e801830222e0945aae326516b4f8fe08074b7e972e40a713048d628829a2241af62c0000801ca077d36666ce36d433b6f1ac62eafe7a232354c83ad2293cfcc2445a86bcd08b4da04b8bd0918d440507ab81d47cf562addaa15a1d28ac701989f5141c8da49615d0\") }", - "responses":[{ - "data" : { - "sendRawTransaction" : "0x772b6d5c64b9798865d6dfa35ba44d181abd96a448f8ab7ea9e9631cabb7b290" - } - }], - "statusCode": 200 -} \ No newline at end of file diff --git a/simulators/ethereum/graphql/testcases/39_eth_sendRawTransaction_unsignedTransaction.json b/simulators/ethereum/graphql/testcases/39_eth_sendRawTransaction_unsignedTransaction.json deleted file mode 100644 index 30b83680aa..0000000000 --- a/simulators/ethereum/graphql/testcases/39_eth_sendRawTransaction_unsignedTransaction.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "request": "mutation { sendRawTransaction(data: \"0xed0a85174876e800830222e0945aae326516b4f8fe08074b7e972e40a713048d62880de0b6b3a7640000801c8080\") }", - "responses": [{ - "errors": [ - { - "message": "Exception while fetching data (/sendRawTransaction) : Invalid params", - "locations": [ - { - "line": 1, - "column": 12 - } - ], - "path": [ - "sendRawTransaction" - ], - "extensions": { - "errorCode": -32602, - "errorMessage": "Invalid params", - "classification": "DataFetchingException" - } - } - ], - "data": null - }], - "statusCode": 400 -} \ No newline at end of file diff --git a/simulators/ethereum/graphql/testcases/40_eth_syncing.json b/simulators/ethereum/graphql/testcases/40_eth_syncing.json deleted file mode 100644 index 3c9a1997c3..0000000000 --- a/simulators/ethereum/graphql/testcases/40_eth_syncing.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "request": - "{ syncing {startingBlock currentBlock highestBlock } }", - - "responses": [{ - "data" : { - "syncing" : null - } - }], - "statusCode": 200 -} diff --git a/simulators/ethereum/graphql/testcases/41_graphql_blocks_byFrom.json b/simulators/ethereum/graphql/testcases/41_graphql_blocks_byFrom.json deleted file mode 100644 index 020f787807..0000000000 --- a/simulators/ethereum/graphql/testcases/41_graphql_blocks_byFrom.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "request": "{ blocks(from:30) { number } }", - "responses": [{ - "data": { - "blocks": [ - { - "number": "0x1e" - }, - { - "number": "0x1f" - }, - { - "number": "0x20" - }, - { - "number": "0x21" - } - ] - } - }], - "statusCode": 200 -} diff --git a/simulators/ethereum/graphql/testcases/42_graphql_blocks_byRange.json b/simulators/ethereum/graphql/testcases/42_graphql_blocks_byRange.json deleted file mode 100644 index 1552e2de42..0000000000 --- a/simulators/ethereum/graphql/testcases/42_graphql_blocks_byRange.json +++ /dev/null @@ -1,40 +0,0 @@ -{ - "request": - - "{blocks (from : 30, to: 32) { number gasUsed gasLimit hash nonce stateRoot receiptsRoot transactionCount }} ", - - - "responses":[{ - "data" : { - "blocks" : [ { - "number" : "0x1e", - "gasUsed" : "0x5c21", - "gasLimit" : "0x2fefd8", - "hash" : "0xc8df1f061abb4d0c107b2b1a794ade8780b3120e681f723fe55a7be586d95ba6", - "nonce" : "0x5c321bd9e9f040f1", - "stateRoot" : "0xdb46d6bb168130fe2cb60b4b24346137b5741f11283e0d7edace65c5f5466b2e", - "receiptsRoot" : "0x88b3b304b058b39791c26fdb94a05cc16ce67cf8f84f7348cb3c60c0ff342d0d", - "transactionCount" : "0x1" - }, { - "number" : "0x1f", - "gasUsed" : "0x5eef", - "gasLimit" : "0x2fefd8", - "hash" : "0x0f765087745aa259d9e5ac39c367c57432a16ed98e3b0d81c5b51d10f301dc49", - "nonce" : "0xd3a27a3001616468", - "stateRoot" : "0xa80997cf804269d64f2479baf535cf8f9090b70fbf515741c6995564f1e678bd", - "receiptsRoot" : "0x2440c44a3f75ad8b0425a73e7be2f61a5171112465cfd14e62e735b56d7178e6", - "transactionCount" : "0x1" - }, { - "number" : "0x20", - "gasUsed" : "0x5c99", - "gasLimit" : "0x2fefd8", - "hash" : "0x71d59849ddd98543bdfbe8548f5eed559b07b8aaf196369f39134500eab68e53", - "nonce" : "0xdb063000b00e8026", - "stateRoot" : "0xf65f3dd13f72f5fa5607a5224691419969b4f4bae7a00a6cdb853f2ca9eeb1be", - "receiptsRoot" : "0xa50a7e67e833f4502524371ee462ccbcc6c6cabd2aeb1555c56150007a53183c", - "transactionCount" : "0x1" - } ] - } - }], - "statusCode": 200 -} diff --git a/simulators/ethereum/graphql/testcases/43_graphql_blocks_byWrongRange.json b/simulators/ethereum/graphql/testcases/43_graphql_blocks_byWrongRange.json deleted file mode 100644 index 32e3f2c6c1..0000000000 --- a/simulators/ethereum/graphql/testcases/43_graphql_blocks_byWrongRange.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "request": "{blocks (from : \"0x1e\", to: \"0x1c\") { number gasUsed gasLimit hash nonce stateRoot receiptsRoot transactionCount }} ", - "responses": [{ - "errors": [ - { - "message": "Exception while fetching data (/blocks) : Invalid params", - "locations": [ - { - "line": 1, - "column": 2 - } - ], - "path": [ - "blocks" - ], - "extensions": { - "errorCode": -32602, - "errorMessage": "Invalid params", - "classification": "DataFetchingException" - } - } - ], - "data": null - }], - "statusCode": 400 -} \ No newline at end of file diff --git a/simulators/ethereum/graphql/testcases/44_getBlock_byHexNumber.json b/simulators/ethereum/graphql/testcases/44_getBlock_byHexNumber.json deleted file mode 100644 index 0d4e0ed79e..0000000000 --- a/simulators/ethereum/graphql/testcases/44_getBlock_byHexNumber.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "request": "{block (number : \"0x1e\") { gasUsed gasLimit hash }} ", - - "responses":[{ - "data" : { - "block" : { - "gasUsed" : "0x5c21", - "gasLimit" : "0x2fefd8", - "hash" : "0xc8df1f061abb4d0c107b2b1a794ade8780b3120e681f723fe55a7be586d95ba6" - } - } - }], - "statusCode": 200 -} diff --git a/simulators/ethereum/graphql/testcases/45_eth_getLogs_range_hex.json b/simulators/ethereum/graphql/testcases/45_eth_getLogs_range_hex.json deleted file mode 100644 index f7891fc7d8..0000000000 --- a/simulators/ethereum/graphql/testcases/45_eth_getLogs_range_hex.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "request": "{ logs( filter: { fromBlock:\"0x14\", toBlock: \"0x18\", topics : [], addresses : []}) { index transaction{hash} } }", - "responses": [{ - "data": { - "logs": [ - { - "index": "0x0", - "transaction": { - "hash": "0x97a385bf570ced7821c6495b3877ddd2afd5c452f350f0d4876e98d9161389c6" - } - }, - { - "index": "0x0", - "transaction": { - "hash": "0x5ecd942096ab3f70c5bcc8f3a98f88c4ff0a3bd986417df9948eb1819db76d0e" - } - } - ] - } - }], - "statusCode": 200 -} diff --git a/simulators/ethereum/graphql/testcases/46_transaction_fromByHexBlockNumber.json b/simulators/ethereum/graphql/testcases/46_transaction_fromByHexBlockNumber.json deleted file mode 100644 index 96ff90d147..0000000000 --- a/simulators/ethereum/graphql/testcases/46_transaction_fromByHexBlockNumber.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "request": "{transaction (hash : \"0x9cc6c7e602c56aa30c554bb691377f8703d778cec8845f4b88c0f72516b304f4\") { block { number } from(block: \"0x1d\") {transactionCount}} } ", - "responses": [ - { - "data": { - "transaction": { - "block": { - "number": "0x1e" - }, - "from": { - "transactionCount": "0x1d" - } - } - } - } - ], - "statusCode": 200 -} diff --git a/simulators/ethereum/graphql/testcases/47_block_withdrawals_pre_shanghai.json b/simulators/ethereum/graphql/testcases/47_block_withdrawals_pre_shanghai.json deleted file mode 100644 index 1699f5c9d8..0000000000 --- a/simulators/ethereum/graphql/testcases/47_block_withdrawals_pre_shanghai.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "request": - "{ block (number: 32) { number withdrawalsRoot withdrawals { index amount } } }", - - "responses": [{ - "data" : { - "block" : { - "number" : "0x20", - "withdrawalsRoot": null, - "withdrawals": null - } - } - }], - "statusCode": 200 -} diff --git a/simulators/ethereum/graphql/testcases/48_block_withdrawals.json b/simulators/ethereum/graphql/testcases/48_block_withdrawals.json deleted file mode 100644 index 154c685f9e..0000000000 --- a/simulators/ethereum/graphql/testcases/48_block_withdrawals.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "request": - "{ block (number: 33) { number withdrawalsRoot withdrawals { index amount validator address } } }", - - "responses": [{ - "data" : { - "block" : { - "number" : "0x21", - "withdrawalsRoot": "0x37945ab58d2712a26df2a38d217e822694927e29b30d5993d7a53ccea618d1f3", - "withdrawals": [{ - "index": "0x0", - "amount": "0x2540be400", - "validator": "0xa", - "address": "0x0000000000000000000000000000000000000dad" - }] - } - } - }], - "statusCode": 200 -} \ No newline at end of file diff --git a/simulators/ethereum/graphql/testcases/49_get_type2Transaction.json b/simulators/ethereum/graphql/testcases/49_get_type2Transaction.json deleted file mode 100644 index 5ceb49f1f7..0000000000 --- a/simulators/ethereum/graphql/testcases/49_get_type2Transaction.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "request": "{transaction (hash : \"0x3ecd2ca6cf26c864d0ea5f038a58d4cd4a46a3e242fe92f446f392fdc232dd98\") { accessList { address storageKeys } maxFeePerGas maxPriorityFeePerGas nonce type status } } ", - "responses": [{ - "data": { - "transaction": { - "accessList": [{ - "address": "0x6295ee1b4f6dd65047762f924ecd367c17eabf8f", - "storageKeys": ["0x0000000000000000000000000000000000000000000000000000000000000000"] - }], - "maxFeePerGas": "0xb2d05e00", - "maxPriorityFeePerGas": "0x3b9aca00", - "nonce": "0x20", - "type": "0x2", - "status": "0x1" - } - } - }], - "statusCode": 200 -} \ No newline at end of file diff --git a/simulators/ethereum/graphql/testcases/50_eth_getBlock_shanghai.json b/simulators/ethereum/graphql/testcases/50_eth_getBlock_shanghai.json deleted file mode 100644 index 7c7d8bd588..0000000000 --- a/simulators/ethereum/graphql/testcases/50_eth_getBlock_shanghai.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "request": "{block (number : 33) { baseFeePerGas difficulty extraData miner { address } mixHash nonce stateRoot totalDifficulty withdrawalsRoot withdrawals { address amount index validator } }} ", - "responses":[{ - "data" : { - "block" : { - "baseFeePerGas": "0x3b9aca00", - "difficulty": "0x0", - "extraData": "0x", - "miner": { - "address": "0x0000000000000000000000000000000000000000" - }, - "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000", - "nonce": "0x0000000000000000", - "stateRoot": "0x0d3c456bb68669bad05da3a1a766daab236c9df1da8f74edf5ebe9383f00084c", - "totalDifficulty": "0x427c00", - "withdrawalsRoot": "0x37945ab58d2712a26df2a38d217e822694927e29b30d5993d7a53ccea618d1f3", - "withdrawals": [ - { - "address": "0x0000000000000000000000000000000000000dad", - "amount": "0x2540be400", - "index": "0x0", - "validator": "0xa" - } - ] - } - } - }], - "statusCode": 200 -} \ No newline at end of file diff --git a/simulators/ethereum/graphql/testcases/51_eth_getBlock_4844.json b/simulators/ethereum/graphql/testcases/51_eth_getBlock_4844.json deleted file mode 100644 index e124b8881c..0000000000 --- a/simulators/ethereum/graphql/testcases/51_eth_getBlock_4844.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "request": "{block (number: 34) { baseFeePerGas difficulty extraData miner { address } mixHash nonce stateRoot totalDifficulty withdrawalsRoot withdrawals { address amount index validator } blobGasUsed excessBlobGas transactions { maxFeePerBlobGas blobGasUsed blobGasPrice } }} ", - "responses":[{ - "data": { - "block":{ - "baseFeePerGas":"0x3437004a", - "difficulty":"0x0", - "extraData":"0x", - "miner": { - "address":"0x0000000000000000000000000000000000000000" - }, - "mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000", - "nonce":"0x0000000000000000", - "stateRoot":"0x34727aff24d1c51cd63fdc14515b15ddaa156fa0671c58a96c72b1553819945d", - "totalDifficulty":"0x427c00", - "withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", - "withdrawals":[], - "blobGasUsed":"0x40000", - "excessBlobGas":"0x0", - "transactions":[{"maxFeePerBlobGas":"0x3b9aca00","blobGasUsed":"0x40000","blobGasPrice":"0x1"}] - } - } - }], - "statusCode": 200 -} \ No newline at end of file diff --git a/simulators/portal/Cargo.lock b/simulators/portal/Cargo.lock deleted file mode 100644 index 38cbf10ffe..0000000000 --- a/simulators/portal/Cargo.lock +++ /dev/null @@ -1,5194 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -version = 4 - -[[package]] -name = "addr2line" -version = "0.24.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" -dependencies = [ - "gimli", -] - -[[package]] -name = "adler2" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" - -[[package]] -name = "aead" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d122413f284cf2d62fb1b7db97e02edb8cda96d769b16e443a4f6195e35662b0" -dependencies = [ - "crypto-common", - "generic-array", -] - -[[package]] -name = "aes" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0" -dependencies = [ - "cfg-if", - "cipher", - "cpufeatures", -] - -[[package]] -name = "aes-gcm" -version = "0.10.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "831010a0f742e1209b3bcea8fab6a8e149051ba6099432c8cb2cc117dec3ead1" -dependencies = [ - "aead", - "aes", - "cipher", - "ctr", - "ghash", - "subtle", -] - -[[package]] -name = "ahash" -version = "0.8.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" -dependencies = [ - "cfg-if", - "once_cell", - "version_check", - "zerocopy", -] - -[[package]] -name = "aho-corasick" -version = "1.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" -dependencies = [ - "memchr", -] - -[[package]] -name = "allocator-api2" -version = "0.2.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" - -[[package]] -name = "alloy" -version = "0.15.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52090b759230093c607803da793b494aff03f32bd6c142590c846db356e5a743" -dependencies = [ - "alloy-consensus", - "alloy-core", - "alloy-eips", - "alloy-genesis", - "alloy-network", - "alloy-rpc-types", - "alloy-serde", -] - -[[package]] -name = "alloy-chains" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7734aecfc58a597dde036e4c5cace2ae43e2f8bf3d406b022a1ef34da178dd49" -dependencies = [ - "alloy-primitives", - "num_enum", - "serde", - "strum", -] - -[[package]] -name = "alloy-consensus" -version = "0.15.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2931374f0e80fc031f61f3f48a23c671d78ad5e15fe9a2e405eff5a45383d2e" -dependencies = [ - "alloy-eips", - "alloy-primitives", - "alloy-rlp", - "alloy-serde", - "alloy-trie", - "auto_impl", - "c-kzg", - "derive_more", - "either", - "k256", - "once_cell", - "rand 0.8.5", - "secp256k1 0.30.0", - "serde", - "serde_with", - "thiserror 2.0.11", -] - -[[package]] -name = "alloy-consensus-any" -version = "0.15.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "649a1a61d692c5c765fbd6356c3694dd19b53bda6b13765f6085e1c119724f45" -dependencies = [ - "alloy-consensus", - "alloy-eips", - "alloy-primitives", - "alloy-rlp", - "alloy-serde", - "serde", -] - -[[package]] -name = "alloy-core" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24b2817489e4391d8c0bdf043c842164855e3d697de7a8e9edf24aa30b153ac5" -dependencies = [ - "alloy-dyn-abi", - "alloy-json-abi", - "alloy-primitives", - "alloy-rlp", - "alloy-sol-types", -] - -[[package]] -name = "alloy-dyn-abi" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f90b63261b7744642f6075ed17db6de118eecbe9516ea6c6ffd444b80180b75" -dependencies = [ - "alloy-json-abi", - "alloy-primitives", - "alloy-sol-type-parser", - "alloy-sol-types", - "const-hex", - "itoa", - "serde", - "serde_json", - "winnow", -] - -[[package]] -name = "alloy-eip2124" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "741bdd7499908b3aa0b159bba11e71c8cddd009a2c2eb7a06e825f1ec87900a5" -dependencies = [ - "alloy-primitives", - "alloy-rlp", - "crc", - "serde", - "thiserror 2.0.11", -] - -[[package]] -name = "alloy-eip2930" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbe3e16484669964c26ac48390245d84c410b1a5f968976076c17184725ef235" -dependencies = [ - "alloy-primitives", - "alloy-rlp", - "serde", -] - -[[package]] -name = "alloy-eip7702" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "804cefe429015b4244966c006d25bda5545fa9db5990e9c9079faf255052f50a" -dependencies = [ - "alloy-primitives", - "alloy-rlp", - "k256", - "serde", - "thiserror 2.0.11", -] - -[[package]] -name = "alloy-eips" -version = "0.15.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9260d6932d9e8df00bd8b40a0ea15f16502e479a1bb5758e4a948d9a93462846" -dependencies = [ - "alloy-eip2124", - "alloy-eip2930", - "alloy-eip7702", - "alloy-primitives", - "alloy-rlp", - "alloy-serde", - "auto_impl", - "c-kzg", - "derive_more", - "either", - "serde", - "sha2", -] - -[[package]] -name = "alloy-genesis" -version = "0.15.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6dd1ffced3576dd04fcfbd8baf3f58af791f2fa1428513b497040db551a0e0df" -dependencies = [ - "alloy-eips", - "alloy-primitives", - "alloy-serde", - "alloy-trie", - "serde", -] - -[[package]] -name = "alloy-hardforks" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7d3b2243e2adfaea41da41982f91ecab8083fa51b240d0427955d709f65b1b4" -dependencies = [ - "alloy-chains", - "alloy-eip2124", - "alloy-primitives", - "auto_impl", - "dyn-clone", -] - -[[package]] -name = "alloy-json-abi" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0068ae277f5ee3153a95eaea8ff10e188ed8ccde9b7f9926305415a2c0ab2442" -dependencies = [ - "alloy-primitives", - "alloy-sol-type-parser", - "serde", - "serde_json", -] - -[[package]] -name = "alloy-json-rpc" -version = "0.15.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4bc7b1036d3f62b74098054f94c9ee5a55bda7bbff74875facce9daac197749" -dependencies = [ - "alloy-primitives", - "alloy-sol-types", - "serde", - "serde_json", - "thiserror 2.0.11", - "tracing", -] - -[[package]] -name = "alloy-network" -version = "0.15.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8caffce5f40ad5ab9ec06139a3083e34d9764b4a7d3d2f18cf1bb6e1eb215cc5" -dependencies = [ - "alloy-consensus", - "alloy-consensus-any", - "alloy-eips", - "alloy-json-rpc", - "alloy-network-primitives", - "alloy-primitives", - "alloy-rpc-types-any", - "alloy-rpc-types-eth", - "alloy-serde", - "alloy-signer", - "alloy-sol-types", - "async-trait", - "auto_impl", - "derive_more", - "futures-utils-wasm", - "serde", - "serde_json", - "thiserror 2.0.11", -] - -[[package]] -name = "alloy-network-primitives" -version = "0.15.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02543b3dfaeaace2b583c8350020d0a99def063f23eedfbb3fdd173f1929dedc" -dependencies = [ - "alloy-consensus", - "alloy-eips", - "alloy-primitives", - "alloy-serde", - "serde", -] - -[[package]] -name = "alloy-primitives" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a12fe11d0b8118e551c29e1a67ccb6d01cc07ef08086df30f07487146de6fa1" -dependencies = [ - "alloy-rlp", - "bytes", - "cfg-if", - "const-hex", - "derive_more", - "foldhash", - "getrandom 0.3.1", - "hashbrown 0.15.2", - "indexmap 2.7.1", - "itoa", - "k256", - "keccak-asm", - "paste", - "proptest", - "rand 0.9.1", - "ruint", - "rustc-hash", - "serde", - "sha3 0.10.8", - "tiny-keccak", -] - -[[package]] -name = "alloy-rlp" -version = "0.3.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d6c1d995bff8d011f7cd6c81820d51825e6e06d6db73914c1630ecf544d83d6" -dependencies = [ - "alloy-rlp-derive", - "arrayvec", - "bytes", -] - -[[package]] -name = "alloy-rlp-derive" -version = "0.3.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a40e1ef334153322fd878d07e86af7a529bcb86b2439525920a88eba87bcf943" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.98", -] - -[[package]] -name = "alloy-rpc-types" -version = "0.15.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8b0862c17853965fd8b4e4e14d883775b4a4c01b8ea695d9f4f9d9b0b996205" -dependencies = [ - "alloy-primitives", - "alloy-rpc-types-eth", - "alloy-serde", - "serde", -] - -[[package]] -name = "alloy-rpc-types-any" -version = "0.15.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78adea3fffb8dd117b11269b35a6f0300996d8724a771f335dc667b1ce20a28b" -dependencies = [ - "alloy-consensus-any", - "alloy-rpc-types-eth", - "alloy-serde", -] - -[[package]] -name = "alloy-rpc-types-eth" -version = "0.15.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7f5bd2f031c061a47721870cab4573aa6c50578204173b0648176aa811c73be" -dependencies = [ - "alloy-consensus", - "alloy-consensus-any", - "alloy-eips", - "alloy-network-primitives", - "alloy-primitives", - "alloy-rlp", - "alloy-serde", - "alloy-sol-types", - "itertools 0.14.0", - "serde", - "serde_json", - "thiserror 2.0.11", -] - -[[package]] -name = "alloy-serde" -version = "0.15.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d7176ff080b8c729375c129410cb6268fea4372aa1e0d20951a5af5be176477" -dependencies = [ - "alloy-primitives", - "serde", - "serde_json", -] - -[[package]] -name = "alloy-signer" -version = "0.15.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c20b8766d2143f49b4f578889b51336f001624ed9cb37ee09ff23ab29635530" -dependencies = [ - "alloy-primitives", - "async-trait", - "auto_impl", - "either", - "elliptic-curve", - "k256", - "thiserror 2.0.11", -] - -[[package]] -name = "alloy-sol-macro" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d3ef8e0d622453d969ba3cded54cf6800efdc85cb929fe22c5bdf8335666757" -dependencies = [ - "alloy-sol-macro-expander", - "alloy-sol-macro-input", - "proc-macro-error2", - "proc-macro2", - "quote", - "syn 2.0.98", -] - -[[package]] -name = "alloy-sol-macro-expander" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0e84bd0693c69a8fbe3ec0008465e029c6293494df7cb07580bf4a33eff52e1" -dependencies = [ - "alloy-sol-macro-input", - "const-hex", - "heck", - "indexmap 2.7.1", - "proc-macro-error2", - "proc-macro2", - "quote", - "syn 2.0.98", - "syn-solidity", - "tiny-keccak", -] - -[[package]] -name = "alloy-sol-macro-input" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3de663412dadf9b64f4f92f507f78deebcc92339d12cf15f88ded65d41c7935" -dependencies = [ - "const-hex", - "dunce", - "heck", - "macro-string", - "proc-macro2", - "quote", - "syn 2.0.98", - "syn-solidity", -] - -[[package]] -name = "alloy-sol-type-parser" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "251273c5aa1abb590852f795c938730fa641832fc8fa77b5478ed1bf11b6097e" -dependencies = [ - "serde", - "winnow", -] - -[[package]] -name = "alloy-sol-types" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5460a975434ae594fe2b91586253c1beb404353b78f0a55bf124abcd79557b15" -dependencies = [ - "alloy-json-abi", - "alloy-primitives", - "alloy-sol-macro", - "const-hex", - "serde", -] - -[[package]] -name = "alloy-trie" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "983d99aa81f586cef9dae38443245e585840fcf0fc58b09aee0b1f27aed1d500" -dependencies = [ - "alloy-primitives", - "alloy-rlp", - "arrayvec", - "derive_more", - "nybbles", - "serde", - "smallvec", - "tracing", -] - -[[package]] -name = "android-tzdata" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" - -[[package]] -name = "android_system_properties" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" -dependencies = [ - "libc", -] - -[[package]] -name = "anyhow" -version = "1.0.95" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34ac096ce696dc2fcabef30516bb13c0a68a11d30131d3df6f04711467681b04" - -[[package]] -name = "arbitrary" -version = "1.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dde20b3d026af13f561bdd0f15edf01fc734f0dafcedbaf42bba506a9517f223" -dependencies = [ - "derive_arbitrary", -] - -[[package]] -name = "ark-ff" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b3235cc41ee7a12aaaf2c575a2ad7b46713a8a50bda2fc3b003a04845c05dd6" -dependencies = [ - "ark-ff-asm 0.3.0", - "ark-ff-macros 0.3.0", - "ark-serialize 0.3.0", - "ark-std 0.3.0", - "derivative", - "num-bigint", - "num-traits", - "paste", - "rustc_version 0.3.3", - "zeroize", -] - -[[package]] -name = "ark-ff" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec847af850f44ad29048935519032c33da8aa03340876d351dfab5660d2966ba" -dependencies = [ - "ark-ff-asm 0.4.2", - "ark-ff-macros 0.4.2", - "ark-serialize 0.4.2", - "ark-std 0.4.0", - "derivative", - "digest 0.10.7", - "itertools 0.10.5", - "num-bigint", - "num-traits", - "paste", - "rustc_version 0.4.1", - "zeroize", -] - -[[package]] -name = "ark-ff-asm" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db02d390bf6643fb404d3d22d31aee1c4bc4459600aef9113833d17e786c6e44" -dependencies = [ - "quote", - "syn 1.0.109", -] - -[[package]] -name = "ark-ff-asm" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ed4aa4fe255d0bc6d79373f7e31d2ea147bcf486cba1be5ba7ea85abdb92348" -dependencies = [ - "quote", - "syn 1.0.109", -] - -[[package]] -name = "ark-ff-macros" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db2fd794a08ccb318058009eefdf15bcaaaaf6f8161eb3345f907222bac38b20" -dependencies = [ - "num-bigint", - "num-traits", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "ark-ff-macros" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7abe79b0e4288889c4574159ab790824d0033b9fdcb2a112a3182fac2e514565" -dependencies = [ - "num-bigint", - "num-traits", - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "ark-serialize" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d6c2b318ee6e10f8c2853e73a83adc0ccb88995aa978d8a3408d492ab2ee671" -dependencies = [ - "ark-std 0.3.0", - "digest 0.9.0", -] - -[[package]] -name = "ark-serialize" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adb7b85a02b83d2f22f89bd5cac66c9c89474240cb6207cb1efc16d098e822a5" -dependencies = [ - "ark-std 0.4.0", - "digest 0.10.7", - "num-bigint", -] - -[[package]] -name = "ark-std" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1df2c09229cbc5a028b1d70e00fdb2acee28b1055dfb5ca73eea49c5a25c4e7c" -dependencies = [ - "num-traits", - "rand 0.8.5", -] - -[[package]] -name = "ark-std" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94893f1e0c6eeab764ade8dc4c0db24caf4fe7cbbaafc0eba0a9030f447b5185" -dependencies = [ - "num-traits", - "rand 0.8.5", -] - -[[package]] -name = "arrayvec" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" -dependencies = [ - "serde", -] - -[[package]] -name = "async-trait" -version = "0.1.86" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "644dd749086bf3771a2fbc5f256fdb982d53f011c7d5d560304eafeecebce79d" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.98", -] - -[[package]] -name = "atomic-waker" -version = "1.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" - -[[package]] -name = "auto_impl" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e12882f59de5360c748c4cbf569a042d5fb0eb515f7bea9c1f470b47f6ffbd73" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.98", -] - -[[package]] -name = "autocfg" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" - -[[package]] -name = "backtrace" -version = "0.3.74" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a" -dependencies = [ - "addr2line", - "cfg-if", - "libc", - "miniz_oxide", - "object", - "rustc-demangle", - "windows-targets", -] - -[[package]] -name = "base16ct" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" - -[[package]] -name = "base64" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" - -[[package]] -name = "base64" -version = "0.22.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" - -[[package]] -name = "base64ct" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" - -[[package]] -name = "bimap" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "230c5f1ca6a325a32553f8640d31ac9b49f2411e901e427570154868b46da4f7" - -[[package]] -name = "bit-set" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08807e080ed7f9d5433fa9b275196cfc35414f66a0c79d864dc51a0d825231a3" -dependencies = [ - "bit-vec", -] - -[[package]] -name = "bit-vec" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7" - -[[package]] -name = "bitcoin-io" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b47c4ab7a93edb0c7198c5535ed9b52b63095f4e9b45279c6736cec4b856baf" - -[[package]] -name = "bitcoin_hashes" -version = "0.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb18c03d0db0247e147a21a6faafd5a7eb851c743db062de72018b6b7e8e4d16" -dependencies = [ - "bitcoin-io", - "hex-conservative", -] - -[[package]] -name = "bitflags" -version = "1.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" - -[[package]] -name = "bitflags" -version = "2.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f68f53c83ab957f72c32642f3868eec03eb974d1fb82e453128456482613d36" - -[[package]] -name = "bitvec" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" -dependencies = [ - "funty", - "radium", - "tap", - "wyz", -] - -[[package]] -name = "block-buffer" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" -dependencies = [ - "block-padding", - "generic-array", -] - -[[package]] -name = "block-buffer" -version = "0.10.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" -dependencies = [ - "generic-array", -] - -[[package]] -name = "block-padding" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d696c370c750c948ada61c69a0ee2cbbb9c50b1019ddb86d9317157a99c2cae" - -[[package]] -name = "blst" -version = "0.3.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47c79a94619fade3c0b887670333513a67ac28a6a7e653eb260bf0d4103db38d" -dependencies = [ - "cc", - "glob", - "threadpool", - "zeroize", -] - -[[package]] -name = "bumpalo" -version = "3.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf" - -[[package]] -name = "byte-slice-cast" -version = "1.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3ac9f8b63eca6fd385229b3675f6cc0dc5c8a5c8a54a59d4f52ffd670d87b0c" - -[[package]] -name = "byteorder" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" - -[[package]] -name = "bytes" -version = "1.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f61dac84819c6588b558454b194026eb1f09c293b9036ae9b159e74e73ab6cf9" -dependencies = [ - "serde", -] - -[[package]] -name = "c-kzg" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e7e3c397401eb76228c89561cf22f85f41c95aa799ee9d860de3ea1cbc728fc" -dependencies = [ - "arbitrary", - "blst", - "cc", - "glob", - "hex", - "libc", - "once_cell", - "serde", -] - -[[package]] -name = "camino" -version = "1.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b96ec4966b5813e2c0507c1f86115c8c5abaadc3980879c3424042a02fd1ad3" -dependencies = [ - "serde", -] - -[[package]] -name = "cargo-platform" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e35af189006b9c0f00a064685c727031e3ed2d8020f7ba284d78cc2671bd36ea" -dependencies = [ - "serde", -] - -[[package]] -name = "cargo_metadata" -version = "0.18.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d886547e41f740c616ae73108f6eb70afe6d940c7bc697cb30f13daec073037" -dependencies = [ - "camino", - "cargo-platform", - "semver 1.0.25", - "serde", - "serde_json", - "thiserror 1.0.69", -] - -[[package]] -name = "cc" -version = "1.2.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4730490333d58093109dc02c23174c3f4d490998c3fed3cc8e82d57afedb9cf" -dependencies = [ - "shlex", -] - -[[package]] -name = "cesu8" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" - -[[package]] -name = "cfg-if" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" - -[[package]] -name = "chrono" -version = "0.4.39" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e36cc9d416881d2e24f9a963be5fb1cd90966419ac844274161d10488b3e825" -dependencies = [ - "android-tzdata", - "iana-time-zone", - "js-sys", - "num-traits", - "serde", - "wasm-bindgen", - "windows-targets", -] - -[[package]] -name = "cipher" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" -dependencies = [ - "crypto-common", - "inout", -] - -[[package]] -name = "combine" -version = "4.6.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" -dependencies = [ - "bytes", - "memchr", -] - -[[package]] -name = "const-hex" -version = "1.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b0485bab839b018a8f1723fc5391819fea5f8f0f32288ef8a735fd096b6160c" -dependencies = [ - "cfg-if", - "cpufeatures", - "hex", - "proptest", - "serde", -] - -[[package]] -name = "const-oid" -version = "0.9.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" - -[[package]] -name = "core-foundation" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "core-foundation-sys" -version = "0.8.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" - -[[package]] -name = "cpufeatures" -version = "0.2.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" -dependencies = [ - "libc", -] - -[[package]] -name = "crc" -version = "3.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69e6e4d7b33a94f0991c26729976b10ebde1d34c3ee82408fb536164fa10d636" -dependencies = [ - "crc-catalog", -] - -[[package]] -name = "crc-catalog" -version = "2.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5" - -[[package]] -name = "crc32fast" -version = "1.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "crunchy" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43da5946c66ffcc7745f48db692ffbb10a83bfe0afd96235c5c2a4fb23994929" - -[[package]] -name = "crypto-bigint" -version = "0.5.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" -dependencies = [ - "generic-array", - "rand_core 0.6.4", - "subtle", - "zeroize", -] - -[[package]] -name = "crypto-common" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" -dependencies = [ - "generic-array", - "rand_core 0.6.4", - "typenum", -] - -[[package]] -name = "ctr" -version = "0.9.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0369ee1ad671834580515889b80f2ea915f23b8be8d0daa4bbaf2ac5c7590835" -dependencies = [ - "cipher", -] - -[[package]] -name = "curve25519-dalek" -version = "4.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97fb8b7c4503de7d6ae7b42ab72a5a59857b4c937ec27a3d4539dba95b5ab2be" -dependencies = [ - "cfg-if", - "cpufeatures", - "curve25519-dalek-derive", - "digest 0.10.7", - "fiat-crypto", - "rustc_version 0.4.1", - "subtle", - "zeroize", -] - -[[package]] -name = "curve25519-dalek-derive" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.98", -] - -[[package]] -name = "darling" -version = "0.13.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a01d95850c592940db9b8194bc39f4bc0e89dee5c4265e4b1807c34a9aba453c" -dependencies = [ - "darling_core 0.13.4", - "darling_macro 0.13.4", -] - -[[package]] -name = "darling" -version = "0.20.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f63b86c8a8826a49b8c21f08a2d07338eec8d900540f8630dc76284be802989" -dependencies = [ - "darling_core 0.20.10", - "darling_macro 0.20.10", -] - -[[package]] -name = "darling_core" -version = "0.13.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "859d65a907b6852c9361e3185c862aae7fafd2887876799fa55f5f99dc40d610" -dependencies = [ - "fnv", - "ident_case", - "proc-macro2", - "quote", - "strsim 0.10.0", - "syn 1.0.109", -] - -[[package]] -name = "darling_core" -version = "0.20.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95133861a8032aaea082871032f5815eb9e98cef03fa916ab4500513994df9e5" -dependencies = [ - "fnv", - "ident_case", - "proc-macro2", - "quote", - "strsim 0.11.1", - "syn 2.0.98", -] - -[[package]] -name = "darling_macro" -version = "0.13.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c972679f83bdf9c42bd905396b6c3588a843a17f0f16dfcfa3e2c5d57441835" -dependencies = [ - "darling_core 0.13.4", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "darling_macro" -version = "0.20.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" -dependencies = [ - "darling_core 0.20.10", - "quote", - "syn 2.0.98", -] - -[[package]] -name = "delay_map" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df941644b671f05f59433e481ba0d31ac10e3667de725236a4c0d587c496fba1" -dependencies = [ - "futures", - "tokio", - "tokio-util", -] - -[[package]] -name = "der" -version = "0.7.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f55bf8e7b65898637379c1b74eb1551107c8294ed26d855ceb9fd1a09cfc9bc0" -dependencies = [ - "const-oid", - "zeroize", -] - -[[package]] -name = "deranged" -version = "0.3.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" -dependencies = [ - "powerfmt", - "serde", -] - -[[package]] -name = "derivative" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "derive_arbitrary" -version = "1.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30542c1ad912e0e3d22a1935c290e12e8a29d704a420177a31faad4a601a0800" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.98", -] - -[[package]] -name = "derive_more" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "093242cf7570c207c83073cf82f79706fe7b8317e98620a47d5be7c3d8497678" -dependencies = [ - "derive_more-impl", -] - -[[package]] -name = "derive_more-impl" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bda628edc44c4bb645fbe0f758797143e4e07926f7ebf4e9bdfbd3d2ce621df3" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.98", - "unicode-xid", -] - -[[package]] -name = "digest" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" -dependencies = [ - "generic-array", -] - -[[package]] -name = "digest" -version = "0.10.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" -dependencies = [ - "block-buffer 0.10.4", - "const-oid", - "crypto-common", - "subtle", -] - -[[package]] -name = "discv5" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4b4e7798d2ff74e29cee344dc490af947ae657d6ab5273dde35d58ce06a4d71" -dependencies = [ - "aes", - "aes-gcm", - "alloy-rlp", - "arrayvec", - "ctr", - "delay_map", - "enr", - "fnv", - "futures", - "hashlink", - "hex", - "hkdf", - "lazy_static", - "lru", - "more-asserts", - "parking_lot 0.12.3", - "rand 0.8.5", - "smallvec", - "socket2", - "tokio", - "tracing", - "uint 0.10.0", - "zeroize", -] - -[[package]] -name = "displaydoc" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.98", -] - -[[package]] -name = "dunce" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" - -[[package]] -name = "dyn-clone" -version = "1.0.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "feeef44e73baff3a26d371801df019877a9866a8c493d315ab00177843314f35" - -[[package]] -name = "ecdsa" -version = "0.16.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" -dependencies = [ - "der", - "digest 0.10.7", - "elliptic-curve", - "rfc6979", - "serdect", - "signature", - "spki", -] - -[[package]] -name = "ed25519" -version = "2.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "115531babc129696a58c64a4fef0a8bf9e9698629fb97e9e40767d235cfbcd53" -dependencies = [ - "pkcs8", - "signature", -] - -[[package]] -name = "ed25519-dalek" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a3daa8e81a3963a60642bcc1f90a670680bd4a77535faa384e9d1c79d620871" -dependencies = [ - "curve25519-dalek", - "ed25519", - "rand_core 0.6.4", - "serde", - "sha2", - "subtle", - "zeroize", -] - -[[package]] -name = "either" -version = "1.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" -dependencies = [ - "serde", -] - -[[package]] -name = "elliptic-curve" -version = "0.13.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" -dependencies = [ - "base16ct", - "crypto-bigint", - "digest 0.10.7", - "ff", - "generic-array", - "group", - "pkcs8", - "rand_core 0.6.4", - "sec1", - "serdect", - "subtle", - "zeroize", -] - -[[package]] -name = "encoding_rs" -version = "0.8.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "enr" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "851bd664a3d3a3c175cff92b2f0df02df3c541b4895d0ae307611827aae46152" -dependencies = [ - "alloy-rlp", - "base64 0.22.1", - "bytes", - "ed25519-dalek", - "hex", - "k256", - "log", - "rand 0.8.5", - "serde", - "sha3 0.10.8", - "zeroize", -] - -[[package]] -name = "env_logger" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a19187fea3ac7e84da7dacf48de0c45d63c6a76f9490dae389aead16c243fce3" -dependencies = [ - "log", - "regex", -] - -[[package]] -name = "equivalent" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" - -[[package]] -name = "errno" -version = "0.3.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d" -dependencies = [ - "libc", - "windows-sys 0.59.0", -] - -[[package]] -name = "eth_trie" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "518b70507e2fd9eda64e46553cda599d1aa01ebbddb22b3af298b96850b64e4a" -dependencies = [ - "alloy-primitives", - "alloy-rlp", - "hashbrown 0.15.2", - "keccak-hash 0.11.0", - "log", - "parking_lot 0.12.3", -] - -[[package]] -name = "ethereum_hashing" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c853bd72c9e5787f8aafc3df2907c2ed03cff3150c3acd94e2e53a98ab70a8ab" -dependencies = [ - "cpufeatures", - "ring", - "sha2", -] - -[[package]] -name = "ethereum_serde_utils" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3dc1355dbb41fbbd34ec28d4fb2a57d9a70c67ac3c19f6a5ca4d4a176b9e997a" -dependencies = [ - "alloy-primitives", - "hex", - "serde", - "serde_derive", - "serde_json", -] - -[[package]] -name = "ethereum_ssz" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ca8ba45b63c389c6e115b095ca16381534fdcc03cf58176a3f8554db2dbe19b" -dependencies = [ - "alloy-primitives", - "ethereum_serde_utils", - "itertools 0.13.0", - "serde", - "serde_derive", - "smallvec", - "typenum", -] - -[[package]] -name = "ethereum_ssz_derive" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0dd55d08012b4e0dfcc92b8d6081234df65f2986ad34cc76eeed69c5e2ce7506" -dependencies = [ - "darling 0.20.10", - "proc-macro2", - "quote", - "syn 2.0.98", -] - -[[package]] -name = "ethportal-api" -version = "0.10.0" -source = "git+https://github.com/ethereum/trin?rev=fd0b3c19c20c68059370a51d9b433ed34daa0591#fd0b3c19c20c68059370a51d9b433ed34daa0591" -dependencies = [ - "alloy", - "alloy-chains", - "alloy-hardforks", - "alloy-rlp", - "alloy-rpc-types-eth", - "anyhow", - "base64 0.13.1", - "bimap", - "bytes", - "c-kzg", - "discv5", - "eth_trie", - "ethereum_hashing", - "ethereum_serde_utils", - "ethereum_ssz", - "ethereum_ssz_derive", - "hex", - "itertools 0.13.0", - "jsonrpsee", - "keccak-hash 0.10.0", - "lazy_static", - "once_cell", - "parking_lot 0.11.2", - "quickcheck", - "rand 0.8.5", - "rs_merkle", - "secp256k1 0.29.1", - "serde", - "serde-this-or-that", - "serde_json", - "sha2", - "sha3 0.9.1", - "ssz_types", - "superstruct", - "thiserror 1.0.69", - "tokio", - "tree_hash", - "tree_hash_derive", - "ureq", - "validator", - "vergen", -] - -[[package]] -name = "fastrand" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" - -[[package]] -name = "fastrlp" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "139834ddba373bbdd213dffe02c8d110508dcf1726c2be27e8d1f7d7e1856418" -dependencies = [ - "arrayvec", - "auto_impl", - "bytes", -] - -[[package]] -name = "fastrlp" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce8dba4714ef14b8274c371879b175aa55b16b30f269663f19d576f380018dc4" -dependencies = [ - "arrayvec", - "auto_impl", - "bytes", -] - -[[package]] -name = "ff" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449" -dependencies = [ - "rand_core 0.6.4", - "subtle", -] - -[[package]] -name = "fiat-crypto" -version = "0.2.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d" - -[[package]] -name = "fixed-hash" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "835c052cb0c08c1acf6ffd71c022172e18723949c8282f2b9f27efbc51e64534" -dependencies = [ - "byteorder", - "rand 0.8.5", - "rustc-hex", - "static_assertions", -] - -[[package]] -name = "flate2" -version = "1.0.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c936bfdafb507ebbf50b8074c54fa31c5be9a1e7e5f467dd659697041407d07c" -dependencies = [ - "crc32fast", - "miniz_oxide", -] - -[[package]] -name = "fnv" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" - -[[package]] -name = "foldhash" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0d2fde1f7b3d48b8395d5f2de76c18a528bd6a9cdde438df747bfcba3e05d6f" - -[[package]] -name = "foreign-types" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" -dependencies = [ - "foreign-types-shared", -] - -[[package]] -name = "foreign-types-shared" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" - -[[package]] -name = "form_urlencoded" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" -dependencies = [ - "percent-encoding", -] - -[[package]] -name = "funty" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" - -[[package]] -name = "futures" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" -dependencies = [ - "futures-channel", - "futures-core", - "futures-executor", - "futures-io", - "futures-sink", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-channel" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" -dependencies = [ - "futures-core", - "futures-sink", -] - -[[package]] -name = "futures-core" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" - -[[package]] -name = "futures-executor" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" -dependencies = [ - "futures-core", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-io" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" - -[[package]] -name = "futures-macro" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.98", -] - -[[package]] -name = "futures-sink" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" - -[[package]] -name = "futures-task" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" - -[[package]] -name = "futures-timer" -version = "3.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f288b0a4f20f9a56b5d1da57e2227c661b7b16168e2f72365f57b63326e29b24" -dependencies = [ - "gloo-timers", - "send_wrapper", -] - -[[package]] -name = "futures-util" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" -dependencies = [ - "futures-channel", - "futures-core", - "futures-io", - "futures-macro", - "futures-sink", - "futures-task", - "memchr", - "pin-project-lite", - "pin-utils", - "slab", -] - -[[package]] -name = "futures-utils-wasm" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42012b0f064e01aa58b545fe3727f90f7dd4020f4a3ea735b50344965f5a57e9" - -[[package]] -name = "generic-array" -version = "0.14.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" -dependencies = [ - "typenum", - "version_check", - "zeroize", -] - -[[package]] -name = "getrandom" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" -dependencies = [ - "cfg-if", - "libc", - "wasi 0.11.0+wasi-snapshot-preview1", -] - -[[package]] -name = "getrandom" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43a49c392881ce6d5c3b8cb70f98717b7c07aabbdff06687b9030dbfbe2725f8" -dependencies = [ - "cfg-if", - "libc", - "wasi 0.13.3+wasi-0.2.2", - "windows-targets", -] - -[[package]] -name = "ghash" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0d8a4362ccb29cb0b265253fb0a2728f592895ee6854fd9bc13f2ffda266ff1" -dependencies = [ - "opaque-debug", - "polyval", -] - -[[package]] -name = "gimli" -version = "0.31.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" - -[[package]] -name = "glob" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2" - -[[package]] -name = "gloo-net" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c06f627b1a58ca3d42b45d6104bf1e1a03799df472df00988b6ba21accc10580" -dependencies = [ - "futures-channel", - "futures-core", - "futures-sink", - "gloo-utils", - "http", - "js-sys", - "pin-project", - "serde", - "serde_json", - "thiserror 1.0.69", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", -] - -[[package]] -name = "gloo-timers" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b995a66bb87bebce9a0f4a95aed01daca4872c050bfcb21653361c03bc35e5c" -dependencies = [ - "futures-channel", - "futures-core", - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "gloo-utils" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b5555354113b18c547c1d3a98fbf7fb32a9ff4f6fa112ce823a21641a0ba3aa" -dependencies = [ - "js-sys", - "serde", - "serde_json", - "wasm-bindgen", - "web-sys", -] - -[[package]] -name = "group" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" -dependencies = [ - "ff", - "rand_core 0.6.4", - "subtle", -] - -[[package]] -name = "h2" -version = "0.4.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccae279728d634d083c00f6099cb58f01cc99c145b84b8be2f6c74618d79922e" -dependencies = [ - "atomic-waker", - "bytes", - "fnv", - "futures-core", - "futures-sink", - "http", - "indexmap 2.7.1", - "slab", - "tokio", - "tokio-util", - "tracing", -] - -[[package]] -name = "hashbrown" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" - -[[package]] -name = "hashbrown" -version = "0.14.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" -dependencies = [ - "ahash", -] - -[[package]] -name = "hashbrown" -version = "0.15.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" -dependencies = [ - "allocator-api2", - "equivalent", - "foldhash", - "serde", -] - -[[package]] -name = "hashlink" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ba4ff7128dee98c7dc9794b6a411377e1404dba1c97deb8d1a55297bd25d8af" -dependencies = [ - "hashbrown 0.14.5", -] - -[[package]] -name = "heck" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" - -[[package]] -name = "hermit-abi" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" - -[[package]] -name = "hex" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" -dependencies = [ - "serde", -] - -[[package]] -name = "hex-conservative" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5313b072ce3c597065a808dbf612c4c8e8590bdbf8b579508bf7a762c5eae6cd" -dependencies = [ - "arrayvec", -] - -[[package]] -name = "hivesim" -version = "0.1.0-alpha.1" -source = "git+https://github.com/ethereum/hive?rev=4408fc1de3fee3ac23acd25a812c117756af2f39#4408fc1de3fee3ac23acd25a812c117756af2f39" -dependencies = [ - "async-trait", - "dyn-clone", - "jsonrpsee", - "regex", - "reqwest", - "serde", - "serde_json", - "tokio", -] - -[[package]] -name = "hkdf" -version = "0.12.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b5f8eb2ad728638ea2c7d47a21db23b7b58a72ed6a38256b8a1849f15fbbdf7" -dependencies = [ - "hmac", -] - -[[package]] -name = "hmac" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" -dependencies = [ - "digest 0.10.7", -] - -[[package]] -name = "http" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f16ca2af56261c99fba8bac40a10251ce8188205a4c448fbb745a2e4daa76fea" -dependencies = [ - "bytes", - "fnv", - "itoa", -] - -[[package]] -name = "http-body" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" -dependencies = [ - "bytes", - "http", -] - -[[package]] -name = "http-body-util" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "793429d76616a256bcb62c2a2ec2bed781c8307e797e2598c50010f2bee2544f" -dependencies = [ - "bytes", - "futures-util", - "http", - "http-body", - "pin-project-lite", -] - -[[package]] -name = "httparse" -version = "1.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2d708df4e7140240a16cd6ab0ab65c972d7433ab77819ea693fde9c43811e2a" - -[[package]] -name = "httpdate" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" - -[[package]] -name = "hyper" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc2b571658e38e0c01b1fdca3bbbe93c00d3d71693ff2770043f8c29bc7d6f80" -dependencies = [ - "bytes", - "futures-channel", - "futures-util", - "h2", - "http", - "http-body", - "httparse", - "httpdate", - "itoa", - "pin-project-lite", - "smallvec", - "tokio", - "want", -] - -[[package]] -name = "hyper-rustls" -version = "0.27.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d191583f3da1305256f22463b9bb0471acad48a4e534a5218b9963e9c1f59b2" -dependencies = [ - "futures-util", - "http", - "hyper", - "hyper-util", - "log", - "rustls", - "rustls-pki-types", - "tokio", - "tokio-rustls", - "tower-service", -] - -[[package]] -name = "hyper-tls" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" -dependencies = [ - "bytes", - "http-body-util", - "hyper", - "hyper-util", - "native-tls", - "tokio", - "tokio-native-tls", - "tower-service", -] - -[[package]] -name = "hyper-util" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df2dcfbe0677734ab2f3ffa7fa7bfd4706bfdc1ef393f2ee30184aed67e631b4" -dependencies = [ - "bytes", - "futures-channel", - "futures-util", - "http", - "http-body", - "hyper", - "pin-project-lite", - "socket2", - "tokio", - "tower-service", - "tracing", -] - -[[package]] -name = "iana-time-zone" -version = "0.1.61" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "235e081f3925a06703c2d0117ea8b91f042756fd6e7a6e5d901e8ca1a996b220" -dependencies = [ - "android_system_properties", - "core-foundation-sys", - "iana-time-zone-haiku", - "js-sys", - "wasm-bindgen", - "windows-core", -] - -[[package]] -name = "iana-time-zone-haiku" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" -dependencies = [ - "cc", -] - -[[package]] -name = "icu_collections" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" -dependencies = [ - "displaydoc", - "yoke", - "zerofrom", - "zerovec", -] - -[[package]] -name = "icu_locid" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" -dependencies = [ - "displaydoc", - "litemap", - "tinystr", - "writeable", - "zerovec", -] - -[[package]] -name = "icu_locid_transform" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e" -dependencies = [ - "displaydoc", - "icu_locid", - "icu_locid_transform_data", - "icu_provider", - "tinystr", - "zerovec", -] - -[[package]] -name = "icu_locid_transform_data" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdc8ff3388f852bede6b579ad4e978ab004f139284d7b28715f773507b946f6e" - -[[package]] -name = "icu_normalizer" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" -dependencies = [ - "displaydoc", - "icu_collections", - "icu_normalizer_data", - "icu_properties", - "icu_provider", - "smallvec", - "utf16_iter", - "utf8_iter", - "write16", - "zerovec", -] - -[[package]] -name = "icu_normalizer_data" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8cafbf7aa791e9b22bec55a167906f9e1215fd475cd22adfcf660e03e989516" - -[[package]] -name = "icu_properties" -version = "1.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" -dependencies = [ - "displaydoc", - "icu_collections", - "icu_locid_transform", - "icu_properties_data", - "icu_provider", - "tinystr", - "zerovec", -] - -[[package]] -name = "icu_properties_data" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67a8effbc3dd3e4ba1afa8ad918d5684b8868b3b26500753effea8d2eed19569" - -[[package]] -name = "icu_provider" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" -dependencies = [ - "displaydoc", - "icu_locid", - "icu_provider_macros", - "stable_deref_trait", - "tinystr", - "writeable", - "yoke", - "zerofrom", - "zerovec", -] - -[[package]] -name = "icu_provider_macros" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.98", -] - -[[package]] -name = "ident_case" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" - -[[package]] -name = "idna" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" -dependencies = [ - "idna_adapter", - "smallvec", - "utf8_iter", -] - -[[package]] -name = "idna_adapter" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71" -dependencies = [ - "icu_normalizer", - "icu_properties", -] - -[[package]] -name = "impl-codec" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba6a270039626615617f3f36d15fc827041df3b78c439da2cadfa47455a77f2f" -dependencies = [ - "parity-scale-codec", -] - -[[package]] -name = "impl-trait-for-tuples" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0eb5a3343abf848c0984fe4604b2b105da9539376e24fc0a3b0007411ae4fd9" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.98", -] - -[[package]] -name = "indexmap" -version = "1.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" -dependencies = [ - "autocfg", - "hashbrown 0.12.3", - "serde", -] - -[[package]] -name = "indexmap" -version = "2.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c9c992b02b5b4c94ea26e32fe5bccb7aa7d9f390ab5c1221ff895bc7ea8b652" -dependencies = [ - "equivalent", - "hashbrown 0.15.2", - "serde", -] - -[[package]] -name = "inout" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0c10553d664a4d0bcff9f4215d0aac67a639cc68ef660840afe309b807bc9f5" -dependencies = [ - "generic-array", -] - -[[package]] -name = "instant" -version = "0.1.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "ipnet" -version = "2.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" - -[[package]] -name = "itertools" -version = "0.10.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" -dependencies = [ - "either", -] - -[[package]] -name = "itertools" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" -dependencies = [ - "either", -] - -[[package]] -name = "itertools" -version = "0.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285" -dependencies = [ - "either", -] - -[[package]] -name = "itoa" -version = "1.0.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674" - -[[package]] -name = "jni" -version = "0.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6df18c2e3db7e453d3c6ac5b3e9d5182664d28788126d39b91f2d1e22b017ec" -dependencies = [ - "cesu8", - "combine", - "jni-sys", - "log", - "thiserror 1.0.69", - "walkdir", -] - -[[package]] -name = "jni-sys" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" - -[[package]] -name = "js-sys" -version = "0.3.77" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" -dependencies = [ - "once_cell", - "wasm-bindgen", -] - -[[package]] -name = "jsonrpsee" -version = "0.24.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "834af00800e962dee8f7bfc0f60601de215e73e78e5497d733a2919da837d3c8" -dependencies = [ - "jsonrpsee-client-transport", - "jsonrpsee-core", - "jsonrpsee-http-client", - "jsonrpsee-proc-macros", - "jsonrpsee-server", - "jsonrpsee-types", - "jsonrpsee-wasm-client", - "jsonrpsee-ws-client", - "tokio", - "tracing", -] - -[[package]] -name = "jsonrpsee-client-transport" -version = "0.24.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "def0fd41e2f53118bd1620478d12305b2c75feef57ea1f93ef70568c98081b7e" -dependencies = [ - "base64 0.22.1", - "futures-channel", - "futures-util", - "gloo-net", - "http", - "jsonrpsee-core", - "pin-project", - "rustls", - "rustls-pki-types", - "rustls-platform-verifier", - "soketto", - "thiserror 1.0.69", - "tokio", - "tokio-rustls", - "tokio-util", - "tracing", - "url", -] - -[[package]] -name = "jsonrpsee-core" -version = "0.24.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76637f6294b04e747d68e69336ef839a3493ca62b35bf488ead525f7da75c5bb" -dependencies = [ - "async-trait", - "bytes", - "futures-timer", - "futures-util", - "http", - "http-body", - "http-body-util", - "jsonrpsee-types", - "parking_lot 0.12.3", - "pin-project", - "rand 0.8.5", - "rustc-hash", - "serde", - "serde_json", - "thiserror 1.0.69", - "tokio", - "tokio-stream", - "tracing", - "wasm-bindgen-futures", -] - -[[package]] -name = "jsonrpsee-http-client" -version = "0.24.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87c24e981ad17798bbca852b0738bfb7b94816ed687bd0d5da60bfa35fa0fdc3" -dependencies = [ - "async-trait", - "base64 0.22.1", - "http-body", - "hyper", - "hyper-rustls", - "hyper-util", - "jsonrpsee-core", - "jsonrpsee-types", - "rustls", - "rustls-platform-verifier", - "serde", - "serde_json", - "thiserror 1.0.69", - "tokio", - "tower 0.4.13", - "tracing", - "url", -] - -[[package]] -name = "jsonrpsee-proc-macros" -version = "0.24.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fcae0c6c159e11541080f1f829873d8f374f81eda0abc67695a13fc8dc1a580" -dependencies = [ - "heck", - "proc-macro-crate", - "proc-macro2", - "quote", - "syn 2.0.98", -] - -[[package]] -name = "jsonrpsee-server" -version = "0.24.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66b7a3df90a1a60c3ed68e7ca63916b53e9afa928e33531e87f61a9c8e9ae87b" -dependencies = [ - "futures-util", - "http", - "http-body", - "http-body-util", - "hyper", - "hyper-util", - "jsonrpsee-core", - "jsonrpsee-types", - "pin-project", - "route-recognizer", - "serde", - "serde_json", - "soketto", - "thiserror 1.0.69", - "tokio", - "tokio-stream", - "tokio-util", - "tower 0.4.13", - "tracing", -] - -[[package]] -name = "jsonrpsee-types" -version = "0.24.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddb81adb1a5ae9182df379e374a79e24e992334e7346af4d065ae5b2acb8d4c6" -dependencies = [ - "http", - "serde", - "serde_json", - "thiserror 1.0.69", -] - -[[package]] -name = "jsonrpsee-wasm-client" -version = "0.24.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42e41af42ca39657313748174d02766e5287d3a57356f16756dbd8065b933977" -dependencies = [ - "jsonrpsee-client-transport", - "jsonrpsee-core", - "jsonrpsee-types", -] - -[[package]] -name = "jsonrpsee-ws-client" -version = "0.24.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f4f3642a292f5b76d8a16af5c88c16a0860f2ccc778104e5c848b28183d9538" -dependencies = [ - "http", - "jsonrpsee-client-transport", - "jsonrpsee-core", - "jsonrpsee-types", - "url", -] - -[[package]] -name = "k256" -version = "0.13.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6e3919bbaa2945715f0bb6d3934a173d1e9a59ac23767fbaaef277265a7411b" -dependencies = [ - "cfg-if", - "ecdsa", - "elliptic-curve", - "once_cell", - "serdect", - "sha2", - "signature", -] - -[[package]] -name = "keccak" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ecc2af9a1119c51f12a14607e783cb977bde58bc069ff0c3da1095e635d70654" -dependencies = [ - "cpufeatures", -] - -[[package]] -name = "keccak-asm" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "505d1856a39b200489082f90d897c3f07c455563880bc5952e38eabf731c83b6" -dependencies = [ - "digest 0.10.7", - "sha3-asm", -] - -[[package]] -name = "keccak-hash" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b286e6b663fb926e1eeb68528e69cb70ed46c6d65871a21b2215ae8154c6d3c" -dependencies = [ - "primitive-types 0.12.2", - "tiny-keccak", -] - -[[package]] -name = "keccak-hash" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e1b8590eb6148af2ea2d75f38e7d29f5ca970d5a4df456b3ef19b8b415d0264" -dependencies = [ - "primitive-types 0.13.1", - "tiny-keccak", -] - -[[package]] -name = "lazy_static" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" - -[[package]] -name = "libc" -version = "0.2.169" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a" - -[[package]] -name = "libm" -version = "0.2.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8355be11b20d696c8f18f6cc018c4e372165b1fa8126cef092399c9951984ffa" - -[[package]] -name = "linux-raw-sys" -version = "0.4.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" - -[[package]] -name = "litemap" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ee93343901ab17bd981295f2cf0026d4ad018c7c31ba84549a4ddbb47a45104" - -[[package]] -name = "lock_api" -version = "0.4.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" -dependencies = [ - "autocfg", - "scopeguard", -] - -[[package]] -name = "log" -version = "0.4.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04cbf5b083de1c7e0222a7a51dbfdba1cbe1c6ab0b15e29fff3f6c077fd9cd9f" - -[[package]] -name = "lru" -version = "0.12.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "234cf4f4a04dc1f57e24b96cc0cd600cf2af460d4161ac5ecdd0af8e1f3b2a38" -dependencies = [ - "hashbrown 0.15.2", -] - -[[package]] -name = "macro-string" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b27834086c65ec3f9387b096d66e99f221cf081c2b738042aa252bcd41204e3" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.98", -] - -[[package]] -name = "memchr" -version = "2.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" - -[[package]] -name = "mime" -version = "0.3.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" - -[[package]] -name = "mime_guess" -version = "2.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7c44f8e672c00fe5308fa235f821cb4198414e1c77935c1ab6948d3fd78550e" -dependencies = [ - "mime", - "unicase", -] - -[[package]] -name = "miniz_oxide" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8402cab7aefae129c6977bb0ff1b8fd9a04eb5b51efc50a70bea51cda0c7924" -dependencies = [ - "adler2", -] - -[[package]] -name = "mio" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" -dependencies = [ - "libc", - "wasi 0.11.0+wasi-snapshot-preview1", - "windows-sys 0.52.0", -] - -[[package]] -name = "more-asserts" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fafa6961cabd9c63bcd77a45d7e3b7f3b552b70417831fb0f56db717e72407e" - -[[package]] -name = "native-tls" -version = "0.2.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0dab59f8e050d5df8e4dd87d9206fb6f65a483e20ac9fda365ade4fab353196c" -dependencies = [ - "libc", - "log", - "openssl", - "openssl-probe", - "openssl-sys", - "schannel", - "security-framework", - "security-framework-sys", - "tempfile", -] - -[[package]] -name = "nu-ansi-term" -version = "0.46.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" -dependencies = [ - "overload", - "winapi", -] - -[[package]] -name = "num-bigint" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" -dependencies = [ - "num-integer", - "num-traits", -] - -[[package]] -name = "num-conv" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" - -[[package]] -name = "num-integer" -version = "0.1.46" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" -dependencies = [ - "num-traits", -] - -[[package]] -name = "num-traits" -version = "0.2.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" -dependencies = [ - "autocfg", - "libm", -] - -[[package]] -name = "num_cpus" -version = "1.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" -dependencies = [ - "hermit-abi", - "libc", -] - -[[package]] -name = "num_enum" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e613fc340b2220f734a8595782c551f1250e969d87d3be1ae0579e8d4065179" -dependencies = [ - "num_enum_derive", -] - -[[package]] -name = "num_enum_derive" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af1844ef2428cc3e1cb900be36181049ef3d3193c63e43026cfe202983b27a56" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.98", -] - -[[package]] -name = "num_threads" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c7398b9c8b70908f6371f47ed36737907c87c52af34c268fed0bf0ceb92ead9" -dependencies = [ - "libc", -] - -[[package]] -name = "nybbles" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8983bb634df7248924ee0c4c3a749609b5abcb082c28fffe3254b3eb3602b307" -dependencies = [ - "alloy-rlp", - "const-hex", - "proptest", - "serde", - "smallvec", -] - -[[package]] -name = "object" -version = "0.36.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" -dependencies = [ - "memchr", -] - -[[package]] -name = "once_cell" -version = "1.21.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" - -[[package]] -name = "opaque-debug" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" - -[[package]] -name = "openssl" -version = "0.10.70" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61cfb4e166a8bb8c9b55c500bc2308550148ece889be90f609377e58140f42c6" -dependencies = [ - "bitflags 2.8.0", - "cfg-if", - "foreign-types", - "libc", - "once_cell", - "openssl-macros", - "openssl-sys", -] - -[[package]] -name = "openssl-macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.98", -] - -[[package]] -name = "openssl-probe" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" - -[[package]] -name = "openssl-sys" -version = "0.9.105" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b22d5b84be05a8d6947c7cb71f7c849aa0f112acd4bf51c2a7c1c988ac0a9dc" -dependencies = [ - "cc", - "libc", - "pkg-config", - "vcpkg", -] - -[[package]] -name = "overload" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" - -[[package]] -name = "parity-scale-codec" -version = "3.6.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "306800abfa29c7f16596b5970a588435e3d5b3149683d00c12b699cc19f895ee" -dependencies = [ - "arrayvec", - "bitvec", - "byte-slice-cast", - "impl-trait-for-tuples", - "parity-scale-codec-derive", - "serde", -] - -[[package]] -name = "parity-scale-codec-derive" -version = "3.6.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d830939c76d294956402033aee57a6da7b438f2294eb94864c37b0569053a42c" -dependencies = [ - "proc-macro-crate", - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "parking_lot" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d17b78036a60663b797adeaee46f5c9dfebb86948d1255007a1d6be0271ff99" -dependencies = [ - "instant", - "lock_api", - "parking_lot_core 0.8.6", -] - -[[package]] -name = "parking_lot" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" -dependencies = [ - "lock_api", - "parking_lot_core 0.9.10", -] - -[[package]] -name = "parking_lot_core" -version = "0.8.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60a2cfe6f0ad2bfc16aefa463b497d5c7a5ecd44a23efa72aa342d90177356dc" -dependencies = [ - "cfg-if", - "instant", - "libc", - "redox_syscall 0.2.16", - "smallvec", - "winapi", -] - -[[package]] -name = "parking_lot_core" -version = "0.9.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" -dependencies = [ - "cfg-if", - "libc", - "redox_syscall 0.5.8", - "smallvec", - "windows-targets", -] - -[[package]] -name = "paste" -version = "1.0.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" - -[[package]] -name = "percent-encoding" -version = "2.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" - -[[package]] -name = "pest" -version = "2.7.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b7cafe60d6cf8e62e1b9b2ea516a089c008945bb5a275416789e7db0bc199dc" -dependencies = [ - "memchr", - "thiserror 2.0.11", - "ucd-trie", -] - -[[package]] -name = "pin-project" -version = "1.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfe2e71e1471fe07709406bf725f710b02927c9c54b2b5b2ec0e8087d97c327d" -dependencies = [ - "pin-project-internal", -] - -[[package]] -name = "pin-project-internal" -version = "1.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6e859e6e5bd50440ab63c47e3ebabc90f26251f7c73c3d3e837b74a1cc3fa67" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.98", -] - -[[package]] -name = "pin-project-lite" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" - -[[package]] -name = "pin-utils" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" - -[[package]] -name = "pkcs8" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" -dependencies = [ - "der", - "spki", -] - -[[package]] -name = "pkg-config" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2" - -[[package]] -name = "polyval" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d1fe60d06143b2430aa532c94cfe9e29783047f06c0d7fd359a9a51b729fa25" -dependencies = [ - "cfg-if", - "cpufeatures", - "opaque-debug", - "universal-hash", -] - -[[package]] -name = "portal" -version = "0.1.0" -dependencies = [ - "alloy-consensus", - "alloy-primitives", - "alloy-rlp", - "anyhow", - "chrono", - "ethereum_ssz", - "ethportal-api", - "futures", - "hivesim", - "itertools 0.14.0", - "lazy_static", - "reqwest", - "serde_json", - "serde_yaml", - "snap", - "ssz_types", - "tokio", - "tracing", - "tracing-subscriber", -] - -[[package]] -name = "powerfmt" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" - -[[package]] -name = "ppv-lite86" -version = "0.2.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" -dependencies = [ - "zerocopy", -] - -[[package]] -name = "primitive-types" -version = "0.12.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b34d9fd68ae0b74a41b21c03c2f62847aa0ffea044eee893b4c140b37e244e2" -dependencies = [ - "fixed-hash", - "impl-codec", - "uint 0.9.5", -] - -[[package]] -name = "primitive-types" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d15600a7d856470b7d278b3fe0e311fe28c2526348549f8ef2ff7db3299c87f5" -dependencies = [ - "fixed-hash", - "uint 0.10.0", -] - -[[package]] -name = "proc-macro-crate" -version = "3.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ecf48c7ca261d60b74ab1a7b20da18bede46776b2e55535cb958eb595c5fa7b" -dependencies = [ - "toml_edit", -] - -[[package]] -name = "proc-macro-error-attr2" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96de42df36bb9bba5542fe9f1a054b8cc87e172759a1868aa05c1f3acc89dfc5" -dependencies = [ - "proc-macro2", - "quote", -] - -[[package]] -name = "proc-macro-error2" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11ec05c52be0a07b08061f7dd003e7d7092e0472bc731b4af7bb1ef876109802" -dependencies = [ - "proc-macro-error-attr2", - "proc-macro2", - "quote", - "syn 2.0.98", -] - -[[package]] -name = "proc-macro2" -version = "1.0.93" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60946a68e5f9d28b0dc1c21bb8a97ee7d018a8b322fa57838ba31cc878e22d99" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "proptest" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14cae93065090804185d3b75f0bf93b8eeda30c7a9b4a33d3bdb3988d6229e50" -dependencies = [ - "bit-set", - "bit-vec", - "bitflags 2.8.0", - "lazy_static", - "num-traits", - "rand 0.8.5", - "rand_chacha 0.3.1", - "rand_xorshift", - "regex-syntax", - "rusty-fork", - "tempfile", - "unarray", -] - -[[package]] -name = "quick-error" -version = "1.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" - -[[package]] -name = "quickcheck" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "588f6378e4dd99458b60ec275b4477add41ce4fa9f64dcba6f15adccb19b50d6" -dependencies = [ - "env_logger", - "log", - "rand 0.8.5", -] - -[[package]] -name = "quote" -version = "1.0.38" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e4dccaaaf89514f546c693ddc140f729f958c247918a13380cccc6078391acc" -dependencies = [ - "proc-macro2", -] - -[[package]] -name = "radium" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" - -[[package]] -name = "rand" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" -dependencies = [ - "libc", - "rand_chacha 0.3.1", - "rand_core 0.6.4", - "serde", -] - -[[package]] -name = "rand" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fbfd9d094a40bf3ae768db9361049ace4c0e04a4fd6b359518bd7b73a73dd97" -dependencies = [ - "rand_chacha 0.9.0", - "rand_core 0.9.3", - "serde", -] - -[[package]] -name = "rand_chacha" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" -dependencies = [ - "ppv-lite86", - "rand_core 0.6.4", -] - -[[package]] -name = "rand_chacha" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" -dependencies = [ - "ppv-lite86", - "rand_core 0.9.3", -] - -[[package]] -name = "rand_core" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" -dependencies = [ - "getrandom 0.2.15", -] - -[[package]] -name = "rand_core" -version = "0.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" -dependencies = [ - "getrandom 0.3.1", - "serde", -] - -[[package]] -name = "rand_xorshift" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d25bf25ec5ae4a3f1b92f929810509a2f53d7dca2f50b794ff57e3face536c8f" -dependencies = [ - "rand_core 0.6.4", -] - -[[package]] -name = "redox_syscall" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" -dependencies = [ - "bitflags 1.3.2", -] - -[[package]] -name = "redox_syscall" -version = "0.5.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03a862b389f93e68874fbf580b9de08dd02facb9a788ebadaf4a3fd33cf58834" -dependencies = [ - "bitflags 2.8.0", -] - -[[package]] -name = "regex" -version = "1.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" -dependencies = [ - "aho-corasick", - "memchr", - "regex-automata", - "regex-syntax", -] - -[[package]] -name = "regex-automata" -version = "0.4.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" -dependencies = [ - "aho-corasick", - "memchr", - "regex-syntax", -] - -[[package]] -name = "regex-syntax" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" - -[[package]] -name = "reqwest" -version = "0.12.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43e734407157c3c2034e0258f5e4473ddb361b1e85f95a66690d67264d7cd1da" -dependencies = [ - "base64 0.22.1", - "bytes", - "encoding_rs", - "futures-core", - "futures-util", - "h2", - "http", - "http-body", - "http-body-util", - "hyper", - "hyper-rustls", - "hyper-tls", - "hyper-util", - "ipnet", - "js-sys", - "log", - "mime", - "mime_guess", - "native-tls", - "once_cell", - "percent-encoding", - "pin-project-lite", - "rustls-pemfile", - "serde", - "serde_json", - "serde_urlencoded", - "sync_wrapper", - "system-configuration", - "tokio", - "tokio-native-tls", - "tower 0.5.2", - "tower-service", - "url", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", - "windows-registry", -] - -[[package]] -name = "rfc6979" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" -dependencies = [ - "hmac", - "subtle", -] - -[[package]] -name = "ring" -version = "0.17.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" -dependencies = [ - "cc", - "cfg-if", - "getrandom 0.2.15", - "libc", - "spin", - "untrusted", - "windows-sys 0.52.0", -] - -[[package]] -name = "rlp" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb919243f34364b6bd2fc10ef797edbfa75f33c252e7998527479c6d6b47e1ec" -dependencies = [ - "bytes", - "rustc-hex", -] - -[[package]] -name = "route-recognizer" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "afab94fb28594581f62d981211a9a4d53cc8130bbcbbb89a0440d9b8e81a7746" - -[[package]] -name = "rs_merkle" -version = "1.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b241d2e59b74ef9e98d94c78c47623d04c8392abaf82014dfd372a16041128f" -dependencies = [ - "sha2", -] - -[[package]] -name = "ruint" -version = "1.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78a46eb779843b2c4f21fac5773e25d6d5b7c8f0922876c91541790d2ca27eef" -dependencies = [ - "alloy-rlp", - "ark-ff 0.3.0", - "ark-ff 0.4.2", - "bytes", - "fastrlp 0.3.1", - "fastrlp 0.4.0", - "num-bigint", - "num-integer", - "num-traits", - "parity-scale-codec", - "primitive-types 0.12.2", - "proptest", - "rand 0.8.5", - "rand 0.9.1", - "rlp", - "ruint-macro", - "serde", - "valuable", - "zeroize", -] - -[[package]] -name = "ruint-macro" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48fd7bd8a6377e15ad9d42a8ec25371b94ddc67abe7c8b9127bec79bebaaae18" - -[[package]] -name = "rustc-demangle" -version = "0.1.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" - -[[package]] -name = "rustc-hash" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7fb8039b3032c191086b10f11f319a6e99e1e82889c5cc6046f515c9db1d497" - -[[package]] -name = "rustc-hex" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e75f6a532d0fd9f7f13144f392b6ad56a32696bfcd9c78f797f16bbb6f072d6" - -[[package]] -name = "rustc_version" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0dfe2087c51c460008730de8b57e6a320782fbfb312e1f4d520e6c6fae155ee" -dependencies = [ - "semver 0.11.0", -] - -[[package]] -name = "rustc_version" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" -dependencies = [ - "semver 1.0.25", -] - -[[package]] -name = "rustix" -version = "0.38.44" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" -dependencies = [ - "bitflags 2.8.0", - "errno", - "libc", - "linux-raw-sys", - "windows-sys 0.59.0", -] - -[[package]] -name = "rustls" -version = "0.23.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fb9263ab4eb695e42321db096e3b8fbd715a59b154d5c88d82db2175b681ba7" -dependencies = [ - "log", - "once_cell", - "ring", - "rustls-pki-types", - "rustls-webpki", - "subtle", - "zeroize", -] - -[[package]] -name = "rustls-native-certs" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5bfb394eeed242e909609f56089eecfe5fda225042e8b171791b9c95f5931e5" -dependencies = [ - "openssl-probe", - "rustls-pemfile", - "rustls-pki-types", - "schannel", - "security-framework", -] - -[[package]] -name = "rustls-pemfile" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50" -dependencies = [ - "rustls-pki-types", -] - -[[package]] -name = "rustls-pki-types" -version = "1.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "917ce264624a4b4db1c364dcc35bfca9ded014d0a958cd47ad3e960e988ea51c" - -[[package]] -name = "rustls-platform-verifier" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "afbb878bdfdf63a336a5e63561b1835e7a8c91524f51621db870169eac84b490" -dependencies = [ - "core-foundation", - "core-foundation-sys", - "jni", - "log", - "once_cell", - "rustls", - "rustls-native-certs", - "rustls-platform-verifier-android", - "rustls-webpki", - "security-framework", - "security-framework-sys", - "webpki-roots", - "winapi", -] - -[[package]] -name = "rustls-platform-verifier-android" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f87165f0995f63a9fbeea62b64d10b4d9d8e78ec6d7d51fb2125fda7bb36788f" - -[[package]] -name = "rustls-webpki" -version = "0.102.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64ca1bc8749bd4cf37b5ce386cc146580777b4e8572c7b97baf22c83f444bee9" -dependencies = [ - "ring", - "rustls-pki-types", - "untrusted", -] - -[[package]] -name = "rustversion" -version = "1.0.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7c45b9784283f1b2e7fb61b42047c2fd678ef0960d4f6f1eba131594cc369d4" - -[[package]] -name = "rusty-fork" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb3dcc6e454c328bb824492db107ab7c0ae8fcffe4ad210136ef014458c1bc4f" -dependencies = [ - "fnv", - "quick-error", - "tempfile", - "wait-timeout", -] - -[[package]] -name = "ryu" -version = "1.0.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ea1a2d0a644769cc99faa24c3ad26b379b786fe7c36fd3c546254801650e6dd" - -[[package]] -name = "same-file" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" -dependencies = [ - "winapi-util", -] - -[[package]] -name = "schannel" -version = "0.1.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f29ebaa345f945cec9fbbc532eb307f0fdad8161f281b6369539c8d84876b3d" -dependencies = [ - "windows-sys 0.59.0", -] - -[[package]] -name = "scopeguard" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" - -[[package]] -name = "sec1" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" -dependencies = [ - "base16ct", - "der", - "generic-array", - "pkcs8", - "serdect", - "subtle", - "zeroize", -] - -[[package]] -name = "secp256k1" -version = "0.29.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9465315bc9d4566e1724f0fffcbcc446268cb522e60f9a27bcded6b19c108113" -dependencies = [ - "rand 0.8.5", - "secp256k1-sys", -] - -[[package]] -name = "secp256k1" -version = "0.30.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b50c5943d326858130af85e049f2661ba3c78b26589b8ab98e65e80ae44a1252" -dependencies = [ - "bitcoin_hashes", - "rand 0.8.5", - "secp256k1-sys", - "serde", -] - -[[package]] -name = "secp256k1-sys" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4387882333d3aa8cb20530a17c69a3752e97837832f34f6dccc760e715001d9" -dependencies = [ - "cc", -] - -[[package]] -name = "security-framework" -version = "2.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" -dependencies = [ - "bitflags 2.8.0", - "core-foundation", - "core-foundation-sys", - "libc", - "num-bigint", - "security-framework-sys", -] - -[[package]] -name = "security-framework-sys" -version = "2.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49db231d56a190491cb4aeda9527f1ad45345af50b0851622a7adb8c03b01c32" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "semver" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f301af10236f6df4160f7c3f04eec6dbc70ace82d23326abad5edee88801c6b6" -dependencies = [ - "semver-parser", -] - -[[package]] -name = "semver" -version = "1.0.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f79dfe2d285b0488816f30e700a7438c5a73d816b5b7d3ac72fbc48b0d185e03" -dependencies = [ - "serde", -] - -[[package]] -name = "semver-parser" -version = "0.10.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9900206b54a3527fdc7b8a938bffd94a568bac4f4aa8113b209df75a09c0dec2" -dependencies = [ - "pest", -] - -[[package]] -name = "send_wrapper" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f638d531eccd6e23b980caf34876660d38e265409d8e99b397ab71eb3612fad0" - -[[package]] -name = "serde" -version = "1.0.217" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02fc4265df13d6fa1d00ecff087228cc0a2b5f3c0e87e258d8b94a156e984c70" -dependencies = [ - "serde_derive", -] - -[[package]] -name = "serde-this-or-that" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "634c5a3cb041e56cc2964386151c67d520f845445789da3bd46bfb1c94f5e3bb" -dependencies = [ - "serde", -] - -[[package]] -name = "serde_derive" -version = "1.0.217" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a9bf7cf98d04a2b28aead066b7496853d4779c9cc183c440dbac457641e19a0" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.98", -] - -[[package]] -name = "serde_json" -version = "1.0.138" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d434192e7da787e94a6ea7e9670b26a036d0ca41e0b7efb2676dd32bae872949" -dependencies = [ - "itoa", - "memchr", - "ryu", - "serde", -] - -[[package]] -name = "serde_urlencoded" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" -dependencies = [ - "form_urlencoded", - "itoa", - "ryu", - "serde", -] - -[[package]] -name = "serde_with" -version = "3.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6b6f7f2fcb69f747921f79f3926bd1e203fce4fef62c268dd3abfb6d86029aa" -dependencies = [ - "base64 0.22.1", - "chrono", - "hex", - "indexmap 1.9.3", - "indexmap 2.7.1", - "serde", - "serde_derive", - "serde_json", - "serde_with_macros", - "time", -] - -[[package]] -name = "serde_with_macros" -version = "3.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d00caa5193a3c8362ac2b73be6b9e768aa5a4b2f721d8f4b339600c3cb51f8e" -dependencies = [ - "darling 0.20.10", - "proc-macro2", - "quote", - "syn 2.0.98", -] - -[[package]] -name = "serde_yaml" -version = "0.9.34+deprecated" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a8b1a1a2ebf674015cc02edccce75287f1a0130d394307b36743c2f5d504b47" -dependencies = [ - "indexmap 2.7.1", - "itoa", - "ryu", - "serde", - "unsafe-libyaml", -] - -[[package]] -name = "serdect" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a84f14a19e9a014bb9f4512488d9829a68e04ecabffb0f9904cd1ace94598177" -dependencies = [ - "base16ct", - "serde", -] - -[[package]] -name = "sha1" -version = "0.10.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" -dependencies = [ - "cfg-if", - "cpufeatures", - "digest 0.10.7", -] - -[[package]] -name = "sha2" -version = "0.10.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" -dependencies = [ - "cfg-if", - "cpufeatures", - "digest 0.10.7", -] - -[[package]] -name = "sha3" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f81199417d4e5de3f04b1e871023acea7389672c4135918f05aa9cbf2f2fa809" -dependencies = [ - "block-buffer 0.9.0", - "digest 0.9.0", - "keccak", - "opaque-debug", -] - -[[package]] -name = "sha3" -version = "0.10.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75872d278a8f37ef87fa0ddbda7802605cb18344497949862c0d4dcb291eba60" -dependencies = [ - "digest 0.10.7", - "keccak", -] - -[[package]] -name = "sha3-asm" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c28efc5e327c837aa837c59eae585fc250715ef939ac32881bcc11677cd02d46" -dependencies = [ - "cc", - "cfg-if", -] - -[[package]] -name = "sharded-slab" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" -dependencies = [ - "lazy_static", -] - -[[package]] -name = "shlex" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" - -[[package]] -name = "signal-hook-registry" -version = "1.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" -dependencies = [ - "libc", -] - -[[package]] -name = "signature" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" -dependencies = [ - "digest 0.10.7", - "rand_core 0.6.4", -] - -[[package]] -name = "slab" -version = "0.4.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" -dependencies = [ - "autocfg", -] - -[[package]] -name = "smallvec" -version = "1.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" -dependencies = [ - "serde", -] - -[[package]] -name = "snap" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b6b67fb9a61334225b5b790716f609cd58395f895b3fe8b328786812a40bc3b" - -[[package]] -name = "socket2" -version = "0.5.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c970269d99b64e60ec3bd6ad27270092a5394c4e309314b18ae3fe575695fbe8" -dependencies = [ - "libc", - "windows-sys 0.52.0", -] - -[[package]] -name = "soketto" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e859df029d160cb88608f5d7df7fb4753fd20fdfb4de5644f3d8b8440841721" -dependencies = [ - "base64 0.22.1", - "bytes", - "futures", - "http", - "httparse", - "log", - "rand 0.8.5", - "sha1", -] - -[[package]] -name = "spin" -version = "0.9.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" - -[[package]] -name = "spki" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" -dependencies = [ - "base64ct", - "der", -] - -[[package]] -name = "ssz_types" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75b55bedc9a18ed2860a46d6beb4f4082416ee1d60be0cc364cebdcdddc7afd4" -dependencies = [ - "ethereum_serde_utils", - "ethereum_ssz", - "itertools 0.13.0", - "serde", - "serde_derive", - "smallvec", - "tree_hash", - "typenum", -] - -[[package]] -name = "stable_deref_trait" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" - -[[package]] -name = "static_assertions" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" - -[[package]] -name = "strsim" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" - -[[package]] -name = "strsim" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" - -[[package]] -name = "strum" -version = "0.27.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f64def088c51c9510a8579e3c5d67c65349dcf755e5479ad3d010aa6454e2c32" -dependencies = [ - "strum_macros", -] - -[[package]] -name = "strum_macros" -version = "0.27.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c77a8c5abcaf0f9ce05d62342b7d298c346515365c36b673df4ebe3ced01fde8" -dependencies = [ - "heck", - "proc-macro2", - "quote", - "rustversion", - "syn 2.0.98", -] - -[[package]] -name = "subtle" -version = "2.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" - -[[package]] -name = "superstruct" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f4e1f478a7728f8855d7e620e9a152cf8932c6614f86564c886f9b8141f3201" -dependencies = [ - "darling 0.13.4", - "itertools 0.10.5", - "proc-macro2", - "quote", - "smallvec", - "syn 1.0.109", -] - -[[package]] -name = "syn" -version = "1.0.109" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "syn" -version = "2.0.98" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36147f1a48ae0ec2b5b3bc5b537d267457555a10dc06f3dbc8cb11ba3006d3b1" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "syn-solidity" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d0f0d4760f4c2a0823063b2c70e97aa2ad185f57be195172ccc0e23c4b787c4" -dependencies = [ - "paste", - "proc-macro2", - "quote", - "syn 2.0.98", -] - -[[package]] -name = "sync_wrapper" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" -dependencies = [ - "futures-core", -] - -[[package]] -name = "synstructure" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.98", -] - -[[package]] -name = "system-configuration" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" -dependencies = [ - "bitflags 2.8.0", - "core-foundation", - "system-configuration-sys", -] - -[[package]] -name = "system-configuration-sys" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e1d1b10ced5ca923a1fcb8d03e96b8d3268065d724548c0211415ff6ac6bac4" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "tap" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" - -[[package]] -name = "tempfile" -version = "3.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38c246215d7d24f48ae091a2902398798e05d978b24315d6efbc00ede9a8bb91" -dependencies = [ - "cfg-if", - "fastrand", - "getrandom 0.3.1", - "once_cell", - "rustix", - "windows-sys 0.59.0", -] - -[[package]] -name = "thiserror" -version = "1.0.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" -dependencies = [ - "thiserror-impl 1.0.69", -] - -[[package]] -name = "thiserror" -version = "2.0.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d452f284b73e6d76dd36758a0c8684b1d5be31f92b89d07fd5822175732206fc" -dependencies = [ - "thiserror-impl 2.0.11", -] - -[[package]] -name = "thiserror-impl" -version = "1.0.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.98", -] - -[[package]] -name = "thiserror-impl" -version = "2.0.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26afc1baea8a989337eeb52b6e72a039780ce45c3edfcc9c5b9d112feeb173c2" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.98", -] - -[[package]] -name = "thread_local" -version = "1.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" -dependencies = [ - "cfg-if", - "once_cell", -] - -[[package]] -name = "threadpool" -version = "1.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d050e60b33d41c19108b32cea32164033a9013fe3b46cbd4457559bfbf77afaa" -dependencies = [ - "num_cpus", -] - -[[package]] -name = "time" -version = "0.3.37" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35e7868883861bd0e56d9ac6efcaaca0d6d5d82a2a7ec8209ff492c07cf37b21" -dependencies = [ - "deranged", - "itoa", - "libc", - "num-conv", - "num_threads", - "powerfmt", - "serde", - "time-core", - "time-macros", -] - -[[package]] -name = "time-core" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" - -[[package]] -name = "time-macros" -version = "0.2.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2834e6017e3e5e4b9834939793b282bc03b37a3336245fa820e35e233e2a85de" -dependencies = [ - "num-conv", - "time-core", -] - -[[package]] -name = "tiny-keccak" -version = "2.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c9d3793400a45f954c52e73d068316d76b6f4e36977e3fcebb13a2721e80237" -dependencies = [ - "crunchy", -] - -[[package]] -name = "tinystr" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" -dependencies = [ - "displaydoc", - "zerovec", -] - -[[package]] -name = "tokio" -version = "1.43.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d61fa4ffa3de412bfea335c6ecff681de2b609ba3c77ef3e00e521813a9ed9e" -dependencies = [ - "backtrace", - "bytes", - "libc", - "mio", - "parking_lot 0.12.3", - "pin-project-lite", - "signal-hook-registry", - "socket2", - "tokio-macros", - "windows-sys 0.52.0", -] - -[[package]] -name = "tokio-macros" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.98", -] - -[[package]] -name = "tokio-native-tls" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" -dependencies = [ - "native-tls", - "tokio", -] - -[[package]] -name = "tokio-rustls" -version = "0.26.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f6d0975eaace0cf0fcadee4e4aaa5da15b5c079146f2cffb67c113be122bf37" -dependencies = [ - "rustls", - "tokio", -] - -[[package]] -name = "tokio-stream" -version = "0.1.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eca58d7bba4a75707817a2c44174253f9236b2d5fbd055602e9d5c07c139a047" -dependencies = [ - "futures-core", - "pin-project-lite", - "tokio", - "tokio-util", -] - -[[package]] -name = "tokio-util" -version = "0.7.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7fcaa8d55a2bdd6b83ace262b016eca0d79ee02818c5c1bcdf0305114081078" -dependencies = [ - "bytes", - "futures-core", - "futures-io", - "futures-sink", - "pin-project-lite", - "slab", - "tokio", -] - -[[package]] -name = "toml_datetime" -version = "0.6.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" - -[[package]] -name = "toml_edit" -version = "0.22.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02a8b472d1a3d7c18e2d61a489aee3453fd9031c33e4f55bd533f4a7adca1bee" -dependencies = [ - "indexmap 2.7.1", - "toml_datetime", - "winnow", -] - -[[package]] -name = "tower" -version = "0.4.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" -dependencies = [ - "futures-core", - "futures-util", - "pin-project", - "pin-project-lite", - "tower-layer", - "tower-service", - "tracing", -] - -[[package]] -name = "tower" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" -dependencies = [ - "futures-core", - "futures-util", - "pin-project-lite", - "sync_wrapper", - "tokio", - "tower-layer", - "tower-service", -] - -[[package]] -name = "tower-layer" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" - -[[package]] -name = "tower-service" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" - -[[package]] -name = "tracing" -version = "0.1.41" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" -dependencies = [ - "log", - "pin-project-lite", - "tracing-attributes", - "tracing-core", -] - -[[package]] -name = "tracing-attributes" -version = "0.1.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.98", -] - -[[package]] -name = "tracing-core" -version = "0.1.33" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" -dependencies = [ - "once_cell", - "valuable", -] - -[[package]] -name = "tracing-log" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" -dependencies = [ - "log", - "once_cell", - "tracing-core", -] - -[[package]] -name = "tracing-subscriber" -version = "0.3.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8189decb5ac0fa7bc8b96b7cb9b2701d60d48805aca84a238004d665fcc4008" -dependencies = [ - "nu-ansi-term", - "sharded-slab", - "smallvec", - "thread_local", - "tracing-core", - "tracing-log", -] - -[[package]] -name = "tree_hash" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee44f4cef85f88b4dea21c0b1f58320bdf35715cf56d840969487cff00613321" -dependencies = [ - "alloy-primitives", - "ethereum_hashing", - "ethereum_ssz", - "smallvec", - "typenum", -] - -[[package]] -name = "tree_hash_derive" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bee2ea1551f90040ab0e34b6fb7f2fa3bad8acc925837ac654f2c78a13e3089" -dependencies = [ - "darling 0.20.10", - "proc-macro2", - "quote", - "syn 2.0.98", -] - -[[package]] -name = "try-lock" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" - -[[package]] -name = "typenum" -version = "1.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" - -[[package]] -name = "ucd-trie" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2896d95c02a80c6d6a5d6e953d479f5ddf2dfdb6a244441010e373ac0fb88971" - -[[package]] -name = "uint" -version = "0.9.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76f64bba2c53b04fcab63c01a7d7427eadc821e3bc48c34dc9ba29c501164b52" -dependencies = [ - "byteorder", - "crunchy", - "hex", - "static_assertions", -] - -[[package]] -name = "uint" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "909988d098b2f738727b161a106cfc7cab00c539c2687a8836f8e565976fb53e" -dependencies = [ - "byteorder", - "crunchy", - "hex", - "static_assertions", -] - -[[package]] -name = "unarray" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eaea85b334db583fe3274d12b4cd1880032beab409c0d774be044d4480ab9a94" - -[[package]] -name = "unicase" -version = "2.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75b844d17643ee918803943289730bec8aac480150456169e647ed0b576ba539" - -[[package]] -name = "unicode-ident" -version = "1.0.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a210d160f08b701c8721ba1c726c11662f877ea6b7094007e1ca9a1041945034" - -[[package]] -name = "unicode-xid" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" - -[[package]] -name = "universal-hash" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc1de2c688dc15305988b563c3854064043356019f97a4b46276fe734c4f07ea" -dependencies = [ - "crypto-common", - "subtle", -] - -[[package]] -name = "unsafe-libyaml" -version = "0.2.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "673aac59facbab8a9007c7f6108d11f63b603f7cabff99fabf650fea5c32b861" - -[[package]] -name = "untrusted" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" - -[[package]] -name = "ureq" -version = "2.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02d1a66277ed75f640d608235660df48c8e3c19f3b4edb6a263315626cc3c01d" -dependencies = [ - "base64 0.22.1", - "flate2", - "log", - "once_cell", - "rustls", - "rustls-pki-types", - "serde", - "serde_json", - "url", - "webpki-roots", -] - -[[package]] -name = "url" -version = "2.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" -dependencies = [ - "form_urlencoded", - "idna", - "percent-encoding", -] - -[[package]] -name = "utf16_iter" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" - -[[package]] -name = "utf8_iter" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" - -[[package]] -name = "validator" -version = "0.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0b4a29d8709210980a09379f27ee31549b73292c87ab9899beee1c0d3be6303" -dependencies = [ - "idna", - "once_cell", - "regex", - "serde", - "serde_derive", - "serde_json", - "url", - "validator_derive", -] - -[[package]] -name = "validator_derive" -version = "0.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bac855a2ce6f843beb229757e6e570a42e837bcb15e5f449dd48d5747d41bf77" -dependencies = [ - "darling 0.20.10", - "once_cell", - "proc-macro-error2", - "proc-macro2", - "quote", - "syn 2.0.98", -] - -[[package]] -name = "valuable" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" - -[[package]] -name = "vcpkg" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" - -[[package]] -name = "vergen" -version = "8.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2990d9ea5967266ea0ccf413a4aa5c42a93dbcfda9cb49a97de6931726b12566" -dependencies = [ - "anyhow", - "cargo_metadata", - "cfg-if", - "regex", - "rustc_version 0.4.1", - "rustversion", - "time", -] - -[[package]] -name = "version_check" -version = "0.9.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" - -[[package]] -name = "wait-timeout" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09ac3b126d3914f9849036f826e054cbabdc8519970b8998ddaf3b5bd3c65f11" -dependencies = [ - "libc", -] - -[[package]] -name = "walkdir" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" -dependencies = [ - "same-file", - "winapi-util", -] - -[[package]] -name = "want" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" -dependencies = [ - "try-lock", -] - -[[package]] -name = "wasi" -version = "0.11.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" - -[[package]] -name = "wasi" -version = "0.13.3+wasi-0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26816d2e1a4a36a2940b96c5296ce403917633dff8f3440e9b236ed6f6bacad2" -dependencies = [ - "wit-bindgen-rt", -] - -[[package]] -name = "wasm-bindgen" -version = "0.2.100" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" -dependencies = [ - "cfg-if", - "once_cell", - "rustversion", - "wasm-bindgen-macro", -] - -[[package]] -name = "wasm-bindgen-backend" -version = "0.2.100" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" -dependencies = [ - "bumpalo", - "log", - "proc-macro2", - "quote", - "syn 2.0.98", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-futures" -version = "0.4.50" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61" -dependencies = [ - "cfg-if", - "js-sys", - "once_cell", - "wasm-bindgen", - "web-sys", -] - -[[package]] -name = "wasm-bindgen-macro" -version = "0.2.100" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" -dependencies = [ - "quote", - "wasm-bindgen-macro-support", -] - -[[package]] -name = "wasm-bindgen-macro-support" -version = "0.2.100" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.98", - "wasm-bindgen-backend", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-shared" -version = "0.2.100" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "web-sys" -version = "0.3.77" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" -dependencies = [ - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "webpki-roots" -version = "0.26.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2210b291f7ea53617fbafcc4939f10914214ec15aace5ba62293a668f322c5c9" -dependencies = [ - "rustls-pki-types", -] - -[[package]] -name = "winapi" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" -dependencies = [ - "winapi-i686-pc-windows-gnu", - "winapi-x86_64-pc-windows-gnu", -] - -[[package]] -name = "winapi-i686-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" - -[[package]] -name = "winapi-util" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" -dependencies = [ - "windows-sys 0.59.0", -] - -[[package]] -name = "winapi-x86_64-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" - -[[package]] -name = "windows-core" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" -dependencies = [ - "windows-targets", -] - -[[package]] -name = "windows-registry" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e400001bb720a623c1c69032f8e3e4cf09984deec740f007dd2b03ec864804b0" -dependencies = [ - "windows-result", - "windows-strings", - "windows-targets", -] - -[[package]] -name = "windows-result" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d1043d8214f791817bab27572aaa8af63732e11bf84aa21a45a78d6c317ae0e" -dependencies = [ - "windows-targets", -] - -[[package]] -name = "windows-strings" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10" -dependencies = [ - "windows-result", - "windows-targets", -] - -[[package]] -name = "windows-sys" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" -dependencies = [ - "windows-targets", -] - -[[package]] -name = "windows-sys" -version = "0.59.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" -dependencies = [ - "windows-targets", -] - -[[package]] -name = "windows-targets" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" -dependencies = [ - "windows_aarch64_gnullvm", - "windows_aarch64_msvc", - "windows_i686_gnu", - "windows_i686_gnullvm", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_gnullvm", - "windows_x86_64_msvc", -] - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" - -[[package]] -name = "windows_i686_gnu" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" - -[[package]] -name = "windows_i686_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" - -[[package]] -name = "windows_i686_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" - -[[package]] -name = "winnow" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86e376c75f4f43f44db463cf729e0d3acbf954d13e22c51e26e4c264b4ab545f" -dependencies = [ - "memchr", -] - -[[package]] -name = "wit-bindgen-rt" -version = "0.33.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3268f3d866458b787f390cf61f4bbb563b922d091359f9608842999eaee3943c" -dependencies = [ - "bitflags 2.8.0", -] - -[[package]] -name = "write16" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" - -[[package]] -name = "writeable" -version = "0.5.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" - -[[package]] -name = "wyz" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" -dependencies = [ - "tap", -] - -[[package]] -name = "yoke" -version = "0.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40" -dependencies = [ - "serde", - "stable_deref_trait", - "yoke-derive", - "zerofrom", -] - -[[package]] -name = "yoke-derive" -version = "0.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.98", - "synstructure", -] - -[[package]] -name = "zerocopy" -version = "0.7.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" -dependencies = [ - "byteorder", - "zerocopy-derive", -] - -[[package]] -name = "zerocopy-derive" -version = "0.7.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.98", -] - -[[package]] -name = "zerofrom" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cff3ee08c995dee1859d998dea82f7374f2826091dd9cd47def953cae446cd2e" -dependencies = [ - "zerofrom-derive", -] - -[[package]] -name = "zerofrom-derive" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "595eed982f7d355beb85837f651fa22e90b3c044842dc7f2c2842c086f295808" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.98", - "synstructure", -] - -[[package]] -name = "zeroize" -version = "1.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" -dependencies = [ - "zeroize_derive", -] - -[[package]] -name = "zeroize_derive" -version = "1.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.98", -] - -[[package]] -name = "zerovec" -version = "0.10.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" -dependencies = [ - "yoke", - "zerofrom", - "zerovec-derive", -] - -[[package]] -name = "zerovec-derive" -version = "0.10.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.98", -] diff --git a/simulators/portal/Cargo.toml b/simulators/portal/Cargo.toml deleted file mode 100755 index 93170db914..0000000000 --- a/simulators/portal/Cargo.toml +++ /dev/null @@ -1,26 +0,0 @@ -[package] -name = "portal" -version = "0.1.0" -authors = ["Kolby ML (Moroz Liebl) "] -edition = "2021" - -[dependencies] -alloy-consensus = "0.15" -alloy-rlp = "0.3.11" -alloy-primitives = "1.1" -anyhow = "1.0" -chrono = "0.4" -ethereum_ssz = "0.9" -ethportal-api = { git = "https://github.com/ethereum/trin", rev = "fd0b3c19c20c68059370a51d9b433ed34daa0591" } -futures = "0.3.25" -hivesim = { git = "https://github.com/ethereum/hive", rev = "4408fc1de3fee3ac23acd25a812c117756af2f39" } -itertools = "0.14" -lazy_static = "1.4.0" -reqwest = { version = "0.12.7", features = ["json"] } -serde_json = "1.0.95" -serde_yaml = "0.9.33" -snap = "1.1" -ssz_types = "0.11" -tokio = { version = "1.14.0", features = ["full"] } -tracing = "0.1.37" -tracing-subscriber = "0.3.16" diff --git a/simulators/portal/Dockerfile b/simulators/portal/Dockerfile deleted file mode 100644 index 04e44061a7..0000000000 --- a/simulators/portal/Dockerfile +++ /dev/null @@ -1,48 +0,0 @@ -FROM rust:latest AS builder - -# create a new empty shell project -RUN USER=root cargo new --bin portal -WORKDIR /portal - -RUN apt-get update && apt-get install clang -y - -# copy over manifests and source to build image -COPY Cargo.toml ./Cargo.toml -COPY Cargo.lock ./Cargo.lock - -# create fake main.rs and build dependencies -RUN echo "fn main() {}" > ./src/main.rs - -RUN cargo build --release - -# copy real src over and make newest modified file -COPY src ./src - -RUN touch -a -m ./src/main.rs - -# build for release -RUN cargo build --release - -# final base -FROM ubuntu:24.04 - -# declare build args for second stage -ARG PORTAL_CONSENSUS_URL -ARG PORTAL_CONSENSUS_AUTH - -# set the environment variables -ENV PORTAL_CONSENSUS_URL=$PORTAL_CONSENSUS_URL -ENV PORTAL_CONSENSUS_AUTH=$PORTAL_CONSENSUS_AUTH - -RUN apt-get update && apt-get install -y wget git ca-certificates - -# copy build artifacts from build stage -COPY --from=builder /portal/target/release/portal . - -# clone portal-spec-tests repo. The add command is used to reset docker's cache so new data is pulled -ADD "https://api.github.com/repos/ethereum/portal-spec-tests/commits?per_page=1" latest_commit -RUN git clone https://github.com/ethereum/portal-spec-tests.git ./portal-spec-tests - -ENV RUST_LOG=debug,hyper_util=info,hyper=info,reqwest=info - -ENTRYPOINT ["./portal"] diff --git a/simulators/portal/README.md b/simulators/portal/README.md deleted file mode 100644 index ca24ca816e..0000000000 --- a/simulators/portal/README.md +++ /dev/null @@ -1,6 +0,0 @@ -# Running Hive Beacon-Sync Tests - -The beacon sync suite of tests requires access to an external consensus provider to help bootstrap the network. To run these tests you must pass in the following build arguments: - -- `--sim.buildarg PORTAL_CONSENSUS_URL=`: The URL of the consensus provider to use. This can be a local or remote URL. -- `--sim.buildarg PORTAL_CONSENSUS_AUTH=:`: If you're using a pandaops provider, you must pass in your ID and secret to authenticate with the service. diff --git a/simulators/portal/src/main.rs b/simulators/portal/src/main.rs deleted file mode 100644 index d291beaab1..0000000000 --- a/simulators/portal/src/main.rs +++ /dev/null @@ -1,186 +0,0 @@ -#![warn(clippy::unwrap_used)] - -mod suites; - -use hivesim::{run_suite, Simulation, Suite, TestSpec}; - -use crate::suites::beacon::{ - interop::test_portal_beacon_interop, mesh::test_portal_beacon_mesh, - rpc_compat::run_rpc_compat_beacon_test_suite, sync::test_beacon_sync, -}; -use crate::suites::history::{ - interop::test_portal_history_interop, mesh::test_portal_history_mesh, - rpc_compat::run_rpc_compat_history_test_suite, -}; -use crate::suites::state::{ - interop::test_portal_state_interop, rpc_compat::run_rpc_compat_state_test_suite, -}; - -#[tokio::main] -async fn main() { - tracing_subscriber::fmt::init(); - let mut history_rpc_compat = Suite { - name: "history-rpc-compat".to_string(), - description: "The RPC-compatibility test suite runs a set of RPC related tests against a - running node. It tests client implementations of the JSON-RPC API for - conformance with the portal network API specification." - .to_string(), - tests: vec![], - }; - - history_rpc_compat.add(TestSpec { - name: "client launch".to_string(), - description: "This test launches the client and collects its logs.".to_string(), - always_run: false, - run: run_rpc_compat_history_test_suite, - client: None, - }); - - let mut history_interop = Suite { - name: "history-interop".to_string(), - description: - "The interop test suite runs a set of scenarios to test interoperability between - portal network clients" - .to_string(), - tests: vec![], - }; - - history_interop.add(TestSpec { - name: "client launch".to_string(), - description: "This test launches the client and collects its logs.".to_string(), - always_run: false, - run: test_portal_history_interop, - client: None, - }); - - let mut history_mesh = Suite { - name: "history-mesh".to_string(), - description: "The portal mesh test suite runs a set of scenarios to test 3 clients" - .to_string(), - tests: vec![], - }; - - history_mesh.add(TestSpec { - name: "client launch".to_string(), - description: "This test launches the client and collects its logs.".to_string(), - always_run: false, - run: test_portal_history_mesh, - client: None, - }); - - let mut state_rpc_compat = Suite { - name: "state-rpc-compat".to_string(), - description: "The RPC-compatibility test suite runs a set of RPC related tests against a - running node. It tests client implementations of the JSON-RPC API for - conformance with the portal network API specification." - .to_string(), - tests: vec![], - }; - - state_rpc_compat.add(TestSpec { - name: "client launch".to_string(), - description: "This test launches the client and collects its logs.".to_string(), - always_run: false, - run: run_rpc_compat_state_test_suite, - client: None, - }); - - let mut state_interop = Suite { - name: "state-interop".to_string(), - description: - "The interop test suite runs a set of scenarios to test interoperability between - portal network clients" - .to_string(), - tests: vec![], - }; - - state_interop.add(TestSpec { - name: "client launch".to_string(), - description: "This test launches the client and collects its logs.".to_string(), - always_run: false, - run: test_portal_state_interop, - client: None, - }); - - let mut beacon_rpc_compat = Suite { - name: "beacon-rpc-compat".to_string(), - description: "The RPC-compatibility test suite runs a set of RPC related tests against a - running node. It tests client implementations of the JSON-RPC API for - conformance with the portal network API specification." - .to_string(), - tests: vec![], - }; - - beacon_rpc_compat.add(TestSpec { - name: "client launch".to_string(), - description: "This test launches the client and collects its logs.".to_string(), - always_run: false, - run: run_rpc_compat_beacon_test_suite, - client: None, - }); - - let mut beacon_interop = Suite { - name: "beacon-interop".to_string(), - description: - "The interop test suite runs a set of scenarios to test interoperability between - portal network clients" - .to_string(), - tests: vec![], - }; - - beacon_interop.add(TestSpec { - name: "client launch".to_string(), - description: "This test launches the client and collects its logs.".to_string(), - always_run: false, - run: test_portal_beacon_interop, - client: None, - }); - - let mut beacon_mesh = Suite { - name: "beacon-mesh".to_string(), - description: "The portal mesh test suite runs a set of scenarios to test 3 clients." - .to_string(), - tests: vec![], - }; - - beacon_mesh.add(TestSpec { - name: "client launch".to_string(), - description: "This test launches the client and collects its logs.".to_string(), - always_run: false, - run: test_portal_beacon_mesh, - client: None, - }); - - let mut beacon_sync = Suite { - name: "beacon-sync".to_string(), - description: - "The portal sync test suite tests a client's ability to sync the beacon network." - .to_string(), - tests: vec![], - }; - - beacon_sync.add(TestSpec { - name: "client launch".to_string(), - description: "This test launches the client and collects its logs.".to_string(), - always_run: false, - run: test_beacon_sync, - client: None, - }); - - let sim = Simulation::new(); - run_suite( - sim, - vec![ - history_rpc_compat, - history_interop, - history_mesh, - state_rpc_compat, - state_interop, - beacon_rpc_compat, - beacon_interop, - beacon_mesh, - beacon_sync, - ], - ) - .await; -} diff --git a/simulators/portal/src/suites/beacon/bridge/mod.rs b/simulators/portal/src/suites/beacon/bridge/mod.rs deleted file mode 100644 index adf723137a..0000000000 --- a/simulators/portal/src/suites/beacon/bridge/mod.rs +++ /dev/null @@ -1,2 +0,0 @@ -pub mod provider; -pub mod service; diff --git a/simulators/portal/src/suites/beacon/bridge/provider.rs b/simulators/portal/src/suites/beacon/bridge/provider.rs deleted file mode 100644 index 9756a6bcf3..0000000000 --- a/simulators/portal/src/suites/beacon/bridge/provider.rs +++ /dev/null @@ -1,136 +0,0 @@ -use alloy_primitives::B256; -use anyhow::{anyhow, Result}; -use ethportal_api::{ - light_client::{ - bootstrap::LightClientBootstrapElectra, finality_update::LightClientFinalityUpdateElectra, - optimistic_update::LightClientOptimisticUpdateElectra, - }, - types::content_key::beacon::{ - LightClientBootstrapKey, LightClientFinalityUpdateKey, LightClientOptimisticUpdateKey, - }, - BeaconContentKey, BeaconContentValue, -}; -use reqwest::{ - header::{HeaderMap, HeaderValue, CONTENT_TYPE}, - Client, -}; -use std::str::FromStr; -use tracing::info; - -const DEFAULT_PROVIDER_URL: &str = "http://testing.mainnet.beacon-api.nimbus.team"; - -// The consensus client for fetching data from the consensus layer, to feed -// into the test network. -pub struct ConsensusProvider { - client: Client, - base_url: String, -} - -impl ConsensusProvider { - pub fn new() -> Result { - // check if the PORTAL_CONSENSUS_URL is set - let base_url = - std::env::var("PORTAL_CONSENSUS_URL").map_or(DEFAULT_PROVIDER_URL.to_string(), |val| { - if val.is_empty() { - DEFAULT_PROVIDER_URL.to_string() - } else { - val.trim_end_matches('/').to_string() - } - }); - info!("Beacon client initialized with base url: {base_url}"); - let mut headers = HeaderMap::new(); - headers.insert(CONTENT_TYPE, HeaderValue::from_static("application/json")); - if base_url.contains("pandaops") { - if let Ok(val) = std::env::var("PORTAL_CONSENSUS_AUTH") { - let (client_id, client_secret) = val.split_once(":").expect( - "PORTAL_CONSENSUS_AUTH must be in the format 'client_id:client_secret'", - ); - headers.insert("CF-Access-Client-ID", HeaderValue::from_str(client_id)?); - headers.insert( - "CF-Access-Client-Secret", - HeaderValue::from_str(client_secret)?, - ); - }; - } - let client = Client::builder() - .default_headers(headers) - .build() - .map_err(|_| anyhow!("Failed to build HTTP client"))?; - Ok(Self { client, base_url }) - } - - pub async fn get_finalized_root(&self) -> Result { - info!("Fetching finalized root"); - let url = format!("{}/eth/v1/beacon/blocks/finalized/root", self.base_url); - let data = make_request(&self.client, &url).await?; - let root = data["root"] - .as_str() - .ok_or_else(|| anyhow!("Root not found"))?; - Ok(B256::from_str(root)?) - } - - pub async fn get_light_client_bootstrap( - &self, - block_hash: B256, - ) -> Result<(BeaconContentKey, BeaconContentValue)> { - info!("Fetching light client bootstrap data"); - let url = format!( - "{}/eth/v1/beacon/light_client/bootstrap/{}", - self.base_url, block_hash - ); - let data = make_request(&self.client, &url).await?; - let content_key = BeaconContentKey::LightClientBootstrap(LightClientBootstrapKey { - block_hash: block_hash.into(), - }); - let bootstrap: LightClientBootstrapElectra = serde_json::from_value(data)?; - let content_value = BeaconContentValue::LightClientBootstrap(bootstrap.into()); - - Ok((content_key, content_value)) - } - - pub async fn get_light_client_finality_update( - &self, - ) -> Result<(BeaconContentKey, BeaconContentValue)> { - info!("Fetching light client finality update"); - let url = format!( - "{}/eth/v1/beacon/light_client/finality_update", - self.base_url - ); - let data = make_request(&self.client, &url).await?; - let update: LightClientFinalityUpdateElectra = serde_json::from_value(data)?; - let new_finalized_slot = update.finalized_header.beacon.slot; - let content_key = BeaconContentKey::LightClientFinalityUpdate( - LightClientFinalityUpdateKey::new(new_finalized_slot), - ); - let content_value = BeaconContentValue::LightClientFinalityUpdate(update.into()); - - Ok((content_key, content_value)) - } - - pub async fn get_light_client_optimistic_update( - &self, - ) -> Result<(BeaconContentKey, BeaconContentValue)> { - info!("Fetching light client optimistic update"); - let url = format!( - "{}/eth/v1/beacon/light_client/optimistic_update", - self.base_url - ); - let data = make_request(&self.client, &url).await?; - let update: LightClientOptimisticUpdateElectra = serde_json::from_value(data)?; - let content_key = BeaconContentKey::LightClientOptimisticUpdate( - LightClientOptimisticUpdateKey::new(update.signature_slot), - ); - let content_value = BeaconContentValue::LightClientOptimisticUpdate(update.into()); - - Ok((content_key, content_value)) - } -} - -async fn make_request(client: &Client, url: &str) -> Result { - let response = client.get(url).send().await?; - let json_data = response - .error_for_status()? - .json::() - .await?; - Ok(json_data["data"].clone()) -} diff --git a/simulators/portal/src/suites/beacon/bridge/service.rs b/simulators/portal/src/suites/beacon/bridge/service.rs deleted file mode 100644 index a764e11f50..0000000000 --- a/simulators/portal/src/suites/beacon/bridge/service.rs +++ /dev/null @@ -1,130 +0,0 @@ -use crate::suites::beacon::bridge::provider::ConsensusProvider; -use alloy_primitives::B256; -use ethportal_api::BeaconContentValue; -use ethportal_api::BeaconNetworkApiClient; -use ethportal_api::ContentValue; -use hivesim::Client; -use std::sync::Arc; -use tokio::{ - sync::Mutex, - time::{self, Duration}, -}; - -// For the sync tests, we need fine-grained control over the data entering -// the network. The portal-bridge isn't great at providing this flexibility, -// so instead we have this mock bridge service that we can use to inject -// data into the network. -pub struct BridgeService { - provider: Arc, - query_interval: Duration, - latest_optimistic_root: Arc>>, - latest_finalized_root: Arc>>, - trusted_block_root: Arc>>, - portal_client: Client, -} - -impl BridgeService { - pub fn new(portal_client: Client) -> Self { - let provider = ConsensusProvider::new().expect("Failed to create consensus provider"); - Self { - provider: Arc::new(provider), - query_interval: Duration::from_secs(3), - portal_client, - latest_optimistic_root: Arc::new(Mutex::new(None)), - latest_finalized_root: Arc::new(Mutex::new(None)), - trusted_block_root: Arc::new(Mutex::new(None)), - } - } - - pub async fn latest_optimistic_root(&self) -> Option { - *self.latest_optimistic_root.lock().await - } - - pub async fn latest_finalized_root(&self) -> Option { - *self.latest_finalized_root.lock().await - } - - pub async fn trusted_block_root(&self) -> Option { - *self.trusted_block_root.lock().await - } - - pub async fn start(&self, stay_updated: bool) { - let provider = self.provider.clone(); - let query_interval = self.query_interval; - let portal_client = self.portal_client.clone(); - let trusted_block_root_val = self.trusted_block_root.clone(); - let finality_update_val = self.latest_finalized_root.clone(); - let optimistic_update_val = self.latest_optimistic_root.clone(); - - tokio::spawn(async move { - let mut interval = time::interval(query_interval); - - loop { - interval.tick().await; - - // fetch latest finalized root from provider and update the local value - let Ok(trusted_block_root) = provider.get_finalized_root().await else { - continue; - }; - *trusted_block_root_val.lock().await = Some(trusted_block_root); - - if let Ok(data) = provider - .get_light_client_bootstrap(trusted_block_root) - .await - { - let _ = portal_client - .rpc - .store(data.0.clone(), data.1.clone().encode()) - .await; - } - - // fetch latest finality update from provider and seed it into portal_client - if let Ok(finality_update) = provider.get_light_client_finality_update().await { - let _ = portal_client - .rpc - .store( - finality_update.0.clone(), - finality_update.1.clone().encode(), - ) - .await; - { - *finality_update_val.lock().await = match finality_update.1 { - BeaconContentValue::LightClientFinalityUpdate(update) => update - .update - .finalized_header_deneb() - .map(|header| header.beacon.state_root.0.into()) - .ok(), - _ => panic!("Unexpected finality update content value"), - }; - } - } - - // fetch latest optimistic update from provider and seed it into portal_client - if let Ok(optimistic_update) = provider.get_light_client_optimistic_update().await { - let _ = portal_client - .rpc - .store( - optimistic_update.0.clone(), - optimistic_update.1.clone().encode(), - ) - .await; - { - *optimistic_update_val.lock().await = match optimistic_update.1 { - BeaconContentValue::LightClientOptimisticUpdate(update) => update - .update - .attested_header_deneb() - .map(|header| header.beacon.state_root.0.into()) - .ok(), - _ => panic!("Unexpected optimistic update content value"), - }; - } - } - - if !stay_updated { - // Break out of the loop and stop syncing from the provider in tests where additional updates are not needed - break; - } - } - }); - } -} diff --git a/simulators/portal/src/suites/beacon/constants.rs b/simulators/portal/src/suites/beacon/constants.rs deleted file mode 100644 index 35b2d58a4c..0000000000 --- a/simulators/portal/src/suites/beacon/constants.rs +++ /dev/null @@ -1,46 +0,0 @@ -use alloy_primitives::Bytes; -use ethportal_api::{BeaconContentKey, BeaconContentValue, ContentValue}; -use serde_yaml::Value; -use std::str::FromStr; - -pub const TEST_DATA_FILE_PATH: &str = - "./portal-spec-tests/tests/mainnet/beacon_chain/hive/test_data.yaml"; - -pub fn get_test_data() -> anyhow::Result> { - let values = std::fs::read_to_string(TEST_DATA_FILE_PATH)?; - let values: Value = serde_yaml::from_str(&values)?; - values - .as_sequence() - .expect("unable to convert test data to sequence") - .iter() - .map(|value| { - let content_key: BeaconContentKey = - serde_yaml::from_value(value["content_key"].clone())?; - let raw_content_value = Bytes::from_str( - value["content_value"] - .as_str() - .expect("to find content value"), - )?; - let content_value = - BeaconContentValue::decode(&content_key, raw_content_value.as_ref())?; - Ok((content_key, content_value)) - }) - .collect() -} - -// private key hive environment variable -pub const PRIVATE_KEY_ENVIRONMENT_VARIABLE: &str = "HIVE_CLIENT_PRIVATE_KEY"; - -// trin-bridge constants -pub const TRIN_BRIDGE_CLIENT_TYPE: &str = "trin-bridge"; - -// sync constants -pub const TRUSTED_BLOCK_ROOT_ENVIRONMENT_VARIABLE: &str = "HIVE_TRUSTED_BLOCK_ROOT"; -pub const BOOTNODES_ENVIRONMENT_VARIABLE: &str = "HIVE_BOOTNODES"; - -// Bootstrap https://github.com/ethereum/portal-spec-tests/blob/master/tests/mainnet/beacon_chain/light_client/bootstrap.json -lazy_static::lazy_static! { - pub static ref BOOTSTRAP_CONTENT_KEY: BeaconContentKey = - serde_json::from_str("\"0x10bd9f42d9a42d972bdaf4dee84e5b419dd432b52867258acb7bcc7f567b6e3af1\"").expect("Failed to parse bootstrap content key"); - pub static ref BOOTSTRAP_CONTENT_VALUE: Bytes = Bytes::from_str("0xbba4da96d4600000814453665c4b46dad568d69d0a3d211c70829ce7c5c17549713ed0996c8743e6b55b3797ea19c0eebac07b0e163fae9aa71bc2561705e492dd206730e8d7e731e621d2d7039ded027d9910bd41b23f642c609986a33f46fb3187faf6a0abc1809811c919b69e9ecbe5c129e3bc6cc6811de879149bf856984cc2a5162aed445600abaccb10a1b48694f150de473b893184c8200c822abc86d3d8d3bab7918b55963553bf9be9d2144a36827db66449e2302a49c72837b3e793666321ffa0a45089cb5f6af2380686485c4a85aa460dafff2c2681ffc4dd2a57ad488e53e904734908fa7759d18edb7e58d54ae6565774b607fd7488f013b6d02cd13beb3ed2a41d983f02f7eeac4b7f4222474252ef4538b5b09c3fe7ba6899412839fb79588387fd75faf7225e9dfd65bb46a795929d1a6a83113cc89c390ef293f9b73f336157e2f4abd6867a7a3aad6cb0472e1f17a73f913822642688fb28944b9df775593ac8a77bac24608066588ffc11a91b0c85d3f078be13ff586f7cdc20a23473f7a8c800c039edaa2ea42e15be9dbd47638ff4389b0a4e7daebe365aaf47ddbc16d3737ef8f4ed64da4ff89064056a794f9232ab744f72c5ae7fc674890d07027dc5541eaaf8dc1edc8d8fb4d5c763053a53697d9e5100ad9afa1e9fc888cf1197ad56d34d0f290b5d73dcb191ca444671fa433332f9d451efa4623ccaa1ca061827b86eafc6f771e184c48f4a3ab88c44829cb86aa86516cddcbe07bb52957e926dbb7bea95e9adb19ab3f99ff83279b5e41dd5cab1b5ee617340c8b46536a4e0b60d7235423760c2a72910dc838457a5a6c2d96bb1fe3c8b1cc292af040bcc5fb030d407a283dab7cf28b5fc8f651afb812b2b138c2dc05c2606320fd82ebe8ca7843ab0058ccdbdac8395bd65df3327fcbe1d8ac52b5e8e8970acf53a46d1ffa4ef16a472e24746a05f13399a7613a2b483855e7d67348cc8b51afec047355d3ba2a1f19d1e2fe3ee7b5137b4d0d257942118700ce0b506ee1b8b0c542ac600ffa734a960b60c13e89d3f60c5de14e3a557159326ae0eaa2328ee3d57ee2406ae9dae30d2bda566d5e22a2bf051a5ca0485b32edb939b949a967d315c0b771ae169433c6b683e0f58e5a4d874e4577d8ec74ee5466491a61cbd96f3d8ae11bb3d5818fda22b5f7914e82ff54d868983315df52ed8ce53b438b6f147343af4508813063e68b6416ddeb0eb0de1c494f0b40211bdf757919a28ef984ca6091f15f5953e0c8250fa5cfe4f1f5e54acd9faa8b5efe29a5daaf0494151b73f6dcc9f8b08558535b1b4887d275cd3feac9424be96efd63191c6fadebe8825917b58a7a286cbdba16cb3df97f1a94c1e41260bc4980ec4ed34032e8c714fe1ff769f8a79217a4a25c1efc38714c68eee4b7f8088e75fc044349471caa4b7fe94793d82e46e81f7bcac3ee933c043bcafb97882ee20d9d45d7c459934926b3079411afea06ae8cba6f092824313ca9998e067051b638b77ea5b90fb69af4ccc66218945554d9b78c3a5ea25d7e4eb9d68bbb40cb99176dd8ced6478af77e10570e5329683d66a2dcddfbcfac27f44ca51e7eb5ebe686e3bfae17a8415a2a13b29149c4392e4226a31225ba4af8df06e20d34c0a0b50376c28e0ff61f55588f8d77e481a3bda3eafb6af54015a2fe2b85c1292d883e4b074123a873f7bace327f77b37239841b1849e87fcd9f1f4c0b5e02ebaac21e3fda7c1f6e5c0bbde58071ff0101cb20fd117b265a8e87063f0b4c0ae6342af61107c2c2d0c9a68b39e8e609dcaea876bb2257d5c5a1e09c0451782ad560b8be7489a4c1e446b1fefe710d1b5d5fb2960d05e931f6fe0b6b85d4a9d4609370308774952614e889827eb7fa6017d5ab5285494620d2a3ead19245e4b6d389d503e7fb3faa7d71eaebd63d106bddee15ccbf80221a12d4cdee182fdabfcb8bd84db3e84cfa6b67d20ba17b7f96f2c9a5206dbdb251094ea01b174f664e3ecd145b876db7b5f900e23ff823e32cd19ee8a2dd30265e196615c6ce66d688fd344d68ffa7a7ad53e1570e5849d06a9d35c26cd41edfeaba7c0fffa5e2e017876d4a10453c906ac9f569ebe129692d49e6d4bfa42a4fe8f0838fcba8107576fa0b970433e1930c575f5827593bacbf77162a8187f7befbfc427bfca2273d24ddc67d7dea6116a1f25a02baf10460040120b6570c01b69a742d260351e64c1911daa80a4c8ca60e2c94b275c864f76a27f8edd99ae770d666f359cd4596978bbc50151ef313955cd867e9b1d4a76d501bc9999c1a5390cdc76333912ed4a3dd34290669a44392917052b1867d68f5ddd332f64e380d4631ded0ebecb92d09bcd7ac2a6f5f39e251f6b1070d614f716e2fb95d9f26aa8b1f8f201e6d473b2ea2624eca1cf297934720ce8e708b2cd1b992a9296232cda34f470a6d79f0ae5f2025f893bd15028988e14dd8074ce97010091de70685584e28bee1963f58a262c85df328377cb0c5cb3f39fe568684439916ec121766afe27abe8fd25ed47c06700b8629f27be989ae3e439aefec3861d3ddc2eab0281868e35001e26f98d7bff81c63c22ecbfb48060d0d8d1235ce28d9080dd2de2ac0408d583b8567309c4dbb0318dadfdeca8b8815fb08dd266955a05101c8a2432530535333ecdfb4f428eed385fb25a101c10a1f06e0d921978f3ea9f999459c488dde6035c1a6eca88998528f8e144b36320d6bb688450c9d394c3089d509cc8a906abb6c43a8b0537707c5bf7b1a9a7e573829fa3c9a415fb0001ffa4b4227e15f1e1f22d65996933cdf20ce49ceff76834f690caf6e012e209e34a4e814ed62d25b66424d5a788a4efc7aae897eb12ae3e51665f478332181fd04a995696afa831ebd6056629bc066cf36ddc88381d3c88fffd68e3cdc1fd9b06105066119994ae81040503f1f0a10c4153a11d1e609adfb9018431c31c1ff2807faab0e7af0239488bc063dec1190981964affee89ab22faaf23e3c24cbcc7d769e7102208d576bd26a640878650ca345aa680befa367dd105b3ebfd99391d53c66afd6154cfe7dd8813fe39059e8dc5027924e25cf94d13a9fa4ba1f16cfb442c8a8d3f898d141d9efae49249fab1d05cb3f9fb900aa0ee6aa232911822e0c17998201c896ee15deff92aab0c34413d132ab731c682c9f3b3d745e6c5e18e673c16a56c4646ec0c2ca04654bab28bb7a5ca579a9170ba9ff3e5363bce737acfdb1eac18377e33978ae4a82dba9bbd4419221e58a10ae80f91067754051ad9c16606b72752f43ecaeeefd9f0af140d0d4461a3d890cb07cbe2a9b001571001fefcc7f0e1b92abaa097e1566d5340853515a15fe4256b83ffe2b723e60e206b75f27ca1b99b1164484197d115a93f85aada209f8ab8a31ce3a66f23c820698febb8e95ba96ac28fca74bca0d504dca4cdba7e85bdaf7fef7b0f17d4b6fafe4c3e9810ee9fc1a83466fc3875eb8e22b2ad6e068b9b18bd9f60f9e66f823cc52a2ea0eea5a1c3e7756d82811c9da030bbc3a51c1150ca8cbf5ba38b106b185e0ac4331e8a0d653a66cad60427efc8b7dbdb817999e346152c197e1b2d61a5a9d7f2ed328aecab1ffee39b76c17dd3577cc399ac7c7e1cc48e4fac0aacc1451793db4f91b593f0ca06236425417238ea6d40e1837a9928af864d8b34fde1cee5bc2bc7e69bb9908c8de49df8c821f0fd6b497657b4ed5cde9502e86ae3e6f7c15189a96b31d30f59faa760de83831397c7f99cfc7e23f2687aaf2ae64deba1902f491299ae927ed9c10ff485f576cef160dd32c11e33003c9eaf468db444bdb715d97acc8df5e08e6aec88d91f747e897fffad73af7e05b0c5cfe23deb931f489763e876088841e9d7358c94619229ef27149b51f0a322200c103e80588e1f6f31a47f40b3b858d0995af11b99d7baa4c7cc145d58e14c240954234e32691001e9cdcde67429cad3962f37fd84a7c61857540799b8ff3d3cda254ba05880e680230712a0618054dd0c89b862e419172a0282277865a2dd45e14a49e31e73db870d70f238a29546e54eb601cc76b8837ceea671faa84f096bfb4b7eded007e12d2efc4f9ff8a421b2000a75c5a01695ab33f027429361fc9f46d0bd883d96a1f9b4b329a9c7256e45f13a298590c0ad15e3c16c73b541bef836e81ba5e18c844c1165fa23932c40287257bedeea72af52893990bd5a6bb57df63a2b6a1565680945f87326e38508918c0020e7f8cc2a26e381e34d8197cc45e0dfe975331d65494aeabece73b741ac9b192e930439dab6b62b91a9dac9f909d78111dd62a5f0561f5f47a9a60c5d55f309ddd4b7b94efc87dfab8effaba010041abafb8757d0f681e1a25939cc5ecf764bd83f2832653feaa0a18d86336aed2c73c84199afdd03171e74fc96b865d0bf7f4f5a54c15c823f27b209b5d34b64cedc5baeb0184b2d9524b012a2e4fd70dd539db32f6964c34d16399a16c5499597423149a97723cdf5b5deb33693d456213793adbe52ec75ea8934e38ecd9299ff8d57ef12e9b4e14806d103954b86321ea42aad93daf0ea876befa5bc2a7659b3608e9efff93a7b5201478798d65d892aeae9ded2fad2ea4007c0cfd35727d44f8ca4c7a52b4e331621e7dab1aa1f7aec02c7e7c3ae36489b421042a9f331cc609990c589f1048c10d1ff1873e9a871477ec91acfbdedcec1cc83e70447a117325ab16b1a69389f4f786acd857064e82ad1da1257e3ed9820be84d6972a5f90ccd96c6409124c845a3feb23a7b862dd28e094e2620ecc39fb590e6cb7444e66f202cf8922ccc47b807776a672aa35e4434e27ba331d0666ee19b472556951fa250b021dce47ac13a33264fcb87597ce6a7d66391d19da9758ef1ee7d19e1f774ce54c5e92a487735cbffd941210fcfc8c42b7af9fcbe376863e4e919916f0d0ccf8fd05d1d7b3b41401864f4c179bcbdfff434dfc4dc4171d35ce0887a0ac8e3d17f150411a09a74e02e47fb8f537f3add4377e0381015a79a5fc12fd86b521dde790030f0ddc7cc34305c0bc5e9e3b22460d405a3cf28761c0e7ada75fc69d11430c04bf856870b689e40491f49f76d18b6c62ee4a4937d2506e5658b2e71adf7fc9aefe03e6fedc0251a99760209fdad863928ff8050c39c8abeced80ecdb13fe10f0f65045f2e2d41958e49bbb4c4fc1c5fc15fddc7644e5366cb4e4416bb1a6afda3a8bcc5f7c51ff01135f7643dabe355f4cc241943521cfd15ea8c2e51bf44e17354353436ea6059f90e393790af9a011bda79f84675f83d3e4ab18a7530369a953490c20ebf4430a5398bf4738abe51a6e43974999d316259501c60c8d3a4efcbe8177833c67658921351d44588c2339704b9d6bcbe30f95b94328cf423be2fd387321e447dd5571a0c1992d091f4397fc47a835e25c6355488cbf4e2a06984410a8df4fb8bf596927531d59bb74f72e147453de54b4b82c99b836fe255878b4156eca6caac99209c9f0054f32c2138c9ecc834a2640d8ea4d6cb521bdc12f12d055774414ab86f995032ef0bf03ad45f1403161b848bd4ef4400e1778f32f5cba7274ffa117a1f3c96fcd6f0e387af6302ce40ed69cdb50b88c76388a3b80c3954c710f6617e44a986cd65909ed542614c1c6f80da78461192553d6e077e9bf8ea20b6016cdc0c995ae07bf473df39af8d0dafa160f252d58d394930d46ef2b2f0a7d1e48d8ef2aaac8a9ec0b7f00145922883de52436598fdf1fba9f1283d31b70ce0ae4daf3db610d970ec2582863e40458de4bc082dfaca451d756ef83a93baa3fa37b3f82ab8cdaa487087eb9175d846a789099e344b2ec58eac67185e6305a81f5f691330fad31715f8fef45e835a9da43a571a016a35bae46b3415ac704c66bc651fe079c797786e047187eb8c3eac665b521beff69db528d5a49568f2eb0030ccd6d5e19ad4adfb271ed46d44024356808f77e16573c4f0aa225694857c34c5f00bcae4ff15c91bc5917502dcb84b78f04e2627794268b54d9a670f0b97d9cb3a5ec637c0eb9f0922a70ba445fcc20710c56b7b05b902262c081958163c0036ddd7aca4daf4814ca4fb003b3f59a76adb7390155e0dd635b8c04ca59be1a0768463d94f49a021efb43645da70770e4b2f4d00bacaa91df4572fdc8903ff47df32da286a5f14a3ed8717e537b640aa123f6b64e5db9ea7e3abe9907fca059493075091e10815eb342b85326d35a5d978515882b8258c71ad6eaf9eebac6ef8284e4d7925d40b48fb1c4ed93ab6b4bc06411cc178e8ecea37cb50a7bea428417ab63dfa931f0885ac82f5330764294d0297003418e70fdc994adf9d0f23486520b8caa560e8c78251fe9c95861a45050797db4586e18d968f6104dc18c6dcb6652ba7f5f8504a76cdbd56c2fd9bb5c3b33384ff6718e9cf70fd97b62a4a2384807a6d5e9151e890ebf9e797c61b0eef785cf25b6e1f930320cf1ed97cc43490f3318d74cb4a5835e742f8ff9abba5562e791eac25fd8450b4f5458fab279ba50b06e2902d04d1f63dd6d08f515a87b1f13822f7fd88e464e384b2ebc91c2ff0a834655c632b5b7e3099132fe6adae081fa6d756e57949bdfaf00a3474b5b4b47442d160c66ad76d9bb755b144f49553feac5e772dfcaa944a31f4ecfe989ff4dc092525d7e95eeb938c87e22de2e18de8891db8fa0aff02dc0c936ee1c5846f454e6dd5a2a8a84111f213242ca48ec4a0ca42de208114b425884bf754f9891a511b6e149009346e2978a89df0394777a636bd6d6cc91cd06cd1395d9c42cd5f278e1ed46ec4799910d6ac90fa9fc346a09a83a27a096602b4269da59eddd4ae1c2f3f30cdb05131399cf3c50c913c683ee1a95ae748b674ccd3ae95b037aef9c98bc4693eeb2c68ec35bad4dfe85ff73b1df1584d3c99ca62f44bde2d01b4a1a20ed9e8309042005d373d3b93bfdc4ac7899a2f4fa9498275caa522098e7ac5d756414e3acbd875643c2525229105cd82a32669590f23573755c92518134dc29ed20ff7391a7d809a4a90d4f3ccd98417306079861565f24088c9f7145f44093f6dc62ed87b0b877110d22048df35d11a9c55f0242a1a4671ec29a9089afd2f394cba94281f8c21f56ae82332b7b04a61d99762498993fef839a27bcc305b47f0746f24394920e5ecb28ec54e49e6a6207c63fdf445b561ae777a5af4717bf84bbcbfd27b47f5a72308e46589dc13056956be4ae308bedd8e7e8f0e796679de5855aca48d26dad61e97f1b66681ab7d3277c7f77e1d69643db6ef966831fec812c326dca60b33f317a1cd6d055aecdc40bd5bd2199ab738595dc59d4fa794d63d7758c06a4aac989686cc8abd3c63122f089cbf5398e933313ccdd960903eb597954b2749b848056b996f5949ed81acead2823d11de1925c547b07fdd7a0764e65d42ba4cfa5277424bd750b6dd6a446752b4b8821949fdd4460c3ef0340de7e9687f468a9b77105354b55bc5eeffba2a27d845f79b7396446353efa313d4422bea82d8bcf95897b3f15aba174e91059115e5e0bd02dd9aa92397f35a424e925c297d70be682f17c470035b58ea2f17703c86333e5790dd1630559e4d4a0313cf7b069bb2467ed1a53f4ec4e2587c49d582a4b21ea988e620b91bd4647297050d64aec86b628bcbafc2106ce8c6e8f52101c0fbce580b18b309d3fafef0c81a3f1c7ffc66585b007270b3868a45bf9168ecbf82489324ca7c1feb0f99b27f9d9a294481c95d5ccfe1dbc888d1e2c4c506d375cbc89925113d25c47ffdf60818744c832a7abc4ab36dfb4a13dff1d2830e9e6fe3fb843a442303b1eb8cb8778ba9b3fbb273a8a91f5e19e09fd2a37738aa63fd26a0b630bb3b36c219b79831562877b484273e72c8b4320ab00d328c3bb1854c99b6aa8e2ee69d767cd5a205c8982ff75ce1a7a46cdde1651e3f8f1bd79ed3eb595e9efe010d59ee3c3fa9470bb03c285389790f8ab442884e4d64b0a479066e1f62f2a1561e0012e44def9309af5566e94d68e4f5ce455ba4f9afb0e662287f87b5b96e0b215a1b9baeb8fb46a52e711afacd1ba7bdfc50e1ff7305ab07264186c83ceb77cacf008b6c10d56fe1f4610cd05844f7e44af4f08e7d7d0e8f55d0f3734956fc9287e2a8294102c2d97ac21f9d741b32c3eb9086bde7712e164865bbf1a84f14d48e0b38f98ef54f06af33c916db45e6abbe3370c9e47c5a5f5cf73b4b784e47bc3f5574155c804c18ee4954f7e89c50ae9ba4d03123093a6500ded8a6118f7dca1fcf62614e68f38d2e598c54a065f228eef188cb7aaf1f41df6f3d4d788a88d204e9e285034a0c6c5b6b894e232b844a4696a3ef7d8f0811e32f6bbfffd557dab2b588eb918d8443d0a9f4a7c82b42c275bca9865e7ac38ca3e49dd150fe2f01fa8df60d6f581f050b3bbe0ef416ff657db803c0c4995b9b871a38a5fab90bb90732766d35452dd0ac64971d75a65d744baf6ca2340c26934f6527c29665ef128f17c20d8c1fcca12fac9d898893a664c600896a922ad526c6283050ae67863d2ec2f47eb01b1a3e19531a2213078edcbb953b57fe701f0445e95b6a78e45d1ba06e3b9077847e1017f6085f75d3bf0223c98fd32000d555b73e6c51ab57246e15d22531693894f793cd27d8fb68355030b0f7a357ab43192956b96afc377de9b07c41d30a6a23f461c47f40d5e2a023795c06fda75737e2a5143d325b86d62aee8500d1a76c1a96269817f465ed46b40140b7d892b68ab40d3430cea6f598b8279625deabc631a7114e99e43a36c83fb7d37a70d742d297b973fa7e0caf2b47ac62f0750e0c22a59ca5952ea74f0b59e16a1e3ce1b391f1a9f28345da7a5f0b37064ab736772f7941bc9b7c758a4c56f1fb5455ee551f5e9e02e8de051e339bf90ffbfa75c45319cad15e2c5aa87b98b604568dd1eb46c9b92d553c5c4268a1a2e44707b3e6538ebdfb5f504e73fd80b0d971a6c280fbf80a35a4723b9e1db4566ae59354322f6a6a2ef45c60ac12ea88edb34c90fbdf7b8bd8708cab7bd1a0b29be454c3479f2629c5018fea8285f03390c355e0accd89f6824d449a38e6d0a2ff8690da806ee42530867b3f363b3d49e738df1563c5600702ecb5bab1726ba55fd0d4ace1581d4f4108368b24fe4d4090b371052098c4974faa7e46e82cf07589822a39aba6b03c2f19746827fc4d2f2ba82df5923d5e2876872d840b657bb2646c9713cd61a83510e5d00a754fd43eaa7fa3a2509a74bc7076096b720b73ea207b4ca9aa638b78f4c0d4a4257fa3d3de17c30507af0a058d99db8706820cd18dad632b954374503edff3191fcbfc5b2b55be2b0b7504de5fe097d97147f788b55f6332331101ad4204cf5b18173d4d0809c7d9eec152c5cacc981b25c8aab74e3adfc472fa13e6f6b3212bf2293f96a2482ada1f4ef9dc524c2499e970eb4496da67b6948958f998dcd398b3aed89d5943d1529ffe74cb7a7c2df90043a24ec03fb8adfd9ed6cbec980b54d199f665e755060c796c9351353a23aa988ceedc8cee0d73be4ed1e3fc765edbf7d8dd5e102cab4181e53ad02a5fdcca3c534f9110e4e7f292f5f4aa5c3fa49ab9877cd3b1c6196f62ccc3f8fd616e08eb364faee03e79b96212a1f1887b85b3502ab1cc20df3480d71aa3db7f60ee2a3167ca7a530698c998ac2352f5043b632650175dd345a3bb805c2fb200eca4612732d72fca8a5501d73777b3bba9cc398f16ef01998e922d41ba8b0bac453b80d453b7ec869bd0d79e9a87cbe0fcbaf47a11849c6695f3b877ec1df5cd248bfb2296192da2af337d4767bc3008ae01b8228d94efd3b1adec17a5f9b2a12ab50175246356edd18bd8d5b363d1bdb7f58943d8bd84d91f1f324a74c654c6307450612e94635ff12c03f08ac4d9602e231bc81eeed25901c51e8c786f66448774e8d79492af9721ddf0e37a9c168287307f2b519864c2f897fea1d8a4b53bcc9b2c5ddc91c84b8c8b090a09da8fee5f148abef2304a840444bc005dd7652b89ba5576f6481891a8a71397348ac7829bf53e3c58e5e095567ebbc9848aca8f2b8d3b6c09af750a10f6a47bcc6a45480820742de945173cf4655d93916154597d1b8de6b5b01f18db2ff6176f0cb89b68f62a1bd48bf7ffb44274c599670ae58084d57d85f244811901762194be0023975a453bb177f136ad9495e9f24b0a781da39ab7832855952722ed031fd1820aab81752d67f23f30a6e3301f3729f6cb068ec65e1ceddeec8b2c163e8624f574a65cf8e7b81570277a08e035407611bc2b136459c96dc986f140dcca94d6c69784c79ee9100ec11d240f95c7920652b63d056b35fba4582471c23a9e5dfbd717a689d9776fe49d1f8ef8fc43b530597b6cc734edec8aaf1c19138f7c65b21766ba935b11ae420d2fd0945cf46e15868805dcbd39a9223c32176cdcc19f49db6ee857aa5b6ec01185255871c4f65edd837e51082cf069fbaf7c841f13eb91cf801ad1de660a0acd43fa5b2a7c49bcc61b744b05d25cc605c81fbfd829032ac6bfb8f328685938eedc8919de180badaf8980ca0745b79e18bfaf31ca778080ea486602c2f9b80db583b32c07353f23b31130770b37863f310ac5c5a9560b57430fbf5fc37359e66735c5867012f7059418714a76fa7c5cabb914f3f9531e4c8a0ff7f8bb5bc7b263660982be7e50e565c0ade5633d94f5de6c71ceb4af1ca4ac2137bb7c02f34d88860e312681e195320727fde90f17f982d04076ab3fdd2357fdc2037db0ed17506f194426e43b065b70ff8460a6234a93d0a5c54024e1c7593815c108cf6d545718b06178fdd7dffdafd222c94f649948e1290cb85f8b166d82b7ae97b3e3dfbf3d0f381318b0a15eee35bb3877e3b966181b5b521aeb4ce1bb11554e7f56d9065e4c849e2046ab6470bb9aa3fc407b0b676e60a60ea7570b3260c7a987a5b2e949ca039f3db17608b6586c169099482869b07f7325720e27f56d07a4656914b5328648296fb66bf95b76578a8fa4fdb83daa7a395008149fd3cdf6fdcf1c80a236b3a1a96e511898cb24b631cc56aa7c7173c36162bf4c2e4f5afac8da6c4385ae6405e88b25c719a464b9a6eb2a3453ed21f62728750af1ebe768c7205e8bbbbad32f61e1ddb6bdd2556b5b21bdaa11dd85717b5eb28d995889ab0b839d8c4a6183d3804cb4403c361b0b1d27bd0cdfb98631ada8be88e17ac77f2a697ba4fb4d98d96c01400454e9d80ef89d29139079ed143e50151bda9ff1f43eeadc6cea6e693d74f4cb1cfe09696d396c25ff629064aa2d8fe449bf9702b19634605d66471b2f74f6daada1d0528fbe4c76c5ac2918e48f0428f0d4388073784e68fc2c0cfa83bd1787849fd849762ad5bafe0ee3ebf8b0599b5a98a520a5be01732d5031bf92ad9ef0c235c582f4f970a502dc4e38ef8bd6e7963731a8e1fb1f2d8bda64d5989d9b8e8971140d5fc36ca356330ae603795e61ef15758b603b9cc62fc0fd03adc9988a7f62b6a18b60eccd1bccc3b27f03dea73d9300f38d7dc40123b365264b04aad43e6857ce22584d3ddd0646e318e204412350dced56e02bb8f30ad1cc553be2c11c989ad8969ebff9c3be0db0ba9cbfca59e7b053463a5fa16ef00c33c308df36f2a8d994e1d1d12297eca66ebf0295772d0e9ba8e6fc8d6fb36d74b86c4459ebc2001110da0b6273d04f8b0c23a16f64e405d72515578b0f2111a7e9c438fec08c60e21b42e396bd9cbc1eeff6e374978fe3e39d75e8fb3eb96a6fd485e4ce9361875470a5c3ff43a2efa1a00a78fc104bed02130fb180409ff8d2a8472285a0016c50a9a41901a4902c19f21e2c120044eacb6c48d3ca1ee79780370d47f296d8cf2b8d473b0e0dcd5feabe4d1d42ae77e7264cba987404969dbe514d2b1ef5b95e06b09d2688f2503ceefb50d21fdc4a897dd6deb6c4ca27eca219c58c1182383a04f500798a3a714802a2fd33cf2cfecc8719d925705e4fd8c491932131413b9f5498acd0463b02d4e6345a4f5ccb2c95a9ec60ca4f6acdd6ae0f2ab1c1f78ba945fd1c8d0d77b374281b49ecf0fae9b27afd520e577c01460bdd07ac1c521f94f3d21c4a87871ea9dd103323ace0bfd122a4993cde5584b69f58f2ecce55e424232db799bf2441aae86c51d22c8c9f4d17b94f786157a07dd8701a1dbb2878c3e6b3911a1d716160e45f83e7565d364d4b3ada1374b7696061d42552dbcb7647c8e4d91ad3e1846cb902c373b5b36e5a09b8ef95628c6c5f846e954d6c02e446210ae89385453948fe1669e52e185f7104efca5b505b14d17c0e6f9719ce4b22f71da941caff7827a8311a0a366afd8d274c76ccaf108626260bcee8f9c0f1d8bd5f979b6b8282103c2af61aded55e0f5a80b2b192f12c42b6929364648d9b4b5680b0ed1a77a21086910bb0c041ab86fc2b25aa395ecfd5d255413eac364998a091181ecc091c64050fdce03e6484815e580f21eb07e6267719a0d88b2291648fc9ae9ab444a5de7e5aedab55d27ce3f400c7dcb57bafcc24a30daac9eae10503b52054ccc8b18220418a850392bc20ec3f768b3a6a236fc237e0a197df2a164a3e49d4133423226783f49c7dd07cb840d128eba5316878e0f85c3ef30bad7ca5ea8a681ac8f6a216abb0d90ace55f37c7179797e8715c5640a0daa39981fa48ff73125f2e1ab1591402515f7ab7b533948d7987b3f237acb2821f2746099d4b714fa228fffa92f42d0c9929e912ca5eae07e07fdd35e62de79ab35f49543eb0a03ac1acc99570289106966173fbc2d594cef0da9da3ce46c046802c1716b380a307c10496b2bc330c2d146f62ca8d5dd254e58fb846bd1a3e50a1faf580735a473f6e40ce67a4696a4612098ef832ef13a82e756bf9b6431a598a12ca8fd80e1c1c52b6e66ca01f6331ff5bcd1821cf35df7e1288e3d72ce727ded3ad0ffee267e28737607c70aa57f72dc4aff85027dd2095866d46b070b26eb4cfaf5b2e5591e9898acd7be659d7780f9de34fd04aad926dc2cf06cbf7992965e7db0ff906029eb798f09924500a6ea5454425783a4f8f6cf623753e36f13f1487d4909bf552f60b64467def6ba257ffc25aa955b46ae2378025acce6a65e90f2ad6474c09ddb1f24ed893baba3facfe0033fe4e5649357d59a4077684a69df61933829bdd84909ab6d684ba7bccc57b5d4b67aec5a1ccfa2c858017c579cbed366c29b6cd1ce009d5879ffba0c650dc18e683b9610e651586954365d8dc567dd0a80f7785b3359e6371e699d57c61c08b9f65be0a23be376f5241a6688b918bf67f32e4576d58a6af7851edcb66b6b8745fbecf1064cc60ee6bc3de69b18cc411733e9a6af08115c2049018342146a9e518299b1e1631d9a2bcda23078ad50fcd658666cc7573031dc837d59df6836f02583ff70950c495b82c8ac1c7c1e15d9c4c83ac8fd9dcbdb44c81120f1f94695aa903ce6db48950003a556b7dc06627069806e71398860c3b619f1060a774e16f4b6dbba5c6c831a8a95f290e17b178dfe3f935fa9e897559e2539e4ba3eea81c61218b26c931c8a1224895f1de6468c97a89d14e5cd400845900af012b4d4d6e29f8a79215b052092c0a9e158e43cdb839c176d75e6e39ee6083494547cf175408d7d2effe17cc862f1246be9434d9e12b490f186be8f6ad7d3c7b5bd068ec6ef7962f49207b05af20eb5aaf7e99f80408556177c7a186b7c7432bdb577d7bfcdf3f485b91a57b60780d4dc41def326e3915a319aabf3e82a6b9708245648314723d2a331974f2a6bf02cd1af9dbbba3ebc42cd8d743724a4cf20eceed48902d52b9ab9f3c3e18f2377970a3fc5c194bd4cdf57c51e2278187b0e9a57f77ccbb39b15d7bcb76a84b0defeae1cd30b59f1c1e41f78f665e6d0a1de233b6d37a8bea9a3bb7fccfc9b102ca6fd636e48a71473c867893ce71f783c3659650266911965ad2ceb2003457a5016281f672f94644c5b58d285f9784e53a64021f3f48c949db5940e9153bf0c34d4ac8ec2628eb792535dbbe5d4547f97606e8d0811a4a342fcd95040371af516303c686793e16b51c8c107b6d1f22b60fc13ec118307aa1bec5041f5d0a9d6c7ac570632a609dae75d58a9b8004873b5f805a0e08482834477a8a9562482c88a9288b48afc8b2624b975f7a0637a5da4851cba6e5a751b891c46f2e2d818f4dbd516b7e6b46c83e8246d0aff2459703d9376138858c08d86ef6d6f3228d44218eb94244698a0bc448c70c340bfe857d4f27e988fa7467820742d641d5fe2679602bb5a146549e0e3e67fb6726d85834950e5c53dede23e0240ee9e3b26ca6cbd9c74562d77cfcf94b4269bd5cf892698a91c3ae42726ee9e07c69e6e38803f6631fd69c2de4a20c4f214a774a8b99eb737b4e8da5727b9dc0d0915c7eee78b1bfb42b9825b1d2c4c9442c952213d17cef7c181c23487149b5b681d7159ea45450e0f25e71aee4b9b50032f86ffc9f36ed9bd7ce63d688b9d8c1f084639bbc7c5262e9e0bb9eed8f7ddba446ecdca3984cde5d0e6bd1195226ddf47c895a64b44f27ba82218c48eafa271502f0705ff2e6f2cd291479c623b3477d67712c94902cca20f4d6dd7e09b1d252effa7c3800e1739f1fc220b91ff440bcd4500176a509889a104944318fd4bb4805d748b8a5a09656e497b46e4ad5ee6bd9477fc41cca86b66014c4dabbdd2825ec7256082774a6fe9ecef481b98ecb3237adeab1f476efe315fedc0d82356f60cc17f8ec26d9f565b16380f4d93f273c26c22f2a2c25c2b03e6ab418cae19711b2cf47a297f51dadab1dd129b0cbf9883553eb7f3f052a18a010f802c2d4d0fb40d891e4256476799d7e11ba0efda9aad41939a1498cc7db0198b09411d1760388527bf4a972a7a06cdc7d211bf85248cd0b783624e5c836c2cf3e1406d8427001ed79a8663fb9174d20d2a6c7adf02b5a0e1d4f7446252e082a0cb1bc524cef2dd07a9d5ffa7bee2f58d8579add29521a9ddc944532622424725bed49f2a6f047a1c770ea9bcbd8b9bf99e3e7ab09e8289b495780a2eb48ec0c45430942e7778dcdccb1de1411d40ba7de1f29cd3270d63ad58951f58275db500eb7c7781843cbef8360837a200b9dae2ef916de0c7c5c5e4c99bce7c2b0f4ac3491bbbe14c01f9e09717e7813beaf694768b53ff3e10dd2bf72ed87d239d8a7c9be4b0e4cb05e08bcb8d93819e197a462ca20b84ddfc071566f4124668c6c0f3f821fb2fc49d1587b58c87f56d3bf1aefee1868abcf44968cb526b7d572e9524bda19d38b57d55a13e529f457e1e2b2f8141396d01461774e350c1155320997151e870cc57dcea9dba96ae9962b0da0e26f21a55e8feafb8ab6383620d01c2b5564bcbdff7f79cd43034846f6a2b20b3da0717f99d394ed1e89349ca3d08a91e5f9595cb8ede82e07bffa174a1c99bd34887850917f10af5ade7e2bb7b1676b86d80e68492b838d6aab7f3f38f7463f2b944c8c2e8f050f93dd47b1ad02e3d7d3b4bcff207f6607eaac83aac5c5aab88cef53f6cc9c25ebcf8e4dbb0027ee977265e85dad4d35a70af240e1714eafe427ed99e7df48dd99c16e9e9a4ec56b0ef79b829d26590cbcf396bf41e06952a3ed7594837b434f5b90c166508aac0b6ebe8141e177e60caf14fd1acdce80c56cdea4182fca2da0b30ab58cff9b80a73302027f19aed6655fd9a86f236bcf134917ed8d7525c3447aec2d2207cb6c4b6761e885b59fb113824188068c32cdf08e973e0fc623e67fbd5bccecbf1ed00a0012df83dc254ebad178b28601d8f8eab90fcf97ff9d0189f9588fbddc7a1a7ba27f1c20427c61a46bdc2873bc8ef8c546503bdced0742951e3dc2a1755f1b0f042c14d5374d68310f10a87fd66287409129ca260d1e9aa34c0976f8cb5bd8d2daaf2761b36a5d3001bcf5fbe1c9b2b3c2b59013d6249a97f1708eead3eef3958ff9086e58e027aa039887b743eb03e02af6d465935df9605072207b6c595f0d9ad56896f010c8f7014cb9eac8f2187ecbe589010cc6563c2d9799ce3e10b66c546e9ee22e814c80d911ea853de53e83190286a87cf262d96441825ddfa696368214fa6dc5658e2c7aefdfa1644376b467bd295c9f1ac597c3a9e8011f03b02adda1cb0f77705a068d6ca6de5eace04fd4240d7972c777453e4f502f0f8d6f7861748250e448baf04f53ed5192ca782d008ed4159215c1031c37876e15a28988071384783d0983bb111940b9881f9c3b4864d2d220d742f9f1dddcaefc58bb9a27d30142b67fb074df8e9324c7bd3452377b6b761e2ff614c6f00e476fefd5396e6305101926fe8d6d48ce6da776b839ed7e1e6e64ac6bfd4dc597c221bb813c741912ec952a1611285b0a001adc61e51b05715129f9682252cbc8d40228401e5b8da773a3b44b23115d908ed8864b6632e95b676914634f4e779b76c4d920b0ac381bc348f2a7b496b90a4306b53a4ae2b8ddcc99b5fe0a10eeb9dc2081649237d24d52095f388f0baf408eaa1075ec09da6eed829ea2031cf95ab4365c9b73fd3b37305aa3a08964c995fd3da9badb11751d98163778a02abc1a08e1d52a4f315224371a8e582bde2ca33c0515d238927e1ed7712f03724b6280ec30f71fa84a30974a54bc0fd48215b6f062216407db840ed952379fc0a8a8c8a24bb1cad4c6f25d00e0f5a84252c3b9d11c2646de4b17cbf2c1cc6d651d3d479014258da22d75789291c510d28f2289b947309a42a0d8ae0f44a173c4c9eaa09893a271d8d7461a774027c234344c4c230ddaa857e1bf4dcd3ad3735f5b4d3448edf90c062e85055588062916434db91a0032c35b6d031425ea9eba1fbe4b3149591c90b5aa94338f5538dccd2654acfabf47daa81da2909f0988ddd16a61b2d4f6565ca852d94a1332f0d0c87c036ac4a9c867ad26030f216e054c9402a49fa5b406eb658e5f0ae9652c0c4575f0872d6065c0264afe7320ac52c3bac84b7285d0c07bac6eab329fdc8131604afd108707080e8df0375dffbc5dd180a798a327d50fd7e2279521b2899888504b9a33dcdb71f89e61093e5f128b5515f00eba90b8f0123f4edb0a485bc1e754e706b7aadc93d89e72e37df01ddcfe622a9ac8e33a4c30bfb7ebcd14296bff62d931007e62c97690636242af6d9875e260faa1d1aa4de4d906c679281d298ac932818fcdbf1ffef2ab9287cdf8662b6a6870f46c497d2364c0cedc1001f3d3ef7b34843f74a1e573a15d91e00ddbf851b3802f171288e0f2fde77937efcc50c2526c5cce34ade8478b148ef19f9454610c2fa62d8cc3983163be291b748dc4ed563b853fdd82b45d0533f5d5585b8d25f6c08f2ab378b803cb0e7802575fbbfd7ebe91c429db8766bd825f3b8ff98c76cee1a76105e2ff7685f4705499108d920dfe2389c2c65222f4ad435c78fa86ad94bcb34a168328161f74c445c8df82f296c5a6fe90d40c0b58d67dd0a07890eba26e2e3ea159ee0265067cc64a364eaaab228a60a9d4a153327cea5267f0aa7d6767ba2109727c244db2ac2d428e1442c200061d33e714976203a663913cc343b973a81b47c0a6832f5e36810c31f2e5fb9726a2a2c8bc7eb2c052125b5c287cefc7362c646c50427b721781d5fb006d018683ec7cc115ed664284748147adec635fb1d8d7e2f355239cfc55a325865523b44b795d389b21e93698eebc368e175b69a5f5faecfb58b96759b7164f193bbd5d2ecf5abfa2602cc23697cfddc6cca661ec574ca2993393ff985fb918fac4435f8177f1c84b8b51b98ec2c0a3e4c36fb09a181b89d93ff4082c9bdaae020a647728ed02ca1fffd408817e63f6d6f0d588873a25a3b8c84b6b6e9d1890ec888aa75eb293463848db0856e34a92be0183e2eb6b06e9ae045d7b9bf9714649fe70a1a4a0d348dab35962e42989d9c2ae38f92224d020ed5f851a3753b581261da8e2ac9511fe1ec0bfa29d3dfebf7a52cafc86ca47c3d25b89d850b20dba9818b375648562e28f93efbba12cf14b7a4203eb946d497b2db4ac73952e72064a48d6e894a35e5f2a82713b81eee2a2c754bc6ee9fa3ebb180c6bb438b9148c53f40c5076098a89a97be4952690c1f5635671f6917c34fa089850b77eb0a4b323ffe8abe46d9f16feb3fcfd7f40f2ded29ff70a9debe2531f343d0e1af3b0764bf5969d8b9fa03429759c29d22701a66bd246c6ddf5939136ad5eae6fa8775dcfcd28cd4e42ff7c8e05a5cdb1d99577a28a4b37aafc0d3f1553e2d2f3a31ffd3a1179e0b0d4dcc248b3b0ad89e3379aa1e404a85a9d33e4d332b970391c22d72c0c128e8c60103cf9a1ebdeee02843e03db59e1e9b8b007dae8a5f12ba87744bde58a11a1c5fa8e137dae0615b7ba3f2b0edc6697141c4b5e4d2e2c00bdb091907501ff54277e541ddf29897d3b90b45de171a78f54f25d7888bff7d0c5b0e3b061a463a093042a9026cf5112142cb504f9906f35cf99ba6726f366315c01dfbfe99d7ef249132b0c3a687dfaf7da86dff39929ab822328798f52de6d546632bb5b866598868a8cb3bb366fd9da63845e2c893d992201349e422e5c912956f2c21ec96db9a7c27c9829f1c7096dc2685ef66294f47023bddc418f91a211e23b25ad2991bf3cd62a81c4511494fbe06f7cca4c5281e14307e52f9da671e7627de5cc5c089697437bb683dfc9e0dac291d47e18586e0578e1d5365961b44451e282f6a54b928b514ec459c54c96e18f98851ab7e15348e34f47b932ae50078019f5d45f42d36f0b76fa4a8f7bb57952374c8e9ce09020053f97e818e2097212edd14bc23e7a165296c4e7b6939fd0720a865e05029bb7590f213541f05cb8edb197e6532b88741eb78ffa6c1103e7be4565111ac12e5c3d34cf595df0700d2ec64d312dbba5018218cf5a2b3e571c79d89f066c538ce63c1049de02982e7e2589da2eb5276a751aef35a676702a8033d4b491e03edf1a70d9fb16c9808a67474dccabc91981d6a6824f26441118059f1f60c72c0ee2225fcf7acb78229101f02b6b8421c9def1306a9f452e304ccfc0f715de13d48ac05a3684a130da6440838a789e946dbe6c7f44c44ffc7fd7c77b9497229052882ecfd0898168232cb4d796781d1054973dddf04e09577481baf23b5468b95a5416c76f28396411e7aad4cea8046591f664dfaa3af8985727ddcd8e8e4b87308ad0328ca4294e8b94fa41b4c2d0b137f93e4d9fa24a301804f5338ee5661eaea06be44df99db421712a1e6bf81713548807beb5aed4a1d78ad06f5c245564d377be61744d0a6db264741d50560469a055a1b8593fbf80ca2f99f819290043d4a68248d47f02432a6cad46b49b945835b230ad0630bf1fa12f698804cb07fafaac84ef483affffda64d7d23edfee1e35955111d1147682c9be955ffdc21298acab5c5b297e7d8e590db6f7a45e4b574cbbf30287fb72eca1a791319a4fd9b9dd8e3dd180d9ad7bbefcc28ab181d65ee89902c71ddcabe414cbfec469e8c6e7b11a2888d858cab007de7df4cd209354468918cd9196663192dd46b732e31235c603c46b00175bae3f536003a21eba94080cf5598533d633b5ba4aceee3d935aff8c6b960ab1f1f21f490c2b7d886377ef1f63d171f4b595e4001ea94a332c292fd6adc7870803e60a0f8a9d50607a2d35acef61f285ebc72479c4d4f7b73487caebddc99c65072eca60ec01543722e6423b02ebb527fbd4392ab3f3a617c89917813fe0f13de5712f80026acec24f31162b61da0a2781bc2676ef17c0eb9571c8b83b5669f22041134dc6574447832ec580337852fbe60a707747e4d4120050805fec5b36aef8d51729da48518bb27750752e7f7636d582edc45bb7cc45c6875fb80da53cdefcc845c4de6d75f593d59d06657dad71e7190551a471130215458df3b789228ab6530a8ab03af0f807228bb454ad9426e0b9dba26abcde8c2ce080b3c708e702057587db6e3078f1053ada7cb26bf2cad2c3cd54df2045b575b0f7a8925689d0344bb4655937c35fb3cfa8204a704cf7c0c8d74bfe5ba6c9e15ec26e38e46d44ef37da3466b28469a79828a99f08a4b2acb5b53b6ac6eaae47ff32d31f25b94d88aeb042b477c63e0f3bd414dd7dec80c23b22fb7f68cfeee7f2cc8e9d7d2638055aabcc033d7b563111f7fc746990f1f9bcba5a2c02dfa6fda46c53e19b150f6d7811d32d464bd76be286a36025679e47ab8cc83d79e08cfe97058872adc80e9bfd4ecad14cc948125ea34778ee0660f22bd7f6b4cdfc18f61eca9987ee73a1dde815cbd79f3e9e8bdc7ae1a03460c72326690e3ab6d68892e80ef0b28e7d7d1051031bdc8aac92f4f17b8abe7485c0dd9c4543e9ad148d7884d4bfe630f7b15d084f375d3c2246ab48992d8b251eb12af12b0fd75e07bfe05bc483b3d3c521b12206f223b24d0513faf45656fd70c4e40a2d85b06c14e633807463d35440c6e6ff9c90782677f1de6f8099f2e97cf700d04add6f380b772ff656a372f8bfe91bc16b8151fdef80d3482f7752adcc9f82c10f582f261ccc647958b3a1b34226972dde904d9ea698c2faf61adab492e3bb492060e2c2af0102e77de5bbfcc2dd0da70c87046be6e089a1be8ecd532b60d9581fcc9a75a9f97361290d2db5d2e4e5d216e8aae0851d8e3c5914b034206b99acd3627c23cc0e726c3da152529c0d0aeb2516b0375096af1da6e3e6ef8baf4bdc5285bc84ae41c351716d0252f073f149fa1e00bf834d44fb62b55f240c4cc22200144cf1b443e55e65d53af7ca9efc873f6040d98c571e5c010d88e20b85b804afdb1d42dbe07853e9934ff798f0c8f26190d28e5b3c1598ebf63781b49f1b5f5b944ef56ffff52b6565c5b96667ac49cc9536d1e7513024328350033b9a8a102aaaa49e9ecd0d0c142dc42c8faaab741240dddf76b02071c58deb5704324a5febe3709b9a87a3bd388d4376ece76ec4fa996f07618fecbb57e1a55c9cc6e5a63143d323003e935243c49552f83975569a59306521a267d826b1abc22f0db3b5db89a367f69c17053e309758a791a147408705182587226df276e11aeb6979114d6e6ea61bb45f68209215ffdc5a8c9d6fb7e775600e3710f3dd532a195a893a86a9324e7e1f5f2bf5bfe9383d6857a3243cbd1b8f726af46ab93ad06fba88b192ad46a15068027dc42131b0f482d146387b0b261a54664c81d41587a196963b55526d56e7317eff6f9859a9f580330bc37ba95be2bc8eabc45a50fe63929bd8b37f7ed3f4cb072272f50f61a66c2b25d676ecfc200a67b015a7255554d8633ec9a0025e249a4c746167c2a1060cc09d6bd69057cde004e8eafbfc6bd4574992ece5a5f6d03b9eaee48a75c72da57395e169e26041d6ed3b65b9c306254b06b09f394fda392e26d911e2f1ced495a2347e9c68138d96e1d84fb26f7e284626fcf756fbc9a4575305555b099f6832a2193c9eb6b5abb95fab25703852be6ff25ec40bbe0c8bfd118aa38f0e9554e00ba3bc7eef0213060d25b23cd6c32e5ff461d82124b519220b115b6f2f18cd3371cd837ced26b69814f0f09027cf1338dc424e9da44d1ffd5c3e0625bb2b8936d36f9430345af3e119f92994899174a0df8c0e4aefb3dd69119b7b957902caf98b1174df0e3b6e7eaf365178511f0ed1b31157730a389c558dfb71105d985c5ddf6e60588431d8adff58f0b5b6fb92ec73b16a6abafe862001f559c85850cffa583c07f0bb766af7d1a11d91bd1c51d4b2e760703b0868df98c4c79093782d7caef607b330a44e31281a812a80dd1ca1df8232a7eb9c7b12decc2ad8c1273051620fee9ba58de4b2879394a701880f75a372f50f25afaa95c4bd2318007851e1c7b04898446c8e792c9f467f169978fe22b4ff6d7f86573631ebf795e5c1ab8fe85b76022ae4b1ed6a5efc02ecfae8b8c96875a101670ec783394b3388b6bb2e49d93f35570fea9f66cb5aa13bf7c211ad307df3f270a4de667759673c4c0c8c70a740abbbf866d3ce9758c92732e8316cab0fd7b44083adda52db9206455dc03020d62863541165a35cc77dec1ff2f610d35d41e16841d87a4f2cb1a8b0e9f048c2c69649052bc798e91b8f7b1650707ebf7fd0b24509ce0e83c5d622bd0d4427262cd09752c22f3156e400fb256402f06603d1ca839ee8754f408603c21b35dffafa3ef07270f1014352be11744d77e1c365110e52cd516ec3d7258cb23037f35f963bf2eeee1ed77caaa2618444fdc739b0624540ceb791d912d077de3386641f2a1463aee3c73f61457b2d51ff1e18d5256da064a7cb04fd1682a48d26f6dc4be147e682957815d1e1c31ab208f79c254681bd008b01d9bbfd6df63fbd59a03dba903d39cb51dec5a38fd27e740310d70cfd2cd4d0839ef24e27725293f2af1d2b728dcda6fc444e3e35145c4cac1affce73b7b99181881ecbad24e47775d475fbb4869e216782ada651ce95af7ea1820f71baf1956f4cc4a487e33e1b284077e4a30509cd068d13b0aa146532ce8e10feb52e71bf2bf0476d99b634d198a1b85c4a7b8001a39d05ed4413ad53c1fc242e58a834d8d2c2c537ad6ba9d6b7e87373568b42cc3b8df4717812092c6f5ea91dbd72b59c827623bafe3999ca7fec5f1c4af8b66b305c9b138d6d79af07d0c780a27dad35ef50a711fc23a1bb70567a6754f3253090147984215275787afd2bb2c12787942e7dc7ec996f90be2173d3984206a6594899c181464fad9b78b718fdbca1ff0db5bf9720c1fceea2ebd62f0b81d943e2986eb204b6d7c64a0502c9f60458c349a1da820c25ff4341a72fea8f66251ee97f8f5721a4e691465f8f24c8454f7aa05a1f339581ca88fee21f5b27874a662eba05b2a28a8d10d17a1d8b5eb8d62386b74d8e87557137272619fbd3520c47ffb0371b04a88e548edf1e85657e912b658ecacdfc63cf007c2e3636575514ce402ea217756bc74d2f1fd8f57824d7718b7b80a27aa5bd9dd9f6375a28e009794cc8ea671e01e3c76a190f86d0647b941e779da687d1a47cefa9c52e85e4d715107e1c4e42ad65a834b403245dee643c2f7b0c355bc2aabc3e5502f6c3395899df540ff194bb0f614441b1104776e549634f217912aaf56fe539cf52436be520e49c6413af7be5f2bc567ce0b0030888491aaadcf5048e4be5534318b63ca18d24ae22ea8b84c534bb16b5e89be9a97df5f26bf9c196cbda125380ace6283f5ca1138096adc4cbfabef87ec0a214e489765302f5ba8d22d175f4c44a60f071c4a4cd70c72df3d3b679b80e8adb29f506a352b95f4a047cade72c49c8cf57f7256fc4bd2a80a76ce25bb2f69c56ef539a6fbfa5771f5b524d7c9668b9bdcf36b42f4972262f9620fd16623dcd7a01163972135544e28c7d7b3ba773eb4fc19a9f356147e87ceef0fae8239cd9af066e786b7e36f207bac0c99ca40c3fa8d174506bde6daada87881bab469fba3f374ce4d28a88b93c40275b4313f58a042bbd3661d67562b97fa0de72ddd9d3489b02508854e4496caffce26df866a25ec7e13e2402bb690d973ba0b0ace987a979de8e3c2b897018962203ffbe2cec697960adac97aa6d5789062eee3d39cba18c42c1aa6af4f22b20f1dddc734f611324debe43d44d2c349e45f16323ef62133aec203d3f3315f98377002665086077e31e210b49ac5a263cc58e55dffe61dcb46fde9b3254309d314e9aa8cdb7a578c46a797521760d51a565ca0d45d6dced98e7d215d1373d135088f434f9732b3a606548b4bbd6356c3cd6aa3d7bd785e3983016a4d81ad153813d24010ba8672d8060f538b759ec30bd1cad9e82fdd7da0a8b381603e9325978c0a466d1aadb59a29d3c71b1bcd1a9b3b0bedb29c3364e0e8ef26b85484fa43f6a37a3215fe6e3c12207cc8bb9c94b96e92b260e33e91cf90f21fb31083632b316424b7b19f2f5213fbca06f53b5091c3173b5fc94c1045e2e73f57ead0fcdb4458a35fdce2c0575225955d2f5939981731d22b33cff03fe767a013da0b22388ccf168a134b3a353513b7c2a6c4b529761a2838fddf68dfbd0a1abe473eace950cac266671f7857955fb84121e0a505a51f024bc94007a21354cdb48e884a4960c1ad204b6b55eaf941fc57fbfed7aa8af71fa142e9fb1746deacdaf0ef81a13e51d98525673b977ad737ad4fba87b7c3af16be2ca81a6b0b73040259380e99939bbf1074c47adf2990204d39101cf9449a7c29f4e21c583b7c40eca3aa0d3cb7e9f5566cb2114a70630df071375d7966eb0b79483698a170b21881c775ba624b80b668f70d714a6d87a0a051f7679852db65fb78ea5df2b5787cec29244eaaf1528b08d65169d6b9699a5598e76d9eb0390863c9ff2b96ea6991c7448c66a651474086a04d9f28b7a72e8bfb35a7eb575c1b9771d21863eaee37c14975c8826ab99b6d4d8a11ea511b60740dddcc6bd8a49b252814ad7512375cd966aed0ba3478a7ae1b3b3ffb0ca843f05160354c7c2afd4ac2ffd164f9b80c60ef761af30a2f379582d4cc9f94bd2df255983378295d436d0eb2bf3739f38eaa1577f9061662825c51cc09bf576b71ba4975b9a4a66ea37205ecb930f83327238518757ab2dfc9d25b63be8abf4d67657d5d98f9bdd7799183f9679443873a1a99160e5f1f66d2257c90baa19505fa70cec3335943bcb3dcca3028f9b34aef83f5e4355fef3790df44b4763aa7ddb5cbba7c04b08edf545e38316663b838302d412cbafb0fa14d633a3dabf53ffbcebf4f08844d5d8c333bff147af758fe9ceab7cfaeccf1fbe95cb6d96465a0bf8d6aa80cb96992fc7545f0b1098c426ddb2fed5ac2975ec6045e44b4025bc9d6c8a4a861758b92f30e5fb57f00dbe89dc7a5c6e0cd4b18ad48df4b359c814d1d7b9aa1b46cec8731ee5b519059934190fa2f7251db9d013dc3318c20aefbb428c6945360d32a598265e95d4512377c38d985bcd1b1ed0dc6a4e82173218eed37e922bfbbf00d9d5eea08abc367903b57fda42539fe2b6abca9670b23e3ce2866d7a0f0bd916551b93a0ab8c96b9a3cbe87a17fe600d691a9bd3e2d587efaedc2820060461a8b2dc3a1a178f0f7056503991b02e3e3ca5d98063d203dcc507faf5d902789acd973464bcf39e57907253c5cf18325d33a1e4b7b52c566aad61b2dd133368b1d892e904d012653fcc3bb7f8217b6cb912271a904764cc049f66a7ca75076ad6e88d7069ed7afd58e74fab8afc8eb34ada73e99d1f6657064e1396d91d7aa190e06502631f738a095baa076ba395dc989f9134b9b2cf562b344e1af1de8990c117e5423a93fbf2c6e18220fd5af039b5c40f87c05b969290d582e602e98abd58ee80e152f74c3094378722c31453e60a9167b2a6c10beba701d623d3f83fa4e77de477ee8dff968977c281f7df560e7d0cabc8ce1df034667d86b8613e8dc26268726ed726618f84e95aa27717d0a15f1c1aa21e7f7a19622df62fe68c8f539ccd858288250c23695bac0d7c97e4f4994cf2aa929edc0b13315f047ad463709dd2679023d79b06ae0deded9888c0a2a56389086c44ced7872fef9d7b6032f79be609d5009f94c89f35a31497d781aceacf77de80108cd70b72cdd70a0a96e03cb48bf429d7b8605e0cbb5e4af9ca117c509bd366ed7c6fe1244571acb410bc6f8d176426abcc73de789285187e0522a17a80aee5a7ec1f0e3ab1f7fde3e66e014b42f28e6590a56fb4d6162aa9e395ec4cf2cf54b4fa779674edc7ea49d6e837a783ea8488ff03f5d603490d1558393bcdfdfca159ea1c207885f2fa5fda4f16587238b18c45e2d83dfaa028ca2d67f0b7acb1c9935fc2301f7f4ba9bcbc06b9af3a326f611e1e9e6d93c93c11758c8092681d371bd85f25f00dcc46c1015d15d0911fa9f4b4db06e604e070bc64fb6169caf17a4844e39d3ca4ccd0efa930f91617d14bc64b2c915ab7d158bfd1a3edf99562af377bb50f371b38c6feac8424e8a034d1471d92a188478a7e41ef947052a0f2c1685a5ec2b1a66c08e5eb9d163d8e7201400a98a0ffd38ba2c917f07bb114ee0250eb2524f09abbcde8d7855bfcf44cf6430236bcb265571f1455e03c29909c9faf61bbc181120b72574627262e70792cc8149c015b475bfb19a6865aa98127ad20ce29306d624b5f1f9bf26ded991f6659a40f2f5d17b46514efb11f90afa868b03bf498392453f2e2bce86727f5eb77124e05ca41704640d5429f1d4aa3ef19661a8ad650e34f177ece60c059080d4d8149c39ab686569ce2aaff7943d992730a830f7584578fdbd3ebc98401a137e6cdeefe363838b3a2a56ea2ca66bdff94a20ef39affb210329181b356beb70545520cd5d9b4b6fcbb2407f97252acea3ed87f4218266291b9238c2a4eeda12f7ae2ef634e104c769d998216ca7392c91a65f7559e0108a636fbdc33a8eab7b545e4ff3da4a6f32fdb804f5c4c431ba0ed780d5214bc68399232a83774582743c696b89cc0ebd110ee1cb72fbf85991e0c2bd055801ae4d9484ec3c94ccf8c3f85190e64826fe955b55e4b04efe3e4cf406c0bea84c992a18af6d3640e88ab34ec92e69f4b51b7a715d2212dd768a019690f655d68d19a0805a7a53939124ee6f5b5e48b7de6bc3f9098fdb5facab6f973b5a1477c397aefe691c2099efb4fbdfbe99509f43c2f3f8452dfe1f63df92e7a0dbeecad2f2ee6012ccf33a627b33c7e2b70aae4bb7bef47dc6935ca79b085fb3094773b2367eb3b0e8d95c5a8c987fbc72d15170a3f966cd6308729a4a6e032033c781680641a0accab1e2682f7e0c19bbc3831d1b97efa0fba00b8bb99ece27370f16a6b4bd3926d4f98017d8b7a23584b34964dcc7602b368d82d2555a346b96677addc77573bed662d7862b576e7334a6223b6f36e141d06bf658bb5e47f405760322b46d37f63955bea7555f6065ac17a580d2eda371309d48759aa462bfd4067aac6730ea6391a9bdb0aaf00d7a5311c5e52a32259dc49466b2e5945f063ba34388c1b15b6900e8c1d8d6c90bb3b4e64e596024919bd4b331eb98fdf08e22b31dd59f9a791ef24c276fe1561a07f89666bee2ebc9916e94475150f9bc3e240db6a803f1ae34ad8efa474b9ffc8178a68e0ab05192f2b7a73389d47088c4a450b85838997a1404afec5cfcf9ad604a49203d1581048d1d8fa1d55a74c0da87171a6e1ed2f0f9f112460a7117a6aa267f4015f3406ff9cc475197d879e0301de7b2abe50b0cbf6cf55d3548f6104705be4b5216784db2effcd539a7956498ba4a2bcde46eaf08cc8baa5316d993b54599bd3b79201880e233c1473b196abc3d15da0b9cf5e51a82052bbf09af7c0e02290ebc360b63e713102ace0446810e80936f234af849dd6d5783cceaffbcc7e493d695c943787b51ff33a7d9ccbd2008ba86035673c8e8670d543ff3b2ba40387de9d7bc0419ebfa88e34058fdf39cf650c8a291446da83f976ee9bfbbe48385601dd0bcb5f2d85834fabe0fc0957338b04576ddd9d1c2fb8e65a36968d7c0e80d797b096603ab4436c3e980553c94808b4dc74e2e66afe93786afa9f2b7e521fae7730084b6ab8777fbfe6b7ba34a0504806f44ce87d02b9abe856a24baac924e6b1e9b0e4f666dfa8aee90d07135503bf628a3a8578b702673f98a8a81cd7833ccff398d692363c82a845516efd2ae4b9a74b72dd0ee69950113c59e61b31203d618882d73a7eba59f932a7b2aadcc971b743a65daed8b0c8d61d146358220844e4eb32302fe5ea871259374c57bb0f62195918a954ea74519530a6e960f38cfc57fe7dc575dc33697fef0ae3173bf23f359dab53fb25741ad295f2ced8924fb1902894e94e195920ea5596e49e05b3783abc3b946faae16c8ba8b3f9b1aa7aeebade70a9fd0b52ead76f176f355d7de239f77e63b038526144e1b49f6299c89fa3e18db1b3b0fbcccc40d0028c043e9783524c4b85fc6338fae6973f5293a55d9c118339777be91bfaa3932eae0f8d7525109a19bab187ca814a484ffce65f413a8ea22ea627f6ecc03a149f9254d45f9d5956e2083493e6f8aa874aeff7c6429d1a18335175c294377694438d3037b96e4aab9454f7dffef76b5813d31a5f377dddcc01e1ec860b88b5b67be6abb889d82da155739dd4860339d33e7ed7d2aa309646bef3390f43f8e1b8ee75468f9c89c8b798febe1acdd493858c3121e9d1e0c4887d9eccc200b7b6492656fd6e22786b6adbf49a0e11456da10afb1d3e896d10ff2c637c0add4e44b9d0156f599b4495ead0c91574cba37c422e5b67d3857e9b035c232ffe1173a387544f1d3735193e00d52bcd0a08402691955c0ec3576209bdb30d4b3dab09d2cf1731e9f36820ffafe6f1e958239fe606a4adde758c5a2fabd59f2a143aa9ff8e5f9b4b8e06eff7750c4d3b2e9f785f332ee74db963c0aad8565fb8f43852a2bba1c04c401f6ab2cbd33beef28da3d399ee4ef17bc8ec2edfb5a6d666e70a6038b6c92c3501c901b1e56510d9059d2f94b7c3e098f9237f62839dcea1dfd1df8daa3919321cdf69efa80b3c2c1b106dbf0bd644323911b0ecfacada1cb3ced99dc03a21781699af040c49cd45dd6292840951e0171922275a557720613e73638a7f0867090293a965081048cb13d17b76f5136ce638c70646157ee7e447a33ca6019d0d778f773ac2d14df176dd1f497cb0e8b7a97e4f71da1874db722b19dec913732aebac806c797798cbe1feec74a86c2f538e8125407db0b2e6edfd2f1b02d05c43e508641338204e633f278a92d1e4baa33db9b892d0c42e509ffba299949cfeb39d47220e65c0b47505d2639c92fa91afaaa31a11bc5d31db74782e1595ceed4b699e259df053642cb27feae1a5a6883c54ca9b5efbe8b802f94a14343ef10a1040649e29b9b886475942b32c57f68e7434d8756641d3d5b101dd36e09483e93bfcb4f25fc7c515779489b8c0a000a9980f21a50dd14c9b2c5d8c396dbde7a69d6d20e95f114996bbab845ac2944f9a81fc5ac476cbccda30e85acfc5c04b84f566b47dac340206744e800a7f4f54c4a7ff3b2f9af933d57ce277b334ad22f686d5603632bb7e2f08a8258ae75eff36b0d97f3d3613ff39f8730936513b8cd07542da0763942b20e66cc32fbf91600cdf92e7fc5255a6adbc1a3bfb6707d19a4c9f61261ce12387ec59d44ea032d10a282f038aa4907eb6fe8f317a89ae74ea6c1489dc3afa1d7d770e1d57d3db0a154ae981469129646f31821e1dd4cdd32d9bbb53044a9a84a52a97cccd41ac38d56075472104c6041a0776fcb067037f3a9117a7ad4c0e08210a35540aab1fe1c3d27535b8d0453ecbc2467a67d9b70b1a8006b7968a776532b04e6f688082651ad296d0b302c7908fdefe09320a67be5775025929120a509dc7dec726c8a0e82aa664a40972ade66cef98ada9cd14c77a11ff055d136c7fe89d3df498973dd5464586c80eb0e53e0e48370eef6faef20dcc95ae3b449920005194bc928290b0bacfc49e12a676f1f23c4cc1bc33dc6cbd86358fa9a30aa89eb2483c3cd6b83cca79891d0160de91d4ce57d5904007ef581d439586c80bbf1ae709f57f55db82553ae0bc18e6d47c2fcae7afd536b90ff52675d0133120dd85612fd7555cbc558343ea08806b1bcf3b7787f2c613080c4e2841489bfb180deb1b60cbc8119699b036dc0f1194c1a4070e8b91d30b7c47ec61e0bb6da86eb29c3ec1ad236aa1232a6c9abd2a1cc47c82b75c9f54b2b8956e9ba3aa11f82c98c1465d2108d0ceb71f527047a1a8160b84aa5fd28eb6f4f477964c3361cc1a20f5f9d0b66b5a8ced1f1fa37f868c513e6da1abe9fff7fe66434276703f6cc0612af0bf5f60f248735019c3140f05281e269d7f002ea6928ec0e8c18eb725b5351134a9ae9f7a6b067b2308a48145576b9019586725c23a80cbc830800c9ad1b9232f6ca0358eaeb361ffff7846fd261068ad6baed747b3dc550b416835fe3ce67ddfc698ef683804c227cb2302f6d82e85c5512f88539404f613a0ff0d438354ef7e52a28a36b98f66a805dd74484d6f3f73f0dc28edf76f3a7430a6130315154cf2550d953ca377bd83fc5df978058357fc6b714a52bf116c630b485916cfecc2b9bbf1b5ab4ccf26da8d1fa2a115ce51e09ae1c07596027f971273d977d42a8bce76daa6649e31da51709cb1cc5bdf9f7a8d25904f8f384531cd881e57b93cfee106e48f53946be9de00526872b46a40ec0abe3a6992b4f52c12643dcf8c0f4d4185eddad2f9d257eed1f49c18340871ff32de637892c5fa825e1227edad6f21dc5f808e08ffb44ac4e275f100925456630effb7e03f091cc7860c9698abd34b56171541edb31bb515a34b84a8d89ea0fbfbe7b2b8c88ddc963f8fa39da45aa99f3aa5693210f20cd848808dcbced3f730f0336b338456233bf5ec5b21df1a2a09f2379a8595ea637fcba01c7f6b765e330554e1966ab7219d004e855df754f5f0f1df247b8e9be7a1aae56a3fea12b3c4f376625b3c1bd50acf0da503314c38bf2c6cef380265fb62879c94d97a552f24fa431ca2a44f6c9c9c4baa2ad1169d3e95c75b29ef3c2922609cd4e08d7f38c3f996f79ce3353a6b79291b3490983a6b54126935b683f1e85e384909f2611f7f127149251b84c741700dc09372ee75bd35cabe2f4d78613d190d84b950159e0136fde672b03a1a3819679202df50d2e72a780e18bd1941bdd9d5284e0f3ad5ed2bfb8fabe287ca2f17267ca7a91cd73f15d2f7b4b9e40a0642c9c03adf2b2d276a2fd0e17991e6f9de0f7258e2a47c69f2544cb02aa8248f320f5967fc5a27cfdd3e1ab7887f2cac10640e1c872d29d01118aa37ceff8b9c7ce4522338891f168bf5c0b5322e003c57d679d9b5f4328f69a05c8fae75e1c7d893a96d759285341473fda21d0e33df6e7e01fd7f8b8fee4b6a3f168bb18e97175f19dbcf56a70bd985612d8e545b6c006c80202e53a1a2742bec72b68c03b36e7a08e9fff36973cb7888cbddc139d3bcff7f9bfb24fabf5de213c293790a9f878e43df13a17dc5828188f51b750bb7373cb932d85da51f8b23b37258e1c2fdb2a823986fcd4149e0d90b8a81b8fd59029b28d27e207e0cf2d4597c1ad425ccc655809a5e6bb1d6345509ed6c8af83685cd76b20de12c3a8dd23f6fb30263553f86d481f91f3c1d43b596ddf7eda69f5897a8ce6b2d080a9380bbb5af7eb3285fcb23d28eafb7648fb2065da3e52c8dbd0fd2bb195e87c2ebeaf72183e521347c2d69ce72ca4bef390868bec18586fd0d77282a92d7ac9f75b3bf58944485a236632f7d22b93984eae51fcff4f452829ea085fcc3fed18399f67240a8028fc578f8fc99b3e896fb845dd593a493e9706a174d89c0136e51df4e04b5a04c4cfca4130a830264fc3f3b7519bb81ccebccccf3a50a666006b264db55c68efd0a03e3c821b4e0aceed5eaea23a70d14956dabb9596674f2caba60f70e50d2733d8c1da23c7c6508eb6e16058377a07abb5056220bc98597969e33ce10d12cbc07cbea15f0195849a22629163755f829fad8227edc54c0a10039680330e490803ad441b8195afdd1ee7f9915f0b6daf48e8d88f46697ea697857a209d8b2c36a8dd89537b9454f23cef2d20258c08cb519dcf557d163a938db68e7058b6c6251380e69da1e751640fa32c12351aa0fd67b7662a65a3ce96f18b417bd6730a57bedc6c020fb2d9f39b2476afca83e7ac3eef594bdbc842b12f2838effa939b2952371af51144b1fd836bb63594501869dccd34f516f26f5251a3b05172eab489da8b4102b69276cc72c4a35502bdf92ad5d857616cf4dc9f919af32c2885aa928b9a8f432316f80101611772def843dd4be19d7bdaf083599b2a9a792bda771f4f4f646d9504fd3c29f8564c616e8820c48bb41898fa309168dde2ca94a0d45c84f950e632cd658c04fde9fb4b8c5ad242713137a21ece27c0fe739c197268e6a6528a158ae88a7eafc34f8ae4fe0f7cd04ec2e33dfe7b042a965e0f05fe2e3ac30f9f33698912aff56edf5756ec081b01b2816cdf34169b6064e69486e87fa0cdc7ecf330a65334fc7d7f7bbf08164466d956b0cc62cfe798fb4d6bd3bc4a429d5eb1d196177aa2ae5f31ae21dd3e7cc524da63a556858c0ccf6b3e0616be091f585b318f4f0c2a8622d0d9684dda67c3d28808495e8efd62b1f0fdae157e961c6c5bee6ee63b90cc61f612088800418609c3b197b7409d7bcd8a53369b4a9bc962548ec50fd3b752c88c6ae41785545617b49da4052fe9ed173899f98271e065ea8cf4d70400128a08c99e153a78efd9a24075b531e71ad876854bb22c3108229a55704627927535b43cdf4a438f046fe1785811347acc2004a91e9c60aa87ed660228f145f29e65e0f774d674a6869262aa14ade1588c4be8f198bf8e7df619b0e4331a5931a2e8b1246bde1938685266c8d6c4913cd5c6d5a278587c789176dde4bcd4390246123c8eaf7230b954f15d7b3ad89df310271a52276afe7a875509432a7658e6b96206d93e5b28056df1f10c9c4a35f40c1131f30290e7798e61d197ca0ea29d9edfa23bd269cc68b022a0236e2bf6d49f288641edd012ba7bb40c130ed612154f0ff101d43a924d06f9199f55b9dbf5a834d251957537db3d7d817be1de33bff93a56d72c9b3fb6f8a9050ec425bcd7666dc4677e954295c61d47743991acee7e796bd682080daa5fa12e314287337674ea0c0394b1e3660d8a3aec378fc8e2e1a159bab309bc2e3dc4a32744c9bb7672d2cc8f193059797683c8614abd3f9f8be9d255fba4cb3fbcd5023a3ab1118590b6b93c65d2440fee25409e92a246622edac62103c7bfaaf22feff70e956d64528b7c4f91e84197524a77807e68bd0a3933a96b488f8f02e5220b6577dc672b9a8b7d6ddf90ff6b585bef46708062b14438a4f3e950239e533a6313fa39afd4952307c996e359629da872755c30fc16b39a6a94cfd862ca86fe13b979b0ac6735ece74be12072ac15941fe6b0337f0ccc2e57c38a764390141847b855015c8b02bfd97fe79ba4a90a58d5ee2a17a734772ce4131d9323b4d5ce1d8df2c339489d7f862320c62357ff37c1b09f627f6f116599b51905402812a45651aad8e420bfc1ca5c31d9046a48bde485f2d326f1c775904afa48790dbc0ad56e1062fdaf4c88dd82645ff648baa453deadbcc18be9f94a8539650df746d13a85db47d45c8268a7c1ccc7c3a4245fa8eebdfdc0b172dc360201002afa077fa07fa5543960a82f81d81417f8d7c3070c3bb5dab0128a47838f2c43ac7ea4bc75b73afbab9fa42ee0deb10b93aaea0059bc38468e3e2b511833e5ebb0062645048c6106044866ed52d331a21fd90e9d2918d1e2b9e60110c6d1dfed8cab1a7e913ac3c4bd681493d398a0fc64108f7971c30184b5b202e69750f1d53140c0809a974341550e5faef1392a266c18333a19e48eafc6252138c7bf610aa440efee6ada47e619a1be9b9e89dbef8df1aab0446daa2e7f3ac9ceeed93886be8b63f56295bd43bde11be741238fb5754ef749df2962088c089adcb47612f1cf5a868e4c0a0c2437ecb5759da41989899951f96261d31343dc131de60243f48384e06faa87baac8da66ac6323a104f3c1b9013f79d9712befaf860c639739de3ab7f6f1376dd99cb7f6c8aa42fb0d0f2dc586b708bf2b8af0e681350663125e913f7c8f2cf03d566acc35f09bf46680fbb699bdbc06d2af725cebcca87caba9553d5fde4248360dde795a78dad54241cce04425902deab8aa6de34fea7ec003a8b9e94a1c82eb83ff19cf2ae9a5ddf59d6f5e0e96ade83eb8a07072fe4b497b26c09843f98a89d10719a4899c886240f395a527055b3b6a8f208bba4cf495dd8b04c5c4f684331929d638400cb8b4927368e7a2365753cdd5f206545a022cb412ae27176214efaaecc0578b9dc9b87610aea8dbe799a94c6ea88bf5ab3945534addd3f63d76856a0360a1eb505abb4be88ef6b571e8a692453f7b3c6e6051d5cc27bf7715af743dd6b6067ec7fb3e13219833198286ea8315faa6f367a606d8148972617d044f9af75f9f62e7db95fcf329273a8d3a328047cf1d25686cf6a696f5127ec71cdc7d5e1ecb212d8fa94f38a7c84d5cb5730f0a4ff8f70b4f41996092cff2ddd991ab30e22ba1ac0144ca776facd476ca07cb50d9289a234e9faf84926e322d271368682f3a0d403c7c80a04c48788742fd29c567806640b7f1bd8d1dd961d92edd846aead2d9f4ad6c6363b35ed5e7f872c32194fa6ff03d3696f2bf78f055e4019146b144ed1ad63be7c3022dec556cd8d2f3a0bbfe725ae304de8affffa097e7f8e2a91bbe59eb6cdeaa4246cff640dcf9824768418535effe74534331242e689734fc393ff38a8f3e88b450112ef26eb58df6d45d4c677aed1e7cfe1e5a681bb5f72aeace6b762cc72408cb004ec049c1cf4a31701068a1c7058cd2f0e98df911627bd791a85817cc503906256240fe4f830ebcc290ce216dfe5b6331d3cc612098e39b821e314b37858a40d1268f31f23bdb75ea64a5bfe3cbbd9284ea4caa57bc27ed3501e2419aa407e5f7b7a5dc7c64566f4abeaffb54d094357eaab85314c953a520eede2f4bbf2784b3cee19c5420e2d5a6a8b86c313605f16731ab67db8c8310290332d36e5db455da9a7c72de8a95c3794eb85614ba70eb39cddf29dc8971f253c73b14c073bda91d88f8acf246aaedbec7e3baa71bd7dbb6a9e2e610340374fd4f9a0e9ca8f3326126e07545f7ec6e32826f96837657dddbed096f2e9b488fe98165f70d23d3e8602ffdad9480a7dcec031ef6b62061c3121f284b609fa8c8f06c7a4a53324338e65db9af2a4607d2e2977ab4ef41ff93304539c9c0aa831dbbac328a5484a08366000000000037b10700000000002a7315c8ddfc25dc2266a6b221cb8f9fdf641970ab1f65a2754df4e14c432b9c446c604131913bed45976c4a8ea27df843a72d622f80ef15da622f0d56ec1ffe3021190177b0405c4fa1a0311a493c4dd095f24d386be6a03f5838a6b1008665f4000000f5c98fc152bf40e1ce216c8839b8ddd42ea5b355f0b5c700fc9b2cb7c802e1c8336488033fe5f3ef4ccc12af07b9370b92e553e35ecb4a337a1b1c0e4afe1e0edb56114e00fdd4c1f85c892bf35ac9a89289aaecb1ebd0a96cde606a748b5d71a533e05d648cb9635382f38b778dc3c76b18e4eab2d017fdb24c1c0e32d2991707a45ce3f26e443dafa697a76bf24122c9b19b57eebe798668dbd1a0da7c900795222290dd7278aa3ddd389cc1e1d165cc4bafe5c658153cdef5850f97c4d4fb6706b82310414a00fe7dc34b3043e0c7a8a24e810e3cec9de3e1dd7ce06bc191efd2273a357da4436fc4bf82069f6cb87d3d605aeda1336ac513f358b4296b8da51232896ad271063d93404eaa6b80960fa2d4b41d74a544eef94731f0b83ba2701e33b49e3191098c3369bc4658d82f536cb9d38285c51c7844292ced06dd2e8148f0bcd585dc1104e64aa930045e83d828ab436a0e587637e5ef83044d1c2918da284d7072847132885d443640979907485847368e32501345b0dc24c904c06732cc17d944b26181b0c05c6461bccbe4f7b2180a282b6871aa6472fa36cdc49ec50cf69d3eee4b26fe02bf48f39efb549d3963d19e4112c7250c580543516204ff1b0675680cfea02ac09f0b23d6e28c14b08421b3a10a9788442457d732b120c5c466c54ad938dedd3cd3701d9b32fa15dc8db3d6b1ea5d8495732477a72b34efcaf8c349aa40d8e1f21f226ca11182cff00921930b010000000080c3c901000000009104e90000000000d75b9464000000003802000076ab1c8604000000000000000000000000000000000000000000000000000000844f7a7e7585362114fc88a70654146215ab4eaad65ad54b64975840b78d365e8b75e78616a92294e747589c3ee4a845c2962e1cf6cd7fe8bfbd09439e5e6d5e4d4efdf181473803e734d97891388e1b50628658ac818599cf2cb069c8e6b38b6265617665726275696c642e6f7267").expect("unable to convert content value to bytes"); -} diff --git a/simulators/portal/src/suites/beacon/interop.rs b/simulators/portal/src/suites/beacon/interop.rs deleted file mode 100644 index 85cfeb3662..0000000000 --- a/simulators/portal/src/suites/beacon/interop.rs +++ /dev/null @@ -1,322 +0,0 @@ -use std::collections::HashMap; - -use crate::suites::beacon::constants::{ - get_test_data, BOOTSTRAP_CONTENT_KEY, TRIN_BRIDGE_CLIENT_TYPE, -}; -use crate::suites::environment::PortalNetwork; -use ethportal_api::types::portal::{FindContentInfo, GetContentInfo}; -use ethportal_api::types::portal_wire::MAX_PORTAL_CONTENT_PAYLOAD_SIZE; -use ethportal_api::utils::bytes::hex_encode; -use ethportal_api::{ - BeaconContentKey, BeaconContentValue, BeaconNetworkApiClient, ContentValue, Discv5ApiClient, -}; -use hivesim::types::ClientDefinition; -use hivesim::{dyn_async, Client, NClientTestSpec, Test}; -use itertools::Itertools; - -type TestData = (BeaconContentKey, BeaconContentValue); - -/// Processed content data for beacon tests -struct ProcessedContent { - content_type: String, - identifier: String, - test_data: TestData, -} - -fn process_content(content: Vec<(BeaconContentKey, BeaconContentValue)>) -> Vec { - let mut result: Vec = vec![]; - for beacon_content in content.into_iter() { - let (content_type, identifier, test_data) = match &beacon_content.0 { - BeaconContentKey::LightClientBootstrap(bootstrap) => ( - "Bootstrap".to_string(), - hex_encode(bootstrap.block_hash), - beacon_content, - ), - BeaconContentKey::LightClientUpdatesByRange(updates_by_range) => ( - "Updates by Range".to_string(), - format!( - "start period: {} count: {}", - updates_by_range.start_period, updates_by_range.count - ), - beacon_content, - ), - BeaconContentKey::LightClientFinalityUpdate(finality_update) => ( - "Finality Update".to_string(), - format!("finalized slot: {}", finality_update.finalized_slot), - beacon_content, - ), - BeaconContentKey::LightClientOptimisticUpdate(optimistic_update) => ( - "Optimistic Update".to_string(), - format!("optimistic slot: {}", optimistic_update.signature_slot), - beacon_content, - ), - BeaconContentKey::HistoricalSummariesWithProof(historical_summaries) => ( - "Historical Summaries".to_string(), - format!("historical summaries epoch: {}", historical_summaries.epoch), - beacon_content, - ), - }; - result.push(ProcessedContent { - content_type, - identifier, - test_data, - }) - } - result -} - -dyn_async! { - pub async fn test_portal_beacon_interop<'a> (test: &'a mut Test, _client: Option) { - // Get all available portal clients - let clients = test.sim.client_types().await; - // todo: remove this once we implement role in hivesim-rs - let clients: Vec = clients.into_iter().filter(|client| client.name != *TRIN_BRIDGE_CLIENT_TYPE).collect(); - - let environment = Some(HashMap::from([PortalNetwork::as_environment_flag([PortalNetwork::Beacon])])); - let environments = Some(vec![environment.clone(), environment]); - - let content = get_test_data().expect("cannot parse test asset"); - - // Iterate over all possible pairings of clients and run the tests (including self-pairings) - for (client_a, client_b) in clients.iter().cartesian_product(clients.iter()) { - for ProcessedContent { content_type, identifier, test_data } in process_content(content.clone()) { - test.run( - NClientTestSpec { - name: format!("GetContent {}: {} {} --> {}", content_type, identifier, client_a.name, client_b.name), - description: "".to_string(), - always_run: false, - run: test_get_content, - environments: environments.clone(), - test_data: test_data.clone(), - clients: vec![client_a.clone(), client_b.clone()], - } - ).await; - - test.run( - NClientTestSpec { - name: format!("FindContent {}: {} {} --> {}", content_type, identifier, client_a.name, client_b.name), - description: "".to_string(), - always_run: false, - run: test_find_content, - environments: environments.clone(), - test_data, - clients: vec![client_a.clone(), client_b.clone()], - } - ).await; - } - - // Test portal beacon ping - test.run(NClientTestSpec { - name: format!("PING {} --> {}", client_a.name, client_b.name), - description: "".to_string(), - always_run: false, - run: test_ping, - environments: environments.clone(), - test_data: (), - clients: vec![client_a.clone(), client_b.clone()], - } - ).await; - - // Test find content non-present - test.run(NClientTestSpec { - name: format!("FIND_CONTENT non present {} --> {}", client_a.name, client_b.name), - description: "find content: calls find content that doesn't exist".to_string(), - always_run: false, - run: test_find_content_non_present, - environments: environments.clone(), - test_data: (), - clients: vec![client_a.clone(), client_b.clone()], - } - ).await; - - // Test find nodes distance zero - test.run(NClientTestSpec { - name: format!("FIND_NODES Distance 0 {} --> {}", client_a.name, client_b.name), - description: "find nodes: distance zero expect called nodes enr".to_string(), - always_run: false, - run: test_find_nodes_zero_distance, - environments: environments.clone(), - test_data: (), - clients: vec![client_a.clone(), client_b.clone()], - } - ).await; - } - } -} - -dyn_async! { - // test that a node will not return content via FINDCONTENT. - async fn test_find_content_non_present<'a>(clients: Vec, _: ()) { - let (client_a, client_b) = match clients.iter().collect_tuple() { - Some((client_a, client_b)) => (client_a, client_b), - None => panic!("Unable to get expected amount of clients from NClientTestSpec"), - }; - let bootstrap_key = BOOTSTRAP_CONTENT_KEY.clone(); - - let target_enr = match client_b.rpc.node_info().await { - Ok(node_info) => node_info.enr, - Err(err) => panic!("Error getting node info: {err:?}"), - }; - - match client_a.rpc.find_content(target_enr, bootstrap_key.clone()).await { - Ok(FindContentInfo::Enrs { enrs }) => if !enrs.is_empty() { - panic!("Error: Unexpected FINDCONTENT response: expected ContentInfo::Enrs length 0 got {}", enrs.len()); - }, - Ok(FindContentInfo::Content { .. }) => panic!("Error: Unexpected FINDCONTENT response: wasn't supposed to return back content"), - Err(err) => panic!("Error: Unable to get response from FINDCONTENT request: {err:?}"), - } - } -} - -dyn_async! { - async fn test_ping<'a>(clients: Vec, _: ()) { - let (client_a, client_b) = match clients.iter().collect_tuple() { - Some((client_a, client_b)) => (client_a, client_b), - None => panic!("Unable to get expected amount of clients from NClientTestSpec"), - }; - let target_enr = match client_b.rpc.node_info().await { - Ok(node_info) => node_info.enr, - Err(err) => panic!("Error getting node info: {err:?}"), - }; - - let pong = BeaconNetworkApiClient::ping(&client_a.rpc, target_enr, None, None).await; - - if let Err(err) = pong { - panic!("Unable to receive pong info: {err:?}"); - } - - // Verify that client_b stored client_a its ENR through the base layer - // handshake mechanism. - let stored_enr = match client_a.rpc.node_info().await { - Ok(node_info) => node_info.enr, - Err(err) => panic!("Error getting node info: {err:?}"), - }; - - match BeaconNetworkApiClient::get_enr(&client_b.rpc, stored_enr.node_id()).await { - Ok(response) => { - if response != stored_enr { - panic!("Response from GetEnr didn't return expected ENR. Got: {response}; Expected: {stored_enr}") - } - }, - Err(err) => panic!("Failed while trying to get client A's ENR from client B: {err}"), - } - } -} - -dyn_async! { - async fn test_find_nodes_zero_distance<'a>(clients: Vec, _: ()) { - let (client_a, client_b) = match clients.iter().collect_tuple() { - Some((client_a, client_b)) => (client_a, client_b), - None => panic!("Unable to get expected amount of clients from NClientTestSpec"), - }; - let target_enr = match client_b.rpc.node_info().await { - Ok(node_info) => node_info.enr, - Err(err) => panic!("Error getting node info: {err:?}"), - }; - - match client_a.rpc.find_nodes(target_enr.clone(), vec![0]).await { - Ok(response) => { - if response.len() != 1 { - panic!("Response from FindNodes didn't return expected length of 1"); - } - - match response.first() { - Some(response_enr) => { - if *response_enr != target_enr { - panic!("Response from FindNodes didn't return expected Enr"); - } - }, - None => panic!("Error find nodes zero distance wasn't supposed to return None"), - } - } - Err(err) => panic!("{}", &err.to_string()), - } - } -} - -dyn_async! { - // test that a node will return a content via GETCONTENT template that it has stored locally - async fn test_get_content<'a>(clients: Vec, test_data: TestData) { - let (client_a, client_b) = match clients.iter().collect_tuple() { - Some((client_a, client_b)) => (client_a, client_b), - None => panic!("Unable to get expected amount of clients from NClientTestSpec"), - }; - let (target_key, target_value) = test_data; - match client_b.rpc.store(target_key.clone(), target_value.encode()).await { - Ok(result) => if !result { - panic!("Error storing target content for get content"); - }, - Err(err) => panic!("Error storing target content: {err:?}"), - } - - let target_enr = match client_b.rpc.node_info().await { - Ok(node_info) => node_info.enr, - Err(err) => panic!("Error getting node info: {err:?}"), - }; - - match BeaconNetworkApiClient::add_enr(&client_a.rpc, target_enr.clone()).await { - Ok(response) => match response { - true => (), - false => panic!("AddEnr expected to get true and instead got false") - }, - Err(err) => panic!("{}", &err.to_string()), - } - - match client_a.rpc.get_content(target_key.clone()).await { - Ok(GetContentInfo{ content, utp_transfer }) => { - if content != target_value.encode() { - panic!("Error: Unexpected GETCONTENT response: didn't return expected target content"); - } - - if target_value.encode().len() < MAX_PORTAL_CONTENT_PAYLOAD_SIZE { - if utp_transfer { - panic!("Error: Unexpected GETCONTENT response: utp_transfer was supposed to be false"); - } - } else if !utp_transfer { - panic!("Error: Unexpected GETCONTENT response: utp_transfer was supposed to be true"); - } - }, - Err(err) => panic!("Error: Unable to get response from GETCONTENT request: {err:?}"), - } - } -} - -dyn_async! { - // test that a node will return a x content via FINDCONTENT that it has stored locally - async fn test_find_content<'a> (clients: Vec, test_data: TestData) { - let (client_a, client_b) = match clients.iter().collect_tuple() { - Some((client_a, client_b)) => (client_a, client_b), - None => panic!("Unable to get expected amount of clients from NClientTestSpec"), - }; - let (target_key, target_value) = test_data; - match client_b.rpc.store(target_key.clone(), target_value.encode()).await { - Ok(result) => if !result { - panic!("Error storing target content for find content"); - }, - Err(err) => panic!("Error storing target content: {err:?}"), - } - - let target_enr = match client_b.rpc.node_info().await { - Ok(node_info) => node_info.enr, - Err(err) => panic!("Error getting node info: {err:?}"), - }; - - match client_a.rpc.find_content(target_enr, target_key.clone()).await { - Ok(FindContentInfo::Content{ content, utp_transfer }) => { - if content != target_value.encode() { - panic!("Error: Unexpected FINDCONTENT response: didn't return expected block body"); - } - - if target_value.encode().len() < MAX_PORTAL_CONTENT_PAYLOAD_SIZE { - if utp_transfer { - panic!("Error: Unexpected FINDCONTENT response: utp_transfer was supposed to be false"); - } - } else if !utp_transfer { - panic!("Error: Unexpected FINDCONTENT response: utp_transfer was supposed to be true"); - } - }, - Ok(FindContentInfo::Enrs { .. }) => panic!("Error: Unexpected FINDCONTENT received Enrs instead of Content"), - Err(err) => panic!("Error: Unable to get response from FINDCONTENT request: {err:?}"), - } - } -} diff --git a/simulators/portal/src/suites/beacon/mesh.rs b/simulators/portal/src/suites/beacon/mesh.rs deleted file mode 100644 index 32d2b34a70..0000000000 --- a/simulators/portal/src/suites/beacon/mesh.rs +++ /dev/null @@ -1,192 +0,0 @@ -use crate::suites::beacon::constants::{ - BOOTSTRAP_CONTENT_KEY, BOOTSTRAP_CONTENT_VALUE, PRIVATE_KEY_ENVIRONMENT_VARIABLE, - TRIN_BRIDGE_CLIENT_TYPE, -}; -use crate::suites::environment::PortalNetwork; -use ethportal_api::types::distance::{Metric, XorMetric}; -use ethportal_api::types::portal::FindContentInfo; -use ethportal_api::{BeaconNetworkApiClient, Discv5ApiClient}; -use hivesim::types::ClientDefinition; -use hivesim::{dyn_async, Client, NClientTestSpec, Test}; -use itertools::Itertools; -use std::collections::HashMap; - -dyn_async! { - pub async fn test_portal_beacon_mesh<'a> (test: &'a mut Test, _client: Option) { - // Get all available portal clients - let clients = test.sim.client_types().await; - // todo: remove this once we implement role in hivesim-rs - let clients: Vec = clients.into_iter().filter(|client| client.name != *TRIN_BRIDGE_CLIENT_TYPE).collect(); - - let environment_flag = PortalNetwork::as_environment_flag([PortalNetwork::Beacon]); - - let private_key_1 = "fc34e57cc83ed45aae140152fd84e2c21d1f4d46e19452e13acc7ee90daa5bac".to_string(); - let private_key_2 = "e5add57dc4c9ef382509e61ce106ec86f60eb73bbfe326b00f54bf8e1819ba11".to_string(); - - // Iterate over all possible pairings of clients and run the tests (including self-pairings) - for ((client_a, client_b), client_c) in clients.iter().cartesian_product(clients.iter()).cartesian_product(clients.iter()) { - test.run( - NClientTestSpec { - name: format!("FIND_CONTENT content stored 2 nodes away stored in client C (Client B closer to content then C). A:{} --> B:{} --> C:{}", client_a.name, client_b.name, client_c.name), - description: "".to_string(), - always_run: false, - run: test_find_content_two_jumps, - environments: Some(vec![ - Some(HashMap::from([environment_flag.clone()])), - Some(HashMap::from([environment_flag.clone(), (PRIVATE_KEY_ENVIRONMENT_VARIABLE.to_string(), private_key_2.clone())])), - Some(HashMap::from([environment_flag.clone(), (PRIVATE_KEY_ENVIRONMENT_VARIABLE.to_string(), private_key_1.clone())])), - ]), - test_data: (), - clients: vec![client_a.clone(), client_b.clone(), client_c.clone()], - } - ).await; - - // Remove this after the clients are stable across two jumps test - test.run( - NClientTestSpec { - name: format!("FIND_CONTENT content stored 2 nodes away stored in client C (Client C closer to content then B). A:{} --> B:{} --> C:{}", client_a.name, client_b.name, client_c.name), - description: "".to_string(), - always_run: false, - run: test_find_content_two_jumps, - environments: Some(vec![ - Some(HashMap::from([environment_flag.clone()])), - Some(HashMap::from([environment_flag.clone(), (PRIVATE_KEY_ENVIRONMENT_VARIABLE.to_string(), private_key_1.clone())])), - Some(HashMap::from([environment_flag.clone(), (PRIVATE_KEY_ENVIRONMENT_VARIABLE.to_string(), private_key_2.clone())])), - ]), - test_data: (), - clients: vec![client_a.clone(), client_b.clone(), client_c.clone()], - } - ).await; - - // Test find nodes distance of client a - test.run(NClientTestSpec { - name: format!("FIND_NODES distance of client C {} --> {} --> {}", client_a.name, client_b.name, client_c.name), - description: "find nodes: distance of client A expect seeded enr returned".to_string(), - always_run: false, - run: test_find_nodes_distance_of_client_c, - environments: Some(vec![ - Some(HashMap::from([environment_flag.clone()])), - Some(HashMap::from([environment_flag.clone()])), - Some(HashMap::from([environment_flag.clone()])), - ]), - test_data: (), - clients: vec![client_a.clone(), client_b.clone(), client_c.clone()], - } - ).await; - } - } -} - -dyn_async! { - async fn test_find_content_two_jumps<'a> (clients: Vec, _: ()) { - let (client_a, client_b, client_c) = match clients.iter().collect_tuple() { - Some((client_a, client_b, client_c)) => (client_a, client_b, client_c), - None => panic!("Unable to get expected amount of clients from NClientTestSpec"), - }; - - let content_key = BOOTSTRAP_CONTENT_KEY.clone(); - let raw_content_value = BOOTSTRAP_CONTENT_VALUE.clone(); - - // get enr for b and c to seed for the jumps - let client_b_enr = match client_b.rpc.node_info().await { - Ok(node_info) => node_info.enr, - Err(err) => panic!("Error getting node info: {err:?}"), - }; - - let client_c_enr = match client_c.rpc.node_info().await { - Ok(node_info) => node_info.enr, - Err(err) => panic!("Error getting node info: {err:?}"), - }; - - // seed client_c_enr into routing table of client_b - match BeaconNetworkApiClient::add_enr(&client_b.rpc, client_c_enr.clone()).await { - Ok(response) => match response { - true => (), - false => panic!("AddEnr expected to get true and instead got false") - }, - Err(err) => panic!("{}", &err.to_string()), - } - - // send a ping from client B to C to connect the clients - if let Err(err) = BeaconNetworkApiClient::ping(&client_b.rpc, client_c_enr.clone(), None, None).await { - panic!("Unable to receive pong info: {err:?}"); - } - - // seed the data into client_c - match client_c.rpc.store(content_key.clone(), raw_content_value.clone()).await { - Ok(result) => if !result { - panic!("Unable to store header with proof for find content immediate return test"); - }, - Err(err) => panic!("Error storing header with proof for find content immediate return test: {err:?}"), - } - - let enrs = match client_a.rpc.find_content(client_b_enr.clone(), content_key.clone()).await { - Ok(FindContentInfo::Enrs{ enrs }) => enrs, - Ok(FindContentInfo::Content { .. }) => panic!("Error: Expected Enrs response, instead got Content response"), - Err(err) => panic!("Error: (Enrs) Unable to get response from FINDCONTENT request: {err:?}"), - }; - - if enrs.len() != 1 { - panic!("Known node is closer to content, Enrs returned should be 0 instead got: length {}", enrs.len()); - } - - match client_a.rpc.find_content(enrs[0].clone(), content_key.clone()).await { - Ok(FindContentInfo::Content { content, utp_transfer }) => { - if content != raw_content_value { - panic!("Error: Unexpected FINDCONTENT response: didn't return expected header with proof value"); - } - - if !utp_transfer { - panic!("Error: Unexpected FINDCONTENT response: utp_transfer was supposed to be false"); - } - }, - Ok(FindContentInfo::Enrs { .. }) => panic!("Error: Expected Content response, instead got Enrs response"), - Err(err) => panic!("Error: Unable to get response from FINDCONTENT request: {err:?}"), - } - } -} - -dyn_async! { - async fn test_find_nodes_distance_of_client_c<'a>(clients: Vec, _: ()) { - let (client_a, client_b, client_c) = match clients.iter().collect_tuple() { - Some((client_a, client_b, client_c)) => (client_a, client_b, client_c), - None => panic!("Unable to get expected amount of clients from NClientTestSpec"), - }; - - let target_enr = match client_b.rpc.node_info().await { - Ok(node_info) => node_info.enr, - Err(err) => panic!("Error getting node info: {err:?}"), - }; - - // We are adding client C to our list so we then can assume only one client per bucket - let client_c_enr = match client_c.rpc.node_info().await { - Ok(node_info) => node_info.enr, - Err(err) => panic!("Error getting node info: {err:?}"), - }; - - // seed enr into routing table - match BeaconNetworkApiClient::add_enr(&client_b.rpc, client_c_enr.clone()).await { - Ok(response) => if !response { - panic!("AddEnr expected to get true and instead got false") - }, - Err(err) => panic!("{}", &err.to_string()), - } - - if let Some(distance) = XorMetric::distance(&target_enr.node_id().raw(), &client_c_enr.node_id().raw()).log2() { - match client_a.rpc.find_nodes(target_enr.clone(), vec![distance as u16]).await { - Ok(response) => { - if response.is_empty() { - panic!("FindNodes expected to have received a non-empty response"); - } - - if !response.contains(&client_c_enr) { - panic!("FindNodes {distance} distance expected to contained seeded Enr"); - } - } - Err(err) => panic!("{}", &err.to_string()), - } - } else { - panic!("Distance calculation failed"); - } - } -} diff --git a/simulators/portal/src/suites/beacon/mod.rs b/simulators/portal/src/suites/beacon/mod.rs deleted file mode 100644 index e760bdbda9..0000000000 --- a/simulators/portal/src/suites/beacon/mod.rs +++ /dev/null @@ -1,6 +0,0 @@ -pub mod bridge; -pub mod constants; -pub mod interop; -pub mod mesh; -pub mod rpc_compat; -pub mod sync; diff --git a/simulators/portal/src/suites/beacon/rpc_compat.rs b/simulators/portal/src/suites/beacon/rpc_compat.rs deleted file mode 100644 index 4441a062fc..0000000000 --- a/simulators/portal/src/suites/beacon/rpc_compat.rs +++ /dev/null @@ -1,517 +0,0 @@ -use std::collections::HashMap; - -use crate::suites::beacon::constants::{ - BOOTSTRAP_CONTENT_KEY, BOOTSTRAP_CONTENT_VALUE, TRIN_BRIDGE_CLIENT_TYPE, -}; -use crate::suites::environment::PortalNetwork; -use ethportal_api::types::enr::generate_random_remote_enr; -use ethportal_api::types::portal::GetContentInfo; -use ethportal_api::BeaconNetworkApiClient; -use ethportal_api::Discv5ApiClient; -use hivesim::types::ClientDefinition; -use hivesim::{dyn_async, Client, NClientTestSpec, Test}; - -dyn_async! { - pub async fn run_rpc_compat_beacon_test_suite<'a> (test: &'a mut Test, _client: Option) { - // Get all available portal clients - let clients = test.sim.client_types().await; - // todo: remove this once we implement role in hivesim-rs - let clients: Vec = clients.into_iter().filter(|client| client.name != *TRIN_BRIDGE_CLIENT_TYPE).collect(); - - let environment_flag = PortalNetwork::as_environment_flag([PortalNetwork::Beacon]); - let environments = Some(vec![Some(HashMap::from([environment_flag]))]); - - // Test single type of client - for client in &clients { - test.run( - NClientTestSpec { - name: "discv5_nodeInfo".to_string(), - description: "".to_string(), - always_run: false, - run: test_node_info, - environments: environments.clone(), - test_data: (), - clients: vec![client.clone()], - } - ).await; - - test.run( - NClientTestSpec { - name: "portal_beaconLocalContent Expect ContentAbsent".to_string(), - description: "".to_string(), - always_run: false, - run: test_local_content_expect_content_absent, - environments: environments.clone(), - test_data: (), - clients: vec![client.clone()], - } - ).await; - - test.run( - NClientTestSpec { - name: "portal_beaconStore".to_string(), - description: "".to_string(), - always_run: false, - run: test_store, - environments: environments.clone(), - test_data: (), - clients: vec![client.clone()], - } - ).await; - - test.run( - NClientTestSpec { - name: "portal_beaconLocalContent Expect ContentPresent".to_string(), - description: "".to_string(), - always_run: false, - run: test_local_content_expect_content_present, - environments: environments.clone(), - test_data: (), - clients: vec![client.clone()], - } - ).await; - - test.run( - NClientTestSpec { - name: "portal_beaconAddEnr Expect true".to_string(), - description: "".to_string(), - always_run: false, - run: test_add_enr_expect_true, - environments: environments.clone(), - test_data: (), - clients: vec![client.clone()], - } - ).await; - - test.run( - NClientTestSpec { - name: "portal_beaconGetEnr None Found".to_string(), - description: "".to_string(), - always_run: false, - run: test_get_enr_non_present, - environments: environments.clone(), - test_data: (), - clients: vec![client.clone()], - } - ).await; - - test.run( - NClientTestSpec { - name: "portal_beaconGetEnr ENR Found".to_string(), - description: "".to_string(), - always_run: false, - run: test_get_enr_enr_present, - environments: environments.clone(), - test_data: (), - clients: vec![client.clone()], - } - ).await; - - test.run( - NClientTestSpec { - name: "portal_beaconGetEnr Local Enr".to_string(), - description: "".to_string(), - always_run: false, - run: test_get_enr_local_enr, - environments: environments.clone(), - test_data: (), - clients: vec![client.clone()], - } - ).await; - - test.run( - NClientTestSpec { - name: "portal_beaconDeleteEnr None Found".to_string(), - description: "".to_string(), - always_run: false, - run: test_delete_enr_non_present, - environments: environments.clone(), - test_data: (), - clients: vec![client.clone()], - } - ).await; - - test.run( - NClientTestSpec { - name: "portal_beaconDeleteEnr ENR Found".to_string(), - description: "".to_string(), - always_run: false, - run: test_delete_enr_enr_present, - environments: environments.clone(), - test_data: (), - clients: vec![client.clone()], - } - ).await; - - test.run( - NClientTestSpec { - name: "portal_beaconLookupEnr None Found".to_string(), - description: "".to_string(), - always_run: false, - run: test_lookup_enr_non_present, - environments: environments.clone(), - test_data: (), - clients: vec![client.clone()], - } - ).await; - - test.run( - NClientTestSpec { - name: "portal_beaconLookupEnr ENR Found".to_string(), - description: "".to_string(), - always_run: false, - run: test_lookup_enr_enr_present, - environments: environments.clone(), - test_data: (), - clients: vec![client.clone()], - } - ).await; - - test.run( - NClientTestSpec { - name: "portal_beaconLookupEnr Local Enr".to_string(), - description: "".to_string(), - always_run: false, - run: test_lookup_enr_local_enr, - environments: environments.clone(), - test_data: (), - clients: vec![client.clone()], - } - ).await; - - test.run( - NClientTestSpec { - name: "portal_beaconGetContent Content Absent".to_string(), - description: "".to_string(), - always_run: false, - run: test_get_content_content_absent, - environments: environments.clone(), - test_data: (), - clients: vec![client.clone()], - } - ).await; - - test.run( - NClientTestSpec { - name: "portal_beaconGetContent Content Present Locally".to_string(), - description: "".to_string(), - always_run: false, - run: test_get_content_content_present_locally, - environments: environments.clone(), - test_data: (), - clients: vec![client.clone()], - } - ).await; - } - } -} - -dyn_async! { - async fn test_node_info<'a>(clients: Vec, _: ()) { - let client = match clients.into_iter().next() { - Some((client)) => client, - None => panic!("Unable to get expected amount of clients from NClientTestSpec"), - }; - - if let Err(err) = Discv5ApiClient::node_info(&client.rpc).await { - panic!("Expected response not received: {err}"); - } - } -} - -dyn_async! { - async fn test_local_content_expect_content_absent<'a>(clients: Vec, _: ()) { - let client = match clients.into_iter().next() { - Some((client)) => client, - None => panic!("Unable to get expected amount of clients from NClientTestSpec"), - }; - let content_key = BOOTSTRAP_CONTENT_KEY.clone(); - - if let Ok(response) = BeaconNetworkApiClient::local_content(&client.rpc, content_key).await { - panic!("Expected to receive an error because content wasn't found {response:?}"); - } - } -} - -dyn_async! { - async fn test_store<'a>(clients: Vec, _: ()) { - let client = match clients.into_iter().next() { - Some((client)) => client, - None => panic!("Unable to get expected amount of clients from NClientTestSpec"), - }; - let content_key = BOOTSTRAP_CONTENT_KEY.clone(); - let raw_content_value = BOOTSTRAP_CONTENT_VALUE.clone(); - - if let Err(err) = BeaconNetworkApiClient::store(&client.rpc, content_key, raw_content_value).await { - panic!("{}", &err.to_string()); - } - } -} - -dyn_async! { - async fn test_local_content_expect_content_present<'a>(clients: Vec, _: ()) { - let client = match clients.into_iter().next() { - Some((client)) => client, - None => panic!("Unable to get expected amount of clients from NClientTestSpec"), - }; - let content_key = BOOTSTRAP_CONTENT_KEY.clone(); - let raw_content_value = BOOTSTRAP_CONTENT_VALUE.clone(); - - // seed CONTENT_KEY/content_value onto the local node to test local_content expect content present - if let Err(err) = BeaconNetworkApiClient::store(&client.rpc, content_key.clone(), raw_content_value.clone()).await { - panic!("Failed to store data: {err:?}"); - } - - // Here we are calling local_content RPC to test if the content is present - match BeaconNetworkApiClient::local_content(&client.rpc, content_key).await { - Ok(possible_content) => { - if possible_content != raw_content_value { - panic!("Error receiving content: Expected content: {raw_content_value:?}, Received content: {possible_content:?}"); - } - } - Err(err) => panic!("Expected content returned from local_content to be present {}", &err.to_string()), - } - } -} - -dyn_async! { - async fn test_add_enr_expect_true<'a>(clients: Vec, _: ()) { - let client = match clients.into_iter().next() { - Some((client)) => client, - None => panic!("Unable to get expected amount of clients from NClientTestSpec"), - }; - let (_, enr) = generate_random_remote_enr(); - match BeaconNetworkApiClient::add_enr(&client.rpc, enr).await { - Ok(response) => match response { - true => (), - false => panic!("AddEnr expected to get true and instead got false") - }, - Err(err) => panic!("{}", &err.to_string()), - } - } -} - -dyn_async! { - async fn test_get_enr_non_present<'a>(clients: Vec, _: ()) { - let client = match clients.into_iter().next() { - Some((client)) => client, - None => panic!("Unable to get expected amount of clients from NClientTestSpec"), - }; - let (_, enr) = generate_random_remote_enr(); - - if (BeaconNetworkApiClient::get_enr(&client.rpc, enr.node_id()).await).is_ok() { - panic!("GetEnr in this case is not supposed to return a value") - } - } -} - -dyn_async! { - async fn test_get_enr_local_enr<'a>(clients: Vec, _: ()) { - let client = match clients.into_iter().next() { - Some((client)) => client, - None => panic!("Unable to get expected amount of clients from NClientTestSpec"), - }; - // get our local enr from NodeInfo - let target_enr = match Discv5ApiClient::node_info(&client.rpc).await { - Ok(node_info) => node_info.enr, - Err(err) => panic!("Error getting node info: {err:?}"), - }; - - // check if we can fetch data from routing table - match BeaconNetworkApiClient::get_enr(&client.rpc, target_enr.node_id()).await { - Ok(response) => if response != target_enr { - panic!("Response from GetEnr didn't return expected Enr") - }, - Err(err) => panic!("{}", &err.to_string()), - } - } -} - -dyn_async! { - async fn test_get_enr_enr_present<'a>(clients: Vec, _: ()) { - let client = match clients.into_iter().next() { - Some((client)) => client, - None => panic!("Unable to get expected amount of clients from NClientTestSpec"), - }; - let (_, enr) = generate_random_remote_enr(); - - // seed enr into routing table - match BeaconNetworkApiClient::add_enr(&client.rpc, enr.clone()).await { - Ok(response) => match response { - true => (), - false => panic!("AddEnr expected to get true and instead got false") - }, - Err(err) => panic!("{}", &err.to_string()), - } - - // check if we can fetch data from routing table - match BeaconNetworkApiClient::get_enr(&client.rpc, enr.node_id()).await { - Ok(response) => if response != enr { - panic!("Response from GetEnr didn't return expected Enr"); - } - Err(err) => panic!("{}", &err.to_string()), - } - } -} - -dyn_async! { - async fn test_delete_enr_non_present<'a>(clients: Vec, _: ()) { - let client = match clients.into_iter().next() { - Some((client)) => client, - None => panic!("Unable to get expected amount of clients from NClientTestSpec"), - }; - let (_, enr) = generate_random_remote_enr(); - match BeaconNetworkApiClient::delete_enr(&client.rpc, enr.node_id()).await { - Ok(response) => if response { panic!("DeleteEnr expected to get false and instead got true") }, - Err(err) => panic!("{}", &err.to_string()), - }; - } -} - -dyn_async! { - async fn test_delete_enr_enr_present<'a>(clients: Vec, _: ()) { - let client = match clients.into_iter().next() { - Some((client)) => client, - None => panic!("Unable to get expected amount of clients from NClientTestSpec"), - }; - let (_, enr) = generate_random_remote_enr(); - - // seed enr into routing table - match BeaconNetworkApiClient::add_enr(&client.rpc, enr.clone()).await { - Ok(response) => match response { - true => (), - false => panic!("AddEnr expected to get true and instead got false") - }, - Err(err) => panic!("{}", &err.to_string()), - } - - // check if data was seeded into the table - match BeaconNetworkApiClient::get_enr(&client.rpc, enr.node_id()).await { - Ok(response) => if response != enr { - panic!("Response from GetEnr didn't return expected Enr") - }, - Err(err) => panic!("{}", &err.to_string()), - } - - // delete the data from routing table - match BeaconNetworkApiClient::delete_enr(&client.rpc, enr.node_id()).await { - Ok(response) => match response { - true => (), - false => panic!("DeleteEnr expected to get true and instead got false") - }, - Err(err) => panic!("{}", &err.to_string()), - }; - - // check if the enr was actually deleted out of the table or not - if (BeaconNetworkApiClient::get_enr(&client.rpc, enr.node_id()).await).is_ok() { - panic!("GetEnr in this case is not supposed to return a value") - } - } -} - -dyn_async! { - async fn test_lookup_enr_non_present<'a>(clients: Vec, _: ()) { - let client = match clients.into_iter().next() { - Some((client)) => client, - None => panic!("Unable to get expected amount of clients from NClientTestSpec"), - }; - let (_, enr) = generate_random_remote_enr(); - - if (BeaconNetworkApiClient::lookup_enr(&client.rpc, enr.node_id()).await).is_ok() { - panic!("LookupEnr in this case is not supposed to return a value") - } - } -} - -dyn_async! { - async fn test_lookup_enr_enr_present<'a>(clients: Vec, _: ()) { - let client = match clients.into_iter().next() { - Some((client)) => client, - None => panic!("Unable to get expected amount of clients from NClientTestSpec"), - }; - let (_, enr) = generate_random_remote_enr(); - - // seed enr into routing table - match BeaconNetworkApiClient::add_enr(&client.rpc, enr.clone()).await { - Ok(response) => match response { - true => (), - false => panic!("AddEnr expected to get true and instead got false") - }, - Err(err) => panic!("{}", &err.to_string()), - } - - // check if we can fetch data from routing table - match BeaconNetworkApiClient::lookup_enr(&client.rpc, enr.node_id()).await { - Ok(response) => if response != enr { - panic!("Response from LookupEnr didn't return expected Enr") - }, - Err(err) => panic!("{}", &err.to_string()), - } - } -} - -dyn_async! { - async fn test_lookup_enr_local_enr<'a>(clients: Vec, _: ()) { - let client = match clients.into_iter().next() { - Some((client)) => client, - None => panic!("Unable to get expected amount of clients from NClientTestSpec"), - }; - // get our local enr from NodeInfo - let target_enr = match Discv5ApiClient::node_info(&client.rpc).await { - Ok(node_info) => node_info.enr, - Err(err) => panic!("Error getting node info: {err:?}"), - }; - - // check if we can fetch data from routing table - match BeaconNetworkApiClient::lookup_enr(&client.rpc, target_enr.node_id()).await { - Ok(response) => if response != target_enr { - panic!("Response from LookupEnr didn't return expected Enr") - }, - Err(err) => panic!("{}", &err.to_string()), - } - } -} - -dyn_async! { - // test that a node will return a AbsentContent via GetContent when the data doesn't exist - async fn test_get_content_content_absent<'a>(clients: Vec, _: ()) { - let client = match clients.into_iter().next() { - Some((client)) => client, - None => panic!("Unable to get expected amount of clients from NClientTestSpec"), - }; - let bootstrap_content_key = BOOTSTRAP_CONTENT_KEY.clone(); - - - if let Ok(content) = BeaconNetworkApiClient::get_content(&client.rpc, bootstrap_content_key).await { - panic!("Error: Unexpected GetContent expected to not get the content and instead get an error: {content:?}"); - } - } -} - -dyn_async! { - // test that a node will return a PresentContent via GetContent when the data is stored locally - async fn test_get_content_content_present_locally<'a>(clients: Vec, _: ()) { - let client = match clients.into_iter().next() { - Some((client)) => client, - None => { - panic!("Unable to get expected amount of clients from NClientTestSpec"); - } - }; - - let content_key = BOOTSTRAP_CONTENT_KEY.clone(); - let raw_content_value = BOOTSTRAP_CONTENT_VALUE.clone(); - - // seed content_key/content_value onto the local node to test get_content expect content present - if let Err(err) = BeaconNetworkApiClient::store(&client.rpc, content_key.clone(), raw_content_value.clone()).await { - panic!("Failed to store data: {err:?}"); - } - - match BeaconNetworkApiClient::get_content(&client.rpc, content_key).await { - Ok(GetContentInfo { content, utp_transfer }) => { - assert!(!utp_transfer, "Error: Expected utp_transfer to be false"); - assert_eq!(content, raw_content_value, "Error receiving content"); - } - Err(err) => panic!("Expected GetContent to not throw an error {err:?}"), - } - } -} diff --git a/simulators/portal/src/suites/beacon/sync.rs b/simulators/portal/src/suites/beacon/sync.rs deleted file mode 100644 index 6f199f9207..0000000000 --- a/simulators/portal/src/suites/beacon/sync.rs +++ /dev/null @@ -1,200 +0,0 @@ -use crate::suites::beacon::bridge::service::BridgeService; -use crate::suites::beacon::constants::{ - BOOTNODES_ENVIRONMENT_VARIABLE, TRIN_BRIDGE_CLIENT_TYPE, - TRUSTED_BLOCK_ROOT_ENVIRONMENT_VARIABLE, -}; -use crate::suites::environment::PortalNetwork; -use ethportal_api::{BeaconNetworkApiClient, Discv5ApiClient}; -use hivesim::types::ClientDefinition; -use hivesim::{dyn_async, Client, NClientTestSpec, Test}; -use std::collections::HashMap; -use std::sync::Arc; -use tokio::time::{sleep, timeout, Duration}; - -dyn_async! { - pub async fn test_beacon_sync<'a> (test: &'a mut Test, _client: Option) { - // Get all available portal clients - let clients = test.sim.client_types().await; - // todo: remove this once we implement role in hivesim-rs - let clients: Vec = clients.into_iter().filter(|client| client.name != *TRIN_BRIDGE_CLIENT_TYPE).collect(); - - // this is the "blank" client, used just for storing beacon network - // syncing data, and then we test sync functionality on the other client - let environment = Some(HashMap::from([ - PortalNetwork::as_environment_flag([PortalNetwork::Beacon]), - ])); - let environments = Some(vec![environment.clone(), environment]); - - // Iterate over all possible pairings of clients and run the tests (including self-pairings) - for client in &clients { - test.run( - NClientTestSpec { - name: format!("Beacon sync test: latest finalized root. {}", client.name), - description: "".to_string(), - always_run: false, - run: test_client_syncs_with_latest_finalized_root, - environments: environments.clone(), - test_data: (), - clients: vec![client.clone()], - } - ).await; - test.run( - NClientTestSpec { - name: format!("Beacon sync test: latest optimistic root. {}", client.name), - description: "".to_string(), - always_run: false, - run: test_client_syncs_with_latest_optimistic_root, - environments: environments.clone(), - test_data: (), - clients: vec![client.clone()], - } - ).await; - } - } -} - -dyn_async! { - async fn test_client_syncs_with_latest_finalized_root<'a>(clients: Vec, _: ()) { - let Some((client)) = clients.into_iter().next() else { - panic!("Unable to get expected amount of clients from NClientTestSpec") - }; - - // starts the bridge service: - // the bridge service acts like a beacon bridge, but simply injects - // the latest data into the given client, so that it will be available - // for syncing from the client we're testing - let bridge_service = Arc::new(BridgeService::new(client.clone())); - let service_for_task = bridge_service.clone(); - let provider_handle = tokio::spawn(async move { - service_for_task.start(true).await; - }); - - // get enr - let client_enr = match client.rpc.node_info().await { - Ok(node_info) => node_info.enr, - Err(err) => panic!("Error getting node info: {err:?}"), - }; - - // wait for initial trusted block root - let result = timeout(Duration::from_secs(30), async { - loop { - if let Some(trusted_root) = bridge_service.trusted_block_root().await { - return trusted_root; - } - sleep(Duration::from_secs(1)).await; - } - }).await; - - let Ok(trusted_block_root) = result else { - drop(provider_handle); - panic!("Trusted block root not initialized in time"); - }; - - // start the client that we're using to test syncing functionality - let test_client = client.test.start_client( - client.kind, - Some(HashMap::from([ - (BOOTNODES_ENVIRONMENT_VARIABLE.to_string(), client_enr.to_base64()), - (TRUSTED_BLOCK_ROOT_ENVIRONMENT_VARIABLE.to_string(), trusted_block_root.to_string()), - PortalNetwork::as_environment_flag([PortalNetwork::Beacon]), - ]))).await; - - - // sleep 1 second to allow client to start - sleep(Duration::from_secs(1)).await; - - let result = timeout(Duration::from_secs(30), async { - loop { - if let Ok(finalized_root) = test_client.rpc.finalized_state_root().await { - return finalized_root; - } - sleep(Duration::from_secs(1)).await; - } - }).await; - - match result { - Ok(val) => { - let actual_finalized_root = bridge_service.latest_finalized_root().await.expect("to find a latest finalized root"); - assert_eq!(val, actual_finalized_root); - } - Err(err) => { - drop(provider_handle); - panic!("Error getting finalized state root: {err:?}"); - } - } - - drop(provider_handle); - } -} - -dyn_async! { - async fn test_client_syncs_with_latest_optimistic_root<'a>(clients: Vec, _: ()) { - let Some((client)) = clients.into_iter().next() else { - panic!("Unable to get expected amount of clients from NClientTestSpec") - }; - - // start bridge service - // the bridge service acts like a beacon bridge, but simply injects - // the latest data into the given client, so that it will be available - // for syncing from the client we're testing - let bridge_service = Arc::new(BridgeService::new(client.clone())); - let service_for_task = bridge_service.clone(); - let provider_handle = tokio::spawn(async move { - service_for_task.start(false).await; - }); - - // get enr - let client_enr = match client.rpc.node_info().await { - Ok(node_info) => node_info.enr, - Err(err) => panic!("Error getting node info: {err:?}"), - }; - - // wait for initial trusted block root - let result = timeout(Duration::from_secs(30), async { - loop { - if let Some(trusted_root) = bridge_service.trusted_block_root().await { - return trusted_root; - } - sleep(Duration::from_secs(1)).await; - } - }).await; - - let Ok(trusted_block_root) = result else { - drop(provider_handle); - panic!("Trusted block root not initialized in time"); - }; - - // start the client that we're using to test syncing functionality - let test_client = client.test.start_client( - client.kind, - Some(HashMap::from([ - (BOOTNODES_ENVIRONMENT_VARIABLE.to_string(), client_enr.to_base64()), - (TRUSTED_BLOCK_ROOT_ENVIRONMENT_VARIABLE.to_string(), trusted_block_root.to_string()), - PortalNetwork::as_environment_flag([PortalNetwork::Beacon]), - ]))).await; - - // sleep 1 second to allow client to start - sleep(Duration::from_secs(1)).await; - - let result = timeout(Duration::from_secs(30), async { - loop { - if let Ok(optimistic_root) = test_client.rpc.optimistic_state_root().await { - return optimistic_root; - } - sleep(Duration::from_secs(1)).await; - } - }).await; - match result { - Ok(val) => { - let actual_optimistic_root = bridge_service.latest_optimistic_root().await.expect("to find a latest optimistic root"); - assert_eq!(val, actual_optimistic_root); - } - Err(err) => { - drop(provider_handle); - panic!("Error getting optimistic state root: {err:?}"); - } - } - - drop(provider_handle); - } -} diff --git a/simulators/portal/src/suites/environment.rs b/simulators/portal/src/suites/environment.rs deleted file mode 100644 index f7e23fb116..0000000000 --- a/simulators/portal/src/suites/environment.rs +++ /dev/null @@ -1,34 +0,0 @@ -use std::fmt::Display; - -use itertools::Itertools; - -pub const HIVE_PORTAL_NETWORKS_SELECTED: &str = "HIVE_PORTAL_NETWORKS_SELECTED"; - -#[derive(Debug, Clone, Copy)] -pub enum PortalNetwork { - History, - Beacon, - State, -} - -impl PortalNetwork { - pub fn as_environment_flag( - networks: impl IntoIterator, - ) -> (String, String) { - let joined = networks - .into_iter() - .map(|network| network.to_string()) - .join(","); - (HIVE_PORTAL_NETWORKS_SELECTED.to_string(), joined) - } -} - -impl Display for PortalNetwork { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - match self { - PortalNetwork::History => f.write_str("history"), - PortalNetwork::Beacon => f.write_str("beacon"), - PortalNetwork::State => f.write_str("state"), - } - } -} diff --git a/simulators/portal/src/suites/history/constants.rs b/simulators/portal/src/suites/history/constants.rs deleted file mode 100644 index 8347b5c74e..0000000000 --- a/simulators/portal/src/suites/history/constants.rs +++ /dev/null @@ -1,154 +0,0 @@ -use alloy_primitives::Bytes; -use anyhow::{anyhow, bail, ensure}; -use ethportal_api::{ - types::{ - content_key::beacon::HistoricalSummariesWithProofKey, - content_value::beacon::ForkVersionedHistoricalSummariesWithProof, - }, - BeaconContentKey, BeaconContentValue, ContentValue, HistoryContentKey, HistoryContentValue, -}; -use serde_yaml::Value; -use ssz::Decode; -use std::{ - fs::{self, File}, - io::Read, - path::PathBuf, - str::FromStr, - sync::{Arc, LazyLock}, -}; - -// trin-bridge constants -pub const TRIN_BRIDGE_CLIENT_TYPE: &str = "trin-bridge"; - -pub const BASE_TEST_PATH: &str = "./portal-spec-tests/tests/mainnet/history/hive"; -const HISTORICAL_SUMMARIES_FILE_PREFIX: &str = "fork_digest_historical_summaries_"; -const HISTORICAL_SUMMARIES_FILE_SUFFIX: &str = ".ssz_snappy"; - -/// The content key and value for the latest historical summaries -/// -/// This is a static variable that is initialized once and can be reused -pub static LATEST_HISTORICAL_SUMMARIES: LazyLock> = - LazyLock::new(|| { - let (content_key, content_value) = - get_latest_historical_summaries().expect("Failed to load latest historical summaries"); - Arc::new((content_key, content_value)) - }); - -/// Get the latest historical summaries -/// -/// This should only be used in LATEST_HISTORICAL_SUMMARIES -fn get_latest_historical_summaries() -> anyhow::Result<(BeaconContentKey, BeaconContentValue)> { - let mut latest_epoch = 0; - let mut latest_file: Option = None; - - for entry in fs::read_dir(BASE_TEST_PATH)? { - let entry = entry?; - if entry.path().is_dir() { - continue; - } - let file_name = entry.file_name(); - let file_name_str = file_name.to_string_lossy(); - - if file_name_str.starts_with(HISTORICAL_SUMMARIES_FILE_PREFIX) - && file_name_str.ends_with(HISTORICAL_SUMMARIES_FILE_SUFFIX) - { - let epoch_str = &file_name_str[HISTORICAL_SUMMARIES_FILE_PREFIX.len() - ..file_name_str.len() - HISTORICAL_SUMMARIES_FILE_SUFFIX.len()]; - if let Ok(epoch) = epoch_str.parse::() { - if epoch > latest_epoch { - latest_epoch = epoch; - latest_file = Some(entry.path()); - } - } else { - bail!("Unable to parse epoch from file name: {file_name_str}"); - } - } - } - - let Some(path) = latest_file else { - bail!("No historical summaries files found in the directory"); - }; - - let mut encoded = vec![]; - let historical_summaries = File::open(path)?.read_to_end(&mut encoded)?; - ensure!( - historical_summaries > 0, - "Historical summaries file is empty", - ); - - let mut decoder = snap::read::FrameDecoder::new(&*encoded); - let mut decoded: Vec = vec![]; - decoder.read_to_end(&mut decoded)?; - - let historical_summaries_with_proof = - ForkVersionedHistoricalSummariesWithProof::from_ssz_bytes(&decoded).map_err(|err| { - anyhow!("Failed to decoded ForkVersionedHistoricalSummariesWithProof {err:?}") - })?; - - let content_key = - BeaconContentKey::HistoricalSummariesWithProof(HistoricalSummariesWithProofKey { - epoch: historical_summaries_with_proof - .historical_summaries_with_proof - .epoch, - }); - let content_value = - BeaconContentValue::HistoricalSummariesWithProof(historical_summaries_with_proof); - - Ok((content_key, content_value)) -} - -pub fn get_success_test_data() -> anyhow::Result> { - get_test_data("success") -} - -fn get_test_data(test_case: &str) -> anyhow::Result> { - let mut content = vec![]; - - let success_test_path = format!("{BASE_TEST_PATH}/{test_case}"); - for entry in std::fs::read_dir(success_test_path)? { - let entry = entry?; - let test_path = entry.path(); - if !test_path.is_file() { - bail!("Expected a file, but found a directory: {test_path:?}"); - } - - let values = std::fs::read_to_string(test_path)?; - let values: Value = serde_yaml::from_str(&values)?; - let test_case = values - .as_sequence() - .expect("unable to convert test data to sequence") - .iter() - .map(|value| { - let content_key: HistoryContentKey = - serde_yaml::from_value(value["content_key"].clone()) - .expect("to find content key"); - let raw_content_value = Bytes::from_str( - value["content_value"] - .as_str() - .expect("to find content value"), - ) - .expect("unable to convert content value to bytes"); - let content_value = - HistoryContentValue::decode(&content_key, raw_content_value.as_ref()) - .expect("unable to decode content value"); - (content_key, content_value) - }) - .collect::>(); - - content.extend(test_case); - } - - Ok(content) -} - -lazy_static::lazy_static! { - pub static ref HEADER_WITH_PROOF_KEY: HistoryContentKey = { - let value: HistoryContentKey = serde_json::from_str( - "\"0x00720704f3aa11c53cf344ea069db95cecb81ad7453c8f276b2a1062979611f09c\"" - ).expect("unable to convert content key to HistoryContentKey"); - value - }; - pub static ref HEADER_WITH_PROOF_VALUE: Bytes = Bytes::from_str( - "0x080000002d020000f90222a02c58e3212c085178dbb1277e2f3c24b3f451267a75a234945c1581af639f4a7aa058a694212e0416353a4d3865ccf475496b55af3a3d3b002057000741af9731919400192fb10df37c9fb26829eb2cc623cd1bf599e8a067a9fb631f4579f9015ef3c6f1f3830dfa2dc08afe156f750e90022134b9ebf6a018a2978fc62cd1a23e90de920af68c0c3af3330327927cda4c005faccefb5ce7a0168a3827607627e781941dc777737fc4b6beb69a8b139240b881992b35b854eab9010000200000400000001000400080080000000000010004010001000008000000002000110000000000000090020001110402008000080208040010000000a8000000000000000000210822000900205020000000000160020020000400800040000000000042080000000400004008084020001000001004004000001000000000000001000000110000040000010200844040048101000008002000404810082002800000108020000200408008000100000000000000002020000b00010080600902000200000050000400000000000000400000002002101000000a00002000003420000800400000020100002000000000000000c00040000001000000100187327bd7ad3116ce83e147ed8401c9c36483140db184627d9afa9a457468657265756d50504c4e532f326d696e6572735f55534133a0f1a32e24eb62f01ec3f2b3b5893f7be9062fbf5482bc0d490a54352240350e26882087fbb243327696851aae1651b60cc53ffa2df1bae1550a0000000000000000000000000000000000000000000063d45d0a2242d35484f289108b3c80cccf943005db0db6c67ffea4c4a47fd529f64d74fa6068a3fd89a2c0d9938c3a751c4706d0b0e8f99dec6b517cf12809cb413795c8c678b3171303ddce2fa1a91af6a0961b9db72750d4d5ea7d5103d8d25f23f522d9af4c13fe8ac7a7d9d64bb08d980281eea5298b93cb1085fedc19d4c60afdd52d116cfad030cf4223e50afa8031154a2263c76eb08b96b5b8fdf5e5c30825d5c918eefb89daaf0e8573f20643614d9843a1817b6186074e4e53b22cf49046d977c901ec00aef1555fa89468adc2a51a081f186c995153d1cba0f2887d585212d68be4b958d309fbe611abe98a9bfc3f4b7a7b72bb881b888d89a04ecfe08b1c1a48554a48328646e4f864fe722f12d850f0be29e3829d1f94b34083032a9b6f43abd559785c996229f8e022d4cd6dcde4aafcce6445fe8743e1fcbe8672a99f9d9e3a5ca10c01f3751d69fbd22197f0680bc1529151130b22759bf185f4dbce357f46eb9cc8e21ea78f49b298eea2756d761fe23de8bea0d2e15aed136d689f6d252c54ebadc3e46b84a397b681edf7ec63522b9a298301084d019d0020000000000000000000000000000000000000000000000000000000000000" - ).expect("unable to convert content value to bytes"); -} diff --git a/simulators/portal/src/suites/history/interop.rs b/simulators/portal/src/suites/history/interop.rs deleted file mode 100644 index 21ab40a2df..0000000000 --- a/simulators/portal/src/suites/history/interop.rs +++ /dev/null @@ -1,533 +0,0 @@ -use std::collections::HashMap; - -use ethportal_api::types::accept_code::{AcceptCode, AcceptCodeList}; -use ethportal_api::types::portal::{FindContentInfo, GetContentInfo, PutContentInfo}; -use ethportal_api::types::portal_wire::MAX_PORTAL_CONTENT_PAYLOAD_SIZE; -use ethportal_api::{ - BeaconNetworkApiClient, ContentValue, Discv5ApiClient, HistoryContentKey, HistoryContentValue, - HistoryNetworkApiClient, -}; -use hivesim::types::ClientDefinition; -use hivesim::{dyn_async, Client, NClientTestSpec, Test}; -use itertools::Itertools; -use tokio::time::Duration; - -use crate::suites::environment::PortalNetwork; -use crate::suites::history::constants::{ - get_success_test_data, HEADER_WITH_PROOF_KEY, TRIN_BRIDGE_CLIENT_TYPE, -}; -use crate::suites::utils::get_flair; - -use super::constants::LATEST_HISTORICAL_SUMMARIES; - -type TestData = Vec<(HistoryContentKey, HistoryContentValue)>; - -/// Processed content data for history tests -struct ProcessedContent { - content_type: String, - block_number: u64, - test_data: TestData, -} - -fn process_content( - content: Vec<(HistoryContentKey, HistoryContentValue)>, -) -> Vec { - let mut last_header = content.first().expect("to find a value").clone(); - - let mut result: Vec = vec![]; - for history_content in content.into_iter() { - if let HistoryContentKey::BlockHeaderByHash(_) = &history_content.0 { - last_header = history_content.clone(); - } - let (content_type, block_number, test_data) = - if let HistoryContentValue::BlockHeaderWithProof(header_with_proof) = &last_header.1 { - match &history_content.0 { - HistoryContentKey::BlockHeaderByHash(_) => ( - "Block Header by Hash".to_string(), - header_with_proof.header.number, - vec![last_header.clone()], - ), - HistoryContentKey::BlockHeaderByNumber(_) => ( - "Block Header by Number".to_string(), - header_with_proof.header.number, - vec![history_content], - ), - HistoryContentKey::BlockBody(_) => ( - "Block Body".to_string(), - header_with_proof.header.number, - vec![history_content, last_header.clone()], - ), - HistoryContentKey::BlockReceipts(_) => ( - "Block Receipt".to_string(), - header_with_proof.header.number, - vec![history_content, last_header.clone()], - ), - HistoryContentKey::EphemeralHeadersFindContent(_) => { - todo!("Add test for EphemeralHeadersFindContent") - } - HistoryContentKey::EphemeralHeaderOffer(_) => { - todo!("Add tests for EphemeralHeaderOffer") - } - } - } else { - unreachable!("History test dated is formatted incorrectly") - }; - result.push(ProcessedContent { - content_type, - block_number, - test_data, - }) - } - result -} - -pub fn get_test_message(block_number: u64) -> String { - if block_number == u64::MAX { - " ".to_string() - } else { - format!(" block number {}{}", block_number, get_flair(block_number)) - } -} - -dyn_async! { - pub async fn test_portal_history_interop<'a> (test: &'a mut Test, _client: Option) { - // Get all available portal clients - let clients = test.sim.client_types().await; - // todo: remove this once we implement role in hivesim-rs - let clients: Vec = clients.into_iter().filter(|client| client.name != *TRIN_BRIDGE_CLIENT_TYPE).collect(); - let content = get_success_test_data().expect("Unable to get test data"); - - let environment = Some(HashMap::from([PortalNetwork::as_environment_flag([PortalNetwork::Beacon, PortalNetwork::History])])); - let environments = Some(vec![environment.clone(), environment]); - - // Iterate over all possible pairings of clients and run the tests (including self-pairings) - for (client_a, client_b) in clients.iter().cartesian_product(clients.iter()) { - for ProcessedContent { content_type, block_number, test_data } in process_content(content.clone()) { - test.run( - NClientTestSpec { - name: format!("OFFER {}:{} {} --> {}", content_type, get_test_message(block_number), client_a.name, client_b.name), - description: "".to_string(), - always_run: false, - run: test_offer, - environments: environments.clone(), - test_data: test_data.clone(), - clients: vec![client_a.clone(), client_b.clone()], - } - ).await; - - test.run( - NClientTestSpec { - name: format!("GetContent {}:{} {} --> {}", content_type, get_test_message(block_number), client_a.name, client_b.name), - description: "".to_string(), - always_run: false, - run: test_get_content, - environments: environments.clone(), - test_data: test_data.clone(), - clients: vec![client_a.clone(), client_b.clone()], - } - ).await; - - test.run( - NClientTestSpec { - name: format!("FindContent {}:{} {} --> {}", content_type, get_test_message(block_number), client_a.name, client_b.name), - description: "".to_string(), - always_run: false, - run: test_find_content, - environments: environments.clone(), - test_data, - clients: vec![client_a.clone(), client_b.clone()], - } - ).await; - } - - // Test portal history ping - test.run(NClientTestSpec { - name: format!("PING {} --> {}", client_a.name, client_b.name), - description: "".to_string(), - always_run: false, - run: test_ping, - environments: environments.clone(), - test_data: (), - clients: vec![client_a.clone(), client_b.clone()], - } - ).await; - - // Test find content non-present - test.run(NClientTestSpec { - name: format!("FIND_CONTENT non present {} --> {}", client_a.name, client_b.name), - description: "find content: calls find content that doesn't exist".to_string(), - always_run: false, - run: test_find_content_non_present, - environments: environments.clone(), - test_data: (), - clients: vec![client_a.clone(), client_b.clone()], - } - ).await; - - // Test find nodes distance zero - test.run(NClientTestSpec { - name: format!("FIND_NODES Distance 0 {} --> {}", client_a.name, client_b.name), - description: "find nodes: distance zero expect called nodes enr".to_string(), - always_run: false, - run: test_find_nodes_zero_distance, - environments: environments.clone(), - test_data: (), - clients: vec![client_a.clone(), client_b.clone()], - } - ).await; - - // Test gossiping a collection of blocks to node B (B will gossip back to A) - test.run( - NClientTestSpec { - name: format!("PUT CONTENT blocks from A:{} --> B:{}", client_a.name, client_b.name), - description: "".to_string(), - always_run: false, - run: test_put_content_two_nodes, - environments: environments.clone(), - test_data: content.clone(), - clients: vec![client_a.clone(), client_b.clone()], - } - ).await; - } - } -} - -dyn_async! { - // test that a node will not return content via FINDCONTENT. - async fn test_find_content_non_present<'a>(clients: Vec, _: ()) { - let (client_a, client_b) = initialize_clients(clients).await; - - let header_with_proof_key = HEADER_WITH_PROOF_KEY.clone(); - - let target_enr = match client_b.rpc.node_info().await { - Ok(node_info) => node_info.enr, - Err(err) => panic!("Error getting node info: {err:?}"), - }; - - let result = HistoryNetworkApiClient::find_content(&client_a.rpc, target_enr, header_with_proof_key.clone()).await; - - match result { - Ok(FindContentInfo::Enrs { enrs }) => if !enrs.is_empty() { - panic!("Error: Unexpected FINDCONTENT response: expected ContentInfo::Enrs length 0 got {}", enrs.len()); - } - Ok(FindContentInfo::Content { .. }) => panic!("Error: Unexpected FINDCONTENT response: wasn't supposed to return back content"), - Err(err) => panic!("Error: Unable to get response from FINDCONTENT request: {err:?}"), - } - } -} - -dyn_async! { - async fn test_offer<'a>(clients: Vec, test_data: TestData) { - let (client_a, client_b) = initialize_clients(clients).await; - - if let Some((optional_key, optional_value)) = test_data.get(1).cloned() { - match HistoryNetworkApiClient::store(&client_b.rpc, optional_key, optional_value.encode()).await { - Ok(result) => if !result { - panic!("Unable to store optional content for get content"); - }, - Err(err) => panic!("Error storing optional content for get content: {err:?}"), - } - } - let (target_key, target_value) = test_data.first().cloned().expect("Target content is required for this test"); - - let target_enr = match client_b.rpc.node_info().await { - Ok(node_info) => node_info.enr, - Err(err) => panic!("Error getting node info: {err:?}"), - }; - - let accept_info = HistoryNetworkApiClient::offer(&client_a.rpc, target_enr, vec![(target_key.clone(), target_value.encode())]).await.expect("Failed to send offer"); - let mut expected_accept_code_list = AcceptCodeList::new(1).expect("We are making a valid accept code list"); - expected_accept_code_list.set(0, AcceptCode::Accepted); - assert_eq!( - accept_info.0, - expected_accept_code_list, - "AcceptCodeList didn't match expected value", - ); - - tokio::time::sleep(Duration::from_secs(8)).await; - - match HistoryNetworkApiClient::local_content(&client_b.rpc, target_key).await { - Ok(possible_content) => { - if possible_content != target_value.encode() { - panic!("Error receiving content: Expected content: {target_value:?}, Received content: {possible_content:?}"); - } - } - Err(err) => panic!("Unable to get received content: {err:?}"), - } - } -} - -dyn_async! { - async fn test_ping<'a>(clients: Vec, _: ()) { - let (client_a, client_b) = initialize_clients(clients).await; - - let target_enr = match client_b.rpc.node_info().await { - Ok(node_info) => node_info.enr, - Err(err) => panic!("Error getting node info: {err:?}"), - }; - - let pong = HistoryNetworkApiClient::ping(&client_a.rpc, target_enr, None, None).await; - - if let Err(err) = pong { - panic!("Unable to receive pong info: {err:?}"); - } - - // Verify that client_b stored client_a its ENR through the base layer - // handshake mechanism. - let stored_enr = match client_a.rpc.node_info().await { - Ok(node_info) => node_info.enr, - Err(err) => panic!("Error getting node info: {err:?}"), - }; - - match HistoryNetworkApiClient::get_enr(&client_b.rpc, stored_enr.node_id()).await { - Ok(response) => { - if response != stored_enr { - panic!("Response from GetEnr didn't return expected ENR. Got: {response}; Expected: {stored_enr}") - } - }, - Err(err) => panic!("Failed while trying to get client A's ENR from client B: {err}"), - } - } -} - -dyn_async! { - async fn test_find_nodes_zero_distance<'a>(clients: Vec, _: ()) { - let (client_a, client_b) = initialize_clients(clients).await; - - let target_enr = match client_b.rpc.node_info().await { - Ok(node_info) => node_info.enr, - Err(err) => panic!("Error getting node info: {err:?}"), - }; - - match HistoryNetworkApiClient::find_nodes(&client_a.rpc, target_enr.clone(), vec![0]).await { - Ok(response) => { - if response.len() != 1 { - panic!("Response from FindNodes didn't return expected length of 1"); - } - - match response.first() { - Some(response_enr) => if *response_enr != target_enr { - panic!("Response from FindNodes didn't return expected Enr"); - }, - None => panic!("Error find nodes zero distance wasn't supposed to return None"), - } - } - Err(err) => panic!("{}", &err.to_string()), - } - } -} - -dyn_async! { - // test that a node will return a content via GETCONTENT template that it has stored locally - async fn test_get_content<'a>(clients: Vec, test_data: TestData) { - let (client_a, client_b) = initialize_clients(clients).await; - - if let Some((optional_key, optional_value)) = test_data.get(1).cloned() { - match HistoryNetworkApiClient::store(&client_b.rpc, optional_key, optional_value.encode()).await { - Ok(result) => if !result { - panic!("Unable to store optional content for get content"); - }, - Err(err) => panic!("Error storing optional content for get content: {err:?}"), - } - } - - let (target_key, target_value) = test_data.first().cloned().expect("Target content is required for this test"); - match HistoryNetworkApiClient::store(&client_b.rpc, target_key.clone(), target_value.encode()).await { - Ok(result) => if !result { - panic!("Error storing target content for get content"); - }, - Err(err) => panic!("Error storing target content: {err:?}"), - } - - let target_enr = match client_b.rpc.node_info().await { - Ok(node_info) => node_info.enr, - Err(err) => panic!("Error getting node info: {err:?}"), - }; - - match HistoryNetworkApiClient::add_enr(&client_a.rpc, target_enr.clone()).await { - Ok(response) => match response { - true => (), - false => panic!("AddEnr expected to get true and instead got false") - }, - Err(err) => panic!("{}", &err.to_string()), - } - - match HistoryNetworkApiClient::get_content(&client_a.rpc, target_key.clone()).await { - Ok(GetContentInfo { content, utp_transfer }) => { - if content != target_value.encode() { - panic!("Error: Unexpected GETCONTENT response: didn't return expected target content"); - } - - if target_value.encode().len() < MAX_PORTAL_CONTENT_PAYLOAD_SIZE { - if utp_transfer { - panic!("Error: Unexpected GETCONTENT response: utp_transfer was supposed to be false"); - } - } else if !utp_transfer { - panic!("Error: Unexpected GETCONTENT response: utp_transfer was supposed to be true"); - } - }, - Err(err) => panic!("Error: Unable to get response from GETCONTENT request: {err:?}"), - } - } -} - -dyn_async! { - // test that a node will return a x content via FINDCONTENT that it has stored locally - async fn test_find_content<'a> (clients: Vec, test_data: TestData) { - let (client_a, client_b) = initialize_clients(clients).await; - - if let Some((optional_key, optional_value)) = test_data.get(1).cloned() { - match HistoryNetworkApiClient::store(&client_b.rpc, optional_key, optional_value.encode()).await { - Ok(result) => if !result { - panic!("Unable to store optional content for find content"); - }, - Err(err) => panic!("Error storing optional content for find content: {err:?}"), - } - } - - let (target_key, target_value) = test_data.first().cloned().expect("Target content is required for this test"); - match HistoryNetworkApiClient::store(&client_b.rpc, target_key.clone(), target_value.encode()).await { - Ok(result) => if !result { - panic!("Error storing target content for find content"); - }, - Err(err) => panic!("Error storing target content: {err:?}"), - } - - let target_enr = match client_b.rpc.node_info().await { - Ok(node_info) => node_info.enr, - Err(err) => panic!("Error getting node info: {err:?}"), - }; - - match HistoryNetworkApiClient::find_content(&client_a.rpc, target_enr, target_key.clone()).await { - Ok(FindContentInfo::Content { content, utp_transfer }) => { - if content != target_value.encode() { - panic!("Error: Unexpected FINDCONTENT response: didn't return expected block body"); - } - - if target_value.encode().len() < MAX_PORTAL_CONTENT_PAYLOAD_SIZE { - if utp_transfer { - panic!("Error: Unexpected FINDCONTENT response: utp_transfer was supposed to be false"); - } - } else if !utp_transfer { - panic!("Error: Unexpected FINDCONTENT response: utp_transfer was supposed to be true"); - } - } - Ok(FindContentInfo::Enrs { .. }) => panic!("Error: Unexpected FINDCONTENT response: wasn't supposed to return back enrs"), - Err(err) => panic!("Error: Unable to get response from FINDCONTENT request: {err:?}"), - } - } -} - -dyn_async! { - async fn test_put_content_two_nodes<'a> (clients: Vec, test_data: TestData) { - let (client_a, client_b) = initialize_clients(clients).await; - - // connect clients - let client_b_enr = match client_b.rpc.node_info().await { - Ok(node_info) => node_info.enr, - Err(err) => panic!("Error getting node info: {err:?}"), - }; - match HistoryNetworkApiClient::add_enr(&client_a.rpc, client_b_enr.clone()).await { - Ok(response) => match response { - true => (), - false => panic!("AddEnr expected to get true and instead got false") - }, - Err(err) => panic!("{}", &err.to_string()), - } - - // With default node settings nodes should be storing all content - for (content_key, content_value) in test_data.clone() { - match HistoryNetworkApiClient::put_content(&client_a.rpc, content_key.clone(), content_value.encode()).await { - Ok(PutContentInfo { peer_count, .. }) => { - if peer_count != 1 { - panic!("We expected to gossip to 1 node instead we gossiped to: {peer_count}"); - } - } - Err(err) => panic!("Unable to get received content: {err:?}"), - } - - if let HistoryContentKey::BlockHeaderByHash(_) = content_key { - tokio::time::sleep(Duration::from_secs(1)).await; - } - } - - // wait test_data.len() seconds for data to propagate, giving more time if more items are propagating - tokio::time::sleep(Duration::from_secs(test_data.len() as u64)).await; - - // process raw test data to generate content details for error output - let (first_header_key, first_header_value) = test_data.first().cloned().expect("Test data is empty"); - let mut last_header_seen: (HistoryContentKey, HistoryContentValue) = (first_header_key, first_header_value); - let mut result = vec![]; - for (content_key, content_value) in test_data.into_iter() { - if let HistoryContentKey::BlockHeaderByHash(_) = &content_key { - last_header_seen = (content_key.clone(), content_value.clone()); - } - let content_details = - if let HistoryContentValue::BlockHeaderWithProof(header_with_proof) = &last_header_seen.1 { - let content_type = match &content_key { - HistoryContentKey::BlockHeaderByHash(_) => "header by hash".to_string(), - HistoryContentKey::BlockHeaderByNumber(_) => "header by number".to_string(), - HistoryContentKey::BlockBody(_) => "body".to_string(), - HistoryContentKey::BlockReceipts(_) => "receipt".to_string(), - HistoryContentKey::EphemeralHeadersFindContent(_) => "ephemeral headers find_content".to_string(), - HistoryContentKey::EphemeralHeaderOffer(_) => "ephemeral header offer".to_string(), - }; - format!( - "{} {}", - get_test_message(header_with_proof.header.number), - content_type - ) - } else { - unreachable!("History test data is formatted incorrectly. Header wasn't in front of data. Please refer to test data file for more information") - }; - - match HistoryNetworkApiClient::local_content(&client_b.rpc, content_key.clone()).await { - Ok(expected_value) => if expected_value != content_value.encode() { - result.push(format!("Error content received for block {content_details} was different then expected")); - } - Err(err) => result.push(format!("Error content for block {err} was absent")), - } - } - - if !result.is_empty() { - panic!("Client B: {result:?}"); - } - } -} - -/// Initialize clients for the test -/// -/// It will insert HistoricalSummariesWithProof content into the clients -/// -/// Panics if the clients are not of length 2, or if HistoricalSummaries can't be seeded -async fn initialize_clients(clients: Vec) -> (Client, Client) { - let (content_key, content_value) = LATEST_HISTORICAL_SUMMARIES.as_ref().clone(); - - for client in clients.iter() { - match BeaconNetworkApiClient::store( - &client.rpc, - content_key.clone(), - content_value.encode(), - ) - .await - { - Ok(result) => { - if !result { - panic!( - "Unable to HistoricalSummaries for client_type {}", - client.kind - ); - } - } - Err(err) => panic!( - "Error storing HistoricalSummaries for client_type {}: {err:?}", - client.kind - ), - } - } - - match clients.into_iter().collect_tuple() { - Some((client_a, client_b)) => (client_a, client_b), - None => panic!("Unable to get expected amount of clients from NClientTestSpec"), - } -} diff --git a/simulators/portal/src/suites/history/mesh.rs b/simulators/portal/src/suites/history/mesh.rs deleted file mode 100644 index eb5cf28148..0000000000 --- a/simulators/portal/src/suites/history/mesh.rs +++ /dev/null @@ -1,220 +0,0 @@ -use alloy_primitives::Bytes; -use ethportal_api::types::distance::{Metric, XorMetric}; -use ethportal_api::types::portal::FindContentInfo; -use ethportal_api::{ - BeaconNetworkApiClient, ContentValue, Discv5ApiClient, HistoryContentKey, - HistoryNetworkApiClient, -}; -use hivesim::types::ClientDefinition; -use hivesim::{dyn_async, Client, NClientTestSpec, Test}; -use itertools::Itertools; -use std::collections::HashMap; - -use crate::suites::environment::PortalNetwork; -use crate::suites::history::constants::{ - HEADER_WITH_PROOF_KEY, HEADER_WITH_PROOF_VALUE, TRIN_BRIDGE_CLIENT_TYPE, -}; - -use super::constants::LATEST_HISTORICAL_SUMMARIES; - -// private key hive environment variable -const PRIVATE_KEY_ENVIRONMENT_VARIABLE: &str = "HIVE_CLIENT_PRIVATE_KEY"; - -dyn_async! { - pub async fn test_portal_history_mesh<'a> (test: &'a mut Test, _client: Option) { - // Get all available portal clients - let clients = test.sim.client_types().await; - // todo: remove this once we implement role in hivesim-rs - let clients: Vec = clients.into_iter().filter(|client| client.name != *TRIN_BRIDGE_CLIENT_TYPE).collect(); - - let private_key_1 = "fc34e57cc83ed45aae140152fd84e2c21d1f4d46e19452e13acc7ee90daa5bac".to_string(); - let private_key_2 = "e5add57dc4c9ef382509e61ce106ec86f60eb73bbfe326b00f54bf8e1819ba11".to_string(); - - let selected_networks = PortalNetwork::as_environment_flag([PortalNetwork::Beacon, PortalNetwork::History]); - - // Iterate over all possible pairings of clients and run the tests (including self-pairings) - for ((client_a, client_b), client_c) in clients.iter().cartesian_product(clients.iter()).cartesian_product(clients.iter()) { - test.run( - NClientTestSpec { - name: format!("FIND_CONTENT content stored 2 nodes away stored in client C (Client B closer to content then C). A:{} --> B:{} --> C:{}", client_a.name, client_b.name, client_c.name), - description: "".to_string(), - always_run: false, - run: test_find_content_two_jumps, - environments: Some(vec![Some(HashMap::from([selected_networks.clone()])), Some(HashMap::from([(PRIVATE_KEY_ENVIRONMENT_VARIABLE.to_string(), private_key_2.clone()), selected_networks.clone()])), Some(HashMap::from([(PRIVATE_KEY_ENVIRONMENT_VARIABLE.to_string(), private_key_1.clone()), selected_networks.clone()]))]), - test_data: (), - clients: vec![client_a.clone(), client_b.clone(), client_c.clone()], - } - ).await; - - // Remove this after the clients are stable across two jumps test - test.run( - NClientTestSpec { - name: format!("FIND_CONTENT content stored 2 nodes away stored in client C (Client C closer to content then B). A:{} --> B:{} --> C:{}", client_a.name, client_b.name, client_c.name), - description: "".to_string(), - always_run: false, - run: test_find_content_two_jumps, - environments: Some(vec![Some(HashMap::from([selected_networks.clone()])), Some(HashMap::from([(PRIVATE_KEY_ENVIRONMENT_VARIABLE.to_string(), private_key_1.clone()), selected_networks.clone()])), Some(HashMap::from([(PRIVATE_KEY_ENVIRONMENT_VARIABLE.to_string(), private_key_2.clone()), selected_networks.clone()]))]), - test_data: (), - clients: vec![client_a.clone(), client_b.clone(), client_c.clone()], - } - ).await; - - // Test find nodes distance of client a - test.run(NClientTestSpec { - name: format!("FIND_NODES distance of client C {} --> {} --> {}", client_a.name, client_b.name, client_c.name), - description: "find nodes: distance of client A expect seeded enr returned".to_string(), - always_run: false, - run: test_find_nodes_distance_of_client_c, - environments: Some(vec![Some(HashMap::from([selected_networks.clone()])), Some(HashMap::from([selected_networks.clone()])), Some(HashMap::from([selected_networks.clone()]))]), - test_data: (), - clients: vec![client_a.clone(), client_b.clone(), client_c.clone()], - } - ).await; - } - } -} - -dyn_async! { - async fn test_find_content_two_jumps<'a> (clients: Vec, _: ()) { - let (client_a, client_b, client_c) = initialize_clients(clients).await; - - let header_with_proof_key: &HistoryContentKey = &HEADER_WITH_PROOF_KEY; - let raw_header_with_proof_value: &Bytes = &HEADER_WITH_PROOF_VALUE; - - // get enr for b and c to seed for the jumps - let client_b_enr = match client_b.rpc.node_info().await { - Ok(node_info) => node_info.enr, - Err(err) => panic!("Error getting node info: {err:?}"), - }; - - let client_c_enr = match client_c.rpc.node_info().await { - Ok(node_info) => node_info.enr, - Err(err) => panic!("Error getting node info: {err:?}"), - }; - - // seed client_c_enr into routing table of client_b - match HistoryNetworkApiClient::add_enr(&client_b.rpc, client_c_enr.clone()).await { - Ok(response) => match response { - true => (), - false => panic!("AddEnr expected to get true and instead got false") - }, - Err(err) => panic!("{}", &err.to_string()), - } - - // send a ping from client B to C to connect the clients - if let Err(err) = HistoryNetworkApiClient::ping(&client_b.rpc, client_c_enr.clone(), None, None).await { - panic!("Unable to receive pong info: {err:?}"); - } - - // seed the data into client_c - match HistoryNetworkApiClient::store(&client_c.rpc, header_with_proof_key.clone(), raw_header_with_proof_value.clone()).await { - Ok(result) => if !result { - panic!("Unable to store header with proof for find content immediate return test"); - }, - Err(err) => panic!("Error storing header with proof for find content immediate return test: {err:?}"), - } - - let enrs = match HistoryNetworkApiClient::find_content(&client_a.rpc, client_b_enr.clone(), header_with_proof_key.clone()).await { - Ok(FindContentInfo::Enrs{ enrs }) => enrs, - Ok(FindContentInfo::Content{ .. }) => panic!("Error: Unexpected FINDCONTENT response: expected Enrs instead got Content"), - Err(err) => panic!("Error: Unable to get response from FINDCONTENT request: {err:?}"), - }; - - if enrs.len() != 1 { - panic!("Known node is closer to content, Enrs returned should be 0 instead got: length {}", enrs.len()); - } - - match HistoryNetworkApiClient::find_content(&client_a.rpc, enrs[0].clone(), header_with_proof_key.clone()).await { - Ok(FindContentInfo::Content { content, utp_transfer }) => { - if content != raw_header_with_proof_value.clone() { - panic!("Error: Unexpected FINDCONTENT response: didn't return expected header with proof value"); - } - - if utp_transfer { - panic!("Error: Unexpected FINDCONTENT response: utp_transfer was supposed to be false"); - } - }, - Ok(FindContentInfo::Enrs { .. }) => panic!("Error: Unexpected FINDCONTENT response: expected Content instead got Enrs"), - Err(err) => panic!("Error: Unable to get response from FINDCONTENT request: {err:?}"), - } - } -} - -dyn_async! { - async fn test_find_nodes_distance_of_client_c<'a>(clients: Vec, _: ()) { - let (client_a, client_b, client_c) = initialize_clients(clients).await; - - let target_enr = match client_b.rpc.node_info().await { - Ok(node_info) => node_info.enr, - Err(err) => panic!("Error getting node info: {err:?}"), - }; - - // We are adding client C to our list so we then can assume only one client per bucket - let client_c_enr = match client_c.rpc.node_info().await { - Ok(node_info) => node_info.enr, - Err(err) => panic!("Error getting node info: {err:?}"), - }; - - // seed enr into routing table - match HistoryNetworkApiClient::add_enr(&client_b.rpc, client_c_enr.clone()).await { - Ok(response) => if !response { - panic!("AddEnr expected to get true and instead got false") - }, - Err(err) => panic!("{}", &err.to_string()), - } - - if let Some(distance) = XorMetric::distance(&target_enr.node_id().raw(), &client_c_enr.node_id().raw()).log2() { - match HistoryNetworkApiClient::find_nodes(&client_a.rpc, target_enr.clone(), vec![distance as u16]).await { - Ok(response) => { - if response.is_empty() { - panic!("FindNodes expected to have received a non-empty response"); - } - - if !response.contains(&client_c_enr) { - panic!("FindNodes {distance} distance expected to contained seeded Enr"); - } - } - Err(err) => panic!("{}", &err.to_string()), - } - } else { - panic!("Distance calculation failed"); - } - } -} - -/// Initialize clients for the test -/// -/// It will insert HistoricalSummariesWithProof content into the clients -/// -/// Panics if the clients are not of length 3, or if HistoricalSummaries can't be seeded -async fn initialize_clients(clients: Vec) -> (Client, Client, Client) { - let (content_key, content_value) = LATEST_HISTORICAL_SUMMARIES.as_ref().clone(); - - for client in clients.iter() { - match BeaconNetworkApiClient::store( - &client.rpc, - content_key.clone(), - content_value.encode(), - ) - .await - { - Ok(result) => { - if !result { - panic!( - "Unable to HistoricalSummaries for client_type {}", - client.kind - ); - } - } - Err(err) => panic!( - "Error storing HistoricalSummaries for client_type {}: {err:?}", - client.kind - ), - } - } - - match clients.into_iter().collect_tuple() { - Some((client_a, client_b, client_c)) => (client_a, client_b, client_c), - None => panic!("Unable to get expected amount of clients from NClientTestSpec"), - } -} diff --git a/simulators/portal/src/suites/history/mod.rs b/simulators/portal/src/suites/history/mod.rs deleted file mode 100644 index aa23404843..0000000000 --- a/simulators/portal/src/suites/history/mod.rs +++ /dev/null @@ -1,4 +0,0 @@ -pub mod constants; -pub mod interop; -pub mod mesh; -pub mod rpc_compat; diff --git a/simulators/portal/src/suites/history/rpc_compat.rs b/simulators/portal/src/suites/history/rpc_compat.rs deleted file mode 100644 index 3c85df7d30..0000000000 --- a/simulators/portal/src/suites/history/rpc_compat.rs +++ /dev/null @@ -1,521 +0,0 @@ -use crate::suites::history::constants::{ - HEADER_WITH_PROOF_KEY, HEADER_WITH_PROOF_VALUE, TRIN_BRIDGE_CLIENT_TYPE, -}; -use ethportal_api::types::enr::generate_random_remote_enr; -use ethportal_api::types::portal::GetContentInfo; -use ethportal_api::Discv5ApiClient; -use ethportal_api::HistoryNetworkApiClient; -use hivesim::types::ClientDefinition; -use hivesim::{dyn_async, Client, NClientTestSpec, Test}; - -dyn_async! { - pub async fn run_rpc_compat_history_test_suite<'a> (test: &'a mut Test, _client: Option) { - // Get all available portal clients - let clients = test.sim.client_types().await; - // todo: remove this once we implement role in hivesim-rs - let clients: Vec = clients.into_iter().filter(|client| client.name != *TRIN_BRIDGE_CLIENT_TYPE).collect(); - - // Test single type of client - for client in &clients { - test.run( - NClientTestSpec { - name: "discv5_nodeInfo".to_string(), - description: "".to_string(), - always_run: false, - run: test_node_info, - environments: None, - test_data: (), - clients: vec![client.clone()], - } - ).await; - - test.run( - NClientTestSpec { - name: "portal_historyLocalContent Expect ContentAbsent".to_string(), - description: "".to_string(), - always_run: false, - run: test_local_content_expect_content_absent, - environments: None, - test_data: (), - clients: vec![client.clone()], - } - ).await; - - test.run( - NClientTestSpec { - name: "portal_historyStore".to_string(), - description: "".to_string(), - always_run: false, - run: test_store, - environments: None, - test_data: (), - clients: vec![client.clone()], - } - ).await; - - test.run( - NClientTestSpec { - name: "portal_historyLocalContent Expect ContentPresent".to_string(), - description: "".to_string(), - always_run: false, - run: test_local_content_expect_content_present, - environments: None, - test_data: (), - clients: vec![client.clone()], - } - ).await; - - test.run( - NClientTestSpec { - name: "portal_historyAddEnr Expect true".to_string(), - description: "".to_string(), - always_run: false, - run: test_add_enr_expect_true, - environments: None, - test_data: (), - clients: vec![client.clone()], - } - ).await; - - test.run( - NClientTestSpec { - name: "portal_historyGetEnr None Found".to_string(), - description: "".to_string(), - always_run: false, - run: test_get_enr_non_present, - environments: None, - test_data: (), - clients: vec![client.clone()], - } - ).await; - - test.run( - NClientTestSpec { - name: "portal_historyGetEnr ENR Found".to_string(), - description: "".to_string(), - always_run: false, - run: test_get_enr_enr_present, - environments: None, - test_data: (), - clients: vec![client.clone()], - } - ).await; - - test.run( - NClientTestSpec { - name: "portal_historyGetEnr Local Enr".to_string(), - description: "".to_string(), - always_run: false, - run: test_get_enr_local_enr, - environments: None, - test_data: (), - clients: vec![client.clone()], - } - ).await; - - test.run( - NClientTestSpec { - name: "portal_historyDeleteEnr None Found".to_string(), - description: "".to_string(), - always_run: false, - run: test_delete_enr_non_present, - environments: None, - test_data: (), - clients: vec![client.clone()], - } - ).await; - - test.run( - NClientTestSpec { - name: "portal_historyDeleteEnr ENR Found".to_string(), - description: "".to_string(), - always_run: false, - run: test_delete_enr_enr_present, - environments: None, - test_data: (), - clients: vec![client.clone()], - } - ).await; - - test.run( - NClientTestSpec { - name: "portal_historyLookupEnr None Found".to_string(), - description: "".to_string(), - always_run: false, - run: test_lookup_enr_non_present, - environments: None, - test_data: (), - clients: vec![client.clone()], - } - ).await; - - test.run( - NClientTestSpec { - name: "portal_historyLookupEnr ENR Found".to_string(), - description: "".to_string(), - always_run: false, - run: test_lookup_enr_enr_present, - environments: None, - test_data: (), - clients: vec![client.clone()], - } - ).await; - - test.run( - NClientTestSpec { - name: "portal_historyLookupEnr Local Enr".to_string(), - description: "".to_string(), - always_run: false, - run: test_lookup_enr_local_enr, - environments: None, - test_data: (), - clients: vec![client.clone()], - } - ).await; - - test.run( - NClientTestSpec { - name: "portal_historyGetContent Content Absent".to_string(), - description: "".to_string(), - always_run: false, - run: test_get_content_content_absent, - environments: None, - test_data: (), - clients: vec![client.clone()], - } - ).await; - - test.run( - NClientTestSpec { - name: "portal_historyGetContent Content Present Locally".to_string(), - description: "".to_string(), - always_run: false, - run: test_get_content_content_present_locally, - environments: None, - test_data: (), - clients: vec![client.clone()], - } - ).await; - } - } -} - -dyn_async! { - async fn test_node_info<'a>(clients: Vec, _: ()) { - let client = match clients.into_iter().next() { - Some((client)) => client, - None => panic!("Unable to get expected amount of clients from NClientTestSpec"), - }; - - if let Err(err) = Discv5ApiClient::node_info(&client.rpc).await { - panic!("Expected response not received: {err}"); - } - } -} - -dyn_async! { - async fn test_local_content_expect_content_absent<'a>(clients: Vec, _: ()) { - let client = match clients.into_iter().next() { - Some((client)) => client, - None => panic!("Unable to get expected amount of clients from NClientTestSpec"), - }; - let content_key = HEADER_WITH_PROOF_KEY.clone(); - - if let Ok(response) = HistoryNetworkApiClient::local_content(&client.rpc, content_key).await { - panic!("Expected to receive an error because content wasn't found {response:?}"); - } - } -} - -dyn_async! { - async fn test_store<'a>(clients: Vec, _: ()) { - let client = match clients.into_iter().next() { - Some((client)) => client, - None => panic!("Unable to get expected amount of clients from NClientTestSpec"), - }; - let content_key = HEADER_WITH_PROOF_KEY.clone(); - let raw_content_value = HEADER_WITH_PROOF_VALUE.clone(); - - if let Err(err) = HistoryNetworkApiClient::store(&client.rpc, content_key, raw_content_value).await { - panic!("{}", &err.to_string()); - } - } -} - -dyn_async! { - async fn test_local_content_expect_content_present<'a>(clients: Vec, _: ()) { - let client = match clients.into_iter().next() { - Some((client)) => client, - None => panic!("Unable to get expected amount of clients from NClientTestSpec"), - }; - let content_key = HEADER_WITH_PROOF_KEY.clone(); - let raw_content_value = HEADER_WITH_PROOF_VALUE.clone(); - - // seed content_key/content_value onto the local node to test local_content expect content present - if let Err(err) = HistoryNetworkApiClient::store(&client.rpc, content_key.clone(), raw_content_value.clone()).await { - panic!("Failed to store data: {err:?}"); - } - - // Here we are calling local_content RPC to test if the content is present - match HistoryNetworkApiClient::local_content(&client.rpc, content_key).await { - Ok(possible_content) => { - if possible_content != raw_content_value { - panic!("Error receiving content: Expected content: {raw_content_value:?}, Received content: {possible_content:?}"); - } - } - Err(err) => panic!("Expected content returned from local_content to be present {}", &err.to_string()), - } - } -} - -dyn_async! { - async fn test_add_enr_expect_true<'a>(clients: Vec, _: ()) { - let client = match clients.into_iter().next() { - Some((client)) => client, - None => panic!("Unable to get expected amount of clients from NClientTestSpec"), - }; - let (_, enr) = generate_random_remote_enr(); - match HistoryNetworkApiClient::add_enr(&client.rpc, enr).await { - Ok(response) => match response { - true => (), - false => panic!("AddEnr expected to get true and instead got false") - }, - Err(err) => panic!("{}", &err.to_string()), - } - } -} - -dyn_async! { - async fn test_get_enr_non_present<'a>(clients: Vec, _: ()) { - let client = match clients.into_iter().next() { - Some((client)) => client, - None => panic!("Unable to get expected amount of clients from NClientTestSpec"), - }; - let (_, enr) = generate_random_remote_enr(); - - if (HistoryNetworkApiClient::get_enr(&client.rpc, enr.node_id()).await).is_ok() { - panic!("GetEnr in this case is not supposed to return a value") - } - } -} - -dyn_async! { - async fn test_get_enr_local_enr<'a>(clients: Vec, _: ()) { - let client = match clients.into_iter().next() { - Some((client)) => client, - None => panic!("Unable to get expected amount of clients from NClientTestSpec"), - }; - // get our local enr from NodeInfo - let target_enr = match Discv5ApiClient::node_info(&client.rpc).await { - Ok(node_info) => node_info.enr, - Err(err) => panic!("Error getting node info: {err:?}"), - }; - - // check if we can fetch data from routing table - match HistoryNetworkApiClient::get_enr(&client.rpc, target_enr.node_id()).await { - Ok(response) => { - if response != target_enr { - panic!("Response from GetEnr didn't return expected Enr") - } - }, - Err(err) => panic!("{}", &err.to_string()), - } - } -} - -dyn_async! { - async fn test_get_enr_enr_present<'a>(clients: Vec, _: ()) { - let client = match clients.into_iter().next() { - Some((client)) => client, - None => panic!("Unable to get expected amount of clients from NClientTestSpec"), - }; - let (_, enr) = generate_random_remote_enr(); - - // seed enr into routing table - match HistoryNetworkApiClient::add_enr(&client.rpc, enr.clone()).await { - Ok(response) => match response { - true => (), - false => panic!("AddEnr expected to get true and instead got false") - }, - Err(err) => panic!("{}", &err.to_string()), - } - - // check if we can fetch data from routing table - match HistoryNetworkApiClient::get_enr(&client.rpc, enr.node_id()).await { - Ok(response) => { - if response != enr { - panic!("Response from GetEnr didn't return expected Enr") - } - }, - Err(err) => panic!("{}", &err.to_string()), - } - } -} - -dyn_async! { - async fn test_delete_enr_non_present<'a>(clients: Vec, _: ()) { - let client = match clients.into_iter().next() { - Some((client)) => client, - None => panic!("Unable to get expected amount of clients from NClientTestSpec"), - }; - let (_, enr) = generate_random_remote_enr(); - match HistoryNetworkApiClient::delete_enr(&client.rpc, enr.node_id()).await { - Ok(response) => if response { panic!("DeleteEnr expected to get false and instead got true") }, - Err(err) => panic!("{}", &err.to_string()), - }; - } -} - -dyn_async! { - async fn test_delete_enr_enr_present<'a>(clients: Vec, _: ()) { - let client = match clients.into_iter().next() { - Some((client)) => client, - None => panic!("Unable to get expected amount of clients from NClientTestSpec"), - }; - let (_, enr) = generate_random_remote_enr(); - - // seed enr into routing table - match HistoryNetworkApiClient::add_enr(&client.rpc, enr.clone()).await { - Ok(response) => match response { - true => (), - false => panic!("AddEnr expected to get true and instead got false") - }, - Err(err) => panic!("{}", &err.to_string()), - } - - // check if data was seeded into the table - match HistoryNetworkApiClient::get_enr(&client.rpc, enr.node_id()).await { - Ok(response) => { - if response != enr { - panic!("Response from GetEnr didn't return expected Enr") - } - }, - Err(err) => panic!("{}", &err.to_string()), - } - - // delete the data from routing table - match HistoryNetworkApiClient::delete_enr(&client.rpc, enr.node_id()).await { - Ok(response) => match response { - true => (), - false => panic!("DeleteEnr expected to get true and instead got false") - }, - Err(err) => panic!("{}", &err.to_string()), - }; - - // check if the enr was actually deleted out of the table or not - if (HistoryNetworkApiClient::get_enr(&client.rpc, enr.node_id()).await).is_ok() { - panic!("GetEnr in this case is not supposed to return a value") - } - } -} - -dyn_async! { - async fn test_lookup_enr_non_present<'a>(clients: Vec, _: ()) { - let client = match clients.into_iter().next() { - Some((client)) => client, - None => panic!("Unable to get expected amount of clients from NClientTestSpec"), - }; - let (_, enr) = generate_random_remote_enr(); - - if (HistoryNetworkApiClient::lookup_enr(&client.rpc, enr.node_id()).await).is_ok() { - panic!("LookupEnr in this case is not supposed to return a value") - } - } -} - -dyn_async! { - async fn test_lookup_enr_enr_present<'a>(clients: Vec, _: ()) { - let client = match clients.into_iter().next() { - Some((client)) => client, - None => panic!("Unable to get expected amount of clients from NClientTestSpec"), - }; - let (_, enr) = generate_random_remote_enr(); - - // seed enr into routing table - match HistoryNetworkApiClient::add_enr(&client.rpc, enr.clone()).await { - Ok(response) => match response { - true => (), - false => panic!("AddEnr expected to get true and instead got false") - }, - Err(err) => panic!("{}", &err.to_string()), - } - - // check if we can fetch data from routing table - match HistoryNetworkApiClient::lookup_enr(&client.rpc, enr.node_id()).await { - Ok(response) => { - if response != enr { - panic!("Response from LookupEnr didn't return expected Enr") - } - }, - Err(err) => panic!("{}", &err.to_string()), - } - } -} - -dyn_async! { - async fn test_lookup_enr_local_enr<'a>(clients: Vec, _: ()) { - let client = match clients.into_iter().next() { - Some((client)) => client, - None => panic!("Unable to get expected amount of clients from NClientTestSpec"), - }; - // get our local enr from NodeInfo - let target_enr = match Discv5ApiClient::node_info(&client.rpc).await { - Ok(node_info) => node_info.enr, - Err(err) => panic!("Error getting node info: {err:?}"), - }; - - // check if we can fetch data from routing table - match HistoryNetworkApiClient::lookup_enr(&client.rpc, target_enr.node_id()).await { - Ok(response) => { - if response != target_enr { - panic!("Response from LookupEnr didn't return expected Enr") - } - }, - Err(err) => panic!("{}", &err.to_string()), - } - } -} - -dyn_async! { - // test that a node will return a AbsentContent via GetContent when the data doesn't exist - async fn test_get_content_content_absent<'a>(clients: Vec, _: ()) { - let client = match clients.into_iter().next() { - Some((client)) => client, - None => panic!("Unable to get expected amount of clients from NClientTestSpec"), - }; - let header_with_proof_key = HEADER_WITH_PROOF_KEY.clone(); - - if let Ok(content) = HistoryNetworkApiClient::get_content(&client.rpc, header_with_proof_key).await { - panic!("Error: Unexpected GetContent expected to not get the content and instead get an error: {content:?}"); - } - } -} - -dyn_async! { - // test that a node will return a PresentContent via GetContent when the data is stored locally - async fn test_get_content_content_present_locally<'a>(clients: Vec, _: ()) { - let client = match clients.into_iter().next() { - Some((client)) => client, - None => { - panic!("Unable to get expected amount of clients from NClientTestSpec"); - } - }; - - - let content_key = HEADER_WITH_PROOF_KEY.clone(); - let raw_content_value = HEADER_WITH_PROOF_VALUE.clone(); - - // seed content_key/content_value onto the local node to test get_content expect content present - if let Err(err) = HistoryNetworkApiClient::store(&client.rpc, content_key.clone(), raw_content_value.clone()).await { - panic!("Failed to store data: {err:?}"); - } - - match HistoryNetworkApiClient::get_content(&client.rpc, content_key).await { - Ok(GetContentInfo { content, utp_transfer }) => { - assert!(!utp_transfer, "Error: Expected utp_transfer to be false"); - assert_eq!(content, raw_content_value, "Error receiving content"); - } - Err(err) => panic!("Expected GetContent to not throw an error {err:?}"), - } - } -} diff --git a/simulators/portal/src/suites/mod.rs b/simulators/portal/src/suites/mod.rs deleted file mode 100644 index 835763259d..0000000000 --- a/simulators/portal/src/suites/mod.rs +++ /dev/null @@ -1,5 +0,0 @@ -pub mod beacon; -pub mod environment; -pub mod history; -pub mod state; -pub mod utils; diff --git a/simulators/portal/src/suites/state/constants.rs b/simulators/portal/src/suites/state/constants.rs deleted file mode 100644 index 8ebc50c9ca..0000000000 --- a/simulators/portal/src/suites/state/constants.rs +++ /dev/null @@ -1,21 +0,0 @@ -use alloy_primitives::Bytes; -use ethportal_api::StateContentKey; -use std::str::FromStr; - -pub const TEST_DATA_FILE_PATH: &str = "./portal-spec-tests/tests/mainnet/state/hive/test_data.yaml"; - -// trin-bridge constants -pub const TRIN_BRIDGE_CLIENT_TYPE: &str = "trin-bridge"; - -lazy_static::lazy_static! { - // Account Trie Node https://github.com/ethereum/portal-spec-tests/blob/master/tests/mainnet/state/validation/account_trie_node.yaml - pub static ref ACCOUNT_TRIE_NODE_KEY: StateContentKey = { - let value: StateContentKey = serde_json::from_str( - "\"0x20240000000ad14c73a3b489e9cb1c523aef684ed17363e03d33345f2b23c0407f87ee3ff000a97f\"" - ).expect("unable to convert content key to StateContentKey"); - value - }; - pub static ref RAW_CONTENT_OFFER_VALUE: Bytes = Bytes::from_str( - "0x24000000d4e56740f876aef8c010b86a40d5f56745a118d0906a34e69aec8c0db1cb8fa314000000280200003c0400001006000033060000f90211a090dcaf88c40c7bbc95a912cbdde67c175767b31173df9ee4b0d733bfdd511c43a0babe369f6b12092f49181ae04ca173fb68d1a5456f18d20fa32cba73954052bda0473ecf8a7e36a829e75039a3b055e51b8332cbf03324ab4af2066bbd6fbf0021a0bbda34753d7aa6c38e603f360244e8f59611921d9e1f128372fec0d586d4f9e0a04e44caecff45c9891f74f6a2156735886eedf6f1a733628ebc802ec79d844648a0a5f3f2f7542148c973977c8a1e154c4300fec92f755f7846f1b734d3ab1d90e7a0e823850f50bf72baae9d1733a36a444ab65d0a6faaba404f0583ce0ca4dad92da0f7a00cbe7d4b30b11faea3ae61b7f1f2b315b61d9f6bd68bfe587ad0eeceb721a07117ef9fc932f1a88e908eaead8565c19b5645dc9e5b1b6e841c5edbdfd71681a069eb2de283f32c11f859d7bcf93da23990d3e662935ed4d6b39ce3673ec84472a0203d26456312bbc4da5cd293b75b840fc5045e493d6f904d180823ec22bfed8ea09287b5c21f2254af4e64fca76acc5cd87399c7f1ede818db4326c98ce2dc2208a06fc2d754e304c48ce6a517753c62b1a9c1d5925b89707486d7fc08919e0a94eca07b1c54f15e299bd58bdfef9741538c7828b5d7d11a489f9c20d052b3471df475a051f9dd3739a927c89e357580a4c97b40234aa01ed3d5e0390dc982a7975880a0a089d613f26159af43616fd9455bb461f4869bfede26f2130835ed067a8b967bfb80f90211a068c361d52a1ae36e33155313cd4e838c539d946d85925e5867b747e66995279ea04bfcad7bfdf0fb113e6bf0ebe4d55543688888bd6ad277de20aa0f8a85808808a086816b98cc35e76d6e811646f6c37a73d148a23420bcc03493090639bb8393eca0af4b0b8fcf790b63a8bbc3711f091758d3e4dd424cdc4ded526015c42ca50dcaa0158ecf58c068c4d0452dba821665bbdc6c9c57d6016e53abc18832e9ccfc0b86a016a6ebfa551718656d0b514f948a859964f83d3717e0f055f996772d2f228c2da0a9fd3ba226e84a434bc8d5b974b5131faccdefa6a58a02ddff829fa3d4bb27d5a0cf039eb80d70511d207a7e25160061689d9267630b66d2aaedac436872ae415ba0f24a488dd566079b384e558779c105af0d8f8c8ed564aeab9c7564f393bea56ea05132b24ec0dcf33ec24cb4678aa90b2622141c94345a5dceff21b22284c26251a0c093497e0aeeb4bd0bc461643cf003f87dde10cc1c9925a0b23a409f2048b8e2a0c03b6353e1dcdd3707caa20cd4d6a5c3c59da9f7424bba97ba643f17d42b8b86a0177fd57a9ee5d2d47d712d2daf75f5162a33b604b72766a98daad5509f607b45a09c7945f1f9517363d0cc19dde9ad91222f9d3c0162061182eb114e39a9f605c7a0a8440ef6e36d273b58c65344edab0583a03f09912d22e723dae51cc1d716d786a01df56337e1161f3fe7318ad10bd8e5c42f741c0652bd70d1292c7d0f2f7b88cb80f901d1a01a42abb27509a631169ab7e765e13dec0de47dac9cc7bba9cbc03d9086a0db71a0a0978af82352385b3ed1d0cd6c37a5b2613a989ea01df570edb06df32fdefaff80a0d1cf5bc45e21fa3960d172fe189be5978adab50ca77d11d1c2953eebbbd2d312a005b8054e0db723ad20cc31b1be4d987ae6c6c37c334207120b1f67506f84ad43a0430e5e56596211fcf7b7875da97ac1b1f6ba13189dce330bcaebb9e6d5569f01a003353e7e139443c7b994c347eb7636dcae5b3eac6ba09b3bbb8c588c2e41a958a0cf966488cfb696ed5ac8f67923e4c0912eef7656df7f7586ba2b7ad7072b34b6a0652fb2d2acc28fc9360ac63f29d7886abf602ccbc0cf865061b653415256f357a062d4f171bb087621727a87a01a29d4c8b20864fcb45eb6d60eb929af76aa3485a0dbf844359c229020360ae86751fed8ea41d985ee245da8a27893cc5e1cf55d6fa03ada43c4de6154b5f5567fc27f3a659c3028b321a8040c8713d8b347d7634d3080a0728693f4b5a3f28187456de3217e2985662d52979bfae5a49da65153c50ada8da03c0a8e099ac8060b14d7946c6abc5a0a428defe61781e2cb0736a20ad086e442a07ca441b942818197c8fa360f6d32113277c734eedac7a4539f62e5a27ce404e880e21fa00ad14c73a3b489e9cb1c523aef684ed17363e03d33345f2b23c0407f87ee3ff0f8518080808080808080a01908e7f8035023929a2fa13d9f801a42db49a3063a350da55dd94896a3e9be0a80808080a00cfd334f65fc252dbe0bfa903aaef7bb1546db01627d8eacd919c2bce43b6691808080").expect("unable to convert content value to Bytes"); - pub static ref RAW_CONTENT_LOOKUP_VALUE: Bytes = Bytes::from_str("0x04000000f8518080808080808080a01908e7f8035023929a2fa13d9f801a42db49a3063a350da55dd94896a3e9be0a80808080a00cfd334f65fc252dbe0bfa903aaef7bb1546db01627d8eacd919c2bce43b6691808080").expect("unable to convert content value to Bytes"); -} diff --git a/simulators/portal/src/suites/state/interop.rs b/simulators/portal/src/suites/state/interop.rs deleted file mode 100644 index dec90cbefa..0000000000 --- a/simulators/portal/src/suites/state/interop.rs +++ /dev/null @@ -1,567 +0,0 @@ -use std::collections::HashMap; -use std::str::FromStr; - -use crate::suites::environment::PortalNetwork; -use crate::suites::state::constants::{ - ACCOUNT_TRIE_NODE_KEY, TEST_DATA_FILE_PATH, TRIN_BRIDGE_CLIENT_TYPE, -}; -use crate::suites::utils::{CANCUN_BLOCK_NUMBER, MERGE_BLOCK_NUMBER, SHANGHAI_BLOCK_NUMBER}; -use alloy_consensus::Header; -use alloy_primitives::Bytes; -use alloy_rlp::Decodable; -use anyhow::Result; -use ethportal_api::jsonrpsee::http_client::HttpClient; -use ethportal_api::types::accept_code::{AcceptCode, AcceptCodeList}; -use ethportal_api::types::execution::header_with_proof::{ - BlockHeaderProof, BlockProofHistoricalRoots, BlockProofHistoricalSummariesCapella, - BlockProofHistoricalSummariesDeneb, HeaderWithProof, -}; -use ethportal_api::types::portal::{FindContentInfo, GetContentInfo, PutContentInfo}; -use ethportal_api::types::portal_wire::MAX_PORTAL_CONTENT_PAYLOAD_SIZE; -use ethportal_api::utils::bytes::hex_encode; -use ethportal_api::{ - ContentValue, Discv5ApiClient, HistoryContentKey, HistoryContentValue, StateContentKey, - StateContentValue, StateNetworkApiClient, -}; -use hivesim::types::ClientDefinition; -use hivesim::{dyn_async, Client, NClientTestSpec, Test}; -use itertools::Itertools; -use serde_yaml::Value; -use tokio::time::Duration; - -#[derive(Clone, Debug)] -struct TestData { - pub header: Header, - pub key: StateContentKey, - pub offer_value: StateContentValue, - pub lookup_value: StateContentValue, -} - -async fn store_header(header: Header, client: &HttpClient) -> bool { - let content_key = HistoryContentKey::new_block_header_by_hash(header.hash_slow()); - let proof = if header.number <= MERGE_BLOCK_NUMBER { - BlockHeaderProof::HistoricalHashes(Default::default()) - } else if header.number <= SHANGHAI_BLOCK_NUMBER { - BlockHeaderProof::HistoricalRoots(BlockProofHistoricalRoots { - beacon_block_proof: Default::default(), - beacon_block_root: Default::default(), - execution_block_proof: Default::default(), - slot: Default::default(), - }) - } else if header.number <= CANCUN_BLOCK_NUMBER { - BlockHeaderProof::HistoricalSummariesCapella(BlockProofHistoricalSummariesCapella { - beacon_block_proof: Default::default(), - beacon_block_root: Default::default(), - execution_block_proof: Default::default(), - slot: Default::default(), - }) - } else { - BlockHeaderProof::HistoricalSummariesDeneb(BlockProofHistoricalSummariesDeneb { - beacon_block_proof: Default::default(), - beacon_block_root: Default::default(), - execution_block_proof: Default::default(), - slot: Default::default(), - }) - }; - let content_value = - HistoryContentValue::BlockHeaderWithProof(HeaderWithProof { header, proof }); - match ethportal_api::HistoryNetworkApiClient::store(client, content_key, content_value.encode()) - .await - { - Ok(stored) => stored, - Err(err) => panic!("Failed to store block header: {}", &err.to_string()), - } -} - -/// Processed content data for state tests -struct ProcessedContent { - content_type: String, - identifier: String, - test_data: TestData, -} - -fn process_content(content: Vec) -> Vec { - let mut result: Vec = vec![]; - for test_data in content { - let (content_type, identifier) = match &test_data.key { - StateContentKey::AccountTrieNode(account_trie_node) => ( - "Account Trie Node".to_string(), - format!( - "path: {} node hash: {}", - hex_encode(account_trie_node.path.nibbles()), - hex_encode(account_trie_node.node_hash.as_slice()) - ), - ), - StateContentKey::ContractStorageTrieNode(contract_storage_trie_node) => ( - "Contract Storage Trie Node".to_string(), - format!( - "address: {} path: {} node hash: {}", - hex_encode(contract_storage_trie_node.address_hash.as_slice()), - hex_encode(contract_storage_trie_node.path.nibbles()), - hex_encode(contract_storage_trie_node.node_hash.as_slice()) - ), - ), - StateContentKey::ContractBytecode(contract_bytecode) => ( - "Contract Bytecode".to_string(), - format!( - "address: {} code hash: {}", - hex_encode(contract_bytecode.address_hash.as_slice()), - hex_encode(contract_bytecode.code_hash.as_slice()) - ), - ), - }; - result.push(ProcessedContent { - content_type, - identifier, - test_data, - }) - } - result -} - -fn parse_test_values() -> Result> { - let values = std::fs::read_to_string(TEST_DATA_FILE_PATH).expect("cannot find test asset"); - let values: Value = serde_yaml::from_str(&values)?; - values - .as_sequence() - .expect("to find sequence of test values") - .iter() - .map(|value| { - let header_bytes: Bytes = serde_yaml::from_value(value["block_header"].clone())?; - let header = Header::decode(&mut header_bytes.as_ref())?; - let key: StateContentKey = serde_yaml::from_value(value["content_key"].clone())?; - let raw_offer_value = Bytes::from_str( - value["content_value_offer"] - .as_str() - .expect("to find content value offer"), - )?; - let offer_value = StateContentValue::decode(&key, raw_offer_value.as_ref())?; - let raw_lookup_value = Bytes::from_str( - value["content_value_retrieval"] - .as_str() - .expect("to find content value retrieval"), - )?; - let lookup_value = StateContentValue::decode(&key, raw_lookup_value.as_ref())?; - - Ok(TestData { - header, - key, - offer_value, - lookup_value, - }) - }) - .collect() -} - -dyn_async! { - pub async fn test_portal_state_interop<'a> (test: &'a mut Test, _client: Option) { - // Get all available portal clients - let clients = test.sim.client_types().await; - // todo: remove this once we implement role in hivesim-rs - let clients: Vec = clients.into_iter().filter(|client| client.name != *TRIN_BRIDGE_CLIENT_TYPE).collect(); - - let environment = Some(HashMap::from([PortalNetwork::as_environment_flag([PortalNetwork::Beacon, PortalNetwork::History, PortalNetwork::State])])); - let environments = Some(vec![environment.clone(), environment]); - - let content = parse_test_values().expect("unable to parse test values"); - - // Iterate over all possible pairings of clients and run the tests (including self-pairings) - for (client_a, client_b) in clients.iter().cartesian_product(clients.iter()) { - for ProcessedContent { content_type, identifier, test_data } in process_content(content.clone()) { - test.run( - NClientTestSpec { - name: format!("OFFER {}: {} {} --> {}", content_type, identifier, client_a.name, client_b.name), - description: "".to_string(), - always_run: false, - run: test_offer, - environments: environments.clone(), - test_data: test_data.clone(), - clients: vec![client_a.clone(), client_b.clone()], - } - ).await; - - test.run( - NClientTestSpec { - name: format!("GetContent {}: {} {} --> {}", content_type, identifier, client_a.name, client_b.name), - description: "".to_string(), - always_run: false, - run: test_get_content, - environments: environments.clone(), - test_data: test_data.clone(), - clients: vec![client_a.clone(), client_b.clone()], - } - ).await; - - test.run( - NClientTestSpec { - name: format!("FindContent {}: {} {} --> {}", content_type, identifier, client_a.name, client_b.name), - description: "".to_string(), - always_run: false, - run: test_find_content, - environments: environments.clone(), - test_data, - clients: vec![client_a.clone(), client_b.clone()], - } - ).await; - } - - // Test portal state ping - test.run(NClientTestSpec { - name: format!("PING {} --> {}", client_a.name, client_b.name), - description: "".to_string(), - always_run: false, - run: test_ping, - environments: environments.clone(), - test_data: (), - clients: vec![client_a.clone(), client_b.clone()], - } - ).await; - - // Test find content non-present - test.run(NClientTestSpec { - name: format!("FIND_CONTENT non present {} --> {}", client_a.name, client_b.name), - description: "find content: calls find content that doesn't exist".to_string(), - always_run: false, - run: test_find_content_non_present, - environments: environments.clone(), - test_data: (), - clients: vec![client_a.clone(), client_b.clone()], - } - ).await; - - // Test find nodes distance zero - test.run(NClientTestSpec { - name: format!("FIND_NODES Distance 0 {} --> {}", client_a.name, client_b.name), - description: "find nodes: distance zero expect called nodes enr".to_string(), - always_run: false, - run: test_find_nodes_zero_distance, - environments: environments.clone(), - test_data: (), - clients: vec![client_a.clone(), client_b.clone()], - } - ).await; - - // Test gossiping a collection of blocks to node B (B will gossip back to A) - test.run( - NClientTestSpec { - name: format!("PUT CONTENT blocks from A:{} --> B:{}", client_a.name, client_b.name), - description: "".to_string(), - always_run: false, - run: test_put_content_two_nodes, - environments: environments.clone(), - test_data: content.clone(), - clients: vec![client_a.clone(), client_b.clone()], - } - ).await; - } - } -} - -dyn_async! { - // test that a node will not return content via FINDCONTENT. - async fn test_find_content_non_present<'a>(clients: Vec, _: ()) { - let (client_a, client_b) = match clients.iter().collect_tuple() { - Some((client_a, client_b)) => (client_a, client_b), - None => panic!("Unable to get expected amount of clients from NClientTestSpec"), - }; - let account_trie_node_key = ACCOUNT_TRIE_NODE_KEY.clone(); - - let target_enr = match client_b.rpc.node_info().await { - Ok(node_info) => node_info.enr, - Err(err) => panic!("Error getting node info: {err:?}"), - }; - - let result = client_a.rpc.find_content(target_enr, account_trie_node_key.clone()).await; - - match result { - Ok(FindContentInfo::Enrs { enrs }) => if !enrs.is_empty() { - panic!("Error: Unexpected FINDCONTENT response: expected ContentInfo::Enrs length 0 got {}", enrs.len()); - }, - Ok(FindContentInfo::Content { .. }) => panic!("Error: Unexpected FINDCONTENT response: expected Enrs got Content"), - Err(err) => panic!("Error: Unable to get response from FINDCONTENT request: {err:?}"), - } - } -} - -dyn_async! { - async fn test_offer<'a>(clients: Vec, test_data: TestData) { - let (client_a, client_b) = match clients.iter().collect_tuple() { - Some((client_a, client_b)) => (client_a, client_b), - None => panic!("Unable to get expected amount of clients from NClientTestSpec"), - }; - - let TestData { - header, - key: target_key, - offer_value: target_offer_value, - lookup_value: target_lookup_value, - } = test_data; - - let target_enr = match client_b.rpc.node_info().await { - Ok(node_info) => node_info.enr, - Err(err) => panic!("Error getting node info: {err:?}"), - }; - - store_header(header, &client_b.rpc).await; - - let accept_info = client_a - .rpc - .offer( - target_enr, - vec![(target_key.clone(), target_offer_value.encode())], - ) - .await - .expect("Failed to send offer"); - let mut expected_accept_code_list = - AcceptCodeList::new(1).expect("We are making a valid accept code list"); - expected_accept_code_list.set(0, AcceptCode::Accepted); - assert_eq!( - accept_info.0, expected_accept_code_list, - "AcceptCodeList didn't match expected value", - ); - - tokio::time::sleep(Duration::from_secs(8)).await; - - match client_b.rpc.local_content(target_key).await { - Ok(possible_content) => { - if possible_content != target_lookup_value.encode() { - panic!("Error receiving content: Expected content: {target_lookup_value:?}, Received content: {possible_content:?}"); - } - } - Err(err) => panic!("Unable to get received content: {err:?}"), - } - } -} - -dyn_async! { - async fn test_ping<'a>(clients: Vec, _: ()) { - let (client_a, client_b) = match clients.iter().collect_tuple() { - Some((client_a, client_b)) => (client_a, client_b), - None => panic!("Unable to get expected amount of clients from NClientTestSpec"), - }; - let target_enr = match client_b.rpc.node_info().await { - Ok(node_info) => node_info.enr, - Err(err) => panic!("Error getting node info: {err:?}"), - }; - - let pong = StateNetworkApiClient::ping(&client_a.rpc, target_enr, None, None).await; - - if let Err(err) = pong { - panic!("Unable to receive pong info: {err:?}"); - } - - // Verify that client_b stored client_a its ENR through the base layer - // handshake mechanism. - let stored_enr = match client_a.rpc.node_info().await { - Ok(node_info) => node_info.enr, - Err(err) => panic!("Error getting node info: {err:?}"), - }; - - match StateNetworkApiClient::get_enr(&client_b.rpc, stored_enr.node_id()).await { - Ok(response) => { - if response != stored_enr { - panic!("Response from GetEnr didn't return expected ENR. Got: {response}; Expected: {stored_enr}") - } - }, - Err(err) => panic!("Failed while trying to get client A's ENR from client B: {err}"), - } - } -} - -dyn_async! { - async fn test_find_nodes_zero_distance<'a>(clients: Vec, _: ()) { - let (client_a, client_b) = match clients.iter().collect_tuple() { - Some((client_a, client_b)) => (client_a, client_b), - None => panic!("Unable to get expected amount of clients from NClientTestSpec"), - }; - let target_enr = match client_b.rpc.node_info().await { - Ok(node_info) => node_info.enr, - Err(err) => panic!("Error getting node info: {err:?}"), - }; - - match client_a.rpc.find_nodes(target_enr.clone(), vec![0]).await { - Ok(response) => { - if response.len() != 1 { - panic!("Response from FindNodes didn't return expected length of 1"); - } - - match response.first() { - Some(response_enr) => { - if *response_enr != target_enr { - panic!("Response from FindNodes didn't return expected Enr"); - } - }, - None => panic!("Error find nodes zero distance wasn't supposed to return None"), - } - } - Err(err) => panic!("{}", &err.to_string()), - } - } -} - -dyn_async! { - // test that a node will return a content via GETCONTENT template that it has stored locally - async fn test_get_content<'a>(clients: Vec, test_data: TestData) { - let (client_a, client_b) = match clients.iter().collect_tuple() { - Some((client_a, client_b)) => (client_a, client_b), - None => panic!("Unable to get expected amount of clients from NClientTestSpec"), - }; - - let TestData { - key: target_key, - offer_value: target_offer_value, - lookup_value: target_lookup_value, - .. - } = test_data; - - match client_b.rpc.store(target_key.clone(), target_offer_value.encode()).await { - Ok(result) => if !result { - panic!("Error storing target content for get content"); - }, - Err(err) => panic!("Error storing target content: {err:?}"), - } - - let target_enr = match client_b.rpc.node_info().await { - Ok(node_info) => node_info.enr, - Err(err) => panic!("Error getting node info: {err:?}"), - }; - - match StateNetworkApiClient::add_enr(&client_a.rpc, target_enr.clone()).await { - Ok(response) => match response { - true => (), - false => panic!("AddEnr expected to get true and instead got false") - }, - Err(err) => panic!("{}", &err.to_string()), - } - - match client_a.rpc.get_content(target_key.clone()).await { - Ok(GetContentInfo{ content, utp_transfer }) => { - if content != target_lookup_value.encode() { - panic!("Error: Unexpected GETCONTENT response: didn't return expected target content"); - } - - if target_lookup_value.encode().len() < MAX_PORTAL_CONTENT_PAYLOAD_SIZE { - if utp_transfer { - panic!("Error: Unexpected GETCONTENT response: utp_transfer was supposed to be false"); - } - } else if !utp_transfer { - panic!("Error: Unexpected GETCONTENT response: utp_transfer was supposed to be true"); - } - }, - Err(err) => panic!("Error: Unable to get response from GETCONTENT request: {err:?}"), - } - } -} - -dyn_async! { - // test that a node will return a x content via FINDCONTENT that it has stored locally - async fn test_find_content<'a> (clients: Vec, test_data: TestData) { - let (client_a, client_b) = match clients.iter().collect_tuple() { - Some((client_a, client_b)) => (client_a, client_b), - None => panic!("Unable to get expected amount of clients from NClientTestSpec"), - }; - - let TestData { - key: target_key, - offer_value: target_offer_value, - lookup_value: target_lookup_value, - .. - } = test_data; - - match client_b.rpc.store(target_key.clone(), target_offer_value.encode()).await { - Ok(result) => if !result { - panic!("Error storing target content for find content"); - }, - Err(err) => panic!("Error storing target content: {err:?}"), - } - - let target_enr = match client_b.rpc.node_info().await { - Ok(node_info) => node_info.enr, - Err(err) => panic!("Error getting node info: {err:?}"), - }; - - match client_a.rpc.find_content(target_enr, target_key.clone()).await { - Ok(FindContentInfo::Content { content, utp_transfer }) => { - if content != target_lookup_value.encode() { - panic!("Error: Unexpected FINDCONTENT response: didn't return expected block body"); - } - - if target_lookup_value.encode().len() < MAX_PORTAL_CONTENT_PAYLOAD_SIZE { - if utp_transfer { - panic!("Error: Unexpected FINDCONTENT response: utp_transfer was supposed to be false"); - } - } else if !utp_transfer { - panic!("Error: Unexpected FINDCONTENT response: utp_transfer was supposed to be true"); - } - }, - Ok(FindContentInfo::Enrs { .. }) => panic!("Error: Unexpected FINDCONTENT response: expected Content got Enrs"), - Err(err) => panic!("Error: Unable to get response from FINDCONTENT request: {err:?}"), - } - } -} - -dyn_async! { - async fn test_put_content_two_nodes<'a> (clients: Vec, test_data: Vec) { - let (client_a, client_b) = match clients.iter().collect_tuple() { - Some((client_a, client_b)) => (client_a, client_b), - None => panic!("Unable to get expected amount of clients from NClientTestSpec"), - }; - // connect clients - let client_b_enr = match client_b.rpc.node_info().await { - Ok(node_info) => node_info.enr, - Err(err) => panic!("Error getting node info: {err:?}"), - }; - match StateNetworkApiClient::add_enr(&client_a.rpc, client_b_enr.clone()).await { - Ok(response) => match response { - true => (), - false => panic!("AddEnr expected to get true and instead got false") - }, - Err(err) => panic!("{}", &err.to_string()), - } - - // With default node settings nodes should be storing all content - for TestData { header, key: content_key, offer_value: content_offer_value, .. } in test_data.clone() { - store_header(header, &client_b.rpc).await; - - match client_a.rpc.put_content(content_key.clone(), content_offer_value.encode()).await { - Ok(PutContentInfo { peer_count, .. }) => { - if peer_count != 1 { - panic!("We expected to gossip to 1 node instead we gossiped to: {peer_count}"); - } - } - Err(err) => panic!("Unable to get received content: {err:?}"), - } - - tokio::time::sleep(Duration::from_secs(1)).await; - } - - // wait test_data.len() seconds for data to propagate, giving more time if more items are propagating - tokio::time::sleep(Duration::from_secs(test_data.len() as u64)).await; - - // process raw test data to generate content details for error output - let mut result = vec![]; - for TestData { key: content_key, lookup_value: content_lookup_value, .. } in test_data { - let content_details = { - let content_type = match &content_key { - StateContentKey::AccountTrieNode(_) => "account trie node".to_string(), - StateContentKey::ContractStorageTrieNode(_) => "contract storage trie node".to_string(), - StateContentKey::ContractBytecode(_) => "contract bytecode".to_string(), - }; - format!("{content_key:?} {content_type}") - }; - - match client_b.rpc.local_content(content_key.clone()).await { - Ok(expected_value) => { - if expected_value != content_lookup_value.encode() { - result.push(format!("Error content received for block {content_details} was different then expected")); - } - } - Err(err) => result.push(format!("Error content for block {err} was absent")), - } - } - - if !result.is_empty() { - panic!("Client B: {result:?}"); - } - } -} diff --git a/simulators/portal/src/suites/state/mod.rs b/simulators/portal/src/suites/state/mod.rs deleted file mode 100644 index 02a4b0c6d1..0000000000 --- a/simulators/portal/src/suites/state/mod.rs +++ /dev/null @@ -1,3 +0,0 @@ -pub mod constants; -pub mod interop; -pub mod rpc_compat; diff --git a/simulators/portal/src/suites/state/rpc_compat.rs b/simulators/portal/src/suites/state/rpc_compat.rs deleted file mode 100644 index c5430cc30a..0000000000 --- a/simulators/portal/src/suites/state/rpc_compat.rs +++ /dev/null @@ -1,529 +0,0 @@ -use std::collections::HashMap; - -use crate::suites::environment::PortalNetwork; -use crate::suites::state::constants::{ - ACCOUNT_TRIE_NODE_KEY, RAW_CONTENT_LOOKUP_VALUE, RAW_CONTENT_OFFER_VALUE, - TRIN_BRIDGE_CLIENT_TYPE, -}; -use ethportal_api::types::enr::generate_random_remote_enr; -use ethportal_api::types::portal::GetContentInfo; -use ethportal_api::Discv5ApiClient; -use ethportal_api::StateNetworkApiClient; -use hivesim::types::ClientDefinition; -use hivesim::{dyn_async, Client, NClientTestSpec, Test}; - -dyn_async! { - pub async fn run_rpc_compat_state_test_suite<'a> (test: &'a mut Test, _client: Option) { - // Get all available portal clients - let clients = test.sim.client_types().await; - // todo: remove this once we implement role in hivesim-rs - let clients: Vec = clients.into_iter().filter(|client| client.name != *TRIN_BRIDGE_CLIENT_TYPE).collect(); - - let environment_flag = PortalNetwork::as_environment_flag([PortalNetwork::Beacon, PortalNetwork::History, PortalNetwork::State]); - let environments = Some(vec![Some(HashMap::from([environment_flag]))]); - - // Test single type of client - for client in &clients { - test.run( - NClientTestSpec { - name: "discv5_nodeInfo".to_string(), - description: "".to_string(), - always_run: false, - run: test_node_info, - environments: environments.clone(), - test_data: (), - clients: vec![client.clone()], - } - ).await; - - test.run( - NClientTestSpec { - name: "portal_stateLocalContent Expect ContentAbsent".to_string(), - description: "".to_string(), - always_run: false, - run: test_local_content_expect_content_absent, - environments: environments.clone(), - test_data: (), - clients: vec![client.clone()], - } - ).await; - - test.run( - NClientTestSpec { - name: "portal_stateStore".to_string(), - description: "".to_string(), - always_run: false, - run: test_store, - environments: environments.clone(), - test_data: (), - clients: vec![client.clone()], - } - ).await; - - test.run( - NClientTestSpec { - name: "portal_stateLocalContent Expect ContentPresent".to_string(), - description: "".to_string(), - always_run: false, - run: test_local_content_expect_content_present, - environments: environments.clone(), - test_data: (), - clients: vec![client.clone()], - } - ).await; - - test.run( - NClientTestSpec { - name: "portal_stateAddEnr Expect true".to_string(), - description: "".to_string(), - always_run: false, - run: test_add_enr_expect_true, - environments: environments.clone(), - test_data: (), - clients: vec![client.clone()], - } - ).await; - - test.run( - NClientTestSpec { - name: "portal_stateGetEnr None Found".to_string(), - description: "".to_string(), - always_run: false, - run: test_get_enr_non_present, - environments: environments.clone(), - test_data: (), - clients: vec![client.clone()], - } - ).await; - - test.run( - NClientTestSpec { - name: "portal_stateGetEnr ENR Found".to_string(), - description: "".to_string(), - always_run: false, - run: test_get_enr_enr_present, - environments: environments.clone(), - test_data: (), - clients: vec![client.clone()], - } - ).await; - - test.run( - NClientTestSpec { - name: "portal_stateGetEnr Local Enr".to_string(), - description: "".to_string(), - always_run: false, - run: test_get_enr_local_enr, - environments: environments.clone(), - test_data: (), - clients: vec![client.clone()], - } - ).await; - - test.run( - NClientTestSpec { - name: "portal_stateDeleteEnr None Found".to_string(), - description: "".to_string(), - always_run: false, - run: test_delete_enr_non_present, - environments: environments.clone(), - test_data: (), - clients: vec![client.clone()], - } - ).await; - - test.run( - NClientTestSpec { - name: "portal_stateDeleteEnr ENR Found".to_string(), - description: "".to_string(), - always_run: false, - run: test_delete_enr_enr_present, - environments: environments.clone(), - test_data: (), - clients: vec![client.clone()], - } - ).await; - - test.run( - NClientTestSpec { - name: "portal_stateLookupEnr None Found".to_string(), - description: "".to_string(), - always_run: false, - run: test_lookup_enr_non_present, - environments: environments.clone(), - test_data: (), - clients: vec![client.clone()], - } - ).await; - - test.run( - NClientTestSpec { - name: "portal_stateLookupEnr ENR Found".to_string(), - description: "".to_string(), - always_run: false, - run: test_lookup_enr_enr_present, - environments: environments.clone(), - test_data: (), - clients: vec![client.clone()], - } - ).await; - - test.run( - NClientTestSpec { - name: "portal_stateLookupEnr Local Enr".to_string(), - description: "".to_string(), - always_run: false, - run: test_lookup_enr_local_enr, - environments: environments.clone(), - test_data: (), - clients: vec![client.clone()], - } - ).await; - - test.run( - NClientTestSpec { - name: "portal_stateGetContent Content Absent".to_string(), - description: "".to_string(), - always_run: false, - run: test_get_content_content_absent, - environments: environments.clone(), - test_data: (), - clients: vec![client.clone()], - } - ).await; - - test.run( - NClientTestSpec { - name: "portal_stateGetContent Content Present Locally".to_string(), - description: "".to_string(), - always_run: false, - run: test_get_content_content_present_locally, - environments: environments.clone(), - test_data: (), - clients: vec![client.clone()], - } - ).await; - } - } -} - -dyn_async! { - async fn test_node_info<'a>(clients: Vec, _: ()) { - let client = match clients.into_iter().next() { - Some((client)) => client, - None => panic!("Unable to get expected amount of clients from NClientTestSpec"), - }; - - if let Err(err) = Discv5ApiClient::node_info(&client.rpc).await { - panic!("Expected response not received: {err}"); - } - } -} - -dyn_async! { - async fn test_local_content_expect_content_absent<'a>(clients: Vec, _: ()) { - let client = match clients.into_iter().next() { - Some((client)) => client, - None => panic!("Unable to get expected amount of clients from NClientTestSpec"), - }; - let content_key = ACCOUNT_TRIE_NODE_KEY.clone(); - - if let Ok(response) = StateNetworkApiClient::local_content(&client.rpc, content_key).await { - panic!("Expected to receive an error because content wasn't found {response:?}"); - } - } -} - -dyn_async! { - async fn test_store<'a>(clients: Vec, _: ()) { - let client = match clients.into_iter().next() { - Some((client)) => client, - None => panic!("Unable to get expected amount of clients from NClientTestSpec"), - }; - let content_key = ACCOUNT_TRIE_NODE_KEY.clone(); - let raw_content_offer_value = RAW_CONTENT_OFFER_VALUE.clone(); - - if let Err(err) = StateNetworkApiClient::store(&client.rpc, content_key, raw_content_offer_value).await { - panic!("{}", &err.to_string()); - } - } -} - -dyn_async! { - async fn test_local_content_expect_content_present<'a>(clients: Vec, _: ()) { - let client = match clients.into_iter().next() { - Some((client)) => client, - None => panic!("Unable to get expected amount of clients from NClientTestSpec"), - }; - let content_key = ACCOUNT_TRIE_NODE_KEY.clone(); - let raw_content_offer_value = RAW_CONTENT_OFFER_VALUE.clone(); - let raw_content_lookup_value = RAW_CONTENT_LOOKUP_VALUE.clone(); - - - if let Err(err) = StateNetworkApiClient::store(&client.rpc, content_key.clone(), raw_content_offer_value).await { - panic!("Failed to store data: {err:?}"); - } - - // Here we are calling local_content RPC to test if the content is present - match StateNetworkApiClient::local_content(&client.rpc, content_key).await { - Ok(possible_content) => { - if possible_content != raw_content_lookup_value { - panic!("Error receiving content: Expected content: {raw_content_lookup_value:?}, Received content: {possible_content:?}"); - } - } - Err(err) => panic!("Expected content returned from local_content to be present {}", &err.to_string()), - } - } -} - -dyn_async! { - async fn test_add_enr_expect_true<'a>(clients: Vec, _: ()) { - let client = match clients.into_iter().next() { - Some((client)) => client, - None => panic!("Unable to get expected amount of clients from NClientTestSpec"), - }; - let (_, enr) = generate_random_remote_enr(); - match StateNetworkApiClient::add_enr(&client.rpc, enr).await { - Ok(response) => match response { - true => (), - false => panic!("AddEnr expected to get true and instead got false") - }, - Err(err) => panic!("{}", &err.to_string()), - } - } -} - -dyn_async! { - async fn test_get_enr_non_present<'a>(clients: Vec, _: ()) { - let client = match clients.into_iter().next() { - Some((client)) => client, - None => panic!("Unable to get expected amount of clients from NClientTestSpec"), - }; - let (_, enr) = generate_random_remote_enr(); - - if (StateNetworkApiClient::get_enr(&client.rpc, enr.node_id()).await).is_ok() { - panic!("GetEnr in this case is not supposed to return a value") - } - } -} - -dyn_async! { - async fn test_get_enr_local_enr<'a>(clients: Vec, _: ()) { - let client = match clients.into_iter().next() { - Some((client)) => client, - None => panic!("Unable to get expected amount of clients from NClientTestSpec"), - }; - // get our local enr from NodeInfo - let target_enr = match Discv5ApiClient::node_info(&client.rpc).await { - Ok(node_info) => node_info.enr, - Err(err) => panic!("Error getting node info: {err:?}"), - }; - - // check if we can fetch data from routing table - match StateNetworkApiClient::get_enr(&client.rpc, target_enr.node_id()).await { - Ok(response) => { - if response != target_enr { - panic!("Response from GetEnr didn't return expected Enr") - } - }, - Err(err) => panic!("{}", &err.to_string()), - } - } -} - -dyn_async! { - async fn test_get_enr_enr_present<'a>(clients: Vec, _: ()) { - let client = match clients.into_iter().next() { - Some((client)) => client, - None => panic!("Unable to get expected amount of clients from NClientTestSpec"), - }; - let (_, enr) = generate_random_remote_enr(); - - // seed enr into routing table - match StateNetworkApiClient::add_enr(&client.rpc, enr.clone()).await { - Ok(response) => match response { - true => (), - false => panic!("AddEnr expected to get true and instead got false") - }, - Err(err) => panic!("{}", &err.to_string()), - } - - // check if we can fetch data from routing table - match StateNetworkApiClient::get_enr(&client.rpc, enr.node_id()).await { - Ok(response) => { - if response != enr { - panic!("Response from GetEnr didn't return expected Enr") - } - }, - Err(err) => panic!("{}", &err.to_string()), - } - } -} - -dyn_async! { - async fn test_delete_enr_non_present<'a>(clients: Vec, _: ()) { - let client = match clients.into_iter().next() { - Some((client)) => client, - None => panic!("Unable to get expected amount of clients from NClientTestSpec"), - }; - let (_, enr) = generate_random_remote_enr(); - match StateNetworkApiClient::delete_enr(&client.rpc, enr.node_id()).await { - Ok(response) => if response { panic!("DeleteEnr expected to get false and instead got true") }, - Err(err) => panic!("{}", &err.to_string()), - }; - } -} - -dyn_async! { - async fn test_delete_enr_enr_present<'a>(clients: Vec, _: ()) { - let client = match clients.into_iter().next() { - Some((client)) => client, - None => panic!("Unable to get expected amount of clients from NClientTestSpec"), - }; - let (_, enr) = generate_random_remote_enr(); - - // seed enr into routing table - match StateNetworkApiClient::add_enr(&client.rpc, enr.clone()).await { - Ok(response) => match response { - true => (), - false => panic!("AddEnr expected to get true and instead got false") - }, - Err(err) => panic!("{}", &err.to_string()), - } - - // check if data was seeded into the table - match StateNetworkApiClient::get_enr(&client.rpc, enr.node_id()).await { - Ok(response) => { - if response != enr { - panic!("Response from GetEnr didn't return expected Enr") - } - }, - Err(err) => panic!("{}", &err.to_string()), - } - - // delete the data from routing table - match StateNetworkApiClient::delete_enr(&client.rpc, enr.node_id()).await { - Ok(response) => match response { - true => (), - false => panic!("DeleteEnr expected to get true and instead got false") - }, - Err(err) => panic!("{}", &err.to_string()), - }; - - // check if the enr was actually deleted out of the table or not - if (StateNetworkApiClient::get_enr(&client.rpc, enr.node_id()).await).is_ok() { - panic!("GetEnr in this case is not supposed to return a value") - } - } -} - -dyn_async! { - async fn test_lookup_enr_non_present<'a>(clients: Vec, _: ()) { - let client = match clients.into_iter().next() { - Some((client)) => client, - None => panic!("Unable to get expected amount of clients from NClientTestSpec"), - }; - let (_, enr) = generate_random_remote_enr(); - - if (StateNetworkApiClient::lookup_enr(&client.rpc, enr.node_id()).await).is_ok() { - panic!("LookupEnr in this case is not supposed to return a value") - } - } -} - -dyn_async! { - async fn test_lookup_enr_enr_present<'a>(clients: Vec, _: ()) { - let client = match clients.into_iter().next() { - Some((client)) => client, - None => panic!("Unable to get expected amount of clients from NClientTestSpec"), - }; - let (_, enr) = generate_random_remote_enr(); - - // seed enr into routing table - match StateNetworkApiClient::add_enr(&client.rpc, enr.clone()).await { - Ok(response) => match response { - true => (), - false => panic!("AddEnr expected to get true and instead got false") - }, - Err(err) => panic!("{}", &err.to_string()), - } - - // check if we can fetch data from routing table - match StateNetworkApiClient::lookup_enr(&client.rpc, enr.node_id()).await { - Ok(response) => { - if response != enr { - panic!("Response from LookupEnr didn't return expected Enr") - } - }, - Err(err) => panic!("{}", &err.to_string()), - } - } -} - -dyn_async! { - async fn test_lookup_enr_local_enr<'a>(clients: Vec, _: ()) { - let client = match clients.into_iter().next() { - Some((client)) => client, - None => panic!("Unable to get expected amount of clients from NClientTestSpec"), - }; - // get our local enr from NodeInfo - let target_enr = match Discv5ApiClient::node_info(&client.rpc).await { - Ok(node_info) => node_info.enr, - Err(err) => panic!("Error getting node info: {err:?}"), - }; - - // check if we can fetch data from routing table - match StateNetworkApiClient::lookup_enr(&client.rpc, target_enr.node_id()).await { - Ok(response) => { - if response != target_enr { - panic!("Response from LookupEnr didn't return expected Enr") - } - }, - Err(err) => panic!("{}", &err.to_string()), - } - } -} - -dyn_async! { - // test that a node will return a AbsentContent via GetContent when the data doesn't exist - async fn test_get_content_content_absent<'a>(clients: Vec, _: ()) { - let client = match clients.into_iter().next() { - Some((client)) => client, - None => panic!("Unable to get expected amount of clients from NClientTestSpec"), - }; - let account_trie_node_key = ACCOUNT_TRIE_NODE_KEY.clone(); - - if let Ok(content) = StateNetworkApiClient::get_content(&client.rpc, account_trie_node_key).await { - panic!("Error: Unexpected GetContent expected to not get the content and instead get an error: {content:?}"); - } - } -} - -dyn_async! { - // test that a node will return a PresentContent via GetContent when the data is stored locally - async fn test_get_content_content_present_locally<'a>(clients: Vec, _: ()) { - let client = match clients.into_iter().next() { - Some((client)) => client, - None => { - panic!("Unable to get expected amount of clients from NClientTestSpec"); - } - }; - - let content_key = ACCOUNT_TRIE_NODE_KEY.clone(); - let raw_content_offer_value = RAW_CONTENT_OFFER_VALUE.clone(); - let raw_content_lookup_value = RAW_CONTENT_LOOKUP_VALUE.clone(); - - // seed content_key/content_value onto the local node to test get_content expect content present - if let Err(err) = StateNetworkApiClient::store(&client.rpc, content_key.clone(), raw_content_offer_value).await { - panic!("Failed to store data: {err:?}"); - } - - match StateNetworkApiClient::get_content(&client.rpc, content_key).await { - Ok(GetContentInfo { content, utp_transfer }) => { - assert!(!utp_transfer, "Error: Expected utp_transfer to be false"); - assert_eq!(content, raw_content_lookup_value, "Error receiving content"); - } - Err(err) => panic!("Expected GetContent to not throw an error {err:?}"), - } - } -} diff --git a/simulators/portal/src/suites/utils.rs b/simulators/portal/src/suites/utils.rs deleted file mode 100644 index dbbfa20cb3..0000000000 --- a/simulators/portal/src/suites/utils.rs +++ /dev/null @@ -1,37 +0,0 @@ -// Execution Layer hard forks https://ethereum.org/en/history/ -pub const PRAGUE_BLOCK_NUMBER: u64 = 22431084; -pub const CANCUN_BLOCK_NUMBER: u64 = 19426587; -pub const SHANGHAI_BLOCK_NUMBER: u64 = 17034870; -pub const MERGE_BLOCK_NUMBER: u64 = 15537394; -pub const LONDON_BLOCK_NUMBER: u64 = 12965000; -pub const BERLIN_BLOCK_NUMBER: u64 = 12244000; -pub const ISTANBUL_BLOCK_NUMBER: u64 = 9069000; -pub const CONSTANTINOPLE_BLOCK_NUMBER: u64 = 7280000; -pub const BYZANTIUM_BLOCK_NUMBER: u64 = 4370000; -pub const HOMESTEAD_BLOCK_NUMBER: u64 = 1150000; - -pub fn get_flair(block_number: u64) -> String { - if block_number >= PRAGUE_BLOCK_NUMBER { - " (post-prague)".to_string() - } else if block_number >= CANCUN_BLOCK_NUMBER { - " (post-cancun)".to_string() - } else if block_number >= SHANGHAI_BLOCK_NUMBER { - " (post-shanghai)".to_string() - } else if block_number >= MERGE_BLOCK_NUMBER { - " (post-merge)".to_string() - } else if block_number >= LONDON_BLOCK_NUMBER { - " (post-london)".to_string() - } else if block_number >= BERLIN_BLOCK_NUMBER { - " (post-berlin)".to_string() - } else if block_number >= ISTANBUL_BLOCK_NUMBER { - " (post-istanbul)".to_string() - } else if block_number >= CONSTANTINOPLE_BLOCK_NUMBER { - " (post-constantinople)".to_string() - } else if block_number >= BYZANTIUM_BLOCK_NUMBER { - " (post-byzantium)".to_string() - } else if block_number >= HOMESTEAD_BLOCK_NUMBER { - " (post-homestead)".to_string() - } else { - "".to_string() - } -} diff --git a/simulators/smoke/clique/Dockerfile b/simulators/smoke/clique/Dockerfile deleted file mode 100644 index a3618e3b3a..0000000000 --- a/simulators/smoke/clique/Dockerfile +++ /dev/null @@ -1,15 +0,0 @@ -# Build the simulator. -FROM golang:1-alpine AS builder -ARG GOPROXY -ENV GOPROXY=${GOPROXY} - -RUN apk --no-cache add gcc musl-dev linux-headers -ADD . /clique -WORKDIR /clique -RUN go build . - -# Build the runner container. -FROM alpine:latest -ADD . / -COPY --from=builder /clique/clique / -ENTRYPOINT ["./clique"] diff --git a/simulators/smoke/clique/clique.go b/simulators/smoke/clique/clique.go deleted file mode 100644 index d2fea70ff8..0000000000 --- a/simulators/smoke/clique/clique.go +++ /dev/null @@ -1,68 +0,0 @@ -package main - -import ( - "time" - - "github.com/ethereum/hive/hivesim" -) - -func main() { - suite := hivesim.Suite{ - Name: "clique", - Description: "This test suite tests clique mining support.", - } - suite.Add(hivesim.ClientTestSpec{ - Role: "eth1", - Name: "mine one block", - Description: "Waits for a single block to get mined with clique.", - Files: map[string]string{ - "/genesis.json": "genesis.json", - }, - Parameters: hivesim.Params{ - "HIVE_CLIQUE_PERIOD": "2", - "HIVE_CLIQUE_PRIVATEKEY": "9c647b8b7c4e7c3490668fb6c11473619db80c93704c70893d3813af4090c39c", - "HIVE_MINER": "658bdf435d810c91414ec09147daa6db62406379", - // These are required for clique. - "HIVE_CHAIN_ID": "1334", - "HIVE_FORK_HOMESTEAD": "0", - "HIVE_FORK_TANGERINE": "0", - "HIVE_FORK_SPURIOUS": "0", - "HIVE_FORK_BYZANTIUM": "0", - "HIVE_FORK_CONSTANTINOPLE": "0", - "HIVE_FORK_PETERSBURG": "0", - }, - Run: miningTest, - }) - hivesim.MustRunSuite(hivesim.New(), suite) -} - -type block struct { - Number string `json:"number"` - Hash string `json:"hash"` - ParentHash string `json:"parentHash"` -} - -func miningTest(t *hivesim.T, c *hivesim.Client) { - start := time.Now() - timeout := 10 * time.Second - - for { - var b block - if err := c.RPC().Call(&b, "eth_getBlockByNumber", "latest", false); err != nil { - t.Fatal("eth_getBlockByNumber call failed:", err) - } - switch b.Number { - case "0x0": - // still at genesis block, keep waiting. - if time.Since(start) > timeout { - t.Fatal("no block produced within", timeout) - } - time.Sleep(300 * time.Millisecond) - case "0x1": - t.Log("block mined:", b.Hash) - return - default: - t.Fatal("wrong latest block: number", b.Number, ", hash", b.Hash, ", parent", b.ParentHash) - } - } -} diff --git a/simulators/smoke/clique/genesis.json b/simulators/smoke/clique/genesis.json deleted file mode 100644 index ab8ebaa304..0000000000 --- a/simulators/smoke/clique/genesis.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "difficulty": "0x1", - "gasLimit": "0x400000", - "extraData": "0x0000000000000000000000000000000000000000000000000000000000000000658bdf435d810c91414ec09147daa6db624063790000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000", - "nonce": "0x0", - "timestamp": "0x5c51a607", - "alloc": {} -} diff --git a/simulators/smoke/clique/go.mod b/simulators/smoke/clique/go.mod deleted file mode 100644 index 741c5d9a56..0000000000 --- a/simulators/smoke/clique/go.mod +++ /dev/null @@ -1,33 +0,0 @@ -module github.com/ethereum/hive/simulators/smoke/clique - -go 1.21 - -toolchain go1.22.1 - -require github.com/ethereum/hive v0.0.0-20240715150147-c87a99dccfce - -require ( - github.com/Microsoft/go-winio v0.6.2 // indirect - github.com/btcsuite/btcd/btcec/v2 v2.3.2 // indirect - github.com/deckarep/golang-set/v2 v2.6.0 // indirect - github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 // indirect - github.com/ethereum/go-ethereum v1.14.5 // indirect - github.com/go-ole/go-ole v1.3.0 // indirect - github.com/go-stack/stack v1.8.1 // indirect - github.com/golang-jwt/jwt/v4 v4.5.0 // indirect - github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect - github.com/gorilla/websocket v1.5.0 // indirect - github.com/holiman/uint256 v1.2.4 // indirect - github.com/lithammer/dedent v1.1.0 // indirect - github.com/mattn/go-colorable v0.1.13 // indirect - github.com/mattn/go-isatty v0.0.20 // indirect - github.com/shirou/gopsutil v3.21.11+incompatible // indirect - github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a // indirect - github.com/tklauser/go-sysconf v0.3.12 // indirect - github.com/tklauser/numcpus v0.6.1 // indirect - github.com/yusufpapurcu/wmi v1.2.2 // indirect - golang.org/x/crypto v0.22.0 // indirect - golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa // indirect - golang.org/x/sys v0.20.0 // indirect - gopkg.in/inconshreveable/log15.v2 v2.0.0-20200109203555-b30bc20e4fd1 // indirect -) diff --git a/simulators/smoke/clique/go.sum b/simulators/smoke/clique/go.sum deleted file mode 100644 index c93e8a1223..0000000000 --- a/simulators/smoke/clique/go.sum +++ /dev/null @@ -1,199 +0,0 @@ -github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= -github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= -github.com/bits-and-blooms/bitset v1.10.0 h1:ePXTeiPEazB5+opbv5fr8umg2R/1NlzgDsyepwsSr88= -github.com/bits-and-blooms/bitset v1.10.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= -github.com/btcsuite/btcd/btcec/v2 v2.3.2 h1:5n0X6hX0Zk+6omWcihdYvdAlGf2DfasC0GMf7DClJ3U= -github.com/btcsuite/btcd/btcec/v2 v2.3.2/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= -github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOFYSNEs0TFnxxnS9+4U= -github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= -github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= -github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= -github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/consensys/bavard v0.1.13 h1:oLhMLOFGTLdlda/kma4VOJazblc7IM5y5QPd2A/YjhQ= -github.com/consensys/bavard v0.1.13/go.mod h1:9ItSMtA/dXMAiL7BG6bqW2m3NdSEObYWoH223nGHukI= -github.com/consensys/gnark-crypto v0.12.1 h1:lHH39WuuFgVHONRl3J0LRBtuYdQTumFSDtJF7HpyG8M= -github.com/consensys/gnark-crypto v0.12.1/go.mod h1:v2Gy7L/4ZRosZ7Ivs+9SfUDr0f5UlG+EM5t7MPHiLuY= -github.com/crate-crypto/go-kzg-4844 v1.0.0 h1:TsSgHwrkTKecKJ4kadtHi4b3xHW5dCFUDFnUp1TsawI= -github.com/crate-crypto/go-kzg-4844 v1.0.0/go.mod h1:1kMhvPgI0Ky3yIa+9lFySEBUBXkYxeOi8ZF1sYioxhc= -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/deckarep/golang-set/v2 v2.6.0 h1:XfcQbWM1LlMB8BsJ8N9vW5ehnnPVIw0je80NsVHagjM= -github.com/deckarep/golang-set/v2 v2.6.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= -github.com/decred/dcrd/crypto/blake256 v1.0.0 h1:/8DMNYp9SGi5f0w7uCm6d6M4OU2rGFK09Y2A4Xv7EE0= -github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc= -github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 h1:HbphB4TFFXpv7MNrT52FGrrgVXF1owhMVTHFZIlnvd4= -github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0/go.mod h1:DZGJHZMqrU4JJqFAWUS2UO1+lbSKsdiOoYi9Zzey7Fc= -github.com/ethereum/c-kzg-4844 v1.0.0 h1:0X1LBXxaEtYD9xsyj9B9ctQEZIpnvVDeoBx8aHEwTNA= -github.com/ethereum/c-kzg-4844 v1.0.0/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= -github.com/ethereum/go-ethereum v1.14.5 h1:szuFzO1MhJmweXjoM5nSAeDvjNUH3vIQoMzzQnfvjpw= -github.com/ethereum/go-ethereum v1.14.5/go.mod h1:VEDGGhSxY7IEjn98hJRFXl/uFvpRgbIIf2PpXiyGGgc= -github.com/ethereum/hive v0.0.0-20240715150147-c87a99dccfce h1:wgH9mh3TFSd+LFSsXO6RdTEO3niapJRywO1Xl3/IoIE= -github.com/ethereum/hive v0.0.0-20240715150147-c87a99dccfce/go.mod h1:ghNXZW+/WQClcyiwZpbTzUCyxwql7YeMacYd44v+BJE= -github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= -github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= -github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= -github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= -github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= -github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= -github.com/go-stack/stack v1.8.1 h1:ntEHSVwIt7PNXNpgPmVfMrNhLtgjlmnZha2kOpuRiDw= -github.com/go-stack/stack v1.8.1/go.mod h1:dcoOX6HbPZSZptuspn9bctJ+N/CnF5gGygcUP3XYfe4= -github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= -github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg= -github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= -github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= -github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= -github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= -github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= -github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb h1:PBC98N2aIaM3XXiurYmW7fx4GZkL8feAMVq7nEjURHk= -github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= -github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= -github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= -github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/holiman/uint256 v1.2.4 h1:jUc4Nk8fm9jZabQuqr2JzednajVmBpC+oiTiXZJEApU= -github.com/holiman/uint256 v1.2.4/go.mod h1:EOMSn4q6Nyt9P6efbI3bueV4e1b3dGlUCXeiRV4ng7E= -github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/lithammer/dedent v1.1.0 h1:VNzHMVCBNG1j0fh3OrsFRkVUwStdDArbgBWoPAffktY= -github.com/lithammer/dedent v1.1.0/go.mod h1:jrXYCQtgg0nJiN+StA2KgR7w6CiQNv9Fd/Z9BP0jIOc= -github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= -github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= -github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= -github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= -github.com/mmcloughlin/addchain v0.4.0 h1:SobOdjm2xLj1KkXN5/n0xTIWyZA2+s99UCY1iPfkHRY= -github.com/mmcloughlin/addchain v0.4.0/go.mod h1:A86O+tHqZLMNO4w6ZZ4FlVQEadcoqkyU72HC5wJ4RlU= -github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= -github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= -github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= -github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= -github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= -github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= -github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= -github.com/onsi/ginkgo/v2 v2.1.3/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c= -github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= -github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= -github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= -github.com/onsi/gomega v1.19.0 h1:4ieX6qQjPP/BfC3mpsAtIGGlxTWPeA3Inl/7DtXw1tw= -github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/shirou/gopsutil v3.21.11+incompatible h1:+1+c1VGhc88SSonWP6foOcLhvnKlUeu/erjjvaPEYiI= -github.com/shirou/gopsutil v3.21.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= -github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= -github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -github.com/supranational/blst v0.3.11 h1:LyU6FolezeWAhvQk0k6O/d49jqgO52MSDDfYgbeoEm4= -github.com/supranational/blst v0.3.11/go.mod h1:jZJtfjgudtNl4en1tzwPIV3KjUnQUvG3/j+w+fVonLw= -github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a h1:1ur3QoCqvE5fl+nylMaIr9PVV1w343YRDtsy+Rwu7XI= -github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a/go.mod h1:RRCYJbIwD5jmqPI9XoAFR0OcDxqUctll6zUj/+B4S48= -github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= -github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= -github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk= -github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= -github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yusufpapurcu/wmi v1.2.2 h1:KBNDSne4vP5mbSWnJbO+51IMOXJB67QiYCSBrubbPRg= -github.com/yusufpapurcu/wmi v1.2.2/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.22.0 h1:g1v0xeRhjcugydODzvb3mEM9SQ0HGp9s/nh3COQ/C30= -golang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M= -golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa h1:FRnLl4eNAQl8hwxVVC17teOw8kdjVDVAiFMtgUdTSRQ= -golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa/go.mod h1:zk2irFbV9DP96SEBUUAy67IdHUaZuSnrz1n472HUCLE= -golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= -golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.24.0 h1:1PcaxkF854Fu3+lvBIx5SYn9wRlBzzcnHZSiaFFAb0w= -golang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8= -golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -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-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= -golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -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/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -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= -golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= -google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= -google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= -google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= -google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= -google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= -google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= -google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/inconshreveable/log15.v2 v2.0.0-20200109203555-b30bc20e4fd1 h1:iiHuQZCNgYPmFQxd3BBN/Nc5+dAwzZuq5y40s20oQw0= -gopkg.in/inconshreveable/log15.v2 v2.0.0-20200109203555-b30bc20e4fd1/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= -gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= -gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= -gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -rsc.io/tmplfunc v0.0.3 h1:53XFQh69AfOa8Tw0Jm7t+GV7KZhOi6jzsCzTtKbMvzU= -rsc.io/tmplfunc v0.0.3/go.mod h1:AG3sTPzElb1Io3Yg4voV9AGZJuleGAwaVRxL9M49PhA= diff --git a/test.sh b/test.sh index 4811f3ea42..939b086e77 100644 --- a/test.sh +++ b/test.sh @@ -32,16 +32,6 @@ function run { (cd $HIVEHOME && $1) } -function testconsensus { - client=$1 - echo "$(date) Starting hive consensus simulation [$client]" - run "./hive --sim ethereum/consensus --client $client --sim.loglevel 6 --sim.testlimit 2 $FLAGS" -} -function testgraphql { - echo "$(date) Starting graphql simulation [$1]" - run "./hive --sim ethereum/graphql --client $1 $FLAGS" -} - function testsync { echo "$(date) Starting hive sync simulation [$1]" run "./hive --sim ethereum/sync --client=$1 $FLAGS" @@ -70,23 +60,11 @@ testsync nethermind_latest # fails #testsync go-ethereum_latest nethermind_latest #testsync go-ethereum_latest besu_latest -# GraphQL implemented only in besu and geth -# - -testgraphql go-ethereum_latest -testgraphql besu_latest - - # The devp2p tests are pretty quick -- a few minutes #testdevp2p go-ethereum_latest #testdevp2p nethermind_latest #testdevp2p besu_latest -# These take an extremely long time to run -#testconsensus go-ethereum_latest -#testconsensus nethermind_latest -#testconsensus besu_latest -