diff --git a/.circleci/config.yml b/.circleci/config.yml index ccdafafa61ef5670d4a89ba7ea86c20daaa9853d..d8c6834291c6c72dd7a5035af05365b31d15ccb4 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -1380,6 +1380,22 @@ workflows: only: /^(proxyd|indexer|ci-builder|op-[a-z0-9\-]*)\/v.*/ branches: ignore: /.*/ + - docker-release: + name: op-heartbeat-release + filters: + tags: + only: /^op-heartbeat\/v.*/ + branches: + ignore: /.*/ + docker_file: op-heartbeat/Dockerfile + docker_name: op-heartbeat + docker_tags: <<pipeline.git.revision>>,<<pipeline.git.branch>> + docker_context: . + platforms: "linux/amd64,linux/arm64" + context: + - oplabs-gcr-release + requires: + - hold - docker-release: name: op-node-docker-release filters: diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index c3d96a6803cdd4cba039e458cae193ee41120440..a216ace2af2e42cbbe613760f9dd12bda639b132 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -21,7 +21,6 @@ /op-program @ethereum-optimism/go-reviewers /op-proposer @ethereum-optimism/go-reviewers /op-service @ethereum-optimism/go-reviewers -/op-signer @ethereum-optimism/go-reviewers /op-wheel @ethereum-optimism/go-reviewers /ops-bedrock @ethereum-optimism/go-reviewers @@ -29,7 +28,6 @@ /.circleci @ethereum-optimism/infra-reviewers /.github @ethereum-optimism/infra-reviewers /ops @ethereum-optimism/infra-reviewers -/op-signer @ethereum-optimism/infra-reviewers # Misc /proxyd @ethereum-optimism/infra-reviewers diff --git a/.github/mergify.yml b/.github/mergify.yml index e336a46b86dd6d80a0b884386ef82fa24356e72e..eacdb802e3245c5cd3a32ea7e3b927766ea63503 100644 --- a/.github/mergify.yml +++ b/.github/mergify.yml @@ -197,14 +197,6 @@ pull_request_rules: label: add: - A-op-service - - name: Add A-op-signer label - conditions: - - 'files~=^op-signer/' - - '#label<5' - actions: - label: - add: - - A-op-signer - name: Add A-op-wheel label conditions: - 'files~=^op-wheel/' diff --git a/.github/workflows/tag-service.yml b/.github/workflows/tag-service.yml index e902ae99bb67c0b0245649ddaa81a4ad14d463fc..9e008c3e1a84c430c22059548a146b9235da1ddd 100644 --- a/.github/workflows/tag-service.yml +++ b/.github/workflows/tag-service.yml @@ -20,6 +20,7 @@ on: options: - ci-builder - indexer + - op-heartbeat - chain-mon - op-node - op-batcher diff --git a/.vscode/extensions.json b/.vscode/extensions.json index db78da54acffec1f505383aed0e9c99c6ff1e002..ed133427d4b1ab7bfd377c9a54d106a6071613a2 100644 --- a/.vscode/extensions.json +++ b/.vscode/extensions.json @@ -9,4 +9,4 @@ "juanblanco.solidity", "golang.go", ], -} +} \ No newline at end of file diff --git a/README.md b/README.md index 97979396219853ed75e1c38632ef5cc69548d1b7..bd21be79e6df7a5ec0ea00a09597b651ec826825 100644 --- a/README.md +++ b/README.md @@ -61,7 +61,6 @@ Refer to the Directory Structure section below to understand which packages are 鈹溾攢鈹€ <a href="./op-program">op-program</a>: Fault proof program 鈹溾攢鈹€ <a href="./op-proposer">op-proposer</a>: L2-Output Submitter, submits proposals to L1 鈹溾攢鈹€ <a href="./op-service">op-service</a>: Common codebase utilities -鈹溾攢鈹€ <a href="./op-signer">op-signer</a>: Client signer 鈹溾攢鈹€ <a href="./op-wheel">op-wheel</a>: Database utilities 鈹溾攢鈹€ <a href="./ops-bedrock">ops-bedrock</a>: Bedrock devnet work 鈹溾攢鈹€ <a href="./packages">packages</a> diff --git a/go.mod b/go.mod index 64d22c02ba180a66efee5e649ba708c3e9d71728..035380084f6bf3c2bde1cc8c8d1b463192191c0a 100644 --- a/go.mod +++ b/go.mod @@ -8,7 +8,7 @@ require ( github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 github.com/ethereum-optimism/go-ethereum-hdwallet v0.1.3 - github.com/ethereum-optimism/superchain-registry/superchain v0.0.0-20230921190252-f29074de9e36 + github.com/ethereum-optimism/superchain-registry/superchain v0.0.0-20231001123245-7b48d3818686 github.com/ethereum/go-ethereum v1.13.1 github.com/fsnotify/fsnotify v1.6.0 github.com/go-chi/chi/v5 v5.0.10 @@ -208,7 +208,7 @@ require ( rsc.io/tmplfunc v0.0.3 // indirect ) -replace github.com/ethereum/go-ethereum v1.13.1 => github.com/ethereum-optimism/op-geth v1.101301.0-rc.2 +replace github.com/ethereum/go-ethereum v1.13.1 => github.com/ethereum-optimism/op-geth v1.101301.0-rc.2.0.20231002141926-1e6910b91798 //replace github.com/ethereum-optimism/superchain-registry/superchain => ../superchain-registry/superchain //replace github.com/ethereum/go-ethereum v1.13.1 => ../go-ethereum diff --git a/go.sum b/go.sum index ba3807c4648074d798f9fb83a6577b6cd5c96cb4..cea3ad34748dd2dbe3c139df7b42ac01f95cf3e9 100644 --- a/go.sum +++ b/go.sum @@ -175,10 +175,10 @@ 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.101301.0-rc.2 h1:CoZuN0uuEqoXlKu3iirnGlfsO1nKcIvvbyFZqUVmYN4= -github.com/ethereum-optimism/op-geth v1.101301.0-rc.2/go.mod h1:N++/klTCpY0UAU9tXFOyOEtvkjgHlNZkzzXm5I/1kzM= -github.com/ethereum-optimism/superchain-registry/superchain v0.0.0-20230921190252-f29074de9e36 h1:HGDz8DcAkHvZy+iPnBa8yr4MdLqKpb7oAks01P08JOg= -github.com/ethereum-optimism/superchain-registry/superchain v0.0.0-20230921190252-f29074de9e36/go.mod h1:q0u2UbyOr1q/y94AgMOj/V8b1KO05ZwILTR/qKt7Auo= +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/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= diff --git a/indexer/.gitignore b/indexer/.gitignore index 04c95f4c79e165b17c6bf607b138d32417997414..061d13cc5fa214887dae91e4f56bd54996795824 100644 --- a/indexer/.gitignore +++ b/indexer/.gitignore @@ -1,3 +1,6 @@ docker-compose.dev.yml .env /indexer + +api-ts/yarn.lock +api-ts/package-lock.json \ No newline at end of file diff --git a/indexer/README.md b/indexer/README.md index 6c950662de8a365c5cea91d0de104a368773722c..17ba2dbbcbe38439e98143fb0dcd1a7b62dda269 100644 --- a/indexer/README.md +++ b/indexer/README.md @@ -54,7 +54,11 @@ The indexer service is responsible for polling and processing real-time batches * Process and persist new bridge events * Synchronize L1 proven/finalized withdrawals with their L2 initialization counterparts +#### API +The indexer service runs a lightweight health server adjacently to the main service. The health server exposes a single endpoint `/healthz` that can be used to check the health of the indexer service. The health assessment doesn't check dependency health (ie. database) but rather checks the health of the indexer service itself. + ### Database The indexer service currently supports a Postgres database for storing L1/L2 OP Stack chain data. The most up-to-date database schemas can be found in the `./migrations` directory. -**NOTE:** The indexer service implementation currently does not natively support database migration. Because of this a database must be manually updated to ensure forward compatibility with the latest indexer service implementation. \ No newline at end of file +## Metrics +The indexer services exposes a set of Prometheus metrics that can be used to monitor the health of the service. The metrics are exposed via the `/metrics` endpoint on the health server. \ No newline at end of file diff --git a/indexer/api-ts/generated.ts b/indexer/api-ts/generated.ts index 8ea406bcc2b368034ff88ff7c014aae445d80364..9b19bb6da987c90ac8410315fe964feb731ad0af 100644 --- a/indexer/api-ts/generated.ts +++ b/indexer/api-ts/generated.ts @@ -1,8 +1,11 @@ // Code generated by tygo. DO NOT EDIT. ////////// -// source: deposits.go +// source: models.go +/** + * DepositItem ... Deposit item model for API responses + */ export interface DepositItem { guid: string; from: string; @@ -15,29 +18,23 @@ export interface DepositItem { l1TokenAddress: string; l2TokenAddress: string; } +/** + * DepositResponse ... Data model for API JSON response + */ export interface DepositResponse { cursor: string; hasNextPage: boolean; items: DepositItem[]; } - -////////// -// source: routes.go - -export interface Routes { - Logger: any /* log.Logger */; - BridgeTransfersView: any /* database.BridgeTransfersView */; - Router?: any /* chi.Mux */; -} - -////////// -// source: withdrawals.go - +/** + * WithdrawalItem ... Data model for API JSON response + */ export interface WithdrawalItem { guid: string; from: string; to: string; transactionHash: string; + messageHash: string; timestamp: number /* uint64 */; l2BlockHash: string; amount: string; @@ -46,6 +43,9 @@ export interface WithdrawalItem { l1TokenAddress: string; l2TokenAddress: string; } +/** + * WithdrawalResponse ... Data model for API JSON response + */ export interface WithdrawalResponse { cursor: string; hasNextPage: boolean; diff --git a/indexer/api-ts/package.json b/indexer/api-ts/package.json index fab12241c107e773c5e3ae04cdf85c781ca4b75f..16c4c7c9e82485627f22567b73d00392bf431a9d 100644 --- a/indexer/api-ts/package.json +++ b/indexer/api-ts/package.json @@ -17,7 +17,7 @@ ], "scripts": { "clean": "rm -rf generated.ts indexer.cjs indexer.js", - "generate": "npm run clean && tygo generate && mv ../api/routes/index.ts generated.ts && tsup", + "generate": "npm run clean && tygo generate && mv ../api/models/index.ts generated.ts && tsup", "test": "vitest" }, "keywords": [ diff --git a/indexer/api-ts/tygo.yaml b/indexer/api-ts/tygo.yaml index cb2454ece0ca63863fa0bb590385c8fdd80667e6..562ae786d30d01bdadd7599372973aaa25c76953 100644 --- a/indexer/api-ts/tygo.yaml +++ b/indexer/api-ts/tygo.yaml @@ -1,2 +1,2 @@ packages: - - path: "github.com/ethereum-optimism/optimism/indexer/api/routes" + - path: "github.com/ethereum-optimism/optimism/indexer/api/models" diff --git a/indexer/api/api.go b/indexer/api/api.go index 261ce1e14b97592d605e6073f3f9581f6ceb66cd..b895898c0209b3ca6a22535a35ad6e00d7b4577f 100644 --- a/indexer/api/api.go +++ b/indexer/api/api.go @@ -3,6 +3,7 @@ package api import ( "context" "fmt" + "net" "net/http" "runtime/debug" "sync" @@ -10,7 +11,6 @@ import ( "github.com/ethereum-optimism/optimism/indexer/api/routes" "github.com/ethereum-optimism/optimism/indexer/config" "github.com/ethereum-optimism/optimism/indexer/database" - "github.com/ethereum-optimism/optimism/op-service/httputil" "github.com/ethereum-optimism/optimism/op-service/metrics" "github.com/ethereum/go-ethereum/log" "github.com/go-chi/chi/v5" @@ -20,45 +20,63 @@ import ( const ethereumAddressRegex = `^0x[a-fA-F0-9]{40}$` -type Api struct { +// Api ... Indexer API struct +// TODO : Structured error responses +type API struct { log log.Logger - Router *chi.Mux + router *chi.Mux serverConfig config.ServerConfig metricsConfig config.ServerConfig metricsRegistry *prometheus.Registry } const ( - MetricsNamespace = "op_indexer" + MetricsNamespace = "op_indexer_api" + addressParam = "{address:%s}" + + // Endpoint paths + // NOTE - This can be further broken out over time as new version iterations + // are implemented + HealthPath = "/healthz" + DepositsPath = "/api/v0/deposits/" + WithdrawalsPath = "/api/v0/withdrawals/" ) +// chiMetricsMiddleware ... Injects a metrics recorder into request processing middleware func chiMetricsMiddleware(rec metrics.HTTPRecorder) func(http.Handler) http.Handler { return func(next http.Handler) http.Handler { return metrics.NewHTTPRecordingMiddleware(rec, next) } } -func NewApi(logger log.Logger, bv database.BridgeTransfersView, serverConfig config.ServerConfig, metricsConfig config.ServerConfig) *Api { +// NewApi ... Construct a new api instance +func NewApi(logger log.Logger, bv database.BridgeTransfersView, serverConfig config.ServerConfig, metricsConfig config.ServerConfig) *API { + // (1) Initialize dependencies apiRouter := chi.NewRouter() h := routes.NewRoutes(logger, bv, apiRouter) mr := metrics.NewRegistry() promRecorder := metrics.NewPromHTTPRecorder(mr, MetricsNamespace) + // (2) Inject routing middleware apiRouter.Use(chiMetricsMiddleware(promRecorder)) apiRouter.Use(middleware.Recoverer) - apiRouter.Use(middleware.Heartbeat("/healthz")) + apiRouter.Use(middleware.Heartbeat(HealthPath)) - apiRouter.Get(fmt.Sprintf("/api/v0/deposits/{address:%s}", ethereumAddressRegex), h.L1DepositsHandler) - apiRouter.Get(fmt.Sprintf("/api/v0/withdrawals/{address:%s}", ethereumAddressRegex), h.L2WithdrawalsHandler) + // (3) Set GET routes + apiRouter.Get(fmt.Sprintf(DepositsPath+addressParam, ethereumAddressRegex), h.L1DepositsHandler) + apiRouter.Get(fmt.Sprintf(WithdrawalsPath+addressParam, ethereumAddressRegex), h.L2WithdrawalsHandler) - return &Api{log: logger, Router: apiRouter, metricsRegistry: mr, serverConfig: serverConfig, metricsConfig: metricsConfig} + return &API{log: logger, router: apiRouter, metricsRegistry: mr, serverConfig: serverConfig, metricsConfig: metricsConfig} } -func (a *Api) Start(ctx context.Context) error { +// Run ... Runs the API server routines +func (a *API) Run(ctx context.Context) error { var wg sync.WaitGroup errCh := make(chan error, 2) + // (1) Construct an inner function that will start a goroutine + // and handle any panics that occur on a shared error channel processCtx, processCancel := context.WithCancel(ctx) runProcess := func(start func(ctx context.Context) error) { wg.Add(1) @@ -78,9 +96,11 @@ func (a *Api) Start(ctx context.Context) error { }() } + // (2) Start the API and metrics servers runProcess(a.startServer) runProcess(a.startMetricsServer) + // (3) Wait for all processes to complete wg.Wait() err := <-errCh @@ -93,19 +113,42 @@ func (a *Api) Start(ctx context.Context) error { return err } -func (a *Api) startServer(ctx context.Context) error { +// Port ... Returns the the port that server is listening on +func (a *API) Port() int { + return a.serverConfig.Port +} + +// startServer ... Starts the API server +func (a *API) startServer(ctx context.Context) error { a.log.Info("api server listening...", "port", a.serverConfig.Port) - server := http.Server{Addr: fmt.Sprintf(":%d", a.serverConfig.Port), Handler: a.Router} - err := httputil.ListenAndServeContext(ctx, &server) + server := http.Server{Addr: fmt.Sprintf(":%d", a.serverConfig.Port), Handler: a.router} + + addr := fmt.Sprintf(":%d", a.serverConfig.Port) + listener, err := net.Listen("tcp", addr) + if err != nil { + a.log.Error("Listen:", err) + return err + } + tcpAddr, ok := listener.Addr().(*net.TCPAddr) + if !ok { + return fmt.Errorf("failed to get TCP address from network listener") + } + + // Update the port in the config in case the OS chose a different port + // than the one we requested (e.g. using port 0 to fetch a random open port) + a.serverConfig.Port = tcpAddr.Port + + err = http.Serve(listener, server.Handler) if err != nil { - a.log.Error("api server stopped", "err", err) + a.log.Error("api server stopped with error", "err", err) } else { a.log.Info("api server stopped") } return err } -func (a *Api) startMetricsServer(ctx context.Context) error { +// startMetricsServer ... Starts the metrics server +func (a *API) startMetricsServer(ctx context.Context) error { a.log.Info("starting metrics server...", "port", a.metricsConfig.Port) err := metrics.ListenAndServe(ctx, a.metricsRegistry, a.metricsConfig.Host, a.metricsConfig.Port) if err != nil { diff --git a/indexer/api/api_test.go b/indexer/api/api_test.go index fbfc81ecc53ed5bc0049331bed83c0bd4fad9e6e..554fce28ce51b5ccc18a4e4ecbcd90acaaed7427 100644 --- a/indexer/api/api_test.go +++ b/indexer/api/api_test.go @@ -7,7 +7,7 @@ import ( "net/http/httptest" "testing" - "github.com/ethereum-optimism/optimism/indexer/api/routes" + "github.com/ethereum-optimism/optimism/indexer/api/models" "github.com/ethereum-optimism/optimism/indexer/config" "github.com/ethereum-optimism/optimism/indexer/database" "github.com/ethereum-optimism/optimism/op-service/testlog" @@ -100,7 +100,7 @@ func TestHealthz(t *testing.T) { assert.Nil(t, err) responseRecorder := httptest.NewRecorder() - api.Router.ServeHTTP(responseRecorder, request) + api.router.ServeHTTP(responseRecorder, request) assert.Equal(t, http.StatusOK, responseRecorder.Code) } @@ -112,11 +112,11 @@ func TestL1BridgeDepositsHandler(t *testing.T) { assert.Nil(t, err) responseRecorder := httptest.NewRecorder() - api.Router.ServeHTTP(responseRecorder, request) + api.router.ServeHTTP(responseRecorder, request) assert.Equal(t, http.StatusOK, responseRecorder.Code) - var resp routes.DepositResponse + var resp models.DepositResponse err = json.Unmarshal(responseRecorder.Body.Bytes(), &resp) assert.Nil(t, err) @@ -135,9 +135,9 @@ func TestL2BridgeWithdrawalsByAddressHandler(t *testing.T) { assert.Nil(t, err) responseRecorder := httptest.NewRecorder() - api.Router.ServeHTTP(responseRecorder, request) + api.router.ServeHTTP(responseRecorder, request) - var resp routes.WithdrawalResponse + var resp models.WithdrawalResponse err = json.Unmarshal(responseRecorder.Body.Bytes(), &resp) assert.Nil(t, err) diff --git a/indexer/api/models/models.go b/indexer/api/models/models.go new file mode 100644 index 0000000000000000000000000000000000000000..6ccdeae2f057323ee82a0f8b9a66903eec88e1bc --- /dev/null +++ b/indexer/api/models/models.go @@ -0,0 +1,45 @@ +package models + +// DepositItem ... Deposit item model for API responses +type DepositItem struct { + Guid string `json:"guid"` + From string `json:"from"` + To string `json:"to"` + Timestamp uint64 `json:"timestamp"` + L1BlockHash string `json:"l1BlockHash"` + L1TxHash string `json:"l1TxHash"` + L2TxHash string `json:"l2TxHash"` + Amount string `json:"amount"` + L1TokenAddress string `json:"l1TokenAddress"` + L2TokenAddress string `json:"l2TokenAddress"` +} + +// DepositResponse ... Data model for API JSON response +type DepositResponse struct { + Cursor string `json:"cursor"` + HasNextPage bool `json:"hasNextPage"` + Items []DepositItem `json:"items"` +} + +// WithdrawalItem ... Data model for API JSON response +type WithdrawalItem struct { + Guid string `json:"guid"` + From string `json:"from"` + To string `json:"to"` + TransactionHash string `json:"transactionHash"` + MessageHash string `json:"messageHash"` + Timestamp uint64 `json:"timestamp"` + L2BlockHash string `json:"l2BlockHash"` + Amount string `json:"amount"` + ProofTransactionHash string `json:"proofTransactionHash"` + ClaimTransactionHash string `json:"claimTransactionHash"` + L1TokenAddress string `json:"l1TokenAddress"` + L2TokenAddress string `json:"l2TokenAddress"` +} + +// WithdrawalResponse ... Data model for API JSON response +type WithdrawalResponse struct { + Cursor string `json:"cursor"` + HasNextPage bool `json:"hasNextPage"` + Items []WithdrawalItem `json:"items"` +} diff --git a/indexer/api/routes/common.go b/indexer/api/routes/common.go index 9766b1d978b038cdae92394f656f442241cc56be..8aad71ee3bd72b62c35215a68a37ced8ac848b7a 100644 --- a/indexer/api/routes/common.go +++ b/indexer/api/routes/common.go @@ -3,24 +3,30 @@ package routes import ( "encoding/json" "net/http" +) + +const ( + InternalServerError = "Internal server error" - "github.com/ethereum/go-ethereum/log" + // defaultPageLimit ... Default page limit for pagination + defaultPageLimit = 100 ) -func jsonResponse(w http.ResponseWriter, logger log.Logger, data interface{}, statusCode int) { +// jsonResponse ... Marshals and writes a JSON response provided arbitrary data +func jsonResponse(w http.ResponseWriter, data interface{}, statusCode int) error { w.Header().Set("Content-Type", "application/json") jsonData, err := json.Marshal(data) if err != nil { - http.Error(w, "Internal server error", http.StatusInternalServerError) - logger.Error("Failed to marshal JSON: %v", err) - return + http.Error(w, InternalServerError, http.StatusInternalServerError) + return err } w.WriteHeader(statusCode) _, err = w.Write(jsonData) if err != nil { - http.Error(w, "Internal server error", http.StatusInternalServerError) - logger.Error("Failed to write JSON data", err) - return + http.Error(w, InternalServerError, http.StatusInternalServerError) + return err } + + return nil } diff --git a/indexer/api/routes/deposits.go b/indexer/api/routes/deposits.go index b0ef23b6d9eced84e91f166babaed4642665bef0..5bf6229a25a7db571bf1427f87a33f89437fe473 100644 --- a/indexer/api/routes/deposits.go +++ b/indexer/api/routes/deposits.go @@ -2,36 +2,18 @@ package routes import ( "net/http" - "strconv" + + "github.com/ethereum-optimism/optimism/indexer/api/models" "github.com/ethereum-optimism/optimism/indexer/database" - "github.com/ethereum/go-ethereum/common" "github.com/go-chi/chi/v5" ) -type DepositItem struct { - Guid string `json:"guid"` - From string `json:"from"` - To string `json:"to"` - Timestamp uint64 `json:"timestamp"` - L1BlockHash string `json:"l1BlockHash"` - L1TxHash string `json:"l1TxHash"` - L2TxHash string `json:"l2TxHash"` - Amount string `json:"amount"` - L1TokenAddress string `json:"l1TokenAddress"` - L2TokenAddress string `json:"l2TokenAddress"` -} - -type DepositResponse struct { - Cursor string `json:"cursor"` - HasNextPage bool `json:"hasNextPage"` - Items []DepositItem `json:"items"` -} - -func newDepositResponse(deposits *database.L1BridgeDepositsResponse) DepositResponse { - items := make([]DepositItem, len(deposits.Deposits)) +// newDepositResponse ... Converts a database.L1BridgeDepositsResponse to an api.DepositResponse +func newDepositResponse(deposits *database.L1BridgeDepositsResponse) models.DepositResponse { + items := make([]models.DepositItem, len(deposits.Deposits)) for i, deposit := range deposits.Deposits { - item := DepositItem{ + item := models.DepositItem{ Guid: deposit.L1BridgeDeposit.TransactionSourceHash.String(), L1BlockHash: deposit.L1BlockHash.String(), Timestamp: deposit.L1BridgeDeposit.Tx.Timestamp, @@ -46,39 +28,51 @@ func newDepositResponse(deposits *database.L1BridgeDepositsResponse) DepositResp items[i] = item } - return DepositResponse{ + return models.DepositResponse{ Cursor: deposits.Cursor, HasNextPage: deposits.HasNextPage, Items: items, } } +// L1DepositsHandler ... Handles /api/v0/deposits/{address} GET requests func (h Routes) L1DepositsHandler(w http.ResponseWriter, r *http.Request) { - address := common.HexToAddress(chi.URLParam(r, "address")) + addressValue := chi.URLParam(r, "address") cursor := r.URL.Query().Get("cursor") limitQuery := r.URL.Query().Get("limit") - defaultLimit := 100 - limit := defaultLimit - if limitQuery != "" { - parsedLimit, err := strconv.Atoi(limitQuery) - if err != nil { - http.Error(w, "Limit could not be parsed into a number", http.StatusBadRequest) - h.Logger.Error("Invalid limit") - h.Logger.Error(err.Error()) - } - limit = parsedLimit + address, err := h.v.ParseValidateAddress(addressValue) + if err != nil { + http.Error(w, err.Error(), http.StatusBadRequest) + h.logger.Error("Invalid address param", "param", addressValue) + h.logger.Error(err.Error()) + return } - deposits, err := h.BridgeTransfersView.L1BridgeDepositsByAddress(address, cursor, limit) + err = h.v.ValidateCursor(cursor) + if err != nil { + http.Error(w, err.Error(), http.StatusBadRequest) + h.logger.Error("Invalid cursor param", "param", cursor, "err", err.Error()) + } + + limit, err := h.v.ParseValidateLimit(limitQuery) + if err != nil { + http.Error(w, err.Error(), http.StatusBadRequest) + h.logger.Error("Invalid limit param", "param", limitQuery, "err", err.Error()) + return + } + + deposits, err := h.view.L1BridgeDepositsByAddress(address, cursor, limit) if err != nil { http.Error(w, "Internal server error reading deposits", http.StatusInternalServerError) - h.Logger.Error("Unable to read deposits from DB") - h.Logger.Error(err.Error()) + h.logger.Error("Unable to read deposits from DB", "err", err.Error()) return } response := newDepositResponse(deposits) - jsonResponse(w, h.Logger, response, http.StatusOK) + err = jsonResponse(w, response, http.StatusOK) + if err != nil { + h.logger.Error("Error writing response", "err", err) + } } diff --git a/indexer/api/routes/docs.go b/indexer/api/routes/docs.go index 638aa6f90b21c920784fd461ea7a7e6fd069339b..b88a8b10a9150cb7a0cdcf32feab681243b264a2 100644 --- a/indexer/api/routes/docs.go +++ b/indexer/api/routes/docs.go @@ -9,14 +9,14 @@ import ( func (h Routes) DocsHandler(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "text/plain") w.WriteHeader(http.StatusOK) - docs := docgen.MarkdownRoutesDoc(h.Router, docgen.MarkdownOpts{ + docs := docgen.MarkdownRoutesDoc(h.router, docgen.MarkdownOpts{ ProjectPath: "github.com/ethereum-optimism/optimism/indexer", // Intro text included at the top of the generated markdown file. Intro: "Generated documentation for Optimism indexer", }) _, err := w.Write([]byte(docs)) if err != nil { - h.Logger.Error("error writing docs", "err", err) + h.logger.Error("error writing docs", "err", err) http.Error(w, "Internal server error fetching docs", http.StatusInternalServerError) } } diff --git a/indexer/api/routes/routes.go b/indexer/api/routes/routes.go index e22719a79c641ce9de4ce6e785bd6fd2926a6472..488805b08872fbaabfe5aa87ecc992e2a58c7455 100644 --- a/indexer/api/routes/routes.go +++ b/indexer/api/routes/routes.go @@ -6,16 +6,19 @@ import ( "github.com/go-chi/chi/v5" ) +// Routes ... Route handler struct type Routes struct { - Logger log.Logger - BridgeTransfersView database.BridgeTransfersView - Router *chi.Mux + logger log.Logger + view database.BridgeTransfersView + router *chi.Mux + v *Validator } +// NewRoutes ... Construct a new route handler instance func NewRoutes(logger log.Logger, bv database.BridgeTransfersView, r *chi.Mux) Routes { return Routes{ - Logger: logger, - BridgeTransfersView: bv, - Router: r, + logger: logger, + view: bv, + router: r, } } diff --git a/indexer/api/routes/validator.go b/indexer/api/routes/validator.go new file mode 100644 index 0000000000000000000000000000000000000000..5d72a79ba8a406d25e04918f5daf1d8304967a92 --- /dev/null +++ b/indexer/api/routes/validator.go @@ -0,0 +1,62 @@ +package routes + +import ( + "strconv" + + "errors" + + "github.com/ethereum/go-ethereum/common" +) + +// Validator ... Validates API user request parameters +type Validator struct{} + +// ParseValidateLimit ... Validates and parses the limit query parameters +func (v *Validator) ParseValidateLimit(limit string) (int, error) { + if limit == "" { + return defaultPageLimit, nil + } + + val, err := strconv.Atoi(limit) + if err != nil { + return 0, errors.New("limit must be an integer value") + } + + if val <= 0 { + return 0, errors.New("limit must be greater than 0") + } + + // TODO - Add a check against a max limit value + return val, nil +} + +// ParseValidateAddress ... Validates and parses the address query parameter +func (v *Validator) ParseValidateAddress(addr string) (common.Address, error) { + if !common.IsHexAddress(addr) { + return common.Address{}, errors.New("address must be represented as a valid hexadecimal string") + } + + parsedAddr := common.HexToAddress(addr) + if parsedAddr == common.HexToAddress("0x0") { + return common.Address{}, errors.New("address cannot be the zero address") + } + + return parsedAddr, nil +} + +// ValidateCursor ... Validates and parses the cursor query parameter +func (v *Validator) ValidateCursor(cursor string) error { + if cursor == "" { + return nil + } + + if len(cursor) != 66 { // 0x + 64 chars + return errors.New("cursor must be a 32 byte hex string") + } + + if cursor[:2] != "0x" { + return errors.New("cursor must begin with 0x") + } + + return nil +} diff --git a/indexer/api/routes/validator_test.go b/indexer/api/routes/validator_test.go new file mode 100644 index 0000000000000000000000000000000000000000..c59905a335fa795db55ead3b008f37ee1a33f26b --- /dev/null +++ b/indexer/api/routes/validator_test.go @@ -0,0 +1,64 @@ +package routes + +import ( + "testing" + + "github.com/stretchr/testify/require" +) + +func TestParseValidateLimit(t *testing.T) { + v := Validator{} + + // (1) Happy case + limit := "100" + _, err := v.ParseValidateLimit(limit) + require.NoError(t, err, "limit should be valid") + + // (2) Boundary validation + limit = "0" + _, err = v.ParseValidateLimit(limit) + require.Error(t, err, "limit must be greater than 0") + + // (3) Type validation + limit = "abc" + _, err = v.ParseValidateLimit(limit) + require.Error(t, err, "limit must be an integer value") +} + +func TestParseValidateAddress(t *testing.T) { + v := Validator{} + + // (1) Happy case + addr := "0x95222290DD7278Aa3Ddd389Cc1E1d165CC4BAfe5" + _, err := v.ParseValidateAddress(addr) + require.NoError(t, err, "address should be pass") + + // (2) Invalid hex + addr = "馃" + _, err = v.ParseValidateAddress(addr) + require.Error(t, err, "address must be represented as a valid hexadecimal string") + + // (3) Zero address + addr = "0x0000000000000000000000000000000000000000" + _, err = v.ParseValidateAddress(addr) + require.Error(t, err, "address cannot be black-hole value") +} + +func Test_ParseValidateCursor(t *testing.T) { + v := Validator{} + + // (1) Happy case + cursor := "0xf3fd2eb696dab4263550b938726f9b3606e334cce6ebe27446bc26cb700b94e0" + err := v.ValidateCursor(cursor) + require.NoError(t, err, "cursor should be pass") + + // (2) Invalid length + cursor = "0x000" + err = v.ValidateCursor(cursor) + require.Error(t, err, "cursor must be 32 byte hex string") + + // (3) Invalid hex + cursor = "0馃" + err = v.ValidateCursor(cursor) + require.Error(t, err, "cursor must start with 0x") +} diff --git a/indexer/api/routes/withdrawals.go b/indexer/api/routes/withdrawals.go index a04f4e3afd98f91bab4f2a8b1fa91cdc3fc4c533..1fc2e1d84166888ebab18e8f1ec803db18b4d375 100644 --- a/indexer/api/routes/withdrawals.go +++ b/indexer/api/routes/withdrawals.go @@ -2,38 +2,18 @@ package routes import ( "net/http" - "strconv" + "github.com/ethereum-optimism/optimism/indexer/api/models" "github.com/ethereum-optimism/optimism/indexer/database" - "github.com/ethereum/go-ethereum/common" "github.com/go-chi/chi/v5" ) -type WithdrawalItem struct { - Guid string `json:"guid"` - From string `json:"from"` - To string `json:"to"` - TransactionHash string `json:"transactionHash"` - Timestamp uint64 `json:"timestamp"` - L2BlockHash string `json:"l2BlockHash"` - Amount string `json:"amount"` - ProofTransactionHash string `json:"proofTransactionHash"` - ClaimTransactionHash string `json:"claimTransactionHash"` - L1TokenAddress string `json:"l1TokenAddress"` - L2TokenAddress string `json:"l2TokenAddress"` -} - -type WithdrawalResponse struct { - Cursor string `json:"cursor"` - HasNextPage bool `json:"hasNextPage"` - Items []WithdrawalItem `json:"items"` -} - // FIXME make a pure function that returns a struct instead of newWithdrawalResponse -func newWithdrawalResponse(withdrawals *database.L2BridgeWithdrawalsResponse) WithdrawalResponse { - items := make([]WithdrawalItem, len(withdrawals.Withdrawals)) +// newWithdrawalResponse ... Converts a database.L2BridgeWithdrawalsResponse to an api.WithdrawalResponse +func newWithdrawalResponse(withdrawals *database.L2BridgeWithdrawalsResponse) models.WithdrawalResponse { + items := make([]models.WithdrawalItem, len(withdrawals.Withdrawals)) for i, withdrawal := range withdrawals.Withdrawals { - item := WithdrawalItem{ + item := models.WithdrawalItem{ Guid: withdrawal.L2BridgeWithdrawal.TransactionWithdrawalHash.String(), L2BlockHash: withdrawal.L2BlockHash.String(), From: withdrawal.L2BridgeWithdrawal.Tx.FromAddress.String(), @@ -48,36 +28,50 @@ func newWithdrawalResponse(withdrawals *database.L2BridgeWithdrawalsResponse) Wi items[i] = item } - return WithdrawalResponse{ + return models.WithdrawalResponse{ Cursor: withdrawals.Cursor, HasNextPage: withdrawals.HasNextPage, Items: items, } } +// L2WithdrawalsHandler ... Handles /api/v0/withdrawals/{address} GET requests func (h Routes) L2WithdrawalsHandler(w http.ResponseWriter, r *http.Request) { - address := common.HexToAddress(chi.URLParam(r, "address")) + addressValue := chi.URLParam(r, "address") cursor := r.URL.Query().Get("cursor") limitQuery := r.URL.Query().Get("limit") - defaultLimit := 100 - limit := defaultLimit - if limitQuery != "" { - parsedLimit, err := strconv.Atoi(limitQuery) - if err != nil { - http.Error(w, "Limit could not be parsed into a number", http.StatusBadRequest) - h.Logger.Error("Invalid limit") - h.Logger.Error(err.Error()) - } - limit = parsedLimit + address, err := h.v.ParseValidateAddress(addressValue) + if err != nil { + http.Error(w, err.Error(), http.StatusBadRequest) + h.logger.Error("Invalid address param", "param", addressValue, "err", err) + return } - withdrawals, err := h.BridgeTransfersView.L2BridgeWithdrawalsByAddress(address, cursor, limit) + + err = h.v.ValidateCursor(cursor) + if err != nil { + http.Error(w, err.Error(), http.StatusBadRequest) + h.logger.Error("Invalid cursor param", "param", cursor, "err", err) + return + } + + limit, err := h.v.ParseValidateLimit(limitQuery) + if err != nil { + http.Error(w, err.Error(), http.StatusBadRequest) + h.logger.Error("Invalid query params", "err", err) + return + } + + withdrawals, err := h.view.L2BridgeWithdrawalsByAddress(address, cursor, limit) if err != nil { http.Error(w, "Internal server error reading withdrawals", http.StatusInternalServerError) - h.Logger.Error("Unable to read withdrawals from DB") - h.Logger.Error(err.Error()) + h.logger.Error("Unable to read withdrawals from DB", "err", err.Error()) + return } response := newWithdrawalResponse(withdrawals) - jsonResponse(w, h.Logger, response, http.StatusOK) + err = jsonResponse(w, response, http.StatusOK) + if err != nil { + h.logger.Error("Error writing response", "err", err.Error()) + } } diff --git a/indexer/client/client.go b/indexer/client/client.go new file mode 100644 index 0000000000000000000000000000000000000000..567794d456bb628ca398bd2ccf2fedf3ca082b84 --- /dev/null +++ b/indexer/client/client.go @@ -0,0 +1,206 @@ +package client + +import ( + "fmt" + "io" + "net/http" + "time" + + "encoding/json" + + "github.com/ethereum-optimism/optimism/indexer/api" + "github.com/ethereum-optimism/optimism/indexer/api/models" + "github.com/ethereum-optimism/optimism/indexer/node" + "github.com/ethereum/go-ethereum/common" +) + +const ( + urlParams = "?cursor=%s&limit=%d" + + defaultPagingLimit = 100 + + // method names + healthz = "get_health" + deposits = "get_deposits" + withdrawals = "get_withdrawals" +) + +// Option ... Provides configuration through callback injection +type Option func(*Client) error + +// WithMetrics ... Triggers metric optionality +func WithMetrics(m node.Metricer) Option { + return func(c *Client) error { + c.metrics = m + return nil + } +} + +// WithTimeout ... Embeds a timeout limit to request +func WithTimeout(t time.Duration) Option { + return func(c *Client) error { + c.c.Timeout = t + return nil + } +} + +// Config ... Indexer client config struct +type Config struct { + PaginationLimit int + BaseURL string +} + +// Client ... Indexer client struct +type Client struct { + cfg *Config + c *http.Client + metrics node.Metricer +} + +// NewClient ... Construct a new indexer client +func NewClient(cfg *Config, opts ...Option) (*Client, error) { + if cfg.PaginationLimit <= 0 { + cfg.PaginationLimit = defaultPagingLimit + } + + c := &http.Client{} + client := &Client{cfg: cfg, c: c} + + for _, opt := range opts { + err := opt(client) + if err != nil { + return nil, err + } + } + + return client, nil +} + +// doRecordRequest ... Performs a read request on a provided endpoint w/ telemetry +func (c *Client) doRecordRequest(method string, endpoint string) ([]byte, error) { + var record func(error) = nil + if c.metrics != nil { + record = c.metrics.RecordRPCClientRequest(method) + } + + resp, err := c.c.Get(endpoint) + if record != nil { + record(err) + } + + if err != nil { + return nil, err + } + + body, err := io.ReadAll(resp.Body) + if err != nil { + return nil, fmt.Errorf("failed to read response body: %w", err) + } + + err = resp.Body.Close() + if err != nil { + return nil, err + } + + if resp.StatusCode != http.StatusOK { + return nil, fmt.Errorf("endpoint failed with status code %d", resp.StatusCode) + + } + + return body, resp.Body.Close() +} + +// HealthCheck ... Checks the health of the indexer API +func (c *Client) HealthCheck() error { + + _, err := c.doRecordRequest(healthz, c.cfg.BaseURL+api.HealthPath) + + if err != nil { + return err + } + + return nil +} + +// GetDepositsByAddress ... Gets a deposit response object provided an L1 address and cursor +func (c *Client) GetDepositsByAddress(l1Address common.Address, cursor string) (*models.DepositResponse, error) { + var dResponse *models.DepositResponse + url := c.cfg.BaseURL + api.DepositsPath + l1Address.String() + urlParams + endpoint := fmt.Sprintf(url, cursor, c.cfg.PaginationLimit) + + resp, err := c.doRecordRequest(deposits, endpoint) + if err != nil { + return nil, err + } + + if err := json.Unmarshal(resp, &dResponse); err != nil { + return nil, err + } + + return dResponse, nil +} + +// GetAllDepositsByAddress ... Gets all deposits provided a L1 address +func (c *Client) GetAllDepositsByAddress(l1Address common.Address) ([]models.DepositItem, error) { + var deposits []models.DepositItem + + cursor := "" + for { + dResponse, err := c.GetDepositsByAddress(l1Address, cursor) + if err != nil { + return nil, err + } + + deposits = append(deposits, dResponse.Items...) + + if !dResponse.HasNextPage { + break + } + + cursor = dResponse.Cursor + } + + return deposits, nil + +} + +// GetAllWithdrawalsByAddress ... Gets all withdrawals provided a L2 address +func (c *Client) GetAllWithdrawalsByAddress(l2Address common.Address) ([]models.WithdrawalItem, error) { + var withdrawals []models.WithdrawalItem + + cursor := "" + for { + wResponse, err := c.GetWithdrawalsByAddress(l2Address, cursor) + if err != nil { + return nil, err + } + + withdrawals = append(withdrawals, wResponse.Items...) + + if !wResponse.HasNextPage { + break + } + + cursor = wResponse.Cursor + } + + return withdrawals, nil +} + +// GetWithdrawalsByAddress ... Gets a withdrawal response object provided an L2 address and cursor +func (c *Client) GetWithdrawalsByAddress(l2Address common.Address, cursor string) (*models.WithdrawalResponse, error) { + var wResponse *models.WithdrawalResponse + url := c.cfg.BaseURL + api.WithdrawalsPath + l2Address.String() + urlParams + + endpoint := fmt.Sprintf(url, cursor, c.cfg.PaginationLimit) + resp, err := c.doRecordRequest(withdrawals, endpoint) + if err != nil { + return nil, err + } + + if err := json.Unmarshal(resp, &wResponse); err != nil { + return nil, err + } + + return wResponse, nil +} diff --git a/indexer/cmd/indexer/cli.go b/indexer/cmd/indexer/cli.go index 19a015576bb9abd3eb87f856acab3c64cdb87160..db6f3831a019d5a139528b4bdea7f36daebb6c81 100644 --- a/indexer/cmd/indexer/cli.go +++ b/indexer/cmd/indexer/cli.go @@ -69,7 +69,7 @@ func runApi(ctx *cli.Context) error { defer db.Close() api := api.NewApi(log, db.BridgeTransfers, cfg.HTTPServer, cfg.MetricsServer) - return api.Start(ctx.Context) + return api.Run(ctx.Context) } func runMigrations(ctx *cli.Context) error { diff --git a/indexer/cmd/indexer/main.go b/indexer/cmd/indexer/main.go index 4330777a92906895a255b82392476da30a9f2c72..1c6217beb1a53beffa405d49c0c20d81c0513e8f 100644 --- a/indexer/cmd/indexer/main.go +++ b/indexer/cmd/indexer/main.go @@ -4,6 +4,7 @@ import ( "context" "os" + oplog "github.com/ethereum-optimism/optimism/op-service/log" "github.com/ethereum-optimism/optimism/op-service/opio" "github.com/ethereum/go-ethereum/log" ) @@ -22,6 +23,7 @@ func main() { cancel() }() + oplog.SetupDefaults() app := newCli(GitCommit, GitDate) if err := app.RunContext(ctx, os.Args); err != nil { log.Error("application failed", "err", err) diff --git a/indexer/config/presets.go b/indexer/config/presets.go index ffd1f9bdec09cb37158e2209d1b2263e873acc27..5bccfc71498367071ecc4e55d4bffd457e6557cc 100644 --- a/indexer/config/presets.go +++ b/indexer/config/presets.go @@ -89,6 +89,22 @@ var Presets = map[int]Preset{ L1StartingHeight: 8410981, }, }, + 84532: { + Name: "Base Sepolia", + ChainConfig: ChainConfig{ + Preset: 84532, + L1Contracts: L1Contracts{ + AddressManager: common.HexToAddress("0x709c2B8ef4A9feFc629A8a2C1AF424Dc5BD6ad1B"), + SystemConfigProxy: common.HexToAddress("0xf272670eb55e895584501d564AfEB048bEd26194"), + OptimismPortalProxy: common.HexToAddress("0x49f53e41452C74589E85cA1677426Ba426459e85"), + L2OutputOracleProxy: common.HexToAddress("0x84457ca9D0163FbC4bbfe4Dfbb20ba46e48DF254"), + L1CrossDomainMessengerProxy: common.HexToAddress("0xC34855F4De64F1840e5686e64278da901e261f20"), + L1StandardBridgeProxy: common.HexToAddress("0xfd0Bf71F60660E2f608ed56e1659C450eB113120"), + L1ERC721BridgeProxy: common.HexToAddress("0x21eFD066e581FA55Ef105170Cc04d74386a09190"), + }, + L1StartingHeight: 4370868, + }, + }, 7777777: { Name: "Zora", ChainConfig: ChainConfig{ diff --git a/indexer/database/bridge_transfers.go b/indexer/database/bridge_transfers.go index 54dcab3c32a5734dddb841ffc5d0806fb4278884..2d4fac96f59d1ec5ef686b31e54a269e57deacb4 100644 --- a/indexer/database/bridge_transfers.go +++ b/indexer/database/bridge_transfers.go @@ -128,12 +128,11 @@ type L1BridgeDepositsResponse struct { HasNextPage bool } -// L1BridgeDepositsByAddress retrieves a list of deposits intiated by the specified address, +// L1BridgeDepositsByAddress retrieves a list of deposits initiated by the specified address, // coupled with the L1/L2 transaction hashes that complete the bridge transaction. func (db *bridgeTransfersDB) L1BridgeDepositsByAddress(address common.Address, cursor string, limit int) (*L1BridgeDepositsResponse, error) { - defaultLimit := 100 if limit <= 0 { - limit = defaultLimit + return nil, fmt.Errorf("limit must be greater than 0") } cursorClause := "" @@ -152,7 +151,7 @@ func (db *bridgeTransfersDB) L1BridgeDepositsByAddress(address common.Address, c // Coalesce l1 transaction deposits that are simply ETH sends ethTransactionDeposits := db.gorm.Model(&L1TransactionDeposit{}) - ethTransactionDeposits = ethTransactionDeposits.Where(Transaction{FromAddress: address}).Where("data = '0x' AND amount > 0") + ethTransactionDeposits = ethTransactionDeposits.Where(&Transaction{FromAddress: address}).Where("data = '0x' AND amount > 0") ethTransactionDeposits = ethTransactionDeposits.Joins("INNER JOIN l1_contract_events ON l1_contract_events.guid = initiated_l1_event_guid") ethTransactionDeposits = ethTransactionDeposits.Select(` from_address, to_address, amount, data, source_hash AS transaction_source_hash, @@ -164,6 +163,7 @@ l1_transaction_deposits.timestamp, NULL AS cross_domain_message_hash, ? AS local } depositsQuery := db.gorm.Model(&L1BridgeDeposit{}) + depositsQuery = depositsQuery.Where(&Transaction{FromAddress: address}) depositsQuery = depositsQuery.Joins("INNER JOIN l1_transaction_deposits ON l1_transaction_deposits.source_hash = transaction_source_hash") depositsQuery = depositsQuery.Joins("INNER JOIN l1_contract_events ON l1_contract_events.guid = l1_transaction_deposits.initiated_l1_event_guid") depositsQuery = depositsQuery.Select(` @@ -241,14 +241,14 @@ type L2BridgeWithdrawalsResponse struct { HasNextPage bool } -// L2BridgeDepositsByAddress retrieves a list of deposits intiated by the specified address, coupled with the L1/L2 transaction hashes -// that complete the bridge transaction. The hashes that correspond to with the Bedrock multistep withdrawal process are also surfaced +// L2BridgeDepositsByAddress retrieves a list of deposits initiated by the specified address, coupled with the L1/L2 transaction hashes +// that complete the bridge transaction. The hashes that correspond with the Bedrock multi-step withdrawal process are also surfaced func (db *bridgeTransfersDB) L2BridgeWithdrawalsByAddress(address common.Address, cursor string, limit int) (*L2BridgeWithdrawalsResponse, error) { - defaultLimit := 100 if limit <= 0 { - limit = defaultLimit + return nil, fmt.Errorf("limit must be greater than 0") } + // (1) Generate cursor clause provided a cursor tx hash cursorClause := "" if cursor != "" { withdrawalHash := common.HexToHash(cursor) @@ -260,12 +260,17 @@ func (db *bridgeTransfersDB) L2BridgeWithdrawalsByAddress(address common.Address cursorClause = fmt.Sprintf("l2_transaction_withdrawals.timestamp <= %d", txWithdrawal.Tx.Timestamp) } + // (2) Generate query for fetching ETH withdrawal data + // This query is a UNION (A | B) of two sub-queries: + // - (A) ETH sends from L2 to L1 + // - (B) Bridge withdrawals from L2 to L1 + // TODO join with l1_bridged_tokens and l2_bridged_tokens ethAddressString := predeploys.LegacyERC20ETHAddr.String() // Coalesce l2 transaction withdrawals that are simply ETH sends ethTransactionWithdrawals := db.gorm.Model(&L2TransactionWithdrawal{}) - ethTransactionWithdrawals = ethTransactionWithdrawals.Where(Transaction{FromAddress: address}).Where(`data = '0x' AND amount > 0`) + ethTransactionWithdrawals = ethTransactionWithdrawals.Where(&Transaction{FromAddress: address}).Where(`data = '0x' AND amount > 0`) ethTransactionWithdrawals = ethTransactionWithdrawals.Joins("INNER JOIN l2_contract_events ON l2_contract_events.guid = l2_transaction_withdrawals.initiated_l2_event_guid") ethTransactionWithdrawals = ethTransactionWithdrawals.Joins("LEFT JOIN l1_contract_events AS proven_l1_events ON proven_l1_events.guid = l2_transaction_withdrawals.proven_l1_event_guid") ethTransactionWithdrawals = ethTransactionWithdrawals.Joins("LEFT JOIN l1_contract_events AS finalized_l1_events ON finalized_l1_events.guid = l2_transaction_withdrawals.finalized_l1_event_guid") @@ -279,6 +284,7 @@ l2_transaction_withdrawals.timestamp, NULL AS cross_domain_message_hash, ? AS lo } withdrawalsQuery := db.gorm.Model(&L2BridgeWithdrawal{}) + withdrawalsQuery = withdrawalsQuery.Where(&Transaction{FromAddress: address}) withdrawalsQuery = withdrawalsQuery.Joins("INNER JOIN l2_transaction_withdrawals ON withdrawal_hash = l2_bridge_withdrawals.transaction_withdrawal_hash") withdrawalsQuery = withdrawalsQuery.Joins("INNER JOIN l2_contract_events ON l2_contract_events.guid = l2_transaction_withdrawals.initiated_l2_event_guid") withdrawalsQuery = withdrawalsQuery.Joins("LEFT JOIN l1_contract_events AS proven_l1_events ON proven_l1_events.guid = l2_transaction_withdrawals.proven_l1_event_guid") @@ -296,7 +302,10 @@ l2_bridge_withdrawals.timestamp, cross_domain_message_hash, local_token_address, query = query.Joins("UNION (?)", ethTransactionWithdrawals) query = query.Select("*").Order("timestamp DESC").Limit(limit + 1) withdrawals := []L2BridgeWithdrawalWithTransactionHashes{} + + // (3) Execute query and process results result := query.Find(&withdrawals) + if result.Error != nil { if errors.Is(result.Error, gorm.ErrRecordNotFound) { return nil, nil diff --git a/indexer/e2e_tests/bridge_messages_e2e_test.go b/indexer/e2e_tests/bridge_messages_e2e_test.go index 793e7b7a82310bea520ee8cf653bd596b5fabf20..577ae2af3ce669941aa16c507677fe4ae7d0725d 100644 --- a/indexer/e2e_tests/bridge_messages_e2e_test.go +++ b/indexer/e2e_tests/bridge_messages_e2e_test.go @@ -173,4 +173,5 @@ func TestE2EBridgeL2CrossDomainMessenger(t *testing.T) { require.NoError(t, err) require.NotNil(t, event) require.Equal(t, event.TransactionHash, finalizedReceipt.TxHash) + } diff --git a/indexer/e2e_tests/bridge_transfers_e2e_test.go b/indexer/e2e_tests/bridge_transfers_e2e_test.go index 8bebbc2d100f13c5ce39729f595854318072b542..1c7405b121b5114ec237a174a16b36364a63d43f 100644 --- a/indexer/e2e_tests/bridge_transfers_e2e_test.go +++ b/indexer/e2e_tests/bridge_transfers_e2e_test.go @@ -2,6 +2,7 @@ package e2e_tests import ( "context" + "crypto/ecdsa" "fmt" "math/big" "testing" @@ -16,6 +17,7 @@ import ( "github.com/ethereum-optimism/optimism/op-bindings/bindings" "github.com/ethereum-optimism/optimism/op-bindings/predeploys" "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/params" @@ -50,7 +52,7 @@ func TestE2EBridgeTransfersStandardBridgeETHDeposit(t *testing.T) { })) cursor := "" - limit := 0 + limit := 100 aliceDeposits, err := testSuite.DB.BridgeTransfers.L1BridgeDepositsByAddress(aliceAddr, cursor, limit) @@ -116,7 +118,7 @@ func TestE2EBridgeTransfersOptimismPortalETHReceive(t *testing.T) { return l1Header != nil && l1Header.Number.Uint64() >= portalDepositReceipt.BlockNumber.Uint64(), nil })) - aliceDeposits, err := testSuite.DB.BridgeTransfers.L1BridgeDepositsByAddress(aliceAddr, "", 0) + aliceDeposits, err := testSuite.DB.BridgeTransfers.L1BridgeDepositsByAddress(aliceAddr, "", 1) require.NoError(t, err) require.NotNil(t, aliceDeposits) require.Len(t, aliceDeposits.Deposits, 1) @@ -143,7 +145,7 @@ func TestE2EBridgeTransfersOptimismPortalETHReceive(t *testing.T) { })) // Still nil as the withdrawal did not occur through the standard bridge - aliceDeposits, err = testSuite.DB.BridgeTransfers.L1BridgeDepositsByAddress(aliceAddr, "", 0) + aliceDeposits, err = testSuite.DB.BridgeTransfers.L1BridgeDepositsByAddress(aliceAddr, "", 1) require.NoError(t, err) require.Nil(t, aliceDeposits.Deposits[0].L1BridgeDeposit.CrossDomainMessageHash) } @@ -185,7 +187,7 @@ func TestE2EBridgeTransfersCursoredDeposits(t *testing.T) { })) // Get All - aliceDeposits, err := testSuite.DB.BridgeTransfers.L1BridgeDepositsByAddress(aliceAddr, "", 0) + aliceDeposits, err := testSuite.DB.BridgeTransfers.L1BridgeDepositsByAddress(aliceAddr, "", 3) require.NotNil(t, aliceDeposits) require.NoError(t, err) require.Len(t, aliceDeposits.Deposits, 3) @@ -198,14 +200,14 @@ func TestE2EBridgeTransfersCursoredDeposits(t *testing.T) { require.Len(t, aliceDeposits.Deposits, 2) require.True(t, aliceDeposits.HasNextPage) - aliceDeposits, err = testSuite.DB.BridgeTransfers.L1BridgeDepositsByAddress(aliceAddr, aliceDeposits.Cursor, 2) + aliceDeposits, err = testSuite.DB.BridgeTransfers.L1BridgeDepositsByAddress(aliceAddr, aliceDeposits.Cursor, 1) require.NoError(t, err) require.NotNil(t, aliceDeposits) require.Len(t, aliceDeposits.Deposits, 1) require.False(t, aliceDeposits.HasNextPage) // Returns the results in the right order - aliceDeposits, err = testSuite.DB.BridgeTransfers.L1BridgeDepositsByAddress(aliceAddr, "", 100) + aliceDeposits, err = testSuite.DB.BridgeTransfers.L1BridgeDepositsByAddress(aliceAddr, "", 3) require.NotNil(t, aliceDeposits) require.NoError(t, err) for i := 0; i < 3; i++ { @@ -252,7 +254,7 @@ func TestE2EBridgeTransfersStandardBridgeETHWithdrawal(t *testing.T) { return l2Header != nil && l2Header.Number.Uint64() >= withdrawReceipt.BlockNumber.Uint64(), nil })) - aliceWithdrawals, err := testSuite.DB.BridgeTransfers.L2BridgeWithdrawalsByAddress(aliceAddr, "", 0) + aliceWithdrawals, err := testSuite.DB.BridgeTransfers.L2BridgeWithdrawalsByAddress(aliceAddr, "", 3) require.NoError(t, err) require.Len(t, aliceWithdrawals.Withdrawals, 1) require.Equal(t, withdrawTx.Hash().String(), aliceWithdrawals.Withdrawals[0].L2TransactionHash.String()) @@ -290,7 +292,7 @@ func TestE2EBridgeTransfersStandardBridgeETHWithdrawal(t *testing.T) { return l1Header != nil && l1Header.Number.Uint64() >= finalizeReceipt.BlockNumber.Uint64(), nil })) - aliceWithdrawals, err = testSuite.DB.BridgeTransfers.L2BridgeWithdrawalsByAddress(aliceAddr, "", 0) + aliceWithdrawals, err = testSuite.DB.BridgeTransfers.L2BridgeWithdrawalsByAddress(aliceAddr, "", 100) require.NoError(t, err) require.Equal(t, proveReceipt.TxHash, aliceWithdrawals.Withdrawals[0].ProvenL1TransactionHash) require.Equal(t, finalizeReceipt.TxHash, aliceWithdrawals.Withdrawals[0].FinalizedL1TransactionHash) @@ -304,7 +306,6 @@ func TestE2EBridgeTransfersStandardBridgeETHWithdrawal(t *testing.T) { func TestE2EBridgeTransfersL2ToL1MessagePasserETHReceive(t *testing.T) { testSuite := createE2ETestSuite(t) - optimismPortal, err := bindings.NewOptimismPortal(testSuite.OpCfg.L1Deployments.OptimismPortalProxy, testSuite.L1Client) require.NoError(t, err) l2ToL1MessagePasser, err := bindings.NewOptimismPortal(predeploys.L2ToL1MessagePasserAddr, testSuite.L2Client) @@ -337,7 +338,7 @@ func TestE2EBridgeTransfersL2ToL1MessagePasserETHReceive(t *testing.T) { return l2Header != nil && l2Header.Number.Uint64() >= l2ToL1WithdrawReceipt.BlockNumber.Uint64(), nil })) - aliceWithdrawals, err := testSuite.DB.BridgeTransfers.L2BridgeWithdrawalsByAddress(aliceAddr, "", 0) + aliceWithdrawals, err := testSuite.DB.BridgeTransfers.L2BridgeWithdrawalsByAddress(aliceAddr, "", 100) require.NoError(t, err) require.Len(t, aliceWithdrawals.Withdrawals, 1) require.Equal(t, l2ToL1MessagePasserWithdrawTx.Hash().String(), aliceWithdrawals.Withdrawals[0].L2TransactionHash.String()) @@ -370,7 +371,7 @@ func TestE2EBridgeTransfersL2ToL1MessagePasserETHReceive(t *testing.T) { return l1Header != nil && l1Header.Number.Uint64() >= finalizeReceipt.BlockNumber.Uint64(), nil })) - aliceWithdrawals, err = testSuite.DB.BridgeTransfers.L2BridgeWithdrawalsByAddress(aliceAddr, "", 0) + aliceWithdrawals, err = testSuite.DB.BridgeTransfers.L2BridgeWithdrawalsByAddress(aliceAddr, "", 100) require.NoError(t, err) require.Equal(t, proveReceipt.TxHash, aliceWithdrawals.Withdrawals[0].ProvenL1TransactionHash) require.Equal(t, finalizeReceipt.TxHash, aliceWithdrawals.Withdrawals[0].FinalizedL1TransactionHash) @@ -414,7 +415,7 @@ func TestE2EBridgeTransfersCursoredWithdrawals(t *testing.T) { })) // Get All - aliceWithdrawals, err := testSuite.DB.BridgeTransfers.L2BridgeWithdrawalsByAddress(aliceAddr, "", 0) + aliceWithdrawals, err := testSuite.DB.BridgeTransfers.L2BridgeWithdrawalsByAddress(aliceAddr, "", 100) require.NotNil(t, aliceWithdrawals) require.NoError(t, err) require.Len(t, aliceWithdrawals.Withdrawals, 3) @@ -427,7 +428,7 @@ func TestE2EBridgeTransfersCursoredWithdrawals(t *testing.T) { require.Len(t, aliceWithdrawals.Withdrawals, 2) require.True(t, aliceWithdrawals.HasNextPage) - aliceWithdrawals, err = testSuite.DB.BridgeTransfers.L2BridgeWithdrawalsByAddress(aliceAddr, aliceWithdrawals.Cursor, 2) + aliceWithdrawals, err = testSuite.DB.BridgeTransfers.L2BridgeWithdrawalsByAddress(aliceAddr, aliceWithdrawals.Cursor, 1) require.NotNil(t, aliceWithdrawals) require.NoError(t, err) require.Len(t, aliceWithdrawals.Withdrawals, 1) @@ -445,3 +446,73 @@ func TestE2EBridgeTransfersCursoredWithdrawals(t *testing.T) { require.Equal(t, int64(3-i)*params.Ether, withdrawal.L2BridgeWithdrawal.Tx.Amount.Int64()) } } + +func TestClientGetWithdrawals(t *testing.T) { + testSuite := createE2ETestSuite(t) + + // (1) Generate contract bindings for the L1 and L2 standard bridges + optimismPortal, err := bindings.NewOptimismPortal(testSuite.OpCfg.L1Deployments.OptimismPortalProxy, testSuite.L1Client) + require.NoError(t, err) + l2ToL1MessagePasser, err := bindings.NewOptimismPortal(predeploys.L2ToL1MessagePasserAddr, testSuite.L2Client) + require.NoError(t, err) + + // (2) Create test actors that will deposit and withdraw using the standard bridge + aliceAddr := testSuite.OpCfg.Secrets.Addresses().Alice + bobAddr := testSuite.OpCfg.Secrets.Addresses().Bob + + type actor struct { + addr common.Address + priv *ecdsa.PrivateKey + } + + actors := []actor{ + { + addr: aliceAddr, + priv: testSuite.OpCfg.Secrets.Alice, + }, + { + addr: bobAddr, + priv: testSuite.OpCfg.Secrets.Bob, + }, + } + + // (3) Iterate over each actor and deposit / withdraw + for _, actor := range actors { + l2Opts, err := bind.NewKeyedTransactorWithChainID(actor.priv, testSuite.OpCfg.L2ChainIDBig()) + require.NoError(t, err) + l2Opts.Value = big.NewInt(params.Ether) + + // (3.a) Deposit user funds into L2 via OptimismPortal contract + l1Opts, err := bind.NewKeyedTransactorWithChainID(actor.priv, testSuite.OpCfg.L1ChainIDBig()) + require.NoError(t, err) + l1Opts.Value = l2Opts.Value + depositTx, err := optimismPortal.Receive(l1Opts) + require.NoError(t, err) + _, err = wait.ForReceiptOK(context.Background(), testSuite.L1Client, depositTx.Hash()) + require.NoError(t, err) + + // (3.b) Initiate withdrawal transaction via L2ToL1MessagePasser contract + l2ToL1MessagePasserWithdrawTx, err := l2ToL1MessagePasser.Receive(l2Opts) + require.NoError(t, err) + l2ToL1WithdrawReceipt, err := wait.ForReceiptOK(context.Background(), testSuite.L2Client, l2ToL1MessagePasserWithdrawTx.Hash()) + require.NoError(t, err) + + // (3.c) wait for indexer processor to catchup with the L2 block containing the withdrawal tx + require.NoError(t, wait.For(context.Background(), 500*time.Millisecond, func() (bool, error) { + l2Header := testSuite.Indexer.BridgeProcessor.LatestL2Header + return l2Header != nil && l2Header.Number.Uint64() >= l2ToL1WithdrawReceipt.BlockNumber.Uint64(), nil + })) + + // (3.d) Ensure that withdrawal and deposit txs are retrievable via API + deposits, err := testSuite.Client.GetAllDepositsByAddress(actor.addr) + require.NoError(t, err) + require.Len(t, deposits, 1) + require.Equal(t, depositTx.Hash().String(), deposits[0].L1TxHash) + + withdrawals, err := testSuite.Client.GetAllWithdrawalsByAddress(actor.addr) + require.NoError(t, err) + require.Len(t, withdrawals, 1) + require.Equal(t, l2ToL1MessagePasserWithdrawTx.Hash().String(), withdrawals[0].TransactionHash) + } + +} diff --git a/indexer/e2e_tests/setup.go b/indexer/e2e_tests/setup.go index 7f651abe3daab9b92b921c93dd63e5f5144d419e..ebd69112c8aa509491f72ae07689980feefcffa5 100644 --- a/indexer/e2e_tests/setup.go +++ b/indexer/e2e_tests/setup.go @@ -9,6 +9,8 @@ import ( "time" "github.com/ethereum-optimism/optimism/indexer" + "github.com/ethereum-optimism/optimism/indexer/api" + "github.com/ethereum-optimism/optimism/indexer/client" "github.com/ethereum-optimism/optimism/indexer/config" "github.com/ethereum-optimism/optimism/indexer/database" @@ -21,9 +23,19 @@ import ( "github.com/stretchr/testify/require" ) +/* + NOTE - Most of the current bridge tests fetch chain data via direct database queries. These could all + be transitioned to use the API client instead to better simulate/validate real-world usage. + Supporting this would potentially require adding new API endpoints for the specific query lookup types. +*/ + type E2ETestSuite struct { t *testing.T + // API + Client *client.Client + API *api.API + // Indexer DB *database.DB Indexer *indexer.Indexer @@ -37,6 +49,7 @@ type E2ETestSuite struct { L2Client *ethclient.Client } +// createE2ETestSuite ... Create a new E2E test suite func createE2ETestSuite(t *testing.T) E2ETestSuite { dbUser := os.Getenv("DB_USER") dbName := setupTestDatabase(t) @@ -105,14 +118,54 @@ func createE2ETestSuite(t *testing.T) E2ETestSuite { require.NoError(t, err) indexerCtx, indexerStop := context.WithCancel(context.Background()) - t.Cleanup(func() { indexerStop() }) go func() { err := indexer.Run(indexerCtx) - require.NoError(t, err) + if err != nil { // panicking here ensures that the test will exit + // during service failure. Using t.Fail() wouldn't be caught + // until all awaiting routines finish which would never happen. + panic(err) + } }() + apiLog := testlog.Logger(t, log.LvlInfo).New("role", "indexer_api") + + apiCfg := config.ServerConfig{ + Host: "127.0.0.1", + Port: 0, + } + + mCfg := config.ServerConfig{ + Host: "127.0.0.1", + Port: 0, + } + + api := api.NewApi(apiLog, db.BridgeTransfers, apiCfg, mCfg) + apiCtx, apiStop := context.WithCancel(context.Background()) + go func() { + err := api.Run(apiCtx) + if err != nil { + panic(err) + } + }() + + t.Cleanup(func() { + apiStop() + indexerStop() + }) + + // Wait for the API to start listening + time.Sleep(1 * time.Second) + + client, err := client.NewClient(&client.Config{ + PaginationLimit: 100, + BaseURL: fmt.Sprintf("http://%s:%d", apiCfg.Host, api.Port()), + }) + + require.NoError(t, err) + return E2ETestSuite{ t: t, + Client: client, DB: db, Indexer: indexer, OpCfg: &opCfg, diff --git a/indexer/node/client.go b/indexer/node/client.go index 7af8868e81c8561eba0622d87a28cb2835b9f112..17902e50306f512c07398f1e883c935f8172078a 100644 --- a/indexer/node/client.go +++ b/indexer/node/client.go @@ -48,7 +48,7 @@ func DialEthClient(rpcUrl string, metrics Metricer) (EthClient, error) { return nil, err } - client := &client{rpc: newRPC(rpcClient, metrics)} + client := &client{rpc: NewRPC(rpcClient, metrics)} return client, nil } @@ -207,7 +207,7 @@ type rpcClient struct { metrics Metricer } -func newRPC(client *rpc.Client, metrics Metricer) RPC { +func NewRPC(client *rpc.Client, metrics Metricer) RPC { return &rpcClient{client, metrics} } diff --git a/op-batcher/Dockerfile b/op-batcher/Dockerfile index 9e5408653478bbc930c7dc4a89b17cb70b3c749c..bae7cb3473d777e8ba477b88948f3e3dea3fd81b 100644 --- a/op-batcher/Dockerfile +++ b/op-batcher/Dockerfile @@ -16,7 +16,6 @@ COPY ./op-batcher /app/op-batcher COPY ./op-bindings /app/op-bindings COPY ./op-node /app/op-node COPY ./op-service /app/op-service -COPY ./op-signer /app/op-signer COPY ./.git /app/.git diff --git a/op-bindings/bindings/blockoracle.go b/op-bindings/bindings/blockoracle.go index 5afd118c7b95c8e0b6203aec85a7f11605f7355c..686061c1aa1264526cac7f92c9cbbe8b0a12c6a9 100644 --- a/op-bindings/bindings/blockoracle.go +++ b/op-bindings/bindings/blockoracle.go @@ -36,8 +36,8 @@ type BlockOracleBlockInfo struct { // BlockOracleMetaData contains all meta data concerning the BlockOracle contract. var BlockOracleMetaData = &bind.MetaData{ - ABI: "[{\"inputs\":[],\"name\":\"BlockHashNotPresent\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"Hash\",\"name\":\"blockHash\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"Timestamp\",\"name\":\"childTimestamp\",\"type\":\"uint64\"}],\"name\":\"Checkpoint\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"checkpoint\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"blockNumber_\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_blockNumber\",\"type\":\"uint256\"}],\"name\":\"load\",\"outputs\":[{\"components\":[{\"internalType\":\"Hash\",\"name\":\"hash\",\"type\":\"bytes32\"},{\"internalType\":\"Timestamp\",\"name\":\"childTimestamp\",\"type\":\"uint64\"}],\"internalType\":\"structBlockOracle.BlockInfo\",\"name\":\"blockInfo_\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]", - Bin: "0x608060405234801561001057600080fd5b5061021c806100206000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c806399d548aa1461003b578063c2c4c5c114610078575b600080fd5b61004e6100493660046101b8565b61008e565b604080518251815260209283015167ffffffffffffffff1692810192909252015b60405180910390f35b61008061010d565b60405190815260200161006f565b604080518082018252600080825260209182018190528381528082528281208351808501909452805480855260019091015467ffffffffffffffff169284019290925203610108576040517f37cf270500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600061011a6001436101d1565b60408051808201825282408082524267ffffffffffffffff81811660208086018281526000898152918290528782209651875551600190960180547fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000016969093169590951790915593519495509093909291849186917fb67ff58b33060fd371a35ae2d9f1c3cdaec9b8197969f6efe2594a1ff4ba68c691a4505090565b6000602082840312156101ca57600080fd5b5035919050565b60008282101561020a577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b50039056fea164736f6c634300080f000a", + ABI: "[{\"inputs\":[],\"name\":\"BlockHashNotPresent\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"Hash\",\"name\":\"blockHash\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"Timestamp\",\"name\":\"childTimestamp\",\"type\":\"uint64\"}],\"name\":\"Checkpoint\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"checkpoint\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"blockNumber_\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_blockNumber\",\"type\":\"uint256\"}],\"name\":\"load\",\"outputs\":[{\"components\":[{\"internalType\":\"Hash\",\"name\":\"hash\",\"type\":\"bytes32\"},{\"internalType\":\"Timestamp\",\"name\":\"childTimestamp\",\"type\":\"uint64\"}],\"internalType\":\"structBlockOracle.BlockInfo\",\"name\":\"blockInfo_\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"version\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]", + Bin: "0x608060405234801561001057600080fd5b506102e7806100206000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c806354fd4d501461004657806399d548aa14610098578063c2c4c5c1146100d0575b600080fd5b6100826040518060400160405280600581526020017f302e302e3100000000000000000000000000000000000000000000000000000081525081565b60405161008f9190610210565b60405180910390f35b6100ab6100a6366004610283565b6100e6565b604080518251815260209283015167ffffffffffffffff16928101929092520161008f565b6100d8610165565b60405190815260200161008f565b604080518082018252600080825260209182018190528381528082528281208351808501909452805480855260019091015467ffffffffffffffff169284019290925203610160576040517f37cf270500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600061017260014361029c565b60408051808201825282408082524267ffffffffffffffff81811660208086018281526000898152918290528782209651875551600190960180547fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000016969093169590951790915593519495509093909291849186917fb67ff58b33060fd371a35ae2d9f1c3cdaec9b8197969f6efe2594a1ff4ba68c691a4505090565b600060208083528351808285015260005b8181101561023d57858101830151858201604001528201610221565b8181111561024f576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b60006020828403121561029557600080fd5b5035919050565b6000828210156102d5577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b50039056fea164736f6c634300080f000a", } // BlockOracleABI is the input ABI used to generate the binding from. @@ -238,6 +238,37 @@ func (_BlockOracle *BlockOracleCallerSession) Load(_blockNumber *big.Int) (Block return _BlockOracle.Contract.Load(&_BlockOracle.CallOpts, _blockNumber) } +// Version is a free data retrieval call binding the contract method 0x54fd4d50. +// +// Solidity: function version() view returns(string) +func (_BlockOracle *BlockOracleCaller) Version(opts *bind.CallOpts) (string, error) { + var out []interface{} + err := _BlockOracle.contract.Call(opts, &out, "version") + + if err != nil { + return *new(string), err + } + + out0 := *abi.ConvertType(out[0], new(string)).(*string) + + return out0, err + +} + +// Version is a free data retrieval call binding the contract method 0x54fd4d50. +// +// Solidity: function version() view returns(string) +func (_BlockOracle *BlockOracleSession) Version() (string, error) { + return _BlockOracle.Contract.Version(&_BlockOracle.CallOpts) +} + +// Version is a free data retrieval call binding the contract method 0x54fd4d50. +// +// Solidity: function version() view returns(string) +func (_BlockOracle *BlockOracleCallerSession) Version() (string, error) { + return _BlockOracle.Contract.Version(&_BlockOracle.CallOpts) +} + // Checkpoint is a paid mutator transaction binding the contract method 0xc2c4c5c1. // // Solidity: function checkpoint() returns(uint256 blockNumber_) diff --git a/op-bindings/bindings/blockoracle_more.go b/op-bindings/bindings/blockoracle_more.go index 6988535be6503bb25723f2c9e3f1012c3aa89774..e50c0c007a6daa38d0fbfb702f871e56402da408 100644 --- a/op-bindings/bindings/blockoracle_more.go +++ b/op-bindings/bindings/blockoracle_more.go @@ -13,7 +13,7 @@ const BlockOracleStorageLayoutJSON = "{\"storage\":[{\"astId\":1000,\"contract\" var BlockOracleStorageLayout = new(solc.StorageLayout) -var BlockOracleDeployedBin = "0x608060405234801561001057600080fd5b50600436106100365760003560e01c806399d548aa1461003b578063c2c4c5c114610078575b600080fd5b61004e6100493660046101b8565b61008e565b604080518251815260209283015167ffffffffffffffff1692810192909252015b60405180910390f35b61008061010d565b60405190815260200161006f565b604080518082018252600080825260209182018190528381528082528281208351808501909452805480855260019091015467ffffffffffffffff169284019290925203610108576040517f37cf270500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600061011a6001436101d1565b60408051808201825282408082524267ffffffffffffffff81811660208086018281526000898152918290528782209651875551600190960180547fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000016969093169590951790915593519495509093909291849186917fb67ff58b33060fd371a35ae2d9f1c3cdaec9b8197969f6efe2594a1ff4ba68c691a4505090565b6000602082840312156101ca57600080fd5b5035919050565b60008282101561020a577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b50039056fea164736f6c634300080f000a" +var BlockOracleDeployedBin = "0x608060405234801561001057600080fd5b50600436106100415760003560e01c806354fd4d501461004657806399d548aa14610098578063c2c4c5c1146100d0575b600080fd5b6100826040518060400160405280600581526020017f302e302e3100000000000000000000000000000000000000000000000000000081525081565b60405161008f9190610210565b60405180910390f35b6100ab6100a6366004610283565b6100e6565b604080518251815260209283015167ffffffffffffffff16928101929092520161008f565b6100d8610165565b60405190815260200161008f565b604080518082018252600080825260209182018190528381528082528281208351808501909452805480855260019091015467ffffffffffffffff169284019290925203610160576040517f37cf270500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600061017260014361029c565b60408051808201825282408082524267ffffffffffffffff81811660208086018281526000898152918290528782209651875551600190960180547fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000016969093169590951790915593519495509093909291849186917fb67ff58b33060fd371a35ae2d9f1c3cdaec9b8197969f6efe2594a1ff4ba68c691a4505090565b600060208083528351808285015260005b8181101561023d57858101830151858201604001528201610221565b8181111561024f576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b60006020828403121561029557600080fd5b5035919050565b6000828210156102d5577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b50039056fea164736f6c634300080f000a" func init() { if err := json.Unmarshal([]byte(BlockOracleStorageLayoutJSON), BlockOracleStorageLayout); err != nil { diff --git a/op-bindings/bindings/mips_more.go b/op-bindings/bindings/mips_more.go index 5bec2b62c9a0efb85f26d1275faa85421838ffc4..d4854a63a32e20b467c3407808bf19048b5eb98f 100644 --- a/op-bindings/bindings/mips_more.go +++ b/op-bindings/bindings/mips_more.go @@ -15,7 +15,7 @@ var MIPSStorageLayout = new(solc.StorageLayout) var MIPSDeployedBin = "0x608060405234801561001057600080fd5b50600436106100415760003560e01c8063155633fe146100465780637dc0d1d01461006b578063f8e0cb96146100af575b600080fd5b610051634000000081565b60405163ffffffff90911681526020015b60405180910390f35b60405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610062565b6100c26100bd366004611d26565b6100d0565b604051908152602001610062565b60006100da611c53565b608081146100e757600080fd5b604051610600146100f757600080fd5b6064861461010457600080fd5b610184841461011257600080fd5b8535608052602086013560a052604086013560e090811c60c09081526044880135821c82526048880135821c61010052604c880135821c610120526050880135821c61014052605488013590911c61016052605887013560f890811c610180526059880135901c6101a052605a870135901c6101c0526102006101e0819052606287019060005b60208110156101bd57823560e01c8252600490920191602090910190600101610199565b505050806101200151156101db576101d3610619565b915050610611565b6101408101805160010167ffffffffffffffff16905260608101516000906102039082610735565b9050603f601a82901c16600281148061022257508063ffffffff166003145b156102775760006002836303ffffff1663ffffffff16901b846080015163f00000001617905061026c8263ffffffff1660021461026057601f610263565b60005b60ff16826107f1565b945050505050610611565b6101608301516000908190601f601086901c81169190601587901c16602081106102a3576102a3611d92565b602002015192508063ffffffff851615806102c457508463ffffffff16601c145b156102fb578661016001518263ffffffff16602081106102e6576102e6611d92565b6020020151925050601f600b86901c166103b7565b60208563ffffffff16101561035d578463ffffffff16600c148061032557508463ffffffff16600d145b8061033657508463ffffffff16600e145b15610347578561ffff1692506103b7565b6103568661ffff1660106108eb565b92506103b7565b60288563ffffffff1610158061037957508463ffffffff166022145b8061038a57508463ffffffff166026145b156103b7578661016001518263ffffffff16602081106103ac576103ac611d92565b602002015192508190505b60048563ffffffff16101580156103d4575060088563ffffffff16105b806103e557508463ffffffff166001145b15610404576103f68587848761095e565b975050505050505050610611565b63ffffffff6000602087831610610469576104248861ffff1660106108eb565b9095019463fffffffc861661043a816001610735565b915060288863ffffffff161015801561045a57508763ffffffff16603014155b1561046757809250600093505b505b600061047789888885610b6e565b63ffffffff9081169150603f8a1690891615801561049c575060088163ffffffff1610155b80156104ae5750601c8163ffffffff16105b1561058a578063ffffffff16600814806104ce57508063ffffffff166009145b15610505576104f38163ffffffff166008146104ea57856104ed565b60005b896107f1565b9b505050505050505050505050610611565b8063ffffffff16600a03610525576104f3858963ffffffff8a16156112f2565b8063ffffffff16600b03610546576104f3858963ffffffff8a1615156112f2565b8063ffffffff16600c0361055c576104f36113d8565b60108163ffffffff16101580156105795750601c8163ffffffff16105b1561058a576104f38189898861190c565b8863ffffffff1660381480156105a5575063ffffffff861615155b156105da5760018b61016001518763ffffffff16602081106105c9576105c9611d92565b63ffffffff90921660209290920201525b8363ffffffff1663ffffffff146105f7576105f784600184611b06565b610603858360016112f2565b9b5050505050505050505050505b949350505050565b60408051608051815260a051602082015260dc519181019190915260fc51604482015261011c51604882015261013c51604c82015261015c51605082015261017c5160548201526101805161019f5160588301526101a0516101bf5160598401526101d851605a840152600092610200929091606283019190855b60208110156106b857601c8601518452602090950194600490930192600101610694565b506000835283830384a06000945080600181146106d85760039550610700565b8280156106f057600181146106f957600296506106fe565b600096506106fe565b600196505b505b50505081900390207effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1660f89190911b17919050565b60008061074183611baa565b9050600384161561075157600080fd5b6020810190358460051c8160005b601b8110156107b75760208501943583821c6001168015610787576001811461079c576107ad565b600084815260208390526040902093506107ad565b600082815260208590526040902093505b505060010161075f565b5060805191508181146107d257630badf00d60005260206000fd5b5050601f94909416601c0360031b9390931c63ffffffff169392505050565b60006107fb611c53565b60809050806060015160040163ffffffff16816080015163ffffffff1614610884576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f6a756d7020696e2064656c617920736c6f74000000000000000000000000000060448201526064015b60405180910390fd5b60608101805160808301805163ffffffff9081169093528583169052908516156108da57806008018261016001518663ffffffff16602081106108c9576108c9611d92565b63ffffffff90921660209290920201525b6108e2610619565b95945050505050565b600063ffffffff8381167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80850183169190911c821615159160016020869003821681901b830191861691821b92911b018261094857600061094a565b815b90861663ffffffff16179250505092915050565b6000610968611c53565b608090506000816060015160040163ffffffff16826080015163ffffffff16146109ee576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f6272616e636820696e2064656c617920736c6f74000000000000000000000000604482015260640161087b565b8663ffffffff1660041480610a0957508663ffffffff166005145b15610a855760008261016001518663ffffffff1660208110610a2d57610a2d611d92565b602002015190508063ffffffff168563ffffffff16148015610a5557508763ffffffff166004145b80610a7d57508063ffffffff168563ffffffff1614158015610a7d57508763ffffffff166005145b915050610b02565b8663ffffffff16600603610aa25760008460030b13159050610b02565b8663ffffffff16600703610abe5760008460030b139050610b02565b8663ffffffff16600103610b0257601f601087901c166000819003610ae75760008560030b1291505b8063ffffffff16600103610b005760008560030b121591505b505b606082018051608084015163ffffffff169091528115610b48576002610b2d8861ffff1660106108eb565b63ffffffff90811690911b8201600401166080840152610b5a565b60808301805160040163ffffffff1690525b610b62610619565b98975050505050505050565b6000603f601a86901c16801580610b9d575060088163ffffffff1610158015610b9d5750600f8163ffffffff16105b15610ff357603f86168160088114610be45760098114610bed57600a8114610bf657600b8114610bff57600c8114610c0857600d8114610c1157600e8114610c1a57610c1f565b60209150610c1f565b60219150610c1f565b602a9150610c1f565b602b9150610c1f565b60249150610c1f565b60259150610c1f565b602691505b508063ffffffff16600003610c465750505063ffffffff8216601f600686901c161b610611565b8063ffffffff16600203610c6c5750505063ffffffff8216601f600686901c161c610611565b8063ffffffff16600303610ca257601f600688901c16610c9863ffffffff8716821c60208390036108eb565b9350505050610611565b8063ffffffff16600403610cc45750505063ffffffff8216601f84161b610611565b8063ffffffff16600603610ce65750505063ffffffff8216601f84161c610611565b8063ffffffff16600703610d1957610d108663ffffffff168663ffffffff16901c876020036108eb565b92505050610611565b8063ffffffff16600803610d31578592505050610611565b8063ffffffff16600903610d49578592505050610611565b8063ffffffff16600a03610d61578592505050610611565b8063ffffffff16600b03610d79578592505050610611565b8063ffffffff16600c03610d91578592505050610611565b8063ffffffff16600f03610da9578592505050610611565b8063ffffffff16601003610dc1578592505050610611565b8063ffffffff16601103610dd9578592505050610611565b8063ffffffff16601203610df1578592505050610611565b8063ffffffff16601303610e09578592505050610611565b8063ffffffff16601803610e21578592505050610611565b8063ffffffff16601903610e39578592505050610611565b8063ffffffff16601a03610e51578592505050610611565b8063ffffffff16601b03610e69578592505050610611565b8063ffffffff16602003610e8257505050828201610611565b8063ffffffff16602103610e9b57505050828201610611565b8063ffffffff16602203610eb457505050818303610611565b8063ffffffff16602303610ecd57505050818303610611565b8063ffffffff16602403610ee657505050828216610611565b8063ffffffff16602503610eff57505050828217610611565b8063ffffffff16602603610f1857505050828218610611565b8063ffffffff16602703610f325750505082821719610611565b8063ffffffff16602a03610f63578460030b8660030b12610f54576000610f57565b60015b60ff1692505050610611565b8063ffffffff16602b03610f8b578463ffffffff168663ffffffff1610610f54576000610f57565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f696e76616c696420696e737472756374696f6e00000000000000000000000000604482015260640161087b565b50610f8b565b8063ffffffff16601c0361107757603f8616600281900361101957505050828202610611565b8063ffffffff166020148061103457508063ffffffff166021145b15610fed578063ffffffff1660200361104b579419945b60005b638000000087161561106d576401fffffffe600197881b16960161104e565b9250610611915050565b8063ffffffff16600f0361109957505065ffffffff0000601083901b16610611565b8063ffffffff166020036110cd576101d38560031660080260180363ffffffff168463ffffffff16901c60ff1660086108eb565b8063ffffffff16602103611102576101d38560021660080260100363ffffffff168463ffffffff16901c61ffff1660106108eb565b8063ffffffff1660220361113157505063ffffffff60086003851602811681811b198416918316901b17610611565b8063ffffffff166023036111485782915050610611565b8063ffffffff1660240361117a578460031660080260180363ffffffff168363ffffffff16901c60ff16915050610611565b8063ffffffff166025036111ad578460021660080260100363ffffffff168363ffffffff16901c61ffff16915050610611565b8063ffffffff166026036111df57505063ffffffff60086003851602601803811681811c198416918316901c17610611565b8063ffffffff1660280361121557505060ff63ffffffff60086003861602601803811682811b9091188316918416901b17610611565b8063ffffffff1660290361124c57505061ffff63ffffffff60086002861602601003811682811b9091188316918416901b17610611565b8063ffffffff16602a0361127b57505063ffffffff60086003851602811681811c198316918416901c17610611565b8063ffffffff16602b036112925783915050610611565b8063ffffffff16602e036112c457505063ffffffff60086003851602601803811681811b198316918416901b17610611565b8063ffffffff166030036112db5782915050610611565b8063ffffffff16603803610f8b5783915050610611565b60006112fc611c53565b506080602063ffffffff86161061136f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f76616c6964207265676973746572000000000000000000000000000000000000604482015260640161087b565b63ffffffff8516158015906113815750825b156113b557838161016001518663ffffffff16602081106113a4576113a4611d92565b63ffffffff90921660209290920201525b60808101805163ffffffff808216606085015260049091011690526108e2610619565b60006113e2611c53565b506101e051604081015160808083015160a084015160c09094015191936000928392919063ffffffff8616610ffa0361145c5781610fff81161561142b57610fff811661100003015b8363ffffffff166000036114525760e08801805163ffffffff838201169091529550611456565b8395505b506118cb565b8563ffffffff16610fcd0361147757634000000094506118cb565b8563ffffffff166110180361148f57600194506118cb565b8563ffffffff16611096036114c457600161012088015260ff83166101008801526114b8610619565b97505050505050505090565b8563ffffffff16610fa30361172e5763ffffffff8316156118cb577ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb63ffffffff8416016116e857600061151f8363fffffffc166001610735565b60208901519091508060001a60010361158c5761158981600090815233602052604090207effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f01000000000000000000000000000000000000000000000000000000000000001790565b90505b6040808a015190517fe03110e10000000000000000000000000000000000000000000000000000000081526004810183905263ffffffff9091166024820152600090819073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063e03110e1906044016040805180830381865afa15801561162d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116519190611dc1565b91509150600386168060040382811015611669578092505b5081861015611676578591505b8260088302610100031c9250826008828460040303021b9250600180600883600403021b036001806008858560040303021b039150811981169050838119871617955050506116cd8663fffffffc16600186611b06565b60408b018051820163ffffffff169052975061172992505050565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd63ffffffff84160161171d578094506118cb565b63ffffffff9450600993505b6118cb565b8563ffffffff16610fa40361181f5763ffffffff831660011480611758575063ffffffff83166002145b80611769575063ffffffff83166004145b15611776578094506118cb565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa63ffffffff84160161171d5760006117b68363fffffffc166001610735565b602089015190915060038416600403838110156117d1578093505b83900360089081029290921c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600193850293841b0116911b176020880152600060408801529350836118cb565b8563ffffffff16610fd7036118cb578163ffffffff166003036118bf5763ffffffff83161580611855575063ffffffff83166005145b80611866575063ffffffff83166003145b1561187457600094506118cb565b63ffffffff83166001148061188f575063ffffffff83166002145b806118a0575063ffffffff83166006145b806118b1575063ffffffff83166004145b1561171d57600194506118cb565b63ffffffff9450601693505b6101608701805163ffffffff808816604090920191909152905185821660e09091015260808801805180831660608b015260040190911690526114b8610619565b6000611916611c53565b506080600063ffffffff8716601003611934575060c0810151611a9d565b8663ffffffff166011036119535763ffffffff861660c0830152611a9d565b8663ffffffff1660120361196c575060a0810151611a9d565b8663ffffffff1660130361198b5763ffffffff861660a0830152611a9d565b8663ffffffff166018036119bf5763ffffffff600387810b9087900b02602081901c821660c08501521660a0830152611a9d565b8663ffffffff166019036119f05763ffffffff86811681871602602081901c821660c08501521660a0830152611a9d565b8663ffffffff16601a03611a46578460030b8660030b81611a1357611a13611de5565b0763ffffffff1660c0830152600385810b9087900b81611a3557611a35611de5565b0563ffffffff1660a0830152611a9d565b8663ffffffff16601b03611a9d578463ffffffff168663ffffffff1681611a6f57611a6f611de5565b0663ffffffff90811660c084015285811690871681611a9057611a90611de5565b0463ffffffff1660a08301525b63ffffffff841615611ad857808261016001518563ffffffff1660208110611ac757611ac7611d92565b63ffffffff90921660209290920201525b60808201805163ffffffff80821660608601526004909101169052611afb610619565b979650505050505050565b6000611b1183611baa565b90506003841615611b2157600080fd5b6020810190601f8516601c0360031b83811b913563ffffffff90911b1916178460051c60005b601b811015611b9f5760208401933582821c6001168015611b6f5760018114611b8457611b95565b60008581526020839052604090209450611b95565b600082815260208690526040902094505b5050600101611b47565b505060805250505050565b60ff811661038002610184810190369061050401811015611c4d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f636865636b207468617420746865726520697320656e6f7567682063616c6c6460448201527f6174610000000000000000000000000000000000000000000000000000000000606482015260840161087b565b50919050565b6040805161018081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101919091526101608101611cb9611cbe565b905290565b6040518061040001604052806020906020820280368337509192915050565b60008083601f840112611cef57600080fd5b50813567ffffffffffffffff811115611d0757600080fd5b602083019150836020828501011115611d1f57600080fd5b9250929050565b60008060008060408587031215611d3c57600080fd5b843567ffffffffffffffff80821115611d5457600080fd5b611d6088838901611cdd565b90965094506020870135915080821115611d7957600080fd5b50611d8687828801611cdd565b95989497509550505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008060408385031215611dd457600080fd5b505080516020909101519092909150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fdfea164736f6c634300080f000a" -var MIPSDeployedSourceMap = "1131:39544:128:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1710:45;;1745:10;1710:45;;;;;188:10:284;176:23;;;158:42;;146:2;131:18;1710:45:128;;;;;;;;2448:99;;;412:42:284;2534:6:128;400:55:284;382:74;;370:2;355:18;2448:99:128;211:251:284;25555:6339:128;;;;;;:::i;:::-;;:::i;:::-;;;1687:25:284;;;1675:2;1660:18;25555:6339:128;1541:177:284;25555:6339:128;25633:7;25676:18;;:::i;:::-;25823:4;25816:5;25813:15;25803:134;;25917:1;25914;25907:12;25803:134;25973:4;25967:11;25980;25964:28;25954:137;;26071:1;26068;26061:12;25954:137;26139:3;26121:16;26118:25;26108:150;;26238:1;26235;26228:12;26108:150;26302:3;26288:12;26285:21;26275:145;;26400:1;26397;26390:12;26275:145;26680:24;;27024:4;26726:20;27082:2;26784:21;;26680:24;26842:18;26726:20;26784:21;;;26680:24;26657:21;26653:52;;;26842:18;26726:20;;;26784:21;;;26680:24;26653:52;;26726:20;;26784:21;;;26680:24;26653:52;;26842:18;26726:20;26784:21;;;26680:24;26653:52;;26842:18;26726:20;26784:21;;;26680:24;26653:52;;26842:18;26726:20;26784:21;;;26680:24;26653:52;;;26842:18;26726:20;26784:21;;;26680:24;26657:21;26653:52;;;26842:18;26726:20;26784:21;;;26680:24;26653:52;;26842:18;26726:20;26784:21;;;26680:24;26653:52;;26842:18;26726:20;27700:10;26842:18;27690:21;;;26784;;;;27798:1;27783:77;27808:2;27805:1;27802:9;27783:77;;;26680:24;;26657:21;26653:52;26726:20;;27856:1;26784:21;;;;26668:2;26842:18;;;;27826:1;27819:9;27783:77;;;27787:14;;;27938:5;:12;;;27934:71;;;27977:13;:11;:13::i;:::-;27970:20;;;;;27934:71;28019:10;;;:15;;28033:1;28019:15;;;;;28104:8;;;;-1:-1:-1;;28096:20:128;;-1:-1:-1;28096:7:128;:20::i;:::-;28082:34;-1:-1:-1;28146:10:128;28154:2;28146:10;;;;28223:1;28213:11;;;:26;;;28228:6;:11;;28238:1;28228:11;28213:26;28209:310;;;28369:13;28438:1;28416:4;28423:10;28416:17;28415:24;;;;28386:5;:12;;;28401:10;28386:25;28385:54;28369:70;;28464:40;28475:6;:11;;28485:1;28475:11;:20;;28493:2;28475:20;;;28489:1;28475:20;28464:40;;28497:6;28464:10;:40::i;:::-;28457:47;;;;;;;;28209:310;28768:15;;;;28563:9;;;;28700:4;28694:2;28686:10;;;28685:19;;;28768:15;28793:2;28785:10;;;28784:19;28768:36;;;;;;;:::i;:::-;;;;;;-1:-1:-1;28833:5:128;28857:11;;;;;:29;;;28872:6;:14;;28882:4;28872:14;28857:29;28853:832;;;28949:5;:15;;;28965:5;28949:22;;;;;;;;;:::i;:::-;;;;;;-1:-1:-1;;29012:4:128;29006:2;28998:10;;;28997:19;28853:832;;;29050:4;29041:6;:13;;;29037:648;;;29171:6;:13;;29181:3;29171:13;:30;;;;29188:6;:13;;29198:3;29188:13;29171:30;:47;;;;29205:6;:13;;29215:3;29205:13;29171:47;29167:253;;;29281:4;29288:6;29281:13;29276:18;;29037:648;;29167:253;29380:21;29383:4;29390:6;29383:13;29398:2;29380;:21::i;:::-;29375:26;;29037:648;;;29454:4;29444:6;:14;;;;:32;;;;29462:6;:14;;29472:4;29462:14;29444:32;:50;;;;29480:6;:14;;29490:4;29480:14;29444:50;29440:245;;;29564:5;:15;;;29580:5;29564:22;;;;;;;;;:::i;:::-;;;;;29559:27;;29665:5;29657:13;;29440:245;29714:1;29704:6;:11;;;;:25;;;;;29728:1;29719:6;:10;;;29704:25;29703:42;;;;29734:6;:11;;29744:1;29734:11;29703:42;29699:125;;;29772:37;29785:6;29793:4;29799:5;29806:2;29772:12;:37::i;:::-;29765:44;;;;;;;;;;;29699:125;29857:13;29838:16;30009:4;29999:14;;;;29995:446;;30078:21;30081:4;30088:6;30081:13;30096:2;30078;:21::i;:::-;30072:27;;;;30136:10;30131:15;;30170:16;30131:15;30184:1;30170:7;:16::i;:::-;30164:22;;30218:4;30208:6;:14;;;;:32;;;;;30226:6;:14;;30236:4;30226:14;;30208:32;30204:223;;;30305:4;30293:16;;30407:1;30399:9;;30204:223;30015:426;29995:446;30474:10;30487:26;30495:4;30501:2;30505;30509:3;30487:7;:26::i;:::-;30516:10;30487:39;;;;-1:-1:-1;30612:4:128;30605:11;;;30644;;;:24;;;;;30667:1;30659:4;:9;;;;30644:24;:39;;;;;30679:4;30672;:11;;;30644:39;30640:847;;;30707:4;:9;;30715:1;30707:9;:22;;;;30720:4;:9;;30728:1;30720:9;30707:22;30703:144;;;30791:37;30802:4;:9;;30810:1;30802:9;:21;;30818:5;30802:21;;;30814:1;30802:21;30825:2;30791:10;:37::i;:::-;30784:44;;;;;;;;;;;;;;;30703:144;30869:4;:11;;30877:3;30869:11;30865:121;;30939:28;30948:5;30955:2;30959:7;;;;30939:8;:28::i;30865:121::-;31007:4;:11;;31015:3;31007:11;31003:121;;31077:28;31086:5;31093:2;31097:7;;;;;31077:8;:28::i;31003:121::-;31194:4;:11;;31202:3;31194:11;31190:80;;31236:15;:13;:15::i;31190:80::-;31373:4;31365;:12;;;;:27;;;;;31388:4;31381;:11;;;31365:27;31361:112;;;31423:31;31434:4;31440:2;31444;31448:5;31423:10;:31::i;31361:112::-;31547:6;:14;;31557:4;31547:14;:28;;;;-1:-1:-1;31565:10:128;;;;;31547:28;31543:93;;;31620:1;31595:5;:15;;;31611:5;31595:22;;;;;;;;;:::i;:::-;:26;;;;:22;;;;;;:26;31543:93;31682:9;:26;;31695:13;31682:26;31678:92;;31728:27;31737:9;31748:1;31751:3;31728:8;:27::i;:::-;31851:26;31860:5;31867:3;31872:4;31851:8;:26::i;:::-;31844:33;;;;;;;;;;;;;25555:6339;;;;;;;:::o;3092:2334::-;3639:4;3633:11;;3555:4;3358:31;3347:43;;3418:13;3358:31;3757:2;3457:13;;3347:43;3364:24;3358:31;3457:13;;;3347:43;;;;3364:24;3358:31;3457:13;;;3347:43;3364:24;3358:31;3457:13;;;3347:43;3364:24;3358:31;3457:13;;;3347:43;3364:24;3358:31;3457:13;;;3347:43;3364:24;3358:31;3457:13;;;3347:43;3418:13;4185:11;3364:24;3358:31;3457:13;;;3347:43;3418:13;4280:11;3364:24;3358:31;3457:13;;;3347:43;3364:24;3358:31;3457:13;;;3347:43;3133:12;;4420:13;;3633:11;;3457:13;;;;4185:11;3133:12;4500:84;4525:2;4522:1;4519:9;4500:84;;;3374:13;3364:24;;3358:31;3347:43;;3378:2;3418:13;;;;4580:1;3457:13;;;;4543:1;4536:9;4500:84;;;4504:14;4647:1;4643:2;4636:13;4742:5;4738:2;4734:14;4727:5;4722:27;4816:1;4802:15;;4837:6;4861:1;4856:273;;;;5196:1;5186:11;;4830:369;;4856:273;4888:8;4946:22;;;;5025:1;5020:22;;;;5112:1;5102:11;;4881:234;;4946:22;4965:1;4955:11;;4946:22;;5020;5039:1;5029:11;;4881:234;;4830:369;-1:-1:-1;;;5322:14:128;;;5305:32;;5365:19;5361:30;5397:3;5393:16;;;;5358:52;;3092:2334;-1:-1:-1;3092:2334:128:o;21610:1831::-;21683:11;21794:14;21811:24;21823:11;21811;:24::i;:::-;21794:41;;21943:1;21936:5;21932:13;21929:33;;;21958:1;21955;21948:12;21929:33;22091:2;22079:15;;;22032:20;22521:5;22518:1;22514:13;22556:4;22592:1;22577:343;22602:2;22599:1;22596:9;22577:343;;;22725:2;22713:15;;;22662:20;22760:12;;;22774:1;22756:20;22797:42;;;;22865:1;22860:42;;;;22749:153;;22797:42;22255:1;22248:12;;;22288:2;22281:13;;;22333:2;22320:16;;22806:31;;22797:42;;22860;22255:1;22248:12;;;22288:2;22281:13;;;22333:2;22320:16;;22869:31;;22749:153;-1:-1:-1;;22620:1:128;22613:9;22577:343;;;22581:14;23030:4;23024:11;23009:26;;23116:7;23110:4;23107:17;23097:124;;23158:10;23155:1;23148:21;23200:2;23197:1;23190:13;23097:124;-1:-1:-1;;23348:2:128;23337:14;;;;23325:10;23321:31;23318:1;23314:39;23382:16;;;;23400:10;23378:33;;21610:1831;-1:-1:-1;;;21610:1831:128:o;18720:823::-;18789:12;18876:18;;:::i;:::-;18944:4;18935:13;;18996:5;:8;;;19007:1;18996:12;18980:28;;:5;:12;;;:28;;;18976:95;;19028:28;;;;;2114:2:284;19028:28:128;;;2096:21:284;2153:2;2133:18;;;2126:30;2192:20;2172:18;;;2165:48;2230:18;;19028:28:128;;;;;;;;18976:95;19160:8;;;;;19193:12;;;;;19182:23;;;;;;;19219:20;;;;;19160:8;19351:13;;;19347:90;;19412:6;19421:1;19412:10;19384:5;:15;;;19400:8;19384:25;;;;;;;;;:::i;:::-;:38;;;;:25;;;;;;:38;19347:90;19513:13;:11;:13::i;:::-;19506:20;18720:823;-1:-1:-1;;;;;18720:823:128:o;2645:339::-;2706:11;2770:18;;;;2779:8;;;;2770:18;;;;;;2769:25;;;;;2786:1;2833:2;:9;;;2827:16;;;;;2826:22;;2825:32;;;;;;;2887:9;;2886:15;2769:25;2944:21;;2964:1;2944:21;;;2955:6;2944:21;2929:11;;;;;:37;;-1:-1:-1;;;2645:339:128;;;;:::o;13581:2026::-;13678:12;13764:18;;:::i;:::-;13832:4;13823:13;;13864:17;13924:5;:8;;;13935:1;13924:12;13908:28;;:5;:12;;;:28;;;13904:97;;13956:30;;;;;2461:2:284;13956:30:128;;;2443:21:284;2500:2;2480:18;;;2473:30;2539:22;2519:18;;;2512:50;2579:18;;13956:30:128;2259:344:284;13904:97:128;14071:7;:12;;14082:1;14071:12;:28;;;;14087:7;:12;;14098:1;14087:12;14071:28;14067:947;;;14119:9;14131:5;:15;;;14147:6;14131:23;;;;;;;;;:::i;:::-;;;;;14119:35;;14195:2;14188:9;;:3;:9;;;:25;;;;;14201:7;:12;;14212:1;14201:12;14188:25;14187:58;;;;14226:2;14219:9;;:3;:9;;;;:25;;;;;14232:7;:12;;14243:1;14232:12;14219:25;14172:73;;14101:159;14067:947;;;14357:7;:12;;14368:1;14357:12;14353:661;;14418:1;14410:3;14404:15;;;;14389:30;;14353:661;;;14522:7;:12;;14533:1;14522:12;14518:496;;14582:1;14575:3;14569:14;;;14554:29;;14518:496;;;14703:7;:12;;14714:1;14703:12;14699:315;;14791:4;14785:2;14776:11;;;14775:20;14761:10;14818:8;;;14814:84;;14878:1;14871:3;14865:14;;;14850:29;;14814:84;14919:3;:8;;14926:1;14919:8;14915:85;;14980:1;14972:3;14966:15;;;;14951:30;;14915:85;14717:297;14699:315;15090:8;;;;;15168:12;;;;15157:23;;;;;15324:178;;;;15415:1;15389:22;15392:5;15400:6;15392:14;15408:2;15389;:22::i;:::-;:27;;;;;;;15375:42;;15384:1;15375:42;15360:57;:12;;;:57;15324:178;;;15471:12;;;;;15486:1;15471:16;15456:31;;;;15324:178;15577:13;:11;:13::i;:::-;15570:20;13581:2026;-1:-1:-1;;;;;;;;13581:2026:128:o;31940:8733::-;32027:10;32089;32097:2;32089:10;;;;32128:11;;;:44;;;32154:1;32144:6;:11;;;;:27;;;;;32168:3;32159:6;:12;;;32144:27;32124:8490;;;32213:4;32206:11;;32337:6;32397:3;32392:25;;;;32472:3;32467:25;;;;32546:3;32541:25;;;;32621:3;32616:25;;;;32695:3;32690:25;;;;32768:3;32763:25;;;;32842:3;32837:25;;;;32330:532;;32392:25;32411:4;32403:12;;32392:25;;32467;32486:4;32478:12;;32467:25;;32541;32560:4;32552:12;;32541:25;;32616;32635:4;32627:12;;32616:25;;32690;32709:4;32701:12;;32690:25;;32763;32782:4;32774:12;;32763:25;;32837;32856:4;32848:12;;32330:532;;32925:4;:12;;32933:4;32925:12;32921:4023;;-1:-1:-1;;;32976:9:128;32968:26;;32989:4;32984:1;32976:9;;;32975:18;32968:26;32961:33;;32921:4023;33062:4;:12;;33070:4;33062:12;33058:3886;;-1:-1:-1;;;33113:9:128;33105:26;;33126:4;33121:1;33113:9;;;33112:18;33105:26;33098:33;;33058:3886;33199:4;:12;;33207:4;33199:12;33195:3749;;33264:4;33259:1;33251:9;;;33250:18;33297:27;33251:9;33300:11;;;;33313:2;:10;;;33297:2;:27::i;:::-;33290:34;;;;;;;33195:3749;33393:4;:12;;33401:4;33393:12;33389:3555;;-1:-1:-1;;;33436:17:128;;;33448:4;33443:9;;33436:17;33429:24;;33389:3555;33522:4;:11;;33530:3;33522:11;33518:3426;;-1:-1:-1;;;33564:17:128;;;33576:4;33571:9;;33564:17;33557:24;;33518:3426;33650:4;:12;;33658:4;33650:12;33646:3298;;33693:21;33702:2;33696:8;;:2;:8;;;;33711:2;33706;:7;33693:2;:21::i;:::-;33686:28;;;;;;33646:3298;33963:4;:12;;33971:4;33963:12;33959:2985;;34006:2;33999:9;;;;;;33959:2985;34077:4;:12;;34085:4;34077:12;34073:2871;;34120:2;34113:9;;;;;;34073:2871;34191:4;:12;;34199:4;34191:12;34187:2757;;34234:2;34227:9;;;;;;34187:2757;34305:4;:12;;34313:4;34305:12;34301:2643;;34348:2;34341:9;;;;;;34301:2643;34422:4;:12;;34430:4;34422:12;34418:2526;;34465:2;34458:9;;;;;;34418:2526;34582:4;:12;;34590:4;34582:12;34578:2366;;34625:2;34618:9;;;;;;34578:2366;34696:4;:12;;34704:4;34696:12;34692:2252;;34739:2;34732:9;;;;;;34692:2252;34810:4;:12;;34818:4;34810:12;34806:2138;;34853:2;34846:9;;;;;;34806:2138;34924:4;:12;;34932:4;34924:12;34920:2024;;34967:2;34960:9;;;;;;34920:2024;35038:4;:12;;35046:4;35038:12;35034:1910;;35081:2;35074:9;;;;;;35034:1910;35152:4;:12;;35160:4;35152:12;35148:1796;;35195:2;35188:9;;;;;;35148:1796;35267:4;:12;;35275:4;35267:12;35263:1681;;35310:2;35303:9;;;;;;35263:1681;35380:4;:12;;35388:4;35380:12;35376:1568;;35423:2;35416:9;;;;;;35376:1568;35494:4;:12;;35502:4;35494:12;35490:1454;;35537:2;35530:9;;;;;;35490:1454;35686:4;:12;;35694:4;35686:12;35682:1262;;-1:-1:-1;;;35730:7:128;;;35722:16;;35682:1262;35807:4;:12;;35815:4;35807:12;35803:1141;;-1:-1:-1;;;35851:7:128;;;35843:16;;35803:1141;35927:4;:12;;35935:4;35927:12;35923:1021;;-1:-1:-1;;;35971:7:128;;;35963:16;;35923:1021;36048:4;:12;;36056:4;36048:12;36044:900;;-1:-1:-1;;;36092:7:128;;;36084:16;;36044:900;36168:4;:12;;36176:4;36168:12;36164:780;;-1:-1:-1;;;36212:7:128;;;36204:16;;36164:780;36287:4;:12;;36295:4;36287:12;36283:661;;-1:-1:-1;;;36331:7:128;;;36323:16;;36283:661;36407:4;:12;;36415:4;36407:12;36403:541;;-1:-1:-1;;;36451:7:128;;;36443:16;;36403:541;36527:4;:12;;36535:4;36527:12;36523:421;;-1:-1:-1;;;36572:7:128;;;36570:10;36563:17;;36523:421;36649:4;:12;;36657:4;36649:12;36645:299;;36710:2;36692:21;;36698:2;36692:21;;;:29;;36720:1;36692:29;;;36716:1;36692:29;36685:36;;;;;;;;36645:299;36791:4;:12;;36799:4;36791:12;36787:157;;36839:2;36834:7;;:2;:7;;;:15;;36848:1;36834:15;;36787:157;36896:29;;;;;2810:2:284;36896:29:128;;;2792:21:284;2849:2;2829:18;;;2822:30;2888:21;2868:18;;;2861:49;2927:18;;36896:29:128;2608:343:284;36787:157:128;32174:4784;32124:8490;;;37014:6;:14;;37024:4;37014:14;37010:3590;;37073:4;37066:11;;37148:3;37140:11;;;37136:549;;-1:-1:-1;;;37193:21:128;;;37179:36;;37136:549;37300:4;:12;;37308:4;37300:12;:28;;;;37316:4;:12;;37324:4;37316:12;37300:28;37296:389;;;37360:4;:12;;37368:4;37360:12;37356:83;;37409:3;;;37356:83;37464:8;37502:127;37514:10;37509:15;;:20;37502:127;;37594:8;37561:3;37594:8;;;;;37561:3;37502:127;;;37661:1;-1:-1:-1;37654:8:128;;-1:-1:-1;;37654:8:128;37010:3590;37752:6;:14;;37762:4;37752:14;37748:2852;;-1:-1:-1;;37797:8:128;37803:2;37797:8;;;;37790:15;;37748:2852;37872:6;:14;;37882:4;37872:14;37868:2732;;37917:42;37935:2;37940:1;37935:6;37945:1;37934:12;37929:2;:17;37921:26;;:3;:26;;;;37951:4;37920:35;37957:1;37917:2;:42::i;37868:2732::-;38026:6;:14;;38036:4;38026:14;38022:2578;;38071:45;38089:2;38094:1;38089:6;38099:1;38088:12;38083:2;:17;38075:26;;:3;:26;;;;38105:6;38074:37;38113:2;38071;:45::i;38022:2578::-;38184:6;:14;;38194:4;38184:14;38180:2420;;-1:-1:-1;;38235:21:128;38254:1;38249;38244:6;;38243:12;38235:21;;38292:36;;;38363:5;38358:10;;38235:21;;;;;38357:18;38350:25;;38180:2420;38442:6;:14;;38452:4;38442:14;38438:2162;;38487:3;38480:10;;;;;38438:2162;38558:6;:14;;38568:4;38558:14;38554:2046;;38618:2;38623:1;38618:6;38628:1;38617:12;38612:2;:17;38604:26;;:3;:26;;;;38634:4;38603:35;38596:42;;;;;38554:2046;38707:6;:14;;38717:4;38707:14;38703:1897;;38767:2;38772:1;38767:6;38777:1;38766:12;38761:2;:17;38753:26;;:3;:26;;;;38783:6;38752:37;38745:44;;;;;38703:1897;38858:6;:14;;38868:4;38858:14;38854:1746;;-1:-1:-1;;38909:26:128;38933:1;38928;38923:6;;38922:12;38917:2;:17;38909:26;;38971:41;;;39047:5;39042:10;;38909:26;;;;;39041:18;39034:25;;38854:1746;39127:6;:14;;39137:4;39127:14;39123:1477;;-1:-1:-1;;39184:4:128;39178:34;39210:1;39205;39200:6;;39199:12;39194:2;:17;39178:34;;39268:27;;;39248:48;;;39326:10;;39179:9;;;39178:34;;39325:18;39318:25;;39123:1477;39411:6;:14;;39421:4;39411:14;39407:1193;;-1:-1:-1;;39468:6:128;39462:36;39496:1;39491;39486:6;;39485:12;39480:2;:17;39462:36;;39554:29;;;39534:50;;;39614:10;;39463:11;;;39462:36;;39613:18;39606:25;;39407:1193;39700:6;:14;;39710:4;39700:14;39696:904;;-1:-1:-1;;39751:20:128;39769:1;39764;39759:6;;39758:12;39751:20;;39807:36;;;39879:5;39873:11;;39751:20;;;;;39872:19;39865:26;;39696:904;39959:6;:14;;39969:4;39959:14;39955:645;;40004:2;39997:9;;;;;39955:645;40075:6;:14;;40085:4;40075:14;40071:529;;-1:-1:-1;;40126:25:128;40149:1;40144;40139:6;;40138:12;40133:2;:17;40126:25;;40187:41;;;40264:5;40258:11;;40126:25;;;;;40257:19;40250:26;;40071:529;40343:6;:14;;40353:4;40343:14;40339:261;;40388:3;40381:10;;;;;40339:261;40458:6;:14;;40468:4;40458:14;40454:146;;40503:2;40496:9;;;;;19824:782;19910:12;19997:18;;:::i;:::-;-1:-1:-1;20065:4:128;20172:2;20160:14;;;;20152:41;;;;;;;3158:2:284;20152:41:128;;;3140:21:284;3197:2;3177:18;;;3170:30;3236:16;3216:18;;;3209:44;3270:18;;20152:41:128;2956:338:284;20152:41:128;20289:14;;;;;;;:30;;;20307:12;20289:30;20285:102;;;20368:4;20339:5;:15;;;20355:9;20339:26;;;;;;;;;:::i;:::-;:33;;;;:26;;;;;;:33;20285:102;20442:12;;;;;20431:23;;;;:8;;;:23;20498:1;20483:16;;;20468:31;;;20576:13;:11;:13::i;5467:7728::-;5510:12;5596:18;;:::i;:::-;-1:-1:-1;5774:15:128;;:18;;;;5664:4;5934:18;;;;5978;;;;6022;;;;;5664:4;;5754:17;;;;5934:18;5978;6112;;;6126:4;6112:18;6108:6777;;6162:2;6191:4;6186:9;;:14;6182:144;;6302:4;6297:9;;6289:4;:18;6283:24;6182:144;6347:2;:7;;6353:1;6347:7;6343:161;;6383:10;;;;;6415:16;;;;;;;;6383:10;-1:-1:-1;6343:161:128;;;6483:2;6478:7;;6343:161;6132:386;6108:6777;;;6620:10;:18;;6634:4;6620:18;6616:6269;;1745:10;6658:14;;6616:6269;;;6756:10;:18;;6770:4;6756:18;6752:6133;;6799:1;6794:6;;6752:6133;;;6924:10;:18;;6938:4;6924:18;6920:5965;;6977:4;6962:12;;;:19;6999:26;;;:14;;;:26;7050:13;:11;:13::i;:::-;7043:20;;;;;;;;;5467:7728;:::o;6920:5965::-;7189:10;:18;;7203:4;7189:18;7185:5700;;7340:14;;;7336:2708;7185:5700;7336:2708;7510:22;;;;;7506:2538;;7635:10;7648:27;7656:2;7661:10;7656:15;7673:1;7648:7;:27::i;:::-;7759:17;;;;7635:40;;-1:-1:-1;7759:17:128;7737:19;7909:14;7928:1;7903:26;7899:131;;7971:36;7995:11;1277:21:129;1426:15;;;1467:8;1461:4;1454:22;1595:4;1582:18;;1602:19;1578:44;1624:11;1575:61;;1222:430;7971:36:128;7957:50;;7899:131;8116:20;;;;;8083:54;;;;;;;;3472:25:284;;;8083:54:128;3533:23:284;;;3513:18;;;3506:51;8052:11:128;;;;8083:19;:6;:19;;;;3445:18:284;;8083:54:128;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;8051:86;;;;8364:1;8360:2;8356:10;8461:9;8458:1;8454:17;8543:6;8536:5;8533:17;8530:40;;;8563:5;8553:15;;8530:40;;8646:6;8642:2;8639:14;8636:34;;;8666:2;8656:12;;8636:34;8772:3;8767:1;8759:6;8755:14;8750:3;8746:24;8742:34;8735:41;;8872:3;8868:1;8856:9;8847:6;8844:1;8840:14;8836:30;8832:38;8828:48;8821:55;;9027:1;9023;9019;9007:9;9004:1;9000:17;8996:25;8992:33;8988:41;9154:1;9150;9146;9137:6;9125:9;9122:1;9118:17;9114:30;9110:38;9106:46;9102:54;9084:72;;9285:10;9281:15;9275:4;9271:26;9263:34;;9401:3;9393:4;9389:9;9384:3;9380:19;9377:28;9370:35;;;;9547:33;9556:2;9561:10;9556:15;9573:1;9576:3;9547:8;:33::i;:::-;9602:20;;;:38;;;;;;;;;-1:-1:-1;7506:2538:128;;-1:-1:-1;;;7506:2538:128;;9759:18;;;;;9755:289;;9929:2;9924:7;;7185:5700;;9755:289;9983:10;9978:15;;2053:3;10015:10;;9755:289;7185:5700;;;10173:10;:18;;10187:4;10173:18;10169:2716;;10327:15;;;1824:1;10327:15;;:34;;-1:-1:-1;10346:15:128;;;1859:1;10346:15;10327:34;:57;;;-1:-1:-1;10365:19:128;;;1936:1;10365:19;10327:57;10323:1593;;;10413:2;10408:7;;10169:2716;;10323:1593;10539:23;;;;;10535:1381;;10586:10;10599:27;10607:2;10612:10;10607:15;10624:1;10599:7;:27::i;:::-;10702:17;;;;10586:40;;-1:-1:-1;10945:1:128;10937:10;;11039:1;11035:17;11114:13;;;11111:32;;;11136:5;11130:11;;11111:32;11422:14;;;11228:1;11418:22;;;11414:32;;;;11311:26;11335:1;11220:10;;;11315:18;;;11311:26;11410:43;11216:20;;11518:12;11646:17;;;:23;11714:1;11691:20;;;:24;11224:2;-1:-1:-1;11224:2:128;7185:5700;;10169:2716;12118:10;:18;;12132:4;12118:18;12114:771;;12228:2;:7;;12234:1;12228:7;12224:647;;12321:14;;;;;:40;;-1:-1:-1;12339:22:128;;;1978:1;12339:22;12321:40;:62;;;-1:-1:-1;12365:18:128;;;1897:1;12365:18;12321:62;12317:404;;;12416:1;12411:6;;12224:647;;12317:404;12462:15;;;1824:1;12462:15;;:34;;-1:-1:-1;12481:15:128;;;1859:1;12481:15;12462:34;:61;;;-1:-1:-1;12500:23:128;;;2021:1;12500:23;12462:61;:84;;;-1:-1:-1;12527:19:128;;;1936:1;12527:19;12462:84;12458:263;;;12579:1;12574:6;;7185:5700;;12224:647;12772:10;12767:15;;2087:4;12804:11;;12224:647;12960:15;;;;;:23;;;;:18;;;;:23;;;;12997:15;;:23;;;:18;;;;:23;-1:-1:-1;13086:12:128;;;;13075:23;;;:8;;;:23;13142:1;13127:16;13112:31;;;;;13165:13;:11;:13::i;15948:2480::-;16042:12;16128:18;;:::i;:::-;-1:-1:-1;16196:4:128;16228:10;16336:13;;;16345:4;16336:13;16332:1705;;-1:-1:-1;16375:8:128;;;;16332:1705;;;16494:5;:13;;16503:4;16494:13;16490:1547;;16527:14;;;:8;;;:14;16490:1547;;;16657:5;:13;;16666:4;16657:13;16653:1384;;-1:-1:-1;16696:8:128;;;;16653:1384;;;16815:5;:13;;16824:4;16815:13;16811:1226;;16848:14;;;:8;;;:14;16811:1226;;;16989:5;:13;;16998:4;16989:13;16985:1052;;17116:9;17062:17;17042;;;17062;;;;17042:37;17123:2;17116:9;;;;;17098:8;;;:28;17144:22;:8;;;:22;16985:1052;;;17303:5;:13;;17312:4;17303:13;17299:738;;17370:11;17356;;;17370;;;17356:25;17425:2;17418:9;;;;;17400:8;;;:28;17446:22;:8;;;:22;17299:738;;;17627:5;:13;;17636:4;17627:13;17623:414;;17697:3;17678:23;;17684:3;17678:23;;;;;;;:::i;:::-;;17660:42;;:8;;;:42;17738:23;;;;;;;;;;;;;:::i;:::-;;17720:42;;:8;;;:42;17623:414;;;17931:5;:13;;17940:4;17931:13;17927:110;;17981:3;17975:9;;:3;:9;;;;;;;:::i;:::-;;17964:20;;;;:8;;;:20;18013:9;;;;;;;;;;;:::i;:::-;;18002:20;;:8;;;:20;17927:110;18130:14;;;;18126:85;;18193:3;18164:5;:15;;;18180:9;18164:26;;;;;;;;;:::i;:::-;:32;;;;:26;;;;;;:32;18126:85;18265:12;;;;;18254:23;;;;:8;;;:23;18321:1;18306:16;;;18291:31;;;18398:13;:11;:13::i;:::-;18391:20;15948:2480;-1:-1:-1;;;;;;;15948:2480:128:o;23777:1654::-;23953:14;23970:24;23982:11;23970;:24::i;:::-;23953:41;;24102:1;24095:5;24091:13;24088:33;;;24117:1;24114;24107:12;24088:33;24256:2;24450:15;;;24275:2;24264:14;;24252:10;24248:31;24245:1;24241:39;24406:16;;;24191:20;;24391:10;24380:22;;;24376:27;24366:38;24363:60;24892:5;24889:1;24885:13;24963:1;24948:343;24973:2;24970:1;24967:9;24948:343;;;25096:2;25084:15;;;25033:20;25131:12;;;25145:1;25127:20;25168:42;;;;25236:1;25231:42;;;;25120:153;;25168:42;22255:1;22248:12;;;22288:2;22281:13;;;22333:2;22320:16;;25177:31;;25168:42;;25231;22255:1;22248:12;;;22288:2;22281:13;;;22333:2;22320:16;;25240:31;;25120:153;-1:-1:-1;;24991:1:128;24984:9;24948:343;;;-1:-1:-1;;25390:4:128;25383:18;-1:-1:-1;;;;23777:1654:128:o;20810:586::-;21132:20;;;21156:7;21132:32;21125:3;:40;;;21238:14;;21293:17;;21287:24;;;21279:72;;;;;;;4209:2:284;21279:72:128;;;4191:21:284;4248:2;4228:18;;;4221:30;4287:34;4267:18;;;4260:62;4358:5;4338:18;;;4331:33;4381:19;;21279:72:128;4007:399:284;21279:72:128;21365:14;20810:586;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;467:347:284:-;518:8;528:6;582:3;575:4;567:6;563:17;559:27;549:55;;600:1;597;590:12;549:55;-1:-1:-1;623:20:284;;666:18;655:30;;652:50;;;698:1;695;688:12;652:50;735:4;727:6;723:17;711:29;;787:3;780:4;771:6;763;759:19;755:30;752:39;749:59;;;804:1;801;794:12;749:59;467:347;;;;;:::o;819:717::-;909:6;917;925;933;986:2;974:9;965:7;961:23;957:32;954:52;;;1002:1;999;992:12;954:52;1042:9;1029:23;1071:18;1112:2;1104:6;1101:14;1098:34;;;1128:1;1125;1118:12;1098:34;1167:58;1217:7;1208:6;1197:9;1193:22;1167:58;:::i;:::-;1244:8;;-1:-1:-1;1141:84:284;-1:-1:-1;1332:2:284;1317:18;;1304:32;;-1:-1:-1;1348:16:284;;;1345:36;;;1377:1;1374;1367:12;1345:36;;1416:60;1468:7;1457:8;1446:9;1442:24;1416:60;:::i;:::-;819:717;;;;-1:-1:-1;1495:8:284;-1:-1:-1;;;;819:717:284:o;1723:184::-;1775:77;1772:1;1765:88;1872:4;1869:1;1862:15;1896:4;1893:1;1886:15;3568:245;3647:6;3655;3708:2;3696:9;3687:7;3683:23;3679:32;3676:52;;;3724:1;3721;3714:12;3676:52;-1:-1:-1;;3747:16:284;;3803:2;3788:18;;;3782:25;3747:16;;3782:25;;-1:-1:-1;3568:245:284:o;3818:184::-;3870:77;3867:1;3860:88;3967:4;3964:1;3957:15;3991:4;3988:1;3981:15" +var MIPSDeployedSourceMap = "1131:39568:128:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1710:45;;1745:10;1710:45;;;;;188:10:284;176:23;;;158:42;;146:2;131:18;1710:45:128;;;;;;;;2448:99;;;412:42:284;2534:6:128;400:55:284;382:74;;370:2;355:18;2448:99:128;211:251:284;25579:6339:128;;;;;;:::i;:::-;;:::i;:::-;;;1687:25:284;;;1675:2;1660:18;25579:6339:128;1541:177:284;25579:6339:128;25657:7;25700:18;;:::i;:::-;25847:4;25840:5;25837:15;25827:134;;25941:1;25938;25931:12;25827:134;25997:4;25991:11;26004;25988:28;25978:137;;26095:1;26092;26085:12;25978:137;26163:3;26145:16;26142:25;26132:150;;26262:1;26259;26252:12;26132:150;26326:3;26312:12;26309:21;26299:145;;26424:1;26421;26414:12;26299:145;26704:24;;27048:4;26750:20;27106:2;26808:21;;26704:24;26866:18;26750:20;26808:21;;;26704:24;26681:21;26677:52;;;26866:18;26750:20;;;26808:21;;;26704:24;26677:52;;26750:20;;26808:21;;;26704:24;26677:52;;26866:18;26750:20;26808:21;;;26704:24;26677:52;;26866:18;26750:20;26808:21;;;26704:24;26677:52;;26866:18;26750:20;26808:21;;;26704:24;26677:52;;;26866:18;26750:20;26808:21;;;26704:24;26681:21;26677:52;;;26866:18;26750:20;26808:21;;;26704:24;26677:52;;26866:18;26750:20;26808:21;;;26704:24;26677:52;;26866:18;26750:20;27724:10;26866:18;27714:21;;;26808;;;;27822:1;27807:77;27832:2;27829:1;27826:9;27807:77;;;26704:24;;26681:21;26677:52;26750:20;;27880:1;26808:21;;;;26692:2;26866:18;;;;27850:1;27843:9;27807:77;;;27811:14;;;27962:5;:12;;;27958:71;;;28001:13;:11;:13::i;:::-;27994:20;;;;;27958:71;28043:10;;;:15;;28057:1;28043:15;;;;;28128:8;;;;-1:-1:-1;;28120:20:128;;-1:-1:-1;28120:7:128;:20::i;:::-;28106:34;-1:-1:-1;28170:10:128;28178:2;28170:10;;;;28247:1;28237:11;;;:26;;;28252:6;:11;;28262:1;28252:11;28237:26;28233:310;;;28393:13;28462:1;28440:4;28447:10;28440:17;28439:24;;;;28410:5;:12;;;28425:10;28410:25;28409:54;28393:70;;28488:40;28499:6;:11;;28509:1;28499:11;:20;;28517:2;28499:20;;;28513:1;28499:20;28488:40;;28521:6;28488:10;:40::i;:::-;28481:47;;;;;;;;28233:310;28792:15;;;;28587:9;;;;28724:4;28718:2;28710:10;;;28709:19;;;28792:15;28817:2;28809:10;;;28808:19;28792:36;;;;;;;:::i;:::-;;;;;;-1:-1:-1;28857:5:128;28881:11;;;;;:29;;;28896:6;:14;;28906:4;28896:14;28881:29;28877:832;;;28973:5;:15;;;28989:5;28973:22;;;;;;;;;:::i;:::-;;;;;;-1:-1:-1;;29036:4:128;29030:2;29022:10;;;29021:19;28877:832;;;29074:4;29065:6;:13;;;29061:648;;;29195:6;:13;;29205:3;29195:13;:30;;;;29212:6;:13;;29222:3;29212:13;29195:30;:47;;;;29229:6;:13;;29239:3;29229:13;29195:47;29191:253;;;29305:4;29312:6;29305:13;29300:18;;29061:648;;29191:253;29404:21;29407:4;29414:6;29407:13;29422:2;29404;:21::i;:::-;29399:26;;29061:648;;;29478:4;29468:6;:14;;;;:32;;;;29486:6;:14;;29496:4;29486:14;29468:32;:50;;;;29504:6;:14;;29514:4;29504:14;29468:50;29464:245;;;29588:5;:15;;;29604:5;29588:22;;;;;;;;;:::i;:::-;;;;;29583:27;;29689:5;29681:13;;29464:245;29738:1;29728:6;:11;;;;:25;;;;;29752:1;29743:6;:10;;;29728:25;29727:42;;;;29758:6;:11;;29768:1;29758:11;29727:42;29723:125;;;29796:37;29809:6;29817:4;29823:5;29830:2;29796:12;:37::i;:::-;29789:44;;;;;;;;;;;29723:125;29881:13;29862:16;30033:4;30023:14;;;;30019:446;;30102:21;30105:4;30112:6;30105:13;30120:2;30102;:21::i;:::-;30096:27;;;;30160:10;30155:15;;30194:16;30155:15;30208:1;30194:7;:16::i;:::-;30188:22;;30242:4;30232:6;:14;;;;:32;;;;;30250:6;:14;;30260:4;30250:14;;30232:32;30228:223;;;30329:4;30317:16;;30431:1;30423:9;;30228:223;30039:426;30019:446;30498:10;30511:26;30519:4;30525:2;30529;30533:3;30511:7;:26::i;:::-;30540:10;30511:39;;;;-1:-1:-1;30636:4:128;30629:11;;;30668;;;:24;;;;;30691:1;30683:4;:9;;;;30668:24;:39;;;;;30703:4;30696;:11;;;30668:39;30664:847;;;30731:4;:9;;30739:1;30731:9;:22;;;;30744:4;:9;;30752:1;30744:9;30731:22;30727:144;;;30815:37;30826:4;:9;;30834:1;30826:9;:21;;30842:5;30826:21;;;30838:1;30826:21;30849:2;30815:10;:37::i;:::-;30808:44;;;;;;;;;;;;;;;30727:144;30893:4;:11;;30901:3;30893:11;30889:121;;30963:28;30972:5;30979:2;30983:7;;;;30963:8;:28::i;30889:121::-;31031:4;:11;;31039:3;31031:11;31027:121;;31101:28;31110:5;31117:2;31121:7;;;;;31101:8;:28::i;31027:121::-;31218:4;:11;;31226:3;31218:11;31214:80;;31260:15;:13;:15::i;31214:80::-;31397:4;31389;:12;;;;:27;;;;;31412:4;31405;:11;;;31389:27;31385:112;;;31447:31;31458:4;31464:2;31468;31472:5;31447:10;:31::i;31385:112::-;31571:6;:14;;31581:4;31571:14;:28;;;;-1:-1:-1;31589:10:128;;;;;31571:28;31567:93;;;31644:1;31619:5;:15;;;31635:5;31619:22;;;;;;;;;:::i;:::-;:26;;;;:22;;;;;;:26;31567:93;31706:9;:26;;31719:13;31706:26;31702:92;;31752:27;31761:9;31772:1;31775:3;31752:8;:27::i;:::-;31875:26;31884:5;31891:3;31896:4;31875:8;:26::i;:::-;31868:33;;;;;;;;;;;;;25579:6339;;;;;;;:::o;3087:2334::-;3634:4;3628:11;;3550:4;3353:31;3342:43;;3413:13;3353:31;3752:2;3452:13;;3342:43;3359:24;3353:31;3452:13;;;3342:43;;;;3359:24;3353:31;3452:13;;;3342:43;3359:24;3353:31;3452:13;;;3342:43;3359:24;3353:31;3452:13;;;3342:43;3359:24;3353:31;3452:13;;;3342:43;3359:24;3353:31;3452:13;;;3342:43;3413:13;4180:11;3359:24;3353:31;3452:13;;;3342:43;3413:13;4275:11;3359:24;3353:31;3452:13;;;3342:43;3359:24;3353:31;3452:13;;;3342:43;3128:12;;4415:13;;3628:11;;3452:13;;;;4180:11;3128:12;4495:84;4520:2;4517:1;4514:9;4495:84;;;3369:13;3359:24;;3353:31;3342:43;;3373:2;3413:13;;;;4575:1;3452:13;;;;4538:1;4531:9;4495:84;;;4499:14;4642:1;4638:2;4631:13;4737:5;4733:2;4729:14;4722:5;4717:27;4811:1;4797:15;;4832:6;4856:1;4851:273;;;;5191:1;5181:11;;4825:369;;4851:273;4883:8;4941:22;;;;5020:1;5015:22;;;;5107:1;5097:11;;4876:234;;4941:22;4960:1;4950:11;;4941:22;;5015;5034:1;5024:11;;4876:234;;4825:369;-1:-1:-1;;;5317:14:128;;;5300:32;;5360:19;5356:30;5392:3;5388:16;;;;5353:52;;3087:2334;-1:-1:-1;3087:2334:128:o;21634:1831::-;21707:11;21818:14;21835:24;21847:11;21835;:24::i;:::-;21818:41;;21967:1;21960:5;21956:13;21953:33;;;21982:1;21979;21972:12;21953:33;22115:2;22103:15;;;22056:20;22545:5;22542:1;22538:13;22580:4;22616:1;22601:343;22626:2;22623:1;22620:9;22601:343;;;22749:2;22737:15;;;22686:20;22784:12;;;22798:1;22780:20;22821:42;;;;22889:1;22884:42;;;;22773:153;;22821:42;22279:1;22272:12;;;22312:2;22305:13;;;22357:2;22344:16;;22830:31;;22821:42;;22884;22279:1;22272:12;;;22312:2;22305:13;;;22357:2;22344:16;;22893:31;;22773:153;-1:-1:-1;;22644:1:128;22637:9;22601:343;;;22605:14;23054:4;23048:11;23033:26;;23140:7;23134:4;23131:17;23121:124;;23182:10;23179:1;23172:21;23224:2;23221:1;23214:13;23121:124;-1:-1:-1;;23372:2:128;23361:14;;;;23349:10;23345:31;23342:1;23338:39;23406:16;;;;23424:10;23402:33;;21634:1831;-1:-1:-1;;;21634:1831:128:o;18744:823::-;18813:12;18900:18;;:::i;:::-;18968:4;18959:13;;19020:5;:8;;;19031:1;19020:12;19004:28;;:5;:12;;;:28;;;19000:95;;19052:28;;;;;2114:2:284;19052:28:128;;;2096:21:284;2153:2;2133:18;;;2126:30;2192:20;2172:18;;;2165:48;2230:18;;19052:28:128;;;;;;;;19000:95;19184:8;;;;;19217:12;;;;;19206:23;;;;;;;19243:20;;;;;19184:8;19375:13;;;19371:90;;19436:6;19445:1;19436:10;19408:5;:15;;;19424:8;19408:25;;;;;;;;;:::i;:::-;:38;;;;:25;;;;;;:38;19371:90;19537:13;:11;:13::i;:::-;19530:20;18744:823;-1:-1:-1;;;;;18744:823:128:o;2645:339::-;2706:11;2770:18;;;;2779:8;;;;2770:18;;;;;;2769:25;;;;;2786:1;2833:2;:9;;;2827:16;;;;;2826:22;;2825:32;;;;;;;2887:9;;2886:15;2769:25;2944:21;;2964:1;2944:21;;;2955:6;2944:21;2929:11;;;;;:37;;-1:-1:-1;;;2645:339:128;;;;:::o;13620:2026::-;13717:12;13803:18;;:::i;:::-;13871:4;13862:13;;13903:17;13963:5;:8;;;13974:1;13963:12;13947:28;;:5;:12;;;:28;;;13943:97;;13995:30;;;;;2461:2:284;13995:30:128;;;2443:21:284;2500:2;2480:18;;;2473:30;2539:22;2519:18;;;2512:50;2579:18;;13995:30:128;2259:344:284;13943:97:128;14110:7;:12;;14121:1;14110:12;:28;;;;14126:7;:12;;14137:1;14126:12;14110:28;14106:947;;;14158:9;14170:5;:15;;;14186:6;14170:23;;;;;;;;;:::i;:::-;;;;;14158:35;;14234:2;14227:9;;:3;:9;;;:25;;;;;14240:7;:12;;14251:1;14240:12;14227:25;14226:58;;;;14265:2;14258:9;;:3;:9;;;;:25;;;;;14271:7;:12;;14282:1;14271:12;14258:25;14211:73;;14140:159;14106:947;;;14396:7;:12;;14407:1;14396:12;14392:661;;14457:1;14449:3;14443:15;;;;14428:30;;14392:661;;;14561:7;:12;;14572:1;14561:12;14557:496;;14621:1;14614:3;14608:14;;;14593:29;;14557:496;;;14742:7;:12;;14753:1;14742:12;14738:315;;14830:4;14824:2;14815:11;;;14814:20;14800:10;14857:8;;;14853:84;;14917:1;14910:3;14904:14;;;14889:29;;14853:84;14958:3;:8;;14965:1;14958:8;14954:85;;15019:1;15011:3;15005:15;;;;14990:30;;14954:85;14756:297;14738:315;15129:8;;;;;15207:12;;;;15196:23;;;;;15363:178;;;;15454:1;15428:22;15431:5;15439:6;15431:14;15447:2;15428;:22::i;:::-;:27;;;;;;;15414:42;;15423:1;15414:42;15399:57;:12;;;:57;15363:178;;;15510:12;;;;;15525:1;15510:16;15495:31;;;;15363:178;15616:13;:11;:13::i;:::-;15609:20;13620:2026;-1:-1:-1;;;;;;;;13620:2026:128:o;31964:8733::-;32051:10;32113;32121:2;32113:10;;;;32152:11;;;:44;;;32178:1;32168:6;:11;;;;:27;;;;;32192:3;32183:6;:12;;;32168:27;32148:8490;;;32237:4;32230:11;;32361:6;32421:3;32416:25;;;;32496:3;32491:25;;;;32570:3;32565:25;;;;32645:3;32640:25;;;;32719:3;32714:25;;;;32792:3;32787:25;;;;32866:3;32861:25;;;;32354:532;;32416:25;32435:4;32427:12;;32416:25;;32491;32510:4;32502:12;;32491:25;;32565;32584:4;32576:12;;32565:25;;32640;32659:4;32651:12;;32640:25;;32714;32733:4;32725:12;;32714:25;;32787;32806:4;32798:12;;32787:25;;32861;32880:4;32872:12;;32354:532;;32949:4;:12;;32957:4;32949:12;32945:4023;;-1:-1:-1;;;33000:9:128;32992:26;;33013:4;33008:1;33000:9;;;32999:18;32992:26;32985:33;;32945:4023;33086:4;:12;;33094:4;33086:12;33082:3886;;-1:-1:-1;;;33137:9:128;33129:26;;33150:4;33145:1;33137:9;;;33136:18;33129:26;33122:33;;33082:3886;33223:4;:12;;33231:4;33223:12;33219:3749;;33288:4;33283:1;33275:9;;;33274:18;33321:27;33275:9;33324:11;;;;33337:2;:10;;;33321:2;:27::i;:::-;33314:34;;;;;;;33219:3749;33417:4;:12;;33425:4;33417:12;33413:3555;;-1:-1:-1;;;33460:17:128;;;33472:4;33467:9;;33460:17;33453:24;;33413:3555;33546:4;:11;;33554:3;33546:11;33542:3426;;-1:-1:-1;;;33588:17:128;;;33600:4;33595:9;;33588:17;33581:24;;33542:3426;33674:4;:12;;33682:4;33674:12;33670:3298;;33717:21;33726:2;33720:8;;:2;:8;;;;33735:2;33730;:7;33717:2;:21::i;:::-;33710:28;;;;;;33670:3298;33987:4;:12;;33995:4;33987:12;33983:2985;;34030:2;34023:9;;;;;;33983:2985;34101:4;:12;;34109:4;34101:12;34097:2871;;34144:2;34137:9;;;;;;34097:2871;34215:4;:12;;34223:4;34215:12;34211:2757;;34258:2;34251:9;;;;;;34211:2757;34329:4;:12;;34337:4;34329:12;34325:2643;;34372:2;34365:9;;;;;;34325:2643;34446:4;:12;;34454:4;34446:12;34442:2526;;34489:2;34482:9;;;;;;34442:2526;34606:4;:12;;34614:4;34606:12;34602:2366;;34649:2;34642:9;;;;;;34602:2366;34720:4;:12;;34728:4;34720:12;34716:2252;;34763:2;34756:9;;;;;;34716:2252;34834:4;:12;;34842:4;34834:12;34830:2138;;34877:2;34870:9;;;;;;34830:2138;34948:4;:12;;34956:4;34948:12;34944:2024;;34991:2;34984:9;;;;;;34944:2024;35062:4;:12;;35070:4;35062:12;35058:1910;;35105:2;35098:9;;;;;;35058:1910;35176:4;:12;;35184:4;35176:12;35172:1796;;35219:2;35212:9;;;;;;35172:1796;35291:4;:12;;35299:4;35291:12;35287:1681;;35334:2;35327:9;;;;;;35287:1681;35404:4;:12;;35412:4;35404:12;35400:1568;;35447:2;35440:9;;;;;;35400:1568;35518:4;:12;;35526:4;35518:12;35514:1454;;35561:2;35554:9;;;;;;35514:1454;35710:4;:12;;35718:4;35710:12;35706:1262;;-1:-1:-1;;;35754:7:128;;;35746:16;;35706:1262;35831:4;:12;;35839:4;35831:12;35827:1141;;-1:-1:-1;;;35875:7:128;;;35867:16;;35827:1141;35951:4;:12;;35959:4;35951:12;35947:1021;;-1:-1:-1;;;35995:7:128;;;35987:16;;35947:1021;36072:4;:12;;36080:4;36072:12;36068:900;;-1:-1:-1;;;36116:7:128;;;36108:16;;36068:900;36192:4;:12;;36200:4;36192:12;36188:780;;-1:-1:-1;;;36236:7:128;;;36228:16;;36188:780;36311:4;:12;;36319:4;36311:12;36307:661;;-1:-1:-1;;;36355:7:128;;;36347:16;;36307:661;36431:4;:12;;36439:4;36431:12;36427:541;;-1:-1:-1;;;36475:7:128;;;36467:16;;36427:541;36551:4;:12;;36559:4;36551:12;36547:421;;-1:-1:-1;;;36596:7:128;;;36594:10;36587:17;;36547:421;36673:4;:12;;36681:4;36673:12;36669:299;;36734:2;36716:21;;36722:2;36716:21;;;:29;;36744:1;36716:29;;;36740:1;36716:29;36709:36;;;;;;;;36669:299;36815:4;:12;;36823:4;36815:12;36811:157;;36863:2;36858:7;;:2;:7;;;:15;;36872:1;36858:15;;36811:157;36920:29;;;;;2810:2:284;36920:29:128;;;2792:21:284;2849:2;2829:18;;;2822:30;2888:21;2868:18;;;2861:49;2927:18;;36920:29:128;2608:343:284;36811:157:128;32198:4784;32148:8490;;;37038:6;:14;;37048:4;37038:14;37034:3590;;37097:4;37090:11;;37172:3;37164:11;;;37160:549;;-1:-1:-1;;;37217:21:128;;;37203:36;;37160:549;37324:4;:12;;37332:4;37324:12;:28;;;;37340:4;:12;;37348:4;37340:12;37324:28;37320:389;;;37384:4;:12;;37392:4;37384:12;37380:83;;37433:3;;;37380:83;37488:8;37526:127;37538:10;37533:15;;:20;37526:127;;37618:8;37585:3;37618:8;;;;;37585:3;37526:127;;;37685:1;-1:-1:-1;37678:8:128;;-1:-1:-1;;37678:8:128;37034:3590;37776:6;:14;;37786:4;37776:14;37772:2852;;-1:-1:-1;;37821:8:128;37827:2;37821:8;;;;37814:15;;37772:2852;37896:6;:14;;37906:4;37896:14;37892:2732;;37941:42;37959:2;37964:1;37959:6;37969:1;37958:12;37953:2;:17;37945:26;;:3;:26;;;;37975:4;37944:35;37981:1;37941:2;:42::i;37892:2732::-;38050:6;:14;;38060:4;38050:14;38046:2578;;38095:45;38113:2;38118:1;38113:6;38123:1;38112:12;38107:2;:17;38099:26;;:3;:26;;;;38129:6;38098:37;38137:2;38095;:45::i;38046:2578::-;38208:6;:14;;38218:4;38208:14;38204:2420;;-1:-1:-1;;38259:21:128;38278:1;38273;38268:6;;38267:12;38259:21;;38316:36;;;38387:5;38382:10;;38259:21;;;;;38381:18;38374:25;;38204:2420;38466:6;:14;;38476:4;38466:14;38462:2162;;38511:3;38504:10;;;;;38462:2162;38582:6;:14;;38592:4;38582:14;38578:2046;;38642:2;38647:1;38642:6;38652:1;38641:12;38636:2;:17;38628:26;;:3;:26;;;;38658:4;38627:35;38620:42;;;;;38578:2046;38731:6;:14;;38741:4;38731:14;38727:1897;;38791:2;38796:1;38791:6;38801:1;38790:12;38785:2;:17;38777:26;;:3;:26;;;;38807:6;38776:37;38769:44;;;;;38727:1897;38882:6;:14;;38892:4;38882:14;38878:1746;;-1:-1:-1;;38933:26:128;38957:1;38952;38947:6;;38946:12;38941:2;:17;38933:26;;38995:41;;;39071:5;39066:10;;38933:26;;;;;39065:18;39058:25;;38878:1746;39151:6;:14;;39161:4;39151:14;39147:1477;;-1:-1:-1;;39208:4:128;39202:34;39234:1;39229;39224:6;;39223:12;39218:2;:17;39202:34;;39292:27;;;39272:48;;;39350:10;;39203:9;;;39202:34;;39349:18;39342:25;;39147:1477;39435:6;:14;;39445:4;39435:14;39431:1193;;-1:-1:-1;;39492:6:128;39486:36;39520:1;39515;39510:6;;39509:12;39504:2;:17;39486:36;;39578:29;;;39558:50;;;39638:10;;39487:11;;;39486:36;;39637:18;39630:25;;39431:1193;39724:6;:14;;39734:4;39724:14;39720:904;;-1:-1:-1;;39775:20:128;39793:1;39788;39783:6;;39782:12;39775:20;;39831:36;;;39903:5;39897:11;;39775:20;;;;;39896:19;39889:26;;39720:904;39983:6;:14;;39993:4;39983:14;39979:645;;40028:2;40021:9;;;;;39979:645;40099:6;:14;;40109:4;40099:14;40095:529;;-1:-1:-1;;40150:25:128;40173:1;40168;40163:6;;40162:12;40157:2;:17;40150:25;;40211:41;;;40288:5;40282:11;;40150:25;;;;;40281:19;40274:26;;40095:529;40367:6;:14;;40377:4;40367:14;40363:261;;40412:3;40405:10;;;;;40363:261;40482:6;:14;;40492:4;40482:14;40478:146;;40527:2;40520:9;;;;;19848:782;19934:12;20021:18;;:::i;:::-;-1:-1:-1;20089:4:128;20196:2;20184:14;;;;20176:41;;;;;;;3158:2:284;20176:41:128;;;3140:21:284;3197:2;3177:18;;;3170:30;3236:16;3216:18;;;3209:44;3270:18;;20176:41:128;2956:338:284;20176:41:128;20313:14;;;;;;;:30;;;20331:12;20313:30;20309:102;;;20392:4;20363:5;:15;;;20379:9;20363:26;;;;;;;;;:::i;:::-;:33;;;;:26;;;;;;:33;20309:102;20466:12;;;;;20455:23;;;;:8;;;:23;20522:1;20507:16;;;20492:31;;;20600:13;:11;:13::i;5506:7728::-;5549:12;5635:18;;:::i;:::-;-1:-1:-1;5813:15:128;;:18;;;;5703:4;5973:18;;;;6017;;;;6061;;;;;5703:4;;5793:17;;;;5973:18;6017;6151;;;6165:4;6151:18;6147:6777;;6201:2;6230:4;6225:9;;:14;6221:144;;6341:4;6336:9;;6328:4;:18;6322:24;6221:144;6386:2;:7;;6392:1;6386:7;6382:161;;6422:10;;;;;6454:16;;;;;;;;6422:10;-1:-1:-1;6382:161:128;;;6522:2;6517:7;;6382:161;6171:386;6147:6777;;;6659:10;:18;;6673:4;6659:18;6655:6269;;1745:10;6697:14;;6655:6269;;;6795:10;:18;;6809:4;6795:18;6791:6133;;6838:1;6833:6;;6791:6133;;;6963:10;:18;;6977:4;6963:18;6959:5965;;7016:4;7001:12;;;:19;7038:26;;;:14;;;:26;7089:13;:11;:13::i;:::-;7082:20;;;;;;;;;5506:7728;:::o;6959:5965::-;7228:10;:18;;7242:4;7228:18;7224:5700;;7379:14;;;7375:2708;7224:5700;7375:2708;7549:22;;;;;7545:2538;;7674:10;7687:27;7695:2;7700:10;7695:15;7712:1;7687:7;:27::i;:::-;7798:17;;;;7674:40;;-1:-1:-1;7798:17:128;7776:19;7948:14;7967:1;7942:26;7938:131;;8010:36;8034:11;1277:21:129;1426:15;;;1467:8;1461:4;1454:22;1595:4;1582:18;;1602:19;1578:44;1624:11;1575:61;;1222:430;8010:36:128;7996:50;;7938:131;8155:20;;;;;8122:54;;;;;;;;3472:25:284;;;8122:54:128;3533:23:284;;;3513:18;;;3506:51;8091:11:128;;;;8122:19;:6;:19;;;;3445:18:284;;8122:54:128;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;8090:86;;;;8403:1;8399:2;8395:10;8500:9;8497:1;8493:17;8582:6;8575:5;8572:17;8569:40;;;8602:5;8592:15;;8569:40;;8685:6;8681:2;8678:14;8675:34;;;8705:2;8695:12;;8675:34;8811:3;8806:1;8798:6;8794:14;8789:3;8785:24;8781:34;8774:41;;8911:3;8907:1;8895:9;8886:6;8883:1;8879:14;8875:30;8871:38;8867:48;8860:55;;9066:1;9062;9058;9046:9;9043:1;9039:17;9035:25;9031:33;9027:41;9193:1;9189;9185;9176:6;9164:9;9161:1;9157:17;9153:30;9149:38;9145:46;9141:54;9123:72;;9324:10;9320:15;9314:4;9310:26;9302:34;;9440:3;9432:4;9428:9;9423:3;9419:19;9416:28;9409:35;;;;9586:33;9595:2;9600:10;9595:15;9612:1;9615:3;9586:8;:33::i;:::-;9641:20;;;:38;;;;;;;;;-1:-1:-1;7545:2538:128;;-1:-1:-1;;;7545:2538:128;;9798:18;;;;;9794:289;;9968:2;9963:7;;7224:5700;;9794:289;10022:10;10017:15;;2053:3;10054:10;;9794:289;7224:5700;;;10212:10;:18;;10226:4;10212:18;10208:2716;;10366:15;;;1824:1;10366:15;;:34;;-1:-1:-1;10385:15:128;;;1859:1;10385:15;10366:34;:57;;;-1:-1:-1;10404:19:128;;;1936:1;10404:19;10366:57;10362:1593;;;10452:2;10447:7;;10208:2716;;10362:1593;10578:23;;;;;10574:1381;;10625:10;10638:27;10646:2;10651:10;10646:15;10663:1;10638:7;:27::i;:::-;10741:17;;;;10625:40;;-1:-1:-1;10984:1:128;10976:10;;11078:1;11074:17;11153:13;;;11150:32;;;11175:5;11169:11;;11150:32;11461:14;;;11267:1;11457:22;;;11453:32;;;;11350:26;11374:1;11259:10;;;11354:18;;;11350:26;11449:43;11255:20;;11557:12;11685:17;;;:23;11753:1;11730:20;;;:24;11263:2;-1:-1:-1;11263:2:128;7224:5700;;10208:2716;12157:10;:18;;12171:4;12157:18;12153:771;;12267:2;:7;;12273:1;12267:7;12263:647;;12360:14;;;;;:40;;-1:-1:-1;12378:22:128;;;1978:1;12378:22;12360:40;:62;;;-1:-1:-1;12404:18:128;;;1897:1;12404:18;12360:62;12356:404;;;12455:1;12450:6;;12263:647;;12356:404;12501:15;;;1824:1;12501:15;;:34;;-1:-1:-1;12520:15:128;;;1859:1;12520:15;12501:34;:61;;;-1:-1:-1;12539:23:128;;;2021:1;12539:23;12501:61;:84;;;-1:-1:-1;12566:19:128;;;1936:1;12566:19;12501:84;12497:263;;;12618:1;12613:6;;7224:5700;;12263:647;12811:10;12806:15;;2087:4;12843:11;;12263:647;12999:15;;;;;:23;;;;:18;;;;:23;;;;13036:15;;:23;;;:18;;;;:23;-1:-1:-1;13125:12:128;;;;13114:23;;;:8;;;:23;13181:1;13166:16;13151:31;;;;;13204:13;:11;:13::i;15972:2480::-;16066:12;16152:18;;:::i;:::-;-1:-1:-1;16220:4:128;16252:10;16360:13;;;16369:4;16360:13;16356:1705;;-1:-1:-1;16399:8:128;;;;16356:1705;;;16518:5;:13;;16527:4;16518:13;16514:1547;;16551:14;;;:8;;;:14;16514:1547;;;16681:5;:13;;16690:4;16681:13;16677:1384;;-1:-1:-1;16720:8:128;;;;16677:1384;;;16839:5;:13;;16848:4;16839:13;16835:1226;;16872:14;;;:8;;;:14;16835:1226;;;17013:5;:13;;17022:4;17013:13;17009:1052;;17140:9;17086:17;17066;;;17086;;;;17066:37;17147:2;17140:9;;;;;17122:8;;;:28;17168:22;:8;;;:22;17009:1052;;;17327:5;:13;;17336:4;17327:13;17323:738;;17394:11;17380;;;17394;;;17380:25;17449:2;17442:9;;;;;17424:8;;;:28;17470:22;:8;;;:22;17323:738;;;17651:5;:13;;17660:4;17651:13;17647:414;;17721:3;17702:23;;17708:3;17702:23;;;;;;;:::i;:::-;;17684:42;;:8;;;:42;17762:23;;;;;;;;;;;;;:::i;:::-;;17744:42;;:8;;;:42;17647:414;;;17955:5;:13;;17964:4;17955:13;17951:110;;18005:3;17999:9;;:3;:9;;;;;;;:::i;:::-;;17988:20;;;;:8;;;:20;18037:9;;;;;;;;;;;:::i;:::-;;18026:20;;:8;;;:20;17951:110;18154:14;;;;18150:85;;18217:3;18188:5;:15;;;18204:9;18188:26;;;;;;;;;:::i;:::-;:32;;;;:26;;;;;;:32;18150:85;18289:12;;;;;18278:23;;;;:8;;;:23;18345:1;18330:16;;;18315:31;;;18422:13;:11;:13::i;:::-;18415:20;15972:2480;-1:-1:-1;;;;;;;15972:2480:128:o;23801:1654::-;23977:14;23994:24;24006:11;23994;:24::i;:::-;23977:41;;24126:1;24119:5;24115:13;24112:33;;;24141:1;24138;24131:12;24112:33;24280:2;24474:15;;;24299:2;24288:14;;24276:10;24272:31;24269:1;24265:39;24430:16;;;24215:20;;24415:10;24404:22;;;24400:27;24390:38;24387:60;24916:5;24913:1;24909:13;24987:1;24972:343;24997:2;24994:1;24991:9;24972:343;;;25120:2;25108:15;;;25057:20;25155:12;;;25169:1;25151:20;25192:42;;;;25260:1;25255:42;;;;25144:153;;25192:42;22279:1;22272:12;;;22312:2;22305:13;;;22357:2;22344:16;;25201:31;;25192:42;;25255;22279:1;22272:12;;;22312:2;22305:13;;;22357:2;22344:16;;25264:31;;25144:153;-1:-1:-1;;25015:1:128;25008:9;24972:343;;;-1:-1:-1;;25414:4:128;25407:18;-1:-1:-1;;;;23801:1654:128:o;20834:586::-;21156:20;;;21180:7;21156:32;21149:3;:40;;;21262:14;;21317:17;;21311:24;;;21303:72;;;;;;;4209:2:284;21303:72:128;;;4191:21:284;4248:2;4228:18;;;4221:30;4287:34;4267:18;;;4260:62;4358:5;4338:18;;;4331:33;4381:19;;21303:72:128;4007:399:284;21303:72:128;21389:14;20834:586;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;467:347:284:-;518:8;528:6;582:3;575:4;567:6;563:17;559:27;549:55;;600:1;597;590:12;549:55;-1:-1:-1;623:20:284;;666:18;655:30;;652:50;;;698:1;695;688:12;652:50;735:4;727:6;723:17;711:29;;787:3;780:4;771:6;763;759:19;755:30;752:39;749:59;;;804:1;801;794:12;749:59;467:347;;;;;:::o;819:717::-;909:6;917;925;933;986:2;974:9;965:7;961:23;957:32;954:52;;;1002:1;999;992:12;954:52;1042:9;1029:23;1071:18;1112:2;1104:6;1101:14;1098:34;;;1128:1;1125;1118:12;1098:34;1167:58;1217:7;1208:6;1197:9;1193:22;1167:58;:::i;:::-;1244:8;;-1:-1:-1;1141:84:284;-1:-1:-1;1332:2:284;1317:18;;1304:32;;-1:-1:-1;1348:16:284;;;1345:36;;;1377:1;1374;1367:12;1345:36;;1416:60;1468:7;1457:8;1446:9;1442:24;1416:60;:::i;:::-;819:717;;;;-1:-1:-1;1495:8:284;-1:-1:-1;;;;819:717:284:o;1723:184::-;1775:77;1772:1;1765:88;1872:4;1869:1;1862:15;1896:4;1893:1;1886:15;3568:245;3647:6;3655;3708:2;3696:9;3687:7;3683:23;3679:32;3676:52;;;3724:1;3721;3714:12;3676:52;-1:-1:-1;;3747:16:284;;3803:2;3788:18;;;3782:25;3747:16;;3782:25;;-1:-1:-1;3568:245:284:o;3818:184::-;3870:77;3867:1;3860:88;3967:4;3964:1;3957:15;3991:4;3988:1;3981:15" func init() { if err := json.Unmarshal([]byte(MIPSStorageLayoutJSON), MIPSStorageLayout); err != nil { diff --git a/op-challenger/Dockerfile b/op-challenger/Dockerfile index 1bd0ebebcb2f2efae6b218719a117eb11f46c523..b234dae70e2cf3688cb37af5efd53bd53f8aafba 100644 --- a/op-challenger/Dockerfile +++ b/op-challenger/Dockerfile @@ -18,7 +18,6 @@ COPY ./op-preimage /app/op-preimage COPY ./op-bindings /app/op-bindings COPY ./op-node /app/op-node COPY ./op-service /app/op-service -COPY ./op-signer /app/op-signer COPY ./.git /app/.git # Copy cannon and its dependencies diff --git a/op-node/chaincfg/chains_test.go b/op-node/chaincfg/chains_test.go index 76aca238b91eff4b0544d3cb43b330226c1c81f0..78ec73f732fe1fc0460e9665036c8d953d31de17 100644 --- a/op-node/chaincfg/chains_test.go +++ b/op-node/chaincfg/chains_test.go @@ -84,16 +84,17 @@ var goerliCfg = rollup.Config{ GasLimit: 25_000_000, }, }, - BlockTime: 2, - MaxSequencerDrift: 600, - SeqWindowSize: 3600, - ChannelTimeout: 300, - L1ChainID: big.NewInt(5), - L2ChainID: big.NewInt(420), - BatchInboxAddress: common.HexToAddress("0xff00000000000000000000000000000000000420"), - DepositContractAddress: common.HexToAddress("0x5b47E1A08Ea6d985D6649300584e6722Ec4B1383"), - L1SystemConfigAddress: common.HexToAddress("0xAe851f927Ee40dE99aaBb7461C00f9622ab91d60"), - RegolithTime: u64Ptr(1679079600), + BlockTime: 2, + MaxSequencerDrift: 600, + SeqWindowSize: 3600, + ChannelTimeout: 300, + L1ChainID: big.NewInt(5), + L2ChainID: big.NewInt(420), + BatchInboxAddress: common.HexToAddress("0xff00000000000000000000000000000000000420"), + DepositContractAddress: common.HexToAddress("0x5b47E1A08Ea6d985D6649300584e6722Ec4B1383"), + L1SystemConfigAddress: common.HexToAddress("0xAe851f927Ee40dE99aaBb7461C00f9622ab91d60"), + RegolithTime: u64Ptr(1679079600), + ProtocolVersionsAddress: common.HexToAddress("0x0C24F5098774aA366827D667494e9F889f7cFc08"), } var sepoliaCfg = rollup.Config{ diff --git a/op-node/rollup/superchain.go b/op-node/rollup/superchain.go index ffcdbed832d53e0ce909fb8d3750509f5ba1e359..2235a0051e86d7797af997e894c66e6a958b978a 100644 --- a/op-node/rollup/superchain.go +++ b/op-node/rollup/superchain.go @@ -25,6 +25,7 @@ const ( zoraGoerli = 999 zoraMainnet = 7777777 labsDevnet = 997 + chaosnet = 888 ) // LoadOPStackRollupConfig loads the rollup configuration of the requested chain ID from the superchain-registry. @@ -69,6 +70,8 @@ func LoadOPStackRollupConfig(chainID uint64) (*Config, error) { regolithTime = 1679079600 case labsDevnet: regolithTime = 1677984480 + case chaosnet: + regolithTime = 1692156862 } cfg := &Config{ @@ -102,7 +105,7 @@ func LoadOPStackRollupConfig(chainID uint64) (*Config, error) { if superChain.Config.ProtocolVersionsAddr != nil { // Set optional protocol versions address cfg.ProtocolVersionsAddress = common.Address(*superChain.Config.ProtocolVersionsAddr) } - if chainID == labsDevnet { + if chainID == labsDevnet || chainID == chaosnet { cfg.ChannelTimeout = 120 cfg.MaxSequencerDrift = 1200 } diff --git a/op-proposer/Dockerfile b/op-proposer/Dockerfile index 02ad7ef5cb83085959c2b06d0770cae3e6eed8df..ae335221733dabf48c0f7de5dacf6828614776bd 100644 --- a/op-proposer/Dockerfile +++ b/op-proposer/Dockerfile @@ -16,7 +16,6 @@ COPY ./op-proposer /app/op-proposer COPY ./op-bindings /app/op-bindings COPY ./op-node /app/op-node COPY ./op-service /app/op-service -COPY ./op-signer /app/op-signer COPY ./.git /app/.git WORKDIR /app/op-proposer diff --git a/op-service/crypto/signature.go b/op-service/crypto/signature.go index 687ff1a46a7f4b6f6cabbb81b6cdac4cfacb75ff..c0abd3ef2afdca705a9c95b8b87552f9eca7b87e 100644 --- a/op-service/crypto/signature.go +++ b/op-service/crypto/signature.go @@ -17,7 +17,7 @@ import ( "github.com/ethereum/go-ethereum/log" hdwallet "github.com/ethereum-optimism/go-ethereum-hdwallet" - opsigner "github.com/ethereum-optimism/optimism/op-signer/client" + opsigner "github.com/ethereum-optimism/optimism/op-service/signer" ) func PrivateKeySignerFn(key *ecdsa.PrivateKey, chainID *big.Int) bind.SignerFn { diff --git a/op-signer/client/config.go b/op-service/signer/cli.go similarity index 99% rename from op-signer/client/config.go rename to op-service/signer/cli.go index 6071f0f1de2d7d10f6ca39e926a196670e02745a..1da5330dc4d61a27d9f6e46482c86c639fed19b2 100644 --- a/op-signer/client/config.go +++ b/op-service/signer/cli.go @@ -1,4 +1,4 @@ -package client +package signer import ( "errors" diff --git a/op-signer/client/config_test.go b/op-service/signer/cli_test.go similarity index 99% rename from op-signer/client/config_test.go rename to op-service/signer/cli_test.go index 862cfa35783d1f5b4105a5366d307c72de3c2cab..a7fd7385a30e8ef21cdfa2e6004407da06690523 100644 --- a/op-signer/client/config_test.go +++ b/op-service/signer/cli_test.go @@ -1,4 +1,4 @@ -package client +package signer import ( "testing" diff --git a/op-signer/client/client.go b/op-service/signer/client.go similarity index 99% rename from op-signer/client/client.go rename to op-service/signer/client.go index c8e273dbe03b8d88ff4bc4154d564a3cc0e8f542..e5baa33568f8ea667eb47340e390dd8a3bf538de 100644 --- a/op-signer/client/client.go +++ b/op-service/signer/client.go @@ -1,4 +1,4 @@ -package client +package signer import ( "context" diff --git a/op-signer/client/transaction_args.go b/op-service/signer/transaction_args.go similarity index 99% rename from op-signer/client/transaction_args.go rename to op-service/signer/transaction_args.go index 480d46a15e103bc7c6ff7c2e050270ca3ee02dff..ea9fcd4862318f839f3107c88f63e9d5acb611f5 100644 --- a/op-signer/client/transaction_args.go +++ b/op-service/signer/transaction_args.go @@ -1,4 +1,4 @@ -package client +package signer import ( "math/big" diff --git a/op-service/txmgr/cli.go b/op-service/txmgr/cli.go index 3ac3df203e55607668ef3997e8ebb4680a8b5b05..cf8419ce60ac31d3993b78be2294e8a050a7ab47 100644 --- a/op-service/txmgr/cli.go +++ b/op-service/txmgr/cli.go @@ -9,7 +9,7 @@ import ( opservice "github.com/ethereum-optimism/optimism/op-service" opcrypto "github.com/ethereum-optimism/optimism/op-service/crypto" - "github.com/ethereum-optimism/optimism/op-signer/client" + opsigner "github.com/ethereum-optimism/optimism/op-service/signer" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/ethclient" "github.com/ethereum/go-ethereum/log" @@ -19,7 +19,7 @@ import ( const ( // Duplicated L1 RPC flag L1RPCFlagName = "l1-eth-rpc" - // Key Management Flags (also have op-signer client flags) + // Key Management Flags (also have signer client flags) MnemonicFlagName = "mnemonic" HDPathFlagName = "hd-path" PrivateKeyFlagName = "private-key" @@ -145,7 +145,7 @@ func CLIFlagsWithDefaults(envPrefix string, defaults DefaultFlagValues) []cli.Fl Value: defaults.ReceiptQueryInterval, EnvVars: prefixEnvVars("TXMGR_RECEIPT_QUERY_INTERVAL"), }, - }, client.CLIFlags(envPrefix)...) + }, opsigner.CLIFlags(envPrefix)...) } type CLIConfig struct { @@ -155,7 +155,7 @@ type CLIConfig struct { SequencerHDPath string L2OutputHDPath string PrivateKey string - SignerCLIConfig client.CLIConfig + SignerCLIConfig opsigner.CLIConfig NumConfirmations uint64 SafeAbortNonceTooLowCount uint64 ResubmissionTimeout time.Duration @@ -175,7 +175,7 @@ func NewCLIConfig(l1RPCURL string, defaults DefaultFlagValues) CLIConfig { TxSendTimeout: defaults.TxSendTimeout, TxNotInMempoolTimeout: defaults.TxNotInMempoolTimeout, ReceiptQueryInterval: defaults.ReceiptQueryInterval, - SignerCLIConfig: client.NewCLIConfig(), + SignerCLIConfig: opsigner.NewCLIConfig(), } } @@ -215,7 +215,7 @@ func ReadCLIConfig(ctx *cli.Context) CLIConfig { SequencerHDPath: ctx.String(SequencerHDPathFlag.Name), L2OutputHDPath: ctx.String(L2OutputHDPathFlag.Name), PrivateKey: ctx.String(PrivateKeyFlagName), - SignerCLIConfig: client.ReadCLIConfig(ctx), + SignerCLIConfig: opsigner.ReadCLIConfig(ctx), NumConfirmations: ctx.Uint64(NumConfirmationsFlagName), SafeAbortNonceTooLowCount: ctx.Uint64(SafeAbortNonceTooLowCountFlagName), ResubmissionTimeout: ctx.Duration(ResubmissionTimeoutFlagName), diff --git a/op-signer/.gitignore b/op-signer/.gitignore deleted file mode 100644 index eb814c28f40045cac989200afaccf13455ab83b6..0000000000000000000000000000000000000000 --- a/op-signer/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -mocks/ -mock_* -tls/ diff --git a/op-signer/README.md b/op-signer/README.md deleted file mode 100644 index ed2ecba1fd8be0b4066585405c0fde57ed9a9afe..0000000000000000000000000000000000000000 --- a/op-signer/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# op-signer - -op-signer service client diff --git a/op-ufm/go.mod b/op-ufm/go.mod index 7f2512d0f367b352e19394b195e9d71d53006fa1..8ec99585ff38768d1edb4c89d679c994d66cefb5 100644 --- a/op-ufm/go.mod +++ b/op-ufm/go.mod @@ -6,7 +6,6 @@ require ( cloud.google.com/go/kms v1.12.1 github.com/BurntSushi/toml v1.3.2 github.com/ethereum-optimism/optimism/op-service v0.10.14 - github.com/ethereum-optimism/optimism/op-signer v0.1.1 github.com/ethereum/go-ethereum v1.12.1 github.com/gorilla/mux v1.8.0 github.com/pkg/errors v0.9.1 diff --git a/op-ufm/go.sum b/op-ufm/go.sum index 34c3299641b218aa416c66b3174b4cb2920da5e8..439e8d112189bf7df053fc8974d70a70f9fa6b40 100644 --- a/op-ufm/go.sum +++ b/op-ufm/go.sum @@ -98,8 +98,6 @@ 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/optimism/op-service v0.10.14 h1:MC+rVwtPfX1aPAKA3855DQaCnhjjp4uFcSr8PY7HmaE= github.com/ethereum-optimism/optimism/op-service v0.10.14/go.mod h1:8ay6Bs3YHaX+FbJRUGSbxBnXRtEbKXNHMhtJqATrBmY= -github.com/ethereum-optimism/optimism/op-signer v0.1.1 h1:Ts6aWd5/nTQ8ZRFZhpOrrcWpnVmdp4fRfff1mvybnGs= -github.com/ethereum-optimism/optimism/op-signer v0.1.1/go.mod h1:HK+9do1IJmDr9aEc44ECweYbCLDfGGYO7PBwTqDNrqI= github.com/ethereum/c-kzg-4844 v0.3.0 h1:3Y3hD6l5i0dEYsBL50C+Om644kve3pNqoAcvE26o9zI= github.com/ethereum/c-kzg-4844 v0.3.0/go.mod h1:WI2Nd82DMZAAZI1wV2neKGost9EKjvbpQR9OqE5Qqa8= github.com/ethereum/go-ethereum v1.12.1 h1:1kXDPxhLfyySuQYIfRxVBGYuaHdxNNxevA73vjIwsgk= diff --git a/op-ufm/pkg/metrics/clients/signer.go b/op-ufm/pkg/metrics/clients/signer.go index 54f1163a6d0e4951cdc22f83e2555270ae8f6330..8a15463a81f56bff8a0c1fb21a2542e5268b01be 100644 --- a/op-ufm/pkg/metrics/clients/signer.go +++ b/op-ufm/pkg/metrics/clients/signer.go @@ -8,7 +8,7 @@ import ( "github.com/ethereum-optimism/optimism/op-ufm/pkg/metrics" optls "github.com/ethereum-optimism/optimism/op-service/tls" - signer "github.com/ethereum-optimism/optimism/op-signer/client" + signer "github.com/ethereum-optimism/optimism/op-service/signer" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/log" ) diff --git a/ops/tag-service/tag-service.py b/ops/tag-service/tag-service.py index ff596cca93d086621c315e589892c8b27440806e..d512062fb08085c37f0a9ddd14719b4ee31ee8ab 100755 --- a/ops/tag-service/tag-service.py +++ b/ops/tag-service/tag-service.py @@ -17,7 +17,8 @@ MIN_VERSIONS = { 'op-challenger': '0.0.4', 'op-proposer': '0.10.14', 'op-ufm': '0.1.0', - 'proxyd': '3.16.0' + 'proxyd': '3.16.0', + 'op-heartbeat': '0.1.0' } VALID_BUMPS = ('major', 'minor', 'patch', 'prerelease', 'finalize-prerelease') diff --git a/package.json b/package.json index ea39504de5ecffcc29f07eefcc69e082690274b9..ebe752a9f7e08bdfcfc86193cc92b7f87f9e8c7a 100644 --- a/package.json +++ b/package.json @@ -43,7 +43,7 @@ "@types/chai": "^4.3.6", "@types/chai-as-promised": "^7.1.4", "@types/mocha": "^10.0.2", - "@types/node": "^20.7.1", + "@types/node": "^20.7.2", "@typescript-eslint/eslint-plugin": "^6.7.0", "@typescript-eslint/parser": "^6.7.0", "chai": "^4.3.10", diff --git a/packages/common-ts/package.json b/packages/common-ts/package.json index 761f4c26938e21a82657368cdf1b448c09045164..074420c3b9cfd0bca66ccfc9be3853b7f4c43a36 100644 --- a/packages/common-ts/package.json +++ b/packages/common-ts/package.json @@ -35,7 +35,7 @@ }, "dependencies": { "@eth-optimism/core-utils": "workspace:*", - "@sentry/node": "^7.64.0", + "@sentry/node": "^7.73.0", "bcfg": "^0.2.1", "body-parser": "^1.20.2", "commander": "^11.0.0", @@ -46,7 +46,7 @@ "express-prom-bundle": "^6.6.0", "lodash": "^4.17.21", "morgan": "^1.10.0", - "pino": "^8.15.0", + "pino": "^8.15.3", "pino-multi-stream": "^6.0.0", "pino-sentry": "^0.14.0", "prom-client": "^14.2.0" diff --git a/packages/contracts-bedrock/.envrc.example b/packages/contracts-bedrock/.envrc.example index c2ccbccd84095510f3cc80800ac00353daa0c04a..fb10f785ff65ef7b82c874b50806eb072544ae76 100644 --- a/packages/contracts-bedrock/.envrc.example +++ b/packages/contracts-bedrock/.envrc.example @@ -10,3 +10,9 @@ export DEPLOYMENT_CONTEXT=getting-started # Optional Tenderly details for a simulation link during deployment export TENDERLY_PROJECT= export TENDERLY_USERNAME= + +export ETHERSCAN_API_KEY= + +# Optional create2 salt for deterministic deployment of +# contract implementations +export IMPL_SALT=$(openssl rand -hex 32) diff --git a/packages/contracts-bedrock/.gas-snapshot b/packages/contracts-bedrock/.gas-snapshot index c41b2625a2a9d218c36eb51c4f23952bfc64e1cb..29738c2500606ea8c50a96ee0520a653b96b9ac7 100644 --- a/packages/contracts-bedrock/.gas-snapshot +++ b/packages/contracts-bedrock/.gas-snapshot @@ -108,7 +108,7 @@ FaultDisputeGame_Test:test_gameData_succeeds() (gas: 32755) FaultDisputeGame_Test:test_gameType_succeeds() (gas: 8265) FaultDisputeGame_Test:test_initialize_correctData_succeeds() (gas: 57712) FaultDisputeGame_Test:test_initialize_firstOutput_reverts() (gas: 210563) -FaultDisputeGame_Test:test_initialize_l1HeadTooOld_reverts() (gas: 228368) +FaultDisputeGame_Test:test_initialize_l1HeadTooOld_reverts() (gas: 228401) FaultDisputeGame_Test:test_move_clockCorrectness_succeeds() (gas: 594268) FaultDisputeGame_Test:test_move_clockTimeExceeded_reverts() (gas: 23175) FaultDisputeGame_Test:test_move_defendRoot_reverts() (gas: 13366) diff --git a/packages/contracts-bedrock/deploy-config/getting-started.json b/packages/contracts-bedrock/deploy-config/getting-started.json index bf8bd8edc45aa57d11f3272f8c3df75fe33cf9af..1757c3d049fac69a7353a95a2071f3b3696c00eb 100644 --- a/packages/contracts-bedrock/deploy-config/getting-started.json +++ b/packages/contracts-bedrock/deploy-config/getting-started.json @@ -53,5 +53,8 @@ "eip1559Denominator": 50, "eip1559Elasticity": 10, - "systemConfigStartBlock": 0 + "systemConfigStartBlock": 0, + + "requiredProtocolVersion": "0x0000000000000000000000000000000000000000000000000000000000000000", + "recommendedProtocolVersion": "0x0000000000000000000000000000000000000000000000000000000000000000" } diff --git a/packages/contracts-bedrock/semver-lock.json b/packages/contracts-bedrock/semver-lock.json index ae1251c733e8b04e086b3f5c71e3354405c1bfa1..8547d3712be7238e8dc483515f24e8c0c45924f4 100644 --- a/packages/contracts-bedrock/semver-lock.json +++ b/packages/contracts-bedrock/semver-lock.json @@ -18,6 +18,7 @@ "src/L2/L2StandardBridge.sol": "0xfe01bcb1ddc947b9b8a7093d0971854b9fa8d49da5bd933a3dd106167907f882", "src/L2/L2ToL1MessagePasser.sol": "0xafc710b4d320ef450586d96a61cbd58cac814cb3b0c4fdc280eace3efdcdf321", "src/L2/SequencerFeeVault.sol": "0xc2f733c1128d06ad60bf1e1d98c8f684a4825b11875ccdf2376ede33f5aad4e6", + "src/dispute/BlockOracle.sol": "0x7e724b1ee0116dfd744f556e6237af449c2f40c6426d6f1462ae2a47589283bb", "src/dispute/DisputeGameFactory.sol": "0xfdfa141408d7f8de7e230ff4bef088e30d0e4d569ca743d60d292abdd21ff270", "src/dispute/FaultDisputeGame.sol": "0xfdf4be4d6ed4bcbf6492c43fdbfd04d0c62ebee11b8fe9ee2e7757bde8f7383d", "src/legacy/DeployerWhitelist.sol": "0x0a6840074734c9d167321d3299be18ef911a415e4c471fa92af7d6cfaa8336d4", diff --git a/packages/contracts-bedrock/src/cannon/MIPS.sol b/packages/contracts-bedrock/src/cannon/MIPS.sol index da9633534afa90be72134df3c4de480d3ca762da..db7cd7526b809e32f9f4e18d48b9d9515d9f4ba3 100644 --- a/packages/contracts-bedrock/src/cannon/MIPS.sol +++ b/packages/contracts-bedrock/src/cannon/MIPS.sol @@ -77,7 +77,7 @@ contract MIPS { } /// @notice Computes the hash of the MIPS state. - /// @return out_ The hash of the MIPS state. + /// @return out_ The hashed MIPS state. function outputState() internal returns (bytes32 out_) { assembly { // copies 'size' bytes, right-aligned in word at 'from', to 'to', incl. trailing data @@ -141,6 +141,7 @@ contract MIPS { } /// @notice Handles a syscall. + /// @return out_ The hashed MIPS state. function handleSyscall() internal returns (bytes32 out_) { unchecked { // Load state from memory @@ -372,7 +373,7 @@ contract MIPS { /// @param _rs The value of the RS register. /// @param _rt The value of the RT register. /// @param _storeReg The register to store the result in. - /// @return out_ The hash of the resulting MIPS state. + /// @return out_ The hashed MIPS state. function handleHiLo(uint32 _func, uint32 _rs, uint32 _rt, uint32 _storeReg) internal returns (bytes32 out_) { unchecked { // Load state from memory diff --git a/packages/contracts-bedrock/src/dispute/BlockOracle.sol b/packages/contracts-bedrock/src/dispute/BlockOracle.sol index 7f986291d32dc99c8db823603154c68bffefb951..89e73ac4e325945eb70e847b5fbbe3891321e212 100644 --- a/packages/contracts-bedrock/src/dispute/BlockOracle.sol +++ b/packages/contracts-bedrock/src/dispute/BlockOracle.sol @@ -3,10 +3,11 @@ pragma solidity 0.8.15; import "src/libraries/DisputeTypes.sol"; import "src/libraries/DisputeErrors.sol"; +import { ISemver } from "src/universal/ISemver.sol"; /// @title BlockOracle /// @notice Stores a map of block numbers => block hashes for use in dispute resolution -contract BlockOracle { +contract BlockOracle is ISemver { /// @notice The BlockInfo struct contains a block's hash and child timestamp. struct BlockInfo { Hash hash; @@ -19,6 +20,10 @@ contract BlockOracle { /// @notice Maps block numbers to block hashes and timestamps mapping(uint256 => BlockInfo) internal blocks; + /// @notice Semantic version. + /// @custom:semver 0.0.1 + string public constant version = "0.0.1"; + /// @notice Loads a block hash for a given block number, assuming that the block number /// has been stored in the oracle. /// @param _blockNumber The block number to load the block hash and timestamp for. diff --git a/packages/contracts-ts/package.json b/packages/contracts-ts/package.json index 4973c65edd5753e9d00ecf11206e5244ad18f4d6..8ce69ac45e75dcd02e898535c3282a95e4bbb06e 100644 --- a/packages/contracts-ts/package.json +++ b/packages/contracts-ts/package.json @@ -53,7 +53,7 @@ "@types/glob": "^8.1.0", "@vitest/coverage-istanbul": "^0.34.6", "@wagmi/cli": "^1.5.2", - "@wagmi/core": "^1.3.8", + "@wagmi/core": "^1.4.3", "abitype": "^0.9.3", "glob": "^10.3.10", "isomorphic-fetch": "^3.0.0", diff --git a/packages/core-utils/package.json b/packages/core-utils/package.json index cdad3f2929be42976af3b9247f2c37ebd2c07555..5768314aad73a67af3b40f629e1374679906595b 100644 --- a/packages/core-utils/package.json +++ b/packages/core-utils/package.json @@ -49,7 +49,7 @@ "node-fetch": "^2.6.7" }, "devDependencies": { - "@types/node": "^20.7.1", + "@types/node": "^20.7.2", "mocha": "^10.2.0" } } diff --git a/packages/sdk/package.json b/packages/sdk/package.json index efc5209d011679c68c2c895588e595cbf1bef549..31a5badebbdf2ca694db0c7a2d453d3cb443a28f 100644 --- a/packages/sdk/package.json +++ b/packages/sdk/package.json @@ -44,7 +44,7 @@ "@types/chai": "^4.3.6", "@types/chai-as-promised": "^7.1.5", "@types/mocha": "^10.0.2", - "@types/node": "^20.7.1", + "@types/node": "^20.7.2", "chai-as-promised": "^7.1.1", "ethereum-waffle": "^4.0.10", "ethers": "^5.7.2", diff --git a/packages/sdk/src/interfaces/types.ts b/packages/sdk/src/interfaces/types.ts index b016f1efbce01ef4a3060164878f95484a993b5c..c31d9e61f3aa4bf661e0f2003d326ea69e8df69d 100644 --- a/packages/sdk/src/interfaces/types.ts +++ b/packages/sdk/src/interfaces/types.ts @@ -31,6 +31,7 @@ export enum L2ChainID { OPTIMISM_HARDHAT_DEVNET = 17, OPTIMISM_BEDROCK_ALPHA_TESTNET = 28528, BASE_GOERLI = 84531, + BASE_SEPOLIA = 84532, BASE_MAINNET = 8453, ZORA_GOERLI = 999, ZORA_MAINNET = 7777777, diff --git a/packages/sdk/src/utils/chain-constants.ts b/packages/sdk/src/utils/chain-constants.ts index 79327fa9a6a16b2560beada9fd19f9cd48d58aa1..30cea4a5a61881cabc348a66b8cd2e65e9225240 100644 --- a/packages/sdk/src/utils/chain-constants.ts +++ b/packages/sdk/src/utils/chain-constants.ts @@ -83,8 +83,9 @@ export const DEPOSIT_CONFIRMATION_BLOCKS: { [L2ChainID.OPTIMISM_HARDHAT_LOCAL]: 2 as const, [L2ChainID.OPTIMISM_HARDHAT_DEVNET]: 2 as const, [L2ChainID.OPTIMISM_BEDROCK_ALPHA_TESTNET]: 12 as const, - [L2ChainID.BASE_GOERLI]: 12 as const, - [L2ChainID.BASE_MAINNET]: 50 as const, + [L2ChainID.BASE_GOERLI]: 25 as const, + [L2ChainID.BASE_SEPOLIA]: 25 as const, + [L2ChainID.BASE_MAINNET]: 10 as const, [L2ChainID.ZORA_GOERLI]: 12 as const, [L2ChainID.ZORA_MAINNET]: 50 as const, } @@ -220,6 +221,22 @@ export const CONTRACT_ADDRESSES: { }, l2: DEFAULT_L2_CONTRACT_ADDRESSES, }, + [L2ChainID.BASE_SEPOLIA]: { + l1: { + AddressManager: '0x709c2B8ef4A9feFc629A8a2C1AF424Dc5BD6ad1B' as const, + L1CrossDomainMessenger: + '0xC34855F4De64F1840e5686e64278da901e261f20' as const, + L1StandardBridge: '0xfd0Bf71F60660E2f608ed56e1659C450eB113120' as const, + StateCommitmentChain: + '0x0000000000000000000000000000000000000000' as const, + CanonicalTransactionChain: + '0x0000000000000000000000000000000000000000' as const, + BondManager: '0x0000000000000000000000000000000000000000' as const, + OptimismPortal: '0x49f53e41452C74589E85cA1677426Ba426459e85' as const, + L2OutputOracle: '0x84457ca9D0163FbC4bbfe4Dfbb20ba46e48DF254' as const, + }, + l2: DEFAULT_L2_CONTRACT_ADDRESSES, + }, [L2ChainID.BASE_MAINNET]: { l1: { AddressManager: '0x8EfB6B5c4767B09Dc9AA6Af4eAA89F749522BaE2' as const, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b5551095279ed5ef5eae97b75f8142c8142cc54c..971c78f296f0452dc62a10f10c04233378d4e885 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -34,8 +34,8 @@ importers: specifier: ^10.0.2 version: 10.0.2 '@types/node': - specifier: ^20.7.1 - version: 20.7.1 + specifier: ^20.7.2 + version: 20.7.2 '@typescript-eslint/eslint-plugin': specifier: ^6.7.0 version: 6.7.0(@typescript-eslint/parser@6.7.3)(eslint@8.50.0)(typescript@5.2.2) @@ -184,7 +184,7 @@ importers: version: 2.17.4(ts-node@10.9.1)(typescript@5.2.2) ts-node: specifier: ^10.9.1 - version: 10.9.1(@types/node@20.7.1)(typescript@5.2.2) + version: 10.9.1(@types/node@20.7.2)(typescript@5.2.2) tsx: specifier: ^3.12.7 version: 3.12.7 @@ -195,8 +195,8 @@ importers: specifier: workspace:* version: link:../core-utils '@sentry/node': - specifier: ^7.64.0 - version: 7.64.0 + specifier: ^7.73.0 + version: 7.73.0 bcfg: specifier: ^0.2.1 version: 0.2.1 @@ -228,8 +228,8 @@ importers: specifier: ^1.10.0 version: 1.10.0 pino: - specifier: ^8.15.0 - version: 8.15.0 + specifier: ^8.15.3 + version: 8.15.3 pino-multi-stream: specifier: ^6.0.0 version: 6.0.0 @@ -315,10 +315,10 @@ importers: version: 0.34.6(vitest@0.34.2) '@wagmi/cli': specifier: ^1.5.2 - version: 1.5.2(@wagmi/core@1.3.8)(typescript@5.2.2)(wagmi@1.0.1) + version: 1.5.2(@wagmi/core@1.4.3)(typescript@5.2.2)(wagmi@1.0.1) '@wagmi/core': - specifier: ^1.3.8 - version: 1.3.8(react@18.2.0)(typescript@5.2.2)(viem@1.14.0) + specifier: ^1.4.3 + version: 1.4.3(react@18.2.0)(typescript@5.2.2)(viem@1.14.0) abitype: specifier: ^0.9.3 version: 0.9.3(typescript@5.2.2) @@ -342,7 +342,7 @@ importers: version: 5.2.2 vite: specifier: ^4.4.6 - version: 4.4.6(@types/node@20.7.1) + version: 4.4.6(@types/node@20.7.2) vitest: specifier: ^0.34.2 version: 0.34.2(jsdom@22.1.0) @@ -393,8 +393,8 @@ importers: version: 2.6.7 devDependencies: '@types/node': - specifier: ^20.7.1 - version: 20.7.1 + specifier: ^20.7.2 + version: 20.7.2 mocha: specifier: ^10.2.0 version: 10.2.0 @@ -436,7 +436,7 @@ importers: version: 1.14.0(typescript@5.2.2)(zod@3.22.0) vite: specifier: ^4.4.6 - version: 4.4.6(@types/node@20.7.1) + version: 4.4.6(@types/node@20.7.2) vitest: specifier: ^0.34.2 version: 0.34.2(jsdom@22.1.0) @@ -487,8 +487,8 @@ importers: specifier: ^10.0.2 version: 10.0.2 '@types/node': - specifier: ^20.7.1 - version: 20.7.1 + specifier: ^20.7.2 + version: 20.7.2 chai-as-promised: specifier: ^7.1.1 version: 7.1.1(chai@4.3.10) @@ -515,7 +515,7 @@ importers: version: 15.1.0 ts-node: specifier: ^10.9.1 - version: 10.9.1(@types/node@20.7.1)(typescript@5.2.2) + version: 10.9.1(@types/node@20.7.2)(typescript@5.2.2) typedoc: specifier: ^0.25.1 version: 0.25.1(typescript@5.2.2) @@ -567,7 +567,7 @@ importers: version: 1.14.0(typescript@5.2.2)(zod@3.22.0) vite: specifier: ^4.4.9 - version: 4.4.9(@types/node@20.7.1) + version: 4.4.9(@types/node@20.7.2) vitest: specifier: ^0.34.1 version: 0.34.1 @@ -3234,13 +3234,13 @@ packages: '@noble/hashes': 1.3.2 '@scure/base': 1.1.3 - /@sentry-internal/tracing@7.64.0: - resolution: {integrity: sha512-1XE8W6ki7hHyBvX9hfirnGkKDBKNq3bDJyXS86E0bYVDl94nvbRM9BD9DHsCFetqYkVm1yDGEK+6aUVs4CztoQ==} + /@sentry-internal/tracing@7.73.0: + resolution: {integrity: sha512-ig3WL/Nqp8nRQ52P205NaypGKNfIl/G+cIqge9xPW6zfRb5kJdM1YParw9GSJ1SPjEZBkBORGAML0on5H2FILw==} engines: {node: '>=8'} dependencies: - '@sentry/core': 7.64.0 - '@sentry/types': 7.64.0 - '@sentry/utils': 7.64.0 + '@sentry/core': 7.73.0 + '@sentry/types': 7.73.0 + '@sentry/utils': 7.73.0 tslib: 2.6.2 dev: false @@ -3255,12 +3255,12 @@ packages: tslib: 1.14.1 dev: true - /@sentry/core@7.64.0: - resolution: {integrity: sha512-IzmEyl5sNG7NyEFiyFHEHC+sizsZp9MEw1+RJRLX6U5RITvcsEgcajSkHQFafaBPzRrcxZMdm47Cwhl212LXcw==} + /@sentry/core@7.73.0: + resolution: {integrity: sha512-9FEz4Gq848LOgVN2OxJGYuQqxv7cIVw69VlAzWHEm3njt8mjvlTq+7UiFsGRo84+59V2FQuHxzA7vVjl90WfSg==} engines: {node: '>=8'} dependencies: - '@sentry/types': 7.64.0 - '@sentry/utils': 7.64.0 + '@sentry/types': 7.73.0 + '@sentry/utils': 7.73.0 tslib: 2.6.2 dev: false @@ -3299,18 +3299,18 @@ packages: - supports-color dev: true - /@sentry/node@7.64.0: - resolution: {integrity: sha512-wRi0uTnp1WSa83X2yLD49tV9QPzGh5e42IKdIDBiQ7lV9JhLILlyb34BZY1pq6p4dp35yDasDrP3C7ubn7wo6A==} + /@sentry/node@7.73.0: + resolution: {integrity: sha512-i50bRfmgkRRx0XXUbg9jGD/RuznDJxJXc4rBILhoJuhl+BjRIaoXA3ayplfJn8JLZxsNh75uJaCq4IUK70SORw==} engines: {node: '>=8'} dependencies: - '@sentry-internal/tracing': 7.64.0 - '@sentry/core': 7.64.0 - '@sentry/types': 7.64.0 - '@sentry/utils': 7.64.0 - cookie: 0.4.1 + '@sentry-internal/tracing': 7.73.0 + '@sentry/core': 7.73.0 + '@sentry/types': 7.73.0 + '@sentry/utils': 7.73.0 + cookie: 0.5.0 https-proxy-agent: 5.0.1 lru_map: 0.3.3 - tslib: 2.6.0 + tslib: 2.6.2 transitivePeerDependencies: - supports-color dev: false @@ -3331,8 +3331,8 @@ packages: engines: {node: '>=6'} dev: true - /@sentry/types@7.64.0: - resolution: {integrity: sha512-LqjQprWXjUFRmzIlUjyA+KL+38elgIYmAeoDrdyNVh8MK5IC1W2Lh1Q87b4yOiZeMiIhIVNBd7Ecoh2rodGrGA==} + /@sentry/types@7.73.0: + resolution: {integrity: sha512-/v8++bly8jW7r4cP2wswYiiVpn7eLLcqwnfPUMeCQze4zj3F3nTRIKc9BGHzU0V+fhHa3RwRC2ksqTGq1oJMDg==} engines: {node: '>=8'} dev: false @@ -3344,11 +3344,11 @@ packages: tslib: 1.14.1 dev: true - /@sentry/utils@7.64.0: - resolution: {integrity: sha512-HRlM1INzK66Gt+F4vCItiwGKAng4gqzCR4C5marsL3qv6SrKH98dQnCGYgXluSWaaa56h97FRQu7TxCk6jkSvQ==} + /@sentry/utils@7.73.0: + resolution: {integrity: sha512-h3ZK/qpf4k76FhJV9uiSbvMz3V/0Ovy94C+5/9UgPMVCJXFmVsdw8n/dwANJ7LupVPfYP23xFGgebDMFlK1/2w==} engines: {node: '>=8'} dependencies: - '@sentry/types': 7.64.0 + '@sentry/types': 7.73.0 tslib: 2.6.2 dev: false @@ -3849,20 +3849,20 @@ packages: /@types/bn.js@4.11.6: resolution: {integrity: sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==} dependencies: - '@types/node': 20.7.1 + '@types/node': 20.7.2 dev: true /@types/bn.js@5.1.0: resolution: {integrity: sha512-QSSVYj7pYFN49kW77o2s9xTCwZ8F2xLbjLLSEVh8D2F4JUhZtPAGOFLTD+ffqksBx/u4cE/KImFjyhqCjn/LIA==} dependencies: - '@types/node': 20.7.1 + '@types/node': 20.7.2 dev: true /@types/body-parser@1.19.1: resolution: {integrity: sha512-a6bTJ21vFOGIkwM0kzh9Yr89ziVxq4vYH2fQ6N8AeipEzai/cFK6aGMArIkUeIdRIgpwQa+2bXiLuUJCpSf2Cg==} dependencies: '@types/connect': 3.4.35 - '@types/node': 20.7.1 + '@types/node': 20.7.2 dev: true /@types/chai-as-promised@7.1.5: @@ -3884,7 +3884,7 @@ packages: /@types/connect@3.4.35: resolution: {integrity: sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==} dependencies: - '@types/node': 20.7.1 + '@types/node': 20.7.2 /@types/dateformat@5.0.0: resolution: {integrity: sha512-SZg4JdHIWHQGEokbYGZSDvo5wA4TLYPXaqhigs/wH+REDOejcJzgH+qyY+HtEUtWOZxEUkbhbdYPqQDiEgrXeA==} @@ -3898,7 +3898,7 @@ packages: /@types/express-serve-static-core@4.17.35: resolution: {integrity: sha512-wALWQwrgiB2AWTT91CB62b6Yt0sNHpznUXeZEcnPU3DRdlDIz74x8Qg1UUYKSVFi+va5vKOLYRBI1bRKiLLKIg==} dependencies: - '@types/node': 20.7.1 + '@types/node': 20.7.2 '@types/qs': 6.9.7 '@types/range-parser': 1.2.4 '@types/send': 0.17.1 @@ -3917,7 +3917,7 @@ packages: resolution: {integrity: sha512-IO+MJPVhoqz+28h1qLAcBEH2+xHMK6MTyHJc7MTnnYb6wsoLR29POVGJ7LycmVXIqyy/4/2ShP5sUwTXuOwb/w==} dependencies: '@types/minimatch': 5.1.2 - '@types/node': 20.7.0 + '@types/node': 20.7.1 dev: true /@types/is-ci@3.0.0: @@ -3944,7 +3944,7 @@ packages: dependencies: '@types/abstract-leveldown': 5.0.2 '@types/level-errors': 3.0.0 - '@types/node': 20.7.1 + '@types/node': 20.7.2 dev: true /@types/lru-cache@5.1.1: @@ -3976,7 +3976,7 @@ packages: /@types/mkdirp@0.5.2: resolution: {integrity: sha512-U5icWpv7YnZYGsN4/cmh3WD2onMY0aJIiTE6+51TwJCttdHvtCYmkBNOobHlXwrJRL0nkH9jH4kD+1FAdMN4Tg==} dependencies: - '@types/node': 20.7.1 + '@types/node': 20.7.2 dev: true /@types/mocha@10.0.2: @@ -3986,7 +3986,7 @@ packages: /@types/morgan@1.9.6: resolution: {integrity: sha512-xfKogz5WcKww2DAiVT9zxMgrqQt+Shq8tDVeLT+otoj6dJnkRkyJxMF51mHtUc3JCPKGk5x1EBU0buuGpfftlQ==} dependencies: - '@types/node': 20.7.0 + '@types/node': 20.7.1 dev: true /@types/ms@0.7.31: @@ -3995,7 +3995,7 @@ packages: /@types/node-fetch@2.6.4: resolution: {integrity: sha512-1ZX9fcN4Rvkvgv4E6PAY5WXUFWFcRWxZa3EW83UjycOB9ljJCedb2CupIP4RZMEwF/M3eTcCihbBRgwtGbg5Rg==} dependencies: - '@types/node': 20.7.1 + '@types/node': 20.7.2 form-data: 3.0.1 dev: true @@ -4006,12 +4006,12 @@ packages: /@types/node@12.20.55: resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} - /@types/node@20.7.0: - resolution: {integrity: sha512-zI22/pJW2wUZOVyguFaUL1HABdmSVxpXrzIqkjsHmyUjNhPoWM1CKfvVuXfetHhIok4RY573cqS0mZ1SJEnoTg==} - dev: true - /@types/node@20.7.1: resolution: {integrity: sha512-LT+OIXpp2kj4E2S/p91BMe+VgGX2+lfO+XTpfXhh+bCk2LkQtHZSub8ewFBMGP5ClysPjTDFa4sMI8Q3n4T0wg==} + dev: true + + /@types/node@20.7.2: + resolution: {integrity: sha512-RcdC3hOBOauLP+r/kRt27NrByYtDjsXyAuSbR87O6xpsvi763WI+5fbSIvYJrXnt9w4RuxhV6eAXfIs7aaf/FQ==} /@types/normalize-package-data@2.4.1: resolution: {integrity: sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==} @@ -4023,7 +4023,7 @@ packages: /@types/pbkdf2@3.1.0: resolution: {integrity: sha512-Cf63Rv7jCQ0LaL8tNXmEyqTHuIJxRdlS5vMh1mj5voN4+QFhVZnlZruezqpWYDiJ8UTzhP0VmeLXCmBk66YrMQ==} dependencies: - '@types/node': 20.7.1 + '@types/node': 20.7.2 dev: true /@types/pino-multi-stream@5.1.4: @@ -4041,13 +4041,13 @@ packages: /@types/pino-std-serializers@2.4.1: resolution: {integrity: sha512-17XcksO47M24IVTVKPeAByWUd3Oez7EbIjXpSbzMPhXVzgjGtrOa49gKBwxH9hb8dKv58OelsWQ+A1G1l9S3wQ==} dependencies: - '@types/node': 20.7.1 + '@types/node': 20.7.2 dev: true /@types/pino@6.3.11: resolution: {integrity: sha512-S7+fLONqSpHeW9d7TApUqO6VN47KYgOXhCNKwGBVLHObq8HhaAYlVqUNdfnvoXjCMiwE5xcPm/5R2ZUh8bgaXQ==} dependencies: - '@types/node': 20.7.1 + '@types/node': 20.7.2 '@types/pino-pretty': 4.7.1 '@types/pino-std-serializers': 2.4.1 sonic-boom: 2.8.0 @@ -4057,7 +4057,7 @@ packages: resolution: {integrity: sha512-wKoab31pknvILkxAF8ss+v9iNyhw5Iu/0jLtRkUD74cNfOOLJNnqfFKAv0r7wVaTQxRZtWrMpGfShwwBjOcgcg==} deprecated: This is a stub types definition. pino provides its own type definitions, so you do not need this installed. dependencies: - pino: 8.15.0 + pino: 8.15.3 dev: true /@types/prettier@2.3.2: @@ -4093,7 +4093,7 @@ packages: /@types/readable-stream@2.3.15: resolution: {integrity: sha512-oM5JSKQCcICF1wvGgmecmHldZ48OZamtMxcGGVICOJA8o8cahXC1zEVAif8iwoc5j8etxFaRFnf095+CDsuoFQ==} dependencies: - '@types/node': 20.7.1 + '@types/node': 20.7.2 safe-buffer: 5.1.2 dev: true @@ -4104,7 +4104,7 @@ packages: /@types/secp256k1@4.0.3: resolution: {integrity: sha512-Da66lEIFeIz9ltsdMZcpQvmrmmoqrfju8pm1BH8WbYjZSwUgCwXLb9C+9XYogwBITnbsSaMdVPb2ekf7TV+03w==} dependencies: - '@types/node': 20.7.1 + '@types/node': 20.7.2 dev: true /@types/seedrandom@3.0.1: @@ -4123,14 +4123,14 @@ packages: resolution: {integrity: sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q==} dependencies: '@types/mime': 1.3.2 - '@types/node': 20.7.1 + '@types/node': 20.7.2 dev: true /@types/serve-static@1.13.10: resolution: {integrity: sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ==} dependencies: '@types/mime': 1.3.2 - '@types/node': 20.7.1 + '@types/node': 20.7.2 dev: true /@types/sinon-chai@3.2.5: @@ -4167,18 +4167,18 @@ packages: /@types/ws@7.4.7: resolution: {integrity: sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==} dependencies: - '@types/node': 20.7.1 + '@types/node': 20.7.2 /@types/ws@8.5.3: resolution: {integrity: sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w==} dependencies: - '@types/node': 20.7.1 + '@types/node': 20.7.2 dev: false /@types/ws@8.5.5: resolution: {integrity: sha512-lwhs8hktwxSjf9UaZ9tG5M03PGogvFaH8gUgLNbN9HKIg0dvv6q+gkSuJ8HN4/VbyxkuLzCjlN7GquQ0gUJfIg==} dependencies: - '@types/node': 20.7.1 + '@types/node': 20.7.2 /@typescript-eslint/eslint-plugin@6.7.0(@typescript-eslint/parser@6.4.0)(eslint@8.50.0)(typescript@5.2.2): resolution: {integrity: sha512-gUqtknHm0TDs1LhY12K2NA3Rmlmp88jK9Tx8vGZMfHeNMLE3GH2e9TRub+y+SOjuYgtOmok+wt1AyDPZqxbNag==} @@ -4655,18 +4655,7 @@ packages: dependencies: typescript: 5.2.2 - /@wagmi/chains@1.6.0(typescript@5.2.2): - resolution: {integrity: sha512-5FRlVxse5P4ZaHG3GTvxwVANSmYJas1eQrTBHhjxVtqXoorm0aLmCHbhmN8Xo1yu09PaWKlleEvfE98yH4AgIw==} - peerDependencies: - typescript: '>=5.0.4' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - typescript: 5.2.2 - dev: true - - /@wagmi/cli@1.5.2(@wagmi/core@1.3.8)(typescript@5.2.2)(wagmi@1.0.1): + /@wagmi/cli@1.5.2(@wagmi/core@1.4.3)(typescript@5.2.2)(wagmi@1.0.1): resolution: {integrity: sha512-UfLMYhW6mQBCjR8A5s01Chf9GpHzdpcuuBuzJ36QGXcMSJAxylz5ImVZWfCRV0ct1UruydjKVSW1QSI6azNxRQ==} engines: {node: '>=14'} hasBin: true @@ -4682,7 +4671,7 @@ packages: wagmi: optional: true dependencies: - '@wagmi/core': 1.3.8(react@18.2.0)(typescript@5.2.2)(viem@1.14.0) + '@wagmi/core': 1.4.3(react@18.2.0)(typescript@5.2.2)(viem@1.14.0) abitype: 0.8.7(typescript@5.2.2)(zod@3.22.1) abort-controller: 3.0.0 bundle-require: 3.1.2(esbuild@0.16.17) @@ -4747,15 +4736,12 @@ packages: - utf-8-validate - zod - /@wagmi/connectors@2.6.6(@wagmi/chains@1.6.0)(react@18.2.0)(typescript@5.2.2)(viem@1.14.0): - resolution: {integrity: sha512-/o1c/TCivQs8DOAUOcQvY2UIt3p2mWOAHi39D0LC74+ncpXzLC5/gyaWU38qnTxPM8s/PmTmaWDgz+VhICXrag==} + /@wagmi/connectors@3.1.2(react@18.2.0)(typescript@5.2.2)(viem@1.14.0): + resolution: {integrity: sha512-IlLKErqCzQRBUcCvXGPowcczbWcvJtEG006gPsAoePNJEXCHEWoKASghgu+L/bqD7006Z6mW6zlTNjcSQJvFAg==} peerDependencies: - '@wagmi/chains': '>=1.3.0' typescript: '>=5.0.4' viem: '>=0.3.35' peerDependenciesMeta: - '@wagmi/chains': - optional: true typescript: optional: true dependencies: @@ -4763,17 +4749,17 @@ packages: '@ledgerhq/connect-kit-loader': 1.1.0 '@safe-global/safe-apps-provider': 0.17.1(typescript@5.2.2) '@safe-global/safe-apps-sdk': 8.0.0(typescript@5.2.2) - '@wagmi/chains': 1.6.0(typescript@5.2.2) - '@walletconnect/ethereum-provider': 2.9.0(@walletconnect/modal@2.5.9) + '@walletconnect/ethereum-provider': 2.10.1(@walletconnect/modal@2.6.2) '@walletconnect/legacy-provider': 2.0.0 - '@walletconnect/modal': 2.5.9(react@18.2.0) - '@walletconnect/utils': 2.9.0 + '@walletconnect/modal': 2.6.2(react@18.2.0) + '@walletconnect/utils': 2.10.1 abitype: 0.8.7(typescript@5.2.2)(zod@3.22.1) eventemitter3: 4.0.7 typescript: 5.2.2 viem: 1.14.0(typescript@5.2.2)(zod@3.22.0) transitivePeerDependencies: - '@react-native-async-storage/async-storage' + - '@types/react' - bufferutil - encoding - lokijs @@ -4811,8 +4797,8 @@ packages: - utf-8-validate - zod - /@wagmi/core@1.3.8(react@18.2.0)(typescript@5.2.2)(viem@1.14.0): - resolution: {integrity: sha512-OYSxikoMizqVnpSkFTwGE7PwFaz2k0PXteSiI0W2Mtk4j4sZzRFdP+9AWeDB6AYm0yU3WvgN1IATx0EEBKUe3w==} + /@wagmi/core@1.4.3(react@18.2.0)(typescript@5.2.2)(viem@1.14.0): + resolution: {integrity: sha512-CIV9jwv5ue+WpqmA3FvwGa+23cppe7oIaz6TRnlGm0Hm0wDImSaQSWqcsFyOPvleD29oOIJ8e3KnHINEvI64AA==} peerDependencies: typescript: '>=5.0.4' viem: '>=0.3.35' @@ -4820,8 +4806,7 @@ packages: typescript: optional: true dependencies: - '@wagmi/chains': 1.6.0(typescript@5.2.2) - '@wagmi/connectors': 2.6.6(@wagmi/chains@1.6.0)(react@18.2.0)(typescript@5.2.2)(viem@1.14.0) + '@wagmi/connectors': 3.1.2(react@18.2.0)(typescript@5.2.2)(viem@1.14.0) abitype: 0.8.7(typescript@5.2.2)(zod@3.22.1) eventemitter3: 4.0.7 typescript: 5.2.2 @@ -4829,6 +4814,7 @@ packages: zustand: 4.3.9(react@18.2.0) transitivePeerDependencies: - '@react-native-async-storage/async-storage' + - '@types/react' - bufferutil - encoding - immer @@ -4839,11 +4825,12 @@ packages: - zod dev: true - /@walletconnect/core@2.7.2: - resolution: {integrity: sha512-gInSwh3uLpTEkDGArfOFoOVgiXW+zkZJpGqfARVi5fhSxsnL1jYNpqO2k8KAXUPfB4MIzLyaGruiaywncLAczA==} + /@walletconnect/core@2.10.1: + resolution: {integrity: sha512-WAoXfmj+Zy5q48TnrKUjmHXJCBahzKwbul+noepRZf7JDtUAZ9IOWpUjg+UPRbfK5EiWZ0TF42S6SXidf7EHoQ==} dependencies: '@walletconnect/heartbeat': 1.2.1 '@walletconnect/jsonrpc-provider': 1.0.13 + '@walletconnect/jsonrpc-types': 1.0.3 '@walletconnect/jsonrpc-utils': 1.0.8 '@walletconnect/jsonrpc-ws-connection': 1.0.13 '@walletconnect/keyvaluestorage': 1.0.2 @@ -4852,8 +4839,8 @@ packages: '@walletconnect/relay-auth': 1.0.4 '@walletconnect/safe-json': 1.0.2 '@walletconnect/time': 1.0.2 - '@walletconnect/types': 2.7.2 - '@walletconnect/utils': 2.7.2 + '@walletconnect/types': 2.10.1 + '@walletconnect/utils': 2.10.1 events: 3.3.0 lodash.isequal: 4.5.0 uint8arrays: 3.1.1 @@ -4862,23 +4849,23 @@ packages: - bufferutil - lokijs - utf-8-validate + dev: true - /@walletconnect/core@2.9.0: - resolution: {integrity: sha512-MZYJghS9YCvGe32UOgDj0mCasaOoGHQaYXWeQblXE/xb8HuaM6kAWhjIQN9P+MNp5QP134BHP5olQostcCotXQ==} + /@walletconnect/core@2.7.2: + resolution: {integrity: sha512-gInSwh3uLpTEkDGArfOFoOVgiXW+zkZJpGqfARVi5fhSxsnL1jYNpqO2k8KAXUPfB4MIzLyaGruiaywncLAczA==} dependencies: '@walletconnect/heartbeat': 1.2.1 '@walletconnect/jsonrpc-provider': 1.0.13 - '@walletconnect/jsonrpc-types': 1.0.3 '@walletconnect/jsonrpc-utils': 1.0.8 - '@walletconnect/jsonrpc-ws-connection': 1.0.12 + '@walletconnect/jsonrpc-ws-connection': 1.0.13 '@walletconnect/keyvaluestorage': 1.0.2 '@walletconnect/logger': 2.0.1 '@walletconnect/relay-api': 1.0.9 '@walletconnect/relay-auth': 1.0.4 '@walletconnect/safe-json': 1.0.2 '@walletconnect/time': 1.0.2 - '@walletconnect/types': 2.9.0 - '@walletconnect/utils': 2.9.0 + '@walletconnect/types': 2.7.2 + '@walletconnect/utils': 2.7.2 events: 3.3.0 lodash.isequal: 4.5.0 uint8arrays: 3.1.1 @@ -4887,7 +4874,6 @@ packages: - bufferutil - lokijs - utf-8-validate - dev: true /@walletconnect/crypto@1.0.3: resolution: {integrity: sha512-+2jdORD7XQs76I2Odgr3wwrtyuLUXD/kprNVsjWRhhhdO9Mt6WqVzOPu0/t7OHSmgal8k7SoBQzUc5hu/8zL/g==} @@ -4911,57 +4897,57 @@ packages: dependencies: tslib: 1.14.1 - /@walletconnect/ethereum-provider@2.7.2(@web3modal/standalone@2.4.3): - resolution: {integrity: sha512-bvmutLrKKLlQ1WxKCvvX5p5YVox1D1f3Enp6hzAiZf4taN+n/M5rmwfAcLgLhp4cTAUDhl3zgtZErzDyJnvGvQ==} + /@walletconnect/ethereum-provider@2.10.1(@walletconnect/modal@2.6.2): + resolution: {integrity: sha512-Yhoz8EXkKzxOlBT6G+elphqCx/gkH6RxD9/ZAiy9lLc8Ng5p1gvKCVVP5zsGNE9FbkKmHd+J9JJRzn2Bw2yqtQ==} peerDependencies: - '@web3modal/standalone': '>=2' + '@walletconnect/modal': '>=2' peerDependenciesMeta: - '@web3modal/standalone': + '@walletconnect/modal': optional: true dependencies: '@walletconnect/jsonrpc-http-connection': 1.0.7 '@walletconnect/jsonrpc-provider': 1.0.13 '@walletconnect/jsonrpc-types': 1.0.3 '@walletconnect/jsonrpc-utils': 1.0.8 - '@walletconnect/sign-client': 2.7.2 - '@walletconnect/types': 2.7.2 - '@walletconnect/universal-provider': 2.7.2 - '@walletconnect/utils': 2.7.2 - '@web3modal/standalone': 2.4.3(react@18.2.0) + '@walletconnect/modal': 2.6.2(react@18.2.0) + '@walletconnect/sign-client': 2.10.1 + '@walletconnect/types': 2.10.1 + '@walletconnect/universal-provider': 2.10.1 + '@walletconnect/utils': 2.10.1 events: 3.3.0 transitivePeerDependencies: - '@react-native-async-storage/async-storage' - bufferutil - - debug - encoding - lokijs - utf-8-validate + dev: true - /@walletconnect/ethereum-provider@2.9.0(@walletconnect/modal@2.5.9): - resolution: {integrity: sha512-rSXkC0SXMigJRdIi/M2RMuEuATY1AwtlTWQBnqyxoht7xbO2bQNPCXn0XL4s/GRNrSUtoKSY4aPMHXV4W4yLBA==} + /@walletconnect/ethereum-provider@2.7.2(@web3modal/standalone@2.4.3): + resolution: {integrity: sha512-bvmutLrKKLlQ1WxKCvvX5p5YVox1D1f3Enp6hzAiZf4taN+n/M5rmwfAcLgLhp4cTAUDhl3zgtZErzDyJnvGvQ==} peerDependencies: - '@walletconnect/modal': '>=2' + '@web3modal/standalone': '>=2' peerDependenciesMeta: - '@walletconnect/modal': + '@web3modal/standalone': optional: true dependencies: '@walletconnect/jsonrpc-http-connection': 1.0.7 '@walletconnect/jsonrpc-provider': 1.0.13 '@walletconnect/jsonrpc-types': 1.0.3 '@walletconnect/jsonrpc-utils': 1.0.8 - '@walletconnect/modal': 2.5.9(react@18.2.0) - '@walletconnect/sign-client': 2.9.0 - '@walletconnect/types': 2.9.0 - '@walletconnect/universal-provider': 2.9.0 - '@walletconnect/utils': 2.9.0 + '@walletconnect/sign-client': 2.7.2 + '@walletconnect/types': 2.7.2 + '@walletconnect/universal-provider': 2.7.2 + '@walletconnect/utils': 2.7.2 + '@web3modal/standalone': 2.4.3(react@18.2.0) events: 3.3.0 transitivePeerDependencies: - '@react-native-async-storage/async-storage' - bufferutil + - debug - encoding - lokijs - utf-8-validate - dev: true /@walletconnect/events@1.0.1: resolution: {integrity: sha512-NPTqaoi0oPBVNuLv7qPaJazmGHs5JGyO8eEAk5VGKmJzDR7AHzD4k6ilox5kxk1iwiOnFopBOOMLs86Oa76HpQ==} @@ -5006,19 +4992,6 @@ packages: '@walletconnect/jsonrpc-types': 1.0.3 tslib: 1.14.1 - /@walletconnect/jsonrpc-ws-connection@1.0.12: - resolution: {integrity: sha512-HAcadga3Qjt1Cqy+qXEW6zjaCs8uJGdGQrqltzl3OjiK4epGZRdvSzTe63P+t/3z+D2wG+ffEPn0GVcDozmN1w==} - dependencies: - '@walletconnect/jsonrpc-utils': 1.0.8 - '@walletconnect/safe-json': 1.0.2 - events: 3.3.0 - tslib: 1.14.1 - ws: 7.5.9 - transitivePeerDependencies: - - bufferutil - - utf-8-validate - dev: true - /@walletconnect/jsonrpc-ws-connection@1.0.13: resolution: {integrity: sha512-mfOM7uFH4lGtQxG+XklYuFBj6dwVvseTt5/ahOkkmpcAEgz2umuzu7fTR+h5EmjQBdrmYyEBOWADbeaFNxdySg==} dependencies: @@ -5103,32 +5076,34 @@ packages: pino: 7.11.0 tslib: 1.14.1 - /@walletconnect/modal-core@2.5.9(react@18.2.0): - resolution: {integrity: sha512-isIebwF9hOknGouhS/Ob4YJ9Sa/tqNYG2v6Ua9EkCqIoLimepkG5eC53tslUWW29SLSfQ9qqBNG2+iE7yQXqgw==} + /@walletconnect/modal-core@2.6.2(react@18.2.0): + resolution: {integrity: sha512-cv8ibvdOJQv2B+nyxP9IIFdxvQznMz8OOr/oR/AaUZym4hjXNL/l1a2UlSQBXrVjo3xxbouMxLb3kBsHoYP2CA==} dependencies: - buffer: 6.0.3 - valtio: 1.10.6(react@18.2.0) + valtio: 1.11.2(react@18.2.0) transitivePeerDependencies: + - '@types/react' - react dev: true - /@walletconnect/modal-ui@2.5.9(react@18.2.0): - resolution: {integrity: sha512-nfBaAT9Ls7RZTBBgAq+Nt/3AoUcinIJ9bcq5UHXTV3lOPu/qCKmUC/0HY3GvUK8ykabUAsjr0OAGmcqkB91qug==} + /@walletconnect/modal-ui@2.6.2(react@18.2.0): + resolution: {integrity: sha512-rbdstM1HPGvr7jprQkyPggX7rP4XiCG85ZA+zWBEX0dVQg8PpAgRUqpeub4xQKDgY7pY/xLRXSiCVdWGqvG2HA==} dependencies: - '@walletconnect/modal-core': 2.5.9(react@18.2.0) - lit: 2.7.5 + '@walletconnect/modal-core': 2.6.2(react@18.2.0) + lit: 2.8.0 motion: 10.16.2 qrcode: 1.5.3 transitivePeerDependencies: + - '@types/react' - react dev: true - /@walletconnect/modal@2.5.9(react@18.2.0): - resolution: {integrity: sha512-Zs2RvPwbBNRdBhb50FuJCxi3FJltt1KSpI7odjU/x9GTpTOcSOkmR66PBCy2JvNA0+ztnS1Xs0LVEr3lu7/Jzw==} + /@walletconnect/modal@2.6.2(react@18.2.0): + resolution: {integrity: sha512-eFopgKi8AjKf/0U4SemvcYw9zlLpx9njVN8sf6DAkowC2Md0gPU/UNEbH1Wwj407pEKnEds98pKWib1NN1ACoA==} dependencies: - '@walletconnect/modal-core': 2.5.9(react@18.2.0) - '@walletconnect/modal-ui': 2.5.9(react@18.2.0) + '@walletconnect/modal-core': 2.6.2(react@18.2.0) + '@walletconnect/modal-ui': 2.6.2(react@18.2.0) transitivePeerDependencies: + - '@types/react' - react dev: true @@ -5161,50 +5136,50 @@ packages: dependencies: tslib: 1.14.1 - /@walletconnect/sign-client@2.7.2: - resolution: {integrity: sha512-JOYPmrgR4YG4M2comNcXaa8cLIws0ZJj/SCpF0XJzRZP2+OXWouK19UaI32ROQrcwNodBNeYFRfT5hSM5xjfKg==} + /@walletconnect/sign-client@2.10.1: + resolution: {integrity: sha512-iG3eJGi1yXeG3xGeVSSMf8wDFyx239B0prLQfy1uYDtYFb2ynnH/09oqAZyKn96W5nfQzUgM2Mz157PVdloH3Q==} dependencies: - '@walletconnect/core': 2.7.2 + '@walletconnect/core': 2.10.1 '@walletconnect/events': 1.0.1 '@walletconnect/heartbeat': 1.2.1 '@walletconnect/jsonrpc-utils': 1.0.8 '@walletconnect/logger': 2.0.1 '@walletconnect/time': 1.0.2 - '@walletconnect/types': 2.7.2 - '@walletconnect/utils': 2.7.2 + '@walletconnect/types': 2.10.1 + '@walletconnect/utils': 2.10.1 events: 3.3.0 transitivePeerDependencies: - '@react-native-async-storage/async-storage' - bufferutil - lokijs - utf-8-validate + dev: true - /@walletconnect/sign-client@2.9.0: - resolution: {integrity: sha512-mEKc4LlLMebCe45qzqh+MX4ilQK4kOEBzLY6YJpG8EhyT45eX4JMNA7qQoYa9MRMaaVb/7USJcc4e3ZrjZvQmA==} + /@walletconnect/sign-client@2.7.2: + resolution: {integrity: sha512-JOYPmrgR4YG4M2comNcXaa8cLIws0ZJj/SCpF0XJzRZP2+OXWouK19UaI32ROQrcwNodBNeYFRfT5hSM5xjfKg==} dependencies: - '@walletconnect/core': 2.9.0 + '@walletconnect/core': 2.7.2 '@walletconnect/events': 1.0.1 '@walletconnect/heartbeat': 1.2.1 '@walletconnect/jsonrpc-utils': 1.0.8 '@walletconnect/logger': 2.0.1 '@walletconnect/time': 1.0.2 - '@walletconnect/types': 2.9.0 - '@walletconnect/utils': 2.9.0 + '@walletconnect/types': 2.7.2 + '@walletconnect/utils': 2.7.2 events: 3.3.0 transitivePeerDependencies: - '@react-native-async-storage/async-storage' - bufferutil - lokijs - utf-8-validate - dev: true /@walletconnect/time@1.0.2: resolution: {integrity: sha512-uzdd9woDcJ1AaBZRhqy5rNC9laqWGErfc4dxA9a87mPdKOgWMD85mcFo9dIYIts/Jwocfwn07EC6EzclKubk/g==} dependencies: tslib: 1.14.1 - /@walletconnect/types@2.7.2: - resolution: {integrity: sha512-1O2UefakZpT0ErRfEAXY7Ls3qdUrKDky/DsK088xR6klyfkQOx+aSVH0fJYLhmnqPTuvp3lrqNbsDc0s6/6nvg==} + /@walletconnect/types@2.10.1: + resolution: {integrity: sha512-7pccAhajQdiH2kYywjE1XI64IqRI+4ioyGy0wvz8d0UFQ/DSG3MLKR8jHf5aTOafQQ/HRLz6xvlzN4a7gIVkUQ==} dependencies: '@walletconnect/events': 1.0.1 '@walletconnect/heartbeat': 1.2.1 @@ -5215,9 +5190,10 @@ packages: transitivePeerDependencies: - '@react-native-async-storage/async-storage' - lokijs + dev: true - /@walletconnect/types@2.9.0: - resolution: {integrity: sha512-ORopsMfSRvUYqtjKKd6scfg8o4/aGebipLxx92AuuUgMTERSU6cGmIrK6rdLu7W6FBJkmngPLEGc9mRqAb9Lug==} + /@walletconnect/types@2.7.2: + resolution: {integrity: sha512-1O2UefakZpT0ErRfEAXY7Ls3qdUrKDky/DsK088xR6klyfkQOx+aSVH0fJYLhmnqPTuvp3lrqNbsDc0s6/6nvg==} dependencies: '@walletconnect/events': 1.0.1 '@walletconnect/heartbeat': 1.2.1 @@ -5228,62 +5204,60 @@ packages: transitivePeerDependencies: - '@react-native-async-storage/async-storage' - lokijs - dev: true - /@walletconnect/universal-provider@2.7.2: - resolution: {integrity: sha512-5glu7vCmq3SFUYgniICf7CUZMwrd6FNS/qnCjrnfgW8T55Opms9YkhRpWTJFHpBdNRWF7n6z/Kss2J8olKTxKw==} + /@walletconnect/universal-provider@2.10.1: + resolution: {integrity: sha512-81QxTH/X4dRoYCz0U9iOrBYOcj7N897ONcB57wsGhEkV7Rc9htmWJq2CzeOuxvVZ+pNZkE+/aw9LrhizO1Ltxg==} dependencies: '@walletconnect/jsonrpc-http-connection': 1.0.7 '@walletconnect/jsonrpc-provider': 1.0.13 '@walletconnect/jsonrpc-types': 1.0.3 '@walletconnect/jsonrpc-utils': 1.0.8 '@walletconnect/logger': 2.0.1 - '@walletconnect/sign-client': 2.7.2 - '@walletconnect/types': 2.7.2 - '@walletconnect/utils': 2.7.2 - eip1193-provider: 1.0.1 + '@walletconnect/sign-client': 2.10.1 + '@walletconnect/types': 2.10.1 + '@walletconnect/utils': 2.10.1 events: 3.3.0 transitivePeerDependencies: - '@react-native-async-storage/async-storage' - bufferutil - - debug - encoding - lokijs - utf-8-validate + dev: true - /@walletconnect/universal-provider@2.9.0: - resolution: {integrity: sha512-k3nkSBkF69sJJVoe17IVoPtnhp/sgaa2t+x7BvA/BKeMxE0DGdtRJdEXotTc8DBmI7o2tkq6l8+HyFBGjQ/CjQ==} + /@walletconnect/universal-provider@2.7.2: + resolution: {integrity: sha512-5glu7vCmq3SFUYgniICf7CUZMwrd6FNS/qnCjrnfgW8T55Opms9YkhRpWTJFHpBdNRWF7n6z/Kss2J8olKTxKw==} dependencies: '@walletconnect/jsonrpc-http-connection': 1.0.7 '@walletconnect/jsonrpc-provider': 1.0.13 '@walletconnect/jsonrpc-types': 1.0.3 '@walletconnect/jsonrpc-utils': 1.0.8 '@walletconnect/logger': 2.0.1 - '@walletconnect/sign-client': 2.9.0 - '@walletconnect/types': 2.9.0 - '@walletconnect/utils': 2.9.0 + '@walletconnect/sign-client': 2.7.2 + '@walletconnect/types': 2.7.2 + '@walletconnect/utils': 2.7.2 + eip1193-provider: 1.0.1 events: 3.3.0 transitivePeerDependencies: - '@react-native-async-storage/async-storage' - bufferutil + - debug - encoding - lokijs - utf-8-validate - dev: true - /@walletconnect/utils@2.7.2: - resolution: {integrity: sha512-b2lU/JoWqwCOLMudPSRTt3pliBnv6qQHCBWiMBYi1vL14AW3usO5QmK1wF90AVwpdPJ7wFZ6MgHymeWWfhYnGQ==} + /@walletconnect/utils@2.10.1: + resolution: {integrity: sha512-DM0dKgm9O58l7VqJEyV2OVv16XRePhDAReI23let6WdW1dSpw/Y/A89Lp99ZJOjLm2FxyblMRF3YRaZtHwBffw==} dependencies: '@stablelib/chacha20poly1305': 1.0.1 '@stablelib/hkdf': 1.0.1 '@stablelib/random': 1.0.2 '@stablelib/sha256': 1.0.1 '@stablelib/x25519': 1.0.3 - '@walletconnect/jsonrpc-utils': 1.0.8 '@walletconnect/relay-api': 1.0.9 '@walletconnect/safe-json': 1.0.2 '@walletconnect/time': 1.0.2 - '@walletconnect/types': 2.7.2 + '@walletconnect/types': 2.10.1 '@walletconnect/window-getters': 1.0.1 '@walletconnect/window-metadata': 1.0.1 detect-browser: 5.3.0 @@ -5292,19 +5266,21 @@ packages: transitivePeerDependencies: - '@react-native-async-storage/async-storage' - lokijs + dev: true - /@walletconnect/utils@2.9.0: - resolution: {integrity: sha512-7Tu3m6dZL84KofrNBcblsgpSqU2vdo9ImLD7zWimLXERVGNQ8smXG+gmhQYblebIBhsPzjy9N38YMC3nPlfQNw==} + /@walletconnect/utils@2.7.2: + resolution: {integrity: sha512-b2lU/JoWqwCOLMudPSRTt3pliBnv6qQHCBWiMBYi1vL14AW3usO5QmK1wF90AVwpdPJ7wFZ6MgHymeWWfhYnGQ==} dependencies: '@stablelib/chacha20poly1305': 1.0.1 '@stablelib/hkdf': 1.0.1 '@stablelib/random': 1.0.2 '@stablelib/sha256': 1.0.1 '@stablelib/x25519': 1.0.3 + '@walletconnect/jsonrpc-utils': 1.0.8 '@walletconnect/relay-api': 1.0.9 '@walletconnect/safe-json': 1.0.2 '@walletconnect/time': 1.0.2 - '@walletconnect/types': 2.9.0 + '@walletconnect/types': 2.7.2 '@walletconnect/window-getters': 1.0.1 '@walletconnect/window-metadata': 1.0.1 detect-browser: 5.3.0 @@ -5313,7 +5289,6 @@ packages: transitivePeerDependencies: - '@react-native-async-storage/async-storage' - lokijs - dev: true /@walletconnect/window-getters@1.0.1: resolution: {integrity: sha512-vHp+HqzGxORPAN8gY03qnbTMnhqIwjeRJNOMOAzePRg4xVEEE2WvYsI9G2NMjOknA8hnuYbU3/hwLcKbjhc8+Q==} @@ -6702,6 +6677,7 @@ packages: /cookie@0.4.1: resolution: {integrity: sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==} engines: {node: '>= 0.6'} + dev: true /cookie@0.5.0: resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} @@ -9049,7 +9025,7 @@ packages: solc: 0.7.3(debug@4.3.4) source-map-support: 0.5.21 stacktrace-parser: 0.1.10 - ts-node: 10.9.1(@types/node@20.7.1)(typescript@5.2.2) + ts-node: 10.9.1(@types/node@20.7.2)(typescript@5.2.2) tsort: 0.0.1 typescript: 5.2.2 undici: 5.24.0 @@ -10304,10 +10280,10 @@ packages: dependencies: '@lit-labs/ssr-dom-shim': 1.1.1 '@lit/reactive-element': 1.6.2 - lit-html: 2.7.5 + lit-html: 2.8.0 - /lit-html@2.7.5: - resolution: {integrity: sha512-YqUzpisJodwKIlbMFCtyrp58oLloKGnnPLMJ1t23cbfIJjg/H9pvLWK4XS69YeubK5HUs1UE4ys9w5dP1zg6IA==} + /lit-html@2.8.0: + resolution: {integrity: sha512-o9t+MQM3P4y7M7yNzqAyjp7z+mQGa4NS4CxiyLqFPyFWyc4O+nodLrkrxSaCTrla6M5YOLaT3RpbbqjszB5g3Q==} dependencies: '@types/trusted-types': 2.0.3 @@ -10316,7 +10292,15 @@ packages: dependencies: '@lit/reactive-element': 1.6.2 lit-element: 3.3.2 - lit-html: 2.7.5 + lit-html: 2.8.0 + + /lit@2.8.0: + resolution: {integrity: sha512-4Sc3OFX9QHOJaHbmTMk28SYgVxLN3ePDjg7hofEft2zWlehFL3LiAuapWc4U/kYwMYJSh2hTCPZ6/LIC7ii0MA==} + dependencies: + '@lit/reactive-element': 1.6.2 + lit-element: 3.3.2 + lit-html: 2.8.0 + dev: true /load-json-file@1.1.0: resolution: {integrity: sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A==} @@ -11967,8 +11951,8 @@ packages: duplexify: 4.1.2 split2: 4.2.0 - /pino-abstract-transport@1.0.0: - resolution: {integrity: sha512-c7vo5OpW4wIS42hUVcT5REsL8ZljsUfBjqV/e2sFxmFEFZiq1XLUp5EYLtuDH6PEHq9W1egWqRbnLUP5FuZmOA==} + /pino-abstract-transport@1.1.0: + resolution: {integrity: sha512-lsleG3/2a/JIWUtf9Q5gUNErBqwIu1tUKTT3dUzaf5DySw9ra1wcqKjJjLX1VTY64Wk1eEOYsVGSaGfCK85ekA==} dependencies: readable-stream: 4.4.2 split2: 4.2.0 @@ -11985,7 +11969,7 @@ packages: engines: {node: '>=10'} hasBin: true dependencies: - '@sentry/node': 7.64.0 + '@sentry/node': 7.73.0 commander: 2.20.3 pumpify: 2.0.1 split2: 3.2.2 @@ -12016,14 +12000,14 @@ packages: sonic-boom: 2.8.0 thread-stream: 0.15.2 - /pino@8.15.0: - resolution: {integrity: sha512-olUADJByk4twxccmAxb1RiGKOSvddHugCV3wkqjyv+3Sooa2KLrmXrKEWOKi0XPCLasRR5jBXxioE1jxUa4KzQ==} + /pino@8.15.3: + resolution: {integrity: sha512-wDds1+DH8VaREe4fpLEKttGnDoLiX3KR3AP5bHsrRwEZ93y+Z/HFC03zkGSxpIGWKDHg24sloVqGcIWoLCkTLQ==} hasBin: true dependencies: atomic-sleep: 1.0.0 fast-redact: 3.2.0 on-exit-leak-free: 2.1.0 - pino-abstract-transport: 1.0.0 + pino-abstract-transport: 1.1.0 pino-std-serializers: 6.2.2 process-warning: 2.2.0 quick-format-unescaped: 4.0.4 @@ -13787,7 +13771,7 @@ packages: tsconfig-paths: 3.14.2 dev: true - /ts-node@10.9.1(@types/node@20.7.1)(typescript@5.2.2): + /ts-node@10.9.1(@types/node@20.7.2)(typescript@5.2.2): resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} hasBin: true peerDependencies: @@ -13806,7 +13790,7 @@ packages: '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 20.7.1 + '@types/node': 20.7.2 acorn: 8.10.0 acorn-walk: 8.2.0 arg: 4.1.3 @@ -13870,10 +13854,6 @@ packages: /tslib@1.14.1: resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} - /tslib@2.6.0: - resolution: {integrity: sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA==} - dev: false - /tslib@2.6.2: resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} @@ -14319,12 +14299,15 @@ packages: react: 18.2.0 use-sync-external-store: 1.2.0(react@18.2.0) - /valtio@1.10.6(react@18.2.0): - resolution: {integrity: sha512-SxN1bHUmdhW6V8qsQTpCgJEwp7uHbntuH0S9cdLQtiohuevwBksbpXjwj5uDMA7bLwg1WKyq9sEpZrx3TIMrkA==} + /valtio@1.11.2(react@18.2.0): + resolution: {integrity: sha512-1XfIxnUXzyswPAPXo1P3Pdx2mq/pIqZICkWN60Hby0d9Iqb+MEIpqgYVlbflvHdrp2YR/q3jyKWRPJJ100yxaw==} engines: {node: '>=12.20.0'} peerDependencies: + '@types/react': '>=16.8' react: '>=16.8' peerDependenciesMeta: + '@types/react': + optional: true react: optional: true dependencies: @@ -14409,7 +14392,7 @@ packages: - zod dev: true - /vite-node@0.34.1(@types/node@20.7.1): + /vite-node@0.34.1(@types/node@20.7.2): resolution: {integrity: sha512-odAZAL9xFMuAg8aWd7nSPT+hU8u2r9gU3LRm9QKjxBEF2rRdWpMuqkrkjvyVQEdNFiBctqr2Gg4uJYizm5Le6w==} engines: {node: '>=v14.18.0'} hasBin: true @@ -14419,7 +14402,7 @@ packages: mlly: 1.4.0 pathe: 1.1.1 picocolors: 1.0.0 - vite: 4.4.9(@types/node@20.7.1) + vite: 4.4.9(@types/node@20.7.2) transitivePeerDependencies: - '@types/node' - less @@ -14431,7 +14414,7 @@ packages: - terser dev: true - /vite-node@0.34.2(@types/node@20.7.0): + /vite-node@0.34.2(@types/node@20.7.1): resolution: {integrity: sha512-JtW249Zm3FB+F7pQfH56uWSdlltCo1IOkZW5oHBzeQo0iX4jtC7o1t9aILMGd9kVekXBP2lfJBEQt9rBh07ebA==} engines: {node: '>=v14.18.0'} hasBin: true @@ -14441,7 +14424,7 @@ packages: mlly: 1.4.0 pathe: 1.1.1 picocolors: 1.0.0 - vite: 4.4.9(@types/node@20.7.0) + vite: 4.4.9(@types/node@20.7.1) transitivePeerDependencies: - '@types/node' - less @@ -14453,7 +14436,7 @@ packages: - terser dev: true - /vite-node@0.34.2(@types/node@20.7.1): + /vite-node@0.34.2(@types/node@20.7.2): resolution: {integrity: sha512-JtW249Zm3FB+F7pQfH56uWSdlltCo1IOkZW5oHBzeQo0iX4jtC7o1t9aILMGd9kVekXBP2lfJBEQt9rBh07ebA==} engines: {node: '>=v14.18.0'} hasBin: true @@ -14463,7 +14446,7 @@ packages: mlly: 1.4.0 pathe: 1.1.1 picocolors: 1.0.0 - vite: 4.4.9(@types/node@20.7.1) + vite: 4.4.9(@types/node@20.7.2) transitivePeerDependencies: - '@types/node' - less @@ -14475,7 +14458,7 @@ packages: - terser dev: true - /vite-node@0.34.4(@types/node@20.7.0): + /vite-node@0.34.4(@types/node@20.7.1): resolution: {integrity: sha512-ho8HtiLc+nsmbwZMw8SlghESEE3KxJNp04F/jPUCLVvaURwt0d+r9LxEqCX5hvrrOQ0GSyxbYr5ZfRYhQ0yVKQ==} engines: {node: '>=v14.18.0'} hasBin: true @@ -14485,7 +14468,7 @@ packages: mlly: 1.4.0 pathe: 1.1.1 picocolors: 1.0.0 - vite: 4.4.9(@types/node@20.7.0) + vite: 4.4.9(@types/node@20.7.1) transitivePeerDependencies: - '@types/node' - less @@ -14497,7 +14480,7 @@ packages: - terser dev: true - /vite@4.4.6(@types/node@20.7.1): + /vite@4.4.6(@types/node@20.7.2): resolution: {integrity: sha512-EY6Mm8vJ++S3D4tNAckaZfw3JwG3wa794Vt70M6cNJ6NxT87yhq7EC8Rcap3ahyHdo8AhCmV9PTk+vG1HiYn1A==} engines: {node: ^14.18.0 || >=16.0.0} hasBin: true @@ -14525,7 +14508,7 @@ packages: terser: optional: true dependencies: - '@types/node': 20.7.1 + '@types/node': 20.7.2 esbuild: 0.18.15 postcss: 8.4.27 rollup: 3.26.3 @@ -14533,7 +14516,7 @@ packages: fsevents: 2.3.3 dev: true - /vite@4.4.9(@types/node@20.7.0): + /vite@4.4.9(@types/node@20.7.1): resolution: {integrity: sha512-2mbUn2LlUmNASWwSCNSJ/EG2HuSRTnVNaydp6vMCm5VIqJsjMfbIWtbH2kDuwUVW5mMUKKZvGPX/rqeqVvv1XA==} engines: {node: ^14.18.0 || >=16.0.0} hasBin: true @@ -14561,7 +14544,7 @@ packages: terser: optional: true dependencies: - '@types/node': 20.7.0 + '@types/node': 20.7.1 esbuild: 0.18.15 postcss: 8.4.27 rollup: 3.28.0 @@ -14569,7 +14552,7 @@ packages: fsevents: 2.3.3 dev: true - /vite@4.4.9(@types/node@20.7.1): + /vite@4.4.9(@types/node@20.7.2): resolution: {integrity: sha512-2mbUn2LlUmNASWwSCNSJ/EG2HuSRTnVNaydp6vMCm5VIqJsjMfbIWtbH2kDuwUVW5mMUKKZvGPX/rqeqVvv1XA==} engines: {node: ^14.18.0 || >=16.0.0} hasBin: true @@ -14597,7 +14580,7 @@ packages: terser: optional: true dependencies: - '@types/node': 20.7.1 + '@types/node': 20.7.2 esbuild: 0.18.15 postcss: 8.4.27 rollup: 3.28.0 @@ -14638,7 +14621,7 @@ packages: dependencies: '@types/chai': 4.3.6 '@types/chai-subset': 1.3.3 - '@types/node': 20.7.1 + '@types/node': 20.7.2 '@vitest/expect': 0.34.1 '@vitest/runner': 0.34.1 '@vitest/snapshot': 0.34.1 @@ -14657,8 +14640,8 @@ packages: strip-literal: 1.0.1 tinybench: 2.5.0 tinypool: 0.7.0 - vite: 4.4.9(@types/node@20.7.1) - vite-node: 0.34.1(@types/node@20.7.1) + vite: 4.4.9(@types/node@20.7.2) + vite-node: 0.34.1(@types/node@20.7.2) why-is-node-running: 2.2.2 transitivePeerDependencies: - less @@ -14703,7 +14686,7 @@ packages: dependencies: '@types/chai': 4.3.6 '@types/chai-subset': 1.3.3 - '@types/node': 20.7.1 + '@types/node': 20.7.2 '@vitest/expect': 0.34.2 '@vitest/runner': 0.34.2 '@vitest/snapshot': 0.34.2 @@ -14722,8 +14705,8 @@ packages: strip-literal: 1.0.1 tinybench: 2.5.0 tinypool: 0.7.0 - vite: 4.4.9(@types/node@20.7.1) - vite-node: 0.34.2(@types/node@20.7.1) + vite: 4.4.9(@types/node@20.7.2) + vite-node: 0.34.2(@types/node@20.7.2) why-is-node-running: 2.2.2 transitivePeerDependencies: - less @@ -14768,7 +14751,7 @@ packages: dependencies: '@types/chai': 4.3.6 '@types/chai-subset': 1.3.3 - '@types/node': 20.7.0 + '@types/node': 20.7.1 '@vitest/expect': 0.34.2 '@vitest/runner': 0.34.2 '@vitest/snapshot': 0.34.2 @@ -14788,8 +14771,8 @@ packages: strip-literal: 1.0.1 tinybench: 2.5.0 tinypool: 0.7.0 - vite: 4.4.9(@types/node@20.7.0) - vite-node: 0.34.2(@types/node@20.7.0) + vite: 4.4.9(@types/node@20.7.1) + vite-node: 0.34.2(@types/node@20.7.1) why-is-node-running: 2.2.2 transitivePeerDependencies: - less @@ -14834,7 +14817,7 @@ packages: dependencies: '@types/chai': 4.3.6 '@types/chai-subset': 1.3.3 - '@types/node': 20.7.0 + '@types/node': 20.7.1 '@vitest/expect': 0.34.4 '@vitest/runner': 0.34.4 '@vitest/snapshot': 0.34.4 @@ -14853,8 +14836,8 @@ packages: strip-literal: 1.0.1 tinybench: 2.5.0 tinypool: 0.7.0 - vite: 4.4.9(@types/node@20.7.0) - vite-node: 0.34.4(@types/node@20.7.0) + vite: 4.4.9(@types/node@20.7.1) + vite-node: 0.34.4(@types/node@20.7.1) why-is-node-running: 2.2.2 transitivePeerDependencies: - less diff --git a/proxyd/go.mod b/proxyd/go.mod index f7ee8d198965813d31fc5c8d5cb6a69a223ad256..e895d1f673fdb4922eed8183969303805412ebba 100644 --- a/proxyd/go.mod +++ b/proxyd/go.mod @@ -7,14 +7,16 @@ require ( github.com/alicebob/miniredis v2.5.0+incompatible github.com/emirpasic/gods v1.18.1 github.com/ethereum/go-ethereum v1.12.1 + github.com/go-redsync/redsync/v4 v4.9.4 github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb github.com/gorilla/mux v1.8.0 github.com/gorilla/websocket v1.5.0 github.com/hashicorp/golang-lru v0.5.5-0.20210104140557-80c98217689d github.com/pkg/errors v0.9.1 github.com/prometheus/client_golang v1.14.0 + github.com/redis/go-redis/v9 v9.1.0 github.com/rs/cors v1.8.2 - github.com/stretchr/testify v1.8.1 + github.com/stretchr/testify v1.8.2 github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 golang.org/x/sync v0.3.0 gopkg.in/yaml.v3 v3.0.1 @@ -34,7 +36,7 @@ require ( github.com/cockroachdb/pebble v0.0.0-20230209160836-829675f94811 // indirect github.com/cockroachdb/redact v1.1.3 // indirect github.com/consensys/bavard v0.1.13 // indirect - github.com/consensys/gnark-crypto v0.10.0 // indirect + github.com/consensys/gnark-crypto v0.12.0 // indirect github.com/crate-crypto/go-kzg-4844 v0.3.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/deckarep/golang-set/v2 v2.1.0 // indirect @@ -43,7 +45,6 @@ require ( github.com/ethereum/c-kzg-4844 v0.3.0 // indirect github.com/getsentry/sentry-go v0.18.0 // indirect github.com/go-ole/go-ole v1.2.6 // indirect - github.com/go-redsync/redsync/v4 v4.9.4 // indirect github.com/go-stack/stack v1.8.1 // indirect github.com/gofrs/flock v0.8.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect @@ -64,7 +65,6 @@ require ( github.com/prometheus/client_model v0.3.0 // indirect github.com/prometheus/common v0.39.0 // indirect github.com/prometheus/procfs v0.9.0 // indirect - github.com/redis/go-redis/v9 v9.1.0 // indirect github.com/rivo/uniseg v0.2.0 // indirect github.com/rogpeppe/go-internal v1.9.0 // indirect github.com/shirou/gopsutil v3.21.11+incompatible // indirect @@ -73,10 +73,10 @@ require ( github.com/tklauser/numcpus v0.4.0 // indirect github.com/yuin/gopher-lua v0.0.0-20210529063254-f4c35e4016d9 // indirect github.com/yusufpapurcu/wmi v1.2.2 // indirect - golang.org/x/crypto v0.9.0 // indirect + golang.org/x/crypto v0.10.0 // indirect golang.org/x/exp v0.0.0-20230515195305-f3d0a9c9a5cc // indirect golang.org/x/sys v0.9.0 // indirect - golang.org/x/text v0.9.0 // indirect + golang.org/x/text v0.10.0 // indirect google.golang.org/protobuf v1.28.1 // indirect gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce // indirect rsc.io/tmplfunc v0.0.3 // indirect diff --git a/proxyd/go.sum b/proxyd/go.sum index fdfa8c99fc7507484c00241d38c494aeb32d1eeb..229bcce730caac23a1578267a5dec098de2befe8 100644 --- a/proxyd/go.sum +++ b/proxyd/go.sum @@ -26,7 +26,9 @@ github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6r 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/bsm/ginkgo/v2 v2.5.0/go.mod h1:AiKlXPm7ItEHNc/2+OkrNG4E0ITzojb9/xWzvQ9XZ9w= +github.com/bsm/ginkgo/v2 v2.9.5 h1:rtVBYPs3+TC5iLUVOis1B9tjLTup7Cj5IfzosKtvTJ0= github.com/bsm/gomega v1.20.0/go.mod h1:JifAceMQ4crZIWYUKrlGcmbN3bqHogVTADMD2ATsbwk= +github.com/bsm/gomega v1.26.0 h1:LhQm+AFcgV2M0WyKroMASzAzCAJVpAxQXv4SaI9a69Y= github.com/btcsuite/btcd v0.20.1-beta/go.mod h1:wVuoA8VJLEcwgqHBwHmzLRazpKxTv13Px/pDuV7OomQ= github.com/btcsuite/btcd v0.22.0-beta h1:LTDpDKUM5EeOFBPM8IXpinEcmZ6FWfNZbE3lfrfdnWo= github.com/btcsuite/btcd v0.22.0-beta/go.mod h1:9n5ntfhhHQBIhUvlhDvD3Qg6fRUj4jkN0VB8L8svzOA= @@ -65,8 +67,8 @@ github.com/cockroachdb/redact v1.1.3/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZ 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.10.0 h1:zRh22SR7o4K35SoNqouS9J/TKHTyU2QWaj5ldehyXtA= -github.com/consensys/gnark-crypto v0.10.0/go.mod h1:Iq/P3HHl0ElSjsg2E1gsMwhAyxnxoKK5nVyZKd+/KhU= +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/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= @@ -122,8 +124,11 @@ github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre 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-redis/redis v6.15.9+incompatible h1:K0pv1D7EQUjfyoMql+r/jZqCLizCGKFlFgcHWWmHQjg= github.com/go-redis/redis v6.15.9+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA= +github.com/go-redis/redis/v7 v7.4.0 h1:7obg6wUoj05T0EpY0o8B59S9w5yeMWql7sw2kwNW1x4= github.com/go-redis/redis/v7 v7.4.0/go.mod h1:JDNMw23GTyLNC4GZu9njt15ctBQVn7xjRfnwdHj/Dcg= +github.com/go-redis/redis/v8 v8.11.4 h1:kHoYkfZP6+pe04aFTnhDH6GDROa5yJdHJVNxV3F46Tg= github.com/go-redis/redis/v8 v8.11.4/go.mod h1:2Z2wHZXdQpCDXEGzqMockDpNyYvi2l4Pxt6RJr792+w= github.com/go-redsync/redsync/v4 v4.9.4 h1:vRmYusI+qF95XSpApHAdeu+RjyDvxBXbMthbc/x148c= github.com/go-redsync/redsync/v4 v4.9.4/go.mod h1:RqBDXUw0q+u9FJTeD2gMzGtHeSVV93DiqGl10B9Hn/4= @@ -163,8 +168,6 @@ github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEW github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb h1:PBC98N2aIaM3XXiurYmW7fx4GZkL8feAMVq7nEjURHk= github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/gomodule/redigo v1.7.1-0.20190724094224-574c33c3df38/go.mod h1:B4C85qUVwatsJoIUNIfCRsp7qO0iAmpGFZ4EELWSbC4= -github.com/gomodule/redigo v1.8.8 h1:f6cXq6RRfiyrOJEV7p3JhLDlmawGBVBBP1MggY8Mo4E= -github.com/gomodule/redigo v1.8.8/go.mod h1:7ArFNvsTjH8GMMzB4uy1snslv2BwmginuMs06a1uzZE= github.com/gomodule/redigo v1.8.9 h1:Sl3u+2BI/kk+VEatbj0scLdrFhjPmbxOc1myhDP41ws= github.com/gomodule/redigo v1.8.9/go.mod h1:7ArFNvsTjH8GMMzB4uy1snslv2BwmginuMs06a1uzZE= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= @@ -301,7 +304,6 @@ github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1Cpa github.com/onsi/gomega v1.7.0/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.16.0 h1:6gjqkI8iiRHMvdccRJM8rVKjCWk6ZIm6FTm3ddIe4/c= github.com/onsi/gomega v1.16.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro= @@ -343,6 +345,7 @@ github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZV 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/rueian/rueidis v0.0.93 h1:cG905akj2+QyHx0x9y4mN0K8vLi6M94QiyoLulXS3l0= github.com/rueian/rueidis v0.0.93/go.mod h1:lo6LBci0D986usi5Wxjb4RVNaWENKYbHZSnufGJ9bTE= github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= @@ -369,8 +372,10 @@ github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5 github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.8.2 h1:+h33VjcLVPDHtOdpUCuF+7gSuG3yGIftsP1YvFihtJ8= +github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stvp/tempredis v0.0.0-20181119212430-b82af8480203 h1:QVqDTf3h2WHt08YuiTGPZLls0Wq99X9bWd0Q5ZSBesM= github.com/stvp/tempredis v0.0.0-20181119212430-b82af8480203/go.mod h1:oqN97ltKNihBbwlX8dLpwxCl3+HnXKV/R0e+sRLd9C8= github.com/supranational/blst v0.3.11 h1:LyU6FolezeWAhvQk0k6O/d49jqgO52MSDDfYgbeoEm4= github.com/supranational/blst v0.3.11/go.mod h1:jZJtfjgudtNl4en1tzwPIV3KjUnQUvG3/j+w+fVonLw= @@ -425,8 +430,8 @@ golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPh 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.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw= -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.10.0 h1:LKqV2xt9+kDzSTfOhx4FrkEBcMrAgHSYgzywV9zcGmM= +golang.org/x/crypto v0.10.0/go.mod h1:o4eNf7Ede1fv+hwOwZsTHl9EsPFO6q6ZvYR8vYfY45I= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20230515195305-f3d0a9c9a5cc h1:mCRnTeVUjcrhlRmO0VK8a6k6Rrf6TF9htwo2pJVSjIU= golang.org/x/exp v0.0.0-20230515195305-f3d0a9c9a5cc/go.mod h1:V1LtkGg67GoY2N1AnLN78QLrzxkLyJw7RJb1gzOOz9w= @@ -549,8 +554,8 @@ golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.5.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -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.10.0 h1:UpjohKhiEgNc0CSauXmwYftY1+LlaC75SJwh0SgCX58= +golang.org/x/text v0.10.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181221001348-537d06c36207/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= diff --git a/specs/cannon-fault-proof-vm.md b/specs/cannon-fault-proof-vm.md index 320a484a6d7e8aefcf25decc4704a6774934466e..685fcd72ea1268e0bea49bd950a724f582f57bb7 100644 --- a/specs/cannon-fault-proof-vm.md +++ b/specs/cannon-fault-proof-vm.md @@ -199,7 +199,7 @@ This means the start and end of a read/write operation must fall within the same If an operation were to violate this, the input `count` of the read/write syscall must be truncated such that the effective address of the last byte read/writtten matches the input effective address. -The VM must read/write the maximum amount of bytes possible without crossing the input adress alignment boundary. +The VM must read/write the maximum amount of bytes possible without crossing the input address alignment boundary. For example, the effect of a write request for a 3-byte aligned buffer must be exactly 3 bytes. If the buffer is misaligned, then the VM may write less than 3 bytes depending on the size of the misalignment.