From 5f6db5fb9b54645e054e436a919dfd0f47466848 Mon Sep 17 00:00:00 2001 From: Ethen Date: Tue, 10 Oct 2023 13:21:54 -0700 Subject: [PATCH] Rebasing to Optimism Monorepo w/ Parallelized E2E Testing (#163) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/hygeine.yml | 2 +- .github/workflows/test.yml | 21 +- .gitignore | 4 +- Makefile | 6 +- README.md | 2 + cmd/main.go | 5 +- e2e/alert-routing-cfg.yaml | 30 - e2e/alerting_test.go | 152 +++++ e2e/e2e_test.go | 587 ------------------ e2e/heuristic_test.go | 367 +++++++++++ ...st_pagerduty_server.go => mock_servers.go} | 77 +++ e2e/{e2e.go => setup.go} | 127 +++- e2e/test_slack_server.go | 84 --- go.mod | 153 ++--- go.sum | 405 ++++++------ internal/alert/routing_test.go | 10 +- internal/api/service/service.go | 4 +- internal/app/app.go | 42 +- internal/app/app_test.go | 43 -- internal/app/init.go | 4 +- internal/client/pagerduty.go | 4 +- internal/config/config.go | 57 +- internal/core/alert.go | 12 +- internal/core/id.go | 5 + internal/engine/registry/fault_detector.go | 2 +- internal/etl/component/oracle.go | 6 + internal/etl/pipeline/manager.go | 11 + internal/etl/pipeline/pipeline.go | 12 + .../etl/registry/oracle/account_balance.go | 4 + internal/etl/registry/oracle/geth_block.go | 4 + internal/mocks/etl_manager.go | 16 + internal/mocks/oracle.go | 4 + internal/mocks/subsystem.go | 4 +- internal/subsystem/manager.go | 28 +- internal/subsystem/manager_test.go | 2 +- mocks/alert_client.go | 65 ++ scripts/devnet-allocs.sh | 18 + 37 files changed, 1254 insertions(+), 1125 deletions(-) delete mode 100644 e2e/alert-routing-cfg.yaml create mode 100644 e2e/alerting_test.go delete mode 100644 e2e/e2e_test.go create mode 100644 e2e/heuristic_test.go rename e2e/{test_pagerduty_server.go => mock_servers.go} (52%) rename e2e/{e2e.go => setup.go} (60%) delete mode 100644 e2e/test_slack_server.go delete mode 100644 internal/app/app_test.go create mode 100644 mocks/alert_client.go create mode 100755 scripts/devnet-allocs.sh diff --git a/.github/workflows/hygeine.yml b/.github/workflows/hygeine.yml index b6d099c6..0ec8d6c4 100644 --- a/.github/workflows/hygeine.yml +++ b/.github/workflows/hygeine.yml @@ -17,7 +17,7 @@ jobs: - name: Set up Go uses: actions/setup-go@v3 with: - go-version: 1.19 + go-version: 1.21 - name: Install mockgen run: go install github.com/golang/mock/mockgen@v1.6.0 diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 36f23dea..042ebf3d 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -16,7 +16,7 @@ jobs: - name: Set up Go uses: actions/setup-go@v3 with: - go-version: 1.19 + go-version: 1.21 - name: Build App run: make build-app @@ -31,12 +31,16 @@ jobs: - name: Set up Go uses: actions/setup-go@v3 with: - go-version: 1.19 + go-version: 1.21 + + - name: Install project dependencies + run: | + go mod download - name: Run Unit Tests id: unit run: | - go test -coverprofile=coverage.out ./internal/... >> out.txt + go test -v -coverprofile=coverage.out ./internal/... # - name: Generate Coverage # run: | @@ -69,8 +73,15 @@ jobs: - name: Set up Go uses: actions/setup-go@v3 with: - go-version: 1.19 + go-version: 1.21 + + - name: Install foundry + uses: foundry-rs/foundry-toolchain@v1 + + - name: Setup devnet resources + id: devnet + run: | + make devnet-allocs - name: Run E2E Integration Tests run: make e2e-test - diff --git a/.gitignore b/.gitignore index 623cbf35..afc2aa89 100644 --- a/.gitignore +++ b/.gitignore @@ -3,4 +3,6 @@ config.env /.vscode/ /.idea genesis.json -alert-routing.yaml \ No newline at end of file +alert-routing.yaml +.devnet +packages/contracts-bedrock/deploy-config/devnetL1.json \ No newline at end of file diff --git a/Makefile b/Makefile index e8dee742..23cb1007 100644 --- a/Makefile +++ b/Makefile @@ -31,7 +31,7 @@ test: .PHONY: test-e2e e2e-test: - @ go test ./e2e/... -timeout $(TEST_LIMIT) + @ go test ./e2e/... -timeout $(TEST_LIMIT) -deploy-config ../.devnet/devnetL1.json -parallel=4 -v .PHONY: lint lint: @@ -65,3 +65,7 @@ metrics-docs: build-app @echo "$(GREEN) Generating metric documentation...$(COLOR_END)" @./bin/pessimism doc metrics + +devnet-allocs: + @echo "$(GREEN) Generating devnet allocs...$(COLOR_END)" + @./scripts/devnet-allocs.sh \ No newline at end of file diff --git a/README.md b/README.md index d0d401e9..8041ee28 100644 --- a/README.md +++ b/README.md @@ -126,6 +126,8 @@ Unit tests can run using the following project level command(s): Integration tests are written that leverage the existing [op-e2e](https://github.com/ethereum-optimism/optimism/tree/develop/op-e2e) testing framework for spinning up pieces of the bedrock system. Additionally, the [httptest](https://pkg.go.dev/net/http/httptest) library is used to mock downstream alerting services (e.g. Slack's webhook API). These tests live in the project's `/e2e` directory. +Running integration tests requires generating devnet allocation files for compatibility with the Optimism monorepo. The following `scripts/devnet_allocs.sh` can be run to do this generation. If successful, a new `.devnet` directory will be created in the project's root directory. + Integration tests can run using the following project level command(s): * Using Make: `make e2e-test` diff --git a/cmd/main.go b/cmd/main.go index 430946bc..43e07a06 100644 --- a/cmd/main.go +++ b/cmd/main.go @@ -102,11 +102,14 @@ func RunPessimism(_ *cli.Context) error { return err } - if err := pessimism.BootStrap(sessions); err != nil { + ids, err := pessimism.BootStrap(sessions) + if err != nil { logger.Fatal("Error bootstrapping application state", zap.Error(err)) return err } + logger.Info("Received bootstrapped session UUIDs", zap.Any(logging.SUUIDKey, ids)) + logger.Debug("Application state successfully bootstrapped") } diff --git a/e2e/alert-routing-cfg.yaml b/e2e/alert-routing-cfg.yaml deleted file mode 100644 index 4d958b40..00000000 --- a/e2e/alert-routing-cfg.yaml +++ /dev/null @@ -1,30 +0,0 @@ -alertRoutes: - low: - slack: - config: - url: "http://127.0.0.1:7100" - channel: "#test-low" - - medium: - slack: - config: - url: "http://127.0.0.1:7100" - channel: "#test-medium" - pagerduty: - config: - integration_key: "test-medium" - - high: - slack: - config: - url: "http://127.0.0.1:7100" - channel: "#test-high" - config_2: - url: "http://127.0.0.1:7100" - channel: "#test-high-2" - - pagerduty: - config: - integration_key: "test-high-1" - config_2: - integration_key: "test-high-2" diff --git a/e2e/alerting_test.go b/e2e/alerting_test.go new file mode 100644 index 00000000..20389475 --- /dev/null +++ b/e2e/alerting_test.go @@ -0,0 +1,152 @@ +package e2e_test + +import ( + "context" + "math/big" + "testing" + "time" + + "github.com/base-org/pessimism/e2e" + "github.com/base-org/pessimism/internal/api/models" + "github.com/base-org/pessimism/internal/core" + "github.com/ethereum-optimism/optimism/op-bindings/bindings" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/core/types" + "github.com/stretchr/testify/assert" +) + +// TestMultiDirectiveRouting ... Tests the E2E flow of a contract event heuristic with high priority alerts all +// necessary destinations +func TestMultiDirectiveRouting(t *testing.T) { + + ts := e2e.CreateSysTestSuite(t) + + updateSig := "ConfigUpdate(uint256,uint8,bytes)" + alertMsg := "System config gas config updated" + + _, err := ts.App.BootStrap([]*models.SessionRequestParams{{ + Network: core.Layer1.String(), + PType: core.Live.String(), + HeuristicType: core.ContractEvent.String(), + StartHeight: nil, + EndHeight: nil, + AlertingParams: &core.AlertPolicy{ + Msg: alertMsg, + Sev: core.HIGH.String(), + }, + SessionParams: map[string]interface{}{ + "address": ts.Cfg.L1Deployments.SystemConfigProxy.String(), + "args": []interface{}{updateSig}, + }, + }}) + + assert.NoError(t, err, "Error bootstrapping heuristic session") + + sysCfg, err := bindings.NewSystemConfig(ts.Cfg.L1Deployments.SystemConfigProxy, ts.L1Client) + assert.NoError(t, err, "Error getting system config") + + opts, err := bind.NewKeyedTransactorWithChainID(ts.Cfg.Secrets.SysCfgOwner, ts.Cfg.L1ChainIDBig()) + assert.NoError(t, err, "Error getting system config owner pk") + + overhead := big.NewInt(10000) + scalar := big.NewInt(1) + + tx, err := sysCfg.SetGasConfig(opts, overhead, scalar) + assert.NoError(t, err, "Error setting gas config") + + txTimeoutDuration := 10 * time.Duration(ts.Cfg.DeployConfig.L1BlockTime) * time.Second + receipt, err := e2e.WaitForTransaction(tx.Hash(), ts.L1Client, txTimeoutDuration) + + assert.NoError(t, err, "Error waiting for transaction") + assert.Equal(t, receipt.Status, types.ReceiptStatusSuccessful, "transaction failed") + + time.Sleep(3 * time.Second) + slackPosts := ts.TestSlackSvr.SlackAlerts() + pdPosts := ts.TestPagerDutyServer.PagerDutyAlerts() + + // Expect 2 alerts to each destination as alert-routing-cfg.yaml has two slack and two pagerduty destinations + assert.Equal(t, 2, len(slackPosts), "Incorrect Number of slack posts sent") + assert.Equal(t, 2, len(pdPosts), "Incorrect Number of pagerduty posts sent") + assert.Contains(t, slackPosts[0].Text, "contract_event", "System contract event alert was not sent") + assert.Contains(t, slackPosts[1].Text, "contract_event", "System contract event alert was not sent") + assert.Contains(t, pdPosts[0].Payload.Summary, "contract_event", "System contract event alert was not sent") + assert.Contains(t, pdPosts[1].Payload.Summary, "contract_event", "System contract event alert was not sent") +} + +// TestCoolDown ... Tests the E2E flow of a single +// balance enforcement heuristic session on L2 network with a cooldown. +func TestCoolDown(t *testing.T) { + + ts := e2e.CreateL2TestSuite(t) + defer ts.Close() + + alice := ts.L2Cfg.Secrets.Addresses().Alice + bob := ts.L2Cfg.Secrets.Addresses().Bob + + alertMsg := "one baby to another says:" + // Deploy a balance enforcement heuristic session for Alice using a cooldown. + _, err := ts.App.BootStrap([]*models.SessionRequestParams{{ + Network: core.Layer2.String(), + PType: core.Live.String(), + HeuristicType: core.BalanceEnforcement.String(), + StartHeight: nil, + EndHeight: nil, + AlertingParams: &core.AlertPolicy{ + // Set a cooldown to one minute. + CoolDown: 60, + Sev: core.LOW.String(), + Msg: alertMsg, + }, + SessionParams: map[string]interface{}{ + "address": alice.String(), + "lower": 3, // i.e. alert if balance is less than 3 ETH + }, + }}) + + assert.NoError(t, err, "Failed to bootstrap balance enforcement heuristic session") + + // Get Alice's balance. + aliceAmt, err := ts.L2Geth.L2Client.BalanceAt(context.Background(), alice, nil) + assert.NoError(t, err, "Failed to get Alice's balance") + + // Determine the gas cost of the transaction. + gasAmt := 1_000_001 + bigAmt := big.NewInt(1_000_001) + gasPrice := big.NewInt(int64(ts.L2Cfg.DeployConfig.L2GenesisBlockGasLimit)) + + gasCost := gasPrice.Mul(gasPrice, bigAmt) + + signer := types.LatestSigner(ts.L2Geth.L2ChainConfig) + + // Create a transaction from Alice to Bob that will drain almost all of Alice's ETH. + drainAliceTx := types.MustSignNewTx(ts.L2Cfg.Secrets.Alice, signer, &types.DynamicFeeTx{ + ChainID: big.NewInt(int64(ts.L2Cfg.DeployConfig.L2ChainID)), + Nonce: 0, + GasTipCap: big.NewInt(100), + GasFeeCap: big.NewInt(100000), + Gas: uint64(gasAmt), + To: &bob, + // Subtract the gas cost from the amount sent to Bob. + Value: aliceAmt.Sub(aliceAmt, gasCost), + Data: nil, + }) + + // Send the transaction to drain Alice's account of almost all ETH. + _, err = ts.L2Geth.AddL2Block(context.Background(), drainAliceTx) + assert.NoError(t, err, "Failed to create L2 block with transaction") + + // Wait for Pessimism to process the balance change and send a notification to the mocked Slack server. + time.Sleep(2 * time.Second) + + // Check that the balance enforcement was triggered using the mocked server cache. + posts := ts.TestSlackSvr.SlackAlerts() + + assert.Equal(t, 1, len(posts), "No balance enforcement alert was sent") + assert.Contains(t, posts[0].Text, "balance_enforcement", "Balance enforcement alert was not sent") + assert.Contains(t, posts[0].Text, alertMsg) + + // Ensure that no new alerts are sent for provided cooldown period. + time.Sleep(1 * time.Second) + posts = ts.TestSlackSvr.SlackAlerts() + assert.Equal(t, 1, len(posts), "No alerts should be sent after the transaction is sent") +} diff --git a/e2e/e2e_test.go b/e2e/e2e_test.go deleted file mode 100644 index 7169fc35..00000000 --- a/e2e/e2e_test.go +++ /dev/null @@ -1,587 +0,0 @@ -package e2e_test - -import ( - "context" - "crypto/ecdsa" - "math/big" - - "github.com/ethereum/go-ethereum/rpc" - - "testing" - "time" - - "github.com/ethereum-optimism/optimism/op-bindings/bindings" - "github.com/ethereum-optimism/optimism/op-bindings/predeploys" - - "github.com/ethereum-optimism/optimism/op-node/withdrawals" - - "github.com/ethereum/go-ethereum/accounts/abi/bind" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/crypto" - "github.com/ethereum/go-ethereum/ethclient" - "github.com/ethereum/go-ethereum/ethclient/gethclient" - "github.com/stretchr/testify/assert" - - "github.com/base-org/pessimism/e2e" - - "github.com/base-org/pessimism/internal/api/models" - "github.com/base-org/pessimism/internal/core" -) - -// Test_Balance_Enforcement ... Tests the E2E flow of a single -// balance enforcement heuristic session on L2 network. -func Test_Balance_Enforcement(t *testing.T) { - - ts := e2e.CreateL2TestSuite(t) - defer ts.Close() - - alice := ts.L2Cfg.Secrets.Addresses().Alice - bob := ts.L2Cfg.Secrets.Addresses().Bob - - alertMsg := "one baby to another says:" - // Deploy a balance enforcement heuristic session for Alice. - err := ts.App.BootStrap([]*models.SessionRequestParams{{ - Network: core.Layer2.String(), - PType: core.Live.String(), - HeuristicType: core.BalanceEnforcement.String(), - StartHeight: nil, - EndHeight: nil, - AlertingParams: &core.AlertPolicy{ - Sev: core.MEDIUM.String(), - Msg: alertMsg, - }, - SessionParams: map[string]interface{}{ - "address": alice.String(), - "lower": 3, // i.e. alert if balance is less than 3 ETH - }, - }}) - - assert.NoError(t, err, "Failed to bootstrap balance enforcement heuristic session") - - // Get Alice's balance. - aliceAmt, err := ts.L2Geth.L2Client.BalanceAt(context.Background(), alice, nil) - assert.NoError(t, err, "Failed to get Alice's balance") - - // Determine the gas cost of the transaction. - gasAmt := 1_000_001 - bigAmt := big.NewInt(1_000_001) - gasPrice := big.NewInt(int64(ts.L2Cfg.DeployConfig.L2GenesisBlockGasLimit)) - - gasCost := gasPrice.Mul(gasPrice, bigAmt) - - signer := types.LatestSigner(ts.L2Geth.L2ChainConfig) - - // Create a transaction from Alice to Bob that will drain almost all of Alice's ETH. - drainAliceTx := types.MustSignNewTx(ts.L2Cfg.Secrets.Alice, signer, &types.DynamicFeeTx{ - ChainID: big.NewInt(int64(ts.L2Cfg.DeployConfig.L2ChainID)), - Nonce: 0, - GasTipCap: big.NewInt(100), - GasFeeCap: big.NewInt(100000), - Gas: uint64(gasAmt), - To: &bob, - // Subtract the gas cost from the amount sent to Bob. - Value: aliceAmt.Sub(aliceAmt, gasCost), - Data: nil, - }) - - assert.Equal(t, len(ts.TestPagerDutyServer.PagerDutyAlerts()), 0, "No alerts should be sent before the transaction is sent") - - // Send the transaction to drain Alice's account of almost all ETH. - _, err = ts.L2Geth.AddL2Block(context.Background(), drainAliceTx) - assert.NoError(t, err, "Failed to create L2 block with transaction") - - // Wait for Pessimism to process the balance change and send a notification to the mocked Slack server. - time.Sleep(1 * time.Second) - - // Check that the balance enforcement was triggered using the mocked server cache. - posts := ts.TestPagerDutyServer.PagerDutyAlerts() - slackPosts := ts.TestSlackSvr.SlackAlerts() - assert.Greater(t, len(slackPosts), 1, "No balance enforcement alert was sent") - assert.Greater(t, len(posts), 1, "No balance enforcement alert was sent") - assert.Contains(t, posts[0].Payload.Summary, "balance_enforcement", "Balance enforcement alert was not sent") - - // Get Bobs's balance. - bobAmt, err := ts.L2Geth.L2Client.BalanceAt(context.Background(), bob, nil) - assert.NoError(t, err, "Failed to get Alice's balance") - - // Create a transaction to send the ETH back to Alice. - drainBobTx := types.MustSignNewTx(ts.L2Cfg.Secrets.Bob, signer, &types.DynamicFeeTx{ - ChainID: big.NewInt(int64(ts.L2Cfg.DeployConfig.L2ChainID)), - Nonce: 0, - GasTipCap: big.NewInt(100), - GasFeeCap: big.NewInt(100000), - Gas: uint64(gasAmt), - To: &alice, - Value: bobAmt.Sub(bobAmt, gasCost), - Data: nil, - }) - - // Send the transaction to re-disperse the ETH from Bob back to Alice. - _, err = ts.L2Geth.AddL2Block(context.Background(), drainBobTx) - assert.NoError(t, err, "Failed to create L2 block with transaction") - - // Wait for Pessimism to process the balance change. - time.Sleep(1 * time.Second) - - // Empty the mocked PagerDuty server cache. - ts.TestPagerDutyServer.ClearAlerts() - - // Wait to ensure that no new alerts are sent. - time.Sleep(1 * time.Second) - - // Ensure that no new alerts were sent. - assert.Equal(t, len(ts.TestPagerDutyServer.Payloads), 0, "No alerts should be sent after the transaction is sent") -} - -// Test_Balance_Enforce_With_CoolDown ... Tests the E2E flow of a single -// balance enforcement heuristic session on L2 network with a cooldown. -func Test_Balance_Enforce_With_CoolDown(t *testing.T) { - - ts := e2e.CreateL2TestSuite(t) - defer ts.Close() - - alice := ts.L2Cfg.Secrets.Addresses().Alice - bob := ts.L2Cfg.Secrets.Addresses().Bob - - alertMsg := "one baby to another says:" - // Deploy a balance enforcement heuristic session for Alice using a cooldown. - err := ts.App.BootStrap([]*models.SessionRequestParams{{ - Network: core.Layer2.String(), - PType: core.Live.String(), - HeuristicType: core.BalanceEnforcement.String(), - StartHeight: nil, - EndHeight: nil, - AlertingParams: &core.AlertPolicy{ - // Set a cooldown of one minute. - CoolDown: 60, - Sev: core.LOW.String(), - Msg: alertMsg, - }, - SessionParams: map[string]interface{}{ - "address": alice.String(), - "lower": 3, // i.e. alert if balance is less than 3 ETH - }, - }}) - - assert.NoError(t, err, "Failed to bootstrap balance enforcement heuristic session") - - // Get Alice's balance. - aliceAmt, err := ts.L2Geth.L2Client.BalanceAt(context.Background(), alice, nil) - assert.NoError(t, err, "Failed to get Alice's balance") - - // Determine the gas cost of the transaction. - gasAmt := 1_000_001 - bigAmt := big.NewInt(1_000_001) - gasPrice := big.NewInt(int64(ts.L2Cfg.DeployConfig.L2GenesisBlockGasLimit)) - - gasCost := gasPrice.Mul(gasPrice, bigAmt) - - signer := types.LatestSigner(ts.L2Geth.L2ChainConfig) - - // Create a transaction from Alice to Bob that will drain almost all of Alice's ETH. - drainAliceTx := types.MustSignNewTx(ts.L2Cfg.Secrets.Alice, signer, &types.DynamicFeeTx{ - ChainID: big.NewInt(int64(ts.L2Cfg.DeployConfig.L2ChainID)), - Nonce: 0, - GasTipCap: big.NewInt(100), - GasFeeCap: big.NewInt(100000), - Gas: uint64(gasAmt), - To: &bob, - // Subtract the gas cost from the amount sent to Bob. - Value: aliceAmt.Sub(aliceAmt, gasCost), - Data: nil, - }) - - // Send the transaction to drain Alice's account of almost all ETH. - _, err = ts.L2Geth.AddL2Block(context.Background(), drainAliceTx) - assert.NoError(t, err, "Failed to create L2 block with transaction") - - // Wait for Pessimism to process the balance change and send a notification to the mocked Slack server. - time.Sleep(2 * time.Second) - - // Check that the balance enforcement was triggered using the mocked server cache. - posts := ts.TestSlackSvr.SlackAlerts() - - assert.Equal(t, 1, len(posts), "No balance enforcement alert was sent") - assert.Contains(t, posts[0].Text, "balance_enforcement", "Balance enforcement alert was not sent") - assert.Contains(t, posts[0].Text, alertMsg) - - // Ensure that no new alerts are sent for provided cooldown period. - time.Sleep(1 * time.Second) - posts = ts.TestSlackSvr.SlackAlerts() - assert.Equal(t, 1, len(posts), "No alerts should be sent after the transaction is sent") -} - -// Test_Contract_Event ... Tests the E2E flow of a single -// contract event heuristic session on L1 network. -func Test_Contract_Event(t *testing.T) { - - ts := e2e.CreateSysTestSuite(t) - defer ts.Close() - - l1Client := ts.Sys.Clients["l1"] - - // The string declaration of the event we want to listen for. - updateSig := "ConfigUpdate(uint256,uint8,bytes)" - alertMsg := "System config gas config updated" - - // Deploy a contract event heuristic session for the L1 system config address. - err := ts.App.BootStrap([]*models.SessionRequestParams{{ - Network: core.Layer1.String(), - PType: core.Live.String(), - HeuristicType: core.ContractEvent.String(), - StartHeight: nil, - EndHeight: nil, - AlertingParams: &core.AlertPolicy{ - Msg: alertMsg, - Sev: core.LOW.String(), - }, - SessionParams: map[string]interface{}{ - "address": predeploys.DevSystemConfigAddr.String(), - "args": []interface{}{updateSig}, - }, - }}) - assert.NoError(t, err, "Error bootstrapping heuristic session") - - // Get bindings for the L1 system config contract. - sysCfg, err := bindings.NewSystemConfig(predeploys.DevSystemConfigAddr, l1Client) - assert.NoError(t, err, "Error getting system config") - - // Obtain our signer. - opts, err := bind.NewKeyedTransactorWithChainID(ts.Cfg.Secrets.SysCfgOwner, ts.Cfg.L1ChainIDBig()) - assert.NoError(t, err, "Error getting system config owner pk") - - // Assign arbitrary gas config values. - overhead := big.NewInt(10000) - scalar := big.NewInt(1) - - // Call setGasConfig method on the L1 system config contract. - tx, err := sysCfg.SetGasConfig(opts, overhead, scalar) - assert.NoError(t, err, "Error setting gas config") - - // Wait for the transaction to be canonicalized. - txTimeoutDuration := 10 * time.Duration(ts.Cfg.DeployConfig.L1BlockTime) * time.Second - receipt, err := e2e.WaitForTransaction(tx.Hash(), l1Client, txTimeoutDuration) - - assert.NoError(t, err, "Error waiting for transaction") - assert.Equal(t, receipt.Status, types.ReceiptStatusSuccessful, "transaction failed") - - // Wait for Pessimism to process the newly emitted event and send a notification to the mocked Slack server. - time.Sleep(1 * time.Second) - posts := ts.TestSlackSvr.SlackAlerts() - - assert.Equal(t, len(posts), 1, "No system contract event alert was sent") - assert.Contains(t, posts[0].Text, "contract_event", "System contract event alert was not sent") - assert.Contains(t, posts[0].Text, alertMsg, "System contract event message was not propagated") -} - -// Test_Contract_Event_High_Priority ... Tests the E2E flow of a contract event heuristic with high priority alerts all -// necessary destinations -func Test_Contract_Event_High_Priority(t *testing.T) { - - ts := e2e.CreateSysTestSuite(t) - defer ts.Close() - - l1Client := ts.Sys.Clients["l1"] - - updateSig := "ConfigUpdate(uint256,uint8,bytes)" - alertMsg := "System config gas config updated" - - err := ts.App.BootStrap([]*models.SessionRequestParams{{ - Network: core.Layer1.String(), - PType: core.Live.String(), - HeuristicType: core.ContractEvent.String(), - StartHeight: nil, - EndHeight: nil, - AlertingParams: &core.AlertPolicy{ - Msg: alertMsg, - Sev: core.HIGH.String(), - }, - SessionParams: map[string]interface{}{ - "address": predeploys.DevSystemConfigAddr.String(), - "args": []interface{}{updateSig}, - }, - }}) - - assert.NoError(t, err, "Error bootstrapping heuristic session") - - sysCfg, err := bindings.NewSystemConfig(predeploys.DevSystemConfigAddr, l1Client) - assert.NoError(t, err, "Error getting system config") - - opts, err := bind.NewKeyedTransactorWithChainID(ts.Cfg.Secrets.SysCfgOwner, ts.Cfg.L1ChainIDBig()) - assert.NoError(t, err, "Error getting system config owner pk") - - overhead := big.NewInt(10000) - scalar := big.NewInt(1) - - tx, err := sysCfg.SetGasConfig(opts, overhead, scalar) - assert.NoError(t, err, "Error setting gas config") - - txTimeoutDuration := 10 * time.Duration(ts.Cfg.DeployConfig.L1BlockTime) * time.Second - receipt, err := e2e.WaitForTransaction(tx.Hash(), l1Client, txTimeoutDuration) - - assert.NoError(t, err, "Error waiting for transaction") - assert.Equal(t, receipt.Status, types.ReceiptStatusSuccessful, "transaction failed") - - time.Sleep(3 * time.Second) - slackPosts := ts.TestSlackSvr.SlackAlerts() - pdPosts := ts.TestPagerDutyServer.PagerDutyAlerts() - - // Expect 2 alerts to each destination as alert-routing-cfg.yaml has two slack and two pagerduty destinations - assert.Equal(t, 2, len(slackPosts), "Incorrect Number of slack posts sent") - assert.Equal(t, 2, len(pdPosts), "Incorrect Number of pagerduty posts sent") - assert.Contains(t, slackPosts[0].Text, "contract_event", "System contract event alert was not sent") - assert.Contains(t, slackPosts[1].Text, "contract_event", "System contract event alert was not sent") - assert.Contains(t, pdPosts[0].Payload.Summary, "contract_event", "System contract event alert was not sent") - assert.Contains(t, pdPosts[1].Payload.Summary, "contract_event", "System contract event alert was not sent") -} - -// TestAccount defines an account for testing. -type TestAccount struct { - Key *ecdsa.PrivateKey - Addr common.Address - L1Opts *bind.TransactOpts - L2Opts *bind.TransactOpts -} - -// Test_Withdrawal_Enforcement ... Tests the E2E flow of a withdrawal -// / enforce heuristic session. This test uses two L2ToL1 message passer contracts; -// one that is configured to be "faulty" and one that is not. The heuristic session -// should only produce an alert when the faulty L2ToL1 message passer is used given -// that it's state is empty. -func Test_Withdrawal_Enforcement(t *testing.T) { - - ts := e2e.CreateSysTestSuite(t) - defer ts.Close() - - // Obtain our sequencer, verifier, and transactor key-pair. - l1Client := ts.Sys.Clients["l1"] - l2Seq := ts.Sys.Clients["sequencer"] - l2Verifier := ts.Sys.Clients["verifier"] - - // Define our L1 transaction timeout duration. - txTimeoutDuration := 10 * time.Duration(ts.Cfg.DeployConfig.L1BlockTime) * time.Second - - // Bind to the deposit contract. - depositContract, err := bindings.NewOptimismPortal(predeploys.DevOptimismPortalAddr, l1Client) - _ = depositContract - assert.NoError(t, err) - - // Create a test account state for our transactor. - transactorKey := ts.Cfg.Secrets.Alice - transactor := TestAccount{ - Key: transactorKey, - L1Opts: nil, - L2Opts: nil, - } - - transactor.L1Opts, err = bind.NewKeyedTransactorWithChainID(transactor.Key, ts.Cfg.L1ChainIDBig()) - assert.NoError(t, err) - transactor.L2Opts, err = bind.NewKeyedTransactorWithChainID(transactor.Key, ts.Cfg.L2ChainIDBig()) - assert.NoError(t, err) - - // Bind to the L2-L1 message passer. - l2l1MessagePasser, err := bindings.NewL2ToL1MessagePasser(predeploys.L2ToL1MessagePasserAddr, l2Seq) - assert.NoError(t, err, "error binding to message passer on L2") - - // Deploy a dummy L2ToL1 message passer for testing. - fakeAddr, tx, _, err := bindings.DeployL2ToL1MessagePasser(transactor.L2Opts, l2Seq) - assert.NoError(t, err, "error deploying message passer on L2") - - _, err = e2e.WaitForTransaction(tx.Hash(), l2Seq, txTimeoutDuration) - assert.NoError(t, err, "error waiting for transaction") - - // Determine the address our request will come from. - fromAddr := crypto.PubkeyToAddress(transactor.Key.PublicKey) - - // Setup alert message. - alertMsg := "disrupting centralized finance" - - // Setup Pessimism to listen for fraudulent withdrawals - // We use two heuristics here; one configured with a dummy L1 message passer - // and one configured with the real L2->L1 message passer contract. This allows us to - // ensure that an alert is only produced using faulty message passer. - err = ts.App.BootStrap([]*models.SessionRequestParams{ - { - // This is the one that should produce an alert - Network: core.Layer1.String(), - PType: core.Live.String(), - HeuristicType: core.WithdrawalEnforcement.String(), - StartHeight: nil, - EndHeight: nil, - AlertingParams: &core.AlertPolicy{ - Sev: core.LOW.String(), - Msg: alertMsg, - }, - SessionParams: map[string]interface{}{ - core.L1Portal: predeploys.DevOptimismPortal, - core.L2ToL1MessagePasser: fakeAddr.String(), - }, - }, - { - Network: core.Layer1.String(), - PType: core.Live.String(), - HeuristicType: core.WithdrawalEnforcement.String(), - StartHeight: nil, - EndHeight: nil, - AlertingParams: &core.AlertPolicy{ - Sev: core.LOW.String(), - }, - SessionParams: map[string]interface{}{ - core.L1Portal: predeploys.DevOptimismPortal, - core.L2ToL1MessagePasser: predeploys.L2ToL1MessagePasserAddr.String(), - }, - }, - }) - assert.NoError(t, err, "Error bootstrapping heuristic session") - - // Initiate Withdrawal. - withdrawAmount := big.NewInt(500_000_000_000) - transactor.L2Opts.Value = withdrawAmount - tx, err = l2l1MessagePasser.InitiateWithdrawal(transactor.L2Opts, fromAddr, big.NewInt(21000), nil) - assert.Nil(t, err, "sending initiate withdraw tx") - - // Wait for the transaction to appear in the L2 verifier. - receipt, err := e2e.WaitForTransaction(tx.Hash(), l2Verifier, txTimeoutDuration) - assert.Nil(t, err, "withdrawal initiated on L2 sequencer") - assert.Equal(t, receipt.Status, types.ReceiptStatusSuccessful, "transaction failed") - - // Wait for the finalization period, then we can finalize this withdrawal. - ctx, cancel := context.WithTimeout(context.Background(), 40*time.Duration(ts.Cfg.DeployConfig.L1BlockTime)*time.Second) - blockNumber, err := withdrawals.WaitForFinalizationPeriod(ctx, l1Client, predeploys.DevOptimismPortalAddr, receipt.BlockNumber) - cancel() - assert.Nil(t, err) - - ctx, cancel = context.WithTimeout(context.Background(), txTimeoutDuration) - header, err := l2Verifier.HeaderByNumber(ctx, new(big.Int).SetUint64(blockNumber)) - cancel() - assert.Nil(t, err) - - l2OutputOracle, err := bindings.NewL2OutputOracleCaller(predeploys.DevL2OutputOracleAddr, l1Client) - assert.Nil(t, err) - - rpcClient, err := rpc.Dial(ts.Sys.Nodes["verifier"].WSEndpoint()) - - assert.Nil(t, err) - proofCl := gethclient.New(rpcClient) - receiptCl := ethclient.NewClient(rpcClient) - - // Now create the withdrawal - params, err := withdrawals.ProveWithdrawalParameters(context.Background(), proofCl, receiptCl, tx.Hash(), header, l2OutputOracle) - assert.Nil(t, err) - - // Obtain our withdrawal parameters - withdrawalTransaction := &bindings.TypesWithdrawalTransaction{ - Nonce: params.Nonce, - Sender: params.Sender, - Target: params.Target, - Value: params.Value, - GasLimit: params.GasLimit, - Data: params.Data, - } - l2OutputIndexParam := params.L2OutputIndex - outputRootProofParam := params.OutputRootProof - withdrawalProofParam := params.WithdrawalProof - - time.Sleep(1 * time.Second) - - // Prove withdrawal. This checks the proof so we only finalize if this succeeds - tx, err = depositContract.ProveWithdrawalTransaction( - transactor.L1Opts, - *withdrawalTransaction, - l2OutputIndexParam, - outputRootProofParam, - withdrawalProofParam, - ) - assert.Nil(t, err, "withdrawal should successfully prove") - - // Wait for the transaction to appear in L1 - _, err = e2e.WaitForTransaction(tx.Hash(), l1Client, txTimeoutDuration) - assert.Nil(t, err, "withdrawal finalized on L1") - time.Sleep(1 * time.Second) - - // Ensure Pessimism has detected what it considers a "faulty" withdrawal - alerts := ts.TestSlackSvr.SlackAlerts() - assert.Equal(t, 1, len(alerts), "expected 1 alert") - assert.Contains(t, alerts[0].Text, "withdrawal_enforcement", "expected alert to be for withdrawal_enforcement") - assert.Contains(t, alerts[0].Text, fakeAddr.String(), "expected alert to be for dummy L2ToL1MessagePasser") - assert.Contains(t, alerts[0].Text, alertMsg, "expected alert to have alert message") -} - -// Test_Fault_Detector ... Ensures that an alert is produced in the presence of a faulty L2Output root -// on the L1 Optimism portal contract. -func Test_Fault_Detector(t *testing.T) { - ts := e2e.CreateSysTestSuite(t) - defer ts.Close() - - l1Client := ts.Sys.Clients["l1"] - l2Client := ts.Sys.Clients["sequencer"] - - txTimeoutDuration := 10 * time.Duration(ts.Cfg.DeployConfig.L1BlockTime) * time.Second - - // Generate transactor opts - aliceKey := ts.Cfg.Secrets.Alice - l1Opts, err := bind.NewKeyedTransactorWithChainID(ts.Cfg.Secrets.Proposer, ts.Cfg.L1ChainIDBig()) - assert.Nil(t, err) - - l2Opts, err := bind.NewKeyedTransactorWithChainID(aliceKey, ts.Cfg.L2ChainIDBig()) - assert.Nil(t, err) - - // Generate output oracle bindings - outputOracle, err := bindings.NewL2OutputOracleTransactor(predeploys.DevL2OutputOracleAddr, l1Client) - assert.Nil(t, err) - - reader, err := bindings.NewL2OutputOracleCaller(predeploys.DevL2OutputOracleAddr, l1Client) - assert.Nil(t, err) - - // Assign alert message - - alertMsg := "the fault, dear Brutus, is not in our stars, but in ourselves" - // Deploys a fault detector heuristic session instance using the locally spun-up Op-Stack chain - err = ts.App.BootStrap([]*models.SessionRequestParams{{ - Network: core.Layer1.String(), - PType: core.Live.String(), - HeuristicType: core.FaultDetector.String(), - StartHeight: big.NewInt(0), - EndHeight: nil, - AlertingParams: &core.AlertPolicy{ - Sev: core.LOW.String(), - Msg: alertMsg, - }, - SessionParams: map[string]interface{}{ - core.L2OutputOracle: predeploys.DevL2OutputOracle, - core.L2ToL1MessagePasser: predeploys.L2ToL1MessagePasser, - }, - }}) - - assert.Nil(t, err) - - // Deploy a dummy L2ToL1 message passer for testing. - _, tx, _, err := bindings.DeployL2ToL1MessagePasser(l2Opts, l2Client) - assert.NoError(t, err, "error deploying message passer on L2") - - _, err = e2e.WaitForTransaction(tx.Hash(), l2Client, txTimeoutDuration) - assert.NoError(t, err, "error waiting for transaction") - - // Propose a forged L2 output root. - - dummyRoot := [32]byte{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10} - l1Hash := [32]byte{0} - - latestNum, err := reader.NextBlockNumber(&bind.CallOpts{}) - assert.Nil(t, err) - - tx, err = outputOracle.ProposeL2Output(l1Opts, dummyRoot, latestNum, l1Hash, big.NewInt(0)) - assert.Nil(t, err) - - _, err = e2e.WaitForTransaction(tx.Hash(), l1Client, txTimeoutDuration) - assert.Nil(t, err) - - // Wait for a fault detection alert to be produced. - time.Sleep(1 * time.Second) - - alerts := ts.TestSlackSvr.SlackAlerts() - assert.Equal(t, 1, len(alerts), "expected 1 alert") - assert.Contains(t, alerts[0].Text, "fault_detector", "expected alert to be for fault_detector") - assert.Contains(t, alerts[0].Text, alertMsg, "expected alert to have alert message") -} diff --git a/e2e/heuristic_test.go b/e2e/heuristic_test.go new file mode 100644 index 00000000..61612262 --- /dev/null +++ b/e2e/heuristic_test.go @@ -0,0 +1,367 @@ +package e2e_test + +import ( + "context" + "math/big" + "testing" + "time" + + "github.com/base-org/pessimism/e2e" + "github.com/base-org/pessimism/internal/api/models" + "github.com/base-org/pessimism/internal/core" + "github.com/ethereum-optimism/optimism/op-bindings/bindings" + "github.com/ethereum-optimism/optimism/op-bindings/predeploys" + op_e2e "github.com/ethereum-optimism/optimism/op-e2e" + "github.com/ethereum-optimism/optimism/op-e2e/e2eutils/wait" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/params" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +// TestBalanceEnforcement ... Tests the E2E flow of a single +// balance enforcement heuristic session on L2 network. +func TestBalanceEnforcement(t *testing.T) { + + ts := e2e.CreateL2TestSuite(t) + defer ts.Close() + + alice := ts.L2Cfg.Secrets.Addresses().Alice + bob := ts.L2Cfg.Secrets.Addresses().Bob + + alertMsg := "one baby to another says:" + // Deploy a balance enforcement heuristic session for Alice. + _, err := ts.App.BootStrap([]*models.SessionRequestParams{{ + Network: core.Layer2.String(), + PType: core.Live.String(), + HeuristicType: core.BalanceEnforcement.String(), + StartHeight: nil, + EndHeight: nil, + AlertingParams: &core.AlertPolicy{ + Sev: core.MEDIUM.String(), + Msg: alertMsg, + }, + SessionParams: map[string]interface{}{ + "address": alice.String(), + "lower": 3, // i.e. alert if balance is less than 3 ETH + }, + }}) + + assert.NoError(t, err, "Failed to bootstrap balance enforcement heuristic session") + + // Get Alice's balance. + aliceAmt, err := ts.L2Geth.L2Client.BalanceAt(context.Background(), alice, nil) + assert.NoError(t, err, "Failed to get Alice's balance") + + // Determine the gas cost of the transaction. + gasAmt := 1_000_001 + bigAmt := big.NewInt(1_000_001) + gasPrice := big.NewInt(int64(ts.L2Cfg.DeployConfig.L2GenesisBlockGasLimit)) + + gasCost := gasPrice.Mul(gasPrice, bigAmt) + + signer := types.LatestSigner(ts.L2Geth.L2ChainConfig) + + // Create a transaction from Alice to Bob that will drain almost all of Alice's ETH. + drainAliceTx := types.MustSignNewTx(ts.L2Cfg.Secrets.Alice, signer, &types.DynamicFeeTx{ + ChainID: big.NewInt(int64(ts.L2Cfg.DeployConfig.L2ChainID)), + Nonce: 0, + GasTipCap: big.NewInt(100), + GasFeeCap: big.NewInt(100000), + Gas: uint64(gasAmt), + To: &bob, + // Subtract the gas cost from the amount sent to Bob. + Value: aliceAmt.Sub(aliceAmt, gasCost), + Data: nil, + }) + + assert.Equal(t, len(ts.TestPagerDutyServer.PagerDutyAlerts()), 0, "No alerts should be sent before the transaction is sent") + + // Send the transaction to drain Alice's account of almost all ETH. + _, err = ts.L2Geth.AddL2Block(context.Background(), drainAliceTx) + assert.NoError(t, err, "Failed to create L2 block with transaction") + + // Wait for Pessimism to process the balance change and send a notification to the mocked Slack server. + time.Sleep(1 * time.Second) + + // Check that the balance enforcement was triggered using the mocked server cache. + pdMsgs := ts.TestPagerDutyServer.PagerDutyAlerts() + slackMsgs := ts.TestSlackSvr.SlackAlerts() + assert.Greater(t, len(slackMsgs), 1, "No balance enforcement alert was sent") + assert.Greater(t, len(pdMsgs), 1, "No balance enforcement alert was sent") + assert.Contains(t, pdMsgs[0].Payload.Summary, "balance_enforcement", "Balance enforcement alert was not sent") + + // Get Bobs's balance. + bobAmt, err := ts.L2Geth.L2Client.BalanceAt(context.Background(), bob, nil) + assert.NoError(t, err, "Failed to get Alice's balance") + + // Create a transaction to send the ETH back to Alice. + drainBobTx := types.MustSignNewTx(ts.L2Cfg.Secrets.Bob, signer, &types.DynamicFeeTx{ + ChainID: big.NewInt(int64(ts.L2Cfg.DeployConfig.L2ChainID)), + Nonce: 0, + GasTipCap: big.NewInt(100), + GasFeeCap: big.NewInt(100000), + Gas: uint64(gasAmt), + To: &alice, + Value: bobAmt.Sub(bobAmt, gasCost), + Data: nil, + }) + + // Send the transaction to re-disperse the ETH from Bob back to Alice. + _, err = ts.L2Geth.AddL2Block(context.Background(), drainBobTx) + assert.NoError(t, err, "Failed to create L2 block with transaction") + + // Wait for Pessimism to process the balance change. + time.Sleep(1 * time.Second) + + // Empty the mocked PagerDuty server cache. + ts.TestPagerDutyServer.ClearAlerts() + + // Wait to ensure that no new alerts are sent. + time.Sleep(1 * time.Second) + + // Ensure that no new alerts were sent. + assert.Equal(t, len(ts.TestPagerDutyServer.Payloads), 0, "No alerts should be sent after the transaction is sent") +} + +// TestContractEvent ... Tests the E2E flow of a single +// contract event heuristic session on L1 network. +func TestContractEvent(t *testing.T) { + + ts := e2e.CreateSysTestSuite(t) + defer ts.Close() + + // The string declaration of the event we want to listen for. + updateSig := "ConfigUpdate(uint256,uint8,bytes)" + alertMsg := "System config gas config updated" + + // Deploy a contract event heuristic session for the L1 system config address. + ids, err := ts.App.BootStrap([]*models.SessionRequestParams{{ + Network: core.Layer1.String(), + PType: core.Live.String(), + HeuristicType: core.ContractEvent.String(), + StartHeight: nil, + EndHeight: nil, + AlertingParams: &core.AlertPolicy{ + Msg: alertMsg, + Sev: core.LOW.String(), + }, + SessionParams: map[string]interface{}{ + "address": ts.Cfg.L1Deployments.SystemConfigProxy.String(), + "args": []interface{}{updateSig}, + }, + }}) + assert.NoError(t, err, "Error bootstrapping heuristic session") + + // Get bindings for the L1 system config contract. + sysCfg, err := bindings.NewSystemConfig(ts.Cfg.L1Deployments.SystemConfigProxy, ts.L1Client) + assert.NoError(t, err, "Error getting system config") + + // Obtain our signer. + opts, err := bind.NewKeyedTransactorWithChainID(ts.Cfg.Secrets.SysCfgOwner, ts.Cfg.L1ChainIDBig()) + assert.NoError(t, err, "Error getting system config owner pk") + + // Assign arbitrary gas config values. + overhead := big.NewInt(10000) + scalar := big.NewInt(1) + + // Call setGasConfig method on the L1 system config contract. + tx, err := sysCfg.SetGasConfig(opts, overhead, scalar) + assert.NoError(t, err, "Error setting gas config") + + // Wait for the transaction to be canonicalized. + txTimeoutDuration := 10 * time.Duration(ts.Cfg.DeployConfig.L1BlockTime) * time.Second + receipt, err := e2e.WaitForTransaction(tx.Hash(), ts.L1Client, txTimeoutDuration) + + assert.NoError(t, err, "Error waiting for transaction") + assert.Equal(t, receipt.Status, types.ReceiptStatusSuccessful, "transaction failed") + + // Wait for Pessimism to process the newly emitted event and send a notification to the mocked Slack server. + require.NoError(t, wait.For(context.Background(), 500*time.Millisecond, func() (bool, error) { + pUUID := ids[0].PUUID + height, err := ts.Subsystems.PipelineHeight(pUUID) + if err != nil { + return false, err + } + + return height.Uint64() > receipt.BlockNumber.Uint64(), nil + })) + + msgs := ts.TestSlackSvr.SlackAlerts() + + assert.Equal(t, len(msgs), 1, "No system contract event alert was sent") + assert.Contains(t, msgs[0].Text, "contract_event", "System contract event alert was not sent") + assert.Contains(t, msgs[0].Text, alertMsg, "System contract event message was not propagated") +} + +// TestWithdrawalEnforcement ... Tests the E2E flow of a withdrawal +// / enforcement heuristic session. This test uses two L2ToL1 message passer contracts; +// one that is configured to be "faulty" and one that is not. The heuristic session +// should only produce an alert when the faulty L2ToL1 message passer is used given +// that it's state is empty. +func TestWithdrawalEnforcement(t *testing.T) { + + // 1 - Misconfigured testing environment + // 2 - Change in chain state that affects the heuristic + ts := e2e.CreateSysTestSuite(t) + defer ts.Close() + + opts, err := bind.NewKeyedTransactorWithChainID(ts.Cfg.Secrets.Alice, ts.Cfg.L2ChainIDBig()) + assert.NoError(t, err, "Error getting system config owner pk") + + alertMsg := "disrupting centralized finance" + + // Deploy a dummy L2ToL1 message passer for testing. + fakeAddr, tx, _, err := bindings.DeployL2ToL1MessagePasser(opts, ts.L2Client) + assert.NoError(t, err, "error deploying dummy message passer on L2") + + _, err = e2e.WaitForTransaction(tx.Hash(), ts.L2Client, 10*time.Second) + assert.NoError(t, err, "error waiting for transaction") + + // Setup Pessimism to listen for fraudulent withdrawals + // We use two heuristics here; one configured with a dummy L1 message passer + // and one configured with the real L2->L1 message passer contract. This allows us to + // ensure that an alert is only produced using the faulty message passer since it's state + // initiated withdrawal state is empty. + ids, err := ts.App.BootStrap([]*models.SessionRequestParams{ + { + // This is the one that should produce an alert + Network: core.Layer1.String(), + PType: core.Live.String(), + HeuristicType: core.WithdrawalEnforcement.String(), + StartHeight: nil, + EndHeight: nil, + AlertingParams: &core.AlertPolicy{ + Sev: core.LOW.String(), + Msg: alertMsg, + }, + SessionParams: map[string]interface{}{ + core.L1Portal: ts.Cfg.L1Deployments.OptimismPortalProxy.String(), + core.L2ToL1MessagePasser: fakeAddr.String(), + }, + }, + }) + assert.NoError(t, err, "Error bootstrapping heuristic session") + + optimismPortal, err := bindings.NewOptimismPortal(ts.Cfg.L1Deployments.OptimismPortalProxy, ts.L1Client) + assert.NoError(t, err) + l2ToL1MessagePasser, err := bindings.NewL2ToL1MessagePasser(predeploys.L2ToL1MessagePasserAddr, ts.L2Client) + assert.NoError(t, err) + + aliceAddr := ts.Cfg.Secrets.Addresses().Alice + + // attach 1 ETH to the withdrawal and random calldata + calldata := []byte{byte(1), byte(2), byte(3)} + l2Opts, err := bind.NewKeyedTransactorWithChainID(ts.Cfg.Secrets.Alice, ts.Cfg.L2ChainIDBig()) + assert.NoError(t, err) + l2Opts.Value = big.NewInt(params.Ether) + + // Ensure L1 has enough funds for the withdrawal by depositing an equal amount into the OptimismPortal + l1Opts, err := bind.NewKeyedTransactorWithChainID(ts.Cfg.Secrets.Alice, ts.Cfg.L1ChainIDBig()) + assert.NoError(t, err) + l1Opts.Value = l2Opts.Value + depositTx, err := optimismPortal.Receive(l1Opts) + assert.NoError(t, err) + _, err = wait.ForReceiptOK(context.Background(), ts.L1Client, depositTx.Hash()) + assert.NoError(t, err) + + // Initiate and prove a withdrawal + withdrawTx, err := l2ToL1MessagePasser.InitiateWithdrawal(l2Opts, aliceAddr, big.NewInt(100_000), calldata) + assert.NoError(t, err) + withdrawReceipt, err := wait.ForReceiptOK(context.Background(), ts.L2Client, withdrawTx.Hash()) + assert.NoError(t, err) + + _, proveReceipt := op_e2e.ProveWithdrawal(t, *ts.Cfg, ts.L1Client, ts.Sys.EthInstances["sequencer"], ts.Cfg.Secrets.Alice, withdrawReceipt) + + // Wait for Pessimism to process the withdrawal and send a notification to the mocked Slack server. + assert.NoError(t, wait.For(context.Background(), 500*time.Millisecond, func() (bool, error) { + pUUID := ids[0].PUUID + height, err := ts.Subsystems.PipelineHeight(pUUID) + if err != nil { + return false, err + } + + return height.Uint64() > proveReceipt.BlockNumber.Uint64(), nil + })) + + time.Sleep(time.Second * 10) + + // Ensure Pessimism has detected what it considers a "faulty" withdrawal + alerts := ts.TestSlackSvr.SlackAlerts() + assert.Equal(t, 1, len(alerts), "expected 1 alert") + assert.Contains(t, alerts[0].Text, "withdrawal_enforcement", "expected alert to be for withdrawal_enforcement") + assert.Contains(t, alerts[0].Text, fakeAddr.String(), "expected alert to be for dummy L2ToL1MessagePasser") + assert.Contains(t, alerts[0].Text, alertMsg, "expected alert to have alert message") +} + +// TestFaultDetector ... Ensures that an alert is produced in the presence of a faulty L2Output root +// on the L1 Optimism portal contract. +func TestFaultDetector(t *testing.T) { + ts := e2e.CreateSysTestSuite(t) + defer ts.Close() + + txTimeoutDuration := 10 * time.Duration(ts.Cfg.DeployConfig.L1BlockTime) * time.Second + + // Generate transactor opts + l1Opts, err := bind.NewKeyedTransactorWithChainID(ts.Cfg.Secrets.Proposer, ts.Cfg.L1ChainIDBig()) + assert.Nil(t, err) + + // Generate output oracle bindings + outputOracle, err := bindings.NewL2OutputOracleTransactor(ts.Cfg.L1Deployments.L2OutputOracleProxy, ts.L1Client) + assert.Nil(t, err) + + reader, err := bindings.NewL2OutputOracleCaller(ts.Cfg.L1Deployments.L2OutputOracleProxy, ts.L1Client) + assert.Nil(t, err) + + alertMsg := "the fault, dear Brutus, is not in our stars, but in ourselves" + + // Deploys a fault detector heuristic session instance using the locally spun-up Op-Stack chain + ids, err := ts.App.BootStrap([]*models.SessionRequestParams{{ + Network: core.Layer1.String(), + PType: core.Live.String(), + HeuristicType: core.FaultDetector.String(), + StartHeight: big.NewInt(0), + EndHeight: nil, + AlertingParams: &core.AlertPolicy{ + Sev: core.LOW.String(), + Msg: alertMsg, + }, + SessionParams: map[string]interface{}{ + core.L2OutputOracle: ts.Cfg.L1Deployments.L2OutputOracleProxy.String(), + core.L2ToL1MessagePasser: predeploys.L2ToL1MessagePasser, + }, + }}) + + assert.Nil(t, err) + assert.Len(t, ids, 1) + + // Propose a forged L2 output root. + + dummyRoot := [32]byte{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10} + l1Hash := [32]byte{0} + + latestNum, err := reader.NextBlockNumber(&bind.CallOpts{}) + assert.Nil(t, err) + + tx, err := outputOracle.ProposeL2Output(l1Opts, dummyRoot, latestNum, l1Hash, big.NewInt(0)) + assert.Nil(t, err) + + receipt, err := e2e.WaitForTransaction(tx.Hash(), ts.L1Client, txTimeoutDuration) + assert.Nil(t, err) + + require.NoError(t, wait.For(context.Background(), 500*time.Millisecond, func() (bool, error) { + pUUID := ids[0].PUUID + height, err := ts.Subsystems.PipelineHeight(pUUID) + if err != nil { + return false, err + } + + return height.Uint64() > receipt.BlockNumber.Uint64(), nil + })) + + alerts := ts.TestSlackSvr.SlackAlerts() + assert.Equal(t, 1, len(alerts), "expected 1 alert") + assert.Contains(t, alerts[0].Text, "fault_detector", "expected alert to be for fault_detector") + assert.Contains(t, alerts[0].Text, alertMsg, "expected alert to have alert message") +} diff --git a/e2e/test_pagerduty_server.go b/e2e/mock_servers.go similarity index 52% rename from e2e/test_pagerduty_server.go rename to e2e/mock_servers.go index d0855c49..d25d6d58 100644 --- a/e2e/test_pagerduty_server.go +++ b/e2e/mock_servers.go @@ -16,6 +16,7 @@ import ( // TestPagerDutyServer ... Mock server for testing pagerduty alerts type TestPagerDutyServer struct { + Port int Server *httptest.Server Payloads []*client.PagerDutyRequest } @@ -45,6 +46,9 @@ func NewTestPagerDutyServer(url string, port int) *TestPagerDutyServer { //nolin panic(err) } pds.Server.Listener = l + + // get port from listener + pds.Port = pds.Server.Listener.Addr().(*net.TCPAddr).Port pds.Server.Start() logging.NoContext().Info("Test pagerduty server started", zap.String("url", url), zap.Int("port", port)) @@ -84,3 +88,76 @@ func (svr *TestPagerDutyServer) PagerDutyAlerts() []*client.PagerDutyRequest { func (svr *TestPagerDutyServer) ClearAlerts() { svr.Payloads = []*client.PagerDutyRequest{} } + +// TestSlackServer ... Mock server for testing slack alerts +type TestSlackServer struct { + Server *httptest.Server + Payloads []*client.SlackPayload + Port int +} + +// NewTestSlackServer ... Creates a new mock slack server +func NewTestSlackServer(url string, port int) *TestSlackServer { //nolint:dupl //This will be addressed + l, err := net.Listen("tcp", fmt.Sprintf("%s:%d", url, port)) + if err != nil { + panic(err) + } + + ss := &TestSlackServer{ + Payloads: []*client.SlackPayload{}, + } + + ss.Server = httptest.NewUnstartedServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + switch strings.TrimSpace(r.URL.Path) { + case "/": + ss.mockSlackPost(w, r) + default: + http.NotFoundHandler().ServeHTTP(w, r) + } + })) + + err = ss.Server.Listener.Close() + if err != nil { + panic(err) + } + ss.Server.Listener = l + // get port from listener + ss.Port = ss.Server.Listener.Addr().(*net.TCPAddr).Port + + ss.Server.Start() + + logging.NoContext().Info("Test slack server started", zap.String("url", url), zap.Int("port", port)) + + return ss +} + +// Close ... Closes the server +func (svr *TestSlackServer) Close() { + svr.Server.Close() +} + +// mockSlackPost ... Mocks a slack post request +func (svr *TestSlackServer) mockSlackPost(w http.ResponseWriter, r *http.Request) { + var alert *client.SlackPayload + + if err := json.NewDecoder(r.Body).Decode(&alert); err != nil { + w.WriteHeader(http.StatusBadRequest) + _, _ = w.Write([]byte(`{"message":"", "error":"could not decode slack payload"}`)) + return + } + + svr.Payloads = append(svr.Payloads, alert) + + w.WriteHeader(http.StatusOK) + _, _ = w.Write([]byte(`{"message":"ok", "error":""}`)) +} + +// SlackAlerts ... Returns the slack alerts +func (svr *TestSlackServer) SlackAlerts() []*client.SlackPayload { + return svr.Payloads +} + +// ClearAlerts ... Clears the alerts +func (svr *TestSlackServer) ClearAlerts() { + svr.Payloads = []*client.SlackPayload{} +} diff --git a/e2e/e2e.go b/e2e/setup.go similarity index 60% rename from e2e/e2e.go rename to e2e/setup.go index 8c7c99b5..6778785a 100644 --- a/e2e/e2e.go +++ b/e2e/setup.go @@ -4,6 +4,7 @@ import ( "context" "errors" "fmt" + "os" "testing" "time" @@ -23,26 +24,30 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/ethclient" -) - -const ( - SlackTestServerPort = 7100 - PagerDutyTestPort = 7200 + "github.com/ethereum/go-ethereum/log" ) // SysTestSuite ... Stores all the information needed to run an e2e system test type SysTestSuite struct { t *testing.T + // Optimism Cfg *op_e2e.SystemConfig Sys *op_e2e.System - App *app.Application - AppCfg *config.Config - Close func() + // Pessimism + App *app.Application + AppCfg *config.Config + Subsystems *subsystem.Manager + Close func() + // Mock servers TestSlackSvr *TestSlackServer TestPagerDutyServer *TestPagerDutyServer + + // Clients + L1Client *ethclient.Client + L2Client *ethclient.Client } // L2TestSuite ... Stores all the information needed to run an e2e L2Geth test @@ -64,6 +69,7 @@ type L2TestSuite struct { func CreateL2TestSuite(t *testing.T) *L2TestSuite { ctx := context.Background() nodeCfg := op_e2e.DefaultSystemConfig(t) + logging.New(core.Development) node, err := op_e2e.NewOpGeth(t, ctx, &nodeCfg) if err != nil { @@ -75,12 +81,17 @@ func CreateL2TestSuite(t *testing.T) *L2TestSuite { appCfg := DefaultTestConfig() - slackServer := NewTestSlackServer("127.0.0.1", SlackTestServerPort) + slackServer := NewTestSlackServer("127.0.0.1", 0) + + pagerdutyServer := NewTestPagerDutyServer("127.0.0.1", 0) + + appCfg.AlertConfig.RoutingCfgPath = "" - pagerdutyServer := NewTestPagerDutyServer("127.0.0.1", PagerDutyTestPort) + slackURL := fmt.Sprintf("http://127.0.0.1:%d", slackServer.Port) + pagerdutyURL := fmt.Sprintf("http://127.0.0.1:%d", pagerdutyServer.Port) - appCfg.AlertConfig.RoutingCfgPath = "alert-routing-cfg.yaml" - appCfg.AlertConfig.PagerdutyAlertEventsURL = fmt.Sprintf("http://127.0.0.1:%d", PagerDutyTestPort) + appCfg.AlertConfig.PagerdutyAlertEventsURL = pagerdutyURL + appCfg.AlertConfig.RoutingParams = DefaultRoutingParams(core.StringFromEnv(slackURL)) pess, kill, err := app.NewPessimismApp(ctx, appCfg) if err != nil { @@ -93,8 +104,6 @@ func CreateL2TestSuite(t *testing.T) *L2TestSuite { go pess.ListenForShutdown(kill) - logging.New(core.Development) - return &L2TestSuite{ t: t, L2Geth: node, @@ -114,17 +123,28 @@ func CreateL2TestSuite(t *testing.T) *L2TestSuite { // CreateSysTestSuite ... Creates a new SysTestSuite func CreateSysTestSuite(t *testing.T) *SysTestSuite { + t.Log("Creating system test suite") ctx := context.Background() + logging.New(core.Development) cfg := op_e2e.DefaultSystemConfig(t) - cfg.DeployConfig.FinalizationPeriodSeconds = 6 + cfg.DeployConfig.FinalizationPeriodSeconds = 2 + + // Don't output rollup service logs unless ENABLE_ROLLUP_LOGS is set + if len(os.Getenv("ENABLE_ROLLUP_LOGS")) == 0 { + t.Log("set env 'ENABLE_ROLLUP_LOGS' to show rollup logs") + for name, logger := range cfg.Loggers { + t.Logf("discarding logs for %s", name) + logger.SetHandler(log.DiscardHandler()) + } + } - sys, err := cfg.Start() + sys, err := cfg.Start(t) if err != nil { t.Fatal(err) } - gethClient, err := client.NewGethClient(sys.Nodes["sequencer"].HTTPEndpoint()) + gethClient, err := client.NewGethClient(sys.EthInstances["sequencer"].HTTPEndpoint()) if err != nil { t.Fatal(err) } @@ -136,12 +156,17 @@ func CreateSysTestSuite(t *testing.T) *SysTestSuite { appCfg := DefaultTestConfig() - slackServer := NewTestSlackServer("127.0.0.1", SlackTestServerPort) + slackServer := NewTestSlackServer("127.0.0.1", 0) - pagerdutyServer := NewTestPagerDutyServer("127.0.0.1", PagerDutyTestPort) + pagerdutyServer := NewTestPagerDutyServer("127.0.0.1", 0) - appCfg.AlertConfig.RoutingCfgPath = "alert-routing-cfg.yaml" - appCfg.AlertConfig.PagerdutyAlertEventsURL = fmt.Sprintf("http://127.0.0.1:%d", PagerDutyTestPort) + appCfg.AlertConfig.RoutingCfgPath = "" + + slackURL := fmt.Sprintf("http://127.0.0.1:%d", slackServer.Port) + pagerdutyURL := fmt.Sprintf("http://127.0.0.1:%d", pagerdutyServer.Port) + + appCfg.AlertConfig.PagerdutyAlertEventsURL = pagerdutyURL + appCfg.AlertConfig.RoutingParams = DefaultRoutingParams(core.StringFromEnv(slackURL)) pess, kill, err := app.NewPessimismApp(ctx, appCfg) if err != nil { @@ -154,8 +179,6 @@ func CreateSysTestSuite(t *testing.T) *SysTestSuite { go pess.ListenForShutdown(kill) - logging.New(core.Development) - return &SysTestSuite{ t: t, Sys: sys, @@ -168,15 +191,16 @@ func CreateSysTestSuite(t *testing.T) *SysTestSuite { pagerdutyServer.Close() }, AppCfg: appCfg, + Subsystems: pess.Subsystems, TestSlackSvr: slackServer, TestPagerDutyServer: pagerdutyServer, + L1Client: sys.Clients["l1"], + L2Client: sys.Clients["sequencer"], } } // DefaultTestConfig ... Returns a default app config for testing func DefaultTestConfig() *config.Config { - port := 6980 - metPort := 6300 l1PollInterval := 900 l2PollInterval := 300 maxPipelines := 10 @@ -192,11 +216,11 @@ func DefaultTestConfig() *config.Config { MetricsConfig: &metrics.Config{ Enabled: false, Host: "localhost", - Port: metPort, + Port: 0, }, ServerConfig: &server.Config{ Host: "localhost", - Port: port, + Port: 0, }, AlertConfig: &alert.Config{ PagerdutyAlertEventsURL: "", @@ -205,6 +229,55 @@ func DefaultTestConfig() *config.Config { } } +// DefaultRoutingParams ... Returns a default routing params configuration for testing +func DefaultRoutingParams(slackURL core.StringFromEnv) *core.AlertRoutingParams { + return &core.AlertRoutingParams{ + AlertRoutes: &core.SeverityMap{ + Low: &core.AlertClientCfg{ + Slack: map[string]*core.AlertConfig{ + "config": { + URL: slackURL, + Channel: "#test-low", + }, + }, + }, + Medium: &core.AlertClientCfg{ + Slack: map[string]*core.AlertConfig{ + "config": { + URL: slackURL, + Channel: "#test-medium", + }, + }, + PagerDuty: map[string]*core.AlertConfig{ + "config": { + IntegrationKey: "test-medium", + }, + }, + }, + High: &core.AlertClientCfg{ + Slack: map[string]*core.AlertConfig{ + "config": { + URL: slackURL, + Channel: "#test-high", + }, + "config_2": { + URL: slackURL, + Channel: "#test-high-2", + }, + }, + PagerDuty: map[string]*core.AlertConfig{ + "config": { + IntegrationKey: "test-high-1", + }, + "config_2": { + IntegrationKey: "test-high-2", + }, + }, + }, + }, + } +} + // WaitForTransaction ... Waits for a transaction receipt to be generated or times out func WaitForTransaction(hash common.Hash, client *ethclient.Client, timeout time.Duration) (*types.Receipt, error) { timeoutCh := time.After(timeout) diff --git a/e2e/test_slack_server.go b/e2e/test_slack_server.go deleted file mode 100644 index 823dff0e..00000000 --- a/e2e/test_slack_server.go +++ /dev/null @@ -1,84 +0,0 @@ -package e2e - -import ( - "encoding/json" - "fmt" - "net" - "net/http" - "net/http/httptest" - "strings" - - "go.uber.org/zap" - - "github.com/base-org/pessimism/internal/client" - "github.com/base-org/pessimism/internal/logging" -) - -// TestSlackServer ... Mock server for testing slack alerts -type TestSlackServer struct { - Server *httptest.Server - Payloads []*client.SlackPayload -} - -// NewTestSlackServer ... Creates a new mock slack server -func NewTestSlackServer(url string, port int) *TestSlackServer { //nolint:dupl //This will be addressed - l, err := net.Listen("tcp", fmt.Sprintf("%s:%d", url, port)) - if err != nil { - panic(err) - } - - ss := &TestSlackServer{ - Payloads: []*client.SlackPayload{}, - } - - ss.Server = httptest.NewUnstartedServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - switch strings.TrimSpace(r.URL.Path) { - case "/": - ss.mockSlackPost(w, r) - default: - http.NotFoundHandler().ServeHTTP(w, r) - } - })) - - err = ss.Server.Listener.Close() - if err != nil { - panic(err) - } - ss.Server.Listener = l - ss.Server.Start() - - logging.NoContext().Info("Test slack server started", zap.String("url", url), zap.Int("port", port)) - - return ss -} - -// Close ... Closes the server -func (svr *TestSlackServer) Close() { - svr.Server.Close() -} - -// mockSlackPost ... Mocks a slack post request -func (svr *TestSlackServer) mockSlackPost(w http.ResponseWriter, r *http.Request) { - var alert *client.SlackPayload - - if err := json.NewDecoder(r.Body).Decode(&alert); err != nil { - w.WriteHeader(http.StatusBadRequest) - _, _ = w.Write([]byte(`{"message":"", "error":"could not decode slack payload"}`)) - return - } - - svr.Payloads = append(svr.Payloads, alert) - - w.WriteHeader(http.StatusOK) - _, _ = w.Write([]byte(`{"message":"ok", "error":""}`)) -} - -// SlackAlerts ... Returns the slack alerts -func (svr *TestSlackServer) SlackAlerts() []*client.SlackPayload { - return svr.Payloads -} - -// ClearAlerts ... Clears the alerts -func (svr *TestSlackServer) ClearAlerts() { - svr.Payloads = []*client.SlackPayload{} -} diff --git a/go.mod b/go.mod index 4103f58a..fdf3edf9 100644 --- a/go.mod +++ b/go.mod @@ -1,28 +1,32 @@ module github.com/base-org/pessimism -go 1.19 +go 1.21 require ( - github.com/ethereum-optimism/optimism v1.0.8 - github.com/ethereum/go-ethereum v1.11.6 - github.com/go-chi/chi v1.5.4 + github.com/ethereum-optimism/optimism v1.1.6-rc.2.0.20231005231252-34f2657719c1 + github.com/ethereum/go-ethereum v1.13.1 + github.com/go-chi/chi v1.5.5 github.com/go-chi/render v1.0.3 github.com/golang/mock v1.6.0 - github.com/google/uuid v1.3.0 + github.com/google/uuid v1.3.1 github.com/joho/godotenv v1.5.1 github.com/olekukonko/tablewriter v0.0.5 - github.com/prometheus/client_golang v1.16.0 - github.com/stretchr/testify v1.8.3 - github.com/urfave/cli v1.22.9 - go.uber.org/zap v1.24.0 + github.com/prometheus/client_golang v1.17.0 + github.com/stretchr/testify v1.8.4 + github.com/urfave/cli v1.22.2 + go.uber.org/zap v1.25.0 + golang.org/x/text v0.13.0 + gopkg.in/yaml.v3 v3.0.1 ) require ( github.com/DataDog/zstd v1.5.2 // indirect + github.com/Microsoft/go-winio v0.6.1 // indirect github.com/VictoriaMetrics/fastcache v1.10.0 // indirect github.com/ajg/form v1.5.1 // indirect - github.com/benbjohnson/clock v1.3.0 // indirect + github.com/benbjohnson/clock v1.3.5 // indirect github.com/beorn7/perks v1.0.1 // indirect + github.com/bits-and-blooms/bitset v1.7.0 // indirect github.com/btcsuite/btcd v0.23.3 // indirect github.com/btcsuite/btcd/btcec/v2 v2.2.0 // indirect github.com/btcsuite/btcd/btcutil v1.1.0 // indirect @@ -31,22 +35,27 @@ require ( github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/cockroachdb/errors v1.9.1 // indirect github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b // indirect - github.com/cockroachdb/pebble v0.0.0-20230209160836-829675f94811 // indirect + github.com/cockroachdb/pebble v0.0.0-20230906160148-46873a6a7a06 // indirect github.com/cockroachdb/redact v1.1.3 // indirect + github.com/consensys/bavard v0.1.13 // indirect + github.com/consensys/gnark-crypto v0.12.0 // indirect github.com/containerd/cgroups v1.1.0 // indirect github.com/coreos/go-systemd/v22 v22.5.0 // indirect github.com/cpuguy83/go-md2man/v2 v2.0.2 // indirect + github.com/crate-crypto/go-kzg-4844 v0.3.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/davidlazar/go-crypto v0.0.0-20200604182044-b73af7476f6c // indirect github.com/deckarep/golang-set/v2 v2.1.0 // indirect - github.com/decred/dcrd/crypto/blake256 v1.0.0 // indirect - github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 // indirect + github.com/decred/dcrd/crypto/blake256 v1.0.1 // indirect + github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 // indirect github.com/deepmap/oapi-codegen v1.8.2 // indirect + github.com/dlclark/regexp2 v1.7.0 // indirect github.com/docker/go-units v0.5.0 // indirect - github.com/edsrzf/mmap-go v1.1.0 // indirect + github.com/dop251/goja v0.0.0-20230806174421-c933cf95e127 // indirect github.com/elastic/gosigar v0.14.2 // indirect - github.com/emirpasic/gods v1.18.1 // indirect github.com/ethereum-optimism/go-ethereum-hdwallet v0.1.3 // indirect + github.com/ethereum-optimism/superchain-registry/superchain v0.0.0-20231001123245-7b48d3818686 // indirect + github.com/ethereum/c-kzg-4844 v0.3.1 // indirect github.com/fjl/memsize v0.0.1 // indirect github.com/flynn/noise v1.0.0 // indirect github.com/francoispqt/gojay v1.2.13 // indirect @@ -54,128 +63,128 @@ require ( github.com/gballet/go-libpcsclite v0.0.0-20191108122812-4678299bea08 // indirect github.com/getsentry/sentry-go v0.18.0 // indirect github.com/go-ole/go-ole v1.2.6 // indirect + github.com/go-sourcemap/sourcemap v2.1.3+incompatible // indirect github.com/go-stack/stack v1.8.1 // indirect - github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0 // indirect + github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 // indirect github.com/godbus/dbus/v5 v5.1.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.4.2 // indirect github.com/golang/protobuf v1.5.3 // indirect github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect + github.com/google/go-cmp v0.5.9 // indirect github.com/google/gopacket v1.1.19 // indirect - github.com/google/pprof v0.0.0-20230509042627-b1315fad0c5a // indirect + github.com/google/pprof v0.0.0-20230817174616-7a8ec2ada47b // indirect github.com/gorilla/websocket v1.5.0 // indirect github.com/graph-gophers/graphql-go v1.3.0 // indirect github.com/hashicorp/errwrap v1.1.0 // indirect github.com/hashicorp/go-bexpr v0.1.11 // indirect github.com/hashicorp/go-multierror v1.1.1 // indirect - github.com/hashicorp/golang-lru v0.5.5-0.20210104140557-80c98217689d // indirect - github.com/hashicorp/golang-lru/v2 v2.0.1 // indirect + github.com/hashicorp/golang-lru/arc/v2 v2.0.5 // indirect + github.com/hashicorp/golang-lru/v2 v2.0.5 // indirect + github.com/holiman/billy v0.0.0-20230718173358-1c7e68d277a7 // indirect github.com/holiman/bloomfilter/v2 v2.0.3 // indirect - github.com/holiman/uint256 v1.2.2-0.20230321075855-87b91420868c // indirect - github.com/huin/goupnp v1.1.0 // indirect + github.com/holiman/uint256 v1.2.3 // indirect + github.com/huin/goupnp v1.3.0 // indirect github.com/influxdata/influxdb-client-go/v2 v2.4.0 // indirect github.com/influxdata/influxdb1-client v0.0.0-20220302092344-a9ab5670611c // indirect github.com/influxdata/line-protocol v0.0.0-20210311194329-9aa0e372d097 // indirect - github.com/ipfs/go-cid v0.3.2 // indirect + github.com/ipfs/go-cid v0.4.1 // indirect github.com/ipfs/go-datastore v0.6.0 // indirect - github.com/ipfs/go-log v1.0.5 // indirect github.com/ipfs/go-log/v2 v2.5.1 // indirect github.com/jackpal/go-nat-pmp v1.0.2 // indirect github.com/jbenet/go-temp-err-catcher v0.1.0 // indirect github.com/jbenet/goprocess v0.1.4 // indirect - github.com/klauspost/compress v1.15.15 // indirect - github.com/klauspost/cpuid/v2 v2.2.4 // indirect - github.com/koron/go-ssdp v0.0.3 // indirect + github.com/klauspost/compress v1.16.7 // indirect + github.com/klauspost/cpuid/v2 v2.2.5 // indirect + github.com/koron/go-ssdp v0.0.4 // indirect github.com/kr/pretty v0.3.1 // indirect github.com/kr/text v0.2.0 // indirect github.com/libp2p/go-buffer-pool v0.1.0 // indirect github.com/libp2p/go-cidranger v1.1.0 // indirect github.com/libp2p/go-flow-metrics v0.1.0 // indirect - github.com/libp2p/go-libp2p v0.25.1 // indirect - github.com/libp2p/go-libp2p-asn-util v0.2.0 // indirect - github.com/libp2p/go-libp2p-pubsub v0.9.0 // indirect + github.com/libp2p/go-libp2p v0.31.0 // indirect + github.com/libp2p/go-libp2p-asn-util v0.3.0 // indirect + github.com/libp2p/go-libp2p-mplex v0.9.0 // indirect + github.com/libp2p/go-libp2p-pubsub v0.9.3 // indirect github.com/libp2p/go-libp2p-testing v0.12.0 // indirect github.com/libp2p/go-mplex v0.7.0 // indirect github.com/libp2p/go-msgio v0.3.0 // indirect - github.com/libp2p/go-nat v0.1.0 // indirect + github.com/libp2p/go-nat v0.2.0 // indirect github.com/libp2p/go-netroute v0.2.1 // indirect - github.com/libp2p/go-reuseport v0.2.0 // indirect - github.com/libp2p/go-yamux/v4 v4.0.0 // indirect + github.com/libp2p/go-reuseport v0.4.0 // indirect + github.com/libp2p/go-yamux/v4 v4.0.1 // indirect github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd // indirect github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.19 // indirect github.com/mattn/go-runewidth v0.0.14 // indirect github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect - github.com/miekg/dns v1.1.50 // indirect + github.com/miekg/dns v1.1.55 // indirect github.com/mikioh/tcpinfo v0.0.0-20190314235526-30a79bb1804b // indirect github.com/mikioh/tcpopt v0.0.0-20190314235656-172688c1accc // indirect - github.com/minio/sha256-simd v1.0.0 // indirect + github.com/minio/sha256-simd v1.0.1 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect github.com/mitchellh/pointerstructure v1.2.1 // indirect + github.com/mmcloughlin/addchain v0.4.0 // indirect github.com/mr-tron/base58 v1.2.0 // indirect github.com/multiformats/go-base32 v0.1.0 // indirect github.com/multiformats/go-base36 v0.2.0 // indirect - github.com/multiformats/go-multiaddr v0.8.0 // indirect + github.com/multiformats/go-multiaddr v0.11.0 // indirect github.com/multiformats/go-multiaddr-dns v0.3.1 // indirect github.com/multiformats/go-multiaddr-fmt v0.1.0 // indirect - github.com/multiformats/go-multibase v0.1.1 // indirect - github.com/multiformats/go-multicodec v0.8.1 // indirect - github.com/multiformats/go-multihash v0.2.1 // indirect + github.com/multiformats/go-multibase v0.2.0 // indirect + github.com/multiformats/go-multicodec v0.9.0 // indirect + github.com/multiformats/go-multihash v0.2.3 // indirect github.com/multiformats/go-multistream v0.4.1 // indirect github.com/multiformats/go-varint v0.0.7 // indirect - github.com/onsi/ginkgo/v2 v2.8.1 // indirect - github.com/opencontainers/runtime-spec v1.0.2 // indirect + github.com/onsi/ginkgo/v2 v2.12.0 // indirect + github.com/onsi/gomega v1.28.0 // indirect + github.com/opencontainers/runtime-spec v1.1.0 // indirect github.com/opentracing/opentracing-go v1.2.0 // indirect github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58 // indirect github.com/peterh/liner v1.1.1-0.20190123174540-a2c9a5303de7 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/prometheus/client_model v0.3.0 // indirect - github.com/prometheus/common v0.42.0 // indirect - github.com/prometheus/procfs v0.10.1 // indirect + github.com/prometheus/client_model v0.4.1-0.20230718164431-9a2bf3000d16 // indirect + github.com/prometheus/common v0.44.0 // indirect + github.com/prometheus/procfs v0.11.1 // indirect github.com/quic-go/qpack v0.4.0 // indirect - github.com/quic-go/qtls-go1-18 v0.2.0 // indirect - github.com/quic-go/qtls-go1-19 v0.2.0 // indirect - github.com/quic-go/qtls-go1-20 v0.1.0 // indirect - github.com/quic-go/quic-go v0.32.0 // indirect - github.com/quic-go/webtransport-go v0.5.1 // indirect + github.com/quic-go/qtls-go1-20 v0.3.3 // indirect + github.com/quic-go/quic-go v0.38.1 // indirect + github.com/quic-go/webtransport-go v0.5.3 // indirect github.com/raulk/go-watchdog v1.3.0 // indirect github.com/rivo/uniseg v0.4.3 // indirect - github.com/rogpeppe/go-internal v1.9.0 // indirect - github.com/rs/cors v1.8.2 // indirect + github.com/rogpeppe/go-internal v1.10.0 // indirect + github.com/rs/cors v1.9.0 // indirect github.com/russross/blackfriday/v2 v2.1.0 // indirect github.com/shirou/gopsutil v3.21.11+incompatible // indirect github.com/spaolacci/murmur3 v1.1.0 // indirect github.com/status-im/keycard-go v0.2.0 // 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.10 // indirect - github.com/tklauser/numcpus v0.5.0 // indirect + github.com/tklauser/go-sysconf v0.3.12 // indirect + github.com/tklauser/numcpus v0.6.1 // indirect github.com/tyler-smith/go-bip39 v1.1.0 // indirect - github.com/urfave/cli/v2 v2.17.2-0.20221006022127-8f469abc00aa // indirect + github.com/urfave/cli/v2 v2.25.7 // indirect github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 // indirect github.com/yusufpapurcu/wmi v1.2.2 // indirect - go.uber.org/atomic v1.10.0 // indirect - go.uber.org/dig v1.16.1 // indirect - go.uber.org/fx v1.19.1 // indirect - go.uber.org/multierr v1.9.0 // indirect - golang.org/x/crypto v0.9.0 // indirect - golang.org/x/exp v0.0.0-20230213192124-5e25df0256eb // indirect - golang.org/x/mod v0.9.0 // indirect - golang.org/x/net v0.10.0 // indirect - golang.org/x/sync v0.2.0 // indirect - golang.org/x/sys v0.8.0 // indirect - golang.org/x/term v0.8.0 // indirect - golang.org/x/text v0.9.0 // indirect + go.uber.org/dig v1.17.0 // indirect + go.uber.org/fx v1.20.0 // indirect + go.uber.org/multierr v1.11.0 // indirect + golang.org/x/crypto v0.13.0 // indirect + golang.org/x/exp v0.0.0-20230905200255-921286631fa9 // indirect + golang.org/x/mod v0.12.0 // indirect + golang.org/x/net v0.15.0 // indirect + golang.org/x/sync v0.3.0 // indirect + golang.org/x/sys v0.12.0 // indirect + golang.org/x/term v0.12.0 // indirect golang.org/x/time v0.3.0 // indirect - golang.org/x/tools v0.7.0 // indirect - google.golang.org/protobuf v1.30.0 // indirect + golang.org/x/tools v0.13.0 // indirect + google.golang.org/protobuf v1.31.0 // indirect gopkg.in/natefinch/lumberjack.v2 v2.0.0 // indirect - gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce // indirect gopkg.in/yaml.v2 v2.4.0 // indirect - gopkg.in/yaml.v3 v3.0.1 // indirect - lukechampine.com/blake3 v1.1.7 // indirect - nhooyr.io/websocket v1.8.7 // indirect + lukechampine.com/blake3 v1.2.1 // indirect + rsc.io/tmplfunc v0.0.3 // indirect ) -replace github.com/ethereum/go-ethereum v1.11.6 => github.com/ethereum-optimism/op-geth v1.101105.2-0.20230502202351-9cc072e922f6 +replace github.com/ethereum/go-ethereum v1.13.1 => github.com/ethereum-optimism/op-geth v1.101301.0-rc.2.0.20231002141926-1e6910b91798 diff --git a/go.sum b/go.sum index 040af938..d4197873 100644 --- a/go.sum +++ b/go.sum @@ -9,14 +9,17 @@ dmitri.shuralyov.com/state v0.0.0-20180228185332-28bcc343414c/go.mod h1:0PRwlb0D git.apache.org/thrift.git v0.0.0-20180902110319-2566ecd5d999/go.mod h1:fPE2ZNJGynbRyZ4dJvy6G277gSllfV2HJqblrnkyeyg= github.com/AndreasBriese/bbloom v0.0.0-20190306092124-e2d15f34fcf9/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= github.com/AndreasBriese/bbloom v0.0.0-20190825152654-46b345b51c96 h1:cTp8I5+VIoKjsnZuH8vjyaysT/ses3EvZeaV/1UkF2M= +github.com/AndreasBriese/bbloom v0.0.0-20190825152654-46b345b51c96/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/toml v1.2.0 h1:Rt8g24XnyGTyglgET/PRUNlrUeu9F5L+7FilkXfZgs0= +github.com/BurntSushi/toml v1.3.2 h1:o7IhLm0Msx3BaB+n3Ag7L8EVlByGnpq14C4YWiu/gL8= +github.com/BurntSushi/toml v1.3.2/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= github.com/CloudyKit/fastprinter v0.0.0-20200109182630-33d98a066a53/go.mod h1:+3IMCy2vIlbG1XG/0ggNQv0SvxCAIpPM5b1nCz56Xno= github.com/CloudyKit/jet/v3 v3.0.0/go.mod h1:HKQPgSJmdK8hdoAbKUUWajkHyHo4RaU5rMdUywE7VMo= github.com/DataDog/zstd v1.5.2 h1:vUG4lAyuPCXO0TLbXvPv7EB7cNK1QV/luu55UHLrrn8= github.com/DataDog/zstd v1.5.2/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw= github.com/Joker/hpp v1.0.0/go.mod h1:8x5n+M1Hp5hC0g8okX3sR3vFQwynaX/UgSOM9MeBKzY= -github.com/Microsoft/go-winio v0.6.0 h1:slsWYD/zyx7lCXoZVlvQrj0hPTM1HI4+v1sIda2yDvg= +github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= +github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= github.com/Shopify/goreferrer v0.0.0-20181106222321-ec9c9a553398/go.mod h1:a1uqRtAwp2Xwc6WNPJEufxJ7fx3npB4UV/JOLmbu5I0= github.com/VictoriaMetrics/fastcache v1.10.0 h1:5hDJnLsKLpnUEToub7ETuRu8RCkb40woBZAUiKonXzY= github.com/VictoriaMetrics/fastcache v1.10.0/go.mod h1:tjiYeEfYXCqacuvYw/7UoDIeJaNxq6132xHICNP77w8= @@ -25,15 +28,19 @@ github.com/ajg/form v1.5.1 h1:t9c7v8JUKu/XxOGBU0yjNpaMloxGEJhUkqFRq0ibGeU= github.com/ajg/form v1.5.1/go.mod h1:uL1WgH+h2mgNtvBq0339dVnzXdBETtL2LeUXaIv25UY= 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/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= github.com/aymerick/raymond v2.0.3-0.20180322193309-b565731e1464+incompatible/go.mod h1:osfaiScAUVup+UC9Nfq76eWqDhXlp+4UYaA8uhTBO6g= github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= -github.com/benbjohnson/clock v1.3.0 h1:ip6w0uFQkncKQ979AypyG0ER7mqUSBdKLOgAle/AT8A= github.com/benbjohnson/clock v1.3.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= +github.com/benbjohnson/clock v1.3.5 h1:VvXlSJBzZpA/zum6Sj74hxwYI2DIxRWuNIoXAzHZz5o= +github.com/benbjohnson/clock v1.3.5/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= 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.7.0 h1:YjAGVd3XmtK9ktAbX8Zg2g2PwLIMjGREZJHlV4j7NEo= +github.com/bits-and-blooms/bitset v1.7.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA= github.com/bradfitz/go-smtpd v0.0.0-20170404230938-deb6d6237625/go.mod h1:HYsPBTaaSFSlLx/70C2HPIMNZpVV8+vt/A+FMnYP11g= github.com/btcsuite/btcd v0.20.1-beta/go.mod h1:wVuoA8VJLEcwgqHBwHmzLRazpKxTv13Px/pDuV7OomQ= github.com/btcsuite/btcd v0.22.0-beta.0.20220111032746-97732e52810c/go.mod h1:tjmYdS6MLJ5/s0Fj4DbLgSbDHbEqLJrtnHecBFkdz5M= @@ -60,28 +67,38 @@ github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46f github.com/buger/jsonparser v0.0.0-20181115193947-bf1c66bbce23/go.mod h1:bbYlZJ7hK1yFx9hf58LP0zeX7UjIGs20ufpu3evjr+s= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/cp v0.1.0 h1:SE+dxFebS7Iik5LK0tsi1k9ZCxEaFX4AjQmoyA+1dJk= +github.com/cespare/cp v0.1.0/go.mod h1:SOGHArjBr4JWaSDEVpWpo/hNg6RoKrls6Oh40hiwW+s= github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= +github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= +github.com/chzyer/logex v1.2.0/go.mod h1:9+9sk7u7pGNWYMkh0hdiL++6OeibzJccyQU4p4MedaY= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= +github.com/chzyer/readline v1.5.0/go.mod h1:x22KAscuvRqlLoK9CsoYsmxoXZMMFVyOl86cAH8qUic= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +github.com/chzyer/test v0.0.0-20210722231415-061457976a23/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/cilium/ebpf v0.2.0/go.mod h1:To2CFviqOWL/M0gIMsvSMlqe7em/l1ALkX1PyjrX2Qs= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cockroachdb/datadriven v1.0.2 h1:H9MtNqVoVhvd9nCBwOyDjUEdZCREqbIdCJD93PBm/jA= github.com/cockroachdb/datadriven v1.0.2/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= +github.com/cockroachdb/datadriven v1.0.3-0.20230801171734-e384cf455877 h1:1MLK4YpFtIEo3ZtMA5C795Wtv5VuUnrXX7mQG+aHg6o= +github.com/cockroachdb/datadriven v1.0.3-0.20230801171734-e384cf455877/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= github.com/cockroachdb/errors v1.9.1 h1:yFVvsI0VxmRShfawbt/laCIDy/mtTqqnvoNgiy5bEV8= github.com/cockroachdb/errors v1.9.1/go.mod h1:2sxOtL2WIc096WSZqZ5h8fa17rdDq9HZOZLBCor4mBk= github.com/cockroachdb/logtags v0.0.0-20211118104740-dabe8e521a4f/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= 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 v0.0.0-20230209160836-829675f94811 h1:ytcWPaNPhNoGMWEhDvS3zToKcDpRsLuRolQJBVGdozk= -github.com/cockroachdb/pebble v0.0.0-20230209160836-829675f94811/go.mod h1:Nb5lgvnQ2+oGlE/EyZy4+2/CxRh9KfvCXnag1vtpxVM= +github.com/cockroachdb/pebble v0.0.0-20230906160148-46873a6a7a06 h1:T+Np/xtzIjYM/P5NAw0e2Rf1FGvzDau1h54MKvx8G7w= +github.com/cockroachdb/pebble v0.0.0-20230906160148-46873a6a7a06/go.mod h1:bynZ3gvVyhlvjLI7PT6dmZ7g76xzJ7HpxfjgkzCGz6s= github.com/cockroachdb/redact v1.1.3 h1:AKZds10rFSIj7qADf0g46UixK8NNLwWTNdCIGS5wfSQ= github.com/cockroachdb/redact v1.1.3/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= github.com/codegangsta/inject v0.0.0-20150114235600-33e0aa1cb7c0/go.mod h1:4Zcjuz89kmFXt9morQgcfYZAYZ5n8WHjt81YYWIwtTM= +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.0 h1:1OnSpOykNkUIBIBJKdhwy2p0JlW5o+Az02ICzZmvvdg= +github.com/consensys/gnark-crypto v0.12.0/go.mod h1:v2Gy7L/4ZRosZ7Ivs+9SfUDr0f5UlG+EM5t7MPHiLuY= github.com/containerd/cgroups v0.0.0-20201119153540-4cbc285b3327/go.mod h1:ZJeTFisyysqgcCdecO57Dj79RfL0LNeGiFUqLYQRYLE= github.com/containerd/cgroups v1.1.0 h1:v8rEWFl6EoqHB+swVNjVoCJE8o3jX7e8nqBGPLaDFBM= github.com/containerd/cgroups v1.1.0/go.mod h1:6ppBcbh/NOOUU+dMKrykgaBnK9lCIBxHqJDGwsa1mIw= @@ -97,6 +114,8 @@ github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:ma github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= 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-kzg-4844 v0.3.0 h1:UBlWE0CgyFqqzTI+IFyCzA7A3Zw4iip6uzRv5NIXG0A= +github.com/crate-crypto/go-kzg-4844 v0.3.0/go.mod h1:SBP7ikXEgDnUPONgm33HtuDZEDtWa3L4QtN1ocJSEQ4= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/cyberdelia/templates v0.0.0-20141128023046-ca7fffd4298c/go.mod h1:GyV+0YP4qX0UQ7r2MoYZ+AvYDp12OF5yg4q8rGnyNh4= github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -107,36 +126,42 @@ github.com/davidlazar/go-crypto v0.0.0-20200604182044-b73af7476f6c h1:pFUpOrbxDR github.com/davidlazar/go-crypto v0.0.0-20200604182044-b73af7476f6c/go.mod h1:6UhI8N9EjYm1c2odKpFpAYeR8dsBeM7PtzQhRgxRr9U= github.com/deckarep/golang-set/v2 v2.1.0 h1:g47V4Or+DUdzbs8FxCCmgb6VYd+ptPAngjM6dtGktsI= github.com/deckarep/golang-set/v2 v2.1.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/crypto/blake256 v1.0.1 h1:7PltbUIQB7u/FfZ39+DGa/ShuMyJ5ilcvdfma9wOH6Y= +github.com/decred/dcrd/crypto/blake256 v1.0.1/go.mod h1:2OfgNZ5wDpcsFmHmCK5gZTPcCXqlm2ArzUIkw9czNJo= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1/go.mod h1:hyedUtir6IdtD/7lIxGeCxkaw7y45JueMRL4DIyJDKs= -github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 h1:HbphB4TFFXpv7MNrT52FGrrgVXF1owhMVTHFZIlnvd4= -github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0/go.mod h1:DZGJHZMqrU4JJqFAWUS2UO1+lbSKsdiOoYi9Zzey7Fc= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 h1:8UrgZ3GkP4i/CLijOJx79Yu+etlyjdBU4sfcs2WYQMs= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0/go.mod h1:v57UDF4pDQJcEfFUCRop3lJL149eHGSe9Jvczhzjo/0= github.com/decred/dcrd/lru v1.0.0/go.mod h1:mxKOwFd7lFjN2GZYsiz/ecgqR6kkYAl+0pz0tEMk218= github.com/deepmap/oapi-codegen v1.6.0/go.mod h1:ryDa9AgbELGeB+YEXE1dR53yAjHwFvE9iAUlWl9Al3M= github.com/deepmap/oapi-codegen v1.8.2 h1:SegyeYGcdi0jLLrpbCMoJxnUUn8GBXHsvr4rbzjuhfU= github.com/deepmap/oapi-codegen v1.8.2/go.mod h1:YLgSKSDv/bZQB7N4ws6luhozi3cEdRktEqrX88CvjIw= github.com/dgraph-io/badger v1.6.0/go.mod h1:zwt7syl517jmP8s94KqSxTlM6IMsdhYy6psNgSztDR4= github.com/dgraph-io/badger v1.6.2 h1:mNw0qs90GVgGGWylh0umH5iag1j6n/PeJtNvL6KY/x8= +github.com/dgraph-io/badger v1.6.2/go.mod h1:JW2yswe3V058sS0kZ2h/AXeDSqFjxnZcRrVH//y2UQE= github.com/dgraph-io/ristretto v0.0.2 h1:a5WaUrDa0qm0YrAAS1tUykT5El3kt62KNZZeMxQn3po= +github.com/dgraph-io/ristretto v0.0.2/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70dGTu2u+Ahh6E= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= -github.com/docker/distribution v2.8.2+incompatible h1:T3de5rq0dB1j30rp0sA2rER+m322EBzniBPB6ZIzuh8= -github.com/docker/docker v20.10.24+incompatible h1:Ugvxm7a8+Gz6vqQYQQ2W7GYq5EUPaAiuPgIfVyI3dYE= -github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= +github.com/dlclark/regexp2 v1.4.1-0.20201116162257-a2a8dda75c91/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc= +github.com/dlclark/regexp2 v1.7.0 h1:7lJfhqlPssTb1WQx4yvTHN0uElPEv52sbaECrAQxjAo= +github.com/dlclark/regexp2 v1.7.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8= +github.com/docker/docker v24.0.5+incompatible h1:WmgcE4fxyI6EEXxBRxsHnZXrO1pQ3smi0k/jho4HLeY= +github.com/docker/docker v24.0.5+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= +github.com/dop251/goja v0.0.0-20211022113120-dc8c55024d06/go.mod h1:R9ET47fwRVRPZnOGvHxxhuZcbrMCuiqOz3Rlrh4KSnk= +github.com/dop251/goja v0.0.0-20230806174421-c933cf95e127 h1:qwcF+vdFrvPSEUDSX5RVoRccG8a5DhOdWdQ4zN62zzo= +github.com/dop251/goja v0.0.0-20230806174421-c933cf95e127/go.mod h1:QMWlm50DNe14hD7t24KEqZuUdC9sOTy8W6XbCU1mlw4= +github.com/dop251/goja_nodejs v0.0.0-20210225215109-d91c329300e7/go.mod h1:hn7BA7c8pLvoGndExHudxTDKZ84Pyvv+90pbBjbTz0Y= +github.com/dop251/goja_nodejs v0.0.0-20211022123610-8dd9abb0616d/go.mod h1:DngW8aVqWbuLRMHItjPUyqdj+HWPvnQe8V8y1nDpIbM= github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/edsrzf/mmap-go v1.1.0 h1:6EUwBLQ/Mcr1EYLE4Tn1VdW1A4ckqCQWZBw8Hr0kjpQ= -github.com/edsrzf/mmap-go v1.1.0/go.mod h1:19H/e8pUPLicwkyNgOykDXkJ9F0MHE+Z52B8EIth78Q= github.com/eknkc/amber v0.0.0-20171010120322-cdade1c07385/go.mod h1:0vRUJqYpeSZifjYj7uP3BG/gKcuzL9xWVV/Y+cK33KM= github.com/elastic/gosigar v0.12.0/go.mod h1:iXRIGg2tLnu7LBdpqzyQfGDEidKCfWcCMS0WKyPWoMs= github.com/elastic/gosigar v0.14.2 h1:Dg80n8cr90OZ7x+bAax/QjoW/XqTI11RmA79ZwIm9/4= github.com/elastic/gosigar v0.14.2/go.mod h1:iXRIGg2tLnu7LBdpqzyQfGDEidKCfWcCMS0WKyPWoMs= -github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc= -github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= @@ -144,10 +169,14 @@ github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7 github.com/etcd-io/bbolt v1.3.3/go.mod h1:ZF2nL25h33cCyBtcyWeZ2/I3HQOfTP+0PIEvHjkjCrw= github.com/ethereum-optimism/go-ethereum-hdwallet v0.1.3 h1:RWHKLhCrQThMfch+QJ1Z8veEq5ZO3DfIhZ7xgRP9WTc= github.com/ethereum-optimism/go-ethereum-hdwallet v0.1.3/go.mod h1:QziizLAiF0KqyLdNJYD7O5cpDlaFMNZzlxYNcWsJUxs= -github.com/ethereum-optimism/op-geth v1.101105.2-0.20230502202351-9cc072e922f6 h1:Fh9VBmDCwjVn8amx1Dfrx+hIh16C/FDkS17EN25MGO8= -github.com/ethereum-optimism/op-geth v1.101105.2-0.20230502202351-9cc072e922f6/go.mod h1:X9t7oeerFMU9/zMIjZKT/jbIca+O05QqtBTLjL+XVeA= -github.com/ethereum-optimism/optimism v1.0.8 h1:Rc4Vv+aQqSzpvvhAAFEL8sdXYDoBL79qbq36mX9XR6A= -github.com/ethereum-optimism/optimism v1.0.8/go.mod h1:23Z6n3F0MRFZBasn956SjuqpCcVzMVLee9y21/y83i4= +github.com/ethereum-optimism/op-geth v1.101301.0-rc.2.0.20231002141926-1e6910b91798 h1:WRaF/uniRnlxTVlMfFWPtMe9NefzZWg/8Fc93Nao76w= +github.com/ethereum-optimism/op-geth v1.101301.0-rc.2.0.20231002141926-1e6910b91798/go.mod h1:p02vxGt8jcF8pCwkUU5Oy56X8/JsM1Js+KC+fwihVgk= +github.com/ethereum-optimism/optimism v1.1.6-rc.2.0.20231005231252-34f2657719c1 h1:/FRey5JP1sgiZH6cRdkg17mbR6//Gm0PdwuNEuaQKMs= +github.com/ethereum-optimism/optimism v1.1.6-rc.2.0.20231005231252-34f2657719c1/go.mod h1:y1J1a0BkbJ5MTImx1Ayk2syTXZEoFucRAsBpdzbn0Qk= +github.com/ethereum-optimism/superchain-registry/superchain v0.0.0-20231001123245-7b48d3818686 h1:f57hd8G96c8ORWd4ameFpveSnHcb0hA2D1VatviwoDc= +github.com/ethereum-optimism/superchain-registry/superchain v0.0.0-20231001123245-7b48d3818686/go.mod h1:q0u2UbyOr1q/y94AgMOj/V8b1KO05ZwILTR/qKt7Auo= +github.com/ethereum/c-kzg-4844 v0.3.1 h1:sR65+68+WdnMKxseNWxSJuAv2tsUrihTpVBTfM/U5Zg= +github.com/ethereum/c-kzg-4844 v0.3.1/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= github.com/fasthttp-contrib/websocket v0.0.0-20160511215533-1f3b11f56072/go.mod h1:duJ4Jxv5lDcvg4QuQr0oowTf7dz4/CR8NtyCooz9HL8= github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= github.com/fjl/memsize v0.0.1 h1:+zhkb+dhUgx0/e+M8sF0QqiouvMQUiKR+QYvdxIOKcQ= @@ -172,44 +201,34 @@ github.com/getsentry/sentry-go v0.18.0 h1:MtBW5H9QgdcJabtZcuJG80BMOwaBpkRDZkxRkN github.com/getsentry/sentry-go v0.18.0/go.mod h1:Kgon4Mby+FJ7ZWHFUAZgVaIa8sxHtnRJRLTXZr51aKQ= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/gin-contrib/sse v0.0.0-20190301062529-5545eab6dad3/go.mod h1:VJ0WA2NBN22VlZ2dKZQPAPnyWw5XTlK1KymzLKsr59s= -github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= -github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= github.com/gin-gonic/gin v1.4.0/go.mod h1:OW2EZn3DO8Ln9oIKOvM++LBO+5UPHJJDH72/q/3rZdM= -github.com/gin-gonic/gin v1.6.3/go.mod h1:75u5sXoLsGZoRN5Sgbi1eraJ4GU3++wFwWzhwvtwp4M= -github.com/gin-gonic/gin v1.8.1 h1:4+fr/el88TOO3ewCmQr8cx/CtZ/umlIRIs5M4NTNjf8= github.com/gliderlabs/ssh v0.1.1/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= github.com/go-check/check v0.0.0-20180628173108-788fd7840127/go.mod h1:9ES+weclKsC9YodN5RgxqK/VD9HM9JsCSh7rNhMZE98= -github.com/go-chi/chi v1.5.4 h1:QHdzF2szwjqVV4wmByUnTcsbIg7UGaQ0tPF2t5GcAIs= -github.com/go-chi/chi v1.5.4/go.mod h1:uaf8YgoFazUOkPBG7fxPftUylNumIev9awIWOENIuEg= +github.com/go-chi/chi v1.5.5 h1:vOB/HbEMt9QqBqErz07QehcOKHaWFtuj87tTDVz2qXE= +github.com/go-chi/chi v1.5.5/go.mod h1:C9JqLr3tIYjDOZpzn+BCuxY8z8vmca43EeMgyZt7irw= github.com/go-chi/chi/v5 v5.0.0/go.mod h1:BBug9lr0cqtdAhsu6R4AAdvufI0/XBzAQSsUqJpoZOs= github.com/go-chi/render v1.0.3 h1:AsXqd2a1/INaIfUSKq3G5uA8weYx20FOsM7uSoCyyt4= github.com/go-chi/render v1.0.3/go.mod h1:/gr3hVkmYR0YlEy3LxCuVRFzEu9Ruok+gFqbIofjao0= github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= -github.com/go-logr/logr v1.2.3 h1:2DntVwHkVopvECVRSlL5PSo9eG+cAkDCuckLubN+rq0= +github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= +github.com/go-logr/logr v1.2.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ= +github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-martini/martini v0.0.0-20170121215854-22fa46961aab/go.mod h1:/P9AEU963A2AYjv4d1V5eVL1CQbEJq6aCNHDDjibzu8= github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= -github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= -github.com/go-playground/locales v0.14.0 h1:u50s323jtVGugKlcYeyzC0etD1HifMjqmJqb8WugfUU= -github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= -github.com/go-playground/universal-translator v0.18.0 h1:82dyy6p4OuJq4/CByFNOn/jYrnRPArHwAcmLoJZxyho= -github.com/go-playground/validator/v10 v10.2.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI= -github.com/go-playground/validator/v10 v10.11.1 h1:prmOlTVv+YjZjmRmNSF3VmspqJIxJWXmqUsHwfTRRkQ= +github.com/go-sourcemap/sourcemap v2.1.3+incompatible h1:W1iEw64niKVGogNgBN3ePyLFfuisuzeidWPMPWmECqU= +github.com/go-sourcemap/sourcemap v2.1.3+incompatible/go.mod h1:F8jJfvm2KbVjc5NqelyYJmf/v5J0dwNLS2mL4sNA1Jg= 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 h1:p104kn46Q8WdvHunIJ9dAyjPVtrBPhSr3KT2yUst43I= github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= -github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee h1:s+21KNqlpePfkah2I+gwHF8xmJWRjooY+5248k6m4A0= +github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= +github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls= github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo= -github.com/gobwas/pool v0.2.0 h1:QEmUOlnSjWtnpRGHF3SauEiOsy82Cup83Vf2LcMlnc8= github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= -github.com/gobwas/ws v1.0.2 h1:CoAavW/wd/kulfZmSIBt6p24n4j7tHgNVCjsfHVNUbo= github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM= -github.com/goccy/go-json v0.9.11 h1:/pAaQDLHEoCq/5FFmSKBswWmK6H0e8g4159Kc/X/nqk= github.com/godbus/dbus/v5 v5.0.3/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/godbus/dbus/v5 v5.1.0 h1:4KLkAxT3aOY8Li4FRJe/KvhoNFFxo0m6fNuFUO8QJUk= @@ -236,8 +255,6 @@ github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+Licev github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -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= @@ -263,22 +280,24 @@ github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.2/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.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= +github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-github v17.0.0+incompatible/go.mod h1:zLgOLi98H3fifZn+44m+umXrS52loVEgC2AApnigrVQ= github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.2.1-0.20220503160820-4a35382e8fc8 h1:Ep/joEub9YwcjRY6ND3+Y/w0ncE540RtGatVhtZL0/Q= -github.com/google/gopacket v1.1.17/go.mod h1:UdDNZ1OO62aGYVnPhxT1U6aI7ukYtA/kB8vaU0diBUM= +github.com/google/gofuzz v1.2.1-0.20220503160820-4a35382e8fc8/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gopacket v1.1.19 h1:ves8RnFZPGiFnTS0uPQStjwru6uO6h+nlr9j6fL7kF8= github.com/google/gopacket v1.1.19/go.mod h1:iJ8V8n6KS+z2U1A8pUwu8bW5SyEMkXJB8Yo/Vo+TKTo= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20230509042627-b1315fad0c5a h1:PEOGDI1kkyW37YqPWHLHc+D20D9+87Wt12TCcfTUo5Q= -github.com/google/pprof v0.0.0-20230509042627-b1315fad0c5a/go.mod h1:79YE0hCXdHag9sBkw2o+N/YnZtTkXi0UT9Nnixa5eYk= -github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/pprof v0.0.0-20230207041349-798e818bf904/go.mod h1:uglQLonpP8qtYCYyzA+8c/9qtqgA3qsXGYqCPKARAFg= +github.com/google/pprof v0.0.0-20230817174616-7a8ec2ada47b h1:h9U78+dx9a4BKdQkBBos92HalKpaGKHrp+3Uo6yTodo= +github.com/google/pprof v0.0.0-20230817174616-7a8ec2ada47b/go.mod h1:czg5+yv1E0ZGTi6S6vVK1mke0fV+FaUhNGcd6VRS9Ik= +github.com/google/subcommands v1.2.0/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -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/google/uuid v1.3.1 h1:KjJaJ9iWZ3jOFZIf1Lqf4laDRCasjl0BCmnEGxkdLb4= +github.com/google/uuid v1.3.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/gax-go v2.0.0+incompatible/go.mod h1:SFVmujtThgffbyetf+mdk2eWhX2bMyUtNHzFKcPA9HY= github.com/googleapis/gax-go/v2 v2.0.3/go.mod h1:LLvjysVCY1JZeum8Z6l8qUty8fiNwE08qbEPm1M08qg= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= @@ -298,22 +317,23 @@ github.com/hashicorp/go-bexpr v0.1.11/go.mod h1:f03lAo0duBlDIUMGCuad8oLcgejw4m7U github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= -github.com/hashicorp/golang-lru v0.5.5-0.20210104140557-80c98217689d h1:dg1dEPuWpEqDnvIw251EVy4zlP8gWbsGj4BsUKCRpYs= -github.com/hashicorp/golang-lru v0.5.5-0.20210104140557-80c98217689d/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= -github.com/hashicorp/golang-lru/v2 v2.0.1 h1:5pv5N1lT1fjLg2VQ5KWc7kmucp2x/kvFOnxuVTqZ6x4= -github.com/hashicorp/golang-lru/v2 v2.0.1/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= +github.com/hashicorp/golang-lru/arc/v2 v2.0.5 h1:l2zaLDubNhW4XO3LnliVj0GXO3+/CGNJAg1dcN2Fpfw= +github.com/hashicorp/golang-lru/arc/v2 v2.0.5/go.mod h1:ny6zBSQZi2JxIeYcv7kt2sH2PXJtirBN7RDhRpxPkxU= +github.com/hashicorp/golang-lru/v2 v2.0.5 h1:wW7h1TG88eUIJ2i69gaE3uNVtEPIagzhGvHgwfx2Vm4= +github.com/hashicorp/golang-lru/v2 v2.0.5/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= +github.com/holiman/billy v0.0.0-20230718173358-1c7e68d277a7 h1:3JQNjnMRil1yD0IfZKHF9GxxWKDJGj8I0IqOUol//sw= +github.com/holiman/billy v0.0.0-20230718173358-1c7e68d277a7/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.2-0.20230321075855-87b91420868c h1:DZfsyhDK1hnSS5lH8l+JggqzEleHteTYfutAiVlSUM8= -github.com/holiman/uint256 v1.2.2-0.20230321075855-87b91420868c/go.mod h1:SC8Ryt4n+UBbPbIBKaG9zbbDlp4jOru9xFZmPzLUTxw= +github.com/holiman/uint256 v1.2.3 h1:K8UWO1HUJpRMXBxbmaY1Y8IAMZC/RsKB+ArEnnK4l5o= +github.com/holiman/uint256 v1.2.3/go.mod h1:SC8Ryt4n+UBbPbIBKaG9zbbDlp4jOru9xFZmPzLUTxw= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/huin/goupnp v1.0.0/go.mod h1:n9v9KO1tAxYH82qOn+UTIFQDmx5n1Zxd/ClZDMX7Bnc= -github.com/huin/goupnp v1.1.0 h1:gEe0Dp/lZmPZiDFzJJaOfUpOvv2MKUkoBX8lDrn9vKU= -github.com/huin/goupnp v1.1.0/go.mod h1:gnGPsThkYa7bFi/KWmEysQRf48l2dvR5bxr2OFckNX8= -github.com/huin/goutil v0.0.0-20170803182201-1ca381bf3150/go.mod h1:PpLOETDnJ0o3iZrZfqZzyLl6l7F3c6L1oWn7OICBi6o= +github.com/huin/goupnp v1.3.0 h1:UvLUlWDNpoUdYzb2TCn+MuTWtcjXKSza2n6CBdQ0xXc= +github.com/huin/goupnp v1.3.0/go.mod h1:gnGPsThkYa7bFi/KWmEysQRf48l2dvR5bxr2OFckNX8= github.com/hydrogen18/memlistener v0.0.0-20200120041712-dcc25e7acd91/go.mod h1:qEIFzExnS6016fRpRfxrExeVn2gbClQA99gQhnIcdhE= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/ianlancetaylor/demangle v0.0.0-20220319035150-800ac71e25c2/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w= github.com/imkira/go-interpol v1.1.0/go.mod h1:z0h2/2T3XF8kyEPpRgJ3kmNv+C43p+I/CoI+jC3w2iA= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/influxdata/influxdb-client-go/v2 v2.4.0 h1:HGBfZYStlx3Kqvsv1h2pJixbCl/jhnFtxpKFAv9Tu5k= @@ -323,17 +343,16 @@ github.com/influxdata/influxdb1-client v0.0.0-20220302092344-a9ab5670611c/go.mod github.com/influxdata/line-protocol v0.0.0-20200327222509-2487e7298839/go.mod h1:xaLFMmpvUxqXtVkUJfg9QmT88cDaCJ3ZKgdZ78oO8Qo= github.com/influxdata/line-protocol v0.0.0-20210311194329-9aa0e372d097 h1:vilfsDSy7TDxedi9gyBkMvAirat/oRcL0lFdJBf6tdM= github.com/influxdata/line-protocol v0.0.0-20210311194329-9aa0e372d097/go.mod h1:xaLFMmpvUxqXtVkUJfg9QmT88cDaCJ3ZKgdZ78oO8Qo= -github.com/ipfs/go-cid v0.3.2 h1:OGgOd+JCFM+y1DjWPmVH+2/4POtpDzwcr7VgnB7mZXc= -github.com/ipfs/go-cid v0.3.2/go.mod h1:gQ8pKqT/sUxGY+tIwy1RPpAojYu7jAyCp5Tz1svoupw= +github.com/ipfs/go-cid v0.4.1 h1:A/T3qGvxi4kpKWWcPC/PgbvDA2bjVLO7n4UeVwnbs/s= +github.com/ipfs/go-cid v0.4.1/go.mod h1:uQHwDeX4c6CtyrFwdqyhpNcxVewur1M7l7fNU7LKwZk= github.com/ipfs/go-datastore v0.6.0 h1:JKyz+Gvz1QEZw0LsX1IBn+JFCJQH4SJVFtM4uWU0Myk= github.com/ipfs/go-datastore v0.6.0/go.mod h1:rt5M3nNbSO/8q1t4LNkLyUwRs8HupMeN/8O4Vn9YAT8= github.com/ipfs/go-detect-race v0.0.1 h1:qX/xay2W3E4Q1U7d9lNs1sU9nvguX0a7319XbyQ6cOk= github.com/ipfs/go-detect-race v0.0.1/go.mod h1:8BNT7shDZPo99Q74BpGMK+4D8Mn4j46UU0LZ723meps= github.com/ipfs/go-ds-badger v0.3.0 h1:xREL3V0EH9S219kFFueOYJJTcjgNSZ2HY1iSvN7U1Ro= +github.com/ipfs/go-ds-badger v0.3.0/go.mod h1:1ke6mXNqeV8K3y5Ak2bAA0osoTfmxUdupVCGm4QUIek= github.com/ipfs/go-ds-leveldb v0.5.0 h1:s++MEBbD3ZKc9/8/njrn4flZLnCuY9I79v94gBUNumo= -github.com/ipfs/go-log v1.0.5 h1:2dOuUCB1Z7uoczMWgAyDck5JLb72zHzrMnGnCNNbvY8= -github.com/ipfs/go-log v1.0.5/go.mod h1:j0b8ZoR+7+R99LD9jZ6+AJsrzkPbSXbZfGakb5JPtIo= -github.com/ipfs/go-log/v2 v2.1.3/go.mod h1:/8d0SH3Su5Ooc31QlL1WysJhvyOTDCjcCZ9Axpmri6g= +github.com/ipfs/go-ds-leveldb v0.5.0/go.mod h1:d3XG9RUDzQ6V4SHi8+Xgj9j1XuEk1z82lquxrVbml/Q= github.com/ipfs/go-log/v2 v2.5.1 h1:1XdUzF7048prq4aBjDQQ4SL5RxftpRGdXhNRwKSAlcY= github.com/ipfs/go-log/v2 v2.5.1/go.mod h1:prSpmC1Gpllc9UYWxDiZDreBYw7zp4Iqp1kOLU9U5UI= github.com/iris-contrib/blackfriday v2.0.0+incompatible/go.mod h1:UzZ2bDEoaSGPbkg6SAB4att1aAwTmVIx/5gCVqeyUdI= @@ -356,10 +375,10 @@ github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwA github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/julienschmidt/httprouter v1.3.0 h1:U0609e9tgbseu3rBINet9P48AI/D3oJs4dN7jwJOQ1U= +github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88/go.mod h1:3w7q1U84EfirKl04SVQ/s7nPm1ZPhiXd34z40TNz36k= github.com/kataras/golog v0.0.10/go.mod h1:yJ8YKCmyL+nWjERB90Qwn+bdyBZsaQwU3bTVFgkFIp8= github.com/kataras/iris/v12 v12.1.8/go.mod h1:LMYy4VlP67TQ3Zgriz8RE2h2kMZV2SgMYbq3UhfoFmE= @@ -372,17 +391,13 @@ github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+o github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4= github.com/klauspost/compress v1.8.2/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= github.com/klauspost/compress v1.9.7/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= -github.com/klauspost/compress v1.10.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= -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/compress v1.16.7 h1:2mk3MPGNzKyxErAw8YaohYh69+pa4sIQSC0fPGCFR9I= +github.com/klauspost/compress v1.16.7/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= github.com/klauspost/cpuid v1.2.1/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= -github.com/klauspost/cpuid/v2 v2.0.4/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= -github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= -github.com/klauspost/cpuid/v2 v2.2.4 h1:acbojRNwl3o09bUq+yDCtZFc1aiwaAAxtcn8YkZXnvk= -github.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= -github.com/koron/go-ssdp v0.0.0-20191105050749-2e1c40ed0b5d/go.mod h1:5Ky9EC2xfoUKUor0Hjgi2BJhCSXJfMOFlmyYrVKGQMk= -github.com/koron/go-ssdp v0.0.3 h1:JivLMY45N76b4p/vsWGOKewBQu6uf39y8l+AQ7sDKx8= -github.com/koron/go-ssdp v0.0.3/go.mod h1:b2MxI6yh02pKrsyNoQUsk4+YNikaGhe4894J+Q5lDvA= +github.com/klauspost/cpuid/v2 v2.2.5 h1:0E5MSMDEoAulmXNFquVs//DdoomxaoTY1kUhbc/qbZg= +github.com/klauspost/cpuid/v2 v2.2.5/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= +github.com/koron/go-ssdp v0.0.4 h1:1IDwrghSKYM7yLf7XCzbByg2sJ/JcNOZRXS2jczTwz0= +github.com/koron/go-ssdp v0.0.4/go.mod h1:oDXq+E5IL5q0U8uSBcoAXzTzInwy5lEgC91HoKtbmZk= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= @@ -394,39 +409,40 @@ github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= 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/labstack/echo/v4 v4.2.1/go.mod h1:AA49e0DZ8kk5jTOOCKNuPR6oTnBS0dYiM4FW1e6jwpg= github.com/labstack/echo/v4 v4.5.0/go.mod h1:czIriw4a0C1dFun+ObrXp7ok03xON0N1awStJ6ArI7Y= github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= -github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= -github.com/leodido/go-urn v1.2.1 h1:BqpAaACuzVSgi/VLzGZIobT2z4v53pjosyNd9Yv6n/w= +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/libp2p/go-buffer-pool v0.1.0 h1:oK4mSFcQz7cTQIfqbe4MIj9gLW+mnanjyFtc6cdF0Y8= github.com/libp2p/go-buffer-pool v0.1.0/go.mod h1:N+vh8gMqimBzdKkSMVuydVDq+UV5QTWy5HSiZacSbPg= github.com/libp2p/go-cidranger v1.1.0 h1:ewPN8EZ0dd1LSnrtuwd4709PXVcITVeuwbag38yPW7c= github.com/libp2p/go-cidranger v1.1.0/go.mod h1:KWZTfSr+r9qEo9OkI9/SIEeAtw+NNoU0dXIXt15Okic= github.com/libp2p/go-flow-metrics v0.1.0 h1:0iPhMI8PskQwzh57jB9WxIuIOQ0r+15PChFGkx3Q3WM= github.com/libp2p/go-flow-metrics v0.1.0/go.mod h1:4Xi8MX8wj5aWNDAZttg6UPmc0ZrnFNsMtpsYUClFtro= -github.com/libp2p/go-libp2p v0.25.1 h1:YK+YDCHpYyTvitKWVxa5PfElgIpOONU01X5UcLEwJGA= -github.com/libp2p/go-libp2p v0.25.1/go.mod h1:xnK9/1d9+jeQCVvi/f1g12KqtVi/jP/SijtKV1hML3g= -github.com/libp2p/go-libp2p-asn-util v0.2.0 h1:rg3+Os8jbnO5DxkC7K/Utdi+DkY3q/d1/1q+8WeNAsw= -github.com/libp2p/go-libp2p-asn-util v0.2.0/go.mod h1:WoaWxbHKBymSN41hWSq/lGKJEca7TNm58+gGJi2WsLI= -github.com/libp2p/go-libp2p-pubsub v0.9.0 h1:mcLb4WzwhUG4OKb0rp1/bYMd/DYhvMyzJheQH3LMd1s= -github.com/libp2p/go-libp2p-pubsub v0.9.0/go.mod h1:OEsj0Cc/BpkqikXRTrVspWU/Hx7bMZwHP+6vNMd+c7I= +github.com/libp2p/go-libp2p v0.31.0 h1:LFShhP8F6xthWiBBq3euxbKjZsoRajVEyBS9snfHxYg= +github.com/libp2p/go-libp2p v0.31.0/go.mod h1:W/FEK1c/t04PbRH3fA9i5oucu5YcgrG0JVoBWT1B7Eg= +github.com/libp2p/go-libp2p-asn-util v0.3.0 h1:gMDcMyYiZKkocGXDQ5nsUQyquC9+H+iLEQHwOCZ7s8s= +github.com/libp2p/go-libp2p-asn-util v0.3.0/go.mod h1:B1mcOrKUE35Xq/ASTmQ4tN3LNzVVaMNmq2NACuqyB9w= +github.com/libp2p/go-libp2p-mplex v0.9.0 h1:R58pDRAmuBXkYugbSSXR9wrTX3+1pFM1xP2bLuodIq8= +github.com/libp2p/go-libp2p-mplex v0.9.0/go.mod h1:ro1i4kuwiFT+uMPbIDIFkcLs1KRbNp0QwnUXM+P64Og= +github.com/libp2p/go-libp2p-pubsub v0.9.3 h1:ihcz9oIBMaCK9kcx+yHWm3mLAFBMAUsM4ux42aikDxo= +github.com/libp2p/go-libp2p-pubsub v0.9.3/go.mod h1:RYA7aM9jIic5VV47WXu4GkcRxRhrdElWf8xtyli+Dzc= github.com/libp2p/go-libp2p-testing v0.12.0 h1:EPvBb4kKMWO29qP4mZGyhVzUyR25dvfUIK5WDu6iPUA= github.com/libp2p/go-libp2p-testing v0.12.0/go.mod h1:KcGDRXyN7sQCllucn1cOOS+Dmm7ujhfEyXQL5lvkcPg= github.com/libp2p/go-mplex v0.7.0 h1:BDhFZdlk5tbr0oyFq/xv/NPGfjbnrsDam1EvutpBDbY= github.com/libp2p/go-mplex v0.7.0/go.mod h1:rW8ThnRcYWft/Jb2jeORBmPd6xuG3dGxWN/W168L9EU= github.com/libp2p/go-msgio v0.3.0 h1:mf3Z8B1xcFN314sWX+2vOTShIE0Mmn2TXn3YCUQGNj0= github.com/libp2p/go-msgio v0.3.0/go.mod h1:nyRM819GmVaF9LX3l03RMh10QdOroF++NBbxAb0mmDM= -github.com/libp2p/go-nat v0.1.0 h1:MfVsH6DLcpa04Xr+p8hmVRG4juse0s3J8HyNWYHffXg= -github.com/libp2p/go-nat v0.1.0/go.mod h1:X7teVkwRHNInVNWQiO/tAiAVRwSr5zoRz4YSTC3uRBM= -github.com/libp2p/go-netroute v0.1.2/go.mod h1:jZLDV+1PE8y5XxBySEBgbuVAXbhtuHSdmLPL2n9MKbk= +github.com/libp2p/go-nat v0.2.0 h1:Tyz+bUFAYqGyJ/ppPPymMGbIgNRH+WqC5QrT5fKrrGk= +github.com/libp2p/go-nat v0.2.0/go.mod h1:3MJr+GRpRkyT65EpVPBstXLvOlAPzUVlG6Pwg9ohLJk= github.com/libp2p/go-netroute v0.2.1 h1:V8kVrpD8GK0Riv15/7VN6RbUQ3URNZVosw7H2v9tksU= github.com/libp2p/go-netroute v0.2.1/go.mod h1:hraioZr0fhBjG0ZRXJJ6Zj2IVEVNx6tDTFQfSmcq7mQ= -github.com/libp2p/go-reuseport v0.2.0 h1:18PRvIMlpY6ZK85nIAicSBuXXvrYoSw3dsBAR7zc560= -github.com/libp2p/go-reuseport v0.2.0/go.mod h1:bvVho6eLMm6Bz5hmU0LYN3ixd3nPPvtIlaURZZgOY4k= -github.com/libp2p/go-sockaddr v0.0.2/go.mod h1:syPvOmNs24S3dFVGJA1/mrqdeijPxLV2Le3BRLKd68k= -github.com/libp2p/go-yamux/v4 v4.0.0 h1:+Y80dV2Yx/kv7Y7JKu0LECyVdMXm1VUoko+VQ9rBfZQ= -github.com/libp2p/go-yamux/v4 v4.0.0/go.mod h1:NWjl8ZTLOGlozrXSOZ/HlfG++39iKNnM5wwmtQP1YB4= +github.com/libp2p/go-reuseport v0.4.0 h1:nR5KU7hD0WxXCJbmw7r2rhRYruNRl2koHw8fQscQm2s= +github.com/libp2p/go-reuseport v0.4.0/go.mod h1:ZtI03j/wO5hZVDFo2jKywN6bYKWLOy8Se6DrI2E1cLU= +github.com/libp2p/go-yamux/v4 v4.0.1 h1:FfDR4S1wj6Bw2Pqbc8Uz7pCxeRBPbwsBbEdfwiCypkQ= +github.com/libp2p/go-yamux/v4 v4.0.1/go.mod h1:NWjl8ZTLOGlozrXSOZ/HlfG++39iKNnM5wwmtQP1YB4= github.com/lunixbochs/vtclean v1.0.0/go.mod h1:pHhQNgMf3btfWnGBVipUOjRYhoOsdGqdm/+2c2E2WMI= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/mailru/easyjson v0.0.0-20190312143242-1de009706dbe/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= @@ -461,8 +477,8 @@ github.com/mediocregopher/radix/v3 v3.4.2/go.mod h1:8FL3F6UQRXHXIBSPUs5h0RybMF8i github.com/microcosm-cc/bluemonday v1.0.1/go.mod h1:hsXNsILzKxV+sX77C5b8FSuKF00vh2OMYv+xgHpAMF4= github.com/microcosm-cc/bluemonday v1.0.2/go.mod h1:iVP4YcDBq+n/5fb23BhYFvIMq/leAFZyRl6bYmGDlGc= github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI= -github.com/miekg/dns v1.1.50 h1:DQUfb9uc6smULcREF09Uc+/Gd46YWqJd5DbpPE9xkcA= -github.com/miekg/dns v1.1.50/go.mod h1:e3IlAVfNqAllflbibAZEWOXOQ+Ynzk/dDozDxY7XnME= +github.com/miekg/dns v1.1.55 h1:GoQ4hpsj0nFLYe+bWiCToyrBEJXkQfOOIvFGFy0lEgo= +github.com/miekg/dns v1.1.55/go.mod h1:uInx36IzPl7FYnDcMeVWxj9byh7DutNykX4G9Sj60FY= github.com/mikioh/tcp v0.0.0-20190314235350-803a9b46060c h1:bzE/A84HN25pxAuk9Eej1Kz9OUelF97nAc82bDquQI8= github.com/mikioh/tcp v0.0.0-20190314235350-803a9b46060c/go.mod h1:0SQS9kMwD2VsyFEB++InYyBJroV/FRmBgcydeSUcJms= github.com/mikioh/tcpinfo v0.0.0-20190314235526-30a79bb1804b h1:z78hV3sbSMAUoyUMM0I83AUIT6Hu17AWfgjzIbtrYFc= @@ -471,8 +487,8 @@ github.com/mikioh/tcpopt v0.0.0-20190314235656-172688c1accc h1:PTfri+PuQmWDqERdn github.com/mikioh/tcpopt v0.0.0-20190314235656-172688c1accc/go.mod h1:cGKTAVKx4SxOuR/czcZ/E2RSJ3sfHs8FpHhQ5CWMf9s= github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1/go.mod h1:pD8RvIylQ358TN4wwqatJ8rNavkEINozVn9DtGI3dfQ= github.com/minio/sha256-simd v0.1.1-0.20190913151208-6de447530771/go.mod h1:B5e1o+1/KgNmWrSQK08Y6Z1Vb5pwIktudl0J58iy0KM= -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/minio/sha256-simd v1.0.1 h1:6kaan5IFmwTNynnKKpDHe6FWHohJOHhCPchzK49dzMM= +github.com/minio/sha256-simd v1.0.1/go.mod h1:Pz6AKMiUdngCLpeTL/RJY1M9rUuPMYujV5xJjtbRSN8= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= @@ -480,12 +496,13 @@ github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyua github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/pointerstructure v1.2.1 h1:ZhBBeX8tSlRpu/FFhXH4RC4OJzFlqsQhoHZAz4x7TIw= github.com/mitchellh/pointerstructure v1.2.1/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/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/moul/http2curl v1.0.0/go.mod h1:8UbvGypXm98wA/IqH45anm5Y2Z6ep6O31QGOAZ3H0fQ= github.com/mr-tron/base58 v1.1.2/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= github.com/mr-tron/base58 v1.2.0 h1:T/HDJBh4ZCPbU39/+c3rRvE0uKBQlU27+QI8LJ4t64o= @@ -496,19 +513,19 @@ github.com/multiformats/go-base36 v0.2.0 h1:lFsAbNOGeKtuKozrtBsAkSVhv1p9D0/qedU9 github.com/multiformats/go-base36 v0.2.0/go.mod h1:qvnKE++v+2MWCfePClUEjE78Z7P2a1UV0xHgWc0hkp4= github.com/multiformats/go-multiaddr v0.1.1/go.mod h1:aMKBKNEYmzmDmxfX88/vz+J5IU55txyt0p4aiWVohjo= github.com/multiformats/go-multiaddr v0.2.0/go.mod h1:0nO36NvPpyV4QzvTLi/lafl2y95ncPj0vFwVF6k6wJ4= -github.com/multiformats/go-multiaddr v0.8.0 h1:aqjksEcqK+iD/Foe1RRFsGZh8+XFiGo7FgUCZlpv3LU= -github.com/multiformats/go-multiaddr v0.8.0/go.mod h1:Fs50eBDWvZu+l3/9S6xAE7ZYj6yhxlvaVZjakWN7xRs= +github.com/multiformats/go-multiaddr v0.11.0 h1:XqGyJ8ufbCE0HmTDwx2kPdsrQ36AGPZNZX6s6xfJH10= +github.com/multiformats/go-multiaddr v0.11.0/go.mod h1:gWUm0QLR4thQ6+ZF6SXUw8YjtwQSPapICM+NmCkxHSM= github.com/multiformats/go-multiaddr-dns v0.3.1 h1:QgQgR+LQVt3NPTjbrLLpsaT2ufAA2y0Mkk+QRVJbW3A= github.com/multiformats/go-multiaddr-dns v0.3.1/go.mod h1:G/245BRQ6FJGmryJCrOuTdB37AMA5AMOVuO6NY3JwTk= github.com/multiformats/go-multiaddr-fmt v0.1.0 h1:WLEFClPycPkp4fnIzoFoV9FVd49/eQsuaL3/CWe167E= github.com/multiformats/go-multiaddr-fmt v0.1.0/go.mod h1:hGtDIW4PU4BqJ50gW2quDuPVjyWNZxToGUh/HwTZYJo= -github.com/multiformats/go-multibase v0.1.1 h1:3ASCDsuLX8+j4kx58qnJ4YFq/JWTJpCyDW27ztsVTOI= -github.com/multiformats/go-multibase v0.1.1/go.mod h1:ZEjHE+IsUrgp5mhlEAYjMtZwK1k4haNkcaPg9aoe1a8= -github.com/multiformats/go-multicodec v0.8.1 h1:ycepHwavHafh3grIbR1jIXnKCsFm0fqsfEOsJ8NtKE8= -github.com/multiformats/go-multicodec v0.8.1/go.mod h1:L3QTQvMIaVBkXOXXtVmYE+LI16i14xuaojr/H7Ai54k= +github.com/multiformats/go-multibase v0.2.0 h1:isdYCVLvksgWlMW9OZRYJEa9pZETFivncJHmHnnd87g= +github.com/multiformats/go-multibase v0.2.0/go.mod h1:bFBZX4lKCA/2lyOFSAoKH5SS6oPyjtnzK/XTFDPkNuk= +github.com/multiformats/go-multicodec v0.9.0 h1:pb/dlPnzee/Sxv/j4PmkDRxCOi3hXTz3IbPKOXWJkmg= +github.com/multiformats/go-multicodec v0.9.0/go.mod h1:L3QTQvMIaVBkXOXXtVmYE+LI16i14xuaojr/H7Ai54k= github.com/multiformats/go-multihash v0.0.8/go.mod h1:YSLudS+Pi8NHE7o6tb3D8vrpKa63epEDmG8nTduyAew= -github.com/multiformats/go-multihash v0.2.1 h1:aem8ZT0VA2nCHHk7bPJ1BjUbHNciqZC/d16Vve9l108= -github.com/multiformats/go-multihash v0.2.1/go.mod h1:WxoMcYG85AZVQUyRyo9s4wULvW5qrI9vb2Lt6evduFc= +github.com/multiformats/go-multihash v0.2.3 h1:7Lyc8XfX/IY2jWb/gI7JP+o7JEq9hOa7BFvVU9RSh+U= +github.com/multiformats/go-multihash v0.2.3/go.mod h1:dXgKXCXjBzdscBLk9JkjINiEsCKRVch90MdaGiKsvSM= github.com/multiformats/go-multistream v0.4.1 h1:rFy0Iiyn3YT0asivDUIR05leAdwZq3de4741sbiSdfo= github.com/multiformats/go-multistream v0.4.1/go.mod h1:Mz5eykRVAjJWckE2U78c6xqdtyNUEhKSM0Lwar2p77Q= github.com/multiformats/go-varint v0.0.1/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE= @@ -534,28 +551,26 @@ github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vv 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/ginkgo/v2 v2.8.1 h1:xFTEVwOFa1D/Ty24Ws1npBWkDYEV9BqZrsDxVrVkrrU= -github.com/onsi/ginkgo/v2 v2.8.1/go.mod h1:N1/NbDngAFcSLdyZ+/aYTYGSlq9qMCS/cNKGJjy+csc= +github.com/onsi/ginkgo/v2 v2.12.0 h1:UIVDowFPwpg6yMUpPjGkYvf06K3RAiJXUhCxEwQVHRI= +github.com/onsi/ginkgo/v2 v2.12.0/go.mod h1:ZNEzXISYlqpb8S36iN71ifqLi3vVD1rVJGvWRCJOUpQ= github.com/onsi/gomega v1.4.1/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= 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/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro= -github.com/onsi/gomega v1.26.0 h1:03cDLK28U6hWvCAns6NeydX3zIm4SF3ci69ulidS32Q= -github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= -github.com/opencontainers/image-spec v1.0.2 h1:9yCKha/T5XdGtO0q9Q9a6T5NUCsTn/DrBg0D7ufOcFM= -github.com/opencontainers/runtime-spec v1.0.2 h1:UfAcuLBJB9Coz72x1hgl8O5RVzTdNiaglX6v2DM6FI0= +github.com/onsi/gomega v1.28.0 h1:i2rg/p9n/UqIDAMFUJ6qIUUMcsqOuUHgbpbu235Vr1c= +github.com/onsi/gomega v1.28.0/go.mod h1:A1H2JE76sI14WIP57LMKj7FVfCHx3g3BcZVjJG8bjX8= github.com/opencontainers/runtime-spec v1.0.2/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/runtime-spec v1.1.0 h1:HHUyrt9mwHUjtasSbXSMvs4cyFxh+Bll4AjJ9odEGpg= +github.com/opencontainers/runtime-spec v1.1.0/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/opentracing/opentracing-go v1.2.0 h1:uEJPy/1a5RIPAJ0Ov+OIO8OxWu77jEv+1B0VhjKrZUs= github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= github.com/openzipkin/zipkin-go v0.1.1/go.mod h1:NtoC/o8u3JlF1lSlyPNswIbeQH9bJTmOf0Erfk+hxe8= github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58 h1:onHthvaw9LFnH4t2DcNVpwGmV9E1BkGknEliJkfwQj0= github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58/go.mod h1:DXv8WO4yhMYhSNPKjeNKa5WY9YCIEBRbNzFFPJbWO6Y= -github.com/pelletier/go-toml v1.2.0 h1:T5zMGML61Wp+FlcbWjRDT7yAxhJNAiPPLOFECq181zc= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= -github.com/pelletier/go-toml/v2 v2.0.5 h1:ipoSadvV8oGUjnUbMub59IDPPwfxF694nG/jwbMiyQg= github.com/peterh/liner v1.1.1-0.20190123174540-a2c9a5303de7 h1:oYW+YCJ1pachXTQmzR3rNLYGGz4g/UgFcjb28p/viDM= github.com/peterh/liner v1.1.1-0.20190123174540-a2c9a5303de7/go.mod h1:CRroGNssyjTd/qIG2FyxByd2S8JEAZXBl4qUrZf8GS0= github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4= @@ -567,42 +582,38 @@ github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINE 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 v0.8.0/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v1.16.0 h1:yk/hx9hDbrGHovbci4BY+pRMfSuuat626eFsHb7tmT8= -github.com/prometheus/client_golang v1.16.0/go.mod h1:Zsulrv/L9oM40tJ7T815tM89lFEugiJ9HzIqaAx4LKc= +github.com/prometheus/client_golang v1.17.0 h1:rl2sfwZMtSthVU752MqfjQozy7blglC+1SOtjMAMh+Q= +github.com/prometheus/client_golang v1.17.0/go.mod h1:VeL+gMmOAxkS2IqfCq0ZmHSL+LjWfWDUmp1mBz9JgUY= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -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/client_model v0.4.1-0.20230718164431-9a2bf3000d16 h1:v7DLqVdK4VrYkVD5diGdl4sxJurKJEMnODWRJlxV9oM= +github.com/prometheus/client_model v0.4.1-0.20230718164431-9a2bf3000d16/go.mod h1:oMQmHW1/JoDwqLtg57MGgP/Fb1CJEYF2imWWhWtMkYU= github.com/prometheus/common v0.0.0-20180801064454-c7de2306084e/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= -github.com/prometheus/common v0.42.0 h1:EKsfXEYo4JpWMHH5cg+KOUWeuJSov1Id8zGR8eeI1YM= -github.com/prometheus/common v0.42.0/go.mod h1:xBwqVerjNdUDjgODMpudtOMwlOwf2SaTr1yjz4b7Zbc= +github.com/prometheus/common v0.44.0 h1:+5BrQJwiBB9xsMygAB3TNvpQKOwlkc25LbISbrdOOfY= +github.com/prometheus/common v0.44.0/go.mod h1:ofAIvZbQ1e/nugmZGz4/qCb9Ap1VoSTIO7x0VV9VvuY= github.com/prometheus/procfs v0.0.0-20180725123919-05ee40e3a273/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.10.1 h1:kYK1Va/YMlutzCGazswoHKo//tZVlFpKYh+PymziUAg= -github.com/prometheus/procfs v0.10.1/go.mod h1:nwNm2aOCAYw8uTR/9bWRREkZFxAUcWzPHWJq+XBB/FM= +github.com/prometheus/procfs v0.11.1 h1:xRC8Iq1yyca5ypa9n1EZnWZkt7dwcoRPQwX/5gwaUuI= +github.com/prometheus/procfs v0.11.1/go.mod h1:eesXgaPo1q7lBpVMoMy0ZOFTth9hBn4W/y0/p/ScXhY= github.com/quic-go/qpack v0.4.0 h1:Cr9BXA1sQS2SmDUWjSofMPNKmvF6IiIfDRmgU0w1ZCo= github.com/quic-go/qpack v0.4.0/go.mod h1:UZVnYIfi5GRk+zI9UMaCPsmZ2xKJP7XBUvVyT1Knj9A= -github.com/quic-go/qtls-go1-18 v0.2.0 h1:5ViXqBZ90wpUcZS0ge79rf029yx0dYB0McyPJwqqj7U= -github.com/quic-go/qtls-go1-18 v0.2.0/go.mod h1:moGulGHK7o6O8lSPSZNoOwcLvJKJ85vVNc7oJFD65bc= -github.com/quic-go/qtls-go1-19 v0.2.0 h1:Cvn2WdhyViFUHoOqK52i51k4nDX8EwIh5VJiVM4nttk= -github.com/quic-go/qtls-go1-19 v0.2.0/go.mod h1:ySOI96ew8lnoKPtSqx2BlI5wCpUVPT05RMAlajtnyOI= -github.com/quic-go/qtls-go1-20 v0.1.0 h1:d1PK3ErFy9t7zxKsG3NXBJXZjp/kMLoIb3y/kV54oAI= -github.com/quic-go/qtls-go1-20 v0.1.0/go.mod h1:JKtK6mjbAVcUTN/9jZpvLbGxvdWIKS8uT7EiStoU1SM= -github.com/quic-go/quic-go v0.32.0 h1:lY02md31s1JgPiiyfqJijpu/UX/Iun304FI3yUqX7tA= -github.com/quic-go/quic-go v0.32.0/go.mod h1:/fCsKANhQIeD5l76c2JFU+07gVE3KaA0FP+0zMWwfwo= -github.com/quic-go/webtransport-go v0.5.1 h1:1eVb7WDWCRoaeTtFHpFBJ6WDN1bSrPrRoW6tZgSw0Ow= -github.com/quic-go/webtransport-go v0.5.1/go.mod h1:OhmmgJIzTTqXK5xvtuX0oBpLV2GkLWNDA+UeTGJXErU= +github.com/quic-go/qtls-go1-20 v0.3.3 h1:17/glZSLI9P9fDAeyCHBFSWSqJcwx1byhLwP5eUIDCM= +github.com/quic-go/qtls-go1-20 v0.3.3/go.mod h1:X9Nh97ZL80Z+bX/gUXMbipO6OxdiDi58b/fMC9mAL+k= +github.com/quic-go/quic-go v0.38.1 h1:M36YWA5dEhEeT+slOu/SwMEucbYd0YFidxG3KlGPZaE= +github.com/quic-go/quic-go v0.38.1/go.mod h1:ijnZM7JsFIkp4cRyjxJNIzdSfCLmUMg9wdyhGmg+SN4= +github.com/quic-go/webtransport-go v0.5.3 h1:5XMlzemqB4qmOlgIus5zB45AcZ2kCgCy2EptUrfOPWU= +github.com/quic-go/webtransport-go v0.5.3/go.mod h1:OhmmgJIzTTqXK5xvtuX0oBpLV2GkLWNDA+UeTGJXErU= github.com/raulk/go-watchdog v1.3.0 h1:oUmdlHxdkXRJlwfG0O9omj8ukerm8MEQavSiDTEtBsk= github.com/raulk/go-watchdog v1.3.0/go.mod h1:fIvOnLbF0b0ZwkB9YU4mOW9Did//4vPZtDqv66NfsMU= 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.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= github.com/rogpeppe/go-internal v1.8.1/go.mod h1:JeRgkft04UBgHMgCIwADu4Pn6Mtm5d4nPKWu0nJ5d+o= -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/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= +github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= +github.com/rs/cors v1.9.0 h1:l9HGsTsHJcvW14Nk7J9KFz8bzeAWXn3CG6bgt7LsrAE= +github.com/rs/cors v1.9.0/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= @@ -636,7 +647,6 @@ github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeV github.com/shurcooL/users v0.0.0-20180125191416-49c67e49c537/go.mod h1:QJTqeLYEDaXHZDBsXlPCDqdhQuJkuw4NOtaxYe3xii4= github.com/shurcooL/webdavfs v0.0.0-20170829043945-18c3829fa133/go.mod h1:hKmq5kWdCj2z2KEozexVbfEZIWiTjhE0+UjmZgPqehw= github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/sourcegraph/annotate v0.0.0-20160123013949-f4cad6c6324d/go.mod h1:UdhH50NIW0fCiwBSr0co2m7BnFLdv4fQTgdqdJTHFeE= @@ -653,35 +663,35 @@ github.com/status-im/keycard-go v0.2.0 h1:QDLFswOQu1r5jsycloeQh3bVU8n/NatHHaZobt 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/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= 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.3 h1:RP3t2pwF7cMEbC1dqtB6poj3niw/9gnV4Cjg5oW5gtY= -github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/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/tarm/serial v0.0.0-20180830185346-98f6abe2eb07/go.mod h1:kDXzergiv9cbyO7IOYJZWg1U88JhDg3PB6klq9Hg2pA= -github.com/tklauser/go-sysconf v0.3.10 h1:IJ1AZGZRWbY8T5Vfk04D9WOA5WSejdflXxP03OUqALw= -github.com/tklauser/go-sysconf v0.3.10/go.mod h1:C8XykCvCb+Gn0oNCWPIlcb0RuglQTYaQ2hGm7jmxEFk= -github.com/tklauser/numcpus v0.4.0/go.mod h1:1+UI3pD8NW14VMwdgJNJ1ESk2UnwhAnz5hMwiKKqXCQ= -github.com/tklauser/numcpus v0.5.0 h1:ooe7gN0fg6myJ0EKoTAf5hebTZrH52px3New/D9iJ+A= -github.com/tklauser/numcpus v0.5.0/go.mod h1:OGzpTxpcIMNGYQdit2BYL1pvk/dSOaJWjKoflh+RQjo= +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/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= -github.com/ugorji/go v1.1.7 h1:/68gy2h+1mWMrwZFeD1kQialdSzAb432dtpeJ42ovdo= github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= -github.com/ugorji/go/codec v1.2.7 h1:YPXUKf7fYbp/y8xloBqZOw2qaVggbfwMlI8WM3wZUJ0= +github.com/urfave/cli v1.22.2 h1:gsqYFH8bb9ekPA12kRo0hfjngWQjkJPlN9R0N78BoUo= github.com/urfave/cli v1.22.2/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= -github.com/urfave/cli v1.22.9 h1:cv3/KhXGBGjEXLC4bH0sLuJ9BewaAbpk5oyMOveu4pw= -github.com/urfave/cli v1.22.9/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= -github.com/urfave/cli/v2 v2.17.2-0.20221006022127-8f469abc00aa h1:5SqCsI/2Qya2bCzK15ozrqo2sZxkh0FHynJZOTVoV6Q= -github.com/urfave/cli/v2 v2.17.2-0.20221006022127-8f469abc00aa/go.mod h1:1CNUng3PtjQMtRzJO4FMXBQvkGtuYRxxiR9xMa7jMwI= +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/urfave/negroni v1.0.0/go.mod h1:Meg73S6kFm/4PpbYdq35yYWoCZ9mS/YSx+lKnmiohz4= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= github.com/valyala/fasthttp v1.6.0/go.mod h1:FstJa9V+Pj9vQ7OJie2qMHdwemEDaDiSdBnvPM1Su9w= @@ -703,28 +713,26 @@ github.com/yudai/pp v2.0.1+incompatible/go.mod h1:PuxR/8QJ7cyCkFp/aUDS+JY727OFEZ github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= github.com/yusufpapurcu/wmi v1.2.2 h1:KBNDSne4vP5mbSWnJbO+51IMOXJB67QiYCSBrubbPRg= github.com/yusufpapurcu/wmi v1.2.2/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= go.opencensus.io v0.18.0/go.mod h1:vKdFvxhtzZ9onBp9VKHK8z/sRpBMnKAsufL7wlDrCOA= -go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/atomic v1.10.0 h1:9qC72Qh0+3MqyJbAn8YU5xVq1frD8bn3JtD2oXtafVQ= -go.uber.org/atomic v1.10.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= -go.uber.org/dig v1.16.1 h1:+alNIBsl0qfY0j6epRubp/9obgtrObRAc5aD+6jbWY8= -go.uber.org/dig v1.16.1/go.mod h1:557JTAUZT5bUK0SvCwikmLPPtdQhfvLYtO5tJgQSbnk= -go.uber.org/fx v1.19.1 h1:JwYIYAQzXBuBBwSZ1/tn/95pnQO/Sp3yE8lWj9eSAzI= -go.uber.org/fx v1.19.1/go.mod h1:bGK+AEy7XUwTBkqCsK/vDyFF0JJOA6X5KWpNC0e6qTA= +go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= +go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= +go.uber.org/dig v1.17.0 h1:5Chju+tUvcC+N7N6EV08BJz41UZuO3BmHcN4A287ZLI= +go.uber.org/dig v1.17.0/go.mod h1:rTxpf7l5I0eBTlE6/9RL+lDybC7WFwY2QH55ZSjy1mU= +go.uber.org/fx v1.20.0 h1:ZMC/pnRvhsthOZh9MZjMq5U8Or3mA9zBSPaLnzs3ihQ= +go.uber.org/fx v1.20.0/go.mod h1:qCUj0btiR3/JnanEr1TYEePfSw6o/4qYJscgvzQ5Ub0= go.uber.org/goleak v1.1.11-0.20210813005559-691160354723/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= -go.uber.org/goleak v1.1.12 h1:gZAh5/EyT/HQwlpkCy6wTpqfH9H8Lz8zbm3dZh+OyzA= -go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= +go.uber.org/goleak v1.2.0 h1:xqgm/S+aQvhWFTtR0XK3Jvg7z8kGV8P4X14IzwN3Eqk= +go.uber.org/goleak v1.2.0/go.mod h1:XJYK+MuIchqpmGmUSAzotztawfKvYLUIgg7guXrwVUo= go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= -go.uber.org/multierr v1.9.0 h1:7fIwc/ZtS0q++VgcfqFDxSBZVv/Xo49/SYnDFupUwlI= -go.uber.org/multierr v1.9.0/go.mod h1:X2jQV1h+kxSjClGpnseKVIxpmcjrj7MNnI0bnlfKTVQ= -go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= -go.uber.org/zap v1.16.0/go.mod h1:MA8QOfq0BHJwdXa996Y4dYkAqRKB8/1K1QMMZVaNZjQ= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= go.uber.org/zap v1.19.1/go.mod h1:j3DNczoxDZroyBnOT1L/Q79cfUMGZxlv/9dzN7SM1rI= -go.uber.org/zap v1.24.0 h1:FiJd5l1UOLj0wCgbSE0rwwXHzEdAZS6hiiSnxJN/D60= -go.uber.org/zap v1.24.0/go.mod h1:2kMP+WWQ8aoFoedH3T2sq6iJ2yDWpHbP0f6MQbS9Gkg= +go.uber.org/zap v1.25.0 h1:4Hvk6GtkucQ790dqmj7l1eEnRdKm3k3ZUrUMS2d5+5c= +go.uber.org/zap v1.25.0/go.mod h1:JIAUzQIH94IC4fOJQm7gMmBJP5k7wQfdcnYdPoEXJYk= go4.org v0.0.0-20180809161055-417644f6feb5/go.mod h1:MkTOUMDaeVYJUOUsaDXIhWPZYa1yOyC1qaOBpL57BhE= golang.org/x/build v0.0.0-20190111050920-041ab4dc3f9d/go.mod h1:OWs+y06UdEOHN4y+MfF/py+xQ/tYqIWW03b70/CG9Rw= golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= @@ -732,7 +740,6 @@ golang.org/x/crypto v0.0.0-20181030102418-4d3f4d9ffa16/go.mod h1:6SG95UA2DQfeDnf golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190313024323-a1f597ede03a/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= @@ -743,11 +750,11 @@ golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.9.0 h1:LF6fAI+IutBocDJ2OT0Q1g8plpYljMZ4+lty+dsqw3g= -golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0= +golang.org/x/crypto v0.13.0 h1:mvySKfSWJ+UKUii46M40LOvyWfN0s2U+46/jDd0e6Ck= +golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20230213192124-5e25df0256eb h1:PaBZQdo+iSDyHT053FjUCgZQ/9uqVwPOcl7KSWhKn6w= -golang.org/x/exp v0.0.0-20230213192124-5e25df0256eb/go.mod h1:CxIveKay+FTh1D0yPZemJVgC/95VzuuOLq5Qi4xnoYc= +golang.org/x/exp v0.0.0-20230905200255-921286631fa9 h1:GoHiUyI/Tp2nVkLI2mCxVkOjsbSXD66ic0XW0js0R9g= +golang.org/x/exp v0.0.0-20230905200255-921286631fa9/go.mod h1:S2oDrQGGwySpoQPVqRShND87VCbxmc6bL1Yd2oYrm6k= golang.org/x/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= @@ -755,18 +762,17 @@ golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHl golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.9.0 h1:KENHtAZL2y3NLMYZeHY9DW8HW8V+kQyJsY/V9JlKvCs= -golang.org/x/mod v0.9.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/mod v0.12.0 h1:rmsUpXtvNzj340zd98LZ4KntptpfRHwpFOHG188oHXc= +golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20180719180050-a680a1efc54d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181011144130-49bb7cea24b1/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181029044818-c44066c5c816/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181106065722-10aee1819953/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -789,12 +795,12 @@ golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= -golang.org/x/net v0.0.0-20210726213435-c6fcb2dbf985/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211008194852-3b03d305991f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= 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.10.0 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M= -golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.15.0 h1:ugBLEUaxABaB5AJqW9enI0ACdci2RUd4eP51NTBvuJ8= +golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181017192945-9dcd33a902f4/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181203162652-d668ce993890/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= @@ -808,8 +814,9 @@ golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJ 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.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.2.0 h1:PUR+T4wwASmuSTYdKjYHI5TD22Wy5ogLU5qZCOLxBrI= -golang.org/x/sync v0.2.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E= +golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= golang.org/x/sys v0.0.0-20180810173357-98c5dad5d1a0/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -817,9 +824,7 @@ golang.org/x/sys v0.0.0-20181029174526-d69651ed3497/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/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-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190228124157-a34e9553db1e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190316082340-a2f829d7f35f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190405154228-4b34438f7a67/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -851,23 +856,25 @@ golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/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-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220405052023-b1e9470b6e64/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-20220503163025-988cb79eb6c6/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-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.8.0 h1:EBmGv8NaZBZTWvrbjNoL6HVt+IVy3QDQpJs7VRIw3tU= 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.12.0 h1:CM0HF96J0hcLAwsHPJZjfdNzs0gftsLfgKt57wWHJ0o= +golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.8.0 h1:n5xxQn2i3PC0yLAbjTpNT85q/Kgzcr2gIoX9OrJUols= -golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= +golang.org/x/term v0.12.0 h1:/ZfYdc3zq+q02Rv9vGqTeSItdzZTSNDmfTi0mBAuidU= +golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= @@ -875,11 +882,11 @@ golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/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.9.0 h1:2sjJmO8cDvYveuX97RDLsxlyUxLl+GHoLxBiRdHllBE= -golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= +golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= +golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= @@ -895,9 +902,6 @@ golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3 golang.org/x/tools v0.0.0-20190327201419-c70d86f8b7cf/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= @@ -907,9 +911,9 @@ golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4f golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.6-0.20210726203631-07bc1bf47fb2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.7.0 h1:W4OVu8VVOaIO0yzWMNdepAulS7YfoS3Zabrm8DOXXU4= -golang.org/x/tools v0.7.0/go.mod h1:4pg6aUX35JBAogB10C9AtvVL+qowtN4pT3CGSQex14s= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/tools v0.13.0 h1:Iey4qkscZuv0VvIt8E0neZjtPVQFSc870HQ448QgEmQ= +golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= 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= @@ -951,8 +955,8 @@ google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpAD google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= 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.30.0 h1:kPPoIgf3TsEvrm0PFe15JQ+570QVxYzEvvHqChK+cng= -google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8= +google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -967,8 +971,6 @@ gopkg.in/ini.v1 v1.51.1/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/mgo.v2 v2.0.0-20180705113604-9856a29383ce/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA= gopkg.in/natefinch/lumberjack.v2 v2.0.0 h1:1Lc07Kr7qY4U2YPouBjpCLxpiyxIVoxqXgkXLknAOE8= gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= -gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce h1:+JknDZhAj8YMt7GC73Ei8pv4MzjDUNPHgQWJdtMAaDU= -gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce/go.mod h1:5AcXVHNjg+BDxry382+8OKon8SEWiKktQR07RKPsv1c= 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.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= @@ -988,10 +990,9 @@ honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWh honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= -lukechampine.com/blake3 v1.1.7 h1:GgRMhmdsuK8+ii6UZFDL8Nb+VyMwadAgcJyfYHxG6n0= -lukechampine.com/blake3 v1.1.7/go.mod h1:tkKEOtDkNtklkXtLNEOGNq5tcV90tJiA1vAA12R78LA= -nhooyr.io/websocket v1.8.7 h1:usjR2uOr/zjjkVMy0lW+PPohFok7PCow5sDjLgX4P4g= -nhooyr.io/websocket v1.8.7/go.mod h1:B70DZP8IakI65RVQ51MsWP/8jndNma26DVA/nFSCgW0= +lukechampine.com/blake3 v1.2.1 h1:YuqqRuaqsGV71BV/nm9xlI0MKUv4QC54jQnBChWbGnI= +lukechampine.com/blake3 v1.2.1/go.mod h1:0OFRp7fBtAylGVCO40o87sbupkyIGgbpv1+M1k1LM6k= +rsc.io/tmplfunc v0.0.3 h1:53XFQh69AfOa8Tw0Jm7t+GV7KZhOi6jzsCzTtKbMvzU= +rsc.io/tmplfunc v0.0.3/go.mod h1:AG3sTPzElb1Io3Yg4voV9AGZJuleGAwaVRxL9M49PhA= sourcegraph.com/sourcegraph/go-diff v0.5.0/go.mod h1:kuch7UrkMzY0X+p9CRK03kfuPQ2zzQcaEFbx8wA8rck= sourcegraph.com/sqs/pbtypes v0.0.0-20180604144634-d3ebe8f20ae4/go.mod h1:ketZ/q3QxT9HOBeFhu6RdvsftgpsbFHBF5Cas6cDKZ0= diff --git a/internal/alert/routing_test.go b/internal/alert/routing_test.go index 1df7ae5d..62fbadcb 100644 --- a/internal/alert/routing_test.go +++ b/internal/alert/routing_test.go @@ -16,7 +16,7 @@ func getCfg() *config.Config { RoutingParams: &core.AlertRoutingParams{ AlertRoutes: &core.SeverityMap{ Low: &core.AlertClientCfg{ - Slack: map[string]*core.Config{ + Slack: map[string]*core.AlertConfig{ "test1": { Channel: "test1", URL: "test1", @@ -24,12 +24,12 @@ func getCfg() *config.Config { }, }, Medium: &core.AlertClientCfg{ - PagerDuty: map[string]*core.Config{ + PagerDuty: map[string]*core.AlertConfig{ "test1": { IntegrationKey: "test1", }, }, - Slack: map[string]*core.Config{ + Slack: map[string]*core.AlertConfig{ "test2": { Channel: "test2", URL: "test2", @@ -37,7 +37,7 @@ func getCfg() *config.Config { }, }, High: &core.AlertClientCfg{ - PagerDuty: map[string]*core.Config{ + PagerDuty: map[string]*core.AlertConfig{ "test1": { IntegrationKey: "test1", }, @@ -45,7 +45,7 @@ func getCfg() *config.Config { IntegrationKey: "test2", }, }, - Slack: map[string]*core.Config{ + Slack: map[string]*core.AlertConfig{ "test2": { Channel: "test2", URL: "test2", diff --git a/internal/api/service/service.go b/internal/api/service/service.go index f87b7419..5c05d21d 100644 --- a/internal/api/service/service.go +++ b/internal/api/service/service.go @@ -22,11 +22,11 @@ type Service interface { // PessimismService ... API service type PessimismService struct { ctx context.Context - m subsystem.Manager + m subsystem.Subsystem } // New ... Initializer -func New(ctx context.Context, m subsystem.Manager) *PessimismService { +func New(ctx context.Context, m subsystem.Subsystem) *PessimismService { return &PessimismService{ ctx: ctx, m: m, diff --git a/internal/app/app.go b/internal/app/app.go index a3f3056b..51b1fca6 100644 --- a/internal/app/app.go +++ b/internal/app/app.go @@ -9,6 +9,7 @@ import ( "github.com/base-org/pessimism/internal/api/models" "github.com/base-org/pessimism/internal/api/server" "github.com/base-org/pessimism/internal/config" + "github.com/base-org/pessimism/internal/core" "github.com/base-org/pessimism/internal/logging" "github.com/base-org/pessimism/internal/metrics" "github.com/base-org/pessimism/internal/subsystem" @@ -24,19 +25,19 @@ type Application struct { ctx context.Context metrics metrics.Metricer - sub subsystem.Manager - server *server.Server + Subsystems *subsystem.Manager + server *server.Server } // New ... Initializer func New(ctx context.Context, cfg *config.Config, - sub subsystem.Manager, server *server.Server, stats metrics.Metricer) *Application { + sub *subsystem.Manager, server *server.Server, stats metrics.Metricer) *Application { return &Application{ - ctx: ctx, - cfg: cfg, - sub: sub, - server: server, - metrics: stats, + ctx: ctx, + cfg: cfg, + Subsystems: sub, + server: server, + metrics: stats, } } @@ -46,7 +47,7 @@ func (a *Application) Start() error { a.metrics.Start() // Spawn subsystem event loop routines - a.sub.StartEventRoutines(a.ctx) + a.Subsystems.StartEventRoutines(a.ctx) // Start the API server a.server.Start() @@ -73,29 +74,36 @@ func (a *Application) End() <-chan os.Signal { } // BootStrap ... Bootstraps the application -func (a *Application) BootStrap(sessions []*BootSession) error { +func (a *Application) BootStrap(sessions []*BootSession) ([]*core.HeuristicID, error) { logger := logging.WithContext(a.ctx) + ids := make([]*core.HeuristicID, 0, len(sessions)) for _, session := range sessions { - pConfig, err := a.sub.BuildPipelineCfg(session) + pConfig, err := a.Subsystems.BuildPipelineCfg(session) if err != nil { - return err + return nil, err } sConfig := session.SessionConfig() - deployCfg, err := a.sub.BuildDeployCfg(pConfig, sConfig) + deployCfg, err := a.Subsystems.BuildDeployCfg(pConfig, sConfig) if err != nil { - return err + return nil, err } - sUUID, err := a.sub.RunSession(deployCfg) + sUUID, err := a.Subsystems.RunSession(deployCfg) if err != nil { - return err + return nil, err } + ids = append(ids, &core.HeuristicID{ + SUUID: sUUID, + PUUID: deployCfg.PUUID, + }) + logger.Info("heuristic session started", zap.String(logging.SUUIDKey, sUUID.String())) } - return nil + + return ids, nil } diff --git a/internal/app/app_test.go b/internal/app/app_test.go deleted file mode 100644 index e80c4898..00000000 --- a/internal/app/app_test.go +++ /dev/null @@ -1,43 +0,0 @@ -package app_test - -import ( - "context" - "testing" - - "github.com/base-org/pessimism/internal/alert" - "github.com/base-org/pessimism/internal/api/server" - "github.com/base-org/pessimism/internal/app" - "github.com/base-org/pessimism/internal/config" - "github.com/base-org/pessimism/internal/metrics" - - "github.com/stretchr/testify/assert" -) - -func Test_AppFlow(t *testing.T) { - - ctx := context.Background() - - cfg := &config.Config{ - ServerConfig: &server.Config{ - Host: "localhost", - Port: 8080, - }, - - MetricsConfig: &metrics.Config{ - Enabled: false, - }, - AlertConfig: &alert.Config{ - RoutingCfgPath: "../../e2e/alert-routing-cfg.yaml", - PagerdutyAlertEventsURL: "test", - }, - } - - app, shutDown, err := app.NewPessimismApp(ctx, cfg) - - assert.NoError(t, err) - - err = app.Start() - assert.NoError(t, err) - - shutDown() -} diff --git a/internal/app/init.go b/internal/app/init.go index a31e4361..c090c29f 100644 --- a/internal/app/init.go +++ b/internal/app/init.go @@ -53,7 +53,7 @@ func InitializeMetrics(ctx context.Context, cfg *config.Config) (metrics.Metrice } // InitializeServer ... Performs dependency injection to build server struct -func InitializeServer(ctx context.Context, cfg *config.Config, m subsystem.Manager) (*server.Server, func(), error) { +func InitializeServer(ctx context.Context, cfg *config.Config, m *subsystem.Manager) (*server.Server, func(), error) { apiService := service.New(ctx, m) handler, err := handlers.New(ctx, apiService) if err != nil { @@ -74,7 +74,7 @@ func InitializeServer(ctx context.Context, cfg *config.Config, m subsystem.Manag // InitializeAlerting ... Performs dependency injection to build alerting struct func InitializeAlerting(ctx context.Context, cfg *config.Config) (alert.Manager, error) { - if err := cfg.ParseAlertConfig(); err != nil { + if err := cfg.IngestAlertConfig(); err != nil { return nil, err } diff --git a/internal/client/pagerduty.go b/internal/client/pagerduty.go index 76d7f9fa..f8d25646 100644 --- a/internal/client/pagerduty.go +++ b/internal/client/pagerduty.go @@ -38,7 +38,7 @@ type PagerDutyConfig struct { AlertEventsURL string } -// pagerdutyClient ... PagerDuty client for making requests +// pagerDutyClient ... PagerDuty client for making requests type pagerdutyClient struct { name string integrationKey string @@ -135,7 +135,7 @@ func (pdc *pagerdutyClient) PostEvent(ctx context.Context, event *AlertEventTrig // 1. Create and marshal payload into request object body if pdc.integrationKey == "" { - return nil, fmt.Errorf("no Pagerduty integration key provided") + return nil, fmt.Errorf("no PagerDuty integration key provided") } payload, err := newPagerDutyPayload(pdc.integrationKey, event.ToPagerdutyEvent()).marshal() diff --git a/internal/config/config.go b/internal/config/config.go index 48a9ebff..38f6f3b1 100644 --- a/internal/config/config.go +++ b/internal/config/config.go @@ -13,10 +13,10 @@ import ( "github.com/base-org/pessimism/internal/logging" "github.com/base-org/pessimism/internal/metrics" "github.com/base-org/pessimism/internal/subsystem" + "gopkg.in/yaml.v2" "github.com/joho/godotenv" "go.uber.org/zap" - "gopkg.in/yaml.v3" ) // TrueEnvVal ... Represents the encoded string value for true (ie. 1) @@ -52,6 +52,7 @@ func NewConfig(fileName core.FilePath) *Config { AlertConfig: &alert.Config{ RoutingCfgPath: getEnvStrWithDefault("ALERT_ROUTE_CFG_PATH", ""), PagerdutyAlertEventsURL: getEnvStrWithDefault("PAGERDUTY_ALERT_EVENTS_URL", ""), + RoutingParams: nil, // This is populated after the config is created (see IngestAlertConfig) }, SystemConfig: &subsystem.Config{ @@ -99,28 +100,6 @@ func (cfg *Config) IsBootstrap() bool { return cfg.BootStrapPath != "" } -// ParseAlertConfig ... Parses the alert config -func (cfg *Config) ParseAlertConfig() error { - if cfg.AlertConfig.RoutingCfgPath == "" { - return fmt.Errorf("alert routing config path is empty") - } - - f, err := os.ReadFile(filepath.Clean(cfg.AlertConfig.RoutingCfgPath)) - if err != nil { - return err - } - - params := &core.AlertRoutingParams{} - err = yaml.Unmarshal(f, ¶ms) - - if err != nil { - return err - } - - cfg.AlertConfig.RoutingParams = params - return nil -} - // getEnvStr ... Reads env var from process environment, panics if not found func getEnvStr(key string) string { envVar, ok := os.LookupEnv(key) @@ -159,3 +138,35 @@ func getEnvInt(key string) int { } return intRep } + +// IngestAlertConfig ... Ingests an alerting config provided a file path +func (cfg *Config) IngestAlertConfig() error { + // (1) Error if no routing config path is provided + if cfg.AlertConfig.RoutingCfgPath == "" && cfg.AlertConfig.RoutingParams == nil { + return fmt.Errorf("alert routing config path is empty") + } + + // (2) Return nil if a routing param struct is already provided + if cfg.AlertConfig.RoutingParams != nil { + return nil + } + + // (3) Read the YAML file contents into a routing param struct + f, err := os.ReadFile(filepath.Clean(cfg.AlertConfig.RoutingCfgPath)) + if err != nil { + return err + } + + var params *core.AlertRoutingParams + err = yaml.Unmarshal(f, ¶ms) + if err != nil { + return err + } + + // (4) Set the routing params and return + if params != nil { + cfg.AlertConfig.RoutingParams = params + } + + return nil +} diff --git a/internal/core/alert.go b/internal/core/alert.go index 0703f193..df0ba115 100644 --- a/internal/core/alert.go +++ b/internal/core/alert.go @@ -52,8 +52,10 @@ func (s Severity) String() string { switch s { case LOW: return "low" + case MEDIUM: return "medium" + case HIGH: return "high" @@ -69,9 +71,11 @@ func (s Severity) String() string { func (s Severity) ToPagerDutySev() PagerDutySeverity { switch s { case LOW: + return Warning case MEDIUM: return Error + case HIGH: return Critical @@ -108,12 +112,12 @@ type SeverityMap struct { // AlertClientCfg ... The alert client config type AlertClientCfg struct { - Slack map[string]*Config `yaml:"slack"` - PagerDuty map[string]*Config `yaml:"pagerduty"` + Slack map[string]*AlertConfig `yaml:"slack"` + PagerDuty map[string]*AlertConfig `yaml:"pagerduty"` } -// Config ... The config for an alert client -type Config struct { +// AlertConfig ... The config for an alert client +type AlertConfig struct { URL StringFromEnv `yaml:"url"` Channel StringFromEnv `yaml:"channel"` IntegrationKey StringFromEnv `yaml:"integration_key"` diff --git a/internal/core/id.go b/internal/core/id.go index d867c6c9..77fac971 100644 --- a/internal/core/id.go +++ b/internal/core/id.go @@ -221,3 +221,8 @@ func (uuid SUUID) String() string { return fmt.Sprintf("%s::%s", uuid.PID.String(), uuid.UUID.ShortString()) } + +type HeuristicID struct { + PUUID PUUID + SUUID SUUID +} diff --git a/internal/engine/registry/fault_detector.go b/internal/engine/registry/fault_detector.go index 475b30c1..3b54b888 100644 --- a/internal/engine/registry/fault_detector.go +++ b/internal/engine/registry/fault_detector.go @@ -154,7 +154,7 @@ func (fd *faultDetectorInv) Assess(td core.TransitData) (*core.Activation, bool, return nil, false, err } - // 5. Compute the expected state root of the L2 block using the rollup node software + // 5. Compute the expected state root of the L2 block using the roll-up node software asInfo := blockToInfo(outputBlock) expectedStateRoot, err := rollup.ComputeL2OutputRootV0(asInfo, proofResp.StorageHash) if err != nil { diff --git a/internal/etl/component/oracle.go b/internal/etl/component/oracle.go index cbab2f22..17980d2a 100644 --- a/internal/etl/component/oracle.go +++ b/internal/etl/component/oracle.go @@ -17,6 +17,7 @@ type OracleDefinition interface { BackTestRoutine(ctx context.Context, componentChan chan core.TransitData, startHeight *big.Int, endHeight *big.Int) error ReadRoutine(ctx context.Context, componentChan chan core.TransitData) error + Height() (*big.Int, error) } // Oracle ... Component used to represent a data source reader; E.g, Eth block indexing, interval API polling @@ -53,6 +54,11 @@ func NewOracle(ctx context.Context, outType core.RegisterType, return o, nil } +// Height ... Returns the current block height of the oracle +func (o *Oracle) Height() (*big.Int, error) { + return o.definition.Height() +} + // Close ... This function is called at the end when processes related to oracle need to shut down func (o *Oracle) Close() error { logging.WithContext(o.ctx). diff --git a/internal/etl/pipeline/manager.go b/internal/etl/pipeline/manager.go index 68692868..e2a1b2a1 100644 --- a/internal/etl/pipeline/manager.go +++ b/internal/etl/pipeline/manager.go @@ -5,6 +5,7 @@ package pipeline import ( "context" "fmt" + "math/big" "sync" "github.com/base-org/pessimism/internal/core" @@ -21,6 +22,7 @@ type Manager interface { InferComponent(cc *core.ClientConfig, cUUID core.CUUID, pUUID core.PUUID, register *core.DataRegister) (component.Component, error) GetStateKey(rt core.RegisterType) (*core.StateKey, bool, error) + GetPipelineHeight(id core.PUUID) (*big.Int, error) CreateDataPipeline(cfg *core.PipelineConfig) (core.PUUID, bool, error) RunPipeline(pID core.PUUID) error ActiveCount() int @@ -278,3 +280,12 @@ func (em *etlManager) GetStateKey(rt core.RegisterType) (*core.StateKey, bool, e return nil, false, nil } + +func (em *etlManager) GetPipelineHeight(id core.PUUID) (*big.Int, error) { + pipeline, err := em.store.GetPipelineFromPUUID(id) + if err != nil { + return nil, err + } + + return pipeline.BlockHeight() +} diff --git a/internal/etl/pipeline/pipeline.go b/internal/etl/pipeline/pipeline.go index 4437357f..86ad958a 100644 --- a/internal/etl/pipeline/pipeline.go +++ b/internal/etl/pipeline/pipeline.go @@ -2,6 +2,7 @@ package pipeline import ( "fmt" + "math/big" "sync" "github.com/base-org/pessimism/internal/core" @@ -12,6 +13,7 @@ import ( // Pipeline ... Pipeline interface type Pipeline interface { + BlockHeight() (*big.Int, error) Config() *core.PipelineConfig Components() []component.Component UUID() core.PUUID @@ -68,6 +70,16 @@ func (pl *pipeline) UUID() core.PUUID { return pl.id } +func (pl *pipeline) BlockHeight() (*big.Int, error) { + comp := pl.components[len(pl.components)-1] + oracle, ok := comp.(*component.Oracle) + if !ok { + return nil, fmt.Errorf("could not cast component to oracle") + } + + return oracle.Height() +} + // AddEngineRelay ... Adds a relay to the pipeline that forces it to send transformed heuristic input // to a risk engine func (pl *pipeline) AddEngineRelay(engineChan chan core.HeuristicInput) error { diff --git a/internal/etl/registry/oracle/account_balance.go b/internal/etl/registry/oracle/account_balance.go index f55ae637..120e0f65 100644 --- a/internal/etl/registry/oracle/account_balance.go +++ b/internal/etl/registry/oracle/account_balance.go @@ -27,6 +27,10 @@ type AddressBalanceODef struct { sk *core.StateKey } +func (oracle *AddressBalanceODef) Height() (*big.Int, error) { + return oracle.currHeight, nil +} + // NewAddressBalanceODef ... Initializer for address.balance oracle definition func NewAddressBalanceODef(cfg *core.ClientConfig, client client.EthClient, h *big.Int) *AddressBalanceODef { diff --git a/internal/etl/registry/oracle/geth_block.go b/internal/etl/registry/oracle/geth_block.go index ba9c8c22..87c1e3ce 100644 --- a/internal/etl/registry/oracle/geth_block.go +++ b/internal/etl/registry/oracle/geth_block.go @@ -62,6 +62,10 @@ func NewGethBlockOracle(ctx context.Context, cfg *core.ClientConfig, return oracle, nil } +func (oracle *GethBlockODef) Height() (*big.Int, error) { + return oracle.currHeight, nil +} + // getCurrentHeightFromNetwork ... Gets the current height of the network and will not quit until found func (oracle *GethBlockODef) getCurrentHeightFromNetwork(ctx context.Context) *types.Header { for { diff --git a/internal/mocks/etl_manager.go b/internal/mocks/etl_manager.go index e76c7564..7687210b 100644 --- a/internal/mocks/etl_manager.go +++ b/internal/mocks/etl_manager.go @@ -5,6 +5,7 @@ package mocks import ( + big "math/big" reflect "reflect" core "github.com/base-org/pessimism/internal/core" @@ -79,6 +80,21 @@ func (mr *EtlManagerMockRecorder) EventLoop() *gomock.Call { return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "EventLoop", reflect.TypeOf((*EtlManager)(nil).EventLoop)) } +// GetPipelineHeight mocks base method. +func (m *EtlManager) GetPipelineHeight(arg0 core.PUUID) (*big.Int, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetPipelineHeight", arg0) + ret0, _ := ret[0].(*big.Int) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetPipelineHeight indicates an expected call of GetPipelineHeight. +func (mr *EtlManagerMockRecorder) GetPipelineHeight(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetPipelineHeight", reflect.TypeOf((*EtlManager)(nil).GetPipelineHeight), arg0) +} + // GetStateKey mocks base method. func (m *EtlManager) GetStateKey(arg0 core.RegisterType) (*core.StateKey, bool, error) { m.ctrl.T.Helper() diff --git a/internal/mocks/oracle.go b/internal/mocks/oracle.go index dd192c17..1f42eb9f 100644 --- a/internal/mocks/oracle.go +++ b/internal/mocks/oracle.go @@ -24,6 +24,10 @@ func (md *mockOracleDefinition) ReadRoutine(_ context.Context, _ chan core.Trans return nil } +func (md *mockOracleDefinition) Height() (*big.Int, error) { + return big.NewInt(0), nil +} + // NewDummyOracle ... Takes in a register type that specifies the mocked output type // Useful for testing inter-component connectivity and higher level component management abstractions func NewDummyOracle(ctx context.Context, ot core.RegisterType, opts ...component.Option) (component.Component, error) { diff --git a/internal/mocks/subsystem.go b/internal/mocks/subsystem.go index 9b442a2f..23dd1dfe 100644 --- a/internal/mocks/subsystem.go +++ b/internal/mocks/subsystem.go @@ -1,5 +1,5 @@ // Code generated by MockGen. DO NOT EDIT. -// Source: github.com/base-org/pessimism/internal/subsystem (interfaces: Manager) +// Source: github.com/base-org/pessimism/internal/subsystem (interfaces: Subsystem) // Package mocks is a generated GoMock package. package mocks @@ -14,7 +14,7 @@ import ( gomock "github.com/golang/mock/gomock" ) -// SubManager is a mock of Manager interface. +// SubManager is a mock of Subsystem interface. type SubManager struct { ctrl *gomock.Controller recorder *SubManagerMockRecorder diff --git a/internal/subsystem/manager.go b/internal/subsystem/manager.go index 2cb5bd87..0564b244 100644 --- a/internal/subsystem/manager.go +++ b/internal/subsystem/manager.go @@ -1,10 +1,11 @@ -//go:generate mockgen -package mocks --destination ../mocks/subsystem.go --mock_names Manager=SubManager . Manager +//go:generate mockgen -package mocks --destination ../mocks/subsystem.go --mock_names Subsystem=SubManager . Subsystem package subsystem import ( "context" "fmt" + "math/big" "sync" "time" @@ -40,8 +41,7 @@ func (cfg *Config) GetPollInterval(n core.Network) (time.Duration, error) { } } -// Manager ... Subsystem manager interface -type Manager interface { +type Subsystem interface { BuildDeployCfg(pConfig *core.PipelineConfig, sConfig *core.SessionConfig) (*heuristic.DeployConfig, error) BuildPipelineCfg(params *models.SessionRequestParams) (*core.PipelineConfig, error) RunSession(cfg *heuristic.DeployConfig) (core.SUUID, error) @@ -51,7 +51,7 @@ type Manager interface { } // manager ... Subsystem manager struct -type manager struct { +type Manager struct { cfg *Config ctx context.Context @@ -66,8 +66,8 @@ type manager struct { // NewManager ... Initializer for the subsystem manager func NewManager(ctx context.Context, cfg *Config, etl pipeline.Manager, eng engine.Manager, a alert.Manager, -) Manager { - return &manager{ +) *Manager { + return &Manager{ cfg: cfg, ctx: ctx, etl: etl, @@ -79,7 +79,7 @@ func NewManager(ctx context.Context, cfg *Config, etl pipeline.Manager, eng engi } // Shutdown ... Shuts down all subsystems in primary data flow order -func (m *manager) Shutdown() error { +func (m *Manager) Shutdown() error { // 1. Shutdown ETL subsystem if err := m.etl.Shutdown(); err != nil { return err @@ -95,7 +95,7 @@ func (m *manager) Shutdown() error { } // StartEventRoutines ... Starts the event loop routines for the subsystems -func (m *manager) StartEventRoutines(ctx context.Context) { +func (m *Manager) StartEventRoutines(ctx context.Context) { logger := logging.WithContext(ctx) m.Add(1) @@ -127,7 +127,7 @@ func (m *manager) StartEventRoutines(ctx context.Context) { } // BuildDeployCfg ... Builds a deploy config provided a pipeline & session config -func (m *manager) BuildDeployCfg(pConfig *core.PipelineConfig, +func (m *Manager) BuildDeployCfg(pConfig *core.PipelineConfig, sConfig *core.SessionConfig) (*heuristic.DeployConfig, error) { // 1. Fetch state key using risk engine input register type sk, stateful, err := m.etl.GetStateKey(pConfig.DataType) @@ -158,7 +158,7 @@ func (m *manager) BuildDeployCfg(pConfig *core.PipelineConfig, } // RunSession ... Runs a heuristic session -func (m *manager) RunSession(cfg *heuristic.DeployConfig) (core.SUUID, error) { +func (m *Manager) RunSession(cfg *heuristic.DeployConfig) (core.SUUID, error) { // 1. Verify that pipeline constraints are met // NOTE - Consider introducing a config validation step or module if !cfg.Reuse && m.etlLimitReached() { @@ -192,7 +192,7 @@ func (m *manager) RunSession(cfg *heuristic.DeployConfig) (core.SUUID, error) { } // BuildPipelineCfg ... Builds a pipeline config provided a set of heuristic request params -func (m *manager) BuildPipelineCfg(params *models.SessionRequestParams) (*core.PipelineConfig, error) { +func (m *Manager) BuildPipelineCfg(params *models.SessionRequestParams) (*core.PipelineConfig, error) { inType, err := m.eng.GetInputType(params.Heuristic()) if err != nil { return nil, err @@ -217,6 +217,10 @@ func (m *manager) BuildPipelineCfg(params *models.SessionRequestParams) (*core.P } // etlLimitReached ... Returns true if the ETL pipeline count is at or above the max -func (m *manager) etlLimitReached() bool { +func (m *Manager) etlLimitReached() bool { return m.etl.ActiveCount() >= m.cfg.MaxPipelineCount } + +func (m *Manager) PipelineHeight(pUUID core.PUUID) (*big.Int, error) { + return m.etl.GetPipelineHeight(pUUID) +} diff --git a/internal/subsystem/manager_test.go b/internal/subsystem/manager_test.go index d02fbefe..fabd8f40 100644 --- a/internal/subsystem/manager_test.go +++ b/internal/subsystem/manager_test.go @@ -19,7 +19,7 @@ func testErr() error { } type testSuite struct { - subsys subsystem.Manager + subsys *subsystem.Manager mockEtl *mocks.EtlManager mockEng *mocks.EngineManager diff --git a/mocks/alert_client.go b/mocks/alert_client.go new file mode 100644 index 00000000..1aae3778 --- /dev/null +++ b/mocks/alert_client.go @@ -0,0 +1,65 @@ +// Code generated by MockGen. DO NOT EDIT. +// Source: github.com/base-org/pessimism/internal/client (interfaces: AlertClient) + +// Package mocks is a generated GoMock package. +package mocks + +import ( + context "context" + reflect "reflect" + + client "github.com/base-org/pessimism/internal/client" + gomock "github.com/golang/mock/gomock" +) + +// MockAlertClient is a mock of AlertClient interface. +type MockAlertClient struct { + ctrl *gomock.Controller + recorder *MockAlertClientMockRecorder +} + +// MockAlertClientMockRecorder is the mock recorder for MockAlertClient. +type MockAlertClientMockRecorder struct { + mock *MockAlertClient +} + +// NewMockAlertClient creates a new mock instance. +func NewMockAlertClient(ctrl *gomock.Controller) *MockAlertClient { + mock := &MockAlertClient{ctrl: ctrl} + mock.recorder = &MockAlertClientMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockAlertClient) EXPECT() *MockAlertClientMockRecorder { + return m.recorder +} + +// GetName mocks base method. +func (m *MockAlertClient) GetName() string { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetName") + ret0, _ := ret[0].(string) + return ret0 +} + +// GetName indicates an expected call of GetName. +func (mr *MockAlertClientMockRecorder) GetName() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetName", reflect.TypeOf((*MockAlertClient)(nil).GetName)) +} + +// PostEvent mocks base method. +func (m *MockAlertClient) PostEvent(arg0 context.Context, arg1 *client.AlertEventTrigger) (*client.AlertAPIResponse, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "PostEvent", arg0, arg1) + ret0, _ := ret[0].(*client.AlertAPIResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// PostEvent indicates an expected call of PostEvent. +func (mr *MockAlertClientMockRecorder) PostEvent(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PostEvent", reflect.TypeOf((*MockAlertClient)(nil).PostEvent), arg0, arg1) +} diff --git a/scripts/devnet-allocs.sh b/scripts/devnet-allocs.sh new file mode 100755 index 00000000..a23e2666 --- /dev/null +++ b/scripts/devnet-allocs.sh @@ -0,0 +1,18 @@ +## Download and enter the OP monorepo +echo "Downloading Optimism monorepo..." +git clone https://github.com/ethereum-optimism/optimism.git +cd optimism +git checkout develop + +## Generate devnet allocations and persist them all into .devnet folder +echo "Initializing monorepo..." +make install-geth +git submodule update --init --recursive +make devnet-allocs +mv .devnet ../.devnet +mv packages/contracts-bedrock/deploy-config/devnetL1.json ../.devnet/devnetL1.json + +## Clean up +echo "Cleaning up..." +cd ../ +rm -rf optimism