From fe1f3c55fbd89fc1643830110b148f720337b502 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 14 Sep 2023 17:38:29 +0000 Subject: [PATCH 01/87] build(deps-dev): bump eslint-plugin-unicorn from 42.0.0 to 48.0.1 Bumps [eslint-plugin-unicorn](https://github.com/sindresorhus/eslint-plugin-unicorn) from 42.0.0 to 48.0.1. - [Release notes](https://github.com/sindresorhus/eslint-plugin-unicorn/releases) - [Commits](https://github.com/sindresorhus/eslint-plugin-unicorn/compare/v42.0.0...v48.0.1) --- updated-dependencies: - dependency-name: eslint-plugin-unicorn dependency-type: direct:development update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- package.json | 2 +- pnpm-lock.yaml | 78 ++++++++++++++++++++++++-------------------------- 2 files changed, 39 insertions(+), 41 deletions(-) diff --git a/package.json b/package.json index ed1cfc0ca5d1..9c769caa9a2d 100644 --- a/package.json +++ b/package.json @@ -59,7 +59,7 @@ "eslint-plugin-prettier": "^4.0.0", "eslint-plugin-promise": "^5.1.0", "eslint-plugin-react": "^7.24.0", - "eslint-plugin-unicorn": "^42.0.0", + "eslint-plugin-unicorn": "^48.0.1", "husky": "^8.0.3", "lint-staged": "14.0.1", "markdownlint": "^0.31.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e32b9eeaa6ec..e064ffd8bfc4 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -82,8 +82,8 @@ importers: specifier: ^7.24.0 version: 7.33.2(eslint@8.49.0) eslint-plugin-unicorn: - specifier: ^42.0.0 - version: 42.0.0(eslint@8.49.0) + specifier: ^48.0.1 + version: 48.0.1(eslint@8.49.0) husky: specifier: ^8.0.3 version: 8.0.3 @@ -718,11 +718,6 @@ packages: engines: {node: '>=6.9.0'} dev: true - /@babel/helper-validator-identifier@7.16.7: - resolution: {integrity: sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==} - engines: {node: '>=6.9.0'} - dev: true - /@babel/helper-validator-identifier@7.22.5: resolution: {integrity: sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==} engines: {node: '>=6.9.0'} @@ -6013,8 +6008,8 @@ packages: engines: {node: '>=8.0.0'} dev: false - /builtin-modules@3.2.0: - resolution: {integrity: sha512-lGzLKcioL90C7wMczpkY0n/oART3MbBa8R9OFGE1rJxoVI86u4WAGfEk8Wjv10eKSyTHVGkSo3bvBylCEtk7LA==} + /builtin-modules@3.3.0: + resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} engines: {node: '>=6'} dev: true @@ -7762,25 +7757,26 @@ packages: string.prototype.matchall: 4.0.8 dev: true - /eslint-plugin-unicorn@42.0.0(eslint@8.49.0): - resolution: {integrity: sha512-ixBsbhgWuxVaNlPTT8AyfJMlhyC5flCJFjyK3oKE8TRrwBnaHvUbuIkCM1lqg8ryYrFStL/T557zfKzX4GKSlg==} - engines: {node: '>=12'} + /eslint-plugin-unicorn@48.0.1(eslint@8.49.0): + resolution: {integrity: sha512-FW+4r20myG/DqFcCSzoumaddKBicIPeFnTrifon2mWIzlfyvzwyqZjqVP7m4Cqr/ZYisS2aiLghkUWaPg6vtCw==} + engines: {node: '>=16'} peerDependencies: - eslint: '>=8.8.0' + eslint: '>=8.44.0' dependencies: - '@babel/helper-validator-identifier': 7.16.7 + '@babel/helper-validator-identifier': 7.22.5 + '@eslint-community/eslint-utils': 4.4.0(eslint@8.49.0) ci-info: 3.8.0 clean-regexp: 1.0.0 eslint: 8.49.0 - eslint-utils: 3.0.0(eslint@8.49.0) - esquery: 1.4.0 + esquery: 1.5.0 indent-string: 4.0.0 - is-builtin-module: 3.1.0 + is-builtin-module: 3.2.1 + jsesc: 3.0.2 lodash: 4.17.21 pluralize: 8.0.0 read-pkg-up: 7.0.1 - regexp-tree: 0.1.24 - safe-regex: 2.1.1 + regexp-tree: 0.1.27 + regjsparser: 0.10.0 semver: 7.5.4 strip-indent: 3.0.0 dev: true @@ -7808,16 +7804,6 @@ packages: eslint-visitor-keys: 1.3.0 dev: true - /eslint-utils@3.0.0(eslint@8.49.0): - resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==} - engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0} - peerDependencies: - eslint: '>=5' - dependencies: - eslint: 8.49.0 - eslint-visitor-keys: 2.1.0 - dev: true - /eslint-visitor-keys@1.3.0: resolution: {integrity: sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==} engines: {node: '>=4'} @@ -9529,11 +9515,11 @@ packages: engines: {node: '>=4'} dev: true - /is-builtin-module@3.1.0: - resolution: {integrity: sha512-OV7JjAgOTfAFJmHZLvpSTb4qi0nIILDV1gWPYDnDJUTNFM5aGlRAhk4QcT8i7TuAleeEV5Fdkqn3t4mS+Q11fg==} + /is-builtin-module@3.2.1: + resolution: {integrity: sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==} engines: {node: '>=6'} dependencies: - builtin-modules: 3.2.0 + builtin-modules: 3.3.0 dev: true /is-callable@1.2.7: @@ -10049,12 +10035,23 @@ packages: - utf-8-validate dev: true + /jsesc@0.5.0: + resolution: {integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==} + hasBin: true + dev: true + /jsesc@2.5.2: resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} engines: {node: '>=4'} hasBin: true dev: true + /jsesc@3.0.2: + resolution: {integrity: sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==} + engines: {node: '>=6'} + hasBin: true + dev: true + /json-bigint@1.0.0: resolution: {integrity: sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==} dependencies: @@ -12609,8 +12606,8 @@ packages: /regenerator-runtime@0.13.11: resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==} - /regexp-tree@0.1.24: - resolution: {integrity: sha512-s2aEVuLhvnVJW6s/iPgEGK6R+/xngd2jNQ+xy4bXNDKxZKJH6jpPHY6kVeVv1IeLCHgswRj+Kl3ELaDjG6V1iw==} + /regexp-tree@0.1.27: + resolution: {integrity: sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==} hasBin: true dev: true @@ -12632,6 +12629,13 @@ packages: engines: {node: '>=0.1.14'} dev: true + /regjsparser@0.10.0: + resolution: {integrity: sha512-qx+xQGZVsy55CH0a1hiVwHmqjLryfh7wQyF5HO07XJ9f7dQMY/gPQHhlyDkIzJKC+x2fUCpCcUODUUUFrm7SHA==} + hasBin: true + dependencies: + jsesc: 0.5.0 + dev: true + /release-zalgo@1.0.0: resolution: {integrity: sha512-gUAyHVHPPC5wdqX/LG4LWtRYtgjxyX78oanFNTMMyFEfOqdC54s3eE82imuWKbOeqYht2CrNf64Qb8vgmmtZGA==} engines: {node: '>=4'} @@ -12952,12 +12956,6 @@ packages: get-intrinsic: 1.2.1 is-regex: 1.1.4 - /safe-regex@2.1.1: - resolution: {integrity: sha512-rx+x8AMzKb5Q5lQ95Zoi6ZbJqwCLkqi3XuJXp5P3rT8OEc6sZCJG5AE5dU3lsgRr/F4Bs31jSlVN+j5KrsGu9A==} - dependencies: - regexp-tree: 0.1.24 - dev: true - /safe-stable-stringify@2.4.3: resolution: {integrity: sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==} engines: {node: '>=10'} From ed73f1f7f537fab2d1312f3a5a9ec9ff7195b1c4 Mon Sep 17 00:00:00 2001 From: Felipe Andrade Date: Thu, 14 Sep 2023 12:36:24 -0700 Subject: [PATCH 02/87] feat(proxyd): high availability --- proxyd/backend.go | 4 +- proxyd/cache.go | 4 +- proxyd/config.go | 4 + proxyd/consensus_poller.go | 34 ++-- proxyd/consensus_tracker.go | 236 ++++++++++++++++++++++++--- proxyd/frontend_rate_limiter.go | 2 +- proxyd/frontend_rate_limiter_test.go | 2 +- proxyd/go.mod | 7 +- proxyd/go.sum | 103 +++++++++++- proxyd/methods.go | 4 +- proxyd/metrics.go | 41 ++++- proxyd/proxyd.go | 23 ++- proxyd/redis.go | 2 +- proxyd/server.go | 10 +- 14 files changed, 416 insertions(+), 60 deletions(-) diff --git a/proxyd/backend.go b/proxyd/backend.go index 24b2897236f1..71ab2759a66e 100644 --- a/proxyd/backend.go +++ b/proxyd/backend.go @@ -630,7 +630,7 @@ func (b *Backend) ErrorRate() (errorRate float64) { return errorRate } -// IsDegraded checks if the backend is serving traffic in a degraded state (i.e. used as a last resource) +// IsDegraded checks if the backend is serving traffic in a degraded local (i.e. used as a last resource) func (b *Backend) IsDegraded() bool { avgLatency := time.Duration(b.latencySlidingWindow.Avg()) return avgLatency >= b.maxDegradedLatencyThreshold @@ -677,7 +677,7 @@ func (bg *BackendGroup) Forward(ctx context.Context, rpcReqs []*RPCReq, isBatch if bg.Consensus != nil { // When `consensus_aware` is set to `true`, the backend group acts as a load balancer - // serving traffic from any backend that agrees in the consensus group + // serving traffic update any backend that agrees in the consensus group backends = bg.loadBalancedConsensusGroup() // We also rewrite block tags to enforce compliance with consensus diff --git a/proxyd/cache.go b/proxyd/cache.go index 1cb8c386dcf8..e60c6bd8ced0 100644 --- a/proxyd/cache.go +++ b/proxyd/cache.go @@ -7,8 +7,8 @@ import ( "time" "github.com/ethereum/go-ethereum/rpc" + "github.com/redis/go-redis/v9" - "github.com/go-redis/redis/v8" "github.com/golang/snappy" lru "github.com/hashicorp/golang-lru" ) @@ -78,7 +78,7 @@ func (c *redisCache) Get(ctx context.Context, key string) (string, error) { func (c *redisCache) Put(ctx context.Context, key string, value string) error { start := time.Now() - err := c.rdb.SetEX(ctx, c.namespaced(key), value, redisTTL).Err() + err := c.rdb.SetEx(ctx, c.namespaced(key), value, redisTTL).Err() redisCacheDurationSumm.WithLabelValues("SETEX").Observe(float64(time.Since(start).Milliseconds())) if err != nil { diff --git a/proxyd/config.go b/proxyd/config.go index 36de1a794fc7..14e3ece28e01 100644 --- a/proxyd/config.go +++ b/proxyd/config.go @@ -110,6 +110,10 @@ type BackendGroupConfig struct { ConsensusMaxBlockLag uint64 `toml:"consensus_max_block_lag"` ConsensusMaxBlockRange uint64 `toml:"consensus_max_block_range"` ConsensusMinPeerCount int `toml:"consensus_min_peer_count"` + + ConsensusHA bool `toml:"consensus_ha"` + ConsensusHAHeartbeatInterval TOMLDuration `toml:"consensus_ha_heartbeat_interval"` + ConsensusHALockPeriod TOMLDuration `toml:"consensus_ha_lock_period"` } type BackendGroupsConfig map[string]*BackendGroupConfig diff --git a/proxyd/consensus_poller.go b/proxyd/consensus_poller.go index 76a0da380de8..93b8c76f4a7c 100644 --- a/proxyd/consensus_poller.go +++ b/proxyd/consensus_poller.go @@ -19,10 +19,11 @@ const ( type OnConsensusBroken func() -// ConsensusPoller checks the consensus state for each member of a BackendGroup +// ConsensusPoller checks the consensus local for each member of a BackendGroup // resolves the highest common block for multiple nodes, and reconciles the consensus // in case of block hash divergence to minimize re-orgs type ConsensusPoller struct { + ctx context.Context cancelFunc context.CancelFunc listeners []OnConsensusBroken @@ -220,6 +221,7 @@ func NewConsensusPoller(bg *BackendGroup, opts ...ConsensusOpt) *ConsensusPoller state := make(map[*Backend]*backendState, len(bg.Backends)) cp := &ConsensusPoller{ + ctx: ctx, cancelFunc: cancelFunc, backendGroup: bg, backendState: state, @@ -248,7 +250,7 @@ func NewConsensusPoller(bg *BackendGroup, opts ...ConsensusOpt) *ConsensusPoller return cp } -// UpdateBackend refreshes the consensus state of a single backend +// UpdateBackend refreshes the consensus local of a single backend func (cp *ConsensusPoller) UpdateBackend(ctx context.Context, be *Backend) { bs := cp.getBackendState(be) RecordConsensusBackendBanned(be, bs.IsBanned()) @@ -258,7 +260,7 @@ func (cp *ConsensusPoller) UpdateBackend(ctx context.Context, be *Backend) { return } - // if backend is not healthy state we'll only resume checking it after ban + // if backend is not healthy local we'll only resume checking it after ban if !be.IsHealthy() { log.Warn("backend banned - not healthy", "backend", be.Name) cp.Ban(be) @@ -268,7 +270,7 @@ func (cp *ConsensusPoller) UpdateBackend(ctx context.Context, be *Backend) { inSync, err := cp.isInSync(ctx, be) RecordConsensusBackendInSync(be, err == nil && inSync) if err != nil { - log.Warn("error updating backend sync state", "name", be.Name, "err", err) + log.Warn("error updating backend sync local", "name", be.Name, "err", err) } var peerCount uint64 @@ -306,7 +308,7 @@ func (cp *ConsensusPoller) UpdateBackend(ctx context.Context, be *Backend) { RecordBackendFinalizedBlock(be, finalizedBlockNumber) if changed { - log.Debug("backend state updated", + log.Debug("backend local updated", "name", be.Name, "peerCount", peerCount, "inSync", inSync, @@ -352,9 +354,9 @@ func (cp *ConsensusPoller) checkExpectedBlockTags( currentSafe <= currentLatest } -// UpdateBackendGroupConsensus resolves the current group consensus based on the state of the backends +// UpdateBackendGroupConsensus resolves the current group consensus based on the local of the backends func (cp *ConsensusPoller) UpdateBackendGroupConsensus(ctx context.Context) { - // get the latest block number from the tracker + // get the latest block number update the tracker currentConsensusBlockNumber := cp.GetLatestBlockNumber() // get the candidates for the consensus group @@ -472,7 +474,7 @@ func (cp *ConsensusPoller) UpdateBackendGroupConsensus(ctx context.Context) { RecordGroupConsensusFilteredCount(cp.backendGroup, len(filteredBackendsNames)) RecordGroupTotalCount(cp.backendGroup, len(cp.backendGroup.Backends)) - log.Debug("group state", + log.Debug("group local", "proposedBlock", proposedBlock, "consensusBackends", strings.Join(consensusBackendsNames, ", "), "filteredBackends", strings.Join(filteredBackendsNames, ", ")) @@ -493,13 +495,13 @@ func (cp *ConsensusPoller) Ban(be *Backend) { bs.backendStateMux.Lock() bs.bannedUntil = time.Now().Add(cp.banPeriod) - // when we ban a node, we give it the chance to start from any block when it is back + // when we ban a node, we give it the chance to start update any block when it is back bs.latestBlockNumber = 0 bs.safeBlockNumber = 0 bs.finalizedBlockNumber = 0 } -// Unban removes any bans from the backends +// Unban removes any bans update the backends func (cp *ConsensusPoller) Unban(be *Backend) { bs := cp.backendState[be] defer bs.backendStateMux.Unlock() @@ -514,7 +516,7 @@ func (cp *ConsensusPoller) Reset() { } } -// fetchBlock is a convenient wrapper to make a request to get a block directly from the backend +// fetchBlock is a convenient wrapper to make a request to get a block directly update the backend func (cp *ConsensusPoller) fetchBlock(ctx context.Context, be *Backend, block string) (blockNumber hexutil.Uint64, blockHash string, err error) { var rpcRes RPCRes err = be.ForwardRPC(ctx, &rpcRes, "67", "eth_getBlockByNumber", block, false) @@ -532,7 +534,7 @@ func (cp *ConsensusPoller) fetchBlock(ctx context.Context, be *Backend, block st return } -// getPeerCount is a convenient wrapper to retrieve the current peer count from the backend +// getPeerCount is a convenient wrapper to retrieve the current peer count update the backend func (cp *ConsensusPoller) getPeerCount(ctx context.Context, be *Backend) (count uint64, err error) { var rpcRes RPCRes err = be.ForwardRPC(ctx, &rpcRes, "67", "net_peerCount") @@ -550,7 +552,7 @@ func (cp *ConsensusPoller) getPeerCount(ctx context.Context, be *Backend) (count return count, nil } -// isInSync is a convenient wrapper to check if the backend is in sync from the network +// isInSync is a convenient wrapper to check if the backend is in sync update the network func (cp *ConsensusPoller) isInSync(ctx context.Context, be *Backend) (result bool, err error) { var rpcRes RPCRes err = be.ForwardRPC(ctx, &rpcRes, "67", "eth_syncing") @@ -577,7 +579,7 @@ func (cp *ConsensusPoller) isInSync(ctx context.Context, be *Backend) (result bo return res, nil } -// getBackendState creates a copy of backend state so that the caller can use it without locking +// getBackendState creates a copy of backend local so that the caller can use it without locking func (cp *ConsensusPoller) getBackendState(be *Backend) *backendState { bs := cp.backendState[be] defer bs.backendStateMux.Unlock() @@ -614,7 +616,7 @@ func (cp *ConsensusPoller) setBackendState(be *Backend, peerCount uint64, inSync } // getConsensusCandidates find out what backends are the candidates to be in the consensus group -// and create a copy of current their state +// and create a copy of current their local // // a candidate is a serving node within the following conditions: // - not banned @@ -668,7 +670,7 @@ func (cp *ConsensusPoller) getConsensusCandidates() map[*Backend]*backendState { } } - // remove lagging backends from the candidates + // remove lagging backends update the candidates for _, be := range lagging { delete(candidates, be) } diff --git a/proxyd/consensus_tracker.go b/proxyd/consensus_tracker.go index b0bcb45f7b17..d86ac9c43b19 100644 --- a/proxyd/consensus_tracker.go +++ b/proxyd/consensus_tracker.go @@ -2,12 +2,17 @@ package proxyd import ( "context" + "encoding/json" "fmt" + "os" "sync" + "time" "github.com/ethereum/go-ethereum/common/hexutil" - - "github.com/go-redis/redis/v8" + "github.com/ethereum/go-ethereum/log" + "github.com/go-redsync/redsync/v4" + "github.com/go-redsync/redsync/v4/redis/goredis/v9" + "github.com/redis/go-redis/v9" ) // ConsensusTracker abstracts how we store and retrieve the current consensus @@ -21,17 +26,29 @@ type ConsensusTracker interface { SetFinalizedBlockNumber(blockNumber hexutil.Uint64) } +// DTO to hold the current consensus state +type ConsensusTrackerState struct { + Latest hexutil.Uint64 `json:"latest"` + Safe hexutil.Uint64 `json:"safe"` + Finalized hexutil.Uint64 `json:"finalized"` +} + +func (s *ConsensusTrackerState) update(o *ConsensusTrackerState) { + s.Latest = o.Latest + s.Safe = o.Safe + s.Finalized = o.Finalized +} + // InMemoryConsensusTracker store and retrieve in memory, async-safe type InMemoryConsensusTracker struct { - latestBlockNumber hexutil.Uint64 - safeBlockNumber hexutil.Uint64 - finalizedBlockNumber hexutil.Uint64 - mutex sync.Mutex + mutex sync.Mutex + state *ConsensusTrackerState } func NewInMemoryConsensusTracker() ConsensusTracker { return &InMemoryConsensusTracker{ mutex: sync.Mutex{}, + state: &ConsensusTrackerState{}, } } @@ -39,83 +56,252 @@ func (ct *InMemoryConsensusTracker) GetLatestBlockNumber() hexutil.Uint64 { defer ct.mutex.Unlock() ct.mutex.Lock() - return ct.latestBlockNumber + return ct.state.Latest } func (ct *InMemoryConsensusTracker) SetLatestBlockNumber(blockNumber hexutil.Uint64) { defer ct.mutex.Unlock() ct.mutex.Lock() - ct.latestBlockNumber = blockNumber + ct.state.Latest = blockNumber } func (ct *InMemoryConsensusTracker) GetSafeBlockNumber() hexutil.Uint64 { defer ct.mutex.Unlock() ct.mutex.Lock() - return ct.safeBlockNumber + return ct.state.Safe } func (ct *InMemoryConsensusTracker) SetSafeBlockNumber(blockNumber hexutil.Uint64) { defer ct.mutex.Unlock() ct.mutex.Lock() - ct.safeBlockNumber = blockNumber + ct.state.Safe = blockNumber } func (ct *InMemoryConsensusTracker) GetFinalizedBlockNumber() hexutil.Uint64 { defer ct.mutex.Unlock() ct.mutex.Lock() - return ct.finalizedBlockNumber + return ct.state.Finalized } func (ct *InMemoryConsensusTracker) SetFinalizedBlockNumber(blockNumber hexutil.Uint64) { defer ct.mutex.Unlock() ct.mutex.Lock() - ct.finalizedBlockNumber = blockNumber + ct.state.Finalized = blockNumber } -// RedisConsensusTracker uses a Redis `client` to store and retrieve consensus, async-safe +// RedisConsensusTracker store and retrieve in a shared Redis cluster, with leader election type RedisConsensusTracker struct { ctx context.Context client *redis.Client - backendGroup string + namespace string + backendGroup *BackendGroup + + redlock *redsync.Mutex + lockPeriod time.Duration + heartbeatInterval time.Duration + + leader bool + leaderName string + + // holds the state collected by local pollers + local *InMemoryConsensusTracker + + // holds a copy of the remote shared state + // when leader, updates the remote with the local state + remote *InMemoryConsensusTracker } -func NewRedisConsensusTracker(ctx context.Context, r *redis.Client, namespace string) ConsensusTracker { - return &RedisConsensusTracker{ +type RedisConsensusTrackerOpt func(cp *RedisConsensusTracker) + +func WithLockPeriod(lockPeriod time.Duration) RedisConsensusTrackerOpt { + return func(ct *RedisConsensusTracker) { + ct.lockPeriod = lockPeriod + } +} + +func WithHeartbeatInterval(heartbeatInterval time.Duration) RedisConsensusTrackerOpt { + return func(ct *RedisConsensusTracker) { + ct.heartbeatInterval = heartbeatInterval + } +} +func NewRedisConsensusTracker(ctx context.Context, + redisClient *redis.Client, + bg *BackendGroup, + namespace string, + opts ...RedisConsensusTrackerOpt) ConsensusTracker { + + tracker := &RedisConsensusTracker{ ctx: ctx, - client: r, - backendGroup: namespace, + client: redisClient, + backendGroup: bg, + namespace: namespace, + + lockPeriod: 30 * time.Second, + heartbeatInterval: 2 * time.Second, + local: NewInMemoryConsensusTracker().(*InMemoryConsensusTracker), + remote: NewInMemoryConsensusTracker().(*InMemoryConsensusTracker), + } + + for _, opt := range opts { + opt(tracker) + } + + return tracker +} + +func (ct *RedisConsensusTracker) Init() { + go func() { + for { + // follow same context as backend group poller + ctx := ct.backendGroup.Consensus.ctx + timer := time.NewTimer(ct.heartbeatInterval) + ct.stateHeartbeat() + + select { + case <-timer.C: + case <-ctx.Done(): + timer.Stop() + return + } + } + }() +} + +func (ct *RedisConsensusTracker) stateHeartbeat() { + pool := goredis.NewPool(ct.client) + rs := redsync.New(pool) + key := ct.key("mutex") + + val, err := ct.client.Get(ct.ctx, key).Result() + if err != nil && err != redis.Nil { + log.Error("failed to read the mutex", "err", err) + ct.leader = false + return + } + if val != "" { + if ct.leader { + log.Debug("extending lock") + ok, err := ct.redlock.Extend() + if err != nil || !ok { + log.Error("failed to extend lock", "err", err, "mutex", ct.redlock.Name(), "val", ct.redlock.Value()) + ct.leader = false + return + } + ct.postPayload(val) + } else { + // retrieve current leader + leaderName, err := ct.client.Get(ct.ctx, ct.key(fmt.Sprintf("leader:%s", val))).Result() + if err != nil && err != redis.Nil { + log.Error("failed to read the remote leader", "err", err) + return + } + ct.leaderName = leaderName + log.Debug("following", "val", val, "leader", leaderName) + // retrieve payload + val, err := ct.client.Get(ct.ctx, ct.key(fmt.Sprintf("state:%s", val))).Result() + if err != nil && err != redis.Nil { + log.Error("failed to read the remote state", "err", err) + return + } + if val == "" { + log.Error("remote state is missing (recent leader election maybe?)") + return + } + state := &ConsensusTrackerState{} + err = json.Unmarshal([]byte(val), state) + if err != nil { + log.Error("failed to unmarshal the remote state", "err", err) + return + } + ct.remote.mutex.Lock() + defer ct.remote.mutex.Unlock() + ct.remote.state.update(state) + log.Debug("updated state from remote", "state", val, "leader", leaderName) + } + } else { + if ct.local.GetLatestBlockNumber() == 0 || + ct.local.GetSafeBlockNumber() == 0 || + ct.local.GetFinalizedBlockNumber() == 0 { + log.Warn("lock not found, but local state is missing, skipping") + return + } + log.Info("lock not found, creating a new one") + + mutex := rs.NewMutex(key, + redsync.WithExpiry(ct.lockPeriod), + redsync.WithFailFast(true), + redsync.WithTries(1)) + + if err := mutex.Lock(); err != nil { + log.Debug("failed to obtain lock", "err", err) + ct.leader = false + return + } + + log.Info("lock acquired", "mutex", mutex.Name(), "val", mutex.Value()) + ct.redlock = mutex + ct.leader = true + ct.postPayload(mutex.Value()) } } func (ct *RedisConsensusTracker) key(tag string) string { - return fmt.Sprintf("consensus:%s:%s", ct.backendGroup, tag) + return fmt.Sprintf("consensus:%s:%s", ct.namespace, tag) } func (ct *RedisConsensusTracker) GetLatestBlockNumber() hexutil.Uint64 { - return hexutil.Uint64(hexutil.MustDecodeUint64(ct.client.Get(ct.ctx, ct.key("latest")).Val())) + return ct.remote.GetLatestBlockNumber() } func (ct *RedisConsensusTracker) SetLatestBlockNumber(blockNumber hexutil.Uint64) { - ct.client.Set(ct.ctx, ct.key("latest"), blockNumber, 0) + ct.local.SetLatestBlockNumber(blockNumber) } func (ct *RedisConsensusTracker) GetSafeBlockNumber() hexutil.Uint64 { - return hexutil.Uint64(hexutil.MustDecodeUint64(ct.client.Get(ct.ctx, ct.key("safe")).Val())) + return ct.remote.GetSafeBlockNumber() } func (ct *RedisConsensusTracker) SetSafeBlockNumber(blockNumber hexutil.Uint64) { - ct.client.Set(ct.ctx, ct.key("safe"), blockNumber, 0) + ct.local.SetSafeBlockNumber(blockNumber) } func (ct *RedisConsensusTracker) GetFinalizedBlockNumber() hexutil.Uint64 { - return hexutil.Uint64(hexutil.MustDecodeUint64(ct.client.Get(ct.ctx, ct.key("finalized")).Val())) + return ct.remote.GetFinalizedBlockNumber() } func (ct *RedisConsensusTracker) SetFinalizedBlockNumber(blockNumber hexutil.Uint64) { - ct.client.Set(ct.ctx, ct.key("finalized"), blockNumber, 0) + ct.local.SetFinalizedBlockNumber(blockNumber) +} + +func (ct *RedisConsensusTracker) postPayload(mutexVal string) { + ct.remote.mutex.Lock() + defer ct.remote.mutex.Unlock() + + jsonState, err := json.Marshal(ct.local.state) + if err != nil { + log.Error("failed to marshal local", "err", err) + ct.leader = false + return + } + ct.client.Set(ct.ctx, ct.key(fmt.Sprintf("state:%s", mutexVal)), jsonState, ct.lockPeriod) + + leader, _ := os.LookupEnv("HOSTNAME") + if leader == "" { + + } + ct.client.Set(ct.ctx, ct.key(fmt.Sprintf("leader:%s", mutexVal)), leader, ct.lockPeriod) + + log.Debug("posted state", "state", string(jsonState), "leader", leader) + + ct.leaderName = leader + ct.remote.state.update(ct.local.state) + + RecordGroupConsensusHALatestBlock(ct.backendGroup, leader, ct.local.state.Latest) + RecordGroupConsensusHASafeBlock(ct.backendGroup, leader, ct.local.state.Safe) + RecordGroupConsensusHAFinalizedBlock(ct.backendGroup, leader, ct.local.state.Finalized) } diff --git a/proxyd/frontend_rate_limiter.go b/proxyd/frontend_rate_limiter.go index d377370ed83f..d0590f0561da 100644 --- a/proxyd/frontend_rate_limiter.go +++ b/proxyd/frontend_rate_limiter.go @@ -6,7 +6,7 @@ import ( "sync" "time" - "github.com/go-redis/redis/v8" + "github.com/redis/go-redis/v9" ) type FrontendRateLimiter interface { diff --git a/proxyd/frontend_rate_limiter_test.go b/proxyd/frontend_rate_limiter_test.go index f3542cf35109..fb5f808bb5ec 100644 --- a/proxyd/frontend_rate_limiter_test.go +++ b/proxyd/frontend_rate_limiter_test.go @@ -7,7 +7,7 @@ import ( "time" "github.com/alicebob/miniredis" - "github.com/go-redis/redis/v8" + "github.com/redis/go-redis/v9" "github.com/stretchr/testify/require" ) diff --git a/proxyd/go.mod b/proxyd/go.mod index 7ad4481053cb..f7ee8d198965 100644 --- a/proxyd/go.mod +++ b/proxyd/go.mod @@ -7,7 +7,6 @@ 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-redis/redis/v8 v8.11.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 @@ -44,11 +43,14 @@ 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 github.com/golang/protobuf v1.5.2 // indirect - github.com/gomodule/redigo v1.8.8 // indirect + github.com/gomodule/redigo v1.8.9 // indirect + github.com/hashicorp/errwrap v1.1.0 // indirect + github.com/hashicorp/go-multierror v1.1.1 // indirect github.com/holiman/bloomfilter/v2 v2.0.3 // indirect github.com/holiman/uint256 v1.2.3 // indirect github.com/klauspost/compress v1.15.15 // indirect @@ -62,6 +64,7 @@ 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 diff --git a/proxyd/go.sum b/proxyd/go.sum index 0eeab331f533..fdfa8c99fc75 100644 --- a/proxyd/go.sum +++ b/proxyd/go.sum @@ -25,6 +25,8 @@ github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/bits-and-blooms/bitset v1.7.0 h1:YjAGVd3XmtK9ktAbX8Zg2g2PwLIMjGREZJHlV4j7NEo= github.com/bits-and-blooms/bitset v1.7.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA= +github.com/bsm/ginkgo/v2 v2.5.0/go.mod h1:AiKlXPm7ItEHNc/2+OkrNG4E0ITzojb9/xWzvQ9XZ9w= +github.com/bsm/gomega v1.20.0/go.mod h1:JifAceMQ4crZIWYUKrlGcmbN3bqHogVTADMD2ATsbwk= 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= @@ -114,11 +116,17 @@ github.com/gin-gonic/gin v1.4.0/go.mod h1:OW2EZn3DO8Ln9oIKOvM++LBO+5UPHJJDH72/q/ github.com/go-check/check v0.0.0-20180628173108-788fd7840127/go.mod h1:9ES+weclKsC9YodN5RgxqK/VD9HM9JsCSh7rNhMZE98= github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= 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/v8 v8.11.4 h1:kHoYkfZP6+pe04aFTnhDH6GDROa5yJdHJVNxV3F46Tg= +github.com/go-redis/redis v6.15.9+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA= +github.com/go-redis/redis/v7 v7.4.0/go.mod h1:JDNMw23GTyLNC4GZu9njt15ctBQVn7xjRfnwdHj/Dcg= 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= github.com/go-stack/stack v1.8.1 h1:ntEHSVwIt7PNXNpgPmVfMrNhLtgjlmnZha2kOpuRiDw= github.com/go-stack/stack v1.8.1/go.mod h1:dcoOX6HbPZSZptuspn9bctJ+N/CnF5gGygcUP3XYfe4= github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= @@ -136,6 +144,7 @@ github.com/gogo/status v1.1.0/go.mod h1:BFv9nrluPLmrS0EmGVvLaPNmRosr9KapBYd5/hpY github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= @@ -156,6 +165,8 @@ github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb/go.mod h1:/XxbfmMg 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= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= @@ -163,9 +174,12 @@ github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= +github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/subcommands v1.2.0/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= @@ -174,6 +188,11 @@ github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB7 github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I= +github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= +github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/golang-lru v0.5.5-0.20210104140557-80c98217689d h1:dg1dEPuWpEqDnvIw251EVy4zlP8gWbsGj4BsUKCRpYs= github.com/hashicorp/golang-lru v0.5.5-0.20210104140557-80c98217689d/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= @@ -184,6 +203,7 @@ github.com/holiman/uint256 v1.2.3 h1:K8UWO1HUJpRMXBxbmaY1Y8IAMZC/RsKB+ArEnnK4l5o github.com/holiman/uint256 v1.2.3/go.mod h1:SC8Ryt4n+UBbPbIBKaG9zbbDlp4jOru9xFZmPzLUTxw= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/hydrogen18/memlistener v0.0.0-20200120041712-dcc25e7acd91/go.mod h1:qEIFzExnS6016fRpRfxrExeVn2gbClQA99gQhnIcdhE= +github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/imkira/go-interpol v1.1.0/go.mod h1:z0h2/2T3XF8kyEPpRgJ3kmNv+C43p+I/CoI+jC3w2iA= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/iris-contrib/blackfriday v2.0.0+incompatible/go.mod h1:UzZ2bDEoaSGPbkg6SAB4att1aAwTmVIx/5gCVqeyUdI= @@ -257,21 +277,43 @@ github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OS github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= +github.com/oklog/ulid/v2 v2.1.0/go.mod h1:rcEKHmBBKfef9DhnvX7y1HZBYxjXb0cP5ExxNsTT1QQ= github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.10.3/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= github.com/onsi/ginkgo v1.16.4 h1:29JGrr5oVBm5ulCWet69zQkzWipVXIol6ygQUe/EzNc= github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= +github.com/onsi/ginkgo/v2 v2.1.3/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c= +github.com/onsi/ginkgo/v2 v2.1.4/go.mod h1:um6tUpWM/cxCK3/FK8BXqEiUMUwRgSM4JXG47RKZmLU= +github.com/onsi/ginkgo/v2 v2.1.6/go.mod h1:MEH45j8TBi6u9BMogfbp0stKC5cdGjumZj5Y7AG4VIk= +github.com/onsi/ginkgo/v2 v2.3.0/go.mod h1:Eew0uilEqZmIEZr8JrvYlvOM7Rr6xzTmMV8AyFNU9d0= +github.com/onsi/ginkgo/v2 v2.4.0/go.mod h1:iHkDK1fKGcBoEHT5W7YBq4RFWaQulw+caOMkAt4OrFo= +github.com/onsi/ginkgo/v2 v2.5.0/go.mod h1:Luc4sArBICYCS8THh8v3i3i5CuSZO+RaQRaJoeNwomw= +github.com/onsi/ginkgo/v2 v2.7.0/go.mod h1:yjiuMwPokqY1XauOgju45q3sJt6VzQ/Fict1LFVcsAo= +github.com/onsi/ginkgo/v2 v2.8.0/go.mod h1:6JsQiECmxCa3V5st74AL/AmsV482EDdVrGaVW6z3oYU= github.com/onsi/gomega v1.4.1/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/onsi/gomega v1.7.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= +github.com/onsi/gomega v1.20.1/go.mod h1:DtrZpjmvpn2mPm4YWQa0/ALMDj9v4YxLgojwPeREyVo= +github.com/onsi/gomega v1.21.1/go.mod h1:iYAIXgPSaDHak0LCMA+AWBpIKBr8WZicMxnE8luStNc= +github.com/onsi/gomega v1.22.1/go.mod h1:x6n7VNe4hw0vkyYUM4mjIXx3JbLiPaBPNgB7PRQ1tuM= +github.com/onsi/gomega v1.24.0/go.mod h1:Z/NWtiqwBrwUt4/2loMmHL63EDLnYHmVbuBpDr2vQAg= +github.com/onsi/gomega v1.24.1/go.mod h1:3AOiACssS3/MajrniINInwbfOOtfZvplPzuRSmvt1jM= +github.com/onsi/gomega v1.25.0/go.mod h1:r+zV744Re+DiYCIPRlYOTxn0YkOLcAnW8k1xXdMPGhM= +github.com/onsi/gomega v1.26.0 h1:03cDLK28U6hWvCAns6NeydX3zIm4SF3ci69ulidS32Q= +github.com/onsi/gomega v1.26.0/go.mod h1:r+zV744Re+DiYCIPRlYOTxn0YkOLcAnW8k1xXdMPGhM= +github.com/pborman/getopt v0.0.0-20170112200414-7148bc3a4c30/go.mod h1:85jBQOZwpVEaDAr341tbn15RS4fCAsIst0qp7i8ex1o= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4= github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= @@ -290,6 +332,9 @@ github.com/prometheus/common v0.39.0 h1:oOyhkDq05hPZKItWVBkJ6g6AtGxi+fy7F4JvUV8u github.com/prometheus/common v0.39.0/go.mod h1:6XBZ7lYdLCbkAVhwRsWTZn+IN5AB9F/NXd5w0BbEX0Y= github.com/prometheus/procfs v0.9.0 h1:wzCHvIvM5SxWqYvwgVL7yJY8Lz3PKn49KQtpgMYJfhI= github.com/prometheus/procfs v0.9.0/go.mod h1:+pB4zwohETzFnmlpe6yd2lSc+0/46IYZRB/chUwxUZY= +github.com/redis/go-redis/v9 v9.0.2/go.mod h1:/xDTe9EF1LM61hek62Poq2nzQSGj0xSrEtEHbBQevps= +github.com/redis/go-redis/v9 v9.1.0 h1:137FnGdk+EQdCbye1FW+qOEcY5S+SpY9T0NiuqvtfMY= +github.com/redis/go-redis/v9 v9.1.0/go.mod h1:urWj3He21Dj5k4TK1y59xH8Uj6ATueP8AH1cY3lZl4c= github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= @@ -298,6 +343,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/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= github.com/schollz/closestmatch v2.1.0+incompatible/go.mod h1:RtP1ddjLong6gTkbtmuhtR2uUrrJOpYzYRvbcPAid+g= @@ -325,6 +371,7 @@ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ 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/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= github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 h1:epCh84lMvA70Z7CTTCmYQn2CKbY8j86K7/FAIr141uY= @@ -354,10 +401,18 @@ github.com/yudai/pp v2.0.1+incompatible/go.mod h1:PuxR/8QJ7cyCkFp/aUDS+JY727OFEZ github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= github.com/yuin/gopher-lua v0.0.0-20210529063254-f4c35e4016d9 h1:k/gmLsJDWwWqbLCur2yWnJzwQEKRcAHXo6seXGuSwWw= github.com/yuin/gopher-lua v0.0.0-20210529063254-f4c35e4016d9/go.mod h1:E1AXubJBdNmFERAOucpDIxNzeGfLzg0mYh+UfMWdChA= github.com/yusufpapurcu/wmi v1.2.2 h1:KBNDSne4vP5mbSWnJbO+51IMOXJB67QiYCSBrubbPRg= github.com/yusufpapurcu/wmi v1.2.2/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= +go.opentelemetry.io/otel v1.12.0/go.mod h1:geaoz0L0r1BEOR81k7/n9W4TCXYCJ7bPO7K374jQHG0= +go.opentelemetry.io/otel/metric v0.35.0/go.mod h1:qAcbhaTRFU6uG8QM7dDo7XvFsWcugziq/5YI065TokQ= +go.opentelemetry.io/otel/sdk v1.12.0/go.mod h1:WYcvtgquYvgODEvxOry5owO2y9MyciW7JqMz6cpXShE= +go.opentelemetry.io/otel/sdk/metric v0.35.0/go.mod h1:eDyp1GxSiwV98kr7w4pzrszQh/eze9MqBqPd2bCPmyE= +go.opentelemetry.io/otel/trace v1.12.0/go.mod h1:pHlgBynn6s25qJ2szD+Bv+iwKJttjHSI3lUAyf0GNuQ= +go.uber.org/goleak v1.2.0/go.mod h1:XJYK+MuIchqpmGmUSAzotztawfKvYLUIgg7guXrwVUo= golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= @@ -369,6 +424,7 @@ golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= 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/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -377,11 +433,16 @@ golang.org/x/exp v0.0.0-20230515195305-f3d0a9c9a5cc/go.mod h1:V1LtkGg67GoY2N1AnL golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/mod v0.6.0/go.mod h1:4mET923SAdbXp2ki8ey+zGs1SLqsuM2Y0uvdZR/fUNI= +golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20180719180050-a680a1efc54d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -394,6 +455,7 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= @@ -403,6 +465,14 @@ golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= golang.org/x/net v0.0.0-20211008194852-3b03d305991f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= +golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= +golang.org/x/net v0.3.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE= +golang.org/x/net v0.5.0/go.mod h1:DivGGAXEgPSlEBzxGzZI+ZLohi+xUj054jfeKui00ws= golang.org/x/net v0.10.0 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -413,6 +483,8 @@ golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E= golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -427,7 +499,9 @@ golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191010194322-b09406accb47/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -444,18 +518,37 @@ golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220204135822-1c1b9b1eba6a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220319134239-a9b59b0215f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220422013727-9388b58f7150/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220919091848-fb04ddd9f9c8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.4.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.9.0 h1:KS/R3tvhPqvJvwcKfnBHJwwthS11LRhmM5D59eEXa0s= golang.org/x/sys v0.9.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= +golang.org/x/term v0.3.0/go.mod h1:q750SLmJuPmVoN1blW3UFBPREJfb1KmY3vwxfr+nFDA= +golang.org/x/term v0.4.0/go.mod h1:9P2UbLfCdcvo3p/nzKvsmas4TnlujnuoV9hGgYzW1lQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.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/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -472,7 +565,14 @@ golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapK golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.10/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/tools v0.2.0/go.mod h1:y4OqIKeOV/fWJetJ8bXPU1sEVniLMIyDAZWeHdV+NTA= +golang.org/x/tools v0.4.0/go.mod h1:UE5sM2OK9E/d67R0ANs2xJizIymRP5gJU295PvKXxjQ= +golang.org/x/tools v0.5.0/go.mod h1:N+Kgy78s5I24c24dU8OfWNEotWjutIs8SnJvn5IDq+k= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -501,6 +601,7 @@ google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpAD google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w= google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= diff --git a/proxyd/methods.go b/proxyd/methods.go index ffaf89dd60bc..a73d24ae72f4 100644 --- a/proxyd/methods.go +++ b/proxyd/methods.go @@ -44,7 +44,7 @@ func (e *StaticMethodHandler) GetRPCMethod(ctx context.Context, req *RPCReq) (*R key := e.key(req) val, err := e.cache.Get(ctx, key) if err != nil { - log.Error("error reading from cache", "key", key, "method", req.Method, "err", err) + log.Error("error reading update cache", "key", key, "method", req.Method, "err", err) return nil, err } if val == "" { @@ -53,7 +53,7 @@ func (e *StaticMethodHandler) GetRPCMethod(ctx context.Context, req *RPCReq) (*R var result interface{} if err := json.Unmarshal([]byte(val), &result); err != nil { - log.Error("error unmarshalling value from cache", "key", key, "method", req.Method, "err", err) + log.Error("error unmarshalling value update cache", "key", key, "method", req.Method, "err", err) return nil, err } return &RPCRes{ diff --git a/proxyd/metrics.go b/proxyd/metrics.go index 0edd8208fdb2..d1838a187088 100644 --- a/proxyd/metrics.go +++ b/proxyd/metrics.go @@ -262,6 +262,33 @@ var ( "backend_group_name", }) + consensusHALatestBlock = promauto.NewGaugeVec(prometheus.GaugeOpts{ + Namespace: MetricsNamespace, + Name: "group_consensus_ha_latest_block", + Help: "Consensus HA latest block", + }, []string{ + "backend_group_name", + "leader", + }) + + consensusHASafeBlock = promauto.NewGaugeVec(prometheus.GaugeOpts{ + Namespace: MetricsNamespace, + Name: "group_consensus_ha_safe_block", + Help: "Consensus HA safe block", + }, []string{ + "backend_group_name", + "leader", + }) + + consensusHAFinalizedBlock = promauto.NewGaugeVec(prometheus.GaugeOpts{ + Namespace: MetricsNamespace, + Name: "group_consensus_ha_finalized_block", + Help: "Consensus HA finalized block", + }, []string{ + "backend_group_name", + "leader", + }) + backendLatestBlockBackend = promauto.NewGaugeVec(prometheus.GaugeOpts{ Namespace: MetricsNamespace, Name: "backend_latest_block", @@ -305,7 +332,7 @@ var ( consensusGroupFilteredCount = promauto.NewGaugeVec(prometheus.GaugeOpts{ Namespace: MetricsNamespace, Name: "group_consensus_filtered_count", - Help: "Consensus group filtered out from serving traffic count", + Help: "Consensus group filtered out update serving traffic count", }, []string{ "backend_group_name", }) @@ -438,6 +465,18 @@ func RecordBatchSize(size int) { batchSizeHistogram.Observe(float64(size)) } +func RecordGroupConsensusHALatestBlock(group *BackendGroup, leader string, blockNumber hexutil.Uint64) { + consensusHALatestBlock.WithLabelValues(group.Name, leader).Set(float64(blockNumber)) +} + +func RecordGroupConsensusHASafeBlock(group *BackendGroup, leader string, blockNumber hexutil.Uint64) { + consensusHASafeBlock.WithLabelValues(group.Name, leader).Set(float64(blockNumber)) +} + +func RecordGroupConsensusHAFinalizedBlock(group *BackendGroup, leader string, blockNumber hexutil.Uint64) { + consensusHAFinalizedBlock.WithLabelValues(group.Name, leader).Set(float64(blockNumber)) +} + func RecordGroupConsensusLatestBlock(group *BackendGroup, blockNumber hexutil.Uint64) { consensusLatestBlock.WithLabelValues(group.Name).Set(float64(blockNumber)) } diff --git a/proxyd/proxyd.go b/proxyd/proxyd.go index 15bea435aa49..853a38a54cff 100644 --- a/proxyd/proxyd.go +++ b/proxyd/proxyd.go @@ -1,6 +1,7 @@ package proxyd import ( + "context" "crypto/tls" "errors" "fmt" @@ -10,8 +11,8 @@ import ( "github.com/ethereum/go-ethereum/common/math" "github.com/ethereum/go-ethereum/log" - "github.com/go-redis/redis/v8" "github.com/prometheus/client_golang/prometheus/promhttp" + "github.com/redis/go-redis/v9" "golang.org/x/sync/semaphore" ) @@ -313,8 +314,28 @@ func Start(config *Config) (*Server, func(), error) { copts = append(copts, WithMaxBlockRange(bgcfg.ConsensusMaxBlockRange)) } + var tracker ConsensusTracker + if bgcfg.ConsensusHA { + if redisClient == nil { + log.Crit("cant start - consensus high availability requires redis") + } + topts := make([]RedisConsensusTrackerOpt, 0) + if bgcfg.ConsensusHALockPeriod > 0 { + topts = append(topts, WithLockPeriod(time.Duration(bgcfg.ConsensusHALockPeriod))) + } + if bgcfg.ConsensusHAHeartbeatInterval > 0 { + topts = append(topts, WithLockPeriod(time.Duration(bgcfg.ConsensusHAHeartbeatInterval))) + } + tracker = NewRedisConsensusTracker(context.Background(), redisClient, bg, bg.Name, topts...) + copts = append(copts, WithTracker(tracker)) + } + cp := NewConsensusPoller(bg, copts...) bg.Consensus = cp + + if bgcfg.ConsensusHA { + tracker.(*RedisConsensusTracker).Init() + } } } diff --git a/proxyd/redis.go b/proxyd/redis.go index e32bff243243..bd15f527f9b7 100644 --- a/proxyd/redis.go +++ b/proxyd/redis.go @@ -4,7 +4,7 @@ import ( "context" "time" - "github.com/go-redis/redis/v8" + "github.com/redis/go-redis/v9" ) func NewRedisClient(url string) (*redis.Client, error) { diff --git a/proxyd/server.go b/proxyd/server.go index 280dc30588f8..d14f06fb91fb 100644 --- a/proxyd/server.go +++ b/proxyd/server.go @@ -22,10 +22,10 @@ import ( "github.com/ethereum/go-ethereum/core/txpool" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/log" - "github.com/go-redis/redis/v8" "github.com/gorilla/mux" "github.com/gorilla/websocket" "github.com/prometheus/client_golang/prometheus" + "github.com/redis/go-redis/v9" "github.com/rs/cors" "github.com/syndtr/goleveldb/leveldb/opt" ) @@ -653,11 +653,11 @@ func (s *Server) rateLimitSender(ctx context.Context, req *RPCReq) error { var data hexutil.Bytes if err := data.UnmarshalText([]byte(params[0])); err != nil { log.Debug("error decoding raw tx data", "err", err, "req_id", GetReqID(ctx)) - // Geth returns the raw error from UnmarshalText. + // Geth returns the raw error update UnmarshalText. return ErrInvalidParams(err.Error()) } - // Inflates a types.Transaction object from the transaction's raw bytes. + // Inflates a types.Transaction object update the transaction's raw bytes. tx := new(types.Transaction) if err := tx.UnmarshalBinary(data); err != nil { log.Debug("could not unmarshal transaction", "err", err, "req_id", GetReqID(ctx)) @@ -675,12 +675,12 @@ func (s *Server) rateLimitSender(ctx context.Context, req *RPCReq) error { // sender. This method performs an ecrecover, which can be expensive. msg, err := core.TransactionToMessage(tx, types.LatestSignerForChainID(tx.ChainId()), nil) if err != nil { - log.Debug("could not get message from transaction", "err", err, "req_id", GetReqID(ctx)) + log.Debug("could not get message update transaction", "err", err, "req_id", GetReqID(ctx)) return ErrInvalidParams(err.Error()) } ok, err := s.senderLim.Take(ctx, fmt.Sprintf("%s:%d", msg.From.Hex(), tx.Nonce())) if err != nil { - log.Error("error taking from sender limiter", "err", err, "req_id", GetReqID(ctx)) + log.Error("error taking update sender limiter", "err", err, "req_id", GetReqID(ctx)) return ErrInternal } if !ok { From c7c21a29c5e4e8b7cfb3f089a01234d4dca4f2ad Mon Sep 17 00:00:00 2001 From: Felipe Andrade Date: Thu, 14 Sep 2023 12:42:33 -0700 Subject: [PATCH 03/87] revert weird comment replaces --- proxyd/backend.go | 4 ++-- proxyd/consensus_poller.go | 32 ++++++++++++++++---------------- proxyd/methods.go | 4 ++-- proxyd/metrics.go | 2 +- proxyd/server.go | 8 ++++---- 5 files changed, 25 insertions(+), 25 deletions(-) diff --git a/proxyd/backend.go b/proxyd/backend.go index 71ab2759a66e..24b2897236f1 100644 --- a/proxyd/backend.go +++ b/proxyd/backend.go @@ -630,7 +630,7 @@ func (b *Backend) ErrorRate() (errorRate float64) { return errorRate } -// IsDegraded checks if the backend is serving traffic in a degraded local (i.e. used as a last resource) +// IsDegraded checks if the backend is serving traffic in a degraded state (i.e. used as a last resource) func (b *Backend) IsDegraded() bool { avgLatency := time.Duration(b.latencySlidingWindow.Avg()) return avgLatency >= b.maxDegradedLatencyThreshold @@ -677,7 +677,7 @@ func (bg *BackendGroup) Forward(ctx context.Context, rpcReqs []*RPCReq, isBatch if bg.Consensus != nil { // When `consensus_aware` is set to `true`, the backend group acts as a load balancer - // serving traffic update any backend that agrees in the consensus group + // serving traffic from any backend that agrees in the consensus group backends = bg.loadBalancedConsensusGroup() // We also rewrite block tags to enforce compliance with consensus diff --git a/proxyd/consensus_poller.go b/proxyd/consensus_poller.go index 93b8c76f4a7c..762cfec2ae1c 100644 --- a/proxyd/consensus_poller.go +++ b/proxyd/consensus_poller.go @@ -19,7 +19,7 @@ const ( type OnConsensusBroken func() -// ConsensusPoller checks the consensus local for each member of a BackendGroup +// ConsensusPoller checks the consensus state for each member of a BackendGroup // resolves the highest common block for multiple nodes, and reconciles the consensus // in case of block hash divergence to minimize re-orgs type ConsensusPoller struct { @@ -250,7 +250,7 @@ func NewConsensusPoller(bg *BackendGroup, opts ...ConsensusOpt) *ConsensusPoller return cp } -// UpdateBackend refreshes the consensus local of a single backend +// UpdateBackend refreshes the consensus state of a single backend func (cp *ConsensusPoller) UpdateBackend(ctx context.Context, be *Backend) { bs := cp.getBackendState(be) RecordConsensusBackendBanned(be, bs.IsBanned()) @@ -260,7 +260,7 @@ func (cp *ConsensusPoller) UpdateBackend(ctx context.Context, be *Backend) { return } - // if backend is not healthy local we'll only resume checking it after ban + // if backend is not healthy state we'll only resume checking it after ban if !be.IsHealthy() { log.Warn("backend banned - not healthy", "backend", be.Name) cp.Ban(be) @@ -270,7 +270,7 @@ func (cp *ConsensusPoller) UpdateBackend(ctx context.Context, be *Backend) { inSync, err := cp.isInSync(ctx, be) RecordConsensusBackendInSync(be, err == nil && inSync) if err != nil { - log.Warn("error updating backend sync local", "name", be.Name, "err", err) + log.Warn("error updating backend sync state", "name", be.Name, "err", err) } var peerCount uint64 @@ -308,7 +308,7 @@ func (cp *ConsensusPoller) UpdateBackend(ctx context.Context, be *Backend) { RecordBackendFinalizedBlock(be, finalizedBlockNumber) if changed { - log.Debug("backend local updated", + log.Debug("backend state updated", "name", be.Name, "peerCount", peerCount, "inSync", inSync, @@ -354,9 +354,9 @@ func (cp *ConsensusPoller) checkExpectedBlockTags( currentSafe <= currentLatest } -// UpdateBackendGroupConsensus resolves the current group consensus based on the local of the backends +// UpdateBackendGroupConsensus resolves the current group consensus based on the state of the backends func (cp *ConsensusPoller) UpdateBackendGroupConsensus(ctx context.Context) { - // get the latest block number update the tracker + // get the latest block number from the tracker currentConsensusBlockNumber := cp.GetLatestBlockNumber() // get the candidates for the consensus group @@ -474,7 +474,7 @@ func (cp *ConsensusPoller) UpdateBackendGroupConsensus(ctx context.Context) { RecordGroupConsensusFilteredCount(cp.backendGroup, len(filteredBackendsNames)) RecordGroupTotalCount(cp.backendGroup, len(cp.backendGroup.Backends)) - log.Debug("group local", + log.Debug("group state", "proposedBlock", proposedBlock, "consensusBackends", strings.Join(consensusBackendsNames, ", "), "filteredBackends", strings.Join(filteredBackendsNames, ", ")) @@ -495,13 +495,13 @@ func (cp *ConsensusPoller) Ban(be *Backend) { bs.backendStateMux.Lock() bs.bannedUntil = time.Now().Add(cp.banPeriod) - // when we ban a node, we give it the chance to start update any block when it is back + // when we ban a node, we give it the chance to start from any block when it is back bs.latestBlockNumber = 0 bs.safeBlockNumber = 0 bs.finalizedBlockNumber = 0 } -// Unban removes any bans update the backends +// Unban removes any bans from the backends func (cp *ConsensusPoller) Unban(be *Backend) { bs := cp.backendState[be] defer bs.backendStateMux.Unlock() @@ -516,7 +516,7 @@ func (cp *ConsensusPoller) Reset() { } } -// fetchBlock is a convenient wrapper to make a request to get a block directly update the backend +// fetchBlock is a convenient wrapper to make a request to get a block directly from the backend func (cp *ConsensusPoller) fetchBlock(ctx context.Context, be *Backend, block string) (blockNumber hexutil.Uint64, blockHash string, err error) { var rpcRes RPCRes err = be.ForwardRPC(ctx, &rpcRes, "67", "eth_getBlockByNumber", block, false) @@ -534,7 +534,7 @@ func (cp *ConsensusPoller) fetchBlock(ctx context.Context, be *Backend, block st return } -// getPeerCount is a convenient wrapper to retrieve the current peer count update the backend +// getPeerCount is a convenient wrapper to retrieve the current peer count from the backend func (cp *ConsensusPoller) getPeerCount(ctx context.Context, be *Backend) (count uint64, err error) { var rpcRes RPCRes err = be.ForwardRPC(ctx, &rpcRes, "67", "net_peerCount") @@ -552,7 +552,7 @@ func (cp *ConsensusPoller) getPeerCount(ctx context.Context, be *Backend) (count return count, nil } -// isInSync is a convenient wrapper to check if the backend is in sync update the network +// isInSync is a convenient wrapper to check if the backend is in sync from the network func (cp *ConsensusPoller) isInSync(ctx context.Context, be *Backend) (result bool, err error) { var rpcRes RPCRes err = be.ForwardRPC(ctx, &rpcRes, "67", "eth_syncing") @@ -579,7 +579,7 @@ func (cp *ConsensusPoller) isInSync(ctx context.Context, be *Backend) (result bo return res, nil } -// getBackendState creates a copy of backend local so that the caller can use it without locking +// getBackendState creates a copy of backend state so that the caller can use it without locking func (cp *ConsensusPoller) getBackendState(be *Backend) *backendState { bs := cp.backendState[be] defer bs.backendStateMux.Unlock() @@ -616,7 +616,7 @@ func (cp *ConsensusPoller) setBackendState(be *Backend, peerCount uint64, inSync } // getConsensusCandidates find out what backends are the candidates to be in the consensus group -// and create a copy of current their local +// and create a copy of current their state // // a candidate is a serving node within the following conditions: // - not banned @@ -670,7 +670,7 @@ func (cp *ConsensusPoller) getConsensusCandidates() map[*Backend]*backendState { } } - // remove lagging backends update the candidates + // remove lagging backends from the candidates for _, be := range lagging { delete(candidates, be) } diff --git a/proxyd/methods.go b/proxyd/methods.go index a73d24ae72f4..ffaf89dd60bc 100644 --- a/proxyd/methods.go +++ b/proxyd/methods.go @@ -44,7 +44,7 @@ func (e *StaticMethodHandler) GetRPCMethod(ctx context.Context, req *RPCReq) (*R key := e.key(req) val, err := e.cache.Get(ctx, key) if err != nil { - log.Error("error reading update cache", "key", key, "method", req.Method, "err", err) + log.Error("error reading from cache", "key", key, "method", req.Method, "err", err) return nil, err } if val == "" { @@ -53,7 +53,7 @@ func (e *StaticMethodHandler) GetRPCMethod(ctx context.Context, req *RPCReq) (*R var result interface{} if err := json.Unmarshal([]byte(val), &result); err != nil { - log.Error("error unmarshalling value update cache", "key", key, "method", req.Method, "err", err) + log.Error("error unmarshalling value from cache", "key", key, "method", req.Method, "err", err) return nil, err } return &RPCRes{ diff --git a/proxyd/metrics.go b/proxyd/metrics.go index d1838a187088..68ca4e89874d 100644 --- a/proxyd/metrics.go +++ b/proxyd/metrics.go @@ -332,7 +332,7 @@ var ( consensusGroupFilteredCount = promauto.NewGaugeVec(prometheus.GaugeOpts{ Namespace: MetricsNamespace, Name: "group_consensus_filtered_count", - Help: "Consensus group filtered out update serving traffic count", + Help: "Consensus group filtered out from serving traffic count", }, []string{ "backend_group_name", }) diff --git a/proxyd/server.go b/proxyd/server.go index d14f06fb91fb..2c45aa72d3bd 100644 --- a/proxyd/server.go +++ b/proxyd/server.go @@ -653,11 +653,11 @@ func (s *Server) rateLimitSender(ctx context.Context, req *RPCReq) error { var data hexutil.Bytes if err := data.UnmarshalText([]byte(params[0])); err != nil { log.Debug("error decoding raw tx data", "err", err, "req_id", GetReqID(ctx)) - // Geth returns the raw error update UnmarshalText. + // Geth returns the raw error from UnmarshalText. return ErrInvalidParams(err.Error()) } - // Inflates a types.Transaction object update the transaction's raw bytes. + // Inflates a types.Transaction object from the transaction's raw bytes. tx := new(types.Transaction) if err := tx.UnmarshalBinary(data); err != nil { log.Debug("could not unmarshal transaction", "err", err, "req_id", GetReqID(ctx)) @@ -675,12 +675,12 @@ func (s *Server) rateLimitSender(ctx context.Context, req *RPCReq) error { // sender. This method performs an ecrecover, which can be expensive. msg, err := core.TransactionToMessage(tx, types.LatestSignerForChainID(tx.ChainId()), nil) if err != nil { - log.Debug("could not get message update transaction", "err", err, "req_id", GetReqID(ctx)) + log.Debug("could not get message from transaction", "err", err, "req_id", GetReqID(ctx)) return ErrInvalidParams(err.Error()) } ok, err := s.senderLim.Take(ctx, fmt.Sprintf("%s:%d", msg.From.Hex(), tx.Nonce())) if err != nil { - log.Error("error taking update sender limiter", "err", err, "req_id", GetReqID(ctx)) + log.Error("error taking from sender limiter", "err", err, "req_id", GetReqID(ctx)) return ErrInternal } if !ok { From b15fe51ad1dff5585bc52bde76b3d29b20ca0af7 Mon Sep 17 00:00:00 2001 From: Felipe Andrade Date: Thu, 14 Sep 2023 12:47:25 -0700 Subject: [PATCH 04/87] semgrep --- proxyd/consensus_tracker.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/proxyd/consensus_tracker.go b/proxyd/consensus_tracker.go index d86ac9c43b19..c05551d30a2a 100644 --- a/proxyd/consensus_tracker.go +++ b/proxyd/consensus_tracker.go @@ -237,6 +237,8 @@ func (ct *RedisConsensusTracker) stateHeartbeat() { redsync.WithFailFast(true), redsync.WithTries(1)) + // nosemgrep: missing-unlock-before-return + // this lock is hold indefinitely, and it is extended until the leader dies if err := mutex.Lock(); err != nil { log.Debug("failed to obtain lock", "err", err) ct.leader = false From 7b933391714c43610727b086cd51b4f7ad18f772 Mon Sep 17 00:00:00 2001 From: Felipe Andrade Date: Thu, 14 Sep 2023 15:30:41 -0700 Subject: [PATCH 05/87] release lock on errors, validate if local is behind remote before acquiring the lock --- proxyd/consensus_tracker.go | 39 +++++++++++++++++++++++++++++++------ 1 file changed, 33 insertions(+), 6 deletions(-) diff --git a/proxyd/consensus_tracker.go b/proxyd/consensus_tracker.go index c05551d30a2a..c0d18340fb7d 100644 --- a/proxyd/consensus_tracker.go +++ b/proxyd/consensus_tracker.go @@ -52,6 +52,18 @@ func NewInMemoryConsensusTracker() ConsensusTracker { } } +func (ct *InMemoryConsensusTracker) Valid() bool { + return ct.GetLatestBlockNumber() > 0 && + ct.GetSafeBlockNumber() > 0 && + ct.GetFinalizedBlockNumber() > 0 +} + +func (ct *InMemoryConsensusTracker) Behind(other *InMemoryConsensusTracker) bool { + return ct.GetLatestBlockNumber() < other.GetLatestBlockNumber() || + ct.GetSafeBlockNumber() < other.GetSafeBlockNumber() || + ct.GetFinalizedBlockNumber() < other.GetFinalizedBlockNumber() +} + func (ct *InMemoryConsensusTracker) GetLatestBlockNumber() hexutil.Uint64 { defer ct.mutex.Unlock() ct.mutex.Lock() @@ -179,8 +191,15 @@ func (ct *RedisConsensusTracker) stateHeartbeat() { val, err := ct.client.Get(ct.ctx, key).Result() if err != nil && err != redis.Nil { - log.Error("failed to read the mutex", "err", err) - ct.leader = false + log.Error("failed to read the lock", "err", err) + if ct.leader { + ok, err := ct.redlock.Unlock() + if err != nil || !ok { + log.Error("failed to release the lock after error", "err", err) + return + } + ct.leader = false + } return } if val != "" { @@ -189,6 +208,11 @@ func (ct *RedisConsensusTracker) stateHeartbeat() { ok, err := ct.redlock.Extend() if err != nil || !ok { log.Error("failed to extend lock", "err", err, "mutex", ct.redlock.Name(), "val", ct.redlock.Value()) + ok, err := ct.redlock.Unlock() + if err != nil || !ok { + log.Error("failed to release the lock after error", "err", err) + return + } ct.leader = false return } @@ -224,12 +248,15 @@ func (ct *RedisConsensusTracker) stateHeartbeat() { log.Debug("updated state from remote", "state", val, "leader", leaderName) } } else { - if ct.local.GetLatestBlockNumber() == 0 || - ct.local.GetSafeBlockNumber() == 0 || - ct.local.GetFinalizedBlockNumber() == 0 { - log.Warn("lock not found, but local state is missing, skipping") + if !ct.local.Valid() { + log.Warn("local state is not valid or behind remote, skipping") return } + if ct.remote.Valid() && ct.local.Behind(ct.remote) { + log.Warn("local state is behind remote, skipping") + return + } + log.Info("lock not found, creating a new one") mutex := rs.NewMutex(key, From b8b39edb64cfe7bca5b7a2e8e47440424ac98194 Mon Sep 17 00:00:00 2001 From: Andreas Bigger Date: Fri, 15 Sep 2023 10:44:38 -0400 Subject: [PATCH 06/87] don't schedule updates for completed games --- op-challenger/game/fault/player.go | 4 ++++ op-challenger/game/scheduler/coordinator.go | 14 +++++++++++--- op-challenger/game/scheduler/coordinator_test.go | 9 ++++++++- op-challenger/game/scheduler/types.go | 1 + op-challenger/game/scheduler/worker_test.go | 4 ++++ 5 files changed, 28 insertions(+), 4 deletions(-) diff --git a/op-challenger/game/fault/player.go b/op-challenger/game/fault/player.go index d55d4dae41c0..110388ce15ff 100644 --- a/op-challenger/game/fault/player.go +++ b/op-challenger/game/fault/player.go @@ -114,6 +114,10 @@ func NewGamePlayer( }, nil } +func (g *GamePlayer) Status() gameTypes.GameStatus { + return g.status +} + func (g *GamePlayer) ProgressGame(ctx context.Context) gameTypes.GameStatus { if g.status != gameTypes.GameStatusInProgress { // Game is already complete so don't try to perform further actions. diff --git a/op-challenger/game/scheduler/coordinator.go b/op-challenger/game/scheduler/coordinator.go index f90fca559301..f3460bc22e4c 100644 --- a/op-challenger/game/scheduler/coordinator.go +++ b/op-challenger/game/scheduler/coordinator.go @@ -64,8 +64,12 @@ func (c *coordinator) schedule(ctx context.Context, games []common.Address) erro if j, err := c.createJob(addr); err != nil { errs = append(errs, err) } else if j != nil { - jobs = append(jobs, *j) - c.m.RecordGameUpdateScheduled() + if j.status == types.GameStatusInProgress { + jobs = append(jobs, *j) + c.m.RecordGameUpdateScheduled() + } else { + c.logger.Warn("Resolved game update not scheduled", "game", addr, "status", j.status) + } } state, ok := c.states[addr] if ok { @@ -93,6 +97,7 @@ func (c *coordinator) schedule(ctx context.Context, games []common.Address) erro // createJob updates the state for the specified game and returns the job to enqueue for it, if any // Returns (nil, nil) when there is no error and no job to enqueue func (c *coordinator) createJob(game common.Address) (*job, error) { + j := &job{addr: game} state, ok := c.states[game] if !ok { state = &gameState{} @@ -109,9 +114,12 @@ func (c *coordinator) createJob(game common.Address) (*job, error) { return nil, fmt.Errorf("failed to create game player: %w", err) } state.player = player + state.status = player.Status() } state.inflight = true - return &job{addr: game, player: state.player}, nil + j.player = state.player + j.status = state.status + return j, nil } func (c *coordinator) enqueueJob(ctx context.Context, j job) error { diff --git a/op-challenger/game/scheduler/coordinator_test.go b/op-challenger/game/scheduler/coordinator_test.go index f3c0f94a4d22..6f58685280e0 100644 --- a/op-challenger/game/scheduler/coordinator_test.go +++ b/op-challenger/game/scheduler/coordinator_test.go @@ -150,7 +150,10 @@ func TestDeleteDataForResolvedGames(t *testing.T) { gameAddrs := []common.Address{gameAddr1, gameAddr2, gameAddr3} require.NoError(t, c.schedule(ctx, gameAddrs)) - require.Len(t, workQueue, len(gameAddrs), "should schedule all games") + // The work queue should only contain jobs for games 1 and 2 + // A resolved game should not be scheduled for an update. + // This makes the inflight game metric more robust. + require.Len(t, workQueue, 2, "should schedule all games") // Game 1 progresses and is still in progress // Game 2 progresses and is now resolved @@ -249,6 +252,10 @@ func (g *stubGame) ProgressGame(_ context.Context) types.GameStatus { return g.status } +func (g *stubGame) Status() types.GameStatus { + return g.status +} + type createdGames struct { t *testing.T createCompleted common.Address diff --git a/op-challenger/game/scheduler/types.go b/op-challenger/game/scheduler/types.go index 03fd96a878f1..8228401fe6c6 100644 --- a/op-challenger/game/scheduler/types.go +++ b/op-challenger/game/scheduler/types.go @@ -10,6 +10,7 @@ import ( type GamePlayer interface { ProgressGame(ctx context.Context) types.GameStatus + Status() types.GameStatus } type DiskManager interface { diff --git a/op-challenger/game/scheduler/worker_test.go b/op-challenger/game/scheduler/worker_test.go index 7c0b4091a5f4..fa224d7d7e86 100644 --- a/op-challenger/game/scheduler/worker_test.go +++ b/op-challenger/game/scheduler/worker_test.go @@ -47,6 +47,10 @@ func (s *stubPlayer) ProgressGame(ctx context.Context) types.GameStatus { return s.status } +func (s *stubPlayer) Status() types.GameStatus { + return s.status +} + func readWithTimeout[T any](t *testing.T, ch <-chan T) T { ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) defer cancel() From 2a91d6dd9dbe6917248f6eec21a52c8a59a3f17e Mon Sep 17 00:00:00 2001 From: Andreas Bigger Date: Fri, 15 Sep 2023 12:10:51 -0400 Subject: [PATCH 07/87] add concurrency metrics --- op-challenger/game/scheduler/scheduler.go | 24 +++++++++++++++- op-challenger/game/scheduler/worker.go | 4 ++- op-challenger/game/scheduler/worker_test.go | 30 +++++++++++++++++++- op-challenger/metrics/metrics.go | 31 +++++++++++++++++++++ op-challenger/metrics/noop.go | 5 ++++ 5 files changed, 91 insertions(+), 3 deletions(-) diff --git a/op-challenger/game/scheduler/scheduler.go b/op-challenger/game/scheduler/scheduler.go index 41bf54b6e359..a367bb6859d4 100644 --- a/op-challenger/game/scheduler/scheduler.go +++ b/op-challenger/game/scheduler/scheduler.go @@ -15,11 +15,17 @@ type SchedulerMetricer interface { RecordGamesStatus(inProgress, defenderWon, challengerWon int) RecordGameUpdateScheduled() RecordGameUpdateCompleted() + IncActiveExecutors() + DecActiveExecutors() + IncIdleExecutors() + DecIdleExecutors() } type Scheduler struct { + executorMutex sync.Mutex logger log.Logger coordinator *coordinator + m SchedulerMetricer maxConcurrency uint scheduleQueue chan []common.Address jobQueue chan job @@ -40,6 +46,7 @@ func NewScheduler(logger log.Logger, m SchedulerMetricer, disk DiskManager, maxC return &Scheduler{ logger: logger, + m: m, coordinator: newCoordinator(logger, m, jobQueue, resultQueue, createPlayer, disk), maxConcurrency: maxConcurrency, scheduleQueue: scheduleQueue, @@ -48,13 +55,28 @@ func NewScheduler(logger log.Logger, m SchedulerMetricer, disk DiskManager, maxC } } +func (s *Scheduler) ThreadActive() { + s.executorMutex.Lock() + defer s.executorMutex.Unlock() + s.m.DecIdleExecutors() + s.m.IncActiveExecutors() +} + +func (s *Scheduler) ThreadIdle() { + s.executorMutex.Lock() + defer s.executorMutex.Unlock() + s.m.DecActiveExecutors() + s.m.IncIdleExecutors() +} + func (s *Scheduler) Start(ctx context.Context) { ctx, cancel := context.WithCancel(ctx) s.cancel = cancel for i := uint(0); i < s.maxConcurrency; i++ { + s.m.IncIdleExecutors() s.wg.Add(1) - go progressGames(ctx, s.jobQueue, s.resultQueue, &s.wg) + go progressGames(ctx, s.jobQueue, s.resultQueue, &s.wg, s.ThreadActive, s.ThreadIdle) } s.wg.Add(1) diff --git a/op-challenger/game/scheduler/worker.go b/op-challenger/game/scheduler/worker.go index 55c53067b675..5184889c5263 100644 --- a/op-challenger/game/scheduler/worker.go +++ b/op-challenger/game/scheduler/worker.go @@ -8,15 +8,17 @@ import ( // progressGames accepts jobs from in channel, calls ProgressGame on the job.player and returns the job // with updated job.resolved via the out channel. // The loop exits when the ctx is done. wg.Done() is called when the function returns. -func progressGames(ctx context.Context, in <-chan job, out chan<- job, wg *sync.WaitGroup) { +func progressGames(ctx context.Context, in <-chan job, out chan<- job, wg *sync.WaitGroup, threadActive, threadIdle func()) { defer wg.Done() for { select { case <-ctx.Done(): return case j := <-in: + threadActive() j.status = j.player.ProgressGame(ctx) out <- j + threadIdle() } } } diff --git a/op-challenger/game/scheduler/worker_test.go b/op-challenger/game/scheduler/worker_test.go index 7c0b4091a5f4..50f8de845bb0 100644 --- a/op-challenger/game/scheduler/worker_test.go +++ b/op-challenger/game/scheduler/worker_test.go @@ -7,6 +7,7 @@ import ( "time" "github.com/ethereum-optimism/optimism/op-challenger/game/types" + "github.com/ethereum-optimism/optimism/op-e2e/e2eutils/wait" "github.com/stretchr/testify/require" ) @@ -15,18 +16,32 @@ func TestWorkerShouldProcessJobsUntilContextDone(t *testing.T) { in := make(chan job, 2) out := make(chan job, 2) + ms := &metricSink{} ctx, cancel := context.WithCancel(context.Background()) defer cancel() var wg sync.WaitGroup wg.Add(1) - go progressGames(ctx, in, out, &wg) + go progressGames(ctx, in, out, &wg, ms.ThreadActive, ms.ThreadIdle) in <- job{ player: &stubPlayer{status: types.GameStatusInProgress}, } + waitErr := wait.For(context.Background(), 100*time.Millisecond, func() (bool, error) { + return ms.activeCalls >= 1, nil + }) + require.NoError(t, waitErr) + require.Equal(t, ms.activeCalls, 1) + require.Equal(t, ms.idleCalls, 1) + in <- job{ player: &stubPlayer{status: types.GameStatusDefenderWon}, } + waitErr = wait.For(context.Background(), 100*time.Millisecond, func() (bool, error) { + return ms.activeCalls >= 2, nil + }) + require.NoError(t, waitErr) + require.Equal(t, ms.activeCalls, 2) + require.Equal(t, ms.idleCalls, 2) result1 := readWithTimeout(t, out) result2 := readWithTimeout(t, out) @@ -39,6 +54,19 @@ func TestWorkerShouldProcessJobsUntilContextDone(t *testing.T) { wg.Wait() } +type metricSink struct { + activeCalls int + idleCalls int +} + +func (m *metricSink) ThreadActive() { + m.activeCalls++ +} + +func (m *metricSink) ThreadIdle() { + m.idleCalls++ +} + type stubPlayer struct { status types.GameStatus } diff --git a/op-challenger/metrics/metrics.go b/op-challenger/metrics/metrics.go index 004ad1af1ccd..c3eaec8b1f0c 100644 --- a/op-challenger/metrics/metrics.go +++ b/op-challenger/metrics/metrics.go @@ -29,6 +29,11 @@ type Metricer interface { RecordGameUpdateScheduled() RecordGameUpdateCompleted() + + IncActiveExecutors() + DecActiveExecutors() + IncIdleExecutors() + DecIdleExecutors() } type Metrics struct { @@ -41,6 +46,8 @@ type Metrics struct { info prometheus.GaugeVec up prometheus.Gauge + executors prometheus.GaugeVec + moves prometheus.Counter steps prometheus.Counter @@ -75,6 +82,14 @@ func NewMetrics() *Metrics { Name: "up", Help: "1 if the op-challenger has finished starting up", }), + executors: *factory.NewGaugeVec(prometheus.GaugeOpts{ + Namespace: Namespace, + Name: "executors", + Help: "Number of active and idle executors", + }, []string{ + "active", + "idle", + }), moves: factory.NewCounter(prometheus.CounterOpts{ Namespace: Namespace, Name: "moves", @@ -149,6 +164,22 @@ func (m *Metrics) RecordCannonExecutionTime(t float64) { m.cannonExecutionTime.Observe(t) } +func (m *Metrics) IncActiveExecutors() { + m.executors.WithLabelValues("active").Inc() +} + +func (m *Metrics) DecActiveExecutors() { + m.executors.WithLabelValues("active").Dec() +} + +func (m *Metrics) IncIdleExecutors() { + m.executors.WithLabelValues("idle").Inc() +} + +func (m *Metrics) DecIdleExecutors() { + m.executors.WithLabelValues("idle").Dec() +} + func (m *Metrics) RecordGamesStatus(inProgress, defenderWon, challengerWon int) { m.trackedGames.WithLabelValues("in_progress").Set(float64(inProgress)) m.trackedGames.WithLabelValues("defender_won").Set(float64(defenderWon)) diff --git a/op-challenger/metrics/noop.go b/op-challenger/metrics/noop.go index ef7452eef93a..9737a5d7ccd3 100644 --- a/op-challenger/metrics/noop.go +++ b/op-challenger/metrics/noop.go @@ -22,3 +22,8 @@ func (*NoopMetricsImpl) RecordGamesStatus(inProgress, defenderWon, challengerWon func (*NoopMetricsImpl) RecordGameUpdateScheduled() {} func (*NoopMetricsImpl) RecordGameUpdateCompleted() {} + +func (*NoopMetricsImpl) IncActiveExecutors() {} +func (*NoopMetricsImpl) DecActiveExecutors() {} +func (*NoopMetricsImpl) IncIdleExecutors() {} +func (*NoopMetricsImpl) DecIdleExecutors() {} From c323b81e4417ef3bf9b961a12ac42985fbfd4226 Mon Sep 17 00:00:00 2001 From: Andreas Bigger Date: Fri, 15 Sep 2023 12:40:17 -0400 Subject: [PATCH 08/87] labeling issue --- op-challenger/metrics/metrics.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/op-challenger/metrics/metrics.go b/op-challenger/metrics/metrics.go index c3eaec8b1f0c..ced9fb249e58 100644 --- a/op-challenger/metrics/metrics.go +++ b/op-challenger/metrics/metrics.go @@ -87,8 +87,7 @@ func NewMetrics() *Metrics { Name: "executors", Help: "Number of active and idle executors", }, []string{ - "active", - "idle", + "status", }), moves: factory.NewCounter(prometheus.CounterOpts{ Namespace: Namespace, From 99fb84db0a8f3cee9e7dfafda950468aaf328dc6 Mon Sep 17 00:00:00 2001 From: Felipe Andrade Date: Fri, 15 Sep 2023 11:57:57 -0700 Subject: [PATCH 09/87] nits --- proxyd/consensus_tracker.go | 25 +++++++++++-------------- 1 file changed, 11 insertions(+), 14 deletions(-) diff --git a/proxyd/consensus_tracker.go b/proxyd/consensus_tracker.go index c0d18340fb7d..e4fc50571aa9 100644 --- a/proxyd/consensus_tracker.go +++ b/proxyd/consensus_tracker.go @@ -33,10 +33,13 @@ type ConsensusTrackerState struct { Finalized hexutil.Uint64 `json:"finalized"` } -func (s *ConsensusTrackerState) update(o *ConsensusTrackerState) { - s.Latest = o.Latest - s.Safe = o.Safe - s.Finalized = o.Finalized +func (ct *InMemoryConsensusTracker) update(o *ConsensusTrackerState) { + ct.mutex.Lock() + defer ct.mutex.Unlock() + + ct.state.Latest = o.Latest + ct.state.Safe = o.Safe + ct.state.Finalized = o.Finalized } // InMemoryConsensusTracker store and retrieve in memory, async-safe @@ -169,14 +172,12 @@ func NewRedisConsensusTracker(ctx context.Context, func (ct *RedisConsensusTracker) Init() { go func() { for { - // follow same context as backend group poller - ctx := ct.backendGroup.Consensus.ctx timer := time.NewTimer(ct.heartbeatInterval) ct.stateHeartbeat() select { case <-timer.C: - case <-ctx.Done(): + case <-ct.ctx.Done(): timer.Stop() return } @@ -242,9 +243,8 @@ func (ct *RedisConsensusTracker) stateHeartbeat() { log.Error("failed to unmarshal the remote state", "err", err) return } - ct.remote.mutex.Lock() - defer ct.remote.mutex.Unlock() - ct.remote.state.update(state) + + ct.remote.update(state) log.Debug("updated state from remote", "state", val, "leader", leaderName) } } else { @@ -320,15 +320,12 @@ func (ct *RedisConsensusTracker) postPayload(mutexVal string) { ct.client.Set(ct.ctx, ct.key(fmt.Sprintf("state:%s", mutexVal)), jsonState, ct.lockPeriod) leader, _ := os.LookupEnv("HOSTNAME") - if leader == "" { - - } ct.client.Set(ct.ctx, ct.key(fmt.Sprintf("leader:%s", mutexVal)), leader, ct.lockPeriod) log.Debug("posted state", "state", string(jsonState), "leader", leader) ct.leaderName = leader - ct.remote.state.update(ct.local.state) + ct.remote.update(ct.local.state) RecordGroupConsensusHALatestBlock(ct.backendGroup, leader, ct.local.state.Latest) RecordGroupConsensusHASafeBlock(ct.backendGroup, leader, ct.local.state.Safe) From 9accb0e2d2e86f60002380107b84d6e279327054 Mon Sep 17 00:00:00 2001 From: Felipe Andrade Date: Fri, 15 Sep 2023 12:33:28 -0700 Subject: [PATCH 10/87] nits --- proxyd/consensus_tracker.go | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/proxyd/consensus_tracker.go b/proxyd/consensus_tracker.go index e4fc50571aa9..158c31bdc683 100644 --- a/proxyd/consensus_tracker.go +++ b/proxyd/consensus_tracker.go @@ -177,6 +177,7 @@ func (ct *RedisConsensusTracker) Init() { select { case <-timer.C: + continue case <-ct.ctx.Done(): timer.Stop() return @@ -246,6 +247,10 @@ func (ct *RedisConsensusTracker) stateHeartbeat() { ct.remote.update(state) log.Debug("updated state from remote", "state", val, "leader", leaderName) + + RecordGroupConsensusHALatestBlock(ct.backendGroup, leaderName, ct.remote.state.Latest) + RecordGroupConsensusHASafeBlock(ct.backendGroup, leaderName, ct.remote.state.Safe) + RecordGroupConsensusHAFinalizedBlock(ct.backendGroup, leaderName, ct.remote.state.Finalized) } } else { if !ct.local.Valid() { @@ -308,9 +313,6 @@ func (ct *RedisConsensusTracker) SetFinalizedBlockNumber(blockNumber hexutil.Uin } func (ct *RedisConsensusTracker) postPayload(mutexVal string) { - ct.remote.mutex.Lock() - defer ct.remote.mutex.Unlock() - jsonState, err := json.Marshal(ct.local.state) if err != nil { log.Error("failed to marshal local", "err", err) @@ -327,7 +329,7 @@ func (ct *RedisConsensusTracker) postPayload(mutexVal string) { ct.leaderName = leader ct.remote.update(ct.local.state) - RecordGroupConsensusHALatestBlock(ct.backendGroup, leader, ct.local.state.Latest) - RecordGroupConsensusHASafeBlock(ct.backendGroup, leader, ct.local.state.Safe) - RecordGroupConsensusHAFinalizedBlock(ct.backendGroup, leader, ct.local.state.Finalized) + RecordGroupConsensusHALatestBlock(ct.backendGroup, leader, ct.remote.state.Latest) + RecordGroupConsensusHASafeBlock(ct.backendGroup, leader, ct.remote.state.Safe) + RecordGroupConsensusHAFinalizedBlock(ct.backendGroup, leader, ct.remote.state.Finalized) } From cea66c7e02dbb4f53afbabeb622b15b0601ff93e Mon Sep 17 00:00:00 2001 From: Will Cory Date: Thu, 14 Sep 2023 12:18:44 -0700 Subject: [PATCH 11/87] fix(indexer): Fix uri util --- .circleci/config.yml | 4 + indexer/api-ts/indexer.cjs | 4 +- indexer/api-ts/indexer.cjs.map | 2 +- indexer/api-ts/indexer.js | 4 +- indexer/api-ts/indexer.js.map | 2 +- indexer/api-ts/indexer.spec.ts | 12 ++ indexer/api-ts/indexer.ts | 4 +- indexer/api-ts/package.json | 10 +- indexer/api-ts/tsconfig.json | 2 +- pnpm-lock.yaml | 206 ++++++++++++++++++++++++++++++--- pnpm-workspace.yaml | 2 +- 11 files changed, 224 insertions(+), 28 deletions(-) create mode 100644 indexer/api-ts/indexer.spec.ts diff --git a/.circleci/config.yml b/.circleci/config.yml index aded89e0458d..985e3b688c57 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -887,6 +887,10 @@ jobs: name: Build command: make indexer working_directory: indexer + - run: + name: Install node_modules + command: pnpm install --frozen-lockfile --offline + working_directory: indexer/api-ts - run: name: Install tygo command: go install github.com/gzuidhof/tygo@latest diff --git a/indexer/api-ts/indexer.cjs b/indexer/api-ts/indexer.cjs index 06654922163c..6eee96c7d176 100644 --- a/indexer/api-ts/indexer.cjs +++ b/indexer/api-ts/indexer.cjs @@ -38,10 +38,10 @@ var createQueryString = ({ cursor, limit }) => { return `?${queries.join("&")}`; }; var depositEndpoint = ({ baseUrl = "", address, cursor, limit }) => { - return [baseUrl, "deposits", address, createQueryString({ cursor, limit })].join("/"); + return [baseUrl, "deposits", `${address}${createQueryString({ cursor, limit })}`].join("/"); }; var withdrawalEndoint = ({ baseUrl = "", address, cursor, limit }) => { - return [baseUrl, "withdrawals", address, createQueryString({ cursor, limit })].join("/"); + return [baseUrl, "withdrawals", `${address}${createQueryString({ cursor, limit })}`].join("/"); }; // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { diff --git a/indexer/api-ts/indexer.cjs.map b/indexer/api-ts/indexer.cjs.map index e3b29f27ad7b..694ca7dfa107 100644 --- a/indexer/api-ts/indexer.cjs.map +++ b/indexer/api-ts/indexer.cjs.map @@ -1 +1 @@ -{"version":3,"sources":["indexer.ts"],"sourcesContent":["export * from './generated'\n\ntype PaginationOptions = {\n limit?: number\n cursor?: string\n}\n\ntype Options = {\n baseUrl?: string\n address: `0x${string}`\n} & PaginationOptions\n\nconst createQueryString = ({ cursor, limit }: PaginationOptions): string => {\n if (cursor === undefined && limit === undefined) {\n return ''\n }\n const queries: string[] = []\n if (cursor) {\n queries.push(`cursor=${cursor}`)\n }\n if (limit) {\n queries.push(`limit=${limit}`)\n }\n return `?${queries.join('&')}`\n}\n\nexport const depositEndpoint = ({ baseUrl = '', address, cursor, limit }: Options): string => {\n return [baseUrl, 'deposits', address, createQueryString({ cursor, limit })].join('/')\n}\n\nexport const withdrawalEndoint = ({ baseUrl = '', address, cursor, limit }: Options): string => {\n return [baseUrl, 'withdrawals', address, createQueryString({ cursor, limit })].join('/')\n}\n\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAYA,IAAM,oBAAoB,CAAC,EAAE,QAAQ,MAAM,MAAiC;AAC1E,MAAI,WAAW,UAAa,UAAU,QAAW;AAC/C,WAAO;AAAA,EACT;AACA,QAAM,UAAoB,CAAC;AAC3B,MAAI,QAAQ;AACV,YAAQ,KAAK,UAAU,MAAM,EAAE;AAAA,EACjC;AACA,MAAI,OAAO;AACT,YAAQ,KAAK,SAAS,KAAK,EAAE;AAAA,EAC/B;AACA,SAAO,IAAI,QAAQ,KAAK,GAAG,CAAC;AAC9B;AAEO,IAAM,kBAAkB,CAAC,EAAE,UAAU,IAAI,SAAS,QAAQ,MAAM,MAAuB;AAC5F,SAAO,CAAC,SAAS,YAAY,SAAS,kBAAkB,EAAE,QAAQ,MAAM,CAAC,CAAC,EAAE,KAAK,GAAG;AACtF;AAEO,IAAM,oBAAoB,CAAC,EAAE,UAAU,IAAI,SAAS,QAAQ,MAAM,MAAuB;AAC9F,SAAO,CAAC,SAAS,eAAe,SAAS,kBAAkB,EAAE,QAAQ,MAAM,CAAC,CAAC,EAAE,KAAK,GAAG;AACzF;","names":[]} \ No newline at end of file +{"version":3,"sources":["indexer.ts"],"sourcesContent":["export * from './generated'\n\ntype PaginationOptions = {\n limit?: number\n cursor?: string\n}\n\ntype Options = {\n baseUrl?: string\n address: `0x${string}`\n} & PaginationOptions\n\nconst createQueryString = ({ cursor, limit }: PaginationOptions): string => {\n if (cursor === undefined && limit === undefined) {\n return ''\n }\n const queries: string[] = []\n if (cursor) {\n queries.push(`cursor=${cursor}`)\n }\n if (limit) {\n queries.push(`limit=${limit}`)\n }\n return `?${queries.join('&')}`\n}\n\nexport const depositEndpoint = ({ baseUrl = '', address, cursor, limit }: Options): string => {\n return [baseUrl, 'deposits', `${address}${createQueryString({ cursor, limit })}`].join('/')\n}\n\nexport const withdrawalEndoint = ({ baseUrl = '', address, cursor, limit }: Options): string => {\n return [baseUrl, 'withdrawals', `${address}${createQueryString({ cursor, limit })}`].join('/')\n}\n\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAYA,IAAM,oBAAoB,CAAC,EAAE,QAAQ,MAAM,MAAiC;AAC1E,MAAI,WAAW,UAAa,UAAU,QAAW;AAC/C,WAAO;AAAA,EACT;AACA,QAAM,UAAoB,CAAC;AAC3B,MAAI,QAAQ;AACV,YAAQ,KAAK,UAAU,MAAM,EAAE;AAAA,EACjC;AACA,MAAI,OAAO;AACT,YAAQ,KAAK,SAAS,KAAK,EAAE;AAAA,EAC/B;AACA,SAAO,IAAI,QAAQ,KAAK,GAAG,CAAC;AAC9B;AAEO,IAAM,kBAAkB,CAAC,EAAE,UAAU,IAAI,SAAS,QAAQ,MAAM,MAAuB;AAC5F,SAAO,CAAC,SAAS,YAAY,GAAG,OAAO,GAAG,kBAAkB,EAAE,QAAQ,MAAM,CAAC,CAAC,EAAE,EAAE,KAAK,GAAG;AAC5F;AAEO,IAAM,oBAAoB,CAAC,EAAE,UAAU,IAAI,SAAS,QAAQ,MAAM,MAAuB;AAC9F,SAAO,CAAC,SAAS,eAAe,GAAG,OAAO,GAAG,kBAAkB,EAAE,QAAQ,MAAM,CAAC,CAAC,EAAE,EAAE,KAAK,GAAG;AAC/F;","names":[]} \ No newline at end of file diff --git a/indexer/api-ts/indexer.js b/indexer/api-ts/indexer.js index b33fdd9670dd..f76434c63b35 100644 --- a/indexer/api-ts/indexer.js +++ b/indexer/api-ts/indexer.js @@ -13,10 +13,10 @@ var createQueryString = ({ cursor, limit }) => { return `?${queries.join("&")}`; }; var depositEndpoint = ({ baseUrl = "", address, cursor, limit }) => { - return [baseUrl, "deposits", address, createQueryString({ cursor, limit })].join("/"); + return [baseUrl, "deposits", `${address}${createQueryString({ cursor, limit })}`].join("/"); }; var withdrawalEndoint = ({ baseUrl = "", address, cursor, limit }) => { - return [baseUrl, "withdrawals", address, createQueryString({ cursor, limit })].join("/"); + return [baseUrl, "withdrawals", `${address}${createQueryString({ cursor, limit })}`].join("/"); }; export { depositEndpoint, diff --git a/indexer/api-ts/indexer.js.map b/indexer/api-ts/indexer.js.map index 5be1e94a4980..8f9742b0c852 100644 --- a/indexer/api-ts/indexer.js.map +++ b/indexer/api-ts/indexer.js.map @@ -1 +1 @@ -{"version":3,"sources":["indexer.ts"],"sourcesContent":["export * from './generated'\n\ntype PaginationOptions = {\n limit?: number\n cursor?: string\n}\n\ntype Options = {\n baseUrl?: string\n address: `0x${string}`\n} & PaginationOptions\n\nconst createQueryString = ({ cursor, limit }: PaginationOptions): string => {\n if (cursor === undefined && limit === undefined) {\n return ''\n }\n const queries: string[] = []\n if (cursor) {\n queries.push(`cursor=${cursor}`)\n }\n if (limit) {\n queries.push(`limit=${limit}`)\n }\n return `?${queries.join('&')}`\n}\n\nexport const depositEndpoint = ({ baseUrl = '', address, cursor, limit }: Options): string => {\n return [baseUrl, 'deposits', address, createQueryString({ cursor, limit })].join('/')\n}\n\nexport const withdrawalEndoint = ({ baseUrl = '', address, cursor, limit }: Options): string => {\n return [baseUrl, 'withdrawals', address, createQueryString({ cursor, limit })].join('/')\n}\n\n"],"mappings":";AAYA,IAAM,oBAAoB,CAAC,EAAE,QAAQ,MAAM,MAAiC;AAC1E,MAAI,WAAW,UAAa,UAAU,QAAW;AAC/C,WAAO;AAAA,EACT;AACA,QAAM,UAAoB,CAAC;AAC3B,MAAI,QAAQ;AACV,YAAQ,KAAK,UAAU,MAAM,EAAE;AAAA,EACjC;AACA,MAAI,OAAO;AACT,YAAQ,KAAK,SAAS,KAAK,EAAE;AAAA,EAC/B;AACA,SAAO,IAAI,QAAQ,KAAK,GAAG,CAAC;AAC9B;AAEO,IAAM,kBAAkB,CAAC,EAAE,UAAU,IAAI,SAAS,QAAQ,MAAM,MAAuB;AAC5F,SAAO,CAAC,SAAS,YAAY,SAAS,kBAAkB,EAAE,QAAQ,MAAM,CAAC,CAAC,EAAE,KAAK,GAAG;AACtF;AAEO,IAAM,oBAAoB,CAAC,EAAE,UAAU,IAAI,SAAS,QAAQ,MAAM,MAAuB;AAC9F,SAAO,CAAC,SAAS,eAAe,SAAS,kBAAkB,EAAE,QAAQ,MAAM,CAAC,CAAC,EAAE,KAAK,GAAG;AACzF;","names":[]} \ No newline at end of file +{"version":3,"sources":["indexer.ts"],"sourcesContent":["export * from './generated'\n\ntype PaginationOptions = {\n limit?: number\n cursor?: string\n}\n\ntype Options = {\n baseUrl?: string\n address: `0x${string}`\n} & PaginationOptions\n\nconst createQueryString = ({ cursor, limit }: PaginationOptions): string => {\n if (cursor === undefined && limit === undefined) {\n return ''\n }\n const queries: string[] = []\n if (cursor) {\n queries.push(`cursor=${cursor}`)\n }\n if (limit) {\n queries.push(`limit=${limit}`)\n }\n return `?${queries.join('&')}`\n}\n\nexport const depositEndpoint = ({ baseUrl = '', address, cursor, limit }: Options): string => {\n return [baseUrl, 'deposits', `${address}${createQueryString({ cursor, limit })}`].join('/')\n}\n\nexport const withdrawalEndoint = ({ baseUrl = '', address, cursor, limit }: Options): string => {\n return [baseUrl, 'withdrawals', `${address}${createQueryString({ cursor, limit })}`].join('/')\n}\n\n"],"mappings":";AAYA,IAAM,oBAAoB,CAAC,EAAE,QAAQ,MAAM,MAAiC;AAC1E,MAAI,WAAW,UAAa,UAAU,QAAW;AAC/C,WAAO;AAAA,EACT;AACA,QAAM,UAAoB,CAAC;AAC3B,MAAI,QAAQ;AACV,YAAQ,KAAK,UAAU,MAAM,EAAE;AAAA,EACjC;AACA,MAAI,OAAO;AACT,YAAQ,KAAK,SAAS,KAAK,EAAE;AAAA,EAC/B;AACA,SAAO,IAAI,QAAQ,KAAK,GAAG,CAAC;AAC9B;AAEO,IAAM,kBAAkB,CAAC,EAAE,UAAU,IAAI,SAAS,QAAQ,MAAM,MAAuB;AAC5F,SAAO,CAAC,SAAS,YAAY,GAAG,OAAO,GAAG,kBAAkB,EAAE,QAAQ,MAAM,CAAC,CAAC,EAAE,EAAE,KAAK,GAAG;AAC5F;AAEO,IAAM,oBAAoB,CAAC,EAAE,UAAU,IAAI,SAAS,QAAQ,MAAM,MAAuB;AAC9F,SAAO,CAAC,SAAS,eAAe,GAAG,OAAO,GAAG,kBAAkB,EAAE,QAAQ,MAAM,CAAC,CAAC,EAAE,EAAE,KAAK,GAAG;AAC/F;","names":[]} \ No newline at end of file diff --git a/indexer/api-ts/indexer.spec.ts b/indexer/api-ts/indexer.spec.ts new file mode 100644 index 000000000000..38a83cd3fd30 --- /dev/null +++ b/indexer/api-ts/indexer.spec.ts @@ -0,0 +1,12 @@ +import { test, expect } from 'vitest' +import { depositEndpoint, withdrawalEndoint } from './indexer.ts' + +test(depositEndpoint.name, () => { + expect(depositEndpoint({ baseUrl: 'http://localhost:8080/api/v0', address: '0x1234', cursor: '0x1235', limit: 10 })).toMatchInlineSnapshot('"http://localhost:8080/api/v0/deposits/0x1234?cursor=0x1235&limit=10"') + expect(depositEndpoint({ baseUrl: 'http://localhost:8080/api/v0', address: '0x1234' })).toMatchInlineSnapshot('"http://localhost:8080/api/v0/deposits/0x1234"') +}) + +test(withdrawalEndoint.name, () => { + expect(withdrawalEndoint({ baseUrl: 'http://localhost:8080/api/v0', address: '0x1234', cursor: '0x1235', limit: 10 })).toMatchInlineSnapshot('"http://localhost:8080/api/v0/withdrawals/0x1234?cursor=0x1235&limit=10"') + expect(withdrawalEndoint({ baseUrl: 'http://localhost:8080/api/v0', address: '0x1234' })).toMatchInlineSnapshot('"http://localhost:8080/api/v0/withdrawals/0x1234"') +}) diff --git a/indexer/api-ts/indexer.ts b/indexer/api-ts/indexer.ts index ada1776e1370..e73ce765039d 100644 --- a/indexer/api-ts/indexer.ts +++ b/indexer/api-ts/indexer.ts @@ -25,10 +25,10 @@ const createQueryString = ({ cursor, limit }: PaginationOptions): string => { } export const depositEndpoint = ({ baseUrl = '', address, cursor, limit }: Options): string => { - return [baseUrl, 'deposits', address, createQueryString({ cursor, limit })].join('/') + return [baseUrl, 'deposits', `${address}${createQueryString({ cursor, limit })}`].join('/') } export const withdrawalEndoint = ({ baseUrl = '', address, cursor, limit }: Options): string => { - return [baseUrl, 'withdrawals', address, createQueryString({ cursor, limit })].join('/') + return [baseUrl, 'withdrawals', `${address}${createQueryString({ cursor, limit })}`].join('/') } diff --git a/indexer/api-ts/package.json b/indexer/api-ts/package.json index 83bd73441c0b..faa3eda8da29 100644 --- a/indexer/api-ts/package.json +++ b/indexer/api-ts/package.json @@ -17,7 +17,8 @@ ], "scripts": { "clean": "rm -rf generated.ts indexer.cjs indexer.js", - "generate": "npm run clean && tygo generate && mv ../api/routes/index.ts generated.ts && npx tsup" + "generate": "npm run clean && tygo generate && mv ../api/routes/index.ts generated.ts && tsup", + "test": "vitest" }, "keywords": [ "optimism", @@ -30,4 +31,9 @@ "repository": { "type": "git", "url": "https://github.com/ethereum-optimism/optimism.git" - }} + }, + "devDependencies": { + "tsup": "^7.2.0", + "vitest": "^0.34.4" + } +} diff --git a/indexer/api-ts/tsconfig.json b/indexer/api-ts/tsconfig.json index e249a8d0b37c..6a6c29f680c4 100644 --- a/indexer/api-ts/tsconfig.json +++ b/indexer/api-ts/tsconfig.json @@ -4,7 +4,7 @@ "strict": true, "skipLibCheck": true, "module": "ESNext", - "moduleResolution": "bundler", + "moduleResolution": "NodeNext", "jsx": "react", "target": "ESNext", "noEmit": true diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0ed8b2ba9f17..d982ae3ff23d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -35,7 +35,7 @@ importers: version: 10.0.1 '@types/node': specifier: ^20.5.3 - version: 20.6.0 + version: 20.5.3 '@typescript-eslint/eslint-plugin': specifier: ^6.7.0 version: 6.7.0(@typescript-eslint/parser@6.7.0)(eslint@8.49.0)(typescript@5.1.6) @@ -126,6 +126,15 @@ importers: endpoint-monitor: {} + indexer/api-ts: + devDependencies: + tsup: + specifier: ^7.2.0 + version: 7.2.0(@swc/core@1.3.76)(typescript@5.1.6) + vitest: + specifier: ^0.34.4 + version: 0.34.4 + op-exporter: {} packages/chain-mon: @@ -333,7 +342,7 @@ importers: version: 5.1.6 vite: specifier: ^4.4.6 - version: 4.4.6(@types/node@20.6.0) + version: 4.4.6(@types/node@20.5.3) vitest: specifier: ^0.34.2 version: 0.34.2(jsdom@22.1.0) @@ -427,7 +436,7 @@ importers: version: 1.3.1(typescript@5.1.6) vite: specifier: ^4.4.6 - version: 4.4.6(@types/node@20.6.0) + version: 4.4.6(@types/node@20.5.3) vitest: specifier: ^0.34.2 version: 0.34.2(jsdom@22.1.0) @@ -558,7 +567,7 @@ importers: version: 1.6.0(typescript@5.1.6)(zod@3.22.0) vite: specifier: ^4.4.9 - version: 4.4.9(@types/node@20.6.0) + version: 4.4.9(@types/node@20.5.3) vitest: specifier: ^0.34.1 version: 0.34.1 @@ -3779,7 +3788,7 @@ packages: resolution: {integrity: sha512-IO+MJPVhoqz+28h1qLAcBEH2+xHMK6MTyHJc7MTnnYb6wsoLR29POVGJ7LycmVXIqyy/4/2ShP5sUwTXuOwb/w==} dependencies: '@types/minimatch': 5.1.2 - '@types/node': 20.6.0 + '@types/node': 20.5.3 dev: true /@types/is-ci@3.0.0: @@ -3848,7 +3857,7 @@ packages: /@types/morgan@1.9.4: resolution: {integrity: sha512-cXoc4k+6+YAllH3ZHmx4hf7La1dzUk6keTR4bF4b4Sc0mZxU/zK4wO7l+ZzezXm/jkYj/qC+uYGZrarZdIVvyQ==} dependencies: - '@types/node': 20.6.0 + '@types/node': 20.5.3 dev: true /@types/ms@0.7.31: @@ -3872,6 +3881,10 @@ packages: resolution: {integrity: sha512-Mgq7eCtoTjT89FqNoTzzXg2XvCi5VMhRV6+I2aYanc6kQCBImeNaAYRs/DyoVqk1YEUJK5gN9VO7HRIdz4Wo3Q==} dev: true + /@types/node@20.5.3: + resolution: {integrity: sha512-ITI7rbWczR8a/S6qjAW7DMqxqFMjjTo61qZVWJ1ubPvbIQsL5D/TvwjYEalM8Kthpe3hTzOGrF2TGbAu2uyqeA==} + dev: true + /@types/node@20.6.0: resolution: {integrity: sha512-najjVq5KN2vsH2U/xyh2opaSEz6cZMR2SetLIlxlj08nOcmPOemJmUK2o4kUzfLqfrWE0PIrNeE16XhYDd3nqg==} @@ -4314,6 +4327,14 @@ packages: chai: 4.3.8 dev: true + /@vitest/expect@0.34.4: + resolution: {integrity: sha512-XlMKX8HyYUqB8dsY8Xxrc64J2Qs9pKMt2Z8vFTL4mBWXJsg4yoALHzJfDWi8h5nkO4Zua4zjqtapQ/IluVkSnA==} + dependencies: + '@vitest/spy': 0.34.4 + '@vitest/utils': 0.34.4 + chai: 4.3.8 + dev: true + /@vitest/runner@0.34.1: resolution: {integrity: sha512-YfQMpYzDsYB7yqgmlxZ06NI4LurHWfrH7Wy3Pvf/z/vwUSgq1zLAb1lWcItCzQG+NVox+VvzlKQrYEXb47645g==} dependencies: @@ -4330,6 +4351,14 @@ packages: pathe: 1.1.1 dev: true + /@vitest/runner@0.34.4: + resolution: {integrity: sha512-hwwdB1StERqUls8oV8YcpmTIpVeJMe4WgYuDongVzixl5hlYLT2G8afhcdADeDeqCaAmZcSgLTLtqkjPQF7x+w==} + dependencies: + '@vitest/utils': 0.34.4 + p-limit: 4.0.0 + pathe: 1.1.1 + dev: true + /@vitest/snapshot@0.34.1: resolution: {integrity: sha512-0O9LfLU0114OqdF8lENlrLsnn024Tb1CsS9UwG0YMWY2oGTQfPtkW+B/7ieyv0X9R2Oijhi3caB1xgGgEgclSQ==} dependencies: @@ -4346,6 +4375,14 @@ packages: pretty-format: 29.6.1 dev: true + /@vitest/snapshot@0.34.4: + resolution: {integrity: sha512-GCsh4coc3YUSL/o+BPUo7lHQbzpdttTxL6f4q0jRx2qVGoYz/cyTRDJHbnwks6TILi6560bVWoBpYC10PuTLHw==} + dependencies: + magic-string: 0.30.1 + pathe: 1.1.1 + pretty-format: 29.6.1 + dev: true + /@vitest/spy@0.34.1: resolution: {integrity: sha512-UT4WcI3EAPUNO8n6y9QoEqynGGEPmmRxC+cLzneFFXpmacivjHZsNbiKD88KUScv5DCHVDgdBsLD7O7s1enFcQ==} dependencies: @@ -4358,6 +4395,12 @@ packages: tinyspy: 2.1.1 dev: true + /@vitest/spy@0.34.4: + resolution: {integrity: sha512-PNU+fd7DUPgA3Ya924b1qKuQkonAW6hL7YUjkON3wmBwSTIlhOSpy04SJ0NrRsEbrXgMMj6Morh04BMf8k+w0g==} + dependencies: + tinyspy: 2.1.1 + dev: true + /@vitest/utils@0.34.1: resolution: {integrity: sha512-/ql9dsFi4iuEbiNcjNHQWXBum7aL8pyhxvfnD9gNtbjR9fUKAjxhj4AA3yfLXg6gJpMGGecvtF8Au2G9y3q47Q==} dependencies: @@ -4374,6 +4417,14 @@ packages: pretty-format: 29.6.1 dev: true + /@vitest/utils@0.34.4: + resolution: {integrity: sha512-yR2+5CHhp/K4ySY0Qtd+CAL9f5Yh1aXrKfAT42bq6CtlGPh92jIDDDSg7ydlRow1CP+dys4TrOrbELOyNInHSg==} + dependencies: + diff-sequences: 29.4.3 + loupe: 2.3.6 + pretty-format: 29.6.1 + dev: true + /@vue/compiler-core@3.2.36: resolution: {integrity: sha512-bbyZM5hvBicv0PW3KUfVi+x3ylHnfKG7DOn5wM+f2OztTzTjLEyBb/5yrarIYpmnGitVGbjZqDbODyW4iK8hqw==} dependencies: @@ -14600,7 +14651,7 @@ packages: - zod dev: true - /vite-node@0.34.1(@types/node@20.6.0): + /vite-node@0.34.1(@types/node@20.5.3): resolution: {integrity: sha512-odAZAL9xFMuAg8aWd7nSPT+hU8u2r9gU3LRm9QKjxBEF2rRdWpMuqkrkjvyVQEdNFiBctqr2Gg4uJYizm5Le6w==} engines: {node: '>=v14.18.0'} hasBin: true @@ -14610,7 +14661,7 @@ packages: mlly: 1.4.0 pathe: 1.1.1 picocolors: 1.0.0 - vite: 4.4.9(@types/node@20.6.0) + vite: 4.4.9(@types/node@20.5.3) transitivePeerDependencies: - '@types/node' - less @@ -14622,10 +14673,32 @@ packages: - terser dev: true - /vite-node@0.34.2(@types/node@20.6.0): + /vite-node@0.34.2(@types/node@20.5.3): resolution: {integrity: sha512-JtW249Zm3FB+F7pQfH56uWSdlltCo1IOkZW5oHBzeQo0iX4jtC7o1t9aILMGd9kVekXBP2lfJBEQt9rBh07ebA==} engines: {node: '>=v14.18.0'} hasBin: true + dependencies: + cac: 6.7.14 + debug: 4.3.4(supports-color@8.1.1) + mlly: 1.4.0 + pathe: 1.1.1 + picocolors: 1.0.0 + vite: 4.4.9(@types/node@20.5.3) + transitivePeerDependencies: + - '@types/node' + - less + - lightningcss + - sass + - stylus + - sugarss + - supports-color + - terser + dev: true + + /vite-node@0.34.4(@types/node@20.6.0): + resolution: {integrity: sha512-ho8HtiLc+nsmbwZMw8SlghESEE3KxJNp04F/jPUCLVvaURwt0d+r9LxEqCX5hvrrOQ0GSyxbYr5ZfRYhQ0yVKQ==} + engines: {node: '>=v14.18.0'} + hasBin: true dependencies: cac: 6.7.14 debug: 4.3.4(supports-color@8.1.1) @@ -14644,7 +14717,7 @@ packages: - terser dev: true - /vite@4.4.6(@types/node@20.6.0): + /vite@4.4.6(@types/node@20.5.3): resolution: {integrity: sha512-EY6Mm8vJ++S3D4tNAckaZfw3JwG3wa794Vt70M6cNJ6NxT87yhq7EC8Rcap3ahyHdo8AhCmV9PTk+vG1HiYn1A==} engines: {node: ^14.18.0 || >=16.0.0} hasBin: true @@ -14672,7 +14745,7 @@ packages: terser: optional: true dependencies: - '@types/node': 20.6.0 + '@types/node': 20.5.3 esbuild: 0.18.15 postcss: 8.4.27 rollup: 3.26.3 @@ -14680,6 +14753,42 @@ packages: fsevents: 2.3.2 dev: true + /vite@4.4.9(@types/node@20.5.3): + resolution: {integrity: sha512-2mbUn2LlUmNASWwSCNSJ/EG2HuSRTnVNaydp6vMCm5VIqJsjMfbIWtbH2kDuwUVW5mMUKKZvGPX/rqeqVvv1XA==} + engines: {node: ^14.18.0 || >=16.0.0} + hasBin: true + peerDependencies: + '@types/node': '>= 14' + less: '*' + lightningcss: ^1.21.0 + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + dependencies: + '@types/node': 20.5.3 + esbuild: 0.18.15 + postcss: 8.4.27 + rollup: 3.28.0 + optionalDependencies: + fsevents: 2.3.2 + dev: true + /vite@4.4.9(@types/node@20.6.0): resolution: {integrity: sha512-2mbUn2LlUmNASWwSCNSJ/EG2HuSRTnVNaydp6vMCm5VIqJsjMfbIWtbH2kDuwUVW5mMUKKZvGPX/rqeqVvv1XA==} engines: {node: ^14.18.0 || >=16.0.0} @@ -14749,7 +14858,7 @@ packages: dependencies: '@types/chai': 4.3.6 '@types/chai-subset': 1.3.3 - '@types/node': 20.6.0 + '@types/node': 20.5.3 '@vitest/expect': 0.34.1 '@vitest/runner': 0.34.1 '@vitest/snapshot': 0.34.1 @@ -14768,8 +14877,8 @@ packages: strip-literal: 1.0.1 tinybench: 2.5.0 tinypool: 0.7.0 - vite: 4.4.9(@types/node@20.6.0) - vite-node: 0.34.1(@types/node@20.6.0) + vite: 4.4.9(@types/node@20.5.3) + vite-node: 0.34.1(@types/node@20.5.3) why-is-node-running: 2.2.2 transitivePeerDependencies: - less @@ -14814,7 +14923,7 @@ packages: dependencies: '@types/chai': 4.3.6 '@types/chai-subset': 1.3.3 - '@types/node': 20.6.0 + '@types/node': 20.5.3 '@vitest/expect': 0.34.2 '@vitest/runner': 0.34.2 '@vitest/snapshot': 0.34.2 @@ -14834,8 +14943,73 @@ packages: strip-literal: 1.0.1 tinybench: 2.5.0 tinypool: 0.7.0 + vite: 4.4.9(@types/node@20.5.3) + vite-node: 0.34.2(@types/node@20.5.3) + why-is-node-running: 2.2.2 + transitivePeerDependencies: + - less + - lightningcss + - sass + - stylus + - sugarss + - supports-color + - terser + dev: true + + /vitest@0.34.4: + resolution: {integrity: sha512-SE/laOsB6995QlbSE6BtkpXDeVNLJc1u2LHRG/OpnN4RsRzM3GQm4nm3PQCK5OBtrsUqnhzLdnT7se3aeNGdlw==} + engines: {node: '>=v14.18.0'} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@vitest/browser': '*' + '@vitest/ui': '*' + happy-dom: '*' + jsdom: '*' + playwright: '*' + safaridriver: '*' + webdriverio: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@vitest/browser': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + playwright: + optional: true + safaridriver: + optional: true + webdriverio: + optional: true + dependencies: + '@types/chai': 4.3.6 + '@types/chai-subset': 1.3.3 + '@types/node': 20.6.0 + '@vitest/expect': 0.34.4 + '@vitest/runner': 0.34.4 + '@vitest/snapshot': 0.34.4 + '@vitest/spy': 0.34.4 + '@vitest/utils': 0.34.4 + acorn: 8.10.0 + acorn-walk: 8.2.0 + cac: 6.7.14 + chai: 4.3.8 + debug: 4.3.4(supports-color@8.1.1) + local-pkg: 0.4.3 + magic-string: 0.30.1 + pathe: 1.1.1 + picocolors: 1.0.0 + std-env: 3.3.3 + strip-literal: 1.0.1 + tinybench: 2.5.0 + tinypool: 0.7.0 vite: 4.4.9(@types/node@20.6.0) - vite-node: 0.34.2(@types/node@20.6.0) + vite-node: 0.34.4(@types/node@20.6.0) why-is-node-running: 2.2.2 transitivePeerDependencies: - less diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 1162641e603d..e7993650e8ce 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -2,4 +2,4 @@ packages: - 'packages/*' - 'endpoint-monitor' - 'op-exporter' - - 'indexer/ts' + - 'indexer/api-ts' From 049a99eeac6b2a46bee6921ff7072477eefab495 Mon Sep 17 00:00:00 2001 From: Will Cory Date: Fri, 15 Sep 2023 08:25:09 -0700 Subject: [PATCH 12/87] bump version --- indexer/api-ts/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indexer/api-ts/package.json b/indexer/api-ts/package.json index faa3eda8da29..8c5db276e69d 100644 --- a/indexer/api-ts/package.json +++ b/indexer/api-ts/package.json @@ -1,6 +1,6 @@ { "name": "@eth-optimism/indexer-api", - "version": "0.0.1", + "version": "0.0.2", "description": "[Optimism] typescript types for the indexer service", "main": "indexer.cjs", "module": "indexer.js", From 5e2b2d09a4eba0357fd2b63cb49a4928cbdf8c83 Mon Sep 17 00:00:00 2001 From: Will Cory Date: Fri, 15 Sep 2023 08:42:43 -0700 Subject: [PATCH 13/87] fix: Fix json tags --- .circleci/config.yml | 2 +- indexer/api-ts/generated.ts | 18 +++++++++--------- indexer/api-ts/package.json | 2 +- indexer/api/routes/deposits.go | 10 +++++----- indexer/api/routes/withdrawals.go | 8 ++++---- 5 files changed, 20 insertions(+), 20 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 985e3b688c57..dccfe0c55cba 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -889,7 +889,7 @@ jobs: working_directory: indexer - run: name: Install node_modules - command: pnpm install --frozen-lockfile --offline + command: pnpm install --frozen-lockfile --prefer-offline working_directory: indexer/api-ts - run: name: Install tygo diff --git a/indexer/api-ts/generated.ts b/indexer/api-ts/generated.ts index 7b0b1616de39..8ea406bcc2b3 100644 --- a/indexer/api-ts/generated.ts +++ b/indexer/api-ts/generated.ts @@ -8,12 +8,12 @@ export interface DepositItem { from: string; to: string; timestamp: number /* uint64 */; - L1TxHash: string; - L2TxHash: string; - Block: string; + l1BlockHash: string; + l1TxHash: string; + l2TxHash: string; amount: string; - l1Token: string; - l2Token: string; + l1TokenAddress: string; + l2TokenAddress: string; } export interface DepositResponse { cursor: string; @@ -41,10 +41,10 @@ export interface WithdrawalItem { timestamp: number /* uint64 */; l2BlockHash: string; amount: string; - proof: string; - claim: string; - l1Token: string; - l2Token: string; + proofTransactionHash: string; + claimTransactionHash: string; + l1TokenAddress: string; + l2TokenAddress: string; } export interface WithdrawalResponse { cursor: string; diff --git a/indexer/api-ts/package.json b/indexer/api-ts/package.json index 8c5db276e69d..e16a5ef6f301 100644 --- a/indexer/api-ts/package.json +++ b/indexer/api-ts/package.json @@ -1,6 +1,6 @@ { "name": "@eth-optimism/indexer-api", - "version": "0.0.2", + "version": "0.0.3", "description": "[Optimism] typescript types for the indexer service", "main": "indexer.cjs", "module": "indexer.js", diff --git a/indexer/api/routes/deposits.go b/indexer/api/routes/deposits.go index 20078655e66a..b0ef23b6d9ec 100644 --- a/indexer/api/routes/deposits.go +++ b/indexer/api/routes/deposits.go @@ -14,12 +14,12 @@ type DepositItem struct { From string `json:"from"` To string `json:"to"` Timestamp uint64 `json:"timestamp"` - L1TxHash string `json:"L1TxHash"` - L2TxHash string `json:"L2TxHash"` - L1BlockHash string `json:"Block"` + L1BlockHash string `json:"l1BlockHash"` + L1TxHash string `json:"l1TxHash"` + L2TxHash string `json:"l2TxHash"` Amount string `json:"amount"` - L1TokenAddress string `json:"l1Token"` - L2TokenAddress string `json:"l2Token"` + L1TokenAddress string `json:"l1TokenAddress"` + L2TokenAddress string `json:"l2TokenAddress"` } type DepositResponse struct { diff --git a/indexer/api/routes/withdrawals.go b/indexer/api/routes/withdrawals.go index 675299b8bc39..a04f4e3afd98 100644 --- a/indexer/api/routes/withdrawals.go +++ b/indexer/api/routes/withdrawals.go @@ -17,10 +17,10 @@ type WithdrawalItem struct { Timestamp uint64 `json:"timestamp"` L2BlockHash string `json:"l2BlockHash"` Amount string `json:"amount"` - ProofTransactionHash string `json:"proof"` - ClaimTransactionHash string `json:"claim"` - L1TokenAddress string `json:"l1Token"` - L2TokenAddress string `json:"l2Token"` + ProofTransactionHash string `json:"proofTransactionHash"` + ClaimTransactionHash string `json:"claimTransactionHash"` + L1TokenAddress string `json:"l1TokenAddress"` + L2TokenAddress string `json:"l2TokenAddress"` } type WithdrawalResponse struct { From 0ecc2df598036f3aedb207eaf5ed15cad09b17bd Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 15 Sep 2023 20:10:49 +0000 Subject: [PATCH 14/87] build(deps-dev): bump @types/node from 20.5.0 to 20.6.1 Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 20.5.0 to 20.6.1. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node) --- updated-dependencies: - dependency-name: "@types/node" dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- pnpm-lock.yaml | 48 ++++++++++++++++++++++++++---------------------- 1 file changed, 26 insertions(+), 22 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0ed8b2ba9f17..43149e85590b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -175,7 +175,7 @@ importers: version: 2.17.2(ts-node@10.9.1)(typescript@5.2.2) ts-node: specifier: ^10.9.1 - version: 10.9.1(@types/node@20.6.0)(typescript@5.2.2) + version: 10.9.1(@types/node@20.6.1)(typescript@5.2.2) tsx: specifier: ^3.12.7 version: 3.12.7 @@ -3707,20 +3707,20 @@ packages: /@types/bn.js@4.11.6: resolution: {integrity: sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==} dependencies: - '@types/node': 20.6.0 + '@types/node': 20.6.1 dev: true /@types/bn.js@5.1.0: resolution: {integrity: sha512-QSSVYj7pYFN49kW77o2s9xTCwZ8F2xLbjLLSEVh8D2F4JUhZtPAGOFLTD+ffqksBx/u4cE/KImFjyhqCjn/LIA==} dependencies: - '@types/node': 20.6.0 + '@types/node': 20.6.1 dev: true /@types/body-parser@1.19.1: resolution: {integrity: sha512-a6bTJ21vFOGIkwM0kzh9Yr89ziVxq4vYH2fQ6N8AeipEzai/cFK6aGMArIkUeIdRIgpwQa+2bXiLuUJCpSf2Cg==} dependencies: '@types/connect': 3.4.35 - '@types/node': 20.6.0 + '@types/node': 20.6.1 dev: true /@types/chai-as-promised@7.1.5: @@ -3746,7 +3746,7 @@ packages: /@types/connect@3.4.35: resolution: {integrity: sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==} dependencies: - '@types/node': 20.6.0 + '@types/node': 20.6.1 /@types/dateformat@5.0.0: resolution: {integrity: sha512-SZg4JdHIWHQGEokbYGZSDvo5wA4TLYPXaqhigs/wH+REDOejcJzgH+qyY+HtEUtWOZxEUkbhbdYPqQDiEgrXeA==} @@ -3760,7 +3760,7 @@ packages: /@types/express-serve-static-core@4.17.35: resolution: {integrity: sha512-wALWQwrgiB2AWTT91CB62b6Yt0sNHpznUXeZEcnPU3DRdlDIz74x8Qg1UUYKSVFi+va5vKOLYRBI1bRKiLLKIg==} dependencies: - '@types/node': 20.6.0 + '@types/node': 20.6.1 '@types/qs': 6.9.7 '@types/range-parser': 1.2.4 '@types/send': 0.17.1 @@ -3806,7 +3806,7 @@ packages: dependencies: '@types/abstract-leveldown': 5.0.2 '@types/level-errors': 3.0.0 - '@types/node': 20.6.0 + '@types/node': 20.6.1 dev: true /@types/lru-cache@5.1.1: @@ -3838,7 +3838,7 @@ packages: /@types/mkdirp@0.5.2: resolution: {integrity: sha512-U5icWpv7YnZYGsN4/cmh3WD2onMY0aJIiTE6+51TwJCttdHvtCYmkBNOobHlXwrJRL0nkH9jH4kD+1FAdMN4Tg==} dependencies: - '@types/node': 20.6.0 + '@types/node': 20.6.1 dev: true /@types/mocha@10.0.1: @@ -3857,7 +3857,7 @@ packages: /@types/node-fetch@2.6.4: resolution: {integrity: sha512-1ZX9fcN4Rvkvgv4E6PAY5WXUFWFcRWxZa3EW83UjycOB9ljJCedb2CupIP4RZMEwF/M3eTcCihbBRgwtGbg5Rg==} dependencies: - '@types/node': 20.6.0 + '@types/node': 20.6.1 form-data: 3.0.1 dev: true @@ -3874,6 +3874,10 @@ packages: /@types/node@20.6.0: resolution: {integrity: sha512-najjVq5KN2vsH2U/xyh2opaSEz6cZMR2SetLIlxlj08nOcmPOemJmUK2o4kUzfLqfrWE0PIrNeE16XhYDd3nqg==} + dev: true + + /@types/node@20.6.1: + resolution: {integrity: sha512-4LcJvuXQlv4lTHnxwyHQZ3uR9Zw2j7m1C9DfuwoTFQQP4Pmu04O6IfLYgMmHoOCt0nosItLLZAH+sOrRE0Bo8g==} /@types/normalize-package-data@2.4.1: resolution: {integrity: sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==} @@ -3885,7 +3889,7 @@ packages: /@types/pbkdf2@3.1.0: resolution: {integrity: sha512-Cf63Rv7jCQ0LaL8tNXmEyqTHuIJxRdlS5vMh1mj5voN4+QFhVZnlZruezqpWYDiJ8UTzhP0VmeLXCmBk66YrMQ==} dependencies: - '@types/node': 20.6.0 + '@types/node': 20.6.1 dev: true /@types/pino-multi-stream@5.1.3: @@ -3903,13 +3907,13 @@ packages: /@types/pino-std-serializers@2.4.1: resolution: {integrity: sha512-17XcksO47M24IVTVKPeAByWUd3Oez7EbIjXpSbzMPhXVzgjGtrOa49gKBwxH9hb8dKv58OelsWQ+A1G1l9S3wQ==} dependencies: - '@types/node': 20.6.0 + '@types/node': 20.6.1 dev: true /@types/pino@6.3.11: resolution: {integrity: sha512-S7+fLONqSpHeW9d7TApUqO6VN47KYgOXhCNKwGBVLHObq8HhaAYlVqUNdfnvoXjCMiwE5xcPm/5R2ZUh8bgaXQ==} dependencies: - '@types/node': 20.6.0 + '@types/node': 20.6.1 '@types/pino-pretty': 4.7.1 '@types/pino-std-serializers': 2.4.1 sonic-boom: 2.8.0 @@ -3955,7 +3959,7 @@ packages: /@types/readable-stream@2.3.15: resolution: {integrity: sha512-oM5JSKQCcICF1wvGgmecmHldZ48OZamtMxcGGVICOJA8o8cahXC1zEVAif8iwoc5j8etxFaRFnf095+CDsuoFQ==} dependencies: - '@types/node': 20.6.0 + '@types/node': 20.6.1 safe-buffer: 5.1.2 dev: true @@ -3966,7 +3970,7 @@ packages: /@types/secp256k1@4.0.3: resolution: {integrity: sha512-Da66lEIFeIz9ltsdMZcpQvmrmmoqrfju8pm1BH8WbYjZSwUgCwXLb9C+9XYogwBITnbsSaMdVPb2ekf7TV+03w==} dependencies: - '@types/node': 20.6.0 + '@types/node': 20.6.1 dev: true /@types/seedrandom@3.0.1: @@ -3985,14 +3989,14 @@ packages: resolution: {integrity: sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q==} dependencies: '@types/mime': 1.3.2 - '@types/node': 20.6.0 + '@types/node': 20.6.1 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.6.0 + '@types/node': 20.6.1 dev: true /@types/sinon-chai@3.2.5: @@ -4029,18 +4033,18 @@ packages: /@types/ws@7.4.7: resolution: {integrity: sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==} dependencies: - '@types/node': 20.6.0 + '@types/node': 20.6.1 /@types/ws@8.5.3: resolution: {integrity: sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w==} dependencies: - '@types/node': 20.6.0 + '@types/node': 20.6.1 dev: false /@types/ws@8.5.5: resolution: {integrity: sha512-lwhs8hktwxSjf9UaZ9tG5M03PGogvFaH8gUgLNbN9HKIg0dvv6q+gkSuJ8HN4/VbyxkuLzCjlN7GquQ0gUJfIg==} dependencies: - '@types/node': 20.6.0 + '@types/node': 20.6.1 dev: true /@typescript-eslint/eslint-plugin@6.7.0(@typescript-eslint/parser@6.4.0)(eslint@8.49.0)(typescript@5.1.6): @@ -9126,7 +9130,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.6.0)(typescript@5.2.2) + ts-node: 10.9.1(@types/node@20.6.1)(typescript@5.2.2) tsort: 0.0.1 typescript: 5.2.2 undici: 5.24.0 @@ -13889,7 +13893,7 @@ packages: yn: 3.1.1 dev: true - /ts-node@10.9.1(@types/node@20.6.0)(typescript@5.2.2): + /ts-node@10.9.1(@types/node@20.6.1)(typescript@5.2.2): resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} hasBin: true peerDependencies: @@ -13908,7 +13912,7 @@ packages: '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 20.6.0 + '@types/node': 20.6.1 acorn: 8.10.0 acorn-walk: 8.2.0 arg: 4.1.3 From 8ab7c2c12e1f6d2a70abc0067bea5dbcbda8216e Mon Sep 17 00:00:00 2001 From: Will Cory Date: Fri, 15 Sep 2023 13:27:32 -0700 Subject: [PATCH 15/87] feat(indexer): Enable devnet indexer as a preset --- indexer/config/config.go | 18 ++++++--- indexer/config/devnet.go | 80 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 92 insertions(+), 6 deletions(-) create mode 100644 indexer/config/devnet.go diff --git a/indexer/config/config.go b/indexer/config/config.go index d370c0eda586..25e01209b38a 100644 --- a/indexer/config/config.go +++ b/indexer/config/config.go @@ -140,6 +140,10 @@ type ServerConfig struct { Port int `toml:"port"` } +var ( + DEVNET_CHAIN_ID = 901 +) + // LoadConfig loads the `indexer.toml` config file from a given path func LoadConfig(log log.Logger, path string) (Config, error) { log.Debug("loading config", "path", path) @@ -157,18 +161,20 @@ func LoadConfig(log log.Logger, path string) (Config, error) { return conf, err } - if conf.Chain.Preset != 0 { + if conf.Chain.Preset == DEVNET_CHAIN_ID { + preset, err := GetDevnetPreset() + if err != nil { + return conf, err + } + conf.Chain = preset.ChainConfig + } else if conf.Chain.Preset != 0 { preset, ok := Presets[conf.Chain.Preset] if !ok { return conf, fmt.Errorf("unknown preset: %d", conf.Chain.Preset) } - log.Info("detected preset", "preset", conf.Chain.Preset, "name", preset.Name) log.Info("setting L1 information from preset") - conf.Chain.L1Contracts = preset.ChainConfig.L1Contracts - conf.Chain.L1StartingHeight = preset.ChainConfig.L1StartingHeight - conf.Chain.L1BedrockStartingHeight = preset.ChainConfig.L1BedrockStartingHeight - conf.Chain.L2BedrockStartingHeight = preset.ChainConfig.L1BedrockStartingHeight + conf.Chain = preset.ChainConfig } // Setup L2Contracts from predeploys diff --git a/indexer/config/devnet.go b/indexer/config/devnet.go new file mode 100644 index 000000000000..17377c10405d --- /dev/null +++ b/indexer/config/devnet.go @@ -0,0 +1,80 @@ +package config + +import ( + "encoding/json" + "io/ioutil" + "os" + + "github.com/ethereum/go-ethereum/common" +) + +type ethereumContracts struct { + AddressManager string `json:"AddressManager"` + BlockOracle string `json:"BlockOracle"` + DisputeGameFactory string `json:"DisputeGameFactory"` + DisputeGameFactoryProxy string `json:"DisputeGameFactoryProxy"` + L1CrossDomainMessenger string `json:"L1CrossDomainMessenger"` + L1CrossDomainMessengerProxy string `json:"L1CrossDomainMessengerProxy"` + L1ERC721Bridge string `json:"L1ERC721Bridge"` + L1ERC721BridgeProxy string `json:"L1ERC721BridgeProxy"` + L1StandardBridge string `json:"L1StandardBridge"` + L1StandardBridgeProxy string `json:"L1StandardBridgeProxy"` + L2OutputOracle string `json:"L2OutputOracle"` + L2OutputOracleProxy string `json:"L2OutputOracleProxy"` + Mips string `json:"Mips"` + OptimismMintableERC20Factory string `json:"OptimismMintableERC20Factory"` + OptimismMintableERC20FactoryProxy string `json:"OptimismMintableERC20FactoryProxy"` + OptimismPortal string `json:"OptimismPortal"` + OptimismPortalProxy string `json:"OptimismPortalProxy"` + PreimageOracle string `json:"PreimageOracle"` + ProxyAdmin string `json:"ProxyAdmin"` + SystemConfig string `json:"SystemConfig"` + SystemConfigProxy string `json:"SystemConfigProxy"` +} + +func readEthereumContracts(filename string) (*ethereumContracts, error) { + // Check if the file exists + if _, err := os.Stat(filename); os.IsNotExist(err) { + return nil, err + } + + // Read the file + content, err := ioutil.ReadFile(filename) + if err != nil { + return nil, err + } + + // Unmarshal the JSON + var contracts ethereumContracts + if err := json.Unmarshal(content, &contracts); err != nil { + return nil, err + } + + return &contracts, nil +} + +func GetDevnetPreset() (*Preset, error) { + ethereumContracts, err := readEthereumContracts("../.devnet/addresses.json") + if err != nil { + return nil, err + } + return &Preset{ + Name: "devnet", + ChainConfig: ChainConfig{ + L1StartingHeight: 0, + L1BedrockStartingHeight: 0, + L2BedrockStartingHeight: 0, + L1Contracts: L1Contracts{ + AddressManager: common.HexToAddress(ethereumContracts.AddressManager), + SystemConfigProxy: common.HexToAddress(ethereumContracts.SystemConfigProxy), + OptimismPortalProxy: common.HexToAddress(ethereumContracts.OptimismPortalProxy), + L2OutputOracleProxy: common.HexToAddress(ethereumContracts.L2OutputOracleProxy), + L1CrossDomainMessengerProxy: common.HexToAddress(ethereumContracts.L1CrossDomainMessengerProxy), + L1StandardBridgeProxy: common.HexToAddress(ethereumContracts.L1StandardBridgeProxy), + L1ERC721BridgeProxy: common.HexToAddress(ethereumContracts.L1ERC721BridgeProxy), + LegacyCanonicalTransactionChain: common.HexToAddress("0x0"), + LegacyStateCommitmentChain: common.HexToAddress("0x0"), + }, + }, + }, nil +} From beb36a70e7ea4cd7829ec3eda9bf45bd4e8a7d33 Mon Sep 17 00:00:00 2001 From: Will Cory Date: Fri, 15 Sep 2023 15:13:46 -0700 Subject: [PATCH 16/87] comments --- indexer/config/config.go | 6 +--- indexer/config/devnet.go | 62 ++++++++-------------------------------- 2 files changed, 13 insertions(+), 55 deletions(-) diff --git a/indexer/config/config.go b/indexer/config/config.go index 25e01209b38a..a6e709285284 100644 --- a/indexer/config/config.go +++ b/indexer/config/config.go @@ -140,10 +140,6 @@ type ServerConfig struct { Port int `toml:"port"` } -var ( - DEVNET_CHAIN_ID = 901 -) - // LoadConfig loads the `indexer.toml` config file from a given path func LoadConfig(log log.Logger, path string) (Config, error) { log.Debug("loading config", "path", path) @@ -161,7 +157,7 @@ func LoadConfig(log log.Logger, path string) (Config, error) { return conf, err } - if conf.Chain.Preset == DEVNET_CHAIN_ID { + if conf.Chain.Preset == DEVNET_L2_CHAIN_ID { preset, err := GetDevnetPreset() if err != nil { return conf, err diff --git a/indexer/config/devnet.go b/indexer/config/devnet.go index 17377c10405d..411cfd3b98af 100644 --- a/indexer/config/devnet.go +++ b/indexer/config/devnet.go @@ -2,59 +2,31 @@ package config import ( "encoding/json" - "io/ioutil" + "errors" + "io/fs" "os" - - "github.com/ethereum/go-ethereum/common" ) -type ethereumContracts struct { - AddressManager string `json:"AddressManager"` - BlockOracle string `json:"BlockOracle"` - DisputeGameFactory string `json:"DisputeGameFactory"` - DisputeGameFactoryProxy string `json:"DisputeGameFactoryProxy"` - L1CrossDomainMessenger string `json:"L1CrossDomainMessenger"` - L1CrossDomainMessengerProxy string `json:"L1CrossDomainMessengerProxy"` - L1ERC721Bridge string `json:"L1ERC721Bridge"` - L1ERC721BridgeProxy string `json:"L1ERC721BridgeProxy"` - L1StandardBridge string `json:"L1StandardBridge"` - L1StandardBridgeProxy string `json:"L1StandardBridgeProxy"` - L2OutputOracle string `json:"L2OutputOracle"` - L2OutputOracleProxy string `json:"L2OutputOracleProxy"` - Mips string `json:"Mips"` - OptimismMintableERC20Factory string `json:"OptimismMintableERC20Factory"` - OptimismMintableERC20FactoryProxy string `json:"OptimismMintableERC20FactoryProxy"` - OptimismPortal string `json:"OptimismPortal"` - OptimismPortalProxy string `json:"OptimismPortalProxy"` - PreimageOracle string `json:"PreimageOracle"` - ProxyAdmin string `json:"ProxyAdmin"` - SystemConfig string `json:"SystemConfig"` - SystemConfigProxy string `json:"SystemConfigProxy"` -} +var ( + filePath = "../.devnet/addresses.json" + DEVNET_L2_CHAIN_ID = 901 +) -func readEthereumContracts(filename string) (*ethereumContracts, error) { - // Check if the file exists - if _, err := os.Stat(filename); os.IsNotExist(err) { +func GetDevnetPreset() (*Preset, error) { + if _, err := os.Stat(filePath); errors.Is(err, fs.ErrNotExist) { return nil, err } - // Read the file - content, err := ioutil.ReadFile(filename) + content, err := os.ReadFile(filePath) if err != nil { return nil, err } - // Unmarshal the JSON - var contracts ethereumContracts - if err := json.Unmarshal(content, &contracts); err != nil { + var l1Contracts L1Contracts + if err := json.Unmarshal(content, &l1Contracts); err != nil { return nil, err } - return &contracts, nil -} - -func GetDevnetPreset() (*Preset, error) { - ethereumContracts, err := readEthereumContracts("../.devnet/addresses.json") if err != nil { return nil, err } @@ -64,17 +36,7 @@ func GetDevnetPreset() (*Preset, error) { L1StartingHeight: 0, L1BedrockStartingHeight: 0, L2BedrockStartingHeight: 0, - L1Contracts: L1Contracts{ - AddressManager: common.HexToAddress(ethereumContracts.AddressManager), - SystemConfigProxy: common.HexToAddress(ethereumContracts.SystemConfigProxy), - OptimismPortalProxy: common.HexToAddress(ethereumContracts.OptimismPortalProxy), - L2OutputOracleProxy: common.HexToAddress(ethereumContracts.L2OutputOracleProxy), - L1CrossDomainMessengerProxy: common.HexToAddress(ethereumContracts.L1CrossDomainMessengerProxy), - L1StandardBridgeProxy: common.HexToAddress(ethereumContracts.L1StandardBridgeProxy), - L1ERC721BridgeProxy: common.HexToAddress(ethereumContracts.L1ERC721BridgeProxy), - LegacyCanonicalTransactionChain: common.HexToAddress("0x0"), - LegacyStateCommitmentChain: common.HexToAddress("0x0"), - }, + L1Contracts: l1Contracts, }, }, nil } From e8fc677e027a30c0af420d86e6c952da0a725d3b Mon Sep 17 00:00:00 2001 From: Will Cory Date: Fri, 15 Sep 2023 15:40:54 -0700 Subject: [PATCH 17/87] fix: Include preset in presets --- indexer/config/config.go | 1 + indexer/config/devnet.go | 1 + indexer/config/presets.go | 6 ++++++ 3 files changed, 8 insertions(+) diff --git a/indexer/config/config.go b/indexer/config/config.go index a6e709285284..62b5014c6973 100644 --- a/indexer/config/config.go +++ b/indexer/config/config.go @@ -171,6 +171,7 @@ func LoadConfig(log log.Logger, path string) (Config, error) { log.Info("detected preset", "preset", conf.Chain.Preset, "name", preset.Name) log.Info("setting L1 information from preset") conf.Chain = preset.ChainConfig + log.Info(conf.Chain.L1Contracts.AddressManager.String()) } // Setup L2Contracts from predeploys diff --git a/indexer/config/devnet.go b/indexer/config/devnet.go index 411cfd3b98af..d1927b5f7823 100644 --- a/indexer/config/devnet.go +++ b/indexer/config/devnet.go @@ -33,6 +33,7 @@ func GetDevnetPreset() (*Preset, error) { return &Preset{ Name: "devnet", ChainConfig: ChainConfig{ + Preset: DEVNET_L2_CHAIN_ID, L1StartingHeight: 0, L1BedrockStartingHeight: 0, L2BedrockStartingHeight: 0, diff --git a/indexer/config/presets.go b/indexer/config/presets.go index a455b8e8553d..59e02be4feb3 100644 --- a/indexer/config/presets.go +++ b/indexer/config/presets.go @@ -16,6 +16,7 @@ var Presets = map[int]Preset{ 10: { Name: "Optimism", ChainConfig: ChainConfig{ + Preset: 10, L1Contracts: L1Contracts{ AddressManager: common.HexToAddress("0xdE1FCfB0851916CA5101820A69b13a4E276bd81F"), SystemConfigProxy: common.HexToAddress("0x229047fed2591dbec1eF1118d64F7aF3dB9EB290"), @@ -37,6 +38,7 @@ var Presets = map[int]Preset{ 420: { Name: "Optimism Goerli", ChainConfig: ChainConfig{ + Preset: 420, L1Contracts: L1Contracts{ AddressManager: common.HexToAddress("0xa6f73589243a6A7a9023b1Fa0651b1d89c177111"), SystemConfigProxy: common.HexToAddress("0xAe851f927Ee40dE99aaBb7461C00f9622ab91d60"), @@ -58,6 +60,7 @@ var Presets = map[int]Preset{ 8453: { Name: "Base", ChainConfig: ChainConfig{ + Preset: 8453, L1Contracts: L1Contracts{ AddressManager: common.HexToAddress("0x8EfB6B5c4767B09Dc9AA6Af4eAA89F749522BaE2"), SystemConfigProxy: common.HexToAddress("0x73a79Fab69143498Ed3712e519A88a918e1f4072"), @@ -73,6 +76,7 @@ var Presets = map[int]Preset{ 84531: { Name: "Base Goerli", ChainConfig: ChainConfig{ + Preset: 84531, L1Contracts: L1Contracts{ AddressManager: common.HexToAddress("0x4Cf6b56b14c6CFcB72A75611080514F94624c54e"), SystemConfigProxy: common.HexToAddress("0xb15eea247eCE011C68a614e4a77AD648ff495bc1"), @@ -88,6 +92,7 @@ var Presets = map[int]Preset{ 7777777: { Name: "Zora", ChainConfig: ChainConfig{ + Preset: 7777777, L1Contracts: L1Contracts{ AddressManager: common.HexToAddress("0xEF8115F2733fb2033a7c756402Fc1deaa56550Ef"), SystemConfigProxy: common.HexToAddress("0xA3cAB0126d5F504B071b81a3e8A2BBBF17930d86"), @@ -103,6 +108,7 @@ var Presets = map[int]Preset{ 999: { Name: "Zora Goerli", ChainConfig: ChainConfig{ + Preset: 999, L1Contracts: L1Contracts{ AddressManager: common.HexToAddress("0x54f4676203dEDA6C08E0D40557A119c602bFA246"), SystemConfigProxy: common.HexToAddress("0xF66C9A5E4fE1A8a9bc44a4aF80505a4C3620Ee64"), From 73f16c19fce70e103f7cb4da98abe4b86943e25c Mon Sep 17 00:00:00 2001 From: inphi Date: Sun, 17 Sep 2023 13:44:31 -0400 Subject: [PATCH 18/87] op-program: Use hardcoded chain config when available Fixes a bug where the host incorrectly informs the client that a custom chain config is in use. The client then attempts to read the chain config pre-image data. However, this pre-image data will not be available in on-chain contexts. --- op-program/host/config/config.go | 53 ++++++++++++++++----------- op-program/host/config/config_test.go | 17 ++++++++- op-program/host/kvstore/local.go | 10 ++++- op-program/host/kvstore/local_test.go | 3 +- 4 files changed, 57 insertions(+), 26 deletions(-) diff --git a/op-program/host/config/config.go b/op-program/host/config/config.go index f8b7c9df1a1b..4b69f881837e 100644 --- a/op-program/host/config/config.go +++ b/op-program/host/config/config.go @@ -64,6 +64,9 @@ type Config struct { // ServerMode indicates that the program should run in pre-image server mode and wait for requests. // No client program is run. ServerMode bool + + // IsCustomChainConfig indicates that the program uses a custom chain configuration + IsCustomChainConfig bool } func (c *Config) Check() error { @@ -117,15 +120,18 @@ func NewConfig( l2Claim common.Hash, l2ClaimBlockNum uint64, ) *Config { + _, err := params.LoadOPStackChainConfig(l2Genesis.ChainID.Uint64()) + isCustomConfig := err != nil return &Config{ - Rollup: rollupCfg, - L2ChainConfig: l2Genesis, - L1Head: l1Head, - L2Head: l2Head, - L2OutputRoot: l2OutputRoot, - L2Claim: l2Claim, - L2ClaimBlockNumber: l2ClaimBlockNum, - L1RPCKind: sources.RPCKindBasic, + Rollup: rollupCfg, + L2ChainConfig: l2Genesis, + L1Head: l1Head, + L2Head: l2Head, + L2OutputRoot: l2OutputRoot, + L2Claim: l2Claim, + L2ClaimBlockNumber: l2ClaimBlockNum, + L1RPCKind: sources.RPCKindBasic, + IsCustomChainConfig: isCustomConfig, } } @@ -156,6 +162,7 @@ func NewConfigFromCLI(log log.Logger, ctx *cli.Context) (*Config, error) { } l2GenesisPath := ctx.String(flags.L2GenesisPath.Name) var l2ChainConfig *params.ChainConfig + var isCustomConfig bool if l2GenesisPath == "" { networkName := ctx.String(flags.Network.Name) ch := chaincfg.ChainByName(networkName) @@ -169,25 +176,27 @@ func NewConfigFromCLI(log log.Logger, ctx *cli.Context) (*Config, error) { l2ChainConfig = cfg } else { l2ChainConfig, err = loadChainConfigFromGenesis(l2GenesisPath) + isCustomConfig = true } if err != nil { return nil, fmt.Errorf("invalid genesis: %w", err) } return &Config{ - Rollup: rollupCfg, - DataDir: ctx.String(flags.DataDir.Name), - L2URL: ctx.String(flags.L2NodeAddr.Name), - L2ChainConfig: l2ChainConfig, - L2Head: l2Head, - L2OutputRoot: l2OutputRoot, - L2Claim: l2Claim, - L2ClaimBlockNumber: l2ClaimBlockNum, - L1Head: l1Head, - L1URL: ctx.String(flags.L1NodeAddr.Name), - L1TrustRPC: ctx.Bool(flags.L1TrustRPC.Name), - L1RPCKind: sources.RPCProviderKind(ctx.String(flags.L1RPCProviderKind.Name)), - ExecCmd: ctx.String(flags.Exec.Name), - ServerMode: ctx.Bool(flags.Server.Name), + Rollup: rollupCfg, + DataDir: ctx.String(flags.DataDir.Name), + L2URL: ctx.String(flags.L2NodeAddr.Name), + L2ChainConfig: l2ChainConfig, + L2Head: l2Head, + L2OutputRoot: l2OutputRoot, + L2Claim: l2Claim, + L2ClaimBlockNumber: l2ClaimBlockNum, + L1Head: l1Head, + L1URL: ctx.String(flags.L1NodeAddr.Name), + L1TrustRPC: ctx.Bool(flags.L1TrustRPC.Name), + L1RPCKind: sources.RPCProviderKind(ctx.String(flags.L1RPCProviderKind.Name)), + ExecCmd: ctx.String(flags.Exec.Name), + ServerMode: ctx.Bool(flags.Server.Name), + IsCustomChainConfig: isCustomConfig, }, nil } diff --git a/op-program/host/config/config_test.go b/op-program/host/config/config_test.go index 772d1a1f7627..13f7cdcb657f 100644 --- a/op-program/host/config/config_test.go +++ b/op-program/host/config/config_test.go @@ -1,10 +1,12 @@ package config import ( + "math/big" "testing" "github.com/ethereum-optimism/optimism/op-node/chaincfg" "github.com/ethereum-optimism/optimism/op-node/rollup" + "github.com/ethereum-optimism/optimism/op-program/chainconfig" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/params" "github.com/stretchr/testify/require" @@ -12,7 +14,7 @@ import ( var ( validRollupConfig = chaincfg.Goerli - validL2Genesis = params.GoerliChainConfig + validL2Genesis = chainconfig.OPGoerliChainConfig validL1Head = common.Hash{0xaa} validL2Head = common.Hash{0xbb} validL2Claim = common.Hash{0xcc} @@ -158,6 +160,19 @@ func TestRejectExecAndServerMode(t *testing.T) { require.ErrorIs(t, err, ErrNoExecInServerMode) } +func TestIsCustomChainConfig(t *testing.T) { + t.Run("nonCustom", func(t *testing.T) { + cfg := validConfig() + require.Equal(t, cfg.IsCustomChainConfig, false) + }) + t.Run("custom", func(t *testing.T) { + customChainConfig := ¶ms.ChainConfig{ChainID: big.NewInt(0x1212121212)} + cfg := NewConfig(validRollupConfig, customChainConfig, validL1Head, validL2Head, validL2OutputRoot, validL2Claim, validL2ClaimBlockNum) + require.Equal(t, cfg.IsCustomChainConfig, true) + }) + +} + func validConfig() *Config { cfg := NewConfig(validRollupConfig, validL2Genesis, validL1Head, validL2Head, validL2OutputRoot, validL2Claim, validL2ClaimBlockNum) cfg.DataDir = "/tmp/configTest" diff --git a/op-program/host/kvstore/local.go b/op-program/host/kvstore/local.go index 5bbb4df402b4..3db9beccb7b5 100644 --- a/op-program/host/kvstore/local.go +++ b/op-program/host/kvstore/local.go @@ -38,7 +38,15 @@ func (s *LocalPreimageSource) Get(key common.Hash) ([]byte, error) { case l2ClaimBlockNumberKey: return binary.BigEndian.AppendUint64(nil, s.config.L2ClaimBlockNumber), nil case l2ChainIDKey: - return binary.BigEndian.AppendUint64(nil, client.CustomChainIDIndicator), nil + // The CustomChainIDIndicator informs the client to rely on the L2ChainConfigKey to + // read the chain config. Otherwise, it'll attempt to read a non-existent hardcoded chain config + var chainID uint64 + if s.config.IsCustomChainConfig { + chainID = client.CustomChainIDIndicator + } else { + chainID = s.config.L2ChainConfig.ChainID.Uint64() + } + return binary.BigEndian.AppendUint64(nil, chainID), nil case l2ChainConfigKey: return json.Marshal(s.config.L2ChainConfig) case rollupKey: diff --git a/op-program/host/kvstore/local_test.go b/op-program/host/kvstore/local_test.go index 911756b2643a..d3b601d45b1e 100644 --- a/op-program/host/kvstore/local_test.go +++ b/op-program/host/kvstore/local_test.go @@ -7,7 +7,6 @@ import ( "github.com/ethereum-optimism/optimism/op-node/chaincfg" preimage "github.com/ethereum-optimism/optimism/op-preimage" - "github.com/ethereum-optimism/optimism/op-program/client" "github.com/ethereum-optimism/optimism/op-program/host/config" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/params" @@ -33,7 +32,7 @@ func TestLocalPreimageSource(t *testing.T) { {"L2OutputRoot", l2OutputRootKey, cfg.L2OutputRoot.Bytes()}, {"L2Claim", l2ClaimKey, cfg.L2Claim.Bytes()}, {"L2ClaimBlockNumber", l2ClaimBlockNumberKey, binary.BigEndian.AppendUint64(nil, cfg.L2ClaimBlockNumber)}, - {"L2ChainID", l2ChainIDKey, binary.BigEndian.AppendUint64(nil, client.CustomChainIDIndicator)}, + {"L2ChainID", l2ChainIDKey, binary.BigEndian.AppendUint64(nil, cfg.L2ChainConfig.ChainID.Uint64())}, {"Rollup", rollupKey, asJson(t, cfg.Rollup)}, {"ChainConfig", l2ChainConfigKey, asJson(t, cfg.L2ChainConfig)}, {"Unknown", preimage.LocalIndexKey(1000).PreimageKey(), nil}, From 7d0e3a64808198499e86f77890dc9715d8b5872a Mon Sep 17 00:00:00 2001 From: song Date: Mon, 18 Sep 2023 09:21:13 +0800 Subject: [PATCH 19/87] Fix a typo in derivation.md ven -> even --- specs/derivation.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/specs/derivation.md b/specs/derivation.md index d5e64c18bedd..ee04a7a9c1e7 100644 --- a/specs/derivation.md +++ b/specs/derivation.md @@ -366,7 +366,7 @@ When decompressing a channel, we limit the amount of decompressed data to `MAX_R 10,000,000 bytes), in order to avoid "zip-bomb" types of attack (where a small compressed input decompresses to a humongous amount of data). If the decompressed data exceeds the limit, things proceeds as though the channel contained only the first `MAX_RLP_BYTES_PER_CHANNEL` decompressed bytes. The limit is set on RLP decoding, so all batches that -can be decoded in `MAX_RLP_BYTES_PER_CHANNEL` will be accepted ven if the size of the channel is greater than +can be decoded in `MAX_RLP_BYTES_PER_CHANNEL` will be accepted even if the size of the channel is greater than `MAX_RLP_BYTES_PER_CHANNEL`. The exact requirement is that `length(input) <= MAX_RLP_BYTES_PER_CHANNEL`. While the above pseudocode implies that all batches are known in advance, it is possible to perform streaming From 44cc8e440f2b50feb9eae6ef20ec0c0889689d16 Mon Sep 17 00:00:00 2001 From: song Date: Mon, 18 Sep 2023 16:49:16 +0800 Subject: [PATCH 20/87] Fix a typo in glossary.md it's -> its --- specs/glossary.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/specs/glossary.md b/specs/glossary.md index 8382adf9c61e..e545548cc5fa 100644 --- a/specs/glossary.md +++ b/specs/glossary.md @@ -645,7 +645,7 @@ blocks older than two L1 epochs (64 L1 [time slots][time-slot]). [address-aliasing]: glossary.md#address-aliasing -When a contract submits a [deposit][deposits] from L1 to L2, it's address (as returned by `ORIGIN` and `CALLER`) will be +When a contract submits a [deposit][deposits] from L1 to L2, its address (as returned by `ORIGIN` and `CALLER`) will be aliased with a modified representation of the address of a contract. - cf. [Deposit Specification](deposits.md#address-aliasing) From 0d1c412f2c2744a95eff58ca98734825af0184bf Mon Sep 17 00:00:00 2001 From: Andreas Bigger Date: Mon, 18 Sep 2023 11:18:04 -0400 Subject: [PATCH 21/87] Address coordinator changes --- op-challenger/game/scheduler/coordinator.go | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/op-challenger/game/scheduler/coordinator.go b/op-challenger/game/scheduler/coordinator.go index f3460bc22e4c..5cd679143324 100644 --- a/op-challenger/game/scheduler/coordinator.go +++ b/op-challenger/game/scheduler/coordinator.go @@ -64,12 +64,8 @@ func (c *coordinator) schedule(ctx context.Context, games []common.Address) erro if j, err := c.createJob(addr); err != nil { errs = append(errs, err) } else if j != nil { - if j.status == types.GameStatusInProgress { - jobs = append(jobs, *j) - c.m.RecordGameUpdateScheduled() - } else { - c.logger.Warn("Resolved game update not scheduled", "game", addr, "status", j.status) - } + jobs = append(jobs, *j) + c.m.RecordGameUpdateScheduled() } state, ok := c.states[addr] if ok { @@ -97,7 +93,6 @@ func (c *coordinator) schedule(ctx context.Context, games []common.Address) erro // createJob updates the state for the specified game and returns the job to enqueue for it, if any // Returns (nil, nil) when there is no error and no job to enqueue func (c *coordinator) createJob(game common.Address) (*job, error) { - j := &job{addr: game} state, ok := c.states[game] if !ok { state = &gameState{} @@ -117,9 +112,11 @@ func (c *coordinator) createJob(game common.Address) (*job, error) { state.status = player.Status() } state.inflight = true - j.player = state.player - j.status = state.status - return j, nil + if state.status != types.GameStatusInProgress { + c.logger.Debug("Not rescheduling resolved game", "game", game, "status", state.status) + return nil, nil + } + return &job{addr: game, player: state.player, status: state.status}, nil } func (c *coordinator) enqueueJob(ctx context.Context, j job) error { From ea51dfafe367661693ed17deb8fe2405623d9dfd Mon Sep 17 00:00:00 2001 From: Andreas Bigger Date: Fri, 15 Sep 2023 17:18:32 -0400 Subject: [PATCH 22/87] trace provider --- op-challenger/cmd/main_test.go | 2 ++ op-challenger/config/config.go | 3 ++- op-challenger/flags/flags.go | 3 +++ 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/op-challenger/cmd/main_test.go b/op-challenger/cmd/main_test.go index f20142750586..3e3fed7855b2 100644 --- a/op-challenger/cmd/main_test.go +++ b/op-challenger/cmd/main_test.go @@ -428,6 +428,8 @@ func requiredArgs(traceType config.TraceType) map[string]string { args["--cannon-server"] = cannonServer args["--cannon-prestate"] = cannonPreState args["--cannon-l2"] = cannonL2 + case config.TraceTypeOutput: + // No additional args required } return args } diff --git a/op-challenger/config/config.go b/op-challenger/config/config.go index fcc6de0ecf6d..d6024cb046c2 100644 --- a/op-challenger/config/config.go +++ b/op-challenger/config/config.go @@ -39,6 +39,7 @@ type TraceType string const ( TraceTypeAlphabet TraceType = "alphabet" TraceTypeCannon TraceType = "cannon" + TraceTypeOutput TraceType = "output" // Mainnet games CannonFaultGameID = 0 @@ -47,7 +48,7 @@ const ( AlphabetFaultGameID = 255 ) -var TraceTypes = []TraceType{TraceTypeAlphabet, TraceTypeCannon} +var TraceTypes = []TraceType{TraceTypeAlphabet, TraceTypeCannon, TraceTypeOutput} // GameIdToString maps game IDs to their string representation. var GameIdToString = map[uint8]string{ diff --git a/op-challenger/flags/flags.go b/op-challenger/flags/flags.go index 090a57ac88c8..45ddae6a7e6e 100644 --- a/op-challenger/flags/flags.go +++ b/op-challenger/flags/flags.go @@ -210,6 +210,9 @@ func CheckRequired(ctx *cli.Context) error { if !ctx.IsSet(AlphabetFlag.Name) { return fmt.Errorf("flag %s is required", "alphabet") } + case config.TraceTypeOutput: + // Mark the flag as unsupported for now so that we can implement downstream + return fmt.Errorf("flag %s is not supported", "output") default: return fmt.Errorf("invalid trace type. must be one of %v", config.TraceTypes) } From a0f10e59999819e9eb2537353e8180d5bca05169 Mon Sep 17 00:00:00 2001 From: Andreas Bigger Date: Fri, 15 Sep 2023 17:29:12 -0400 Subject: [PATCH 23/87] Add support for the output cannon trace type --- op-challenger/cmd/main_test.go | 4 +-- op-challenger/config/config.go | 10 +++--- op-challenger/config/config_test.go | 2 +- op-challenger/flags/flags.go | 56 ++++++++++++++++------------- 4 files changed, 39 insertions(+), 33 deletions(-) diff --git a/op-challenger/cmd/main_test.go b/op-challenger/cmd/main_test.go index 3e3fed7855b2..630bf196e1de 100644 --- a/op-challenger/cmd/main_test.go +++ b/op-challenger/cmd/main_test.go @@ -422,14 +422,12 @@ func requiredArgs(traceType config.TraceType) map[string]string { switch traceType { case config.TraceTypeAlphabet: args["--alphabet"] = alphabetTrace - case config.TraceTypeCannon: + case config.TraceTypeCannon, config.TraceTypeOutputCannon: args["--cannon-network"] = cannonNetwork args["--cannon-bin"] = cannonBin args["--cannon-server"] = cannonServer args["--cannon-prestate"] = cannonPreState args["--cannon-l2"] = cannonL2 - case config.TraceTypeOutput: - // No additional args required } return args } diff --git a/op-challenger/config/config.go b/op-challenger/config/config.go index d6024cb046c2..983ab5cfcb5a 100644 --- a/op-challenger/config/config.go +++ b/op-challenger/config/config.go @@ -37,9 +37,9 @@ var ( type TraceType string const ( - TraceTypeAlphabet TraceType = "alphabet" - TraceTypeCannon TraceType = "cannon" - TraceTypeOutput TraceType = "output" + TraceTypeAlphabet TraceType = "alphabet" + TraceTypeCannon TraceType = "cannon" + TraceTypeOutputCannon TraceType = "output_cannon" // Mainnet games CannonFaultGameID = 0 @@ -48,7 +48,7 @@ const ( AlphabetFaultGameID = 255 ) -var TraceTypes = []TraceType{TraceTypeAlphabet, TraceTypeCannon, TraceTypeOutput} +var TraceTypes = []TraceType{TraceTypeAlphabet, TraceTypeCannon, TraceTypeOutputCannon} // GameIdToString maps game IDs to their string representation. var GameIdToString = map[uint8]string{ @@ -168,7 +168,7 @@ func (c Config) Check() error { if c.MaxConcurrency == 0 { return ErrMaxConcurrencyZero } - if c.TraceType == TraceTypeCannon { + if c.TraceType == TraceTypeCannon || c.TraceType == TraceTypeOutputCannon { if c.CannonBin == "" { return ErrMissingCannonBin } diff --git a/op-challenger/config/config_test.go b/op-challenger/config/config_test.go index 6696eeff8995..63d33f78da06 100644 --- a/op-challenger/config/config_test.go +++ b/op-challenger/config/config_test.go @@ -28,7 +28,7 @@ func validConfig(traceType TraceType) Config { switch traceType { case TraceTypeAlphabet: cfg.AlphabetTrace = validAlphabetTrace - case TraceTypeCannon: + case TraceTypeCannon, TraceTypeOutputCannon: cfg.CannonBin = validCannonBin cfg.CannonServer = validCannonOpProgramBin cfg.CannonAbsolutePreState = validCannonAbsolutPreState diff --git a/op-challenger/flags/flags.go b/op-challenger/flags/flags.go index 45ddae6a7e6e..a57f5c43f927 100644 --- a/op-challenger/flags/flags.go +++ b/op-challenger/flags/flags.go @@ -175,6 +175,32 @@ func init() { // Flags contains the list of configuration options available to the binary. var Flags []cli.Flag +func CheckCannonFlags(ctx *cli.Context) error { + if !ctx.IsSet(CannonNetworkFlag.Name) && + !(ctx.IsSet(CannonRollupConfigFlag.Name) && ctx.IsSet(CannonL2GenesisFlag.Name)) { + return fmt.Errorf("flag %v or %v and %v is required", + CannonNetworkFlag.Name, CannonRollupConfigFlag.Name, CannonL2GenesisFlag.Name) + } + if ctx.IsSet(CannonNetworkFlag.Name) && + (ctx.IsSet(CannonRollupConfigFlag.Name) || ctx.IsSet(CannonL2GenesisFlag.Name)) { + return fmt.Errorf("flag %v can not be used with %v and %v", + CannonNetworkFlag.Name, CannonRollupConfigFlag.Name, CannonL2GenesisFlag.Name) + } + if !ctx.IsSet(CannonBinFlag.Name) { + return fmt.Errorf("flag %s is required", CannonBinFlag.Name) + } + if !ctx.IsSet(CannonServerFlag.Name) { + return fmt.Errorf("flag %s is required", CannonServerFlag.Name) + } + if !ctx.IsSet(CannonPreStateFlag.Name) { + return fmt.Errorf("flag %s is required", CannonPreStateFlag.Name) + } + if !ctx.IsSet(CannonL2Flag.Name) { + return fmt.Errorf("flag %s is required", CannonL2Flag.Name) + } + return nil +} + func CheckRequired(ctx *cli.Context) error { for _, f := range requiredFlags { if !ctx.IsSet(f.Names()[0]) { @@ -184,35 +210,17 @@ func CheckRequired(ctx *cli.Context) error { gameType := config.TraceType(strings.ToLower(ctx.String(TraceTypeFlag.Name))) switch gameType { case config.TraceTypeCannon: - if !ctx.IsSet(CannonNetworkFlag.Name) && - !(ctx.IsSet(CannonRollupConfigFlag.Name) && ctx.IsSet(CannonL2GenesisFlag.Name)) { - return fmt.Errorf("flag %v or %v and %v is required", - CannonNetworkFlag.Name, CannonRollupConfigFlag.Name, CannonL2GenesisFlag.Name) - } - if ctx.IsSet(CannonNetworkFlag.Name) && - (ctx.IsSet(CannonRollupConfigFlag.Name) || ctx.IsSet(CannonL2GenesisFlag.Name)) { - return fmt.Errorf("flag %v can not be used with %v and %v", - CannonNetworkFlag.Name, CannonRollupConfigFlag.Name, CannonL2GenesisFlag.Name) - } - if !ctx.IsSet(CannonBinFlag.Name) { - return fmt.Errorf("flag %s is required", CannonBinFlag.Name) - } - if !ctx.IsSet(CannonServerFlag.Name) { - return fmt.Errorf("flag %s is required", CannonServerFlag.Name) - } - if !ctx.IsSet(CannonPreStateFlag.Name) { - return fmt.Errorf("flag %s is required", CannonPreStateFlag.Name) - } - if !ctx.IsSet(CannonL2Flag.Name) { - return fmt.Errorf("flag %s is required", CannonL2Flag.Name) + if err := CheckCannonFlags(ctx); err != nil { + return err } case config.TraceTypeAlphabet: if !ctx.IsSet(AlphabetFlag.Name) { return fmt.Errorf("flag %s is required", "alphabet") } - case config.TraceTypeOutput: - // Mark the flag as unsupported for now so that we can implement downstream - return fmt.Errorf("flag %s is not supported", "output") + case config.TraceTypeOutputCannon: + if err := CheckCannonFlags(ctx); err != nil { + return err + } default: return fmt.Errorf("invalid trace type. must be one of %v", config.TraceTypes) } From 9b39896dffc7fcc9dec9bb6b8076731f517975fb Mon Sep 17 00:00:00 2001 From: Andreas Bigger Date: Mon, 18 Sep 2023 11:51:08 -0400 Subject: [PATCH 24/87] Remove mutex and reorder metric updates --- op-challenger/game/scheduler/scheduler.go | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/op-challenger/game/scheduler/scheduler.go b/op-challenger/game/scheduler/scheduler.go index a367bb6859d4..6f2dee4267f9 100644 --- a/op-challenger/game/scheduler/scheduler.go +++ b/op-challenger/game/scheduler/scheduler.go @@ -22,7 +22,6 @@ type SchedulerMetricer interface { } type Scheduler struct { - executorMutex sync.Mutex logger log.Logger coordinator *coordinator m SchedulerMetricer @@ -56,17 +55,13 @@ func NewScheduler(logger log.Logger, m SchedulerMetricer, disk DiskManager, maxC } func (s *Scheduler) ThreadActive() { - s.executorMutex.Lock() - defer s.executorMutex.Unlock() - s.m.DecIdleExecutors() s.m.IncActiveExecutors() + s.m.DecIdleExecutors() } func (s *Scheduler) ThreadIdle() { - s.executorMutex.Lock() - defer s.executorMutex.Unlock() - s.m.DecActiveExecutors() s.m.IncIdleExecutors() + s.m.DecActiveExecutors() } func (s *Scheduler) Start(ctx context.Context) { From 873daaffe0977675177d3f96b92bd0207d62f85e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 18 Sep 2023 09:38:48 -0700 Subject: [PATCH 25/87] build(deps): bump ethereum/client-go in /ops-bedrock (#7283) Bumps ethereum/client-go from v1.13.0 to v1.13.1. --- updated-dependencies: - dependency-name: ethereum/client-go dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- ops-bedrock/Dockerfile.l1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ops-bedrock/Dockerfile.l1 b/ops-bedrock/Dockerfile.l1 index f31d25295ddb..0fe40faa585a 100644 --- a/ops-bedrock/Dockerfile.l1 +++ b/ops-bedrock/Dockerfile.l1 @@ -1,4 +1,4 @@ -FROM ethereum/client-go:v1.13.0 +FROM ethereum/client-go:v1.13.1 RUN apk add --no-cache jq From b7e022b52b40d350434576af5a3ea660a2ef15df Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 18 Sep 2023 20:17:04 +0000 Subject: [PATCH 26/87] build(deps-dev): bump @types/node from 20.5.0 to 20.6.2 Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 20.5.0 to 20.6.2. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node) --- updated-dependencies: - dependency-name: "@types/node" dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- pnpm-lock.yaml | 142 ++++++++++++++++++------------------------------- 1 file changed, 51 insertions(+), 91 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e5be5e69b9eb..921e747f752f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -35,7 +35,7 @@ importers: version: 10.0.1 '@types/node': specifier: ^20.5.3 - version: 20.5.3 + version: 20.6.1 '@typescript-eslint/eslint-plugin': specifier: ^6.7.0 version: 6.7.0(@typescript-eslint/parser@6.7.0)(eslint@8.49.0)(typescript@5.1.6) @@ -184,7 +184,7 @@ importers: version: 2.17.2(ts-node@10.9.1)(typescript@5.2.2) ts-node: specifier: ^10.9.1 - version: 10.9.1(@types/node@20.6.1)(typescript@5.2.2) + version: 10.9.1(@types/node@20.6.2)(typescript@5.2.2) tsx: specifier: ^3.12.7 version: 3.12.7 @@ -342,7 +342,7 @@ importers: version: 5.1.6 vite: specifier: ^4.4.6 - version: 4.4.6(@types/node@20.5.3) + version: 4.4.6(@types/node@20.6.1) vitest: specifier: ^0.34.2 version: 0.34.2(jsdom@22.1.0) @@ -436,7 +436,7 @@ importers: version: 1.3.1(typescript@5.1.6) vite: specifier: ^4.4.6 - version: 4.4.6(@types/node@20.5.3) + version: 4.4.6(@types/node@20.6.1) vitest: specifier: ^0.34.2 version: 0.34.2(jsdom@22.1.0) @@ -567,7 +567,7 @@ importers: version: 1.6.0(typescript@5.1.6)(zod@3.22.0) vite: specifier: ^4.4.9 - version: 4.4.9(@types/node@20.5.3) + version: 4.4.9(@types/node@20.6.1) vitest: specifier: ^0.34.1 version: 0.34.1 @@ -3716,20 +3716,20 @@ packages: /@types/bn.js@4.11.6: resolution: {integrity: sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==} dependencies: - '@types/node': 20.6.1 + '@types/node': 20.6.2 dev: true /@types/bn.js@5.1.0: resolution: {integrity: sha512-QSSVYj7pYFN49kW77o2s9xTCwZ8F2xLbjLLSEVh8D2F4JUhZtPAGOFLTD+ffqksBx/u4cE/KImFjyhqCjn/LIA==} dependencies: - '@types/node': 20.6.1 + '@types/node': 20.6.2 dev: true /@types/body-parser@1.19.1: resolution: {integrity: sha512-a6bTJ21vFOGIkwM0kzh9Yr89ziVxq4vYH2fQ6N8AeipEzai/cFK6aGMArIkUeIdRIgpwQa+2bXiLuUJCpSf2Cg==} dependencies: '@types/connect': 3.4.35 - '@types/node': 20.6.1 + '@types/node': 20.6.2 dev: true /@types/chai-as-promised@7.1.5: @@ -3755,7 +3755,7 @@ packages: /@types/connect@3.4.35: resolution: {integrity: sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==} dependencies: - '@types/node': 20.6.1 + '@types/node': 20.6.2 /@types/dateformat@5.0.0: resolution: {integrity: sha512-SZg4JdHIWHQGEokbYGZSDvo5wA4TLYPXaqhigs/wH+REDOejcJzgH+qyY+HtEUtWOZxEUkbhbdYPqQDiEgrXeA==} @@ -3769,7 +3769,7 @@ packages: /@types/express-serve-static-core@4.17.35: resolution: {integrity: sha512-wALWQwrgiB2AWTT91CB62b6Yt0sNHpznUXeZEcnPU3DRdlDIz74x8Qg1UUYKSVFi+va5vKOLYRBI1bRKiLLKIg==} dependencies: - '@types/node': 20.6.1 + '@types/node': 20.6.2 '@types/qs': 6.9.7 '@types/range-parser': 1.2.4 '@types/send': 0.17.1 @@ -3788,7 +3788,7 @@ packages: resolution: {integrity: sha512-IO+MJPVhoqz+28h1qLAcBEH2+xHMK6MTyHJc7MTnnYb6wsoLR29POVGJ7LycmVXIqyy/4/2ShP5sUwTXuOwb/w==} dependencies: '@types/minimatch': 5.1.2 - '@types/node': 20.5.3 + '@types/node': 20.6.1 dev: true /@types/is-ci@3.0.0: @@ -3815,7 +3815,7 @@ packages: dependencies: '@types/abstract-leveldown': 5.0.2 '@types/level-errors': 3.0.0 - '@types/node': 20.6.1 + '@types/node': 20.6.2 dev: true /@types/lru-cache@5.1.1: @@ -3847,7 +3847,7 @@ packages: /@types/mkdirp@0.5.2: resolution: {integrity: sha512-U5icWpv7YnZYGsN4/cmh3WD2onMY0aJIiTE6+51TwJCttdHvtCYmkBNOobHlXwrJRL0nkH9jH4kD+1FAdMN4Tg==} dependencies: - '@types/node': 20.6.1 + '@types/node': 20.6.2 dev: true /@types/mocha@10.0.1: @@ -3857,7 +3857,7 @@ packages: /@types/morgan@1.9.4: resolution: {integrity: sha512-cXoc4k+6+YAllH3ZHmx4hf7La1dzUk6keTR4bF4b4Sc0mZxU/zK4wO7l+ZzezXm/jkYj/qC+uYGZrarZdIVvyQ==} dependencies: - '@types/node': 20.5.3 + '@types/node': 20.6.1 dev: true /@types/ms@0.7.31: @@ -3866,7 +3866,7 @@ packages: /@types/node-fetch@2.6.4: resolution: {integrity: sha512-1ZX9fcN4Rvkvgv4E6PAY5WXUFWFcRWxZa3EW83UjycOB9ljJCedb2CupIP4RZMEwF/M3eTcCihbBRgwtGbg5Rg==} dependencies: - '@types/node': 20.6.1 + '@types/node': 20.6.2 form-data: 3.0.1 dev: true @@ -3881,16 +3881,12 @@ packages: resolution: {integrity: sha512-Mgq7eCtoTjT89FqNoTzzXg2XvCi5VMhRV6+I2aYanc6kQCBImeNaAYRs/DyoVqk1YEUJK5gN9VO7HRIdz4Wo3Q==} dev: true - /@types/node@20.5.3: - resolution: {integrity: sha512-ITI7rbWczR8a/S6qjAW7DMqxqFMjjTo61qZVWJ1ubPvbIQsL5D/TvwjYEalM8Kthpe3hTzOGrF2TGbAu2uyqeA==} - dev: true - - /@types/node@20.6.0: - resolution: {integrity: sha512-najjVq5KN2vsH2U/xyh2opaSEz6cZMR2SetLIlxlj08nOcmPOemJmUK2o4kUzfLqfrWE0PIrNeE16XhYDd3nqg==} - dev: true - /@types/node@20.6.1: resolution: {integrity: sha512-4LcJvuXQlv4lTHnxwyHQZ3uR9Zw2j7m1C9DfuwoTFQQP4Pmu04O6IfLYgMmHoOCt0nosItLLZAH+sOrRE0Bo8g==} + dev: true + + /@types/node@20.6.2: + resolution: {integrity: sha512-Y+/1vGBHV/cYk6OI1Na/LHzwnlNCAfU3ZNGrc1LdRe/LAIbdDPTTv/HU3M7yXN448aTVDq3eKRm2cg7iKLb8gw==} /@types/normalize-package-data@2.4.1: resolution: {integrity: sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==} @@ -3902,7 +3898,7 @@ packages: /@types/pbkdf2@3.1.0: resolution: {integrity: sha512-Cf63Rv7jCQ0LaL8tNXmEyqTHuIJxRdlS5vMh1mj5voN4+QFhVZnlZruezqpWYDiJ8UTzhP0VmeLXCmBk66YrMQ==} dependencies: - '@types/node': 20.6.1 + '@types/node': 20.6.2 dev: true /@types/pino-multi-stream@5.1.3: @@ -3920,13 +3916,13 @@ packages: /@types/pino-std-serializers@2.4.1: resolution: {integrity: sha512-17XcksO47M24IVTVKPeAByWUd3Oez7EbIjXpSbzMPhXVzgjGtrOa49gKBwxH9hb8dKv58OelsWQ+A1G1l9S3wQ==} dependencies: - '@types/node': 20.6.1 + '@types/node': 20.6.2 dev: true /@types/pino@6.3.11: resolution: {integrity: sha512-S7+fLONqSpHeW9d7TApUqO6VN47KYgOXhCNKwGBVLHObq8HhaAYlVqUNdfnvoXjCMiwE5xcPm/5R2ZUh8bgaXQ==} dependencies: - '@types/node': 20.6.1 + '@types/node': 20.6.2 '@types/pino-pretty': 4.7.1 '@types/pino-std-serializers': 2.4.1 sonic-boom: 2.8.0 @@ -3972,7 +3968,7 @@ packages: /@types/readable-stream@2.3.15: resolution: {integrity: sha512-oM5JSKQCcICF1wvGgmecmHldZ48OZamtMxcGGVICOJA8o8cahXC1zEVAif8iwoc5j8etxFaRFnf095+CDsuoFQ==} dependencies: - '@types/node': 20.6.1 + '@types/node': 20.6.2 safe-buffer: 5.1.2 dev: true @@ -3983,7 +3979,7 @@ packages: /@types/secp256k1@4.0.3: resolution: {integrity: sha512-Da66lEIFeIz9ltsdMZcpQvmrmmoqrfju8pm1BH8WbYjZSwUgCwXLb9C+9XYogwBITnbsSaMdVPb2ekf7TV+03w==} dependencies: - '@types/node': 20.6.1 + '@types/node': 20.6.2 dev: true /@types/seedrandom@3.0.1: @@ -4002,14 +3998,14 @@ packages: resolution: {integrity: sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q==} dependencies: '@types/mime': 1.3.2 - '@types/node': 20.6.1 + '@types/node': 20.6.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.6.1 + '@types/node': 20.6.2 dev: true /@types/sinon-chai@3.2.5: @@ -4046,18 +4042,18 @@ packages: /@types/ws@7.4.7: resolution: {integrity: sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==} dependencies: - '@types/node': 20.6.1 + '@types/node': 20.6.2 /@types/ws@8.5.3: resolution: {integrity: sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w==} dependencies: - '@types/node': 20.6.1 + '@types/node': 20.6.2 dev: false /@types/ws@8.5.5: resolution: {integrity: sha512-lwhs8hktwxSjf9UaZ9tG5M03PGogvFaH8gUgLNbN9HKIg0dvv6q+gkSuJ8HN4/VbyxkuLzCjlN7GquQ0gUJfIg==} dependencies: - '@types/node': 20.6.1 + '@types/node': 20.6.2 dev: true /@typescript-eslint/eslint-plugin@6.7.0(@typescript-eslint/parser@6.4.0)(eslint@8.49.0)(typescript@5.1.6): @@ -9181,7 +9177,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.6.1)(typescript@5.2.2) + ts-node: 10.9.1(@types/node@20.6.2)(typescript@5.2.2) tsort: 0.0.1 typescript: 5.2.2 undici: 5.24.0 @@ -13944,7 +13940,7 @@ packages: yn: 3.1.1 dev: true - /ts-node@10.9.1(@types/node@20.6.1)(typescript@5.2.2): + /ts-node@10.9.1(@types/node@20.6.2)(typescript@5.2.2): resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} hasBin: true peerDependencies: @@ -13963,7 +13959,7 @@ packages: '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 20.6.1 + '@types/node': 20.6.2 acorn: 8.10.0 acorn-walk: 8.2.0 arg: 4.1.3 @@ -14655,7 +14651,7 @@ packages: - zod dev: true - /vite-node@0.34.1(@types/node@20.5.3): + /vite-node@0.34.1(@types/node@20.6.1): resolution: {integrity: sha512-odAZAL9xFMuAg8aWd7nSPT+hU8u2r9gU3LRm9QKjxBEF2rRdWpMuqkrkjvyVQEdNFiBctqr2Gg4uJYizm5Le6w==} engines: {node: '>=v14.18.0'} hasBin: true @@ -14665,7 +14661,7 @@ packages: mlly: 1.4.0 pathe: 1.1.1 picocolors: 1.0.0 - vite: 4.4.9(@types/node@20.5.3) + vite: 4.4.9(@types/node@20.6.1) transitivePeerDependencies: - '@types/node' - less @@ -14677,7 +14673,7 @@ packages: - terser dev: true - /vite-node@0.34.2(@types/node@20.5.3): + /vite-node@0.34.2(@types/node@20.6.1): resolution: {integrity: sha512-JtW249Zm3FB+F7pQfH56uWSdlltCo1IOkZW5oHBzeQo0iX4jtC7o1t9aILMGd9kVekXBP2lfJBEQt9rBh07ebA==} engines: {node: '>=v14.18.0'} hasBin: true @@ -14687,7 +14683,7 @@ packages: mlly: 1.4.0 pathe: 1.1.1 picocolors: 1.0.0 - vite: 4.4.9(@types/node@20.5.3) + vite: 4.4.9(@types/node@20.6.1) transitivePeerDependencies: - '@types/node' - less @@ -14699,7 +14695,7 @@ packages: - terser dev: true - /vite-node@0.34.4(@types/node@20.6.0): + /vite-node@0.34.4(@types/node@20.6.1): resolution: {integrity: sha512-ho8HtiLc+nsmbwZMw8SlghESEE3KxJNp04F/jPUCLVvaURwt0d+r9LxEqCX5hvrrOQ0GSyxbYr5ZfRYhQ0yVKQ==} engines: {node: '>=v14.18.0'} hasBin: true @@ -14709,7 +14705,7 @@ packages: mlly: 1.4.0 pathe: 1.1.1 picocolors: 1.0.0 - vite: 4.4.9(@types/node@20.6.0) + vite: 4.4.9(@types/node@20.6.1) transitivePeerDependencies: - '@types/node' - less @@ -14721,7 +14717,7 @@ packages: - terser dev: true - /vite@4.4.6(@types/node@20.5.3): + /vite@4.4.6(@types/node@20.6.1): resolution: {integrity: sha512-EY6Mm8vJ++S3D4tNAckaZfw3JwG3wa794Vt70M6cNJ6NxT87yhq7EC8Rcap3ahyHdo8AhCmV9PTk+vG1HiYn1A==} engines: {node: ^14.18.0 || >=16.0.0} hasBin: true @@ -14749,7 +14745,7 @@ packages: terser: optional: true dependencies: - '@types/node': 20.5.3 + '@types/node': 20.6.1 esbuild: 0.18.15 postcss: 8.4.27 rollup: 3.26.3 @@ -14757,43 +14753,7 @@ packages: fsevents: 2.3.2 dev: true - /vite@4.4.9(@types/node@20.5.3): - resolution: {integrity: sha512-2mbUn2LlUmNASWwSCNSJ/EG2HuSRTnVNaydp6vMCm5VIqJsjMfbIWtbH2kDuwUVW5mMUKKZvGPX/rqeqVvv1XA==} - engines: {node: ^14.18.0 || >=16.0.0} - hasBin: true - peerDependencies: - '@types/node': '>= 14' - less: '*' - lightningcss: ^1.21.0 - sass: '*' - stylus: '*' - sugarss: '*' - terser: ^5.4.0 - peerDependenciesMeta: - '@types/node': - optional: true - less: - optional: true - lightningcss: - optional: true - sass: - optional: true - stylus: - optional: true - sugarss: - optional: true - terser: - optional: true - dependencies: - '@types/node': 20.5.3 - esbuild: 0.18.15 - postcss: 8.4.27 - rollup: 3.28.0 - optionalDependencies: - fsevents: 2.3.2 - dev: true - - /vite@4.4.9(@types/node@20.6.0): + /vite@4.4.9(@types/node@20.6.1): resolution: {integrity: sha512-2mbUn2LlUmNASWwSCNSJ/EG2HuSRTnVNaydp6vMCm5VIqJsjMfbIWtbH2kDuwUVW5mMUKKZvGPX/rqeqVvv1XA==} engines: {node: ^14.18.0 || >=16.0.0} hasBin: true @@ -14821,7 +14781,7 @@ packages: terser: optional: true dependencies: - '@types/node': 20.6.0 + '@types/node': 20.6.1 esbuild: 0.18.15 postcss: 8.4.27 rollup: 3.28.0 @@ -14862,7 +14822,7 @@ packages: dependencies: '@types/chai': 4.3.6 '@types/chai-subset': 1.3.3 - '@types/node': 20.5.3 + '@types/node': 20.6.1 '@vitest/expect': 0.34.1 '@vitest/runner': 0.34.1 '@vitest/snapshot': 0.34.1 @@ -14881,8 +14841,8 @@ packages: strip-literal: 1.0.1 tinybench: 2.5.0 tinypool: 0.7.0 - vite: 4.4.9(@types/node@20.5.3) - vite-node: 0.34.1(@types/node@20.5.3) + vite: 4.4.9(@types/node@20.6.1) + vite-node: 0.34.1(@types/node@20.6.1) why-is-node-running: 2.2.2 transitivePeerDependencies: - less @@ -14927,7 +14887,7 @@ packages: dependencies: '@types/chai': 4.3.6 '@types/chai-subset': 1.3.3 - '@types/node': 20.5.3 + '@types/node': 20.6.1 '@vitest/expect': 0.34.2 '@vitest/runner': 0.34.2 '@vitest/snapshot': 0.34.2 @@ -14947,8 +14907,8 @@ packages: strip-literal: 1.0.1 tinybench: 2.5.0 tinypool: 0.7.0 - vite: 4.4.9(@types/node@20.5.3) - vite-node: 0.34.2(@types/node@20.5.3) + vite: 4.4.9(@types/node@20.6.1) + vite-node: 0.34.2(@types/node@20.6.1) why-is-node-running: 2.2.2 transitivePeerDependencies: - less @@ -14993,7 +14953,7 @@ packages: dependencies: '@types/chai': 4.3.6 '@types/chai-subset': 1.3.3 - '@types/node': 20.6.0 + '@types/node': 20.6.1 '@vitest/expect': 0.34.4 '@vitest/runner': 0.34.4 '@vitest/snapshot': 0.34.4 @@ -15012,8 +14972,8 @@ packages: strip-literal: 1.0.1 tinybench: 2.5.0 tinypool: 0.7.0 - vite: 4.4.9(@types/node@20.6.0) - vite-node: 0.34.4(@types/node@20.6.0) + vite: 4.4.9(@types/node@20.6.1) + vite-node: 0.34.4(@types/node@20.6.1) why-is-node-running: 2.2.2 transitivePeerDependencies: - less From dbba9a35d1fa641b09283451e2a01ecae7d09575 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 18 Sep 2023 22:12:57 +0000 Subject: [PATCH 27/87] build(deps-dev): bump markdownlint from 0.31.0 to 0.31.1 Bumps [markdownlint](https://github.com/DavidAnson/markdownlint) from 0.31.0 to 0.31.1. - [Changelog](https://github.com/DavidAnson/markdownlint/blob/main/CHANGELOG.md) - [Commits](https://github.com/DavidAnson/markdownlint/compare/v0.31.0...v0.31.1) --- updated-dependencies: - dependency-name: markdownlint dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pnpm-lock.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2e93defd1b24..244826dae3c3 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -92,7 +92,7 @@ importers: version: 14.0.1 markdownlint: specifier: ^0.31.0 - version: 0.31.0 + version: 0.31.1 markdownlint-cli2: specifier: 0.4.0 version: 0.4.0 @@ -10711,8 +10711,8 @@ packages: markdown-it: 12.3.2 dev: true - /markdownlint@0.31.0: - resolution: {integrity: sha512-e+jZGRGZrz1s0T4wiPDFtyQafq7sKgdbf2sdL46gRT8zLEvDDihQmGeSCV6VXp9BsfkuZ0dPTAg9hf4j6NFgjg==} + /markdownlint@0.31.1: + resolution: {integrity: sha512-CKMR2hgcIBrYlIUccDCOvi966PZ0kJExDrUi1R+oF9PvqQmCrTqjOsgIvf2403OmJ+CWomuzDoylr6KbuMyvHA==} engines: {node: '>=16'} dependencies: markdown-it: 13.0.1 From 088ad1419579bc172d70070a846bd38f0e95f927 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 18 Sep 2023 22:26:34 +0000 Subject: [PATCH 28/87] build(deps-dev): bump vitest from 0.34.1 to 0.34.4 Bumps [vitest](https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest) from 0.34.1 to 0.34.4. - [Release notes](https://github.com/vitest-dev/vitest/releases) - [Commits](https://github.com/vitest-dev/vitest/commits/v0.34.4/packages/vitest) --- updated-dependencies: - dependency-name: vitest dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pnpm-lock.yaml | 46 +++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 41 insertions(+), 5 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9661ec3a3349..d4e7518d2039 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -14693,7 +14693,7 @@ packages: - terser dev: true - /vite-node@0.34.4(@types/node@20.6.1): + /vite-node@0.34.4(@types/node@20.6.2): resolution: {integrity: sha512-ho8HtiLc+nsmbwZMw8SlghESEE3KxJNp04F/jPUCLVvaURwt0d+r9LxEqCX5hvrrOQ0GSyxbYr5ZfRYhQ0yVKQ==} engines: {node: '>=v14.18.0'} hasBin: true @@ -14703,7 +14703,7 @@ packages: mlly: 1.4.0 pathe: 1.1.1 picocolors: 1.0.0 - vite: 4.4.9(@types/node@20.6.1) + vite: 4.4.9(@types/node@20.6.2) transitivePeerDependencies: - '@types/node' - less @@ -14787,6 +14787,42 @@ packages: fsevents: 2.3.2 dev: true + /vite@4.4.9(@types/node@20.6.2): + resolution: {integrity: sha512-2mbUn2LlUmNASWwSCNSJ/EG2HuSRTnVNaydp6vMCm5VIqJsjMfbIWtbH2kDuwUVW5mMUKKZvGPX/rqeqVvv1XA==} + engines: {node: ^14.18.0 || >=16.0.0} + hasBin: true + peerDependencies: + '@types/node': '>= 14' + less: '*' + lightningcss: ^1.21.0 + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + dependencies: + '@types/node': 20.6.2 + esbuild: 0.18.15 + postcss: 8.4.27 + rollup: 3.28.0 + optionalDependencies: + fsevents: 2.3.2 + dev: true + /vitest@0.34.1: resolution: {integrity: sha512-G1PzuBEq9A75XSU88yO5G4vPT20UovbC/2osB2KEuV/FisSIIsw7m5y2xMdB7RsAGHAfg2lPmp2qKr3KWliVlQ==} engines: {node: '>=v14.18.0'} @@ -14951,7 +14987,7 @@ packages: dependencies: '@types/chai': 4.3.6 '@types/chai-subset': 1.3.3 - '@types/node': 20.6.1 + '@types/node': 20.6.2 '@vitest/expect': 0.34.4 '@vitest/runner': 0.34.4 '@vitest/snapshot': 0.34.4 @@ -14970,8 +15006,8 @@ packages: strip-literal: 1.0.1 tinybench: 2.5.0 tinypool: 0.7.0 - vite: 4.4.9(@types/node@20.6.1) - vite-node: 0.34.4(@types/node@20.6.1) + vite: 4.4.9(@types/node@20.6.2) + vite-node: 0.34.4(@types/node@20.6.2) why-is-node-running: 2.2.2 transitivePeerDependencies: - less From 66cbc5cbba07063a03197e3dfd802bba79a8337b Mon Sep 17 00:00:00 2001 From: Maurelian Date: Fri, 15 Sep 2023 00:27:53 -0400 Subject: [PATCH 29/87] forge install: safe-contracts v1.4.1 forge install: safe-contracts v1.4.1 --- .gitmodules | 7 +++++++ packages/contracts-bedrock/foundry.toml | 3 ++- packages/contracts-bedrock/lib/safe-contracts | 1 + 3 files changed, 10 insertions(+), 1 deletion(-) create mode 160000 packages/contracts-bedrock/lib/safe-contracts diff --git a/.gitmodules b/.gitmodules index c220a03f9f6c..802f78e7a218 100644 --- a/.gitmodules +++ b/.gitmodules @@ -13,3 +13,10 @@ [submodule "packages/contracts-bedrock/lib/forge-std"] path = packages/contracts-bedrock/lib/forge-std url = https://github.com/foundry-rs/forge-std +[submodule "packages/contracts-bedrock/lib/safe-contracts"] + path = packages/contracts-bedrock/lib/safe-contracts + url = https://github.com/safe-global/safe-contracts + branch = v1.4.0 + + + diff --git a/packages/contracts-bedrock/foundry.toml b/packages/contracts-bedrock/foundry.toml index f90e6aa4bb32..80001862f80e 100644 --- a/packages/contracts-bedrock/foundry.toml +++ b/packages/contracts-bedrock/foundry.toml @@ -16,7 +16,8 @@ remappings = [ '@rari-capital/solmate/=lib/solmate', '@cwia/=lib/clones-with-immutable-args/src', 'forge-std/=lib/forge-std/src', - 'ds-test/=lib/forge-std/lib/ds-test/src' + 'ds-test/=lib/forge-std/lib/ds-test/src', + 'safe-contracts/=lib/safe-contracts/contracts' ] extra_output = ['devdoc', 'userdoc', 'metadata', 'storageLayout'] bytecode_hash = 'none' diff --git a/packages/contracts-bedrock/lib/safe-contracts b/packages/contracts-bedrock/lib/safe-contracts new file mode 160000 index 000000000000..e870f514ad34 --- /dev/null +++ b/packages/contracts-bedrock/lib/safe-contracts @@ -0,0 +1 @@ +Subproject commit e870f514ad34cd9654c72174d6d4a839e3c6639f From 36defa42b405a6369e1ad1a0cbe8454962d2cd7c Mon Sep 17 00:00:00 2001 From: Maurelian Date: Mon, 18 Sep 2023 15:58:43 -0400 Subject: [PATCH 30/87] bindings: Add Safe and SafeProxyFactory bindings --- op-bindings/artifacts.json | 4 +- op-bindings/bindings/mips_more.go | 2 +- op-bindings/bindings/preimageoracle_more.go | 2 +- op-bindings/bindings/safe.go | 3210 +++++++++++++++++ op-bindings/bindings/safe_more.go | 25 + op-bindings/bindings/safeproxyfactory.go | 472 +++ op-bindings/bindings/safeproxyfactory_more.go | 25 + op-bindings/bindings/weth9.go | 2 +- op-bindings/bindings/weth9_more.go | 2 +- .../contracts-bedrock/scripts/Deploy.s.sol | 2 + 10 files changed, 3741 insertions(+), 5 deletions(-) create mode 100644 op-bindings/bindings/safe.go create mode 100644 op-bindings/bindings/safe_more.go create mode 100644 op-bindings/bindings/safeproxyfactory.go create mode 100644 op-bindings/bindings/safeproxyfactory_more.go diff --git a/op-bindings/artifacts.json b/op-bindings/artifacts.json index bb22312cb445..77a33050fd8d 100644 --- a/op-bindings/artifacts.json +++ b/op-bindings/artifacts.json @@ -36,5 +36,7 @@ "BlockOracle", "EAS", "SchemaRegistry", - "ProtocolVersions" + "ProtocolVersions", + "Safe", + "SafeProxyFactory" ] diff --git a/op-bindings/bindings/mips_more.go b/op-bindings/bindings/mips_more.go index 970370d4ef3c..064bd4392c93 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:106:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1710:45;;1745:10;1710:45;;;;;188:10:260;176:23;;;158:42;;146:2;131:18;1710:45:106;;;;;;;;2448:99;;;412:42:260;2534:6:106;400:55:260;382:74;;370:2;355:18;2448:99:106;211:251:260;25555:6339:106;;;;;;:::i;:::-;;:::i;:::-;;;1687:25:260;;;1675:2;1660:18;25555:6339:106;1541:177:260;25555:6339:106;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:106;;-1:-1:-1;28096:7:106;:20::i;:::-;28082:34;-1:-1:-1;28146:10:106;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:106;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:106;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:106;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:106;;;;;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:106;;;5305:32;;5365:19;5361:30;5397:3;5393:16;;;;5358:52;;3092:2334;-1:-1:-1;3092:2334:106: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:106;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:106;23337:14;;;;23325:10;23321:31;23318:1;23314:39;23382:16;;;;23400:10;23378:33;;21610:1831;-1:-1:-1;;;21610:1831:106: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:260;19028:28:106;;;2096:21:260;2153:2;2133:18;;;2126:30;2192:20;2172:18;;;2165:48;2230:18;;19028:28:106;;;;;;;;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:106: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:106;;;;:::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:260;13956:30:106;;;2443:21:260;2500:2;2480:18;;;2473:30;2539:22;2519:18;;;2512:50;2579:18;;13956:30:106;2259:344:260;13904:97:106;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:106: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:106;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:106;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:106;;;33448:4;33443:9;;33436:17;33429:24;;33389:3555;33522:4;:11;;33530:3;33522:11;33518:3426;;-1:-1:-1;;;33564:17:106;;;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:106;;;35722:16;;35682:1262;35807:4;:12;;35815:4;35807:12;35803:1141;;-1:-1:-1;;;35851:7:106;;;35843:16;;35803:1141;35927:4;:12;;35935:4;35927:12;35923:1021;;-1:-1:-1;;;35971:7:106;;;35963:16;;35923:1021;36048:4;:12;;36056:4;36048:12;36044:900;;-1:-1:-1;;;36092:7:106;;;36084:16;;36044:900;36168:4;:12;;36176:4;36168:12;36164:780;;-1:-1:-1;;;36212:7:106;;;36204:16;;36164:780;36287:4;:12;;36295:4;36287:12;36283:661;;-1:-1:-1;;;36331:7:106;;;36323:16;;36283:661;36407:4;:12;;36415:4;36407:12;36403:541;;-1:-1:-1;;;36451:7:106;;;36443:16;;36403:541;36527:4;:12;;36535:4;36527:12;36523:421;;-1:-1:-1;;;36572:7:106;;;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:260;36896:29:106;;;2792:21:260;2849:2;2829:18;;;2822:30;2888:21;2868:18;;;2861:49;2927:18;;36896:29:106;2608:343:260;36787:157:106;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:106;;;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:106;;-1:-1:-1;;37654:8:106;37010:3590;37752:6;:14;;37762:4;37752:14;37748:2852;;-1:-1:-1;;37797:8:106;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:106;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:106;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:106;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:106;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:106;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:106;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:106;20172:2;20160:14;;;;20152:41;;;;;;;3158:2:260;20152:41:106;;;3140:21:260;3197:2;3177:18;;;3170:30;3236:16;3216:18;;;3209:44;3270:18;;20152:41:106;2956:338:260;20152:41:106;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:106;;: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:106;;;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:106;7737:19;7909:14;7928:1;7903:26;7899:131;;7971:36;7995:11;1277:21:107;1426:15;;;1467:8;1461:4;1454:22;1595:4;1582:18;;1602:19;1578:44;1624:11;1575:61;;1222:430;7971:36:106;7957:50;;7899:131;8116:20;;;;;8083:54;;;;;;;;3472:25:260;;;8083:54:106;3533:23:260;;;3513:18;;;3506:51;8052:11:106;;;;8083:19;:6;:19;;;;3445:18:260;;8083:54:106;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::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:106;;-1:-1:-1;;;7506:2538:106;;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:106;;;1859:1;10346:15;10327:34;:57;;;-1:-1:-1;10365:19:106;;;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:106;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:106;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:106;;;1978:1;12339:22;12321:40;:62;;;-1:-1:-1;12365:18:106;;;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:106;;;1859:1;12481:15;12462:34;:61;;;-1:-1:-1;12500:23:106;;;2021:1;12500:23;12462:61;:84;;;-1:-1:-1;12527:19:106;;;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:106;;;;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:106;16228:10;16336:13;;;16345:4;16336:13;16332:1705;;-1:-1:-1;16375:8:106;;;;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:106;;;;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:106: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:106;24984:9;24948:343;;;-1:-1:-1;;25390:4:106;25383:18;-1:-1:-1;;;;23777:1654:106:o;20810:586::-;21132:20;;;21156:7;21132:32;21125:3;:40;;;21238:14;;21293:17;;21287:24;;;21279:72;;;;;;;4209:2:260;21279:72:106;;;4191:21:260;4248:2;4228:18;;;4221:30;4287:34;4267:18;;;4260:62;4358:5;4338:18;;;4331:33;4381:19;;21279:72:106;4007:399:260;21279:72:106;21365:14;20810:586;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;467:347:260:-;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:260;;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:260;-1:-1:-1;1332:2:260;1317:18;;1304:32;;-1:-1:-1;1348:16:260;;;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:260;-1:-1:-1;;;;819:717:260: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:260;;3803:2;3788:18;;;3782:25;3747:16;;3782:25;;-1:-1:-1;3568:245:260:o;3818:184::-;3870:77;3867:1;3860:88;3967:4;3964:1;3957:15;3991:4;3988:1;3981:15" +var MIPSDeployedSourceMap = "1131:39544:125:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1710:45;;1745:10;1710:45;;;;;188:10:279;176:23;;;158:42;;146:2;131:18;1710:45:125;;;;;;;;2448:99;;;412:42:279;2534:6:125;400:55:279;382:74;;370:2;355:18;2448:99:125;211:251:279;25555:6339:125;;;;;;:::i;:::-;;:::i;:::-;;;1687:25:279;;;1675:2;1660:18;25555:6339:125;1541:177:279;25555:6339:125;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:125;;-1:-1:-1;28096:7:125;:20::i;:::-;28082:34;-1:-1:-1;28146:10:125;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:125;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:125;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:125;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:125;;;;;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:125;;;5305:32;;5365:19;5361:30;5397:3;5393:16;;;;5358:52;;3092:2334;-1:-1:-1;3092:2334:125: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:125;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:125;23337:14;;;;23325:10;23321:31;23318:1;23314:39;23382:16;;;;23400:10;23378:33;;21610:1831;-1:-1:-1;;;21610:1831:125: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:279;19028:28:125;;;2096:21:279;2153:2;2133:18;;;2126:30;2192:20;2172:18;;;2165:48;2230:18;;19028:28:125;;;;;;;;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:125: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:125;;;;:::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:279;13956:30:125;;;2443:21:279;2500:2;2480:18;;;2473:30;2539:22;2519:18;;;2512:50;2579:18;;13956:30:125;2259:344:279;13904:97:125;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:125: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:125;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:125;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:125;;;33448:4;33443:9;;33436:17;33429:24;;33389:3555;33522:4;:11;;33530:3;33522:11;33518:3426;;-1:-1:-1;;;33564:17:125;;;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:125;;;35722:16;;35682:1262;35807:4;:12;;35815:4;35807:12;35803:1141;;-1:-1:-1;;;35851:7:125;;;35843:16;;35803:1141;35927:4;:12;;35935:4;35927:12;35923:1021;;-1:-1:-1;;;35971:7:125;;;35963:16;;35923:1021;36048:4;:12;;36056:4;36048:12;36044:900;;-1:-1:-1;;;36092:7:125;;;36084:16;;36044:900;36168:4;:12;;36176:4;36168:12;36164:780;;-1:-1:-1;;;36212:7:125;;;36204:16;;36164:780;36287:4;:12;;36295:4;36287:12;36283:661;;-1:-1:-1;;;36331:7:125;;;36323:16;;36283:661;36407:4;:12;;36415:4;36407:12;36403:541;;-1:-1:-1;;;36451:7:125;;;36443:16;;36403:541;36527:4;:12;;36535:4;36527:12;36523:421;;-1:-1:-1;;;36572:7:125;;;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:279;36896:29:125;;;2792:21:279;2849:2;2829:18;;;2822:30;2888:21;2868:18;;;2861:49;2927:18;;36896:29:125;2608:343:279;36787:157:125;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:125;;;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:125;;-1:-1:-1;;37654:8:125;37010:3590;37752:6;:14;;37762:4;37752:14;37748:2852;;-1:-1:-1;;37797:8:125;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:125;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:125;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:125;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:125;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:125;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:125;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:125;20172:2;20160:14;;;;20152:41;;;;;;;3158:2:279;20152:41:125;;;3140:21:279;3197:2;3177:18;;;3170:30;3236:16;3216:18;;;3209:44;3270:18;;20152:41:125;2956:338:279;20152:41:125;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:125;;: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:125;;;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:125;7737:19;7909:14;7928:1;7903:26;7899:131;;7971:36;7995:11;1277:21:126;1426:15;;;1467:8;1461:4;1454:22;1595:4;1582:18;;1602:19;1578:44;1624:11;1575:61;;1222:430;7971:36:125;7957:50;;7899:131;8116:20;;;;;8083:54;;;;;;;;3472:25:279;;;8083:54:125;3533:23:279;;;3513:18;;;3506:51;8052:11:125;;;;8083:19;:6;:19;;;;3445:18:279;;8083:54:125;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::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:125;;-1:-1:-1;;;7506:2538:125;;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:125;;;1859:1;10346:15;10327:34;:57;;;-1:-1:-1;10365:19:125;;;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:125;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:125;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:125;;;1978:1;12339:22;12321:40;:62;;;-1:-1:-1;12365:18:125;;;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:125;;;1859:1;12481:15;12462:34;:61;;;-1:-1:-1;12500:23:125;;;2021:1;12500:23;12462:61;:84;;;-1:-1:-1;12527:19:125;;;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:125;;;;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:125;16228:10;16336:13;;;16345:4;16336:13;16332:1705;;-1:-1:-1;16375:8:125;;;;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:125;;;;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:125: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:125;24984:9;24948:343;;;-1:-1:-1;;25390:4:125;25383:18;-1:-1:-1;;;;23777:1654:125:o;20810:586::-;21132:20;;;21156:7;21132:32;21125:3;:40;;;21238:14;;21293:17;;21287:24;;;21279:72;;;;;;;4209:2:279;21279:72:125;;;4191:21:279;4248:2;4228:18;;;4221:30;4287:34;4267:18;;;4260:62;4358:5;4338:18;;;4331:33;4381:19;;21279:72:125;4007:399:279;21279:72:125;21365:14;20810:586;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;467:347:279:-;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:279;;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:279;-1:-1:-1;1332:2:279;1317:18;;1304:32;;-1:-1:-1;1348:16:279;;;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:279;-1:-1:-1;;;;819:717:279: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:279;;3803:2;3788:18;;;3782:25;3747:16;;3782:25;;-1:-1:-1;3568:245:279: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-bindings/bindings/preimageoracle_more.go b/op-bindings/bindings/preimageoracle_more.go index 8326f0d2b6cf..32d4d16b0248 100644 --- a/op-bindings/bindings/preimageoracle_more.go +++ b/op-bindings/bindings/preimageoracle_more.go @@ -15,7 +15,7 @@ var PreimageOracleStorageLayout = new(solc.StorageLayout) var PreimageOracleDeployedBin = "0x608060405234801561001057600080fd5b506004361061007d5760003560e01c8063e03110e11161005b578063e03110e114610111578063e159261114610139578063fe4ac08e1461014e578063fef2b4ed146101c357600080fd5b806361238bde146100825780638542cf50146100c05780639a1f5e7f146100fe575b600080fd5b6100ad610090366004610551565b600160209081526000928352604080842090915290825290205481565b6040519081526020015b60405180910390f35b6100ee6100ce366004610551565b600260209081526000928352604080842090915290825290205460ff1681565b60405190151581526020016100b7565b6100ad61010c366004610573565b6101e3565b61012461011f366004610551565b6102b6565b604080519283526020830191909152016100b7565b61014c6101473660046105a5565b6103a7565b005b61014c61015c366004610573565b6000838152600260209081526040808320878452825280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660019081179091558684528252808320968352958152858220939093559283529082905291902055565b6100ad6101d1366004610621565b60006020819052908152604090205481565b60006101ee856104b0565b90506101fb836008610669565b8211806102085750602083115b1561023f576040517ffe25498700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000602081815260c085901b82526008959095528251828252600286526040808320858452875280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600190811790915584845287528083209483529386528382205581815293849052922055919050565b6000828152600260209081526040808320848452909152812054819060ff1661033f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f7072652d696d616765206d757374206578697374000000000000000000000000604482015260640160405180910390fd5b506000838152602081815260409091205461035b816008610669565b610366856020610669565b106103845783610377826008610669565b6103819190610681565b91505b506000938452600160209081526040808620948652939052919092205492909150565b604435600080600883018611156103c65763fe2549876000526004601cfd5b60c083901b6080526088838682378087017ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80151908490207effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f02000000000000000000000000000000000000000000000000000000000000001760008181526002602090815260408083208b8452825280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600190811790915584845282528083209a83529981528982209390935590815290819052959095209190915550505050565b7f01000000000000000000000000000000000000000000000000000000000000007effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82161761054b81600090815233602052604090207effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f01000000000000000000000000000000000000000000000000000000000000001790565b92915050565b6000806040838503121561056457600080fd5b50508035926020909101359150565b6000806000806080858703121561058957600080fd5b5050823594602084013594506040840135936060013592509050565b6000806000604084860312156105ba57600080fd5b83359250602084013567ffffffffffffffff808211156105d957600080fd5b818601915086601f8301126105ed57600080fd5b8135818111156105fc57600080fd5b87602082850101111561060e57600080fd5b6020830194508093505050509250925092565b60006020828403121561063357600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000821982111561067c5761067c61063a565b500190565b6000828210156106935761069361063a565b50039056fea164736f6c634300080f000a" -var PreimageOracleDeployedSourceMap = "306:4436:108:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;537:68;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;413:25:260;;;401:2;386:18;537:68:108;;;;;;;;680:66;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;614:14:260;;607:22;589:41;;577:2;562:18;680:66:108;449:187:260;1938:1165:108;;;;;;:::i;:::-;;:::i;789:536::-;;;;;;:::i;:::-;;:::i;:::-;;;;1205:25:260;;;1261:2;1246:18;;1239:34;;;;1178:18;789:536:108;1031:248:260;3145:1595:108;;;;;;:::i;:::-;;:::i;:::-;;1672:224;;;;;;:::i;:::-;1767:19;;;;:14;:19;;;;;;;;:31;;;;;;;;:38;;;;1801:4;1767:38;;;;;;1815:18;;;;;;;;:30;;;;;;;;;:37;;;;1862:20;;;;;;;;;;:27;1672:224;419:50;;;;;;:::i;:::-;;;;;;;;;;;;;;;1938:1165;2100:12;2205:36;2234:6;2205:28;:36::i;:::-;2198:43;-1:-1:-1;2335:9:108;:5;2343:1;2335:9;:::i;:::-;2321:11;:23;:37;;;;2356:2;2348:5;:10;2321:37;2317:90;;;2381:15;;;;;;;;;;;;;;2317:90;2476:12;2576:4;2569:18;;;2677:3;2673:15;;;2660:29;;2709:4;2702:19;;;;2811:18;;2901:20;;;:14;:20;;;;;;:33;;;;;;;;:40;;;;2937:4;2901:40;;;;;;2951:19;;;;;;;;:32;;;;;;;;;:39;3067:21;;;;;;;;;:29;2916:4;1938:1165;-1:-1:-1;1938:1165:108:o;789:536::-;865:12;914:20;;;:14;:20;;;;;;;;:29;;;;;;;;;865:12;;914:29;;906:62;;;;;;;3229:2:260;906:62:108;;;3211:21:260;3268:2;3248:18;;;3241:30;3307:22;3287:18;;;3280:50;3347:18;;906:62:108;;;;;;;;-1:-1:-1;1099:14:108;1116:21;;;1087:2;1116:21;;;;;;;;1167:10;1116:21;1176:1;1167:10;:::i;:::-;1151:12;:7;1161:2;1151:12;:::i;:::-;:26;1147:87;;1216:7;1203:10;:6;1212:1;1203:10;:::i;:::-;:20;;;;:::i;:::-;1193:30;;1147:87;-1:-1:-1;1290:19:108;;;;:13;:19;;;;;;;;:28;;;;;;;;;;;;789:536;;-1:-1:-1;789:536:108:o;3145:1595::-;3441:4;3428:18;3246:12;;3570:1;3560:12;;3544:29;;3541:210;;;3645:10;3642:1;3635:21;3735:1;3729:4;3722:15;3541:210;3994:3;3990:14;;;3894:4;3978:27;4025:11;3999:4;4144:16;4025:11;4126:41;4357:29;;;4361:11;4357:29;4351:36;4409:20;;;;4556:19;4549:27;4578:11;4546:44;4609:19;;;;4587:1;4609:19;;;;;;;;:32;;;;;;;;:39;;;;4644:4;4609:39;;;;;;4658:18;;;;;;;;:31;;;;;;;;;:38;;;;4706:20;;;;;;;;;;;:27;;;;-1:-1:-1;;;;3145:1595:108:o;492:353:107:-;752:11;777:19;765:32;;749:49;824:14;749:49;1277:21;1426:15;;;1467:8;1461:4;1454:22;1595:4;1582:18;;1602:19;1578:44;1624:11;1575:61;;1222:430;824:14;817:21;492:353;-1:-1:-1;;492:353:107:o;14:248:260:-;82:6;90;143:2;131:9;122:7;118:23;114:32;111:52;;;159:1;156;149:12;111:52;-1:-1:-1;;182:23:260;;;252:2;237:18;;;224:32;;-1:-1:-1;14:248:260:o;641:385::-;727:6;735;743;751;804:3;792:9;783:7;779:23;775:33;772:53;;;821:1;818;811:12;772:53;-1:-1:-1;;844:23:260;;;914:2;899:18;;886:32;;-1:-1:-1;965:2:260;950:18;;937:32;;1016:2;1001:18;988:32;;-1:-1:-1;641:385:260;-1:-1:-1;641:385:260:o;1284:659::-;1363:6;1371;1379;1432:2;1420:9;1411:7;1407:23;1403:32;1400:52;;;1448:1;1445;1438:12;1400:52;1484:9;1471:23;1461:33;;1545:2;1534:9;1530:18;1517:32;1568:18;1609:2;1601:6;1598:14;1595:34;;;1625:1;1622;1615:12;1595:34;1663:6;1652:9;1648:22;1638:32;;1708:7;1701:4;1697:2;1693:13;1689:27;1679:55;;1730:1;1727;1720:12;1679:55;1770:2;1757:16;1796:2;1788:6;1785:14;1782:34;;;1812:1;1809;1802:12;1782:34;1857:7;1852:2;1843:6;1839:2;1835:15;1831:24;1828:37;1825:57;;;1878:1;1875;1868:12;1825:57;1909:2;1905;1901:11;1891:21;;1931:6;1921:16;;;;;1284:659;;;;;:::o;2338:180::-;2397:6;2450:2;2438:9;2429:7;2425:23;2421:32;2418:52;;;2466:1;2463;2456:12;2418:52;-1:-1:-1;2489:23:260;;2338:180;-1:-1:-1;2338:180:260:o;2705:184::-;2757:77;2754:1;2747:88;2854:4;2851:1;2844:15;2878:4;2875:1;2868:15;2894:128;2934:3;2965:1;2961:6;2958:1;2955:13;2952:39;;;2971:18;;:::i;:::-;-1:-1:-1;3007:9:260;;2894:128::o;3376:125::-;3416:4;3444:1;3441;3438:8;3435:34;;;3449:18;;:::i;:::-;-1:-1:-1;3486:9:260;;3376:125::o" +var PreimageOracleDeployedSourceMap = "306:4436:127:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;537:68;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;413:25:279;;;401:2;386:18;537:68:127;;;;;;;;680:66;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;614:14:279;;607:22;589:41;;577:2;562:18;680:66:127;449:187:279;1938:1165:127;;;;;;:::i;:::-;;:::i;789:536::-;;;;;;:::i;:::-;;:::i;:::-;;;;1205:25:279;;;1261:2;1246:18;;1239:34;;;;1178:18;789:536:127;1031:248:279;3145:1595:127;;;;;;:::i;:::-;;:::i;:::-;;1672:224;;;;;;:::i;:::-;1767:19;;;;:14;:19;;;;;;;;:31;;;;;;;;:38;;;;1801:4;1767:38;;;;;;1815:18;;;;;;;;:30;;;;;;;;;:37;;;;1862:20;;;;;;;;;;:27;1672:224;419:50;;;;;;:::i;:::-;;;;;;;;;;;;;;;1938:1165;2100:12;2205:36;2234:6;2205:28;:36::i;:::-;2198:43;-1:-1:-1;2335:9:127;:5;2343:1;2335:9;:::i;:::-;2321:11;:23;:37;;;;2356:2;2348:5;:10;2321:37;2317:90;;;2381:15;;;;;;;;;;;;;;2317:90;2476:12;2576:4;2569:18;;;2677:3;2673:15;;;2660:29;;2709:4;2702:19;;;;2811:18;;2901:20;;;:14;:20;;;;;;:33;;;;;;;;:40;;;;2937:4;2901:40;;;;;;2951:19;;;;;;;;:32;;;;;;;;;:39;3067:21;;;;;;;;;:29;2916:4;1938:1165;-1:-1:-1;1938:1165:127:o;789:536::-;865:12;914:20;;;:14;:20;;;;;;;;:29;;;;;;;;;865:12;;914:29;;906:62;;;;;;;3229:2:279;906:62:127;;;3211:21:279;3268:2;3248:18;;;3241:30;3307:22;3287:18;;;3280:50;3347:18;;906:62:127;;;;;;;;-1:-1:-1;1099:14:127;1116:21;;;1087:2;1116:21;;;;;;;;1167:10;1116:21;1176:1;1167:10;:::i;:::-;1151:12;:7;1161:2;1151:12;:::i;:::-;:26;1147:87;;1216:7;1203:10;:6;1212:1;1203:10;:::i;:::-;:20;;;;:::i;:::-;1193:30;;1147:87;-1:-1:-1;1290:19:127;;;;:13;:19;;;;;;;;:28;;;;;;;;;;;;789:536;;-1:-1:-1;789:536:127:o;3145:1595::-;3441:4;3428:18;3246:12;;3570:1;3560:12;;3544:29;;3541:210;;;3645:10;3642:1;3635:21;3735:1;3729:4;3722:15;3541:210;3994:3;3990:14;;;3894:4;3978:27;4025:11;3999:4;4144:16;4025:11;4126:41;4357:29;;;4361:11;4357:29;4351:36;4409:20;;;;4556:19;4549:27;4578:11;4546:44;4609:19;;;;4587:1;4609:19;;;;;;;;:32;;;;;;;;:39;;;;4644:4;4609:39;;;;;;4658:18;;;;;;;;:31;;;;;;;;;:38;;;;4706:20;;;;;;;;;;;:27;;;;-1:-1:-1;;;;3145:1595:127:o;492:353:126:-;752:11;777:19;765:32;;749:49;824:14;749:49;1277:21;1426:15;;;1467:8;1461:4;1454:22;1595:4;1582:18;;1602:19;1578:44;1624:11;1575:61;;1222:430;824:14;817:21;492:353;-1:-1:-1;;492:353:126:o;14:248:279:-;82:6;90;143:2;131:9;122:7;118:23;114:32;111:52;;;159:1;156;149:12;111:52;-1:-1:-1;;182:23:279;;;252:2;237:18;;;224:32;;-1:-1:-1;14:248:279:o;641:385::-;727:6;735;743;751;804:3;792:9;783:7;779:23;775:33;772:53;;;821:1;818;811:12;772:53;-1:-1:-1;;844:23:279;;;914:2;899:18;;886:32;;-1:-1:-1;965:2:279;950:18;;937:32;;1016:2;1001:18;988:32;;-1:-1:-1;641:385:279;-1:-1:-1;641:385:279:o;1284:659::-;1363:6;1371;1379;1432:2;1420:9;1411:7;1407:23;1403:32;1400:52;;;1448:1;1445;1438:12;1400:52;1484:9;1471:23;1461:33;;1545:2;1534:9;1530:18;1517:32;1568:18;1609:2;1601:6;1598:14;1595:34;;;1625:1;1622;1615:12;1595:34;1663:6;1652:9;1648:22;1638:32;;1708:7;1701:4;1697:2;1693:13;1689:27;1679:55;;1730:1;1727;1720:12;1679:55;1770:2;1757:16;1796:2;1788:6;1785:14;1782:34;;;1812:1;1809;1802:12;1782:34;1857:7;1852:2;1843:6;1839:2;1835:15;1831:24;1828:37;1825:57;;;1878:1;1875;1868:12;1825:57;1909:2;1905;1901:11;1891:21;;1931:6;1921:16;;;;;1284:659;;;;;:::o;2338:180::-;2397:6;2450:2;2438:9;2429:7;2425:23;2421:32;2418:52;;;2466:1;2463;2456:12;2418:52;-1:-1:-1;2489:23:279;;2338:180;-1:-1:-1;2338:180:279:o;2705:184::-;2757:77;2754:1;2747:88;2854:4;2851:1;2844:15;2878:4;2875:1;2868:15;2894:128;2934:3;2965:1;2961:6;2958:1;2955:13;2952:39;;;2971:18;;:::i;:::-;-1:-1:-1;3007:9:279;;2894:128::o;3376:125::-;3416:4;3444:1;3441;3438:8;3435:34;;;3449:18;;:::i;:::-;-1:-1:-1;3486:9:279;;3376:125::o" func init() { if err := json.Unmarshal([]byte(PreimageOracleStorageLayoutJSON), PreimageOracleStorageLayout); err != nil { diff --git a/op-bindings/bindings/safe.go b/op-bindings/bindings/safe.go new file mode 100644 index 000000000000..725223954c6f --- /dev/null +++ b/op-bindings/bindings/safe.go @@ -0,0 +1,3210 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package bindings + +import ( + "errors" + "math/big" + "strings" + + ethereum "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/accounts/abi" + "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/event" +) + +// Reference imports to suppress errors if they are not otherwise used. +var ( + _ = errors.New + _ = big.NewInt + _ = strings.NewReader + _ = ethereum.NotFound + _ = bind.Bind + _ = common.Big1 + _ = types.BloomLookup + _ = event.NewSubscription +) + +// SafeMetaData contains all meta data concerning the Safe contract. +var SafeMetaData = &bind.MetaData{ + ABI: "[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"AddedOwner\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"approvedHash\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"ApproveHash\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"handler\",\"type\":\"address\"}],\"name\":\"ChangedFallbackHandler\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"guard\",\"type\":\"address\"}],\"name\":\"ChangedGuard\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"threshold\",\"type\":\"uint256\"}],\"name\":\"ChangedThreshold\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"module\",\"type\":\"address\"}],\"name\":\"DisabledModule\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"module\",\"type\":\"address\"}],\"name\":\"EnabledModule\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"txHash\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"payment\",\"type\":\"uint256\"}],\"name\":\"ExecutionFailure\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"module\",\"type\":\"address\"}],\"name\":\"ExecutionFromModuleFailure\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"module\",\"type\":\"address\"}],\"name\":\"ExecutionFromModuleSuccess\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"txHash\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"payment\",\"type\":\"uint256\"}],\"name\":\"ExecutionSuccess\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"RemovedOwner\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"SafeReceived\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"initiator\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address[]\",\"name\":\"owners\",\"type\":\"address[]\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"threshold\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"initializer\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"fallbackHandler\",\"type\":\"address\"}],\"name\":\"SafeSetup\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"msgHash\",\"type\":\"bytes32\"}],\"name\":\"SignMsg\",\"type\":\"event\"},{\"stateMutability\":\"nonpayable\",\"type\":\"fallback\"},{\"inputs\":[],\"name\":\"VERSION\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_threshold\",\"type\":\"uint256\"}],\"name\":\"addOwnerWithThreshold\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"hashToApprove\",\"type\":\"bytes32\"}],\"name\":\"approveHash\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"approvedHashes\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_threshold\",\"type\":\"uint256\"}],\"name\":\"changeThreshold\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"dataHash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signatures\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"requiredSignatures\",\"type\":\"uint256\"}],\"name\":\"checkNSignatures\",\"outputs\":[],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"dataHash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signatures\",\"type\":\"bytes\"}],\"name\":\"checkSignatures\",\"outputs\":[],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"prevModule\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"module\",\"type\":\"address\"}],\"name\":\"disableModule\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"domainSeparator\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"module\",\"type\":\"address\"}],\"name\":\"enableModule\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"enumEnum.Operation\",\"name\":\"operation\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"safeTxGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"baseGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"gasPrice\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"gasToken\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"refundReceiver\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_nonce\",\"type\":\"uint256\"}],\"name\":\"encodeTransactionData\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"enumEnum.Operation\",\"name\":\"operation\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"safeTxGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"baseGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"gasPrice\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"gasToken\",\"type\":\"address\"},{\"internalType\":\"addresspayable\",\"name\":\"refundReceiver\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"signatures\",\"type\":\"bytes\"}],\"name\":\"execTransaction\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"enumEnum.Operation\",\"name\":\"operation\",\"type\":\"uint8\"}],\"name\":\"execTransactionFromModule\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"enumEnum.Operation\",\"name\":\"operation\",\"type\":\"uint8\"}],\"name\":\"execTransactionFromModuleReturnData\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"returnData\",\"type\":\"bytes\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getChainId\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"start\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"pageSize\",\"type\":\"uint256\"}],\"name\":\"getModulesPaginated\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"array\",\"type\":\"address[]\"},{\"internalType\":\"address\",\"name\":\"next\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getOwners\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"offset\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"length\",\"type\":\"uint256\"}],\"name\":\"getStorageAt\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getThreshold\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"enumEnum.Operation\",\"name\":\"operation\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"safeTxGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"baseGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"gasPrice\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"gasToken\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"refundReceiver\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_nonce\",\"type\":\"uint256\"}],\"name\":\"getTransactionHash\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"module\",\"type\":\"address\"}],\"name\":\"isModuleEnabled\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"isOwner\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"nonce\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"prevOwner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_threshold\",\"type\":\"uint256\"}],\"name\":\"removeOwner\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"handler\",\"type\":\"address\"}],\"name\":\"setFallbackHandler\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"guard\",\"type\":\"address\"}],\"name\":\"setGuard\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"_owners\",\"type\":\"address[]\"},{\"internalType\":\"uint256\",\"name\":\"_threshold\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"address\",\"name\":\"fallbackHandler\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"paymentToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"payment\",\"type\":\"uint256\"},{\"internalType\":\"addresspayable\",\"name\":\"paymentReceiver\",\"type\":\"address\"}],\"name\":\"setup\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"signedMessages\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"targetContract\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"calldataPayload\",\"type\":\"bytes\"}],\"name\":\"simulateAndRevert\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"prevOwner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"oldOwner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"swapOwner\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}]", + Bin: "0x608060405234801561001057600080fd5b506001600455614201806100256000396000f3fe6080604052600436106101d15760003560e01c8063affed0e0116100f7578063e19a9dd911610095578063f08a032311610064578063f08a0323146105f5578063f698da2514610615578063f8dc5dd91461067c578063ffa1ad741461069c5761020d565b8063e19a9dd914610580578063e318b52b146105a0578063e75235b8146105c0578063e86637db146105d55761020d565b8063cc2f8452116100d1578063cc2f8452146104f2578063d4d9bdcd14610520578063d8d11f7814610540578063e009cfde146105605761020d565b8063affed0e01461049c578063b4faba09146104b2578063b63e800d146104d25761020d565b80635624b25b1161016f5780636a7612021161013e5780636a7612021461040f5780637d83297414610422578063934f3a111461045a578063a0e67e2b1461047a5761020d565b80635624b25b146103755780635ae6bd37146103a2578063610b5925146103cf578063694e80c3146103ef5761020d565b80632f54bf6e116101ab5780632f54bf6e146102ea5780633408e4701461030a578063468721a7146103275780635229073f146103475761020d565b80630d582f131461027357806312fb68e0146102955780632d9ad53d146102b55761020d565b3661020d5760405134815233907f3d0ce9bfc3ed7d6862dbb28b2dea94561fe714a1b4d019aa8af39730d1ad7c3d9060200160405180910390a2005b34801561021957600080fd5b507f6c9a6c4a39284e37ed1cf53d337577d14212a4870fb976a4366c693b939918d580548061024457005b36600080373360601b365260008060143601600080855af190503d6000803e8061026d573d6000fd5b503d6000f35b34801561027f57600080fd5b5061029361028e366004613568565b6106e5565b005b3480156102a157600080fd5b506102936102b036600461366e565b610933565b3480156102c157600080fd5b506102d56102d03660046136e3565b610ff7565b60405190151581526020015b60405180910390f35b3480156102f657600080fd5b506102d56103053660046136e3565b61104c565b34801561031657600080fd5b50465b6040519081526020016102e1565b34801561033357600080fd5b506102d561034236600461370f565b61109e565b34801561035357600080fd5b5061036761036236600461370f565b6111d4565b6040516102e19291906137e4565b34801561038157600080fd5b506103956103903660046137ff565b61120a565b6040516102e19190613821565b3480156103ae57600080fd5b506103196103bd366004613834565b60076020526000908152604090205481565b3480156103db57600080fd5b506102936103ea3660046136e3565b611290565b3480156103fb57600080fd5b5061029361040a366004613834565b611479565b6102d561041d366004613896565b611593565b34801561042e57600080fd5b5061031961043d366004613568565b600860209081526000928352604080842090915290825290205481565b34801561046657600080fd5b5061029361047536600461396f565b61198f565b34801561048657600080fd5b5061048f611a0b565b6040516102e19190613a2d565b3480156104a857600080fd5b5061031960055481565b3480156104be57600080fd5b506102936104cd366004613a40565b611b23565b3480156104de57600080fd5b506102936104ed366004613a90565b611b46565b3480156104fe57600080fd5b5061051261050d366004613568565b611c62565b6040516102e1929190613b85565b34801561052c57600080fd5b5061029361053b366004613834565b611ed0565b34801561054c57600080fd5b5061031961055b366004613bbd565b611fa4565b34801561056c57600080fd5b5061029361057b366004613c7e565b611fd1565b34801561058c57600080fd5b5061029361059b3660046136e3565b6121a3565b3480156105ac57600080fd5b506102936105bb366004613cb7565b612344565b3480156105cc57600080fd5b50600454610319565b3480156105e157600080fd5b506103956105f0366004613bbd565b6126bc565b34801561060157600080fd5b506102936106103660046136e3565b612855565b34801561062157600080fd5b5061031960007f47e79534a245952e8b16893a336b85a3d9ea9fa8c573f3d803afb92a794692184660408051602081019390935282015230606082015260800160405160208183030381529060405280519060200120905090565b34801561068857600080fd5b50610293610697366004613d02565b6128aa565b3480156106a857600080fd5b506103956040518060400160405280600581526020017f312e342e3000000000000000000000000000000000000000000000000000000081525081565b6106ed612b34565b73ffffffffffffffffffffffffffffffffffffffff821615801590610729575073ffffffffffffffffffffffffffffffffffffffff8216600114155b801561074b575073ffffffffffffffffffffffffffffffffffffffff82163014155b6107b6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475332303300000000000000000000000000000000000000000000000000000060448201526064015b60405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8281166000908152600260205260409020541615610845576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475332303400000000000000000000000000000000000000000000000000000060448201526064016107ad565b60026020527fe90b7bceb6e7df5418fb78d8ee546e97c83a08bbccc01a0644d599ccd2a7c2e0805473ffffffffffffffffffffffffffffffffffffffff8481166000818152604081208054939094167fffffffffffffffffffffffff0000000000000000000000000000000000000000938416179093556001835283549091161790915560038054916108d783613d72565b909155505060405173ffffffffffffffffffffffffffffffffffffffff8316907f9465fa0c962cc76958e6373a993326400c1c94f8be2fe3a952adfa7f60b2ea2690600090a2806004541461092f5761092f81611479565b5050565b61093e816041612b9f565b825110156109a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475330323000000000000000000000000000000000000000000000000000000060448201526064016107ad565b6000808060008060005b86811015610feb576041818102890160208101516040820151919092015160ff16955090935091506000849003610cf857885160208a01208a14610a52576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475330323700000000000000000000000000000000000000000000000000000060448201526064016107ad565b9193508391610a62876041612b9f565b821015610acb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475330323100000000000000000000000000000000000000000000000000000060448201526064016107ad565b8751610ad8836020612bdb565b1115610b40576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475330323200000000000000000000000000000000000000000000000000000060448201526064016107ad565b602082890181015189519091610b63908390610b5d908790612bdb565b90612bdb565b1115610bcb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475330323300000000000000000000000000000000000000000000000000000060448201526064016107ad565b6040517f20c13b0b000000000000000000000000000000000000000000000000000000008082528a85016020019173ffffffffffffffffffffffffffffffffffffffff8916906320c13b0b90610c27908f908690600401613daa565b602060405180830381865afa158015610c44573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c689190613dcf565b7fffffffff000000000000000000000000000000000000000000000000000000001614610cf1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475330323400000000000000000000000000000000000000000000000000000060448201526064016107ad565b5050610eeb565b8360ff16600103610dc65791935083913373ffffffffffffffffffffffffffffffffffffffff84161480610d5b575073ffffffffffffffffffffffffffffffffffffffff851660009081526008602090815260408083208d845290915290205415155b610dc1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475330323500000000000000000000000000000000000000000000000000000060448201526064016107ad565b610eeb565b601e8460ff161115610e8b576040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c81018b9052600190605c0160405160208183030381529060405280519060200120600486610e2b9190613e11565b6040805160008152602081018083529390935260ff90911690820152606081018590526080810184905260a0016020604051602081039080840390855afa158015610e7a573d6000803e3d6000fd5b505050602060405103519450610eeb565b6040805160008152602081018083528c905260ff861691810191909152606081018490526080810183905260019060a0016020604051602081039080840390855afa158015610ede573d6000803e3d6000fd5b5050506020604051035194505b8573ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16118015610f4c575073ffffffffffffffffffffffffffffffffffffffff8581166000908152600260205260409020541615155b8015610f6f575073ffffffffffffffffffffffffffffffffffffffff8516600114155b610fd5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475330323600000000000000000000000000000000000000000000000000000060448201526064016107ad565b8495508080610fe390613d72565b9150506109b2565b50505050505050505050565b6000600173ffffffffffffffffffffffffffffffffffffffff831614801590611046575073ffffffffffffffffffffffffffffffffffffffff8281166000908152600160205260409020541615155b92915050565b600073ffffffffffffffffffffffffffffffffffffffff821660011480159061104657505073ffffffffffffffffffffffffffffffffffffffff90811660009081526002602052604090205416151590565b6000336001148015906110d557503360009081526001602052604090205473ffffffffffffffffffffffffffffffffffffffff1615155b61113b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475331303400000000000000000000000000000000000000000000000000000060448201526064016107ad565b611168858585857fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff612bf7565b905080156111a05760405133907f6895c13664aa4f67288b25d7a21d7aaa34916e355fb9b6fae0a139a9085becb890600090a26111cc565b60405133907facd2c8702804128fdb0db2bb49f6d127dd0181c13fd45dbfe16de0930e2bd37590600090a25b949350505050565b600060606111e48686868661109e565b915060405160203d0181016040523d81523d6000602083013e8091505094509492505050565b60606000611219836020613e34565b67ffffffffffffffff81111561123157611231613594565b6040519080825280601f01601f19166020018201604052801561125b576020820181803683370190505b50905060005b8381101561128857848101546020808302840101528061128081613d72565b915050611261565b509392505050565b611298612b34565b73ffffffffffffffffffffffffffffffffffffffff8116158015906112d4575073ffffffffffffffffffffffffffffffffffffffff8116600114155b61133a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475331303100000000000000000000000000000000000000000000000000000060448201526064016107ad565b73ffffffffffffffffffffffffffffffffffffffff81811660009081526001602052604090205416156113c9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475331303200000000000000000000000000000000000000000000000000000060448201526064016107ad565b600160208190527fcc69885fda6bcc1a4ace058b4a62bf5e179ea78fd58a1ccd71c22cc9b688792f805473ffffffffffffffffffffffffffffffffffffffff848116600081815260408082208054949095167fffffffffffffffffffffffff000000000000000000000000000000000000000094851617909455948552835490911681179092555190917fecdf3a3effea5783a3c4c2140e677577666428d44ed9d474a0b3a4c9943f844091a250565b611481612b34565b6003548111156114ed576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475332303100000000000000000000000000000000000000000000000000000060448201526064016107ad565b6001811015611558576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475332303200000000000000000000000000000000000000000000000000000060448201526064016107ad565b60048190556040518181527f610f7ff2b304ae8903c3de74c60c6ab1f7d6226b3f52c5161905bb5ad4039c939060200160405180910390a150565b60008060006115ad8e8e8e8e8e8e8e8e8e8e6005546126bc565b6005805491925060006115bf83613d72565b90915550508051602082012091506115d882828661198f565b5060006116037f4a204f620c8c5ccdca3fd54d003badd85ba500436a431f0cbda4f558c93c34c85490565b905073ffffffffffffffffffffffffffffffffffffffff8116156116a3578073ffffffffffffffffffffffffffffffffffffffff166375f0bb528f8f8f8f8f8f8f8f8f8f8f336040518d63ffffffff1660e01b81526004016116709c9b9a99989796959493929190613edb565b600060405180830381600087803b15801561168a57600080fd5b505af115801561169e573d6000803e3d6000fd5b505050505b6116cf6116b28a6109c4613ff1565b603f6116bf8c6040613e34565b6116c99190614009565b90612c3e565b6116db906101f4613ff1565b5a1015611744576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475330313000000000000000000000000000000000000000000000000000000060448201526064016107ad565b60005a90506117b58f8f8f8f8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508e8c6000146117a2578e612bf7565b6109c45a6117b09190614044565b612bf7565b93506117c25a8290612c55565b905083806117cf57508915155b806117d957508715155b61183f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475330313300000000000000000000000000000000000000000000000000000060448201526064016107ad565b6000881561185757611854828b8b8b8b612c70565b90505b841561189c57837f442e715f626346e8c54381002da614f62bee8d27386535b2521ec8540898556e8260405161188f91815260200190565b60405180910390a26118d7565b837f23428b18acfb3ea64b08dc0c1d296ea9c09702c09083ca5272e64d115b687d23826040516118ce91815260200190565b60405180910390a25b505073ffffffffffffffffffffffffffffffffffffffff81161561197e576040517f9327136800000000000000000000000000000000000000000000000000000000815260048101839052831515602482015273ffffffffffffffffffffffffffffffffffffffff821690639327136890604401600060405180830381600087803b15801561196557600080fd5b505af1158015611979573d6000803e3d6000fd5b505050505b50509b9a5050505050505050505050565b600454806119f9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475330303100000000000000000000000000000000000000000000000000000060448201526064016107ad565b611a0584848484610933565b50505050565b6060600060035467ffffffffffffffff811115611a2a57611a2a613594565b604051908082528060200260200182016040528015611a53578160200160208202803683370190505b506001600090815260026020527fe90b7bceb6e7df5418fb78d8ee546e97c83a08bbccc01a0644d599ccd2a7c2e0549192509073ffffffffffffffffffffffffffffffffffffffff165b73ffffffffffffffffffffffffffffffffffffffff8116600114611b1b5780838381518110611ace57611ace61405b565b73ffffffffffffffffffffffffffffffffffffffff928316602091820292909201810191909152918116600090815260029092526040909120541681611b1381613d72565b925050611a9d565b509092915050565b600080825160208401855af480600052503d6020523d600060403e60403d016000fd5b611b848a8a808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508c9250612e01915050565b73ffffffffffffffffffffffffffffffffffffffff841615611ba957611ba9846131ce565b611be98787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061327192505050565b8115611c0057611bfe82600060018685612c70565b505b3373ffffffffffffffffffffffffffffffffffffffff167f141df868a6331af528e38c83b7aa03edc19be66e37ae67f9285bf4f8e3c6a1a88b8b8b8b89604051611c4e95949392919061408a565b60405180910390a250505050505050505050565b6060600073ffffffffffffffffffffffffffffffffffffffff841660011480611c8f5750611c8f84610ff7565b611cf5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475331303500000000000000000000000000000000000000000000000000000060448201526064016107ad565b60008311611d5f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475331303600000000000000000000000000000000000000000000000000000060448201526064016107ad565b8267ffffffffffffffff811115611d7857611d78613594565b604051908082528060200260200182016040528015611da1578160200160208202803683370190505b5073ffffffffffffffffffffffffffffffffffffffff808616600090815260016020526040812054929450911691505b73ffffffffffffffffffffffffffffffffffffffff821615801590611e0d575073ffffffffffffffffffffffffffffffffffffffff8216600114155b8015611e1857508381105b15611e805781838281518110611e3057611e3061405b565b73ffffffffffffffffffffffffffffffffffffffff928316602091820292909201810191909152928116600090815260019093526040909220549091169080611e7881613d72565b915050611dd1565b73ffffffffffffffffffffffffffffffffffffffff8216600114611ec55782611eaa600183614044565b81518110611eba57611eba61405b565b602002602001015191505b808352509250929050565b3360009081526002602052604090205473ffffffffffffffffffffffffffffffffffffffff16611f5c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475330333000000000000000000000000000000000000000000000000000000060448201526064016107ad565b336000818152600860209081526040808320858452909152808220600190555183917ff2a0eb156472d1440255b0d7c1e19cc07115d1051fe605b0dce69acfec884d9c91a350565b6000611fb98c8c8c8c8c8c8c8c8c8c8c6126bc565b8051906020012090509b9a5050505050505050505050565b611fd9612b34565b73ffffffffffffffffffffffffffffffffffffffff811615801590612015575073ffffffffffffffffffffffffffffffffffffffff8116600114155b61207b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475331303100000000000000000000000000000000000000000000000000000060448201526064016107ad565b73ffffffffffffffffffffffffffffffffffffffff82811660009081526001602052604090205481169082161461210e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475331303300000000000000000000000000000000000000000000000000000060448201526064016107ad565b73ffffffffffffffffffffffffffffffffffffffff818116600081815260016020526040808220805487861684528284208054919096167fffffffffffffffffffffffff0000000000000000000000000000000000000000918216179095558383528054909416909355915190917faab4fa2b463f581b2b32cb3b7e3b704b9ce37cc209b5fb4d77e593ace405427691a25050565b6121ab612b34565b73ffffffffffffffffffffffffffffffffffffffff8116156122db576040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527fe6d7a83a00000000000000000000000000000000000000000000000000000000600482015273ffffffffffffffffffffffffffffffffffffffff8216906301ffc9a790602401602060405180830381865afa158015612251573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122759190614110565b6122db576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475333303000000000000000000000000000000000000000000000000000000060448201526064016107ad565b7f4a204f620c8c5ccdca3fd54d003badd85ba500436a431f0cbda4f558c93c34c881815560405173ffffffffffffffffffffffffffffffffffffffff8316907f1151116914515bc0891ff9047a6cb32cf902546f83066499bcf8ba33d2353fa290600090a25050565b61234c612b34565b73ffffffffffffffffffffffffffffffffffffffff811615801590612388575073ffffffffffffffffffffffffffffffffffffffff8116600114155b80156123aa575073ffffffffffffffffffffffffffffffffffffffff81163014155b612410576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475332303300000000000000000000000000000000000000000000000000000060448201526064016107ad565b73ffffffffffffffffffffffffffffffffffffffff818116600090815260026020526040902054161561249f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475332303400000000000000000000000000000000000000000000000000000060448201526064016107ad565b73ffffffffffffffffffffffffffffffffffffffff8216158015906124db575073ffffffffffffffffffffffffffffffffffffffff8216600114155b612541576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475332303300000000000000000000000000000000000000000000000000000060448201526064016107ad565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600260205260409020548116908316146125d4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475332303500000000000000000000000000000000000000000000000000000060448201526064016107ad565b73ffffffffffffffffffffffffffffffffffffffff828116600081815260026020526040808220805486861680855283852080549288167fffffffffffffffffffffffff00000000000000000000000000000000000000009384161790559589168452828420805482169096179095558383528054909416909355915190917ff8d49fc529812e9a7c5c50e69c20f0dccc0db8fa95c98bc58cc9a4f1c1299eaf91a260405173ffffffffffffffffffffffffffffffffffffffff8216907f9465fa0c962cc76958e6373a993326400c1c94f8be2fe3a952adfa7f60b2ea2690600090a2505050565b606060007fbb8310d486368db6bd6f849402fdd73ad53d316b5a4b2644ad6efe0f941286d860001b8d8d8d8d6040516126f6929190614132565b60405190819003812061271c949392918e908e908e908e908e908e908e90602001614142565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052805160209091012090507f19000000000000000000000000000000000000000000000000000000000000007f01000000000000000000000000000000000000000000000000000000000000006127f060007f47e79534a245952e8b16893a336b85a3d9ea9fa8c573f3d803afb92a794692184660408051602081019390935282015230606082015260800160405160208183030381529060405280519060200120905090565b6040517fff0000000000000000000000000000000000000000000000000000000000000093841660208201529290911660218301526022820152604281018290526062016040516020818303038152906040529150509b9a5050505050505050505050565b61285d612b34565b612866816131ce565b60405173ffffffffffffffffffffffffffffffffffffffff8216907f5ac6c46c93c8d0e53714ba3b53db3e7c046da994313d7ed0d192028bc7c228b090600090a250565b6128b2612b34565b8060016003546128c29190614044565b101561292a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475332303100000000000000000000000000000000000000000000000000000060448201526064016107ad565b73ffffffffffffffffffffffffffffffffffffffff821615801590612966575073ffffffffffffffffffffffffffffffffffffffff8216600114155b6129cc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475332303300000000000000000000000000000000000000000000000000000060448201526064016107ad565b73ffffffffffffffffffffffffffffffffffffffff838116600090815260026020526040902054811690831614612a5f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475332303500000000000000000000000000000000000000000000000000000060448201526064016107ad565b73ffffffffffffffffffffffffffffffffffffffff828116600081815260026020526040808220805488861684529183208054929095167fffffffffffffffffffffffff00000000000000000000000000000000000000009283161790945591815282549091169091556003805491612ad7836141bf565b909155505060405173ffffffffffffffffffffffffffffffffffffffff8316907ff8d49fc529812e9a7c5c50e69c20f0dccc0db8fa95c98bc58cc9a4f1c1299eaf90600090a28060045414612b2f57612b2f81611479565b505050565b333014612b9d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475330333100000000000000000000000000000000000000000000000000000060448201526064016107ad565b565b600082600003612bb157506000611046565b6000612bbd8385613e34565b905082612bca8583614009565b14612bd457600080fd5b9392505050565b600080612be88385613ff1565b905083811015612bd457600080fd5b60006001836001811115612c0d57612c0d613e71565b03612c25576000808551602087018986f49050612c35565b600080855160208701888a87f190505b95945050505050565b600081831015612c4e5781612bd4565b5090919050565b600082821115612c6457600080fd5b60006111cc8385614044565b60008073ffffffffffffffffffffffffffffffffffffffff831615612c955782612c97565b325b905073ffffffffffffffffffffffffffffffffffffffff8416612d7657612cd63a8610612cc4573a612cc6565b855b612cd08989612bdb565b90612b9f565b60405190925073ffffffffffffffffffffffffffffffffffffffff82169083156108fc029084906000818181858888f19350505050612d71576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475330313100000000000000000000000000000000000000000000000000000060448201526064016107ad565b612df7565b612d8485612cd08989612bdb565b9150612d91848284613469565b612df7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475330313200000000000000000000000000000000000000000000000000000060448201526064016107ad565b5095945050505050565b60045415612e6b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475332303000000000000000000000000000000000000000000000000000000060448201526064016107ad565b8151811115612ed6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475332303100000000000000000000000000000000000000000000000000000060448201526064016107ad565b6001811015612f41576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475332303200000000000000000000000000000000000000000000000000000060448201526064016107ad565b600160005b8351811015613176576000848281518110612f6357612f6361405b565b60200260200101519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614158015612fc1575073ffffffffffffffffffffffffffffffffffffffff8116600114155b8015612fe3575073ffffffffffffffffffffffffffffffffffffffff81163014155b801561301b57508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b613081576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475332303300000000000000000000000000000000000000000000000000000060448201526064016107ad565b73ffffffffffffffffffffffffffffffffffffffff8181166000908152600260205260409020541615613110576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475332303400000000000000000000000000000000000000000000000000000060448201526064016107ad565b73ffffffffffffffffffffffffffffffffffffffff928316600090815260026020526040902080547fffffffffffffffffffffffff000000000000000000000000000000000000000016938216939093179092558061316e81613d72565b915050612f46565b5073ffffffffffffffffffffffffffffffffffffffff16600090815260026020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001660011790559051600355600455565b3073ffffffffffffffffffffffffffffffffffffffff82160361324d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475334303000000000000000000000000000000000000000000000000000000060448201526064016107ad565b7f6c9a6c4a39284e37ed1cf53d337577d14212a4870fb976a4366c693b939918d555565b600160008190526020527fcc69885fda6bcc1a4ace058b4a62bf5e179ea78fd58a1ccd71c22cc9b688792f5473ffffffffffffffffffffffffffffffffffffffff161561331a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475331303000000000000000000000000000000000000000000000000000000060448201526064016107ad565b6001600081905260208190527fcc69885fda6bcc1a4ace058b4a62bf5e179ea78fd58a1ccd71c22cc9b688792f80547fffffffffffffffffffffffff000000000000000000000000000000000000000016909117905573ffffffffffffffffffffffffffffffffffffffff82161561092f57813b6133f4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475330303200000000000000000000000000000000000000000000000000000060448201526064016107ad565b6134038260008360015a612bf7565b61092f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475330303000000000000000000000000000000000000000000000000000000060448201526064016107ad565b6040805173ffffffffffffffffffffffffffffffffffffffff841660248201526044808201849052825180830390910181526064909101909152602080820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001781528251600093929184919082896127105a03f13d8015613516576020811461351e5760009350613529565b819350613529565b600051158215171593505b5050509392505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461355557600080fd5b50565b803561356381613533565b919050565b6000806040838503121561357b57600080fd5b823561358681613533565b946020939093013593505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f8301126135d457600080fd5b813567ffffffffffffffff808211156135ef576135ef613594565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561363557613635613594565b8160405283815286602085880101111561364e57600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000806000806080858703121561368457600080fd5b84359350602085013567ffffffffffffffff808211156136a357600080fd5b6136af888389016135c3565b945060408701359150808211156136c557600080fd5b506136d2878288016135c3565b949793965093946060013593505050565b6000602082840312156136f557600080fd5b8135612bd481613533565b80356002811061356357600080fd5b6000806000806080858703121561372557600080fd5b843561373081613533565b935060208501359250604085013567ffffffffffffffff81111561375357600080fd5b61375f878288016135c3565b92505061376e60608601613700565b905092959194509250565b6000815180845260005b8181101561379f57602081850181015186830182015201613783565b818111156137b1576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b82151581526040602082015260006111cc6040830184613779565b6000806040838503121561381257600080fd5b50508035926020909101359150565b602081526000612bd46020830184613779565b60006020828403121561384657600080fd5b5035919050565b60008083601f84011261385f57600080fd5b50813567ffffffffffffffff81111561387757600080fd5b60208301915083602082850101111561388f57600080fd5b9250929050565b60008060008060008060008060008060006101408c8e0312156138b857600080fd5b6138c18c613558565b9a5060208c0135995067ffffffffffffffff8060408e013511156138e457600080fd5b6138f48e60408f01358f0161384d565b909a50985061390560608e01613700565b975060808d0135965060a08d0135955060c08d0135945061392860e08e01613558565b93506139376101008e01613558565b9250806101208e0135111561394b57600080fd5b5061395d8d6101208e01358e016135c3565b90509295989b509295989b9093969950565b60008060006060848603121561398457600080fd5b83359250602084013567ffffffffffffffff808211156139a357600080fd5b6139af878388016135c3565b935060408601359150808211156139c557600080fd5b506139d2868287016135c3565b9150509250925092565b600081518084526020808501945080840160005b83811015613a2257815173ffffffffffffffffffffffffffffffffffffffff16875295820195908201906001016139f0565b509495945050505050565b602081526000612bd460208301846139dc565b60008060408385031215613a5357600080fd5b8235613a5e81613533565b9150602083013567ffffffffffffffff811115613a7a57600080fd5b613a86858286016135c3565b9150509250929050565b6000806000806000806000806000806101008b8d031215613ab057600080fd5b8a3567ffffffffffffffff80821115613ac857600080fd5b818d0191508d601f830112613adc57600080fd5b813581811115613aeb57600080fd5b8e60208260051b8501011115613b0057600080fd5b60208381019d50909b508d01359950613b1b60408e01613558565b985060608d0135915080821115613b3157600080fd5b50613b3e8d828e0161384d565b9097509550613b51905060808c01613558565b9350613b5f60a08c01613558565b925060c08b01359150613b7460e08c01613558565b90509295989b9194979a5092959850565b604081526000613b9860408301856139dc565b905073ffffffffffffffffffffffffffffffffffffffff831660208301529392505050565b60008060008060008060008060008060006101408c8e031215613bdf57600080fd5b8b35613bea81613533565b9a5060208c0135995060408c013567ffffffffffffffff811115613c0d57600080fd5b613c198e828f0161384d565b909a509850613c2c905060608d01613700565b965060808c0135955060a08c0135945060c08c0135935060e08c0135613c5181613533565b92506101008c0135613c6281613533565b809250506101208c013590509295989b509295989b9093969950565b60008060408385031215613c9157600080fd5b8235613c9c81613533565b91506020830135613cac81613533565b809150509250929050565b600080600060608486031215613ccc57600080fd5b8335613cd781613533565b92506020840135613ce781613533565b91506040840135613cf781613533565b809150509250925092565b600080600060608486031215613d1757600080fd5b8335613d2281613533565b92506020840135613d3281613533565b929592945050506040919091013590565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613da357613da3613d43565b5060010190565b604081526000613dbd6040830185613779565b8281036020840152612c358185613779565b600060208284031215613de157600080fd5b81517fffffffff0000000000000000000000000000000000000000000000000000000081168114612bd457600080fd5b600060ff821660ff841680821015613e2b57613e2b613d43565b90039392505050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613e6c57613e6c613d43565b500290565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60028110613ed7577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b9052565b600061016073ffffffffffffffffffffffffffffffffffffffff8f1683528d60208401528060408401528b81840152506101808b8d828501376000818d850101527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8d01168301613f51606085018d613ea0565b8a60808501528960a08501528860c0850152613f8560e085018973ffffffffffffffffffffffffffffffffffffffff169052565b73ffffffffffffffffffffffffffffffffffffffff87166101008501528184820301610120850152613fb982820187613779565b92505050613fe061014083018473ffffffffffffffffffffffffffffffffffffffff169052565b9d9c50505050505050505050505050565b6000821982111561400457614004613d43565b500190565b60008261403f577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b60008282101561405657614056613d43565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6080808252810185905260008660a08301825b888110156140da5782356140b081613533565b73ffffffffffffffffffffffffffffffffffffffff1682526020928301929091019060010161409d565b506020840196909652505073ffffffffffffffffffffffffffffffffffffffff9283166040820152911660609091015292915050565b60006020828403121561412257600080fd5b81518015158114612bd457600080fd5b8183823760009101908152919050565b6000610160820190508c825273ffffffffffffffffffffffffffffffffffffffff808d1660208401528b60408401528a6060840152614184608084018b613ea0565b60a083019890985260c082019690965260e0810194909452918516610100840152909316610120820152610140019190915295945050505050565b6000816141ce576141ce613d43565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff019056fea164736f6c634300080f000a", +} + +// SafeABI is the input ABI used to generate the binding from. +// Deprecated: Use SafeMetaData.ABI instead. +var SafeABI = SafeMetaData.ABI + +// SafeBin is the compiled bytecode used for deploying new contracts. +// Deprecated: Use SafeMetaData.Bin instead. +var SafeBin = SafeMetaData.Bin + +// DeploySafe deploys a new Ethereum contract, binding an instance of Safe to it. +func DeploySafe(auth *bind.TransactOpts, backend bind.ContractBackend) (common.Address, *types.Transaction, *Safe, error) { + parsed, err := SafeMetaData.GetAbi() + if err != nil { + return common.Address{}, nil, nil, err + } + if parsed == nil { + return common.Address{}, nil, nil, errors.New("GetABI returned nil") + } + + address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(SafeBin), backend) + if err != nil { + return common.Address{}, nil, nil, err + } + return address, tx, &Safe{SafeCaller: SafeCaller{contract: contract}, SafeTransactor: SafeTransactor{contract: contract}, SafeFilterer: SafeFilterer{contract: contract}}, nil +} + +// Safe is an auto generated Go binding around an Ethereum contract. +type Safe struct { + SafeCaller // Read-only binding to the contract + SafeTransactor // Write-only binding to the contract + SafeFilterer // Log filterer for contract events +} + +// SafeCaller is an auto generated read-only Go binding around an Ethereum contract. +type SafeCaller struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// SafeTransactor is an auto generated write-only Go binding around an Ethereum contract. +type SafeTransactor struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// SafeFilterer is an auto generated log filtering Go binding around an Ethereum contract events. +type SafeFilterer struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// SafeSession is an auto generated Go binding around an Ethereum contract, +// with pre-set call and transact options. +type SafeSession struct { + Contract *Safe // Generic contract binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// SafeCallerSession is an auto generated read-only Go binding around an Ethereum contract, +// with pre-set call options. +type SafeCallerSession struct { + Contract *SafeCaller // Generic contract caller binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session +} + +// SafeTransactorSession is an auto generated write-only Go binding around an Ethereum contract, +// with pre-set transact options. +type SafeTransactorSession struct { + Contract *SafeTransactor // Generic contract transactor binding to set the session for + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// SafeRaw is an auto generated low-level Go binding around an Ethereum contract. +type SafeRaw struct { + Contract *Safe // Generic contract binding to access the raw methods on +} + +// SafeCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. +type SafeCallerRaw struct { + Contract *SafeCaller // Generic read-only contract binding to access the raw methods on +} + +// SafeTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. +type SafeTransactorRaw struct { + Contract *SafeTransactor // Generic write-only contract binding to access the raw methods on +} + +// NewSafe creates a new instance of Safe, bound to a specific deployed contract. +func NewSafe(address common.Address, backend bind.ContractBackend) (*Safe, error) { + contract, err := bindSafe(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &Safe{SafeCaller: SafeCaller{contract: contract}, SafeTransactor: SafeTransactor{contract: contract}, SafeFilterer: SafeFilterer{contract: contract}}, nil +} + +// NewSafeCaller creates a new read-only instance of Safe, bound to a specific deployed contract. +func NewSafeCaller(address common.Address, caller bind.ContractCaller) (*SafeCaller, error) { + contract, err := bindSafe(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &SafeCaller{contract: contract}, nil +} + +// NewSafeTransactor creates a new write-only instance of Safe, bound to a specific deployed contract. +func NewSafeTransactor(address common.Address, transactor bind.ContractTransactor) (*SafeTransactor, error) { + contract, err := bindSafe(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &SafeTransactor{contract: contract}, nil +} + +// NewSafeFilterer creates a new log filterer instance of Safe, bound to a specific deployed contract. +func NewSafeFilterer(address common.Address, filterer bind.ContractFilterer) (*SafeFilterer, error) { + contract, err := bindSafe(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &SafeFilterer{contract: contract}, nil +} + +// bindSafe binds a generic wrapper to an already deployed contract. +func bindSafe(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := abi.JSON(strings.NewReader(SafeABI)) + if err != nil { + return nil, err + } + return bind.NewBoundContract(address, parsed, caller, transactor, filterer), nil +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_Safe *SafeRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _Safe.Contract.SafeCaller.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_Safe *SafeRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _Safe.Contract.SafeTransactor.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_Safe *SafeRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _Safe.Contract.SafeTransactor.contract.Transact(opts, method, params...) +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_Safe *SafeCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _Safe.Contract.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_Safe *SafeTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _Safe.Contract.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_Safe *SafeTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _Safe.Contract.contract.Transact(opts, method, params...) +} + +// VERSION is a free data retrieval call binding the contract method 0xffa1ad74. +// +// Solidity: function VERSION() view returns(string) +func (_Safe *SafeCaller) VERSION(opts *bind.CallOpts) (string, error) { + var out []interface{} + err := _Safe.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 0xffa1ad74. +// +// Solidity: function VERSION() view returns(string) +func (_Safe *SafeSession) VERSION() (string, error) { + return _Safe.Contract.VERSION(&_Safe.CallOpts) +} + +// VERSION is a free data retrieval call binding the contract method 0xffa1ad74. +// +// Solidity: function VERSION() view returns(string) +func (_Safe *SafeCallerSession) VERSION() (string, error) { + return _Safe.Contract.VERSION(&_Safe.CallOpts) +} + +// ApprovedHashes is a free data retrieval call binding the contract method 0x7d832974. +// +// Solidity: function approvedHashes(address , bytes32 ) view returns(uint256) +func (_Safe *SafeCaller) ApprovedHashes(opts *bind.CallOpts, arg0 common.Address, arg1 [32]byte) (*big.Int, error) { + var out []interface{} + err := _Safe.contract.Call(opts, &out, "approvedHashes", arg0, arg1) + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// ApprovedHashes is a free data retrieval call binding the contract method 0x7d832974. +// +// Solidity: function approvedHashes(address , bytes32 ) view returns(uint256) +func (_Safe *SafeSession) ApprovedHashes(arg0 common.Address, arg1 [32]byte) (*big.Int, error) { + return _Safe.Contract.ApprovedHashes(&_Safe.CallOpts, arg0, arg1) +} + +// ApprovedHashes is a free data retrieval call binding the contract method 0x7d832974. +// +// Solidity: function approvedHashes(address , bytes32 ) view returns(uint256) +func (_Safe *SafeCallerSession) ApprovedHashes(arg0 common.Address, arg1 [32]byte) (*big.Int, error) { + return _Safe.Contract.ApprovedHashes(&_Safe.CallOpts, arg0, arg1) +} + +// CheckNSignatures is a free data retrieval call binding the contract method 0x12fb68e0. +// +// Solidity: function checkNSignatures(bytes32 dataHash, bytes data, bytes signatures, uint256 requiredSignatures) view returns() +func (_Safe *SafeCaller) CheckNSignatures(opts *bind.CallOpts, dataHash [32]byte, data []byte, signatures []byte, requiredSignatures *big.Int) error { + var out []interface{} + err := _Safe.contract.Call(opts, &out, "checkNSignatures", dataHash, data, signatures, requiredSignatures) + + if err != nil { + return err + } + + return err + +} + +// CheckNSignatures is a free data retrieval call binding the contract method 0x12fb68e0. +// +// Solidity: function checkNSignatures(bytes32 dataHash, bytes data, bytes signatures, uint256 requiredSignatures) view returns() +func (_Safe *SafeSession) CheckNSignatures(dataHash [32]byte, data []byte, signatures []byte, requiredSignatures *big.Int) error { + return _Safe.Contract.CheckNSignatures(&_Safe.CallOpts, dataHash, data, signatures, requiredSignatures) +} + +// CheckNSignatures is a free data retrieval call binding the contract method 0x12fb68e0. +// +// Solidity: function checkNSignatures(bytes32 dataHash, bytes data, bytes signatures, uint256 requiredSignatures) view returns() +func (_Safe *SafeCallerSession) CheckNSignatures(dataHash [32]byte, data []byte, signatures []byte, requiredSignatures *big.Int) error { + return _Safe.Contract.CheckNSignatures(&_Safe.CallOpts, dataHash, data, signatures, requiredSignatures) +} + +// CheckSignatures is a free data retrieval call binding the contract method 0x934f3a11. +// +// Solidity: function checkSignatures(bytes32 dataHash, bytes data, bytes signatures) view returns() +func (_Safe *SafeCaller) CheckSignatures(opts *bind.CallOpts, dataHash [32]byte, data []byte, signatures []byte) error { + var out []interface{} + err := _Safe.contract.Call(opts, &out, "checkSignatures", dataHash, data, signatures) + + if err != nil { + return err + } + + return err + +} + +// CheckSignatures is a free data retrieval call binding the contract method 0x934f3a11. +// +// Solidity: function checkSignatures(bytes32 dataHash, bytes data, bytes signatures) view returns() +func (_Safe *SafeSession) CheckSignatures(dataHash [32]byte, data []byte, signatures []byte) error { + return _Safe.Contract.CheckSignatures(&_Safe.CallOpts, dataHash, data, signatures) +} + +// CheckSignatures is a free data retrieval call binding the contract method 0x934f3a11. +// +// Solidity: function checkSignatures(bytes32 dataHash, bytes data, bytes signatures) view returns() +func (_Safe *SafeCallerSession) CheckSignatures(dataHash [32]byte, data []byte, signatures []byte) error { + return _Safe.Contract.CheckSignatures(&_Safe.CallOpts, dataHash, data, signatures) +} + +// DomainSeparator is a free data retrieval call binding the contract method 0xf698da25. +// +// Solidity: function domainSeparator() view returns(bytes32) +func (_Safe *SafeCaller) DomainSeparator(opts *bind.CallOpts) ([32]byte, error) { + var out []interface{} + err := _Safe.contract.Call(opts, &out, "domainSeparator") + + if err != nil { + return *new([32]byte), err + } + + out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte) + + return out0, err + +} + +// DomainSeparator is a free data retrieval call binding the contract method 0xf698da25. +// +// Solidity: function domainSeparator() view returns(bytes32) +func (_Safe *SafeSession) DomainSeparator() ([32]byte, error) { + return _Safe.Contract.DomainSeparator(&_Safe.CallOpts) +} + +// DomainSeparator is a free data retrieval call binding the contract method 0xf698da25. +// +// Solidity: function domainSeparator() view returns(bytes32) +func (_Safe *SafeCallerSession) DomainSeparator() ([32]byte, error) { + return _Safe.Contract.DomainSeparator(&_Safe.CallOpts) +} + +// EncodeTransactionData is a free data retrieval call binding the contract method 0xe86637db. +// +// Solidity: function encodeTransactionData(address to, uint256 value, bytes data, uint8 operation, uint256 safeTxGas, uint256 baseGas, uint256 gasPrice, address gasToken, address refundReceiver, uint256 _nonce) view returns(bytes) +func (_Safe *SafeCaller) EncodeTransactionData(opts *bind.CallOpts, to common.Address, value *big.Int, data []byte, operation uint8, safeTxGas *big.Int, baseGas *big.Int, gasPrice *big.Int, gasToken common.Address, refundReceiver common.Address, _nonce *big.Int) ([]byte, error) { + var out []interface{} + err := _Safe.contract.Call(opts, &out, "encodeTransactionData", to, value, data, operation, safeTxGas, baseGas, gasPrice, gasToken, refundReceiver, _nonce) + + if err != nil { + return *new([]byte), err + } + + out0 := *abi.ConvertType(out[0], new([]byte)).(*[]byte) + + return out0, err + +} + +// EncodeTransactionData is a free data retrieval call binding the contract method 0xe86637db. +// +// Solidity: function encodeTransactionData(address to, uint256 value, bytes data, uint8 operation, uint256 safeTxGas, uint256 baseGas, uint256 gasPrice, address gasToken, address refundReceiver, uint256 _nonce) view returns(bytes) +func (_Safe *SafeSession) EncodeTransactionData(to common.Address, value *big.Int, data []byte, operation uint8, safeTxGas *big.Int, baseGas *big.Int, gasPrice *big.Int, gasToken common.Address, refundReceiver common.Address, _nonce *big.Int) ([]byte, error) { + return _Safe.Contract.EncodeTransactionData(&_Safe.CallOpts, to, value, data, operation, safeTxGas, baseGas, gasPrice, gasToken, refundReceiver, _nonce) +} + +// EncodeTransactionData is a free data retrieval call binding the contract method 0xe86637db. +// +// Solidity: function encodeTransactionData(address to, uint256 value, bytes data, uint8 operation, uint256 safeTxGas, uint256 baseGas, uint256 gasPrice, address gasToken, address refundReceiver, uint256 _nonce) view returns(bytes) +func (_Safe *SafeCallerSession) EncodeTransactionData(to common.Address, value *big.Int, data []byte, operation uint8, safeTxGas *big.Int, baseGas *big.Int, gasPrice *big.Int, gasToken common.Address, refundReceiver common.Address, _nonce *big.Int) ([]byte, error) { + return _Safe.Contract.EncodeTransactionData(&_Safe.CallOpts, to, value, data, operation, safeTxGas, baseGas, gasPrice, gasToken, refundReceiver, _nonce) +} + +// GetChainId is a free data retrieval call binding the contract method 0x3408e470. +// +// Solidity: function getChainId() view returns(uint256) +func (_Safe *SafeCaller) GetChainId(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _Safe.contract.Call(opts, &out, "getChainId") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// GetChainId is a free data retrieval call binding the contract method 0x3408e470. +// +// Solidity: function getChainId() view returns(uint256) +func (_Safe *SafeSession) GetChainId() (*big.Int, error) { + return _Safe.Contract.GetChainId(&_Safe.CallOpts) +} + +// GetChainId is a free data retrieval call binding the contract method 0x3408e470. +// +// Solidity: function getChainId() view returns(uint256) +func (_Safe *SafeCallerSession) GetChainId() (*big.Int, error) { + return _Safe.Contract.GetChainId(&_Safe.CallOpts) +} + +// GetModulesPaginated is a free data retrieval call binding the contract method 0xcc2f8452. +// +// Solidity: function getModulesPaginated(address start, uint256 pageSize) view returns(address[] array, address next) +func (_Safe *SafeCaller) GetModulesPaginated(opts *bind.CallOpts, start common.Address, pageSize *big.Int) (struct { + Array []common.Address + Next common.Address +}, error) { + var out []interface{} + err := _Safe.contract.Call(opts, &out, "getModulesPaginated", start, pageSize) + + outstruct := new(struct { + Array []common.Address + Next common.Address + }) + if err != nil { + return *outstruct, err + } + + outstruct.Array = *abi.ConvertType(out[0], new([]common.Address)).(*[]common.Address) + outstruct.Next = *abi.ConvertType(out[1], new(common.Address)).(*common.Address) + + return *outstruct, err + +} + +// GetModulesPaginated is a free data retrieval call binding the contract method 0xcc2f8452. +// +// Solidity: function getModulesPaginated(address start, uint256 pageSize) view returns(address[] array, address next) +func (_Safe *SafeSession) GetModulesPaginated(start common.Address, pageSize *big.Int) (struct { + Array []common.Address + Next common.Address +}, error) { + return _Safe.Contract.GetModulesPaginated(&_Safe.CallOpts, start, pageSize) +} + +// GetModulesPaginated is a free data retrieval call binding the contract method 0xcc2f8452. +// +// Solidity: function getModulesPaginated(address start, uint256 pageSize) view returns(address[] array, address next) +func (_Safe *SafeCallerSession) GetModulesPaginated(start common.Address, pageSize *big.Int) (struct { + Array []common.Address + Next common.Address +}, error) { + return _Safe.Contract.GetModulesPaginated(&_Safe.CallOpts, start, pageSize) +} + +// GetOwners is a free data retrieval call binding the contract method 0xa0e67e2b. +// +// Solidity: function getOwners() view returns(address[]) +func (_Safe *SafeCaller) GetOwners(opts *bind.CallOpts) ([]common.Address, error) { + var out []interface{} + err := _Safe.contract.Call(opts, &out, "getOwners") + + if err != nil { + return *new([]common.Address), err + } + + out0 := *abi.ConvertType(out[0], new([]common.Address)).(*[]common.Address) + + return out0, err + +} + +// GetOwners is a free data retrieval call binding the contract method 0xa0e67e2b. +// +// Solidity: function getOwners() view returns(address[]) +func (_Safe *SafeSession) GetOwners() ([]common.Address, error) { + return _Safe.Contract.GetOwners(&_Safe.CallOpts) +} + +// GetOwners is a free data retrieval call binding the contract method 0xa0e67e2b. +// +// Solidity: function getOwners() view returns(address[]) +func (_Safe *SafeCallerSession) GetOwners() ([]common.Address, error) { + return _Safe.Contract.GetOwners(&_Safe.CallOpts) +} + +// GetStorageAt is a free data retrieval call binding the contract method 0x5624b25b. +// +// Solidity: function getStorageAt(uint256 offset, uint256 length) view returns(bytes) +func (_Safe *SafeCaller) GetStorageAt(opts *bind.CallOpts, offset *big.Int, length *big.Int) ([]byte, error) { + var out []interface{} + err := _Safe.contract.Call(opts, &out, "getStorageAt", offset, length) + + if err != nil { + return *new([]byte), err + } + + out0 := *abi.ConvertType(out[0], new([]byte)).(*[]byte) + + return out0, err + +} + +// GetStorageAt is a free data retrieval call binding the contract method 0x5624b25b. +// +// Solidity: function getStorageAt(uint256 offset, uint256 length) view returns(bytes) +func (_Safe *SafeSession) GetStorageAt(offset *big.Int, length *big.Int) ([]byte, error) { + return _Safe.Contract.GetStorageAt(&_Safe.CallOpts, offset, length) +} + +// GetStorageAt is a free data retrieval call binding the contract method 0x5624b25b. +// +// Solidity: function getStorageAt(uint256 offset, uint256 length) view returns(bytes) +func (_Safe *SafeCallerSession) GetStorageAt(offset *big.Int, length *big.Int) ([]byte, error) { + return _Safe.Contract.GetStorageAt(&_Safe.CallOpts, offset, length) +} + +// GetThreshold is a free data retrieval call binding the contract method 0xe75235b8. +// +// Solidity: function getThreshold() view returns(uint256) +func (_Safe *SafeCaller) GetThreshold(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _Safe.contract.Call(opts, &out, "getThreshold") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// GetThreshold is a free data retrieval call binding the contract method 0xe75235b8. +// +// Solidity: function getThreshold() view returns(uint256) +func (_Safe *SafeSession) GetThreshold() (*big.Int, error) { + return _Safe.Contract.GetThreshold(&_Safe.CallOpts) +} + +// GetThreshold is a free data retrieval call binding the contract method 0xe75235b8. +// +// Solidity: function getThreshold() view returns(uint256) +func (_Safe *SafeCallerSession) GetThreshold() (*big.Int, error) { + return _Safe.Contract.GetThreshold(&_Safe.CallOpts) +} + +// GetTransactionHash is a free data retrieval call binding the contract method 0xd8d11f78. +// +// Solidity: function getTransactionHash(address to, uint256 value, bytes data, uint8 operation, uint256 safeTxGas, uint256 baseGas, uint256 gasPrice, address gasToken, address refundReceiver, uint256 _nonce) view returns(bytes32) +func (_Safe *SafeCaller) GetTransactionHash(opts *bind.CallOpts, to common.Address, value *big.Int, data []byte, operation uint8, safeTxGas *big.Int, baseGas *big.Int, gasPrice *big.Int, gasToken common.Address, refundReceiver common.Address, _nonce *big.Int) ([32]byte, error) { + var out []interface{} + err := _Safe.contract.Call(opts, &out, "getTransactionHash", to, value, data, operation, safeTxGas, baseGas, gasPrice, gasToken, refundReceiver, _nonce) + + if err != nil { + return *new([32]byte), err + } + + out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte) + + return out0, err + +} + +// GetTransactionHash is a free data retrieval call binding the contract method 0xd8d11f78. +// +// Solidity: function getTransactionHash(address to, uint256 value, bytes data, uint8 operation, uint256 safeTxGas, uint256 baseGas, uint256 gasPrice, address gasToken, address refundReceiver, uint256 _nonce) view returns(bytes32) +func (_Safe *SafeSession) GetTransactionHash(to common.Address, value *big.Int, data []byte, operation uint8, safeTxGas *big.Int, baseGas *big.Int, gasPrice *big.Int, gasToken common.Address, refundReceiver common.Address, _nonce *big.Int) ([32]byte, error) { + return _Safe.Contract.GetTransactionHash(&_Safe.CallOpts, to, value, data, operation, safeTxGas, baseGas, gasPrice, gasToken, refundReceiver, _nonce) +} + +// GetTransactionHash is a free data retrieval call binding the contract method 0xd8d11f78. +// +// Solidity: function getTransactionHash(address to, uint256 value, bytes data, uint8 operation, uint256 safeTxGas, uint256 baseGas, uint256 gasPrice, address gasToken, address refundReceiver, uint256 _nonce) view returns(bytes32) +func (_Safe *SafeCallerSession) GetTransactionHash(to common.Address, value *big.Int, data []byte, operation uint8, safeTxGas *big.Int, baseGas *big.Int, gasPrice *big.Int, gasToken common.Address, refundReceiver common.Address, _nonce *big.Int) ([32]byte, error) { + return _Safe.Contract.GetTransactionHash(&_Safe.CallOpts, to, value, data, operation, safeTxGas, baseGas, gasPrice, gasToken, refundReceiver, _nonce) +} + +// IsModuleEnabled is a free data retrieval call binding the contract method 0x2d9ad53d. +// +// Solidity: function isModuleEnabled(address module) view returns(bool) +func (_Safe *SafeCaller) IsModuleEnabled(opts *bind.CallOpts, module common.Address) (bool, error) { + var out []interface{} + err := _Safe.contract.Call(opts, &out, "isModuleEnabled", module) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +// IsModuleEnabled is a free data retrieval call binding the contract method 0x2d9ad53d. +// +// Solidity: function isModuleEnabled(address module) view returns(bool) +func (_Safe *SafeSession) IsModuleEnabled(module common.Address) (bool, error) { + return _Safe.Contract.IsModuleEnabled(&_Safe.CallOpts, module) +} + +// IsModuleEnabled is a free data retrieval call binding the contract method 0x2d9ad53d. +// +// Solidity: function isModuleEnabled(address module) view returns(bool) +func (_Safe *SafeCallerSession) IsModuleEnabled(module common.Address) (bool, error) { + return _Safe.Contract.IsModuleEnabled(&_Safe.CallOpts, module) +} + +// IsOwner is a free data retrieval call binding the contract method 0x2f54bf6e. +// +// Solidity: function isOwner(address owner) view returns(bool) +func (_Safe *SafeCaller) IsOwner(opts *bind.CallOpts, owner common.Address) (bool, error) { + var out []interface{} + err := _Safe.contract.Call(opts, &out, "isOwner", owner) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +// IsOwner is a free data retrieval call binding the contract method 0x2f54bf6e. +// +// Solidity: function isOwner(address owner) view returns(bool) +func (_Safe *SafeSession) IsOwner(owner common.Address) (bool, error) { + return _Safe.Contract.IsOwner(&_Safe.CallOpts, owner) +} + +// IsOwner is a free data retrieval call binding the contract method 0x2f54bf6e. +// +// Solidity: function isOwner(address owner) view returns(bool) +func (_Safe *SafeCallerSession) IsOwner(owner common.Address) (bool, error) { + return _Safe.Contract.IsOwner(&_Safe.CallOpts, owner) +} + +// Nonce is a free data retrieval call binding the contract method 0xaffed0e0. +// +// Solidity: function nonce() view returns(uint256) +func (_Safe *SafeCaller) Nonce(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _Safe.contract.Call(opts, &out, "nonce") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// Nonce is a free data retrieval call binding the contract method 0xaffed0e0. +// +// Solidity: function nonce() view returns(uint256) +func (_Safe *SafeSession) Nonce() (*big.Int, error) { + return _Safe.Contract.Nonce(&_Safe.CallOpts) +} + +// Nonce is a free data retrieval call binding the contract method 0xaffed0e0. +// +// Solidity: function nonce() view returns(uint256) +func (_Safe *SafeCallerSession) Nonce() (*big.Int, error) { + return _Safe.Contract.Nonce(&_Safe.CallOpts) +} + +// SignedMessages is a free data retrieval call binding the contract method 0x5ae6bd37. +// +// Solidity: function signedMessages(bytes32 ) view returns(uint256) +func (_Safe *SafeCaller) SignedMessages(opts *bind.CallOpts, arg0 [32]byte) (*big.Int, error) { + var out []interface{} + err := _Safe.contract.Call(opts, &out, "signedMessages", arg0) + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// SignedMessages is a free data retrieval call binding the contract method 0x5ae6bd37. +// +// Solidity: function signedMessages(bytes32 ) view returns(uint256) +func (_Safe *SafeSession) SignedMessages(arg0 [32]byte) (*big.Int, error) { + return _Safe.Contract.SignedMessages(&_Safe.CallOpts, arg0) +} + +// SignedMessages is a free data retrieval call binding the contract method 0x5ae6bd37. +// +// Solidity: function signedMessages(bytes32 ) view returns(uint256) +func (_Safe *SafeCallerSession) SignedMessages(arg0 [32]byte) (*big.Int, error) { + return _Safe.Contract.SignedMessages(&_Safe.CallOpts, arg0) +} + +// AddOwnerWithThreshold is a paid mutator transaction binding the contract method 0x0d582f13. +// +// Solidity: function addOwnerWithThreshold(address owner, uint256 _threshold) returns() +func (_Safe *SafeTransactor) AddOwnerWithThreshold(opts *bind.TransactOpts, owner common.Address, _threshold *big.Int) (*types.Transaction, error) { + return _Safe.contract.Transact(opts, "addOwnerWithThreshold", owner, _threshold) +} + +// AddOwnerWithThreshold is a paid mutator transaction binding the contract method 0x0d582f13. +// +// Solidity: function addOwnerWithThreshold(address owner, uint256 _threshold) returns() +func (_Safe *SafeSession) AddOwnerWithThreshold(owner common.Address, _threshold *big.Int) (*types.Transaction, error) { + return _Safe.Contract.AddOwnerWithThreshold(&_Safe.TransactOpts, owner, _threshold) +} + +// AddOwnerWithThreshold is a paid mutator transaction binding the contract method 0x0d582f13. +// +// Solidity: function addOwnerWithThreshold(address owner, uint256 _threshold) returns() +func (_Safe *SafeTransactorSession) AddOwnerWithThreshold(owner common.Address, _threshold *big.Int) (*types.Transaction, error) { + return _Safe.Contract.AddOwnerWithThreshold(&_Safe.TransactOpts, owner, _threshold) +} + +// ApproveHash is a paid mutator transaction binding the contract method 0xd4d9bdcd. +// +// Solidity: function approveHash(bytes32 hashToApprove) returns() +func (_Safe *SafeTransactor) ApproveHash(opts *bind.TransactOpts, hashToApprove [32]byte) (*types.Transaction, error) { + return _Safe.contract.Transact(opts, "approveHash", hashToApprove) +} + +// ApproveHash is a paid mutator transaction binding the contract method 0xd4d9bdcd. +// +// Solidity: function approveHash(bytes32 hashToApprove) returns() +func (_Safe *SafeSession) ApproveHash(hashToApprove [32]byte) (*types.Transaction, error) { + return _Safe.Contract.ApproveHash(&_Safe.TransactOpts, hashToApprove) +} + +// ApproveHash is a paid mutator transaction binding the contract method 0xd4d9bdcd. +// +// Solidity: function approveHash(bytes32 hashToApprove) returns() +func (_Safe *SafeTransactorSession) ApproveHash(hashToApprove [32]byte) (*types.Transaction, error) { + return _Safe.Contract.ApproveHash(&_Safe.TransactOpts, hashToApprove) +} + +// ChangeThreshold is a paid mutator transaction binding the contract method 0x694e80c3. +// +// Solidity: function changeThreshold(uint256 _threshold) returns() +func (_Safe *SafeTransactor) ChangeThreshold(opts *bind.TransactOpts, _threshold *big.Int) (*types.Transaction, error) { + return _Safe.contract.Transact(opts, "changeThreshold", _threshold) +} + +// ChangeThreshold is a paid mutator transaction binding the contract method 0x694e80c3. +// +// Solidity: function changeThreshold(uint256 _threshold) returns() +func (_Safe *SafeSession) ChangeThreshold(_threshold *big.Int) (*types.Transaction, error) { + return _Safe.Contract.ChangeThreshold(&_Safe.TransactOpts, _threshold) +} + +// ChangeThreshold is a paid mutator transaction binding the contract method 0x694e80c3. +// +// Solidity: function changeThreshold(uint256 _threshold) returns() +func (_Safe *SafeTransactorSession) ChangeThreshold(_threshold *big.Int) (*types.Transaction, error) { + return _Safe.Contract.ChangeThreshold(&_Safe.TransactOpts, _threshold) +} + +// DisableModule is a paid mutator transaction binding the contract method 0xe009cfde. +// +// Solidity: function disableModule(address prevModule, address module) returns() +func (_Safe *SafeTransactor) DisableModule(opts *bind.TransactOpts, prevModule common.Address, module common.Address) (*types.Transaction, error) { + return _Safe.contract.Transact(opts, "disableModule", prevModule, module) +} + +// DisableModule is a paid mutator transaction binding the contract method 0xe009cfde. +// +// Solidity: function disableModule(address prevModule, address module) returns() +func (_Safe *SafeSession) DisableModule(prevModule common.Address, module common.Address) (*types.Transaction, error) { + return _Safe.Contract.DisableModule(&_Safe.TransactOpts, prevModule, module) +} + +// DisableModule is a paid mutator transaction binding the contract method 0xe009cfde. +// +// Solidity: function disableModule(address prevModule, address module) returns() +func (_Safe *SafeTransactorSession) DisableModule(prevModule common.Address, module common.Address) (*types.Transaction, error) { + return _Safe.Contract.DisableModule(&_Safe.TransactOpts, prevModule, module) +} + +// EnableModule is a paid mutator transaction binding the contract method 0x610b5925. +// +// Solidity: function enableModule(address module) returns() +func (_Safe *SafeTransactor) EnableModule(opts *bind.TransactOpts, module common.Address) (*types.Transaction, error) { + return _Safe.contract.Transact(opts, "enableModule", module) +} + +// EnableModule is a paid mutator transaction binding the contract method 0x610b5925. +// +// Solidity: function enableModule(address module) returns() +func (_Safe *SafeSession) EnableModule(module common.Address) (*types.Transaction, error) { + return _Safe.Contract.EnableModule(&_Safe.TransactOpts, module) +} + +// EnableModule is a paid mutator transaction binding the contract method 0x610b5925. +// +// Solidity: function enableModule(address module) returns() +func (_Safe *SafeTransactorSession) EnableModule(module common.Address) (*types.Transaction, error) { + return _Safe.Contract.EnableModule(&_Safe.TransactOpts, module) +} + +// ExecTransaction is a paid mutator transaction binding the contract method 0x6a761202. +// +// Solidity: function execTransaction(address to, uint256 value, bytes data, uint8 operation, uint256 safeTxGas, uint256 baseGas, uint256 gasPrice, address gasToken, address refundReceiver, bytes signatures) payable returns(bool success) +func (_Safe *SafeTransactor) ExecTransaction(opts *bind.TransactOpts, to common.Address, value *big.Int, data []byte, operation uint8, safeTxGas *big.Int, baseGas *big.Int, gasPrice *big.Int, gasToken common.Address, refundReceiver common.Address, signatures []byte) (*types.Transaction, error) { + return _Safe.contract.Transact(opts, "execTransaction", to, value, data, operation, safeTxGas, baseGas, gasPrice, gasToken, refundReceiver, signatures) +} + +// ExecTransaction is a paid mutator transaction binding the contract method 0x6a761202. +// +// Solidity: function execTransaction(address to, uint256 value, bytes data, uint8 operation, uint256 safeTxGas, uint256 baseGas, uint256 gasPrice, address gasToken, address refundReceiver, bytes signatures) payable returns(bool success) +func (_Safe *SafeSession) ExecTransaction(to common.Address, value *big.Int, data []byte, operation uint8, safeTxGas *big.Int, baseGas *big.Int, gasPrice *big.Int, gasToken common.Address, refundReceiver common.Address, signatures []byte) (*types.Transaction, error) { + return _Safe.Contract.ExecTransaction(&_Safe.TransactOpts, to, value, data, operation, safeTxGas, baseGas, gasPrice, gasToken, refundReceiver, signatures) +} + +// ExecTransaction is a paid mutator transaction binding the contract method 0x6a761202. +// +// Solidity: function execTransaction(address to, uint256 value, bytes data, uint8 operation, uint256 safeTxGas, uint256 baseGas, uint256 gasPrice, address gasToken, address refundReceiver, bytes signatures) payable returns(bool success) +func (_Safe *SafeTransactorSession) ExecTransaction(to common.Address, value *big.Int, data []byte, operation uint8, safeTxGas *big.Int, baseGas *big.Int, gasPrice *big.Int, gasToken common.Address, refundReceiver common.Address, signatures []byte) (*types.Transaction, error) { + return _Safe.Contract.ExecTransaction(&_Safe.TransactOpts, to, value, data, operation, safeTxGas, baseGas, gasPrice, gasToken, refundReceiver, signatures) +} + +// ExecTransactionFromModule is a paid mutator transaction binding the contract method 0x468721a7. +// +// Solidity: function execTransactionFromModule(address to, uint256 value, bytes data, uint8 operation) returns(bool success) +func (_Safe *SafeTransactor) ExecTransactionFromModule(opts *bind.TransactOpts, to common.Address, value *big.Int, data []byte, operation uint8) (*types.Transaction, error) { + return _Safe.contract.Transact(opts, "execTransactionFromModule", to, value, data, operation) +} + +// ExecTransactionFromModule is a paid mutator transaction binding the contract method 0x468721a7. +// +// Solidity: function execTransactionFromModule(address to, uint256 value, bytes data, uint8 operation) returns(bool success) +func (_Safe *SafeSession) ExecTransactionFromModule(to common.Address, value *big.Int, data []byte, operation uint8) (*types.Transaction, error) { + return _Safe.Contract.ExecTransactionFromModule(&_Safe.TransactOpts, to, value, data, operation) +} + +// ExecTransactionFromModule is a paid mutator transaction binding the contract method 0x468721a7. +// +// Solidity: function execTransactionFromModule(address to, uint256 value, bytes data, uint8 operation) returns(bool success) +func (_Safe *SafeTransactorSession) ExecTransactionFromModule(to common.Address, value *big.Int, data []byte, operation uint8) (*types.Transaction, error) { + return _Safe.Contract.ExecTransactionFromModule(&_Safe.TransactOpts, to, value, data, operation) +} + +// ExecTransactionFromModuleReturnData is a paid mutator transaction binding the contract method 0x5229073f. +// +// Solidity: function execTransactionFromModuleReturnData(address to, uint256 value, bytes data, uint8 operation) returns(bool success, bytes returnData) +func (_Safe *SafeTransactor) ExecTransactionFromModuleReturnData(opts *bind.TransactOpts, to common.Address, value *big.Int, data []byte, operation uint8) (*types.Transaction, error) { + return _Safe.contract.Transact(opts, "execTransactionFromModuleReturnData", to, value, data, operation) +} + +// ExecTransactionFromModuleReturnData is a paid mutator transaction binding the contract method 0x5229073f. +// +// Solidity: function execTransactionFromModuleReturnData(address to, uint256 value, bytes data, uint8 operation) returns(bool success, bytes returnData) +func (_Safe *SafeSession) ExecTransactionFromModuleReturnData(to common.Address, value *big.Int, data []byte, operation uint8) (*types.Transaction, error) { + return _Safe.Contract.ExecTransactionFromModuleReturnData(&_Safe.TransactOpts, to, value, data, operation) +} + +// ExecTransactionFromModuleReturnData is a paid mutator transaction binding the contract method 0x5229073f. +// +// Solidity: function execTransactionFromModuleReturnData(address to, uint256 value, bytes data, uint8 operation) returns(bool success, bytes returnData) +func (_Safe *SafeTransactorSession) ExecTransactionFromModuleReturnData(to common.Address, value *big.Int, data []byte, operation uint8) (*types.Transaction, error) { + return _Safe.Contract.ExecTransactionFromModuleReturnData(&_Safe.TransactOpts, to, value, data, operation) +} + +// RemoveOwner is a paid mutator transaction binding the contract method 0xf8dc5dd9. +// +// Solidity: function removeOwner(address prevOwner, address owner, uint256 _threshold) returns() +func (_Safe *SafeTransactor) RemoveOwner(opts *bind.TransactOpts, prevOwner common.Address, owner common.Address, _threshold *big.Int) (*types.Transaction, error) { + return _Safe.contract.Transact(opts, "removeOwner", prevOwner, owner, _threshold) +} + +// RemoveOwner is a paid mutator transaction binding the contract method 0xf8dc5dd9. +// +// Solidity: function removeOwner(address prevOwner, address owner, uint256 _threshold) returns() +func (_Safe *SafeSession) RemoveOwner(prevOwner common.Address, owner common.Address, _threshold *big.Int) (*types.Transaction, error) { + return _Safe.Contract.RemoveOwner(&_Safe.TransactOpts, prevOwner, owner, _threshold) +} + +// RemoveOwner is a paid mutator transaction binding the contract method 0xf8dc5dd9. +// +// Solidity: function removeOwner(address prevOwner, address owner, uint256 _threshold) returns() +func (_Safe *SafeTransactorSession) RemoveOwner(prevOwner common.Address, owner common.Address, _threshold *big.Int) (*types.Transaction, error) { + return _Safe.Contract.RemoveOwner(&_Safe.TransactOpts, prevOwner, owner, _threshold) +} + +// SetFallbackHandler is a paid mutator transaction binding the contract method 0xf08a0323. +// +// Solidity: function setFallbackHandler(address handler) returns() +func (_Safe *SafeTransactor) SetFallbackHandler(opts *bind.TransactOpts, handler common.Address) (*types.Transaction, error) { + return _Safe.contract.Transact(opts, "setFallbackHandler", handler) +} + +// SetFallbackHandler is a paid mutator transaction binding the contract method 0xf08a0323. +// +// Solidity: function setFallbackHandler(address handler) returns() +func (_Safe *SafeSession) SetFallbackHandler(handler common.Address) (*types.Transaction, error) { + return _Safe.Contract.SetFallbackHandler(&_Safe.TransactOpts, handler) +} + +// SetFallbackHandler is a paid mutator transaction binding the contract method 0xf08a0323. +// +// Solidity: function setFallbackHandler(address handler) returns() +func (_Safe *SafeTransactorSession) SetFallbackHandler(handler common.Address) (*types.Transaction, error) { + return _Safe.Contract.SetFallbackHandler(&_Safe.TransactOpts, handler) +} + +// SetGuard is a paid mutator transaction binding the contract method 0xe19a9dd9. +// +// Solidity: function setGuard(address guard) returns() +func (_Safe *SafeTransactor) SetGuard(opts *bind.TransactOpts, guard common.Address) (*types.Transaction, error) { + return _Safe.contract.Transact(opts, "setGuard", guard) +} + +// SetGuard is a paid mutator transaction binding the contract method 0xe19a9dd9. +// +// Solidity: function setGuard(address guard) returns() +func (_Safe *SafeSession) SetGuard(guard common.Address) (*types.Transaction, error) { + return _Safe.Contract.SetGuard(&_Safe.TransactOpts, guard) +} + +// SetGuard is a paid mutator transaction binding the contract method 0xe19a9dd9. +// +// Solidity: function setGuard(address guard) returns() +func (_Safe *SafeTransactorSession) SetGuard(guard common.Address) (*types.Transaction, error) { + return _Safe.Contract.SetGuard(&_Safe.TransactOpts, guard) +} + +// Setup is a paid mutator transaction binding the contract method 0xb63e800d. +// +// Solidity: function setup(address[] _owners, uint256 _threshold, address to, bytes data, address fallbackHandler, address paymentToken, uint256 payment, address paymentReceiver) returns() +func (_Safe *SafeTransactor) Setup(opts *bind.TransactOpts, _owners []common.Address, _threshold *big.Int, to common.Address, data []byte, fallbackHandler common.Address, paymentToken common.Address, payment *big.Int, paymentReceiver common.Address) (*types.Transaction, error) { + return _Safe.contract.Transact(opts, "setup", _owners, _threshold, to, data, fallbackHandler, paymentToken, payment, paymentReceiver) +} + +// Setup is a paid mutator transaction binding the contract method 0xb63e800d. +// +// Solidity: function setup(address[] _owners, uint256 _threshold, address to, bytes data, address fallbackHandler, address paymentToken, uint256 payment, address paymentReceiver) returns() +func (_Safe *SafeSession) Setup(_owners []common.Address, _threshold *big.Int, to common.Address, data []byte, fallbackHandler common.Address, paymentToken common.Address, payment *big.Int, paymentReceiver common.Address) (*types.Transaction, error) { + return _Safe.Contract.Setup(&_Safe.TransactOpts, _owners, _threshold, to, data, fallbackHandler, paymentToken, payment, paymentReceiver) +} + +// Setup is a paid mutator transaction binding the contract method 0xb63e800d. +// +// Solidity: function setup(address[] _owners, uint256 _threshold, address to, bytes data, address fallbackHandler, address paymentToken, uint256 payment, address paymentReceiver) returns() +func (_Safe *SafeTransactorSession) Setup(_owners []common.Address, _threshold *big.Int, to common.Address, data []byte, fallbackHandler common.Address, paymentToken common.Address, payment *big.Int, paymentReceiver common.Address) (*types.Transaction, error) { + return _Safe.Contract.Setup(&_Safe.TransactOpts, _owners, _threshold, to, data, fallbackHandler, paymentToken, payment, paymentReceiver) +} + +// SimulateAndRevert is a paid mutator transaction binding the contract method 0xb4faba09. +// +// Solidity: function simulateAndRevert(address targetContract, bytes calldataPayload) returns() +func (_Safe *SafeTransactor) SimulateAndRevert(opts *bind.TransactOpts, targetContract common.Address, calldataPayload []byte) (*types.Transaction, error) { + return _Safe.contract.Transact(opts, "simulateAndRevert", targetContract, calldataPayload) +} + +// SimulateAndRevert is a paid mutator transaction binding the contract method 0xb4faba09. +// +// Solidity: function simulateAndRevert(address targetContract, bytes calldataPayload) returns() +func (_Safe *SafeSession) SimulateAndRevert(targetContract common.Address, calldataPayload []byte) (*types.Transaction, error) { + return _Safe.Contract.SimulateAndRevert(&_Safe.TransactOpts, targetContract, calldataPayload) +} + +// SimulateAndRevert is a paid mutator transaction binding the contract method 0xb4faba09. +// +// Solidity: function simulateAndRevert(address targetContract, bytes calldataPayload) returns() +func (_Safe *SafeTransactorSession) SimulateAndRevert(targetContract common.Address, calldataPayload []byte) (*types.Transaction, error) { + return _Safe.Contract.SimulateAndRevert(&_Safe.TransactOpts, targetContract, calldataPayload) +} + +// SwapOwner is a paid mutator transaction binding the contract method 0xe318b52b. +// +// Solidity: function swapOwner(address prevOwner, address oldOwner, address newOwner) returns() +func (_Safe *SafeTransactor) SwapOwner(opts *bind.TransactOpts, prevOwner common.Address, oldOwner common.Address, newOwner common.Address) (*types.Transaction, error) { + return _Safe.contract.Transact(opts, "swapOwner", prevOwner, oldOwner, newOwner) +} + +// SwapOwner is a paid mutator transaction binding the contract method 0xe318b52b. +// +// Solidity: function swapOwner(address prevOwner, address oldOwner, address newOwner) returns() +func (_Safe *SafeSession) SwapOwner(prevOwner common.Address, oldOwner common.Address, newOwner common.Address) (*types.Transaction, error) { + return _Safe.Contract.SwapOwner(&_Safe.TransactOpts, prevOwner, oldOwner, newOwner) +} + +// SwapOwner is a paid mutator transaction binding the contract method 0xe318b52b. +// +// Solidity: function swapOwner(address prevOwner, address oldOwner, address newOwner) returns() +func (_Safe *SafeTransactorSession) SwapOwner(prevOwner common.Address, oldOwner common.Address, newOwner common.Address) (*types.Transaction, error) { + return _Safe.Contract.SwapOwner(&_Safe.TransactOpts, prevOwner, oldOwner, newOwner) +} + +// Fallback is a paid mutator transaction binding the contract fallback function. +// +// Solidity: fallback() returns() +func (_Safe *SafeTransactor) Fallback(opts *bind.TransactOpts, calldata []byte) (*types.Transaction, error) { + return _Safe.contract.RawTransact(opts, calldata) +} + +// Fallback is a paid mutator transaction binding the contract fallback function. +// +// Solidity: fallback() returns() +func (_Safe *SafeSession) Fallback(calldata []byte) (*types.Transaction, error) { + return _Safe.Contract.Fallback(&_Safe.TransactOpts, calldata) +} + +// Fallback is a paid mutator transaction binding the contract fallback function. +// +// Solidity: fallback() returns() +func (_Safe *SafeTransactorSession) Fallback(calldata []byte) (*types.Transaction, error) { + return _Safe.Contract.Fallback(&_Safe.TransactOpts, calldata) +} + +// Receive is a paid mutator transaction binding the contract receive function. +// +// Solidity: receive() payable returns() +func (_Safe *SafeTransactor) Receive(opts *bind.TransactOpts) (*types.Transaction, error) { + return _Safe.contract.RawTransact(opts, nil) // calldata is disallowed for receive function +} + +// Receive is a paid mutator transaction binding the contract receive function. +// +// Solidity: receive() payable returns() +func (_Safe *SafeSession) Receive() (*types.Transaction, error) { + return _Safe.Contract.Receive(&_Safe.TransactOpts) +} + +// Receive is a paid mutator transaction binding the contract receive function. +// +// Solidity: receive() payable returns() +func (_Safe *SafeTransactorSession) Receive() (*types.Transaction, error) { + return _Safe.Contract.Receive(&_Safe.TransactOpts) +} + +// SafeAddedOwnerIterator is returned from FilterAddedOwner and is used to iterate over the raw logs and unpacked data for AddedOwner events raised by the Safe contract. +type SafeAddedOwnerIterator struct { + Event *SafeAddedOwner // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *SafeAddedOwnerIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(SafeAddedOwner) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(SafeAddedOwner) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *SafeAddedOwnerIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *SafeAddedOwnerIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// SafeAddedOwner represents a AddedOwner event raised by the Safe contract. +type SafeAddedOwner struct { + Owner common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterAddedOwner is a free log retrieval operation binding the contract event 0x9465fa0c962cc76958e6373a993326400c1c94f8be2fe3a952adfa7f60b2ea26. +// +// Solidity: event AddedOwner(address indexed owner) +func (_Safe *SafeFilterer) FilterAddedOwner(opts *bind.FilterOpts, owner []common.Address) (*SafeAddedOwnerIterator, error) { + + var ownerRule []interface{} + for _, ownerItem := range owner { + ownerRule = append(ownerRule, ownerItem) + } + + logs, sub, err := _Safe.contract.FilterLogs(opts, "AddedOwner", ownerRule) + if err != nil { + return nil, err + } + return &SafeAddedOwnerIterator{contract: _Safe.contract, event: "AddedOwner", logs: logs, sub: sub}, nil +} + +// WatchAddedOwner is a free log subscription operation binding the contract event 0x9465fa0c962cc76958e6373a993326400c1c94f8be2fe3a952adfa7f60b2ea26. +// +// Solidity: event AddedOwner(address indexed owner) +func (_Safe *SafeFilterer) WatchAddedOwner(opts *bind.WatchOpts, sink chan<- *SafeAddedOwner, owner []common.Address) (event.Subscription, error) { + + var ownerRule []interface{} + for _, ownerItem := range owner { + ownerRule = append(ownerRule, ownerItem) + } + + logs, sub, err := _Safe.contract.WatchLogs(opts, "AddedOwner", ownerRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(SafeAddedOwner) + if err := _Safe.contract.UnpackLog(event, "AddedOwner", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseAddedOwner is a log parse operation binding the contract event 0x9465fa0c962cc76958e6373a993326400c1c94f8be2fe3a952adfa7f60b2ea26. +// +// Solidity: event AddedOwner(address indexed owner) +func (_Safe *SafeFilterer) ParseAddedOwner(log types.Log) (*SafeAddedOwner, error) { + event := new(SafeAddedOwner) + if err := _Safe.contract.UnpackLog(event, "AddedOwner", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// SafeApproveHashIterator is returned from FilterApproveHash and is used to iterate over the raw logs and unpacked data for ApproveHash events raised by the Safe contract. +type SafeApproveHashIterator struct { + Event *SafeApproveHash // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *SafeApproveHashIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(SafeApproveHash) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(SafeApproveHash) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *SafeApproveHashIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *SafeApproveHashIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// SafeApproveHash represents a ApproveHash event raised by the Safe contract. +type SafeApproveHash struct { + ApprovedHash [32]byte + Owner common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterApproveHash is a free log retrieval operation binding the contract event 0xf2a0eb156472d1440255b0d7c1e19cc07115d1051fe605b0dce69acfec884d9c. +// +// Solidity: event ApproveHash(bytes32 indexed approvedHash, address indexed owner) +func (_Safe *SafeFilterer) FilterApproveHash(opts *bind.FilterOpts, approvedHash [][32]byte, owner []common.Address) (*SafeApproveHashIterator, error) { + + var approvedHashRule []interface{} + for _, approvedHashItem := range approvedHash { + approvedHashRule = append(approvedHashRule, approvedHashItem) + } + var ownerRule []interface{} + for _, ownerItem := range owner { + ownerRule = append(ownerRule, ownerItem) + } + + logs, sub, err := _Safe.contract.FilterLogs(opts, "ApproveHash", approvedHashRule, ownerRule) + if err != nil { + return nil, err + } + return &SafeApproveHashIterator{contract: _Safe.contract, event: "ApproveHash", logs: logs, sub: sub}, nil +} + +// WatchApproveHash is a free log subscription operation binding the contract event 0xf2a0eb156472d1440255b0d7c1e19cc07115d1051fe605b0dce69acfec884d9c. +// +// Solidity: event ApproveHash(bytes32 indexed approvedHash, address indexed owner) +func (_Safe *SafeFilterer) WatchApproveHash(opts *bind.WatchOpts, sink chan<- *SafeApproveHash, approvedHash [][32]byte, owner []common.Address) (event.Subscription, error) { + + var approvedHashRule []interface{} + for _, approvedHashItem := range approvedHash { + approvedHashRule = append(approvedHashRule, approvedHashItem) + } + var ownerRule []interface{} + for _, ownerItem := range owner { + ownerRule = append(ownerRule, ownerItem) + } + + logs, sub, err := _Safe.contract.WatchLogs(opts, "ApproveHash", approvedHashRule, ownerRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(SafeApproveHash) + if err := _Safe.contract.UnpackLog(event, "ApproveHash", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseApproveHash is a log parse operation binding the contract event 0xf2a0eb156472d1440255b0d7c1e19cc07115d1051fe605b0dce69acfec884d9c. +// +// Solidity: event ApproveHash(bytes32 indexed approvedHash, address indexed owner) +func (_Safe *SafeFilterer) ParseApproveHash(log types.Log) (*SafeApproveHash, error) { + event := new(SafeApproveHash) + if err := _Safe.contract.UnpackLog(event, "ApproveHash", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// SafeChangedFallbackHandlerIterator is returned from FilterChangedFallbackHandler and is used to iterate over the raw logs and unpacked data for ChangedFallbackHandler events raised by the Safe contract. +type SafeChangedFallbackHandlerIterator struct { + Event *SafeChangedFallbackHandler // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *SafeChangedFallbackHandlerIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(SafeChangedFallbackHandler) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(SafeChangedFallbackHandler) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *SafeChangedFallbackHandlerIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *SafeChangedFallbackHandlerIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// SafeChangedFallbackHandler represents a ChangedFallbackHandler event raised by the Safe contract. +type SafeChangedFallbackHandler struct { + Handler common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterChangedFallbackHandler is a free log retrieval operation binding the contract event 0x5ac6c46c93c8d0e53714ba3b53db3e7c046da994313d7ed0d192028bc7c228b0. +// +// Solidity: event ChangedFallbackHandler(address indexed handler) +func (_Safe *SafeFilterer) FilterChangedFallbackHandler(opts *bind.FilterOpts, handler []common.Address) (*SafeChangedFallbackHandlerIterator, error) { + + var handlerRule []interface{} + for _, handlerItem := range handler { + handlerRule = append(handlerRule, handlerItem) + } + + logs, sub, err := _Safe.contract.FilterLogs(opts, "ChangedFallbackHandler", handlerRule) + if err != nil { + return nil, err + } + return &SafeChangedFallbackHandlerIterator{contract: _Safe.contract, event: "ChangedFallbackHandler", logs: logs, sub: sub}, nil +} + +// WatchChangedFallbackHandler is a free log subscription operation binding the contract event 0x5ac6c46c93c8d0e53714ba3b53db3e7c046da994313d7ed0d192028bc7c228b0. +// +// Solidity: event ChangedFallbackHandler(address indexed handler) +func (_Safe *SafeFilterer) WatchChangedFallbackHandler(opts *bind.WatchOpts, sink chan<- *SafeChangedFallbackHandler, handler []common.Address) (event.Subscription, error) { + + var handlerRule []interface{} + for _, handlerItem := range handler { + handlerRule = append(handlerRule, handlerItem) + } + + logs, sub, err := _Safe.contract.WatchLogs(opts, "ChangedFallbackHandler", handlerRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(SafeChangedFallbackHandler) + if err := _Safe.contract.UnpackLog(event, "ChangedFallbackHandler", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseChangedFallbackHandler is a log parse operation binding the contract event 0x5ac6c46c93c8d0e53714ba3b53db3e7c046da994313d7ed0d192028bc7c228b0. +// +// Solidity: event ChangedFallbackHandler(address indexed handler) +func (_Safe *SafeFilterer) ParseChangedFallbackHandler(log types.Log) (*SafeChangedFallbackHandler, error) { + event := new(SafeChangedFallbackHandler) + if err := _Safe.contract.UnpackLog(event, "ChangedFallbackHandler", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// SafeChangedGuardIterator is returned from FilterChangedGuard and is used to iterate over the raw logs and unpacked data for ChangedGuard events raised by the Safe contract. +type SafeChangedGuardIterator struct { + Event *SafeChangedGuard // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *SafeChangedGuardIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(SafeChangedGuard) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(SafeChangedGuard) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *SafeChangedGuardIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *SafeChangedGuardIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// SafeChangedGuard represents a ChangedGuard event raised by the Safe contract. +type SafeChangedGuard struct { + Guard common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterChangedGuard is a free log retrieval operation binding the contract event 0x1151116914515bc0891ff9047a6cb32cf902546f83066499bcf8ba33d2353fa2. +// +// Solidity: event ChangedGuard(address indexed guard) +func (_Safe *SafeFilterer) FilterChangedGuard(opts *bind.FilterOpts, guard []common.Address) (*SafeChangedGuardIterator, error) { + + var guardRule []interface{} + for _, guardItem := range guard { + guardRule = append(guardRule, guardItem) + } + + logs, sub, err := _Safe.contract.FilterLogs(opts, "ChangedGuard", guardRule) + if err != nil { + return nil, err + } + return &SafeChangedGuardIterator{contract: _Safe.contract, event: "ChangedGuard", logs: logs, sub: sub}, nil +} + +// WatchChangedGuard is a free log subscription operation binding the contract event 0x1151116914515bc0891ff9047a6cb32cf902546f83066499bcf8ba33d2353fa2. +// +// Solidity: event ChangedGuard(address indexed guard) +func (_Safe *SafeFilterer) WatchChangedGuard(opts *bind.WatchOpts, sink chan<- *SafeChangedGuard, guard []common.Address) (event.Subscription, error) { + + var guardRule []interface{} + for _, guardItem := range guard { + guardRule = append(guardRule, guardItem) + } + + logs, sub, err := _Safe.contract.WatchLogs(opts, "ChangedGuard", guardRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(SafeChangedGuard) + if err := _Safe.contract.UnpackLog(event, "ChangedGuard", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseChangedGuard is a log parse operation binding the contract event 0x1151116914515bc0891ff9047a6cb32cf902546f83066499bcf8ba33d2353fa2. +// +// Solidity: event ChangedGuard(address indexed guard) +func (_Safe *SafeFilterer) ParseChangedGuard(log types.Log) (*SafeChangedGuard, error) { + event := new(SafeChangedGuard) + if err := _Safe.contract.UnpackLog(event, "ChangedGuard", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// SafeChangedThresholdIterator is returned from FilterChangedThreshold and is used to iterate over the raw logs and unpacked data for ChangedThreshold events raised by the Safe contract. +type SafeChangedThresholdIterator struct { + Event *SafeChangedThreshold // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *SafeChangedThresholdIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(SafeChangedThreshold) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(SafeChangedThreshold) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *SafeChangedThresholdIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *SafeChangedThresholdIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// SafeChangedThreshold represents a ChangedThreshold event raised by the Safe contract. +type SafeChangedThreshold struct { + Threshold *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterChangedThreshold is a free log retrieval operation binding the contract event 0x610f7ff2b304ae8903c3de74c60c6ab1f7d6226b3f52c5161905bb5ad4039c93. +// +// Solidity: event ChangedThreshold(uint256 threshold) +func (_Safe *SafeFilterer) FilterChangedThreshold(opts *bind.FilterOpts) (*SafeChangedThresholdIterator, error) { + + logs, sub, err := _Safe.contract.FilterLogs(opts, "ChangedThreshold") + if err != nil { + return nil, err + } + return &SafeChangedThresholdIterator{contract: _Safe.contract, event: "ChangedThreshold", logs: logs, sub: sub}, nil +} + +// WatchChangedThreshold is a free log subscription operation binding the contract event 0x610f7ff2b304ae8903c3de74c60c6ab1f7d6226b3f52c5161905bb5ad4039c93. +// +// Solidity: event ChangedThreshold(uint256 threshold) +func (_Safe *SafeFilterer) WatchChangedThreshold(opts *bind.WatchOpts, sink chan<- *SafeChangedThreshold) (event.Subscription, error) { + + logs, sub, err := _Safe.contract.WatchLogs(opts, "ChangedThreshold") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(SafeChangedThreshold) + if err := _Safe.contract.UnpackLog(event, "ChangedThreshold", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseChangedThreshold is a log parse operation binding the contract event 0x610f7ff2b304ae8903c3de74c60c6ab1f7d6226b3f52c5161905bb5ad4039c93. +// +// Solidity: event ChangedThreshold(uint256 threshold) +func (_Safe *SafeFilterer) ParseChangedThreshold(log types.Log) (*SafeChangedThreshold, error) { + event := new(SafeChangedThreshold) + if err := _Safe.contract.UnpackLog(event, "ChangedThreshold", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// SafeDisabledModuleIterator is returned from FilterDisabledModule and is used to iterate over the raw logs and unpacked data for DisabledModule events raised by the Safe contract. +type SafeDisabledModuleIterator struct { + Event *SafeDisabledModule // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *SafeDisabledModuleIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(SafeDisabledModule) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(SafeDisabledModule) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *SafeDisabledModuleIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *SafeDisabledModuleIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// SafeDisabledModule represents a DisabledModule event raised by the Safe contract. +type SafeDisabledModule struct { + Module common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterDisabledModule is a free log retrieval operation binding the contract event 0xaab4fa2b463f581b2b32cb3b7e3b704b9ce37cc209b5fb4d77e593ace4054276. +// +// Solidity: event DisabledModule(address indexed module) +func (_Safe *SafeFilterer) FilterDisabledModule(opts *bind.FilterOpts, module []common.Address) (*SafeDisabledModuleIterator, error) { + + var moduleRule []interface{} + for _, moduleItem := range module { + moduleRule = append(moduleRule, moduleItem) + } + + logs, sub, err := _Safe.contract.FilterLogs(opts, "DisabledModule", moduleRule) + if err != nil { + return nil, err + } + return &SafeDisabledModuleIterator{contract: _Safe.contract, event: "DisabledModule", logs: logs, sub: sub}, nil +} + +// WatchDisabledModule is a free log subscription operation binding the contract event 0xaab4fa2b463f581b2b32cb3b7e3b704b9ce37cc209b5fb4d77e593ace4054276. +// +// Solidity: event DisabledModule(address indexed module) +func (_Safe *SafeFilterer) WatchDisabledModule(opts *bind.WatchOpts, sink chan<- *SafeDisabledModule, module []common.Address) (event.Subscription, error) { + + var moduleRule []interface{} + for _, moduleItem := range module { + moduleRule = append(moduleRule, moduleItem) + } + + logs, sub, err := _Safe.contract.WatchLogs(opts, "DisabledModule", moduleRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(SafeDisabledModule) + if err := _Safe.contract.UnpackLog(event, "DisabledModule", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseDisabledModule is a log parse operation binding the contract event 0xaab4fa2b463f581b2b32cb3b7e3b704b9ce37cc209b5fb4d77e593ace4054276. +// +// Solidity: event DisabledModule(address indexed module) +func (_Safe *SafeFilterer) ParseDisabledModule(log types.Log) (*SafeDisabledModule, error) { + event := new(SafeDisabledModule) + if err := _Safe.contract.UnpackLog(event, "DisabledModule", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// SafeEnabledModuleIterator is returned from FilterEnabledModule and is used to iterate over the raw logs and unpacked data for EnabledModule events raised by the Safe contract. +type SafeEnabledModuleIterator struct { + Event *SafeEnabledModule // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *SafeEnabledModuleIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(SafeEnabledModule) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(SafeEnabledModule) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *SafeEnabledModuleIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *SafeEnabledModuleIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// SafeEnabledModule represents a EnabledModule event raised by the Safe contract. +type SafeEnabledModule struct { + Module common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterEnabledModule is a free log retrieval operation binding the contract event 0xecdf3a3effea5783a3c4c2140e677577666428d44ed9d474a0b3a4c9943f8440. +// +// Solidity: event EnabledModule(address indexed module) +func (_Safe *SafeFilterer) FilterEnabledModule(opts *bind.FilterOpts, module []common.Address) (*SafeEnabledModuleIterator, error) { + + var moduleRule []interface{} + for _, moduleItem := range module { + moduleRule = append(moduleRule, moduleItem) + } + + logs, sub, err := _Safe.contract.FilterLogs(opts, "EnabledModule", moduleRule) + if err != nil { + return nil, err + } + return &SafeEnabledModuleIterator{contract: _Safe.contract, event: "EnabledModule", logs: logs, sub: sub}, nil +} + +// WatchEnabledModule is a free log subscription operation binding the contract event 0xecdf3a3effea5783a3c4c2140e677577666428d44ed9d474a0b3a4c9943f8440. +// +// Solidity: event EnabledModule(address indexed module) +func (_Safe *SafeFilterer) WatchEnabledModule(opts *bind.WatchOpts, sink chan<- *SafeEnabledModule, module []common.Address) (event.Subscription, error) { + + var moduleRule []interface{} + for _, moduleItem := range module { + moduleRule = append(moduleRule, moduleItem) + } + + logs, sub, err := _Safe.contract.WatchLogs(opts, "EnabledModule", moduleRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(SafeEnabledModule) + if err := _Safe.contract.UnpackLog(event, "EnabledModule", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseEnabledModule is a log parse operation binding the contract event 0xecdf3a3effea5783a3c4c2140e677577666428d44ed9d474a0b3a4c9943f8440. +// +// Solidity: event EnabledModule(address indexed module) +func (_Safe *SafeFilterer) ParseEnabledModule(log types.Log) (*SafeEnabledModule, error) { + event := new(SafeEnabledModule) + if err := _Safe.contract.UnpackLog(event, "EnabledModule", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// SafeExecutionFailureIterator is returned from FilterExecutionFailure and is used to iterate over the raw logs and unpacked data for ExecutionFailure events raised by the Safe contract. +type SafeExecutionFailureIterator struct { + Event *SafeExecutionFailure // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *SafeExecutionFailureIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(SafeExecutionFailure) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(SafeExecutionFailure) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *SafeExecutionFailureIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *SafeExecutionFailureIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// SafeExecutionFailure represents a ExecutionFailure event raised by the Safe contract. +type SafeExecutionFailure struct { + TxHash [32]byte + Payment *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterExecutionFailure is a free log retrieval operation binding the contract event 0x23428b18acfb3ea64b08dc0c1d296ea9c09702c09083ca5272e64d115b687d23. +// +// Solidity: event ExecutionFailure(bytes32 indexed txHash, uint256 payment) +func (_Safe *SafeFilterer) FilterExecutionFailure(opts *bind.FilterOpts, txHash [][32]byte) (*SafeExecutionFailureIterator, error) { + + var txHashRule []interface{} + for _, txHashItem := range txHash { + txHashRule = append(txHashRule, txHashItem) + } + + logs, sub, err := _Safe.contract.FilterLogs(opts, "ExecutionFailure", txHashRule) + if err != nil { + return nil, err + } + return &SafeExecutionFailureIterator{contract: _Safe.contract, event: "ExecutionFailure", logs: logs, sub: sub}, nil +} + +// WatchExecutionFailure is a free log subscription operation binding the contract event 0x23428b18acfb3ea64b08dc0c1d296ea9c09702c09083ca5272e64d115b687d23. +// +// Solidity: event ExecutionFailure(bytes32 indexed txHash, uint256 payment) +func (_Safe *SafeFilterer) WatchExecutionFailure(opts *bind.WatchOpts, sink chan<- *SafeExecutionFailure, txHash [][32]byte) (event.Subscription, error) { + + var txHashRule []interface{} + for _, txHashItem := range txHash { + txHashRule = append(txHashRule, txHashItem) + } + + logs, sub, err := _Safe.contract.WatchLogs(opts, "ExecutionFailure", txHashRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(SafeExecutionFailure) + if err := _Safe.contract.UnpackLog(event, "ExecutionFailure", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseExecutionFailure is a log parse operation binding the contract event 0x23428b18acfb3ea64b08dc0c1d296ea9c09702c09083ca5272e64d115b687d23. +// +// Solidity: event ExecutionFailure(bytes32 indexed txHash, uint256 payment) +func (_Safe *SafeFilterer) ParseExecutionFailure(log types.Log) (*SafeExecutionFailure, error) { + event := new(SafeExecutionFailure) + if err := _Safe.contract.UnpackLog(event, "ExecutionFailure", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// SafeExecutionFromModuleFailureIterator is returned from FilterExecutionFromModuleFailure and is used to iterate over the raw logs and unpacked data for ExecutionFromModuleFailure events raised by the Safe contract. +type SafeExecutionFromModuleFailureIterator struct { + Event *SafeExecutionFromModuleFailure // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *SafeExecutionFromModuleFailureIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(SafeExecutionFromModuleFailure) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(SafeExecutionFromModuleFailure) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *SafeExecutionFromModuleFailureIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *SafeExecutionFromModuleFailureIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// SafeExecutionFromModuleFailure represents a ExecutionFromModuleFailure event raised by the Safe contract. +type SafeExecutionFromModuleFailure struct { + Module common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterExecutionFromModuleFailure is a free log retrieval operation binding the contract event 0xacd2c8702804128fdb0db2bb49f6d127dd0181c13fd45dbfe16de0930e2bd375. +// +// Solidity: event ExecutionFromModuleFailure(address indexed module) +func (_Safe *SafeFilterer) FilterExecutionFromModuleFailure(opts *bind.FilterOpts, module []common.Address) (*SafeExecutionFromModuleFailureIterator, error) { + + var moduleRule []interface{} + for _, moduleItem := range module { + moduleRule = append(moduleRule, moduleItem) + } + + logs, sub, err := _Safe.contract.FilterLogs(opts, "ExecutionFromModuleFailure", moduleRule) + if err != nil { + return nil, err + } + return &SafeExecutionFromModuleFailureIterator{contract: _Safe.contract, event: "ExecutionFromModuleFailure", logs: logs, sub: sub}, nil +} + +// WatchExecutionFromModuleFailure is a free log subscription operation binding the contract event 0xacd2c8702804128fdb0db2bb49f6d127dd0181c13fd45dbfe16de0930e2bd375. +// +// Solidity: event ExecutionFromModuleFailure(address indexed module) +func (_Safe *SafeFilterer) WatchExecutionFromModuleFailure(opts *bind.WatchOpts, sink chan<- *SafeExecutionFromModuleFailure, module []common.Address) (event.Subscription, error) { + + var moduleRule []interface{} + for _, moduleItem := range module { + moduleRule = append(moduleRule, moduleItem) + } + + logs, sub, err := _Safe.contract.WatchLogs(opts, "ExecutionFromModuleFailure", moduleRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(SafeExecutionFromModuleFailure) + if err := _Safe.contract.UnpackLog(event, "ExecutionFromModuleFailure", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseExecutionFromModuleFailure is a log parse operation binding the contract event 0xacd2c8702804128fdb0db2bb49f6d127dd0181c13fd45dbfe16de0930e2bd375. +// +// Solidity: event ExecutionFromModuleFailure(address indexed module) +func (_Safe *SafeFilterer) ParseExecutionFromModuleFailure(log types.Log) (*SafeExecutionFromModuleFailure, error) { + event := new(SafeExecutionFromModuleFailure) + if err := _Safe.contract.UnpackLog(event, "ExecutionFromModuleFailure", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// SafeExecutionFromModuleSuccessIterator is returned from FilterExecutionFromModuleSuccess and is used to iterate over the raw logs and unpacked data for ExecutionFromModuleSuccess events raised by the Safe contract. +type SafeExecutionFromModuleSuccessIterator struct { + Event *SafeExecutionFromModuleSuccess // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *SafeExecutionFromModuleSuccessIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(SafeExecutionFromModuleSuccess) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(SafeExecutionFromModuleSuccess) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *SafeExecutionFromModuleSuccessIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *SafeExecutionFromModuleSuccessIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// SafeExecutionFromModuleSuccess represents a ExecutionFromModuleSuccess event raised by the Safe contract. +type SafeExecutionFromModuleSuccess struct { + Module common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterExecutionFromModuleSuccess is a free log retrieval operation binding the contract event 0x6895c13664aa4f67288b25d7a21d7aaa34916e355fb9b6fae0a139a9085becb8. +// +// Solidity: event ExecutionFromModuleSuccess(address indexed module) +func (_Safe *SafeFilterer) FilterExecutionFromModuleSuccess(opts *bind.FilterOpts, module []common.Address) (*SafeExecutionFromModuleSuccessIterator, error) { + + var moduleRule []interface{} + for _, moduleItem := range module { + moduleRule = append(moduleRule, moduleItem) + } + + logs, sub, err := _Safe.contract.FilterLogs(opts, "ExecutionFromModuleSuccess", moduleRule) + if err != nil { + return nil, err + } + return &SafeExecutionFromModuleSuccessIterator{contract: _Safe.contract, event: "ExecutionFromModuleSuccess", logs: logs, sub: sub}, nil +} + +// WatchExecutionFromModuleSuccess is a free log subscription operation binding the contract event 0x6895c13664aa4f67288b25d7a21d7aaa34916e355fb9b6fae0a139a9085becb8. +// +// Solidity: event ExecutionFromModuleSuccess(address indexed module) +func (_Safe *SafeFilterer) WatchExecutionFromModuleSuccess(opts *bind.WatchOpts, sink chan<- *SafeExecutionFromModuleSuccess, module []common.Address) (event.Subscription, error) { + + var moduleRule []interface{} + for _, moduleItem := range module { + moduleRule = append(moduleRule, moduleItem) + } + + logs, sub, err := _Safe.contract.WatchLogs(opts, "ExecutionFromModuleSuccess", moduleRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(SafeExecutionFromModuleSuccess) + if err := _Safe.contract.UnpackLog(event, "ExecutionFromModuleSuccess", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseExecutionFromModuleSuccess is a log parse operation binding the contract event 0x6895c13664aa4f67288b25d7a21d7aaa34916e355fb9b6fae0a139a9085becb8. +// +// Solidity: event ExecutionFromModuleSuccess(address indexed module) +func (_Safe *SafeFilterer) ParseExecutionFromModuleSuccess(log types.Log) (*SafeExecutionFromModuleSuccess, error) { + event := new(SafeExecutionFromModuleSuccess) + if err := _Safe.contract.UnpackLog(event, "ExecutionFromModuleSuccess", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// SafeExecutionSuccessIterator is returned from FilterExecutionSuccess and is used to iterate over the raw logs and unpacked data for ExecutionSuccess events raised by the Safe contract. +type SafeExecutionSuccessIterator struct { + Event *SafeExecutionSuccess // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *SafeExecutionSuccessIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(SafeExecutionSuccess) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(SafeExecutionSuccess) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *SafeExecutionSuccessIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *SafeExecutionSuccessIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// SafeExecutionSuccess represents a ExecutionSuccess event raised by the Safe contract. +type SafeExecutionSuccess struct { + TxHash [32]byte + Payment *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterExecutionSuccess is a free log retrieval operation binding the contract event 0x442e715f626346e8c54381002da614f62bee8d27386535b2521ec8540898556e. +// +// Solidity: event ExecutionSuccess(bytes32 indexed txHash, uint256 payment) +func (_Safe *SafeFilterer) FilterExecutionSuccess(opts *bind.FilterOpts, txHash [][32]byte) (*SafeExecutionSuccessIterator, error) { + + var txHashRule []interface{} + for _, txHashItem := range txHash { + txHashRule = append(txHashRule, txHashItem) + } + + logs, sub, err := _Safe.contract.FilterLogs(opts, "ExecutionSuccess", txHashRule) + if err != nil { + return nil, err + } + return &SafeExecutionSuccessIterator{contract: _Safe.contract, event: "ExecutionSuccess", logs: logs, sub: sub}, nil +} + +// WatchExecutionSuccess is a free log subscription operation binding the contract event 0x442e715f626346e8c54381002da614f62bee8d27386535b2521ec8540898556e. +// +// Solidity: event ExecutionSuccess(bytes32 indexed txHash, uint256 payment) +func (_Safe *SafeFilterer) WatchExecutionSuccess(opts *bind.WatchOpts, sink chan<- *SafeExecutionSuccess, txHash [][32]byte) (event.Subscription, error) { + + var txHashRule []interface{} + for _, txHashItem := range txHash { + txHashRule = append(txHashRule, txHashItem) + } + + logs, sub, err := _Safe.contract.WatchLogs(opts, "ExecutionSuccess", txHashRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(SafeExecutionSuccess) + if err := _Safe.contract.UnpackLog(event, "ExecutionSuccess", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseExecutionSuccess is a log parse operation binding the contract event 0x442e715f626346e8c54381002da614f62bee8d27386535b2521ec8540898556e. +// +// Solidity: event ExecutionSuccess(bytes32 indexed txHash, uint256 payment) +func (_Safe *SafeFilterer) ParseExecutionSuccess(log types.Log) (*SafeExecutionSuccess, error) { + event := new(SafeExecutionSuccess) + if err := _Safe.contract.UnpackLog(event, "ExecutionSuccess", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// SafeRemovedOwnerIterator is returned from FilterRemovedOwner and is used to iterate over the raw logs and unpacked data for RemovedOwner events raised by the Safe contract. +type SafeRemovedOwnerIterator struct { + Event *SafeRemovedOwner // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *SafeRemovedOwnerIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(SafeRemovedOwner) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(SafeRemovedOwner) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *SafeRemovedOwnerIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *SafeRemovedOwnerIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// SafeRemovedOwner represents a RemovedOwner event raised by the Safe contract. +type SafeRemovedOwner struct { + Owner common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterRemovedOwner is a free log retrieval operation binding the contract event 0xf8d49fc529812e9a7c5c50e69c20f0dccc0db8fa95c98bc58cc9a4f1c1299eaf. +// +// Solidity: event RemovedOwner(address indexed owner) +func (_Safe *SafeFilterer) FilterRemovedOwner(opts *bind.FilterOpts, owner []common.Address) (*SafeRemovedOwnerIterator, error) { + + var ownerRule []interface{} + for _, ownerItem := range owner { + ownerRule = append(ownerRule, ownerItem) + } + + logs, sub, err := _Safe.contract.FilterLogs(opts, "RemovedOwner", ownerRule) + if err != nil { + return nil, err + } + return &SafeRemovedOwnerIterator{contract: _Safe.contract, event: "RemovedOwner", logs: logs, sub: sub}, nil +} + +// WatchRemovedOwner is a free log subscription operation binding the contract event 0xf8d49fc529812e9a7c5c50e69c20f0dccc0db8fa95c98bc58cc9a4f1c1299eaf. +// +// Solidity: event RemovedOwner(address indexed owner) +func (_Safe *SafeFilterer) WatchRemovedOwner(opts *bind.WatchOpts, sink chan<- *SafeRemovedOwner, owner []common.Address) (event.Subscription, error) { + + var ownerRule []interface{} + for _, ownerItem := range owner { + ownerRule = append(ownerRule, ownerItem) + } + + logs, sub, err := _Safe.contract.WatchLogs(opts, "RemovedOwner", ownerRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(SafeRemovedOwner) + if err := _Safe.contract.UnpackLog(event, "RemovedOwner", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseRemovedOwner is a log parse operation binding the contract event 0xf8d49fc529812e9a7c5c50e69c20f0dccc0db8fa95c98bc58cc9a4f1c1299eaf. +// +// Solidity: event RemovedOwner(address indexed owner) +func (_Safe *SafeFilterer) ParseRemovedOwner(log types.Log) (*SafeRemovedOwner, error) { + event := new(SafeRemovedOwner) + if err := _Safe.contract.UnpackLog(event, "RemovedOwner", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// SafeSafeReceivedIterator is returned from FilterSafeReceived and is used to iterate over the raw logs and unpacked data for SafeReceived events raised by the Safe contract. +type SafeSafeReceivedIterator struct { + Event *SafeSafeReceived // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *SafeSafeReceivedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(SafeSafeReceived) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(SafeSafeReceived) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *SafeSafeReceivedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *SafeSafeReceivedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// SafeSafeReceived represents a SafeReceived event raised by the Safe contract. +type SafeSafeReceived struct { + Sender common.Address + Value *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterSafeReceived is a free log retrieval operation binding the contract event 0x3d0ce9bfc3ed7d6862dbb28b2dea94561fe714a1b4d019aa8af39730d1ad7c3d. +// +// Solidity: event SafeReceived(address indexed sender, uint256 value) +func (_Safe *SafeFilterer) FilterSafeReceived(opts *bind.FilterOpts, sender []common.Address) (*SafeSafeReceivedIterator, error) { + + var senderRule []interface{} + for _, senderItem := range sender { + senderRule = append(senderRule, senderItem) + } + + logs, sub, err := _Safe.contract.FilterLogs(opts, "SafeReceived", senderRule) + if err != nil { + return nil, err + } + return &SafeSafeReceivedIterator{contract: _Safe.contract, event: "SafeReceived", logs: logs, sub: sub}, nil +} + +// WatchSafeReceived is a free log subscription operation binding the contract event 0x3d0ce9bfc3ed7d6862dbb28b2dea94561fe714a1b4d019aa8af39730d1ad7c3d. +// +// Solidity: event SafeReceived(address indexed sender, uint256 value) +func (_Safe *SafeFilterer) WatchSafeReceived(opts *bind.WatchOpts, sink chan<- *SafeSafeReceived, sender []common.Address) (event.Subscription, error) { + + var senderRule []interface{} + for _, senderItem := range sender { + senderRule = append(senderRule, senderItem) + } + + logs, sub, err := _Safe.contract.WatchLogs(opts, "SafeReceived", senderRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(SafeSafeReceived) + if err := _Safe.contract.UnpackLog(event, "SafeReceived", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseSafeReceived is a log parse operation binding the contract event 0x3d0ce9bfc3ed7d6862dbb28b2dea94561fe714a1b4d019aa8af39730d1ad7c3d. +// +// Solidity: event SafeReceived(address indexed sender, uint256 value) +func (_Safe *SafeFilterer) ParseSafeReceived(log types.Log) (*SafeSafeReceived, error) { + event := new(SafeSafeReceived) + if err := _Safe.contract.UnpackLog(event, "SafeReceived", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// SafeSafeSetupIterator is returned from FilterSafeSetup and is used to iterate over the raw logs and unpacked data for SafeSetup events raised by the Safe contract. +type SafeSafeSetupIterator struct { + Event *SafeSafeSetup // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *SafeSafeSetupIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(SafeSafeSetup) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(SafeSafeSetup) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *SafeSafeSetupIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *SafeSafeSetupIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// SafeSafeSetup represents a SafeSetup event raised by the Safe contract. +type SafeSafeSetup struct { + Initiator common.Address + Owners []common.Address + Threshold *big.Int + Initializer common.Address + FallbackHandler common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterSafeSetup is a free log retrieval operation binding the contract event 0x141df868a6331af528e38c83b7aa03edc19be66e37ae67f9285bf4f8e3c6a1a8. +// +// Solidity: event SafeSetup(address indexed initiator, address[] owners, uint256 threshold, address initializer, address fallbackHandler) +func (_Safe *SafeFilterer) FilterSafeSetup(opts *bind.FilterOpts, initiator []common.Address) (*SafeSafeSetupIterator, error) { + + var initiatorRule []interface{} + for _, initiatorItem := range initiator { + initiatorRule = append(initiatorRule, initiatorItem) + } + + logs, sub, err := _Safe.contract.FilterLogs(opts, "SafeSetup", initiatorRule) + if err != nil { + return nil, err + } + return &SafeSafeSetupIterator{contract: _Safe.contract, event: "SafeSetup", logs: logs, sub: sub}, nil +} + +// WatchSafeSetup is a free log subscription operation binding the contract event 0x141df868a6331af528e38c83b7aa03edc19be66e37ae67f9285bf4f8e3c6a1a8. +// +// Solidity: event SafeSetup(address indexed initiator, address[] owners, uint256 threshold, address initializer, address fallbackHandler) +func (_Safe *SafeFilterer) WatchSafeSetup(opts *bind.WatchOpts, sink chan<- *SafeSafeSetup, initiator []common.Address) (event.Subscription, error) { + + var initiatorRule []interface{} + for _, initiatorItem := range initiator { + initiatorRule = append(initiatorRule, initiatorItem) + } + + logs, sub, err := _Safe.contract.WatchLogs(opts, "SafeSetup", initiatorRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(SafeSafeSetup) + if err := _Safe.contract.UnpackLog(event, "SafeSetup", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseSafeSetup is a log parse operation binding the contract event 0x141df868a6331af528e38c83b7aa03edc19be66e37ae67f9285bf4f8e3c6a1a8. +// +// Solidity: event SafeSetup(address indexed initiator, address[] owners, uint256 threshold, address initializer, address fallbackHandler) +func (_Safe *SafeFilterer) ParseSafeSetup(log types.Log) (*SafeSafeSetup, error) { + event := new(SafeSafeSetup) + if err := _Safe.contract.UnpackLog(event, "SafeSetup", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// SafeSignMsgIterator is returned from FilterSignMsg and is used to iterate over the raw logs and unpacked data for SignMsg events raised by the Safe contract. +type SafeSignMsgIterator struct { + Event *SafeSignMsg // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *SafeSignMsgIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(SafeSignMsg) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(SafeSignMsg) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *SafeSignMsgIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *SafeSignMsgIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// SafeSignMsg represents a SignMsg event raised by the Safe contract. +type SafeSignMsg struct { + MsgHash [32]byte + Raw types.Log // Blockchain specific contextual infos +} + +// FilterSignMsg is a free log retrieval operation binding the contract event 0xe7f4675038f4f6034dfcbbb24c4dc08e4ebf10eb9d257d3d02c0f38d122ac6e4. +// +// Solidity: event SignMsg(bytes32 indexed msgHash) +func (_Safe *SafeFilterer) FilterSignMsg(opts *bind.FilterOpts, msgHash [][32]byte) (*SafeSignMsgIterator, error) { + + var msgHashRule []interface{} + for _, msgHashItem := range msgHash { + msgHashRule = append(msgHashRule, msgHashItem) + } + + logs, sub, err := _Safe.contract.FilterLogs(opts, "SignMsg", msgHashRule) + if err != nil { + return nil, err + } + return &SafeSignMsgIterator{contract: _Safe.contract, event: "SignMsg", logs: logs, sub: sub}, nil +} + +// WatchSignMsg is a free log subscription operation binding the contract event 0xe7f4675038f4f6034dfcbbb24c4dc08e4ebf10eb9d257d3d02c0f38d122ac6e4. +// +// Solidity: event SignMsg(bytes32 indexed msgHash) +func (_Safe *SafeFilterer) WatchSignMsg(opts *bind.WatchOpts, sink chan<- *SafeSignMsg, msgHash [][32]byte) (event.Subscription, error) { + + var msgHashRule []interface{} + for _, msgHashItem := range msgHash { + msgHashRule = append(msgHashRule, msgHashItem) + } + + logs, sub, err := _Safe.contract.WatchLogs(opts, "SignMsg", msgHashRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(SafeSignMsg) + if err := _Safe.contract.UnpackLog(event, "SignMsg", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseSignMsg is a log parse operation binding the contract event 0xe7f4675038f4f6034dfcbbb24c4dc08e4ebf10eb9d257d3d02c0f38d122ac6e4. +// +// Solidity: event SignMsg(bytes32 indexed msgHash) +func (_Safe *SafeFilterer) ParseSignMsg(log types.Log) (*SafeSignMsg, error) { + event := new(SafeSignMsg) + if err := _Safe.contract.UnpackLog(event, "SignMsg", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} diff --git a/op-bindings/bindings/safe_more.go b/op-bindings/bindings/safe_more.go new file mode 100644 index 000000000000..bbdbc7b93fb2 --- /dev/null +++ b/op-bindings/bindings/safe_more.go @@ -0,0 +1,25 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package bindings + +import ( + "encoding/json" + + "github.com/ethereum-optimism/optimism/op-bindings/solc" +) + +const SafeStorageLayoutJSON = "{\"storage\":[{\"astId\":1000,\"contract\":\"lib/safe-contracts/contracts/Safe.sol:Safe\",\"label\":\"singleton\",\"offset\":0,\"slot\":\"0\",\"type\":\"t_address\"},{\"astId\":1001,\"contract\":\"lib/safe-contracts/contracts/Safe.sol:Safe\",\"label\":\"modules\",\"offset\":0,\"slot\":\"1\",\"type\":\"t_mapping(t_address,t_address)\"},{\"astId\":1002,\"contract\":\"lib/safe-contracts/contracts/Safe.sol:Safe\",\"label\":\"owners\",\"offset\":0,\"slot\":\"2\",\"type\":\"t_mapping(t_address,t_address)\"},{\"astId\":1003,\"contract\":\"lib/safe-contracts/contracts/Safe.sol:Safe\",\"label\":\"ownerCount\",\"offset\":0,\"slot\":\"3\",\"type\":\"t_uint256\"},{\"astId\":1004,\"contract\":\"lib/safe-contracts/contracts/Safe.sol:Safe\",\"label\":\"threshold\",\"offset\":0,\"slot\":\"4\",\"type\":\"t_uint256\"},{\"astId\":1005,\"contract\":\"lib/safe-contracts/contracts/Safe.sol:Safe\",\"label\":\"nonce\",\"offset\":0,\"slot\":\"5\",\"type\":\"t_uint256\"},{\"astId\":1006,\"contract\":\"lib/safe-contracts/contracts/Safe.sol:Safe\",\"label\":\"_deprecatedDomainSeparator\",\"offset\":0,\"slot\":\"6\",\"type\":\"t_bytes32\"},{\"astId\":1007,\"contract\":\"lib/safe-contracts/contracts/Safe.sol:Safe\",\"label\":\"signedMessages\",\"offset\":0,\"slot\":\"7\",\"type\":\"t_mapping(t_bytes32,t_uint256)\"},{\"astId\":1008,\"contract\":\"lib/safe-contracts/contracts/Safe.sol:Safe\",\"label\":\"approvedHashes\",\"offset\":0,\"slot\":\"8\",\"type\":\"t_mapping(t_address,t_mapping(t_bytes32,t_uint256))\"}],\"types\":{\"t_address\":{\"encoding\":\"inplace\",\"label\":\"address\",\"numberOfBytes\":\"20\"},\"t_bytes32\":{\"encoding\":\"inplace\",\"label\":\"bytes32\",\"numberOfBytes\":\"32\"},\"t_mapping(t_address,t_address)\":{\"encoding\":\"mapping\",\"label\":\"mapping(address =\u003e address)\",\"numberOfBytes\":\"32\",\"key\":\"t_address\",\"value\":\"t_address\"},\"t_mapping(t_address,t_mapping(t_bytes32,t_uint256))\":{\"encoding\":\"mapping\",\"label\":\"mapping(address =\u003e mapping(bytes32 =\u003e uint256))\",\"numberOfBytes\":\"32\",\"key\":\"t_address\",\"value\":\"t_mapping(t_bytes32,t_uint256)\"},\"t_mapping(t_bytes32,t_uint256)\":{\"encoding\":\"mapping\",\"label\":\"mapping(bytes32 =\u003e uint256)\",\"numberOfBytes\":\"32\",\"key\":\"t_bytes32\",\"value\":\"t_uint256\"},\"t_uint256\":{\"encoding\":\"inplace\",\"label\":\"uint256\",\"numberOfBytes\":\"32\"}}}" + +var SafeStorageLayout = new(solc.StorageLayout) + +var SafeDeployedBin = "0x6080604052600436106101d15760003560e01c8063affed0e0116100f7578063e19a9dd911610095578063f08a032311610064578063f08a0323146105f5578063f698da2514610615578063f8dc5dd91461067c578063ffa1ad741461069c5761020d565b8063e19a9dd914610580578063e318b52b146105a0578063e75235b8146105c0578063e86637db146105d55761020d565b8063cc2f8452116100d1578063cc2f8452146104f2578063d4d9bdcd14610520578063d8d11f7814610540578063e009cfde146105605761020d565b8063affed0e01461049c578063b4faba09146104b2578063b63e800d146104d25761020d565b80635624b25b1161016f5780636a7612021161013e5780636a7612021461040f5780637d83297414610422578063934f3a111461045a578063a0e67e2b1461047a5761020d565b80635624b25b146103755780635ae6bd37146103a2578063610b5925146103cf578063694e80c3146103ef5761020d565b80632f54bf6e116101ab5780632f54bf6e146102ea5780633408e4701461030a578063468721a7146103275780635229073f146103475761020d565b80630d582f131461027357806312fb68e0146102955780632d9ad53d146102b55761020d565b3661020d5760405134815233907f3d0ce9bfc3ed7d6862dbb28b2dea94561fe714a1b4d019aa8af39730d1ad7c3d9060200160405180910390a2005b34801561021957600080fd5b507f6c9a6c4a39284e37ed1cf53d337577d14212a4870fb976a4366c693b939918d580548061024457005b36600080373360601b365260008060143601600080855af190503d6000803e8061026d573d6000fd5b503d6000f35b34801561027f57600080fd5b5061029361028e366004613568565b6106e5565b005b3480156102a157600080fd5b506102936102b036600461366e565b610933565b3480156102c157600080fd5b506102d56102d03660046136e3565b610ff7565b60405190151581526020015b60405180910390f35b3480156102f657600080fd5b506102d56103053660046136e3565b61104c565b34801561031657600080fd5b50465b6040519081526020016102e1565b34801561033357600080fd5b506102d561034236600461370f565b61109e565b34801561035357600080fd5b5061036761036236600461370f565b6111d4565b6040516102e19291906137e4565b34801561038157600080fd5b506103956103903660046137ff565b61120a565b6040516102e19190613821565b3480156103ae57600080fd5b506103196103bd366004613834565b60076020526000908152604090205481565b3480156103db57600080fd5b506102936103ea3660046136e3565b611290565b3480156103fb57600080fd5b5061029361040a366004613834565b611479565b6102d561041d366004613896565b611593565b34801561042e57600080fd5b5061031961043d366004613568565b600860209081526000928352604080842090915290825290205481565b34801561046657600080fd5b5061029361047536600461396f565b61198f565b34801561048657600080fd5b5061048f611a0b565b6040516102e19190613a2d565b3480156104a857600080fd5b5061031960055481565b3480156104be57600080fd5b506102936104cd366004613a40565b611b23565b3480156104de57600080fd5b506102936104ed366004613a90565b611b46565b3480156104fe57600080fd5b5061051261050d366004613568565b611c62565b6040516102e1929190613b85565b34801561052c57600080fd5b5061029361053b366004613834565b611ed0565b34801561054c57600080fd5b5061031961055b366004613bbd565b611fa4565b34801561056c57600080fd5b5061029361057b366004613c7e565b611fd1565b34801561058c57600080fd5b5061029361059b3660046136e3565b6121a3565b3480156105ac57600080fd5b506102936105bb366004613cb7565b612344565b3480156105cc57600080fd5b50600454610319565b3480156105e157600080fd5b506103956105f0366004613bbd565b6126bc565b34801561060157600080fd5b506102936106103660046136e3565b612855565b34801561062157600080fd5b5061031960007f47e79534a245952e8b16893a336b85a3d9ea9fa8c573f3d803afb92a794692184660408051602081019390935282015230606082015260800160405160208183030381529060405280519060200120905090565b34801561068857600080fd5b50610293610697366004613d02565b6128aa565b3480156106a857600080fd5b506103956040518060400160405280600581526020017f312e342e3000000000000000000000000000000000000000000000000000000081525081565b6106ed612b34565b73ffffffffffffffffffffffffffffffffffffffff821615801590610729575073ffffffffffffffffffffffffffffffffffffffff8216600114155b801561074b575073ffffffffffffffffffffffffffffffffffffffff82163014155b6107b6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475332303300000000000000000000000000000000000000000000000000000060448201526064015b60405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8281166000908152600260205260409020541615610845576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475332303400000000000000000000000000000000000000000000000000000060448201526064016107ad565b60026020527fe90b7bceb6e7df5418fb78d8ee546e97c83a08bbccc01a0644d599ccd2a7c2e0805473ffffffffffffffffffffffffffffffffffffffff8481166000818152604081208054939094167fffffffffffffffffffffffff0000000000000000000000000000000000000000938416179093556001835283549091161790915560038054916108d783613d72565b909155505060405173ffffffffffffffffffffffffffffffffffffffff8316907f9465fa0c962cc76958e6373a993326400c1c94f8be2fe3a952adfa7f60b2ea2690600090a2806004541461092f5761092f81611479565b5050565b61093e816041612b9f565b825110156109a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475330323000000000000000000000000000000000000000000000000000000060448201526064016107ad565b6000808060008060005b86811015610feb576041818102890160208101516040820151919092015160ff16955090935091506000849003610cf857885160208a01208a14610a52576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475330323700000000000000000000000000000000000000000000000000000060448201526064016107ad565b9193508391610a62876041612b9f565b821015610acb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475330323100000000000000000000000000000000000000000000000000000060448201526064016107ad565b8751610ad8836020612bdb565b1115610b40576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475330323200000000000000000000000000000000000000000000000000000060448201526064016107ad565b602082890181015189519091610b63908390610b5d908790612bdb565b90612bdb565b1115610bcb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475330323300000000000000000000000000000000000000000000000000000060448201526064016107ad565b6040517f20c13b0b000000000000000000000000000000000000000000000000000000008082528a85016020019173ffffffffffffffffffffffffffffffffffffffff8916906320c13b0b90610c27908f908690600401613daa565b602060405180830381865afa158015610c44573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c689190613dcf565b7fffffffff000000000000000000000000000000000000000000000000000000001614610cf1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475330323400000000000000000000000000000000000000000000000000000060448201526064016107ad565b5050610eeb565b8360ff16600103610dc65791935083913373ffffffffffffffffffffffffffffffffffffffff84161480610d5b575073ffffffffffffffffffffffffffffffffffffffff851660009081526008602090815260408083208d845290915290205415155b610dc1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475330323500000000000000000000000000000000000000000000000000000060448201526064016107ad565b610eeb565b601e8460ff161115610e8b576040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c81018b9052600190605c0160405160208183030381529060405280519060200120600486610e2b9190613e11565b6040805160008152602081018083529390935260ff90911690820152606081018590526080810184905260a0016020604051602081039080840390855afa158015610e7a573d6000803e3d6000fd5b505050602060405103519450610eeb565b6040805160008152602081018083528c905260ff861691810191909152606081018490526080810183905260019060a0016020604051602081039080840390855afa158015610ede573d6000803e3d6000fd5b5050506020604051035194505b8573ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16118015610f4c575073ffffffffffffffffffffffffffffffffffffffff8581166000908152600260205260409020541615155b8015610f6f575073ffffffffffffffffffffffffffffffffffffffff8516600114155b610fd5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475330323600000000000000000000000000000000000000000000000000000060448201526064016107ad565b8495508080610fe390613d72565b9150506109b2565b50505050505050505050565b6000600173ffffffffffffffffffffffffffffffffffffffff831614801590611046575073ffffffffffffffffffffffffffffffffffffffff8281166000908152600160205260409020541615155b92915050565b600073ffffffffffffffffffffffffffffffffffffffff821660011480159061104657505073ffffffffffffffffffffffffffffffffffffffff90811660009081526002602052604090205416151590565b6000336001148015906110d557503360009081526001602052604090205473ffffffffffffffffffffffffffffffffffffffff1615155b61113b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475331303400000000000000000000000000000000000000000000000000000060448201526064016107ad565b611168858585857fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff612bf7565b905080156111a05760405133907f6895c13664aa4f67288b25d7a21d7aaa34916e355fb9b6fae0a139a9085becb890600090a26111cc565b60405133907facd2c8702804128fdb0db2bb49f6d127dd0181c13fd45dbfe16de0930e2bd37590600090a25b949350505050565b600060606111e48686868661109e565b915060405160203d0181016040523d81523d6000602083013e8091505094509492505050565b60606000611219836020613e34565b67ffffffffffffffff81111561123157611231613594565b6040519080825280601f01601f19166020018201604052801561125b576020820181803683370190505b50905060005b8381101561128857848101546020808302840101528061128081613d72565b915050611261565b509392505050565b611298612b34565b73ffffffffffffffffffffffffffffffffffffffff8116158015906112d4575073ffffffffffffffffffffffffffffffffffffffff8116600114155b61133a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475331303100000000000000000000000000000000000000000000000000000060448201526064016107ad565b73ffffffffffffffffffffffffffffffffffffffff81811660009081526001602052604090205416156113c9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475331303200000000000000000000000000000000000000000000000000000060448201526064016107ad565b600160208190527fcc69885fda6bcc1a4ace058b4a62bf5e179ea78fd58a1ccd71c22cc9b688792f805473ffffffffffffffffffffffffffffffffffffffff848116600081815260408082208054949095167fffffffffffffffffffffffff000000000000000000000000000000000000000094851617909455948552835490911681179092555190917fecdf3a3effea5783a3c4c2140e677577666428d44ed9d474a0b3a4c9943f844091a250565b611481612b34565b6003548111156114ed576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475332303100000000000000000000000000000000000000000000000000000060448201526064016107ad565b6001811015611558576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475332303200000000000000000000000000000000000000000000000000000060448201526064016107ad565b60048190556040518181527f610f7ff2b304ae8903c3de74c60c6ab1f7d6226b3f52c5161905bb5ad4039c939060200160405180910390a150565b60008060006115ad8e8e8e8e8e8e8e8e8e8e6005546126bc565b6005805491925060006115bf83613d72565b90915550508051602082012091506115d882828661198f565b5060006116037f4a204f620c8c5ccdca3fd54d003badd85ba500436a431f0cbda4f558c93c34c85490565b905073ffffffffffffffffffffffffffffffffffffffff8116156116a3578073ffffffffffffffffffffffffffffffffffffffff166375f0bb528f8f8f8f8f8f8f8f8f8f8f336040518d63ffffffff1660e01b81526004016116709c9b9a99989796959493929190613edb565b600060405180830381600087803b15801561168a57600080fd5b505af115801561169e573d6000803e3d6000fd5b505050505b6116cf6116b28a6109c4613ff1565b603f6116bf8c6040613e34565b6116c99190614009565b90612c3e565b6116db906101f4613ff1565b5a1015611744576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475330313000000000000000000000000000000000000000000000000000000060448201526064016107ad565b60005a90506117b58f8f8f8f8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508e8c6000146117a2578e612bf7565b6109c45a6117b09190614044565b612bf7565b93506117c25a8290612c55565b905083806117cf57508915155b806117d957508715155b61183f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475330313300000000000000000000000000000000000000000000000000000060448201526064016107ad565b6000881561185757611854828b8b8b8b612c70565b90505b841561189c57837f442e715f626346e8c54381002da614f62bee8d27386535b2521ec8540898556e8260405161188f91815260200190565b60405180910390a26118d7565b837f23428b18acfb3ea64b08dc0c1d296ea9c09702c09083ca5272e64d115b687d23826040516118ce91815260200190565b60405180910390a25b505073ffffffffffffffffffffffffffffffffffffffff81161561197e576040517f9327136800000000000000000000000000000000000000000000000000000000815260048101839052831515602482015273ffffffffffffffffffffffffffffffffffffffff821690639327136890604401600060405180830381600087803b15801561196557600080fd5b505af1158015611979573d6000803e3d6000fd5b505050505b50509b9a5050505050505050505050565b600454806119f9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475330303100000000000000000000000000000000000000000000000000000060448201526064016107ad565b611a0584848484610933565b50505050565b6060600060035467ffffffffffffffff811115611a2a57611a2a613594565b604051908082528060200260200182016040528015611a53578160200160208202803683370190505b506001600090815260026020527fe90b7bceb6e7df5418fb78d8ee546e97c83a08bbccc01a0644d599ccd2a7c2e0549192509073ffffffffffffffffffffffffffffffffffffffff165b73ffffffffffffffffffffffffffffffffffffffff8116600114611b1b5780838381518110611ace57611ace61405b565b73ffffffffffffffffffffffffffffffffffffffff928316602091820292909201810191909152918116600090815260029092526040909120541681611b1381613d72565b925050611a9d565b509092915050565b600080825160208401855af480600052503d6020523d600060403e60403d016000fd5b611b848a8a808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508c9250612e01915050565b73ffffffffffffffffffffffffffffffffffffffff841615611ba957611ba9846131ce565b611be98787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061327192505050565b8115611c0057611bfe82600060018685612c70565b505b3373ffffffffffffffffffffffffffffffffffffffff167f141df868a6331af528e38c83b7aa03edc19be66e37ae67f9285bf4f8e3c6a1a88b8b8b8b89604051611c4e95949392919061408a565b60405180910390a250505050505050505050565b6060600073ffffffffffffffffffffffffffffffffffffffff841660011480611c8f5750611c8f84610ff7565b611cf5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475331303500000000000000000000000000000000000000000000000000000060448201526064016107ad565b60008311611d5f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475331303600000000000000000000000000000000000000000000000000000060448201526064016107ad565b8267ffffffffffffffff811115611d7857611d78613594565b604051908082528060200260200182016040528015611da1578160200160208202803683370190505b5073ffffffffffffffffffffffffffffffffffffffff808616600090815260016020526040812054929450911691505b73ffffffffffffffffffffffffffffffffffffffff821615801590611e0d575073ffffffffffffffffffffffffffffffffffffffff8216600114155b8015611e1857508381105b15611e805781838281518110611e3057611e3061405b565b73ffffffffffffffffffffffffffffffffffffffff928316602091820292909201810191909152928116600090815260019093526040909220549091169080611e7881613d72565b915050611dd1565b73ffffffffffffffffffffffffffffffffffffffff8216600114611ec55782611eaa600183614044565b81518110611eba57611eba61405b565b602002602001015191505b808352509250929050565b3360009081526002602052604090205473ffffffffffffffffffffffffffffffffffffffff16611f5c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475330333000000000000000000000000000000000000000000000000000000060448201526064016107ad565b336000818152600860209081526040808320858452909152808220600190555183917ff2a0eb156472d1440255b0d7c1e19cc07115d1051fe605b0dce69acfec884d9c91a350565b6000611fb98c8c8c8c8c8c8c8c8c8c8c6126bc565b8051906020012090509b9a5050505050505050505050565b611fd9612b34565b73ffffffffffffffffffffffffffffffffffffffff811615801590612015575073ffffffffffffffffffffffffffffffffffffffff8116600114155b61207b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475331303100000000000000000000000000000000000000000000000000000060448201526064016107ad565b73ffffffffffffffffffffffffffffffffffffffff82811660009081526001602052604090205481169082161461210e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475331303300000000000000000000000000000000000000000000000000000060448201526064016107ad565b73ffffffffffffffffffffffffffffffffffffffff818116600081815260016020526040808220805487861684528284208054919096167fffffffffffffffffffffffff0000000000000000000000000000000000000000918216179095558383528054909416909355915190917faab4fa2b463f581b2b32cb3b7e3b704b9ce37cc209b5fb4d77e593ace405427691a25050565b6121ab612b34565b73ffffffffffffffffffffffffffffffffffffffff8116156122db576040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527fe6d7a83a00000000000000000000000000000000000000000000000000000000600482015273ffffffffffffffffffffffffffffffffffffffff8216906301ffc9a790602401602060405180830381865afa158015612251573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122759190614110565b6122db576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475333303000000000000000000000000000000000000000000000000000000060448201526064016107ad565b7f4a204f620c8c5ccdca3fd54d003badd85ba500436a431f0cbda4f558c93c34c881815560405173ffffffffffffffffffffffffffffffffffffffff8316907f1151116914515bc0891ff9047a6cb32cf902546f83066499bcf8ba33d2353fa290600090a25050565b61234c612b34565b73ffffffffffffffffffffffffffffffffffffffff811615801590612388575073ffffffffffffffffffffffffffffffffffffffff8116600114155b80156123aa575073ffffffffffffffffffffffffffffffffffffffff81163014155b612410576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475332303300000000000000000000000000000000000000000000000000000060448201526064016107ad565b73ffffffffffffffffffffffffffffffffffffffff818116600090815260026020526040902054161561249f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475332303400000000000000000000000000000000000000000000000000000060448201526064016107ad565b73ffffffffffffffffffffffffffffffffffffffff8216158015906124db575073ffffffffffffffffffffffffffffffffffffffff8216600114155b612541576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475332303300000000000000000000000000000000000000000000000000000060448201526064016107ad565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600260205260409020548116908316146125d4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475332303500000000000000000000000000000000000000000000000000000060448201526064016107ad565b73ffffffffffffffffffffffffffffffffffffffff828116600081815260026020526040808220805486861680855283852080549288167fffffffffffffffffffffffff00000000000000000000000000000000000000009384161790559589168452828420805482169096179095558383528054909416909355915190917ff8d49fc529812e9a7c5c50e69c20f0dccc0db8fa95c98bc58cc9a4f1c1299eaf91a260405173ffffffffffffffffffffffffffffffffffffffff8216907f9465fa0c962cc76958e6373a993326400c1c94f8be2fe3a952adfa7f60b2ea2690600090a2505050565b606060007fbb8310d486368db6bd6f849402fdd73ad53d316b5a4b2644ad6efe0f941286d860001b8d8d8d8d6040516126f6929190614132565b60405190819003812061271c949392918e908e908e908e908e908e908e90602001614142565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052805160209091012090507f19000000000000000000000000000000000000000000000000000000000000007f01000000000000000000000000000000000000000000000000000000000000006127f060007f47e79534a245952e8b16893a336b85a3d9ea9fa8c573f3d803afb92a794692184660408051602081019390935282015230606082015260800160405160208183030381529060405280519060200120905090565b6040517fff0000000000000000000000000000000000000000000000000000000000000093841660208201529290911660218301526022820152604281018290526062016040516020818303038152906040529150509b9a5050505050505050505050565b61285d612b34565b612866816131ce565b60405173ffffffffffffffffffffffffffffffffffffffff8216907f5ac6c46c93c8d0e53714ba3b53db3e7c046da994313d7ed0d192028bc7c228b090600090a250565b6128b2612b34565b8060016003546128c29190614044565b101561292a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475332303100000000000000000000000000000000000000000000000000000060448201526064016107ad565b73ffffffffffffffffffffffffffffffffffffffff821615801590612966575073ffffffffffffffffffffffffffffffffffffffff8216600114155b6129cc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475332303300000000000000000000000000000000000000000000000000000060448201526064016107ad565b73ffffffffffffffffffffffffffffffffffffffff838116600090815260026020526040902054811690831614612a5f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475332303500000000000000000000000000000000000000000000000000000060448201526064016107ad565b73ffffffffffffffffffffffffffffffffffffffff828116600081815260026020526040808220805488861684529183208054929095167fffffffffffffffffffffffff00000000000000000000000000000000000000009283161790945591815282549091169091556003805491612ad7836141bf565b909155505060405173ffffffffffffffffffffffffffffffffffffffff8316907ff8d49fc529812e9a7c5c50e69c20f0dccc0db8fa95c98bc58cc9a4f1c1299eaf90600090a28060045414612b2f57612b2f81611479565b505050565b333014612b9d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475330333100000000000000000000000000000000000000000000000000000060448201526064016107ad565b565b600082600003612bb157506000611046565b6000612bbd8385613e34565b905082612bca8583614009565b14612bd457600080fd5b9392505050565b600080612be88385613ff1565b905083811015612bd457600080fd5b60006001836001811115612c0d57612c0d613e71565b03612c25576000808551602087018986f49050612c35565b600080855160208701888a87f190505b95945050505050565b600081831015612c4e5781612bd4565b5090919050565b600082821115612c6457600080fd5b60006111cc8385614044565b60008073ffffffffffffffffffffffffffffffffffffffff831615612c955782612c97565b325b905073ffffffffffffffffffffffffffffffffffffffff8416612d7657612cd63a8610612cc4573a612cc6565b855b612cd08989612bdb565b90612b9f565b60405190925073ffffffffffffffffffffffffffffffffffffffff82169083156108fc029084906000818181858888f19350505050612d71576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475330313100000000000000000000000000000000000000000000000000000060448201526064016107ad565b612df7565b612d8485612cd08989612bdb565b9150612d91848284613469565b612df7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475330313200000000000000000000000000000000000000000000000000000060448201526064016107ad565b5095945050505050565b60045415612e6b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475332303000000000000000000000000000000000000000000000000000000060448201526064016107ad565b8151811115612ed6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475332303100000000000000000000000000000000000000000000000000000060448201526064016107ad565b6001811015612f41576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475332303200000000000000000000000000000000000000000000000000000060448201526064016107ad565b600160005b8351811015613176576000848281518110612f6357612f6361405b565b60200260200101519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614158015612fc1575073ffffffffffffffffffffffffffffffffffffffff8116600114155b8015612fe3575073ffffffffffffffffffffffffffffffffffffffff81163014155b801561301b57508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b613081576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475332303300000000000000000000000000000000000000000000000000000060448201526064016107ad565b73ffffffffffffffffffffffffffffffffffffffff8181166000908152600260205260409020541615613110576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475332303400000000000000000000000000000000000000000000000000000060448201526064016107ad565b73ffffffffffffffffffffffffffffffffffffffff928316600090815260026020526040902080547fffffffffffffffffffffffff000000000000000000000000000000000000000016938216939093179092558061316e81613d72565b915050612f46565b5073ffffffffffffffffffffffffffffffffffffffff16600090815260026020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001660011790559051600355600455565b3073ffffffffffffffffffffffffffffffffffffffff82160361324d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475334303000000000000000000000000000000000000000000000000000000060448201526064016107ad565b7f6c9a6c4a39284e37ed1cf53d337577d14212a4870fb976a4366c693b939918d555565b600160008190526020527fcc69885fda6bcc1a4ace058b4a62bf5e179ea78fd58a1ccd71c22cc9b688792f5473ffffffffffffffffffffffffffffffffffffffff161561331a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475331303000000000000000000000000000000000000000000000000000000060448201526064016107ad565b6001600081905260208190527fcc69885fda6bcc1a4ace058b4a62bf5e179ea78fd58a1ccd71c22cc9b688792f80547fffffffffffffffffffffffff000000000000000000000000000000000000000016909117905573ffffffffffffffffffffffffffffffffffffffff82161561092f57813b6133f4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475330303200000000000000000000000000000000000000000000000000000060448201526064016107ad565b6134038260008360015a612bf7565b61092f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475330303000000000000000000000000000000000000000000000000000000060448201526064016107ad565b6040805173ffffffffffffffffffffffffffffffffffffffff841660248201526044808201849052825180830390910181526064909101909152602080820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001781528251600093929184919082896127105a03f13d8015613516576020811461351e5760009350613529565b819350613529565b600051158215171593505b5050509392505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461355557600080fd5b50565b803561356381613533565b919050565b6000806040838503121561357b57600080fd5b823561358681613533565b946020939093013593505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f8301126135d457600080fd5b813567ffffffffffffffff808211156135ef576135ef613594565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561363557613635613594565b8160405283815286602085880101111561364e57600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000806000806080858703121561368457600080fd5b84359350602085013567ffffffffffffffff808211156136a357600080fd5b6136af888389016135c3565b945060408701359150808211156136c557600080fd5b506136d2878288016135c3565b949793965093946060013593505050565b6000602082840312156136f557600080fd5b8135612bd481613533565b80356002811061356357600080fd5b6000806000806080858703121561372557600080fd5b843561373081613533565b935060208501359250604085013567ffffffffffffffff81111561375357600080fd5b61375f878288016135c3565b92505061376e60608601613700565b905092959194509250565b6000815180845260005b8181101561379f57602081850181015186830182015201613783565b818111156137b1576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b82151581526040602082015260006111cc6040830184613779565b6000806040838503121561381257600080fd5b50508035926020909101359150565b602081526000612bd46020830184613779565b60006020828403121561384657600080fd5b5035919050565b60008083601f84011261385f57600080fd5b50813567ffffffffffffffff81111561387757600080fd5b60208301915083602082850101111561388f57600080fd5b9250929050565b60008060008060008060008060008060006101408c8e0312156138b857600080fd5b6138c18c613558565b9a5060208c0135995067ffffffffffffffff8060408e013511156138e457600080fd5b6138f48e60408f01358f0161384d565b909a50985061390560608e01613700565b975060808d0135965060a08d0135955060c08d0135945061392860e08e01613558565b93506139376101008e01613558565b9250806101208e0135111561394b57600080fd5b5061395d8d6101208e01358e016135c3565b90509295989b509295989b9093969950565b60008060006060848603121561398457600080fd5b83359250602084013567ffffffffffffffff808211156139a357600080fd5b6139af878388016135c3565b935060408601359150808211156139c557600080fd5b506139d2868287016135c3565b9150509250925092565b600081518084526020808501945080840160005b83811015613a2257815173ffffffffffffffffffffffffffffffffffffffff16875295820195908201906001016139f0565b509495945050505050565b602081526000612bd460208301846139dc565b60008060408385031215613a5357600080fd5b8235613a5e81613533565b9150602083013567ffffffffffffffff811115613a7a57600080fd5b613a86858286016135c3565b9150509250929050565b6000806000806000806000806000806101008b8d031215613ab057600080fd5b8a3567ffffffffffffffff80821115613ac857600080fd5b818d0191508d601f830112613adc57600080fd5b813581811115613aeb57600080fd5b8e60208260051b8501011115613b0057600080fd5b60208381019d50909b508d01359950613b1b60408e01613558565b985060608d0135915080821115613b3157600080fd5b50613b3e8d828e0161384d565b9097509550613b51905060808c01613558565b9350613b5f60a08c01613558565b925060c08b01359150613b7460e08c01613558565b90509295989b9194979a5092959850565b604081526000613b9860408301856139dc565b905073ffffffffffffffffffffffffffffffffffffffff831660208301529392505050565b60008060008060008060008060008060006101408c8e031215613bdf57600080fd5b8b35613bea81613533565b9a5060208c0135995060408c013567ffffffffffffffff811115613c0d57600080fd5b613c198e828f0161384d565b909a509850613c2c905060608d01613700565b965060808c0135955060a08c0135945060c08c0135935060e08c0135613c5181613533565b92506101008c0135613c6281613533565b809250506101208c013590509295989b509295989b9093969950565b60008060408385031215613c9157600080fd5b8235613c9c81613533565b91506020830135613cac81613533565b809150509250929050565b600080600060608486031215613ccc57600080fd5b8335613cd781613533565b92506020840135613ce781613533565b91506040840135613cf781613533565b809150509250925092565b600080600060608486031215613d1757600080fd5b8335613d2281613533565b92506020840135613d3281613533565b929592945050506040919091013590565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613da357613da3613d43565b5060010190565b604081526000613dbd6040830185613779565b8281036020840152612c358185613779565b600060208284031215613de157600080fd5b81517fffffffff0000000000000000000000000000000000000000000000000000000081168114612bd457600080fd5b600060ff821660ff841680821015613e2b57613e2b613d43565b90039392505050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613e6c57613e6c613d43565b500290565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60028110613ed7577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b9052565b600061016073ffffffffffffffffffffffffffffffffffffffff8f1683528d60208401528060408401528b81840152506101808b8d828501376000818d850101527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8d01168301613f51606085018d613ea0565b8a60808501528960a08501528860c0850152613f8560e085018973ffffffffffffffffffffffffffffffffffffffff169052565b73ffffffffffffffffffffffffffffffffffffffff87166101008501528184820301610120850152613fb982820187613779565b92505050613fe061014083018473ffffffffffffffffffffffffffffffffffffffff169052565b9d9c50505050505050505050505050565b6000821982111561400457614004613d43565b500190565b60008261403f577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b60008282101561405657614056613d43565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6080808252810185905260008660a08301825b888110156140da5782356140b081613533565b73ffffffffffffffffffffffffffffffffffffffff1682526020928301929091019060010161409d565b506020840196909652505073ffffffffffffffffffffffffffffffffffffffff9283166040820152911660609091015292915050565b60006020828403121561412257600080fd5b81518015158114612bd457600080fd5b8183823760009101908152919050565b6000610160820190508c825273ffffffffffffffffffffffffffffffffffffffff808d1660208401528b60408401528a6060840152614184608084018b613ea0565b60a083019890985260c082019690965260e0810194909452918516610100840152909316610120820152610140019190915295945050505050565b6000816141ce576141ce613d43565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff019056fea164736f6c634300080f000a" + +func init() { + if err := json.Unmarshal([]byte(SafeStorageLayoutJSON), SafeStorageLayout); err != nil { + panic(err) + } + + layouts["Safe"] = SafeStorageLayout + deployedBytecodes["Safe"] = SafeDeployedBin +} diff --git a/op-bindings/bindings/safeproxyfactory.go b/op-bindings/bindings/safeproxyfactory.go new file mode 100644 index 000000000000..98f132db27a2 --- /dev/null +++ b/op-bindings/bindings/safeproxyfactory.go @@ -0,0 +1,472 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package bindings + +import ( + "errors" + "math/big" + "strings" + + ethereum "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/accounts/abi" + "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/event" +) + +// Reference imports to suppress errors if they are not otherwise used. +var ( + _ = errors.New + _ = big.NewInt + _ = strings.NewReader + _ = ethereum.NotFound + _ = bind.Bind + _ = common.Big1 + _ = types.BloomLookup + _ = event.NewSubscription +) + +// SafeProxyFactoryMetaData contains all meta data concerning the SafeProxyFactory contract. +var SafeProxyFactoryMetaData = &bind.MetaData{ + ABI: "[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"contractSafeProxy\",\"name\":\"proxy\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"singleton\",\"type\":\"address\"}],\"name\":\"ProxyCreation\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_singleton\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"initializer\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"saltNonce\",\"type\":\"uint256\"}],\"name\":\"createChainSpecificProxyWithNonce\",\"outputs\":[{\"internalType\":\"contractSafeProxy\",\"name\":\"proxy\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_singleton\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"initializer\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"saltNonce\",\"type\":\"uint256\"},{\"internalType\":\"contractIProxyCreationCallback\",\"name\":\"callback\",\"type\":\"address\"}],\"name\":\"createProxyWithCallback\",\"outputs\":[{\"internalType\":\"contractSafeProxy\",\"name\":\"proxy\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_singleton\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"initializer\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"saltNonce\",\"type\":\"uint256\"}],\"name\":\"createProxyWithNonce\",\"outputs\":[{\"internalType\":\"contractSafeProxy\",\"name\":\"proxy\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getChainId\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"proxyCreationCode\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"pure\",\"type\":\"function\"}]", + Bin: "0x608060405234801561001057600080fd5b50610913806100206000396000f3fe608060405234801561001057600080fd5b50600436106100675760003560e01c806353e5d9351161005057806353e5d935146100b7578063d18af54d146100cc578063ec9e80bb146100df57600080fd5b80631688f0b91461006c5780633408e470146100a9575b600080fd5b61007f61007a3660046105d2565b6100f2565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b6040514681526020016100a0565b6100bf610194565b6040516100a091906106a5565b61007f6100da3660046106bf565b6101dc565b61007f6100ed3660046105d2565b6102f8565b600080838051906020012083604051602001610118929190918252602082015260400190565b60405160208183030381529060405280519060200120905061013b85858361032a565b60405173ffffffffffffffffffffffffffffffffffffffff8781168252919350908316907f4f51faf6c4561ff95f067657e43439f0f856d97c04d9ec9070a6199ad418e2359060200160405180910390a2509392505050565b6060604051806020016101a6906104c6565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082820381018352601f90910116604052919050565b600080838360405160200161022092919091825260601b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016602082015260340190565b6040516020818303038152906040528051906020012060001c90506102468686836100f2565b915073ffffffffffffffffffffffffffffffffffffffff8316156102ef576040517f1e52b51800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841690631e52b518906102bc9085908a908a908a9060040161072b565b600060405180830381600087803b1580156102d657600080fd5b505af11580156102ea573d6000803e3d6000fd5b505050505b50949350505050565b60008083805190602001208361030b4690565b6040805160208101949094528301919091526060820152608001610118565b6000833b610399576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f53696e676c65746f6e20636f6e7472616374206e6f74206465706c6f7965640060448201526064015b60405180910390fd5b6000604051806020016103ab906104c6565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082820381018352601f909101166040819052610403919073ffffffffffffffffffffffffffffffffffffffff881690602001610775565b6040516020818303038152906040529050828151826020016000f5915073ffffffffffffffffffffffffffffffffffffffff821661049d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f437265617465322063616c6c206661696c6564000000000000000000000000006044820152606401610390565b8351156104be5760008060008651602088016000875af1036104be57600080fd5b509392505050565b61016f8061079883390190565b73ffffffffffffffffffffffffffffffffffffffff811681146104f557600080fd5b50565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f83011261053857600080fd5b813567ffffffffffffffff80821115610553576105536104f8565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715610599576105996104f8565b816040528381528660208588010111156105b257600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000806000606084860312156105e757600080fd5b83356105f2816104d3565b9250602084013567ffffffffffffffff81111561060e57600080fd5b61061a86828701610527565b925050604084013590509250925092565b60005b8381101561064657818101518382015260200161062e565b83811115610655576000848401525b50505050565b6000815180845261067381602086016020860161062b565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006106b8602083018461065b565b9392505050565b600080600080608085870312156106d557600080fd5b84356106e0816104d3565b9350602085013567ffffffffffffffff8111156106fc57600080fd5b61070887828801610527565b935050604085013591506060850135610720816104d3565b939692955090935050565b600073ffffffffffffffffffffffffffffffffffffffff808716835280861660208401525060806040830152610764608083018561065b565b905082606083015295945050505050565b6000835161078781846020880161062b565b919091019182525060200191905056fe608060405234801561001057600080fd5b5060405161016f38038061016f83398101604081905261002f916100b9565b6001600160a01b0381166100945760405162461bcd60e51b815260206004820152602260248201527f496e76616c69642073696e676c65746f6e20616464726573732070726f766964604482015261195960f21b606482015260840160405180910390fd5b600080546001600160a01b0319166001600160a01b03929092169190911790556100e9565b6000602082840312156100cb57600080fd5b81516001600160a01b03811681146100e257600080fd5b9392505050565b6078806100f76000396000f3fe6080604052600073ffffffffffffffffffffffffffffffffffffffff8154167fa619486e00000000000000000000000000000000000000000000000000000000823503604d57808252602082f35b3682833781823684845af490503d82833e806066573d82fd5b503d81f3fea164736f6c634300080f000aa164736f6c634300080f000a", +} + +// SafeProxyFactoryABI is the input ABI used to generate the binding from. +// Deprecated: Use SafeProxyFactoryMetaData.ABI instead. +var SafeProxyFactoryABI = SafeProxyFactoryMetaData.ABI + +// SafeProxyFactoryBin is the compiled bytecode used for deploying new contracts. +// Deprecated: Use SafeProxyFactoryMetaData.Bin instead. +var SafeProxyFactoryBin = SafeProxyFactoryMetaData.Bin + +// DeploySafeProxyFactory deploys a new Ethereum contract, binding an instance of SafeProxyFactory to it. +func DeploySafeProxyFactory(auth *bind.TransactOpts, backend bind.ContractBackend) (common.Address, *types.Transaction, *SafeProxyFactory, error) { + parsed, err := SafeProxyFactoryMetaData.GetAbi() + if err != nil { + return common.Address{}, nil, nil, err + } + if parsed == nil { + return common.Address{}, nil, nil, errors.New("GetABI returned nil") + } + + address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(SafeProxyFactoryBin), backend) + if err != nil { + return common.Address{}, nil, nil, err + } + return address, tx, &SafeProxyFactory{SafeProxyFactoryCaller: SafeProxyFactoryCaller{contract: contract}, SafeProxyFactoryTransactor: SafeProxyFactoryTransactor{contract: contract}, SafeProxyFactoryFilterer: SafeProxyFactoryFilterer{contract: contract}}, nil +} + +// SafeProxyFactory is an auto generated Go binding around an Ethereum contract. +type SafeProxyFactory struct { + SafeProxyFactoryCaller // Read-only binding to the contract + SafeProxyFactoryTransactor // Write-only binding to the contract + SafeProxyFactoryFilterer // Log filterer for contract events +} + +// SafeProxyFactoryCaller is an auto generated read-only Go binding around an Ethereum contract. +type SafeProxyFactoryCaller struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// SafeProxyFactoryTransactor is an auto generated write-only Go binding around an Ethereum contract. +type SafeProxyFactoryTransactor struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// SafeProxyFactoryFilterer is an auto generated log filtering Go binding around an Ethereum contract events. +type SafeProxyFactoryFilterer struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// SafeProxyFactorySession is an auto generated Go binding around an Ethereum contract, +// with pre-set call and transact options. +type SafeProxyFactorySession struct { + Contract *SafeProxyFactory // Generic contract binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// SafeProxyFactoryCallerSession is an auto generated read-only Go binding around an Ethereum contract, +// with pre-set call options. +type SafeProxyFactoryCallerSession struct { + Contract *SafeProxyFactoryCaller // Generic contract caller binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session +} + +// SafeProxyFactoryTransactorSession is an auto generated write-only Go binding around an Ethereum contract, +// with pre-set transact options. +type SafeProxyFactoryTransactorSession struct { + Contract *SafeProxyFactoryTransactor // Generic contract transactor binding to set the session for + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// SafeProxyFactoryRaw is an auto generated low-level Go binding around an Ethereum contract. +type SafeProxyFactoryRaw struct { + Contract *SafeProxyFactory // Generic contract binding to access the raw methods on +} + +// SafeProxyFactoryCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. +type SafeProxyFactoryCallerRaw struct { + Contract *SafeProxyFactoryCaller // Generic read-only contract binding to access the raw methods on +} + +// SafeProxyFactoryTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. +type SafeProxyFactoryTransactorRaw struct { + Contract *SafeProxyFactoryTransactor // Generic write-only contract binding to access the raw methods on +} + +// NewSafeProxyFactory creates a new instance of SafeProxyFactory, bound to a specific deployed contract. +func NewSafeProxyFactory(address common.Address, backend bind.ContractBackend) (*SafeProxyFactory, error) { + contract, err := bindSafeProxyFactory(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &SafeProxyFactory{SafeProxyFactoryCaller: SafeProxyFactoryCaller{contract: contract}, SafeProxyFactoryTransactor: SafeProxyFactoryTransactor{contract: contract}, SafeProxyFactoryFilterer: SafeProxyFactoryFilterer{contract: contract}}, nil +} + +// NewSafeProxyFactoryCaller creates a new read-only instance of SafeProxyFactory, bound to a specific deployed contract. +func NewSafeProxyFactoryCaller(address common.Address, caller bind.ContractCaller) (*SafeProxyFactoryCaller, error) { + contract, err := bindSafeProxyFactory(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &SafeProxyFactoryCaller{contract: contract}, nil +} + +// NewSafeProxyFactoryTransactor creates a new write-only instance of SafeProxyFactory, bound to a specific deployed contract. +func NewSafeProxyFactoryTransactor(address common.Address, transactor bind.ContractTransactor) (*SafeProxyFactoryTransactor, error) { + contract, err := bindSafeProxyFactory(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &SafeProxyFactoryTransactor{contract: contract}, nil +} + +// NewSafeProxyFactoryFilterer creates a new log filterer instance of SafeProxyFactory, bound to a specific deployed contract. +func NewSafeProxyFactoryFilterer(address common.Address, filterer bind.ContractFilterer) (*SafeProxyFactoryFilterer, error) { + contract, err := bindSafeProxyFactory(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &SafeProxyFactoryFilterer{contract: contract}, nil +} + +// bindSafeProxyFactory binds a generic wrapper to an already deployed contract. +func bindSafeProxyFactory(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := abi.JSON(strings.NewReader(SafeProxyFactoryABI)) + if err != nil { + return nil, err + } + return bind.NewBoundContract(address, parsed, caller, transactor, filterer), nil +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_SafeProxyFactory *SafeProxyFactoryRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _SafeProxyFactory.Contract.SafeProxyFactoryCaller.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_SafeProxyFactory *SafeProxyFactoryRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _SafeProxyFactory.Contract.SafeProxyFactoryTransactor.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_SafeProxyFactory *SafeProxyFactoryRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _SafeProxyFactory.Contract.SafeProxyFactoryTransactor.contract.Transact(opts, method, params...) +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_SafeProxyFactory *SafeProxyFactoryCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _SafeProxyFactory.Contract.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_SafeProxyFactory *SafeProxyFactoryTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _SafeProxyFactory.Contract.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_SafeProxyFactory *SafeProxyFactoryTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _SafeProxyFactory.Contract.contract.Transact(opts, method, params...) +} + +// GetChainId is a free data retrieval call binding the contract method 0x3408e470. +// +// Solidity: function getChainId() view returns(uint256) +func (_SafeProxyFactory *SafeProxyFactoryCaller) GetChainId(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _SafeProxyFactory.contract.Call(opts, &out, "getChainId") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// GetChainId is a free data retrieval call binding the contract method 0x3408e470. +// +// Solidity: function getChainId() view returns(uint256) +func (_SafeProxyFactory *SafeProxyFactorySession) GetChainId() (*big.Int, error) { + return _SafeProxyFactory.Contract.GetChainId(&_SafeProxyFactory.CallOpts) +} + +// GetChainId is a free data retrieval call binding the contract method 0x3408e470. +// +// Solidity: function getChainId() view returns(uint256) +func (_SafeProxyFactory *SafeProxyFactoryCallerSession) GetChainId() (*big.Int, error) { + return _SafeProxyFactory.Contract.GetChainId(&_SafeProxyFactory.CallOpts) +} + +// ProxyCreationCode is a free data retrieval call binding the contract method 0x53e5d935. +// +// Solidity: function proxyCreationCode() pure returns(bytes) +func (_SafeProxyFactory *SafeProxyFactoryCaller) ProxyCreationCode(opts *bind.CallOpts) ([]byte, error) { + var out []interface{} + err := _SafeProxyFactory.contract.Call(opts, &out, "proxyCreationCode") + + if err != nil { + return *new([]byte), err + } + + out0 := *abi.ConvertType(out[0], new([]byte)).(*[]byte) + + return out0, err + +} + +// ProxyCreationCode is a free data retrieval call binding the contract method 0x53e5d935. +// +// Solidity: function proxyCreationCode() pure returns(bytes) +func (_SafeProxyFactory *SafeProxyFactorySession) ProxyCreationCode() ([]byte, error) { + return _SafeProxyFactory.Contract.ProxyCreationCode(&_SafeProxyFactory.CallOpts) +} + +// ProxyCreationCode is a free data retrieval call binding the contract method 0x53e5d935. +// +// Solidity: function proxyCreationCode() pure returns(bytes) +func (_SafeProxyFactory *SafeProxyFactoryCallerSession) ProxyCreationCode() ([]byte, error) { + return _SafeProxyFactory.Contract.ProxyCreationCode(&_SafeProxyFactory.CallOpts) +} + +// CreateChainSpecificProxyWithNonce is a paid mutator transaction binding the contract method 0xec9e80bb. +// +// Solidity: function createChainSpecificProxyWithNonce(address _singleton, bytes initializer, uint256 saltNonce) returns(address proxy) +func (_SafeProxyFactory *SafeProxyFactoryTransactor) CreateChainSpecificProxyWithNonce(opts *bind.TransactOpts, _singleton common.Address, initializer []byte, saltNonce *big.Int) (*types.Transaction, error) { + return _SafeProxyFactory.contract.Transact(opts, "createChainSpecificProxyWithNonce", _singleton, initializer, saltNonce) +} + +// CreateChainSpecificProxyWithNonce is a paid mutator transaction binding the contract method 0xec9e80bb. +// +// Solidity: function createChainSpecificProxyWithNonce(address _singleton, bytes initializer, uint256 saltNonce) returns(address proxy) +func (_SafeProxyFactory *SafeProxyFactorySession) CreateChainSpecificProxyWithNonce(_singleton common.Address, initializer []byte, saltNonce *big.Int) (*types.Transaction, error) { + return _SafeProxyFactory.Contract.CreateChainSpecificProxyWithNonce(&_SafeProxyFactory.TransactOpts, _singleton, initializer, saltNonce) +} + +// CreateChainSpecificProxyWithNonce is a paid mutator transaction binding the contract method 0xec9e80bb. +// +// Solidity: function createChainSpecificProxyWithNonce(address _singleton, bytes initializer, uint256 saltNonce) returns(address proxy) +func (_SafeProxyFactory *SafeProxyFactoryTransactorSession) CreateChainSpecificProxyWithNonce(_singleton common.Address, initializer []byte, saltNonce *big.Int) (*types.Transaction, error) { + return _SafeProxyFactory.Contract.CreateChainSpecificProxyWithNonce(&_SafeProxyFactory.TransactOpts, _singleton, initializer, saltNonce) +} + +// CreateProxyWithCallback is a paid mutator transaction binding the contract method 0xd18af54d. +// +// Solidity: function createProxyWithCallback(address _singleton, bytes initializer, uint256 saltNonce, address callback) returns(address proxy) +func (_SafeProxyFactory *SafeProxyFactoryTransactor) CreateProxyWithCallback(opts *bind.TransactOpts, _singleton common.Address, initializer []byte, saltNonce *big.Int, callback common.Address) (*types.Transaction, error) { + return _SafeProxyFactory.contract.Transact(opts, "createProxyWithCallback", _singleton, initializer, saltNonce, callback) +} + +// CreateProxyWithCallback is a paid mutator transaction binding the contract method 0xd18af54d. +// +// Solidity: function createProxyWithCallback(address _singleton, bytes initializer, uint256 saltNonce, address callback) returns(address proxy) +func (_SafeProxyFactory *SafeProxyFactorySession) CreateProxyWithCallback(_singleton common.Address, initializer []byte, saltNonce *big.Int, callback common.Address) (*types.Transaction, error) { + return _SafeProxyFactory.Contract.CreateProxyWithCallback(&_SafeProxyFactory.TransactOpts, _singleton, initializer, saltNonce, callback) +} + +// CreateProxyWithCallback is a paid mutator transaction binding the contract method 0xd18af54d. +// +// Solidity: function createProxyWithCallback(address _singleton, bytes initializer, uint256 saltNonce, address callback) returns(address proxy) +func (_SafeProxyFactory *SafeProxyFactoryTransactorSession) CreateProxyWithCallback(_singleton common.Address, initializer []byte, saltNonce *big.Int, callback common.Address) (*types.Transaction, error) { + return _SafeProxyFactory.Contract.CreateProxyWithCallback(&_SafeProxyFactory.TransactOpts, _singleton, initializer, saltNonce, callback) +} + +// CreateProxyWithNonce is a paid mutator transaction binding the contract method 0x1688f0b9. +// +// Solidity: function createProxyWithNonce(address _singleton, bytes initializer, uint256 saltNonce) returns(address proxy) +func (_SafeProxyFactory *SafeProxyFactoryTransactor) CreateProxyWithNonce(opts *bind.TransactOpts, _singleton common.Address, initializer []byte, saltNonce *big.Int) (*types.Transaction, error) { + return _SafeProxyFactory.contract.Transact(opts, "createProxyWithNonce", _singleton, initializer, saltNonce) +} + +// CreateProxyWithNonce is a paid mutator transaction binding the contract method 0x1688f0b9. +// +// Solidity: function createProxyWithNonce(address _singleton, bytes initializer, uint256 saltNonce) returns(address proxy) +func (_SafeProxyFactory *SafeProxyFactorySession) CreateProxyWithNonce(_singleton common.Address, initializer []byte, saltNonce *big.Int) (*types.Transaction, error) { + return _SafeProxyFactory.Contract.CreateProxyWithNonce(&_SafeProxyFactory.TransactOpts, _singleton, initializer, saltNonce) +} + +// CreateProxyWithNonce is a paid mutator transaction binding the contract method 0x1688f0b9. +// +// Solidity: function createProxyWithNonce(address _singleton, bytes initializer, uint256 saltNonce) returns(address proxy) +func (_SafeProxyFactory *SafeProxyFactoryTransactorSession) CreateProxyWithNonce(_singleton common.Address, initializer []byte, saltNonce *big.Int) (*types.Transaction, error) { + return _SafeProxyFactory.Contract.CreateProxyWithNonce(&_SafeProxyFactory.TransactOpts, _singleton, initializer, saltNonce) +} + +// SafeProxyFactoryProxyCreationIterator is returned from FilterProxyCreation and is used to iterate over the raw logs and unpacked data for ProxyCreation events raised by the SafeProxyFactory contract. +type SafeProxyFactoryProxyCreationIterator struct { + Event *SafeProxyFactoryProxyCreation // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *SafeProxyFactoryProxyCreationIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(SafeProxyFactoryProxyCreation) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(SafeProxyFactoryProxyCreation) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *SafeProxyFactoryProxyCreationIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *SafeProxyFactoryProxyCreationIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// SafeProxyFactoryProxyCreation represents a ProxyCreation event raised by the SafeProxyFactory contract. +type SafeProxyFactoryProxyCreation struct { + Proxy common.Address + Singleton common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterProxyCreation is a free log retrieval operation binding the contract event 0x4f51faf6c4561ff95f067657e43439f0f856d97c04d9ec9070a6199ad418e235. +// +// Solidity: event ProxyCreation(address indexed proxy, address singleton) +func (_SafeProxyFactory *SafeProxyFactoryFilterer) FilterProxyCreation(opts *bind.FilterOpts, proxy []common.Address) (*SafeProxyFactoryProxyCreationIterator, error) { + + var proxyRule []interface{} + for _, proxyItem := range proxy { + proxyRule = append(proxyRule, proxyItem) + } + + logs, sub, err := _SafeProxyFactory.contract.FilterLogs(opts, "ProxyCreation", proxyRule) + if err != nil { + return nil, err + } + return &SafeProxyFactoryProxyCreationIterator{contract: _SafeProxyFactory.contract, event: "ProxyCreation", logs: logs, sub: sub}, nil +} + +// WatchProxyCreation is a free log subscription operation binding the contract event 0x4f51faf6c4561ff95f067657e43439f0f856d97c04d9ec9070a6199ad418e235. +// +// Solidity: event ProxyCreation(address indexed proxy, address singleton) +func (_SafeProxyFactory *SafeProxyFactoryFilterer) WatchProxyCreation(opts *bind.WatchOpts, sink chan<- *SafeProxyFactoryProxyCreation, proxy []common.Address) (event.Subscription, error) { + + var proxyRule []interface{} + for _, proxyItem := range proxy { + proxyRule = append(proxyRule, proxyItem) + } + + logs, sub, err := _SafeProxyFactory.contract.WatchLogs(opts, "ProxyCreation", proxyRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(SafeProxyFactoryProxyCreation) + if err := _SafeProxyFactory.contract.UnpackLog(event, "ProxyCreation", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseProxyCreation is a log parse operation binding the contract event 0x4f51faf6c4561ff95f067657e43439f0f856d97c04d9ec9070a6199ad418e235. +// +// Solidity: event ProxyCreation(address indexed proxy, address singleton) +func (_SafeProxyFactory *SafeProxyFactoryFilterer) ParseProxyCreation(log types.Log) (*SafeProxyFactoryProxyCreation, error) { + event := new(SafeProxyFactoryProxyCreation) + if err := _SafeProxyFactory.contract.UnpackLog(event, "ProxyCreation", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} diff --git a/op-bindings/bindings/safeproxyfactory_more.go b/op-bindings/bindings/safeproxyfactory_more.go new file mode 100644 index 000000000000..dbc455aa9f72 --- /dev/null +++ b/op-bindings/bindings/safeproxyfactory_more.go @@ -0,0 +1,25 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package bindings + +import ( + "encoding/json" + + "github.com/ethereum-optimism/optimism/op-bindings/solc" +) + +const SafeProxyFactoryStorageLayoutJSON = "{\"storage\":null,\"types\":{}}" + +var SafeProxyFactoryStorageLayout = new(solc.StorageLayout) + +var SafeProxyFactoryDeployedBin = "0x608060405234801561001057600080fd5b50600436106100675760003560e01c806353e5d9351161005057806353e5d935146100b7578063d18af54d146100cc578063ec9e80bb146100df57600080fd5b80631688f0b91461006c5780633408e470146100a9575b600080fd5b61007f61007a3660046105d2565b6100f2565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b6040514681526020016100a0565b6100bf610194565b6040516100a091906106a5565b61007f6100da3660046106bf565b6101dc565b61007f6100ed3660046105d2565b6102f8565b600080838051906020012083604051602001610118929190918252602082015260400190565b60405160208183030381529060405280519060200120905061013b85858361032a565b60405173ffffffffffffffffffffffffffffffffffffffff8781168252919350908316907f4f51faf6c4561ff95f067657e43439f0f856d97c04d9ec9070a6199ad418e2359060200160405180910390a2509392505050565b6060604051806020016101a6906104c6565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082820381018352601f90910116604052919050565b600080838360405160200161022092919091825260601b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016602082015260340190565b6040516020818303038152906040528051906020012060001c90506102468686836100f2565b915073ffffffffffffffffffffffffffffffffffffffff8316156102ef576040517f1e52b51800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841690631e52b518906102bc9085908a908a908a9060040161072b565b600060405180830381600087803b1580156102d657600080fd5b505af11580156102ea573d6000803e3d6000fd5b505050505b50949350505050565b60008083805190602001208361030b4690565b6040805160208101949094528301919091526060820152608001610118565b6000833b610399576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f53696e676c65746f6e20636f6e7472616374206e6f74206465706c6f7965640060448201526064015b60405180910390fd5b6000604051806020016103ab906104c6565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082820381018352601f909101166040819052610403919073ffffffffffffffffffffffffffffffffffffffff881690602001610775565b6040516020818303038152906040529050828151826020016000f5915073ffffffffffffffffffffffffffffffffffffffff821661049d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f437265617465322063616c6c206661696c6564000000000000000000000000006044820152606401610390565b8351156104be5760008060008651602088016000875af1036104be57600080fd5b509392505050565b61016f8061079883390190565b73ffffffffffffffffffffffffffffffffffffffff811681146104f557600080fd5b50565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f83011261053857600080fd5b813567ffffffffffffffff80821115610553576105536104f8565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715610599576105996104f8565b816040528381528660208588010111156105b257600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000806000606084860312156105e757600080fd5b83356105f2816104d3565b9250602084013567ffffffffffffffff81111561060e57600080fd5b61061a86828701610527565b925050604084013590509250925092565b60005b8381101561064657818101518382015260200161062e565b83811115610655576000848401525b50505050565b6000815180845261067381602086016020860161062b565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006106b8602083018461065b565b9392505050565b600080600080608085870312156106d557600080fd5b84356106e0816104d3565b9350602085013567ffffffffffffffff8111156106fc57600080fd5b61070887828801610527565b935050604085013591506060850135610720816104d3565b939692955090935050565b600073ffffffffffffffffffffffffffffffffffffffff808716835280861660208401525060806040830152610764608083018561065b565b905082606083015295945050505050565b6000835161078781846020880161062b565b919091019182525060200191905056fe608060405234801561001057600080fd5b5060405161016f38038061016f83398101604081905261002f916100b9565b6001600160a01b0381166100945760405162461bcd60e51b815260206004820152602260248201527f496e76616c69642073696e676c65746f6e20616464726573732070726f766964604482015261195960f21b606482015260840160405180910390fd5b600080546001600160a01b0319166001600160a01b03929092169190911790556100e9565b6000602082840312156100cb57600080fd5b81516001600160a01b03811681146100e257600080fd5b9392505050565b6078806100f76000396000f3fe6080604052600073ffffffffffffffffffffffffffffffffffffffff8154167fa619486e00000000000000000000000000000000000000000000000000000000823503604d57808252602082f35b3682833781823684845af490503d82833e806066573d82fd5b503d81f3fea164736f6c634300080f000aa164736f6c634300080f000a" + +func init() { + if err := json.Unmarshal([]byte(SafeProxyFactoryStorageLayoutJSON), SafeProxyFactoryStorageLayout); err != nil { + panic(err) + } + + layouts["SafeProxyFactory"] = SafeProxyFactoryStorageLayout + deployedBytecodes["SafeProxyFactory"] = SafeProxyFactoryDeployedBin +} diff --git a/op-bindings/bindings/weth9.go b/op-bindings/bindings/weth9.go index c174d3a0a0b9..587e8bec5f5c 100644 --- a/op-bindings/bindings/weth9.go +++ b/op-bindings/bindings/weth9.go @@ -31,7 +31,7 @@ var ( // WETH9MetaData contains all meta data concerning the WETH9 contract. var WETH9MetaData = &bind.MetaData{ ABI: "[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"src\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"guy\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"wad\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"dst\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"wad\",\"type\":\"uint256\"}],\"name\":\"Deposit\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"src\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"dst\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"wad\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"src\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"wad\",\"type\":\"uint256\"}],\"name\":\"Withdrawal\",\"type\":\"event\"},{\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"fallback\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"address\",\"name\":\"guy\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"wad\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"deposit\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"address\",\"name\":\"dst\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"wad\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"address\",\"name\":\"src\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"dst\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"wad\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"wad\",\"type\":\"uint256\"}],\"name\":\"withdraw\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", - Bin: "0x60c0604052600d60808190526c2bb930b83832b21022ba3432b960991b60a090815261002e916000919061007a565b50604080518082019091526004808252630ae8aa8960e31b602090920191825261005a9160019161007a565b506002805460ff1916601217905534801561007457600080fd5b50610115565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106100bb57805160ff19168380011785556100e8565b828001600101855582156100e8579182015b828111156100e85782518255916020019190600101906100cd565b506100f49291506100f8565b5090565b61011291905b808211156100f457600081556001016100fe565b90565b6107f9806101246000396000f3fe6080604052600436106100bc5760003560e01c8063313ce56711610074578063a9059cbb1161004e578063a9059cbb146102cb578063d0e30db0146100bc578063dd62ed3e14610311576100bc565b8063313ce5671461024b57806370a082311461027657806395d89b41146102b6576100bc565b806318160ddd116100a557806318160ddd146101aa57806323b872dd146101d15780632e1a7d4d14610221576100bc565b806306fdde03146100c6578063095ea7b314610150575b6100c4610359565b005b3480156100d257600080fd5b506100db6103a8565b6040805160208082528351818301528351919283929083019185019080838360005b838110156101155781810151838201526020016100fd565b50505050905090810190601f1680156101425780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561015c57600080fd5b506101966004803603604081101561017357600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135610454565b604080519115158252519081900360200190f35b3480156101b657600080fd5b506101bf6104c7565b60408051918252519081900360200190f35b3480156101dd57600080fd5b50610196600480360360608110156101f457600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135811691602081013590911690604001356104cb565b34801561022d57600080fd5b506100c46004803603602081101561024457600080fd5b503561066b565b34801561025757600080fd5b50610260610700565b6040805160ff9092168252519081900360200190f35b34801561028257600080fd5b506101bf6004803603602081101561029957600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610709565b3480156102c257600080fd5b506100db61071b565b3480156102d757600080fd5b50610196600480360360408110156102ee57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135610793565b34801561031d57600080fd5b506101bf6004803603604081101561033457600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813581169160200135166107a7565b33600081815260036020908152604091829020805434908101909155825190815291517fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c9281900390910190a2565b6000805460408051602060026001851615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190941693909304601f8101849004840282018401909252818152929183018282801561044c5780601f106104215761010080835404028352916020019161044c565b820191906000526020600020905b81548152906001019060200180831161042f57829003601f168201915b505050505081565b33600081815260046020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716808552908352818420869055815186815291519394909390927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925928290030190a350600192915050565b4790565b73ffffffffffffffffffffffffffffffffffffffff83166000908152600360205260408120548211156104fd57600080fd5b73ffffffffffffffffffffffffffffffffffffffff84163314801590610573575073ffffffffffffffffffffffffffffffffffffffff841660009081526004602090815260408083203384529091529020547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff14155b156105ed5773ffffffffffffffffffffffffffffffffffffffff841660009081526004602090815260408083203384529091529020548211156105b557600080fd5b73ffffffffffffffffffffffffffffffffffffffff841660009081526004602090815260408083203384529091529020805483900390555b73ffffffffffffffffffffffffffffffffffffffff808516600081815260036020908152604080832080548890039055938716808352918490208054870190558351868152935191937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef929081900390910190a35060019392505050565b3360009081526003602052604090205481111561068757600080fd5b33600081815260036020526040808220805485900390555183156108fc0291849190818181858888f193505050501580156106c6573d6000803e3d6000fd5b5060408051828152905133917f7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b65919081900360200190a250565b60025460ff1681565b60036020526000908152604090205481565b60018054604080516020600284861615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190941693909304601f8101849004840282018401909252818152929183018282801561044c5780601f106104215761010080835404028352916020019161044c565b60006107a03384846104cb565b9392505050565b60046020908152600092835260408084209091529082529020548156fea265627a7a7231582067ace7518c12acba9306ac90d5b712c789ea3d50860ef4996a20921a3c1e61f764736f6c63430005110032", + Bin: "0x60c0604052600d60808190526c2bb930b83832b21022ba3432b960991b60a090815261002e916000919061007a565b50604080518082019091526004808252630ae8aa8960e31b602090920191825261005a9160019161007a565b506002805460ff1916601217905534801561007457600080fd5b50610115565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106100bb57805160ff19168380011785556100e8565b828001600101855582156100e8579182015b828111156100e85782518255916020019190600101906100cd565b506100f49291506100f8565b5090565b61011291905b808211156100f457600081556001016100fe565b90565b6107f9806101246000396000f3fe6080604052600436106100bc5760003560e01c8063313ce56711610074578063a9059cbb1161004e578063a9059cbb146102cb578063d0e30db0146100bc578063dd62ed3e14610311576100bc565b8063313ce5671461024b57806370a082311461027657806395d89b41146102b6576100bc565b806318160ddd116100a557806318160ddd146101aa57806323b872dd146101d15780632e1a7d4d14610221576100bc565b806306fdde03146100c6578063095ea7b314610150575b6100c4610359565b005b3480156100d257600080fd5b506100db6103a8565b6040805160208082528351818301528351919283929083019185019080838360005b838110156101155781810151838201526020016100fd565b50505050905090810190601f1680156101425780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561015c57600080fd5b506101966004803603604081101561017357600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135610454565b604080519115158252519081900360200190f35b3480156101b657600080fd5b506101bf6104c7565b60408051918252519081900360200190f35b3480156101dd57600080fd5b50610196600480360360608110156101f457600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135811691602081013590911690604001356104cb565b34801561022d57600080fd5b506100c46004803603602081101561024457600080fd5b503561066b565b34801561025757600080fd5b50610260610700565b6040805160ff9092168252519081900360200190f35b34801561028257600080fd5b506101bf6004803603602081101561029957600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610709565b3480156102c257600080fd5b506100db61071b565b3480156102d757600080fd5b50610196600480360360408110156102ee57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135610793565b34801561031d57600080fd5b506101bf6004803603604081101561033457600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813581169160200135166107a7565b33600081815260036020908152604091829020805434908101909155825190815291517fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c9281900390910190a2565b6000805460408051602060026001851615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190941693909304601f8101849004840282018401909252818152929183018282801561044c5780601f106104215761010080835404028352916020019161044c565b820191906000526020600020905b81548152906001019060200180831161042f57829003601f168201915b505050505081565b33600081815260046020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716808552908352818420869055815186815291519394909390927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925928290030190a350600192915050565b4790565b73ffffffffffffffffffffffffffffffffffffffff83166000908152600360205260408120548211156104fd57600080fd5b73ffffffffffffffffffffffffffffffffffffffff84163314801590610573575073ffffffffffffffffffffffffffffffffffffffff841660009081526004602090815260408083203384529091529020547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff14155b156105ed5773ffffffffffffffffffffffffffffffffffffffff841660009081526004602090815260408083203384529091529020548211156105b557600080fd5b73ffffffffffffffffffffffffffffffffffffffff841660009081526004602090815260408083203384529091529020805483900390555b73ffffffffffffffffffffffffffffffffffffffff808516600081815260036020908152604080832080548890039055938716808352918490208054870190558351868152935191937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef929081900390910190a35060019392505050565b3360009081526003602052604090205481111561068757600080fd5b33600081815260036020526040808220805485900390555183156108fc0291849190818181858888f193505050501580156106c6573d6000803e3d6000fd5b5060408051828152905133917f7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b65919081900360200190a250565b60025460ff1681565b60036020526000908152604090205481565b60018054604080516020600284861615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190941693909304601f8101849004840282018401909252818152929183018282801561044c5780601f106104215761010080835404028352916020019161044c565b60006107a03384846104cb565b9392505050565b60046020908152600092835260408084209091529082529020548156fea265627a7a723158203b5b5adf37f507cc9ca5ac0b72acf7873b794171cc0eeb888a5f850e69fe540d64736f6c63430005110032", } // WETH9ABI is the input ABI used to generate the binding from. diff --git a/op-bindings/bindings/weth9_more.go b/op-bindings/bindings/weth9_more.go index 40f30ca5a65e..7530f273d76b 100644 --- a/op-bindings/bindings/weth9_more.go +++ b/op-bindings/bindings/weth9_more.go @@ -13,7 +13,7 @@ const WETH9StorageLayoutJSON = "{\"storage\":[{\"astId\":1000,\"contract\":\"src var WETH9StorageLayout = new(solc.StorageLayout) -var WETH9DeployedBin = "0x6080604052600436106100bc5760003560e01c8063313ce56711610074578063a9059cbb1161004e578063a9059cbb146102cb578063d0e30db0146100bc578063dd62ed3e14610311576100bc565b8063313ce5671461024b57806370a082311461027657806395d89b41146102b6576100bc565b806318160ddd116100a557806318160ddd146101aa57806323b872dd146101d15780632e1a7d4d14610221576100bc565b806306fdde03146100c6578063095ea7b314610150575b6100c4610359565b005b3480156100d257600080fd5b506100db6103a8565b6040805160208082528351818301528351919283929083019185019080838360005b838110156101155781810151838201526020016100fd565b50505050905090810190601f1680156101425780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561015c57600080fd5b506101966004803603604081101561017357600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135610454565b604080519115158252519081900360200190f35b3480156101b657600080fd5b506101bf6104c7565b60408051918252519081900360200190f35b3480156101dd57600080fd5b50610196600480360360608110156101f457600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135811691602081013590911690604001356104cb565b34801561022d57600080fd5b506100c46004803603602081101561024457600080fd5b503561066b565b34801561025757600080fd5b50610260610700565b6040805160ff9092168252519081900360200190f35b34801561028257600080fd5b506101bf6004803603602081101561029957600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610709565b3480156102c257600080fd5b506100db61071b565b3480156102d757600080fd5b50610196600480360360408110156102ee57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135610793565b34801561031d57600080fd5b506101bf6004803603604081101561033457600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813581169160200135166107a7565b33600081815260036020908152604091829020805434908101909155825190815291517fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c9281900390910190a2565b6000805460408051602060026001851615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190941693909304601f8101849004840282018401909252818152929183018282801561044c5780601f106104215761010080835404028352916020019161044c565b820191906000526020600020905b81548152906001019060200180831161042f57829003601f168201915b505050505081565b33600081815260046020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716808552908352818420869055815186815291519394909390927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925928290030190a350600192915050565b4790565b73ffffffffffffffffffffffffffffffffffffffff83166000908152600360205260408120548211156104fd57600080fd5b73ffffffffffffffffffffffffffffffffffffffff84163314801590610573575073ffffffffffffffffffffffffffffffffffffffff841660009081526004602090815260408083203384529091529020547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff14155b156105ed5773ffffffffffffffffffffffffffffffffffffffff841660009081526004602090815260408083203384529091529020548211156105b557600080fd5b73ffffffffffffffffffffffffffffffffffffffff841660009081526004602090815260408083203384529091529020805483900390555b73ffffffffffffffffffffffffffffffffffffffff808516600081815260036020908152604080832080548890039055938716808352918490208054870190558351868152935191937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef929081900390910190a35060019392505050565b3360009081526003602052604090205481111561068757600080fd5b33600081815260036020526040808220805485900390555183156108fc0291849190818181858888f193505050501580156106c6573d6000803e3d6000fd5b5060408051828152905133917f7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b65919081900360200190a250565b60025460ff1681565b60036020526000908152604090205481565b60018054604080516020600284861615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190941693909304601f8101849004840282018401909252818152929183018282801561044c5780601f106104215761010080835404028352916020019161044c565b60006107a03384846104cb565b9392505050565b60046020908152600092835260408084209091529082529020548156fea265627a7a7231582067ace7518c12acba9306ac90d5b712c789ea3d50860ef4996a20921a3c1e61f764736f6c63430005110032" +var WETH9DeployedBin = "0x6080604052600436106100bc5760003560e01c8063313ce56711610074578063a9059cbb1161004e578063a9059cbb146102cb578063d0e30db0146100bc578063dd62ed3e14610311576100bc565b8063313ce5671461024b57806370a082311461027657806395d89b41146102b6576100bc565b806318160ddd116100a557806318160ddd146101aa57806323b872dd146101d15780632e1a7d4d14610221576100bc565b806306fdde03146100c6578063095ea7b314610150575b6100c4610359565b005b3480156100d257600080fd5b506100db6103a8565b6040805160208082528351818301528351919283929083019185019080838360005b838110156101155781810151838201526020016100fd565b50505050905090810190601f1680156101425780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561015c57600080fd5b506101966004803603604081101561017357600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135610454565b604080519115158252519081900360200190f35b3480156101b657600080fd5b506101bf6104c7565b60408051918252519081900360200190f35b3480156101dd57600080fd5b50610196600480360360608110156101f457600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135811691602081013590911690604001356104cb565b34801561022d57600080fd5b506100c46004803603602081101561024457600080fd5b503561066b565b34801561025757600080fd5b50610260610700565b6040805160ff9092168252519081900360200190f35b34801561028257600080fd5b506101bf6004803603602081101561029957600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610709565b3480156102c257600080fd5b506100db61071b565b3480156102d757600080fd5b50610196600480360360408110156102ee57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135610793565b34801561031d57600080fd5b506101bf6004803603604081101561033457600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813581169160200135166107a7565b33600081815260036020908152604091829020805434908101909155825190815291517fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c9281900390910190a2565b6000805460408051602060026001851615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190941693909304601f8101849004840282018401909252818152929183018282801561044c5780601f106104215761010080835404028352916020019161044c565b820191906000526020600020905b81548152906001019060200180831161042f57829003601f168201915b505050505081565b33600081815260046020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716808552908352818420869055815186815291519394909390927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925928290030190a350600192915050565b4790565b73ffffffffffffffffffffffffffffffffffffffff83166000908152600360205260408120548211156104fd57600080fd5b73ffffffffffffffffffffffffffffffffffffffff84163314801590610573575073ffffffffffffffffffffffffffffffffffffffff841660009081526004602090815260408083203384529091529020547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff14155b156105ed5773ffffffffffffffffffffffffffffffffffffffff841660009081526004602090815260408083203384529091529020548211156105b557600080fd5b73ffffffffffffffffffffffffffffffffffffffff841660009081526004602090815260408083203384529091529020805483900390555b73ffffffffffffffffffffffffffffffffffffffff808516600081815260036020908152604080832080548890039055938716808352918490208054870190558351868152935191937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef929081900390910190a35060019392505050565b3360009081526003602052604090205481111561068757600080fd5b33600081815260036020526040808220805485900390555183156108fc0291849190818181858888f193505050501580156106c6573d6000803e3d6000fd5b5060408051828152905133917f7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b65919081900360200190a250565b60025460ff1681565b60036020526000908152604090205481565b60018054604080516020600284861615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190941693909304601f8101849004840282018401909252818152929183018282801561044c5780601f106104215761010080835404028352916020019161044c565b60006107a03384846104cb565b9392505050565b60046020908152600092835260408084209091529082529020548156fea265627a7a723158203b5b5adf37f507cc9ca5ac0b72acf7873b794171cc0eeb888a5f850e69fe540d64736f6c63430005110032" func init() { if err := json.Unmarshal([]byte(WETH9StorageLayoutJSON), WETH9StorageLayout); err != nil { diff --git a/packages/contracts-bedrock/scripts/Deploy.s.sol b/packages/contracts-bedrock/scripts/Deploy.s.sol index 428f97c994f4..723068c7cf7c 100644 --- a/packages/contracts-bedrock/scripts/Deploy.s.sol +++ b/packages/contracts-bedrock/scripts/Deploy.s.sol @@ -9,6 +9,8 @@ import { stdJson } from "forge-std/StdJson.sol"; import { Deployer } from "./Deployer.sol"; import { DeployConfig } from "./DeployConfig.s.sol"; +import { Safe } from "safe-contracts/Safe.sol"; +import { SafeProxyFactory } from "safe-contracts/proxies/SafeProxyFactory.sol"; import { ProxyAdmin } from "src/universal/ProxyAdmin.sol"; import { AddressManager } from "src/legacy/AddressManager.sol"; import { Proxy } from "src/universal/Proxy.sol"; From 32be46a585f801afa9bd7b223fe9f10b5cc31d55 Mon Sep 17 00:00:00 2001 From: Maurelian Date: Mon, 18 Sep 2023 16:09:48 -0400 Subject: [PATCH 31/87] ci: Update semgrepignore The trailing '/' is consistent with other directories --- .semgrepignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.semgrepignore b/.semgrepignore index 7cbea82ff45f..ae209efea25d 100644 --- a/.semgrepignore +++ b/.semgrepignore @@ -18,7 +18,7 @@ tests/ # Semgrep-action log folder .semgrep_logs/ -op-bindings/bindings +op-bindings/bindings/ packages/*/node_modules packages/*/test From 2c7cfb80335a7d0a54d3beb12a5c6aff7bc1352c Mon Sep 17 00:00:00 2001 From: Maurelian Date: Wed, 6 Sep 2023 14:36:48 -0400 Subject: [PATCH 32/87] feat(ctb): DelayedVetoable as a simple forwarder Adds a very minimal DelayedVetoable, along with tests for the _handleCall function. feat(ctb): Add actor to invariant tests feat(ctb): Simplify by reducing the amount of assembly used. feat(ctb): remove invariant tests These tests have proven complex to write due to the transparent proxy pattern. I believe that the fuzz testing is sufficient for now. --- packages/contracts-bedrock/.gas-snapshot | 1 + .../src/universal/DelayedVetoable.sol | 45 +++++++++++++++++++ .../test/DelayedVetoable.t.sol | 42 +++++++++++++++++ 3 files changed, 88 insertions(+) create mode 100644 packages/contracts-bedrock/src/universal/DelayedVetoable.sol create mode 100644 packages/contracts-bedrock/test/DelayedVetoable.t.sol diff --git a/packages/contracts-bedrock/.gas-snapshot b/packages/contracts-bedrock/.gas-snapshot index d00302c1e96b..5ab9f6a14963 100644 --- a/packages/contracts-bedrock/.gas-snapshot +++ b/packages/contracts-bedrock/.gas-snapshot @@ -46,6 +46,7 @@ CrossDomainOwnable3_Test:test_transferOwnership_zeroAddress_reverts() (gas: 1208 CrossDomainOwnableThroughPortal_Test:test_depositTransaction_crossDomainOwner_succeeds() (gas: 81417) CrossDomainOwnable_Test:test_onlyOwner_notOwner_reverts() (gas: 10597) CrossDomainOwnable_Test:test_onlyOwner_succeeds() (gas: 34883) +DelayedVetoable_HandleCall_TestFail:test_handleCall_reverts() (gas: 24969) DeleteOutput:test_script_succeeds() (gas: 3100) DeployerWhitelist_Test:test_owner_succeeds() (gas: 7582) DeployerWhitelist_Test:test_storageSlots_succeeds() (gas: 33395) diff --git a/packages/contracts-bedrock/src/universal/DelayedVetoable.sol b/packages/contracts-bedrock/src/universal/DelayedVetoable.sol new file mode 100644 index 000000000000..e38ce9d42591 --- /dev/null +++ b/packages/contracts-bedrock/src/universal/DelayedVetoable.sol @@ -0,0 +1,45 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.15; + +// TODO(maurelian): remove this when the contract is complete +import { console } from "forge-std/console.sol"; + +contract DelayedVetoable { + /// @notice An event that is emitted each time a call is forwarded. + /// @param data The address of the implementation contract + event Forwarded(bytes data); + + /// @notice The address that all calls are forwarded to after the delay. + address internal _target; + + /// @notice Sets the target admin during contract deployment. + /// @param target Address of the target. + constructor(address target) { + _target = target; + } + + /// @notice Used when no data is passed to the contract. + receive() external payable { + _handleCall(); + } + + /// @notice Used for all calls that pass data to the contract. + fallback() external payable { + _handleCall(); + } + + /// @notice Handles forwards the call to the target. + function _handleCall() internal { + require(_target != address(0), "DelayedVetoable: target not initialized"); + + emit Forwarded(msg.data); + (bool success,) = _target.call(msg.data); + assembly { + // Success == 0 means a revert. We'll revert too and pass the data up. + if iszero(success) { revert(0x0, returndatasize()) } + + // Otherwise we'll just return and pass the data up. + return(0x0, returndatasize()) + } + } +} diff --git a/packages/contracts-bedrock/test/DelayedVetoable.t.sol b/packages/contracts-bedrock/test/DelayedVetoable.t.sol new file mode 100644 index 000000000000..e944aba23f1e --- /dev/null +++ b/packages/contracts-bedrock/test/DelayedVetoable.t.sol @@ -0,0 +1,42 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.15; + +import { CommonTest, Reverter } from "./CommonTest.t.sol"; +import { DelayedVetoable } from "../src/universal/DelayedVetoable.sol"; + +contract DelayedVetoable_Init is CommonTest { + event Forwarded(bytes data); + + address target = address(0xabba); + DelayedVetoable delayedVetoable; + Reverter reverter; + + function setUp() public override { + super.setUp(); + delayedVetoable = new DelayedVetoable({ + target: address(target) + }); + reverter = new Reverter(); + } +} + +contract DelayedVetoable_HandleCall_Test is DelayedVetoable_Init { + function testFuzz_handleCall_succeeds(bytes memory data) external { + vm.expectCall(target, data); + vm.expectEmit(true, false, false, true, address(delayedVetoable)); + emit Forwarded(data); + + (bool success,) = address(delayedVetoable).call(data); + assert(success); + } +} + +contract DelayedVetoable_HandleCall_TestFail is DelayedVetoable_Init { + function test_handleCall_reverts() external { + vm.expectCall(target, NON_ZERO_DATA); + vm.expectRevert(); + // including data will call the fallback + (bool success,) = address(delayedVetoable).call(NON_ZERO_DATA); + assertFalse(success); + } +} From e76d230a82eb0027fe4eb9651ff4c6455756b1fc Mon Sep 17 00:00:00 2001 From: Maurelian Date: Fri, 8 Sep 2023 14:03:16 -0400 Subject: [PATCH 33/87] feat(ctb): Add the delay. --- .../src/universal/DelayedVetoable.sol | 57 +++++++++++++++---- .../test/DelayedVetoable.t.sol | 47 ++++++++++++--- 2 files changed, 84 insertions(+), 20 deletions(-) diff --git a/packages/contracts-bedrock/src/universal/DelayedVetoable.sol b/packages/contracts-bedrock/src/universal/DelayedVetoable.sol index e38ce9d42591..33b8cb423de1 100644 --- a/packages/contracts-bedrock/src/universal/DelayedVetoable.sol +++ b/packages/contracts-bedrock/src/universal/DelayedVetoable.sol @@ -5,17 +5,36 @@ pragma solidity ^0.8.15; import { console } from "forge-std/console.sol"; contract DelayedVetoable { + /// @notice Error for when attempting to forward too early. + error ForwardingEarly(); + + /// @notice Error for the target is not set. + error TargetUnitialized(); + + /// @notice An event that is emitted when a call is initiated. + /// @param callHash The hash of the call data. + /// @param data The data of the initiated call. + event Initiated(bytes32 indexed callHash, bytes data); + /// @notice An event that is emitted each time a call is forwarded. - /// @param data The address of the implementation contract - event Forwarded(bytes data); + /// @param callHash The hash of the call data. + /// @param data The data forwarded to the target. + event Forwarded(bytes32 indexed callHash, bytes data); /// @notice The address that all calls are forwarded to after the delay. address internal _target; + /// @notice The time that a call was initiated. + mapping(bytes32 => uint256) internal _queuedAt; + + /// @notice The time to wait before forwarding a call. + uint256 internal _delay; + /// @notice Sets the target admin during contract deployment. /// @param target Address of the target. - constructor(address target) { + constructor(address target, uint256 delay) { _target = target; + _delay = delay; } /// @notice Used when no data is passed to the contract. @@ -30,16 +49,32 @@ contract DelayedVetoable { /// @notice Handles forwards the call to the target. function _handleCall() internal { - require(_target != address(0), "DelayedVetoable: target not initialized"); + if (_target == address(0)) { + revert TargetUnitialized(); + } + + bytes32 callHash = keccak256(msg.data); + if (_queuedAt[callHash] == 0) { + _queuedAt[callHash] = block.timestamp; + emit Initiated(callHash, msg.data); + } else if (_queuedAt[callHash] + _delay < block.timestamp) { + // Not enough time has passed, so we'll revert. + revert ForwardingEarly(); + } else { + // sufficient time has passed. + // Delete the call to prevent replays + delete _queuedAt[callHash]; - emit Forwarded(msg.data); - (bool success,) = _target.call(msg.data); - assembly { - // Success == 0 means a revert. We'll revert too and pass the data up. - if iszero(success) { revert(0x0, returndatasize()) } + // Forward the call + emit Forwarded(callHash, msg.data); + (bool success,) = _target.call(msg.data); + assembly { + // Success == 0 means a revert. We'll revert too and pass the data up. + if iszero(success) { revert(0x0, returndatasize()) } - // Otherwise we'll just return and pass the data up. - return(0x0, returndatasize()) + // Otherwise we'll just return and pass the data up. + return(0x0, returndatasize()) + } } } } diff --git a/packages/contracts-bedrock/test/DelayedVetoable.t.sol b/packages/contracts-bedrock/test/DelayedVetoable.t.sol index e944aba23f1e..fa860ec0e64f 100644 --- a/packages/contracts-bedrock/test/DelayedVetoable.t.sol +++ b/packages/contracts-bedrock/test/DelayedVetoable.t.sol @@ -5,38 +5,67 @@ import { CommonTest, Reverter } from "./CommonTest.t.sol"; import { DelayedVetoable } from "../src/universal/DelayedVetoable.sol"; contract DelayedVetoable_Init is CommonTest { - event Forwarded(bytes data); + event Initiated(bytes32 indexed callHash, bytes data); + event Forwarded(bytes32 indexed callHash, bytes data); address target = address(0xabba); + uint256 delay = 14 days; DelayedVetoable delayedVetoable; Reverter reverter; function setUp() public override { super.setUp(); delayedVetoable = new DelayedVetoable({ - target: address(target) + target: address(target), + delay: delay }); reverter = new Reverter(); } } contract DelayedVetoable_HandleCall_Test is DelayedVetoable_Init { - function testFuzz_handleCall_succeeds(bytes memory data) external { - vm.expectCall(target, data); + function testFuzz_handleCall_initiation_succeeds(bytes memory data) external { vm.expectEmit(true, false, false, true, address(delayedVetoable)); - emit Forwarded(data); + emit Initiated(keccak256(data), data); (bool success,) = address(delayedVetoable).call(data); assert(success); } + + function testFuzz_handleCall_forwarding_succeeds(bytes memory data) external { + // Initiate the call + (bool success,) = address(delayedVetoable).call(data); + + vm.warp(block.timestamp + delay); + vm.expectEmit(true, false, false, true, address(delayedVetoable)); + emit Forwarded(keccak256(data), data); + + vm.expectCall({ callee: target, data: data }); + (success,) = address(delayedVetoable).call(data); + assert(success); + } } contract DelayedVetoable_HandleCall_TestFail is DelayedVetoable_Init { - function test_handleCall_reverts() external { - vm.expectCall(target, NON_ZERO_DATA); + function test_handleCall_forwardingTooSoon_reverts(bytes memory data) external { + (bool success,) = address(delayedVetoable).call(data); + vm.expectRevert(); - // including data will call the fallback - (bool success,) = address(delayedVetoable).call(NON_ZERO_DATA); + (success,) = address(delayedVetoable).call(data); + assertFalse(success); + } + + function test_handleCall_forwardingTargetReverts_reverts(bytes memory data) external { + vm.etch(target, address(reverter).code); + + (bool success,) = address(delayedVetoable).call(data); + + vm.warp(block.timestamp + delay); + vm.expectEmit(true, false, false, true, address(delayedVetoable)); + emit Forwarded(keccak256(data), data); + + vm.expectCall({ callee: target, data: data }); + (success,) = address(delayedVetoable).call(data); assertFalse(success); } } From 574e0b8cdecf1f86403cf8e9bfe8d548cc579965 Mon Sep 17 00:00:00 2001 From: Maurelian Date: Fri, 8 Sep 2023 15:04:38 -0400 Subject: [PATCH 34/87] feat(ctb): Add vetoer and initiator roles feat(ctb): Add getters to DelayedVetoable --- packages/contracts-bedrock/.gas-snapshot | 9 +- .../src/universal/DelayedVetoable.sol | 91 ++++++++++++++++-- .../test/DelayedVetoable.t.sol | 94 ++++++++++++++++++- 3 files changed, 183 insertions(+), 11 deletions(-) diff --git a/packages/contracts-bedrock/.gas-snapshot b/packages/contracts-bedrock/.gas-snapshot index 5ab9f6a14963..bdb22303f4de 100644 --- a/packages/contracts-bedrock/.gas-snapshot +++ b/packages/contracts-bedrock/.gas-snapshot @@ -46,7 +46,14 @@ CrossDomainOwnable3_Test:test_transferOwnership_zeroAddress_reverts() (gas: 1208 CrossDomainOwnableThroughPortal_Test:test_depositTransaction_crossDomainOwner_succeeds() (gas: 81417) CrossDomainOwnable_Test:test_onlyOwner_notOwner_reverts() (gas: 10597) CrossDomainOwnable_Test:test_onlyOwner_succeeds() (gas: 34883) -DelayedVetoable_HandleCall_TestFail:test_handleCall_reverts() (gas: 24969) +DelayedVetoable_Getters_Test:test_getters() (gas: 28128) +DelayedVetoable_Getters_TestFail:test_getters_notVetoer() (gas: 52018) +DelayedVetoable_HandleCall_TestFail:test_handleCall_forwardingTargetReverts_reverts(bytes) (runs: 256, μ: 59701, ~: 59067) +DelayedVetoable_HandleCall_TestFail:test_handleCall_forwardingTooSoon_reverts(bytes) (runs: 256, μ: 49589, ~: 49170) +DelayedVetoable_HandleCall_TestFail:test_handleCall_targetIsZero_reverts() (gas: 17599) +DelayedVetoable_HandleCall_TestFail:test_handleCall_unAuthorizedInitiation_reverts() (gas: 6627) +DelayedVetoable_Veto_Test:test_veto_succeeds(bytes) (runs: 256, μ: 21411, ~: 20927) +DelayedVetoable_Veto_TestFail:test_veto_notVetoer_reverts() (gas: 17552) DeleteOutput:test_script_succeeds() (gas: 3100) DeployerWhitelist_Test:test_owner_succeeds() (gas: 7582) DeployerWhitelist_Test:test_storageSlots_succeeds() (gas: 33395) diff --git a/packages/contracts-bedrock/src/universal/DelayedVetoable.sol b/packages/contracts-bedrock/src/universal/DelayedVetoable.sol index 33b8cb423de1..441cf1fd9bdf 100644 --- a/packages/contracts-bedrock/src/universal/DelayedVetoable.sol +++ b/packages/contracts-bedrock/src/universal/DelayedVetoable.sol @@ -11,6 +11,9 @@ contract DelayedVetoable { /// @notice Error for the target is not set. error TargetUnitialized(); + /// @notice Error for unauthorized calls. + error Unauthorized(address expected, address actual); + /// @notice An event that is emitted when a call is initiated. /// @param callHash The hash of the call data. /// @param data The data of the initiated call. @@ -21,22 +24,82 @@ contract DelayedVetoable { /// @param data The data forwarded to the target. event Forwarded(bytes32 indexed callHash, bytes data); + /// @notice An event that is emitted each time a call is vetoed. + /// @param callHash The hash of the call data. + /// @param data The data forwarded to the target. + event Vetoed(bytes32 indexed callHash, bytes data); + /// @notice The address that all calls are forwarded to after the delay. address internal _target; + // TODO(maurelian): move this to the new SuperChainConfig contract + /// @notice The address that can veto a call. + address internal _vetoer; + + // TODO(maurelian): move this to the new SuperChainConfig contract + /// @notice The address that can initiate a call. + address internal _initiator; + /// @notice The time that a call was initiated. mapping(bytes32 => uint256) internal _queuedAt; /// @notice The time to wait before forwarding a call. uint256 internal _delay; + /// @notice A modifier that reverts if not called by the vetoer or by address(0) to allow + /// eth_call to interact with this proxy without needing to use low-level storage + /// inspection. We assume that nobody is able to trigger calls from address(0) during + /// normal EVM execution. + modifier handleCallIfNotVetoer() { + if (msg.sender == _vetoer || msg.sender == address(0)) { + _; + } else { + // This WILL halt the call frame on completion. + _handleCall(); + } + } + /// @notice Sets the target admin during contract deployment. - /// @param target Address of the target. - constructor(address target, uint256 delay) { - _target = target; - _delay = delay; + /// @param vetoer_ Address of the vetoer. + /// @param initiator_ Address of the initiator. + /// @param target_ Address of the target. + /// @param delay_ Address of the delay. + constructor(address vetoer_, address initiator_, address target_, uint256 delay_) { + _vetoer = vetoer_; + _initiator = initiator_; + _target = target_; + _delay = delay_; + } + + /// @notice Gets the initiator + /// @return Initiator address. + function initiator() external handleCallIfNotVetoer returns (address) { + return _initiator; } + //// @notice Queries the vetoer address. + /// @return Vetoer address. + function vetoer() external handleCallIfNotVetoer returns (address) { + return _vetoer; + } + + //// @notice Queries the target address. + /// @return Target address. + function target() external handleCallIfNotVetoer returns (address) { + return _target; + } + + /// @notice Gets the delay + /// @return Delay address. + function delay() external handleCallIfNotVetoer returns (uint256) { + return _delay; + } + + // TODO(maurelian): Remove this? The contract currently cannot handle forwarding ETH and I'm + // not sure the complexity is warranted. + // If we do allow it: + // 1. the callHash will need to include the value + // 2. forwarding will need to be done by passing the callHash, rather than the unhashed data /// @notice Used when no data is passed to the contract. receive() external payable { _handleCall(); @@ -47,7 +110,18 @@ contract DelayedVetoable { _handleCall(); } - /// @notice Handles forwards the call to the target. + /// @notice Vetoes a call. This method can only be called by the vetoer. If called by another + /// address, execution will be redirected to _handleCall() + function veto(bytes memory data) external handleCallIfNotVetoer { + bytes32 callHash = keccak256(data); + + delete _queuedAt[callHash]; + emit Vetoed(callHash, data); + } + + /// @notice Receives all calls other than those made by the vetoer. + /// This enables transparent initiation and forwarding of calls to the target and avoids + /// the need for additional layers of abi encoding. function _handleCall() internal { if (_target == address(0)) { revert TargetUnitialized(); @@ -55,13 +129,18 @@ contract DelayedVetoable { bytes32 callHash = keccak256(msg.data); if (_queuedAt[callHash] == 0) { + if (msg.sender != _initiator) { + revert Unauthorized(_initiator, msg.sender); + } _queuedAt[callHash] = block.timestamp; emit Initiated(callHash, msg.data); } else if (_queuedAt[callHash] + _delay < block.timestamp) { // Not enough time has passed, so we'll revert. revert ForwardingEarly(); } else { - // sufficient time has passed. + // The ability to finalize the call after sufficient time has passed does not require + // authorization. + // Delete the call to prevent replays delete _queuedAt[callHash]; diff --git a/packages/contracts-bedrock/test/DelayedVetoable.t.sol b/packages/contracts-bedrock/test/DelayedVetoable.t.sol index fa860ec0e64f..94ec3b771012 100644 --- a/packages/contracts-bedrock/test/DelayedVetoable.t.sol +++ b/packages/contracts-bedrock/test/DelayedVetoable.t.sol @@ -5,10 +5,17 @@ import { CommonTest, Reverter } from "./CommonTest.t.sol"; import { DelayedVetoable } from "../src/universal/DelayedVetoable.sol"; contract DelayedVetoable_Init is CommonTest { + error Unauthorized(address expected, address actual); + error ForwardingEarly(); + error TargetUnitialized(); + event Initiated(bytes32 indexed callHash, bytes data); event Forwarded(bytes32 indexed callHash, bytes data); + event Vetoed(bytes32 indexed callHash, bytes data); address target = address(0xabba); + address initiator = alice; + address vetoer = bob; uint256 delay = 14 days; DelayedVetoable delayedVetoable; Reverter reverter; @@ -16,24 +23,53 @@ contract DelayedVetoable_Init is CommonTest { function setUp() public override { super.setUp(); delayedVetoable = new DelayedVetoable({ - target: address(target), - delay: delay + initiator_: alice, + vetoer_: bob, + target_: address(target), + delay_: delay }); reverter = new Reverter(); } } +contract DelayedVetoable_Getters_Test is DelayedVetoable_Init { + function test_getters() external { + vm.startPrank(address(0)); + assertEq(delayedVetoable.initiator(), initiator); + assertEq(delayedVetoable.vetoer(), vetoer); + assertEq(delayedVetoable.target(), target); + assertEq(delayedVetoable.delay(), delay); + } +} + +contract DelayedVetoable_Getters_TestFail is DelayedVetoable_Init { + function test_getters_notVetoer() external { + // getter calls from addresses other than the vetoer or zero address will revert in the + // initiation branch of the proxy. + vm.expectRevert(abi.encodeWithSelector(Unauthorized.selector, initiator, address(this))); + delayedVetoable.initiator(); + vm.expectRevert(abi.encodeWithSelector(Unauthorized.selector, initiator, address(this))); + delayedVetoable.vetoer(); + vm.expectRevert(abi.encodeWithSelector(Unauthorized.selector, initiator, address(this))); + delayedVetoable.target(); + vm.expectRevert(abi.encodeWithSelector(Unauthorized.selector, initiator, address(this))); + delayedVetoable.delay(); + } +} + contract DelayedVetoable_HandleCall_Test is DelayedVetoable_Init { function testFuzz_handleCall_initiation_succeeds(bytes memory data) external { vm.expectEmit(true, false, false, true, address(delayedVetoable)); emit Initiated(keccak256(data), data); + vm.prank(initiator); (bool success,) = address(delayedVetoable).call(data); assert(success); } function testFuzz_handleCall_forwarding_succeeds(bytes memory data) external { // Initiate the call + vm.prank(initiator); (bool success,) = address(delayedVetoable).call(data); vm.warp(block.timestamp + delay); @@ -47,25 +83,75 @@ contract DelayedVetoable_HandleCall_Test is DelayedVetoable_Init { } contract DelayedVetoable_HandleCall_TestFail is DelayedVetoable_Init { + function test_handleCall_unAuthorizedInitiation_reverts() external { + vm.store(address(delayedVetoable), bytes32(0), bytes32(0)); + vm.expectRevert(abi.encodeWithSelector(TargetUnitialized.selector)); + (bool success,) = address(delayedVetoable).call(hex""); + assert(success); + } + + function test_handleCall_targetIsZero_reverts() external { + vm.expectRevert(abi.encodeWithSelector(Unauthorized.selector, initiator, address(this))); + (bool success,) = address(delayedVetoable).call(hex""); + assert(success); + } + function test_handleCall_forwardingTooSoon_reverts(bytes memory data) external { + vm.prank(initiator); (bool success,) = address(delayedVetoable).call(data); - vm.expectRevert(); + vm.expectRevert(abi.encodeWithSelector(ForwardingEarly.selector)); (success,) = address(delayedVetoable).call(data); assertFalse(success); } + function test_handleCall_forwardingTwice_reverts(bytes memory data) external { + // Initiate the call + vm.prank(initiator); + (bool success,) = address(delayedVetoable).call(data); + + vm.warp(block.timestamp + delay); + vm.expectEmit(true, false, false, true, address(delayedVetoable)); + emit Forwarded(keccak256(data), data); + + vm.expectCall({ callee: target, data: data }); + (success,) = address(delayedVetoable).call(data); + assert(success); + + // Attempt to foward the same call again. + vm.expectRevert(abi.encodeWithSelector(Unauthorized.selector, initiator, address(this))); + (success,) = address(delayedVetoable).call(data); + assert(success); + } + function test_handleCall_forwardingTargetReverts_reverts(bytes memory data) external { vm.etch(target, address(reverter).code); + vm.prank(initiator); (bool success,) = address(delayedVetoable).call(data); vm.warp(block.timestamp + delay); vm.expectEmit(true, false, false, true, address(delayedVetoable)); emit Forwarded(keccak256(data), data); - vm.expectCall({ callee: target, data: data }); (success,) = address(delayedVetoable).call(data); assertFalse(success); } } + +contract DelayedVetoable_Veto_Test is DelayedVetoable_Init { + function test_veto_succeeds(bytes memory data) external { + vm.expectEmit(true, false, false, true, address(delayedVetoable)); + emit Vetoed(keccak256(data), data); + + vm.prank(vetoer); + delayedVetoable.veto(data); + } +} + +contract DelayedVetoable_Veto_TestFail is DelayedVetoable_Init { + function test_veto_notVetoer_reverts() external { + vm.expectRevert(); + delayedVetoable.veto(hex""); + } +} From 7b40bd20d5d1418ba519f0643cf7d4fe09eb06ad Mon Sep 17 00:00:00 2001 From: Maurelian Date: Fri, 8 Sep 2023 16:00:36 -0400 Subject: [PATCH 35/87] feat(ctb): move DelayedVetoable to L1 dir --- .../src/{universal => L1}/DelayedVetoable.sol | 3 --- packages/contracts-bedrock/test/DelayedVetoable.t.sol | 2 +- 2 files changed, 1 insertion(+), 4 deletions(-) rename packages/contracts-bedrock/src/{universal => L1}/DelayedVetoable.sol (98%) diff --git a/packages/contracts-bedrock/src/universal/DelayedVetoable.sol b/packages/contracts-bedrock/src/L1/DelayedVetoable.sol similarity index 98% rename from packages/contracts-bedrock/src/universal/DelayedVetoable.sol rename to packages/contracts-bedrock/src/L1/DelayedVetoable.sol index 441cf1fd9bdf..2ac3e14e981b 100644 --- a/packages/contracts-bedrock/src/universal/DelayedVetoable.sol +++ b/packages/contracts-bedrock/src/L1/DelayedVetoable.sol @@ -1,9 +1,6 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.15; -// TODO(maurelian): remove this when the contract is complete -import { console } from "forge-std/console.sol"; - contract DelayedVetoable { /// @notice Error for when attempting to forward too early. error ForwardingEarly(); diff --git a/packages/contracts-bedrock/test/DelayedVetoable.t.sol b/packages/contracts-bedrock/test/DelayedVetoable.t.sol index 94ec3b771012..fa7a9ebcfe6c 100644 --- a/packages/contracts-bedrock/test/DelayedVetoable.t.sol +++ b/packages/contracts-bedrock/test/DelayedVetoable.t.sol @@ -2,7 +2,7 @@ pragma solidity 0.8.15; import { CommonTest, Reverter } from "./CommonTest.t.sol"; -import { DelayedVetoable } from "../src/universal/DelayedVetoable.sol"; +import { DelayedVetoable } from "../src/L1/DelayedVetoable.sol"; contract DelayedVetoable_Init is CommonTest { error Unauthorized(address expected, address actual); From a5f85691f591b9f7f49f9c9d36941e8eec6d4424 Mon Sep 17 00:00:00 2001 From: Maurelian Date: Fri, 8 Sep 2023 16:15:13 -0400 Subject: [PATCH 36/87] feat(ctb): Add semver ctb: Address feedback --- .../contracts-bedrock/src/L1/DelayedVetoable.sol | 13 ++++++------- .../contracts-bedrock/test/DelayedVetoable.t.sol | 10 +--------- 2 files changed, 7 insertions(+), 16 deletions(-) diff --git a/packages/contracts-bedrock/src/L1/DelayedVetoable.sol b/packages/contracts-bedrock/src/L1/DelayedVetoable.sol index 2ac3e14e981b..6e56890defd0 100644 --- a/packages/contracts-bedrock/src/L1/DelayedVetoable.sol +++ b/packages/contracts-bedrock/src/L1/DelayedVetoable.sol @@ -1,7 +1,9 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.15; +pragma solidity 0.8.15; -contract DelayedVetoable { +import { Semver } from "../universal/Semver.sol"; + +contract DelayedVetoable is Semver { /// @notice Error for when attempting to forward too early. error ForwardingEarly(); @@ -56,12 +58,13 @@ contract DelayedVetoable { } } + /// @custom:semver 0.0.1 /// @notice Sets the target admin during contract deployment. /// @param vetoer_ Address of the vetoer. /// @param initiator_ Address of the initiator. /// @param target_ Address of the target. /// @param delay_ Address of the delay. - constructor(address vetoer_, address initiator_, address target_, uint256 delay_) { + constructor(address vetoer_, address initiator_, address target_, uint256 delay_) Semver(0, 0, 1) { _vetoer = vetoer_; _initiator = initiator_; _target = target_; @@ -120,10 +123,6 @@ contract DelayedVetoable { /// This enables transparent initiation and forwarding of calls to the target and avoids /// the need for additional layers of abi encoding. function _handleCall() internal { - if (_target == address(0)) { - revert TargetUnitialized(); - } - bytes32 callHash = keccak256(msg.data); if (_queuedAt[callHash] == 0) { if (msg.sender != _initiator) { diff --git a/packages/contracts-bedrock/test/DelayedVetoable.t.sol b/packages/contracts-bedrock/test/DelayedVetoable.t.sol index fa7a9ebcfe6c..87d5ffc68316 100644 --- a/packages/contracts-bedrock/test/DelayedVetoable.t.sol +++ b/packages/contracts-bedrock/test/DelayedVetoable.t.sol @@ -7,7 +7,6 @@ import { DelayedVetoable } from "../src/L1/DelayedVetoable.sol"; contract DelayedVetoable_Init is CommonTest { error Unauthorized(address expected, address actual); error ForwardingEarly(); - error TargetUnitialized(); event Initiated(bytes32 indexed callHash, bytes data); event Forwarded(bytes32 indexed callHash, bytes data); @@ -83,14 +82,7 @@ contract DelayedVetoable_HandleCall_Test is DelayedVetoable_Init { } contract DelayedVetoable_HandleCall_TestFail is DelayedVetoable_Init { - function test_handleCall_unAuthorizedInitiation_reverts() external { - vm.store(address(delayedVetoable), bytes32(0), bytes32(0)); - vm.expectRevert(abi.encodeWithSelector(TargetUnitialized.selector)); - (bool success,) = address(delayedVetoable).call(hex""); - assert(success); - } - - function test_handleCall_targetIsZero_reverts() external { + function test_handleCall_unauthorizedInitiation_reverts() external { vm.expectRevert(abi.encodeWithSelector(Unauthorized.selector, initiator, address(this))); (bool success,) = address(delayedVetoable).call(hex""); assert(success); From a6279cbe51ceaa7a0097e1a900355d88d6996cff Mon Sep 17 00:00:00 2001 From: Maurelian Date: Fri, 8 Sep 2023 22:21:39 -0400 Subject: [PATCH 37/87] refactor(ctb): Remove the veto function. This simplifies the interface, and the resulting handleCall function is also cleaner, as it treats the dispatching primarily based on the caller. --- .../src/L1/DelayedVetoable.sol | 72 ++++++++++--------- .../test/DelayedVetoable.t.sol | 17 ----- 2 files changed, 38 insertions(+), 51 deletions(-) diff --git a/packages/contracts-bedrock/src/L1/DelayedVetoable.sol b/packages/contracts-bedrock/src/L1/DelayedVetoable.sol index 6e56890defd0..386ab36e01cd 100644 --- a/packages/contracts-bedrock/src/L1/DelayedVetoable.sol +++ b/packages/contracts-bedrock/src/L1/DelayedVetoable.sol @@ -49,8 +49,8 @@ contract DelayedVetoable is Semver { /// eth_call to interact with this proxy without needing to use low-level storage /// inspection. We assume that nobody is able to trigger calls from address(0) during /// normal EVM execution. - modifier handleCallIfNotVetoer() { - if (msg.sender == _vetoer || msg.sender == address(0)) { + modifier readOrHandle() { + if (msg.sender == address(0)) { _; } else { // This WILL halt the call frame on completion. @@ -73,25 +73,25 @@ contract DelayedVetoable is Semver { /// @notice Gets the initiator /// @return Initiator address. - function initiator() external handleCallIfNotVetoer returns (address) { + function initiator() external readOrHandle returns (address) { return _initiator; } //// @notice Queries the vetoer address. /// @return Vetoer address. - function vetoer() external handleCallIfNotVetoer returns (address) { + function vetoer() external readOrHandle returns (address) { return _vetoer; } //// @notice Queries the target address. /// @return Target address. - function target() external handleCallIfNotVetoer returns (address) { + function target() external readOrHandle returns (address) { return _target; } /// @notice Gets the delay /// @return Delay address. - function delay() external handleCallIfNotVetoer returns (uint256) { + function delay() external readOrHandle returns (uint256) { return _delay; } @@ -110,46 +110,50 @@ contract DelayedVetoable is Semver { _handleCall(); } - /// @notice Vetoes a call. This method can only be called by the vetoer. If called by another - /// address, execution will be redirected to _handleCall() - function veto(bytes memory data) external handleCallIfNotVetoer { - bytes32 callHash = keccak256(data); - - delete _queuedAt[callHash]; - emit Vetoed(callHash, data); - } - /// @notice Receives all calls other than those made by the vetoer. /// This enables transparent initiation and forwarding of calls to the target and avoids /// the need for additional layers of abi encoding. function _handleCall() internal { bytes32 callHash = keccak256(msg.data); - if (_queuedAt[callHash] == 0) { - if (msg.sender != _initiator) { - revert Unauthorized(_initiator, msg.sender); - } + + // Case 1: The initiator is calling the contract to initiate a call. + if (msg.sender == _initiator && _queuedAt[callHash] == 0) { _queuedAt[callHash] = block.timestamp; emit Initiated(callHash, msg.data); - } else if (_queuedAt[callHash] + _delay < block.timestamp) { + return; + } + + // Case 2: The vetoer is calling the contract to veto a call. + if (msg.sender == _vetoer && _queuedAt[callHash] != 0 && block.timestamp <= _queuedAt[callHash] + _delay) { + delete _queuedAt[callHash]; + emit Vetoed(callHash, msg.data); + return; + } + + // Case 3: The call is from an unpermissioned actor. We'll forward the call if the delay has + // passed. + if (_queuedAt[callHash] == 0) { + // The call has not been initiated, so we'll treat this is an unauthorized initiation attempt. + revert Unauthorized(_initiator, msg.sender); + } + + if (_queuedAt[callHash] + _delay < block.timestamp) { // Not enough time has passed, so we'll revert. revert ForwardingEarly(); - } else { - // The ability to finalize the call after sufficient time has passed does not require - // authorization. + } - // Delete the call to prevent replays - delete _queuedAt[callHash]; + // Delete the call to prevent replays + delete _queuedAt[callHash]; - // Forward the call - emit Forwarded(callHash, msg.data); - (bool success,) = _target.call(msg.data); - assembly { - // Success == 0 means a revert. We'll revert too and pass the data up. - if iszero(success) { revert(0x0, returndatasize()) } + // Forward the call + emit Forwarded(callHash, msg.data); + (bool success,) = _target.call(msg.data); + assembly { + // Success == 0 means a revert. We'll revert too and pass the data up. + if iszero(success) { revert(0x0, returndatasize()) } - // Otherwise we'll just return and pass the data up. - return(0x0, returndatasize()) - } + // Otherwise we'll just return and pass the data up. + return(0x0, returndatasize()) } } } diff --git a/packages/contracts-bedrock/test/DelayedVetoable.t.sol b/packages/contracts-bedrock/test/DelayedVetoable.t.sol index 87d5ffc68316..d13999b3a1b4 100644 --- a/packages/contracts-bedrock/test/DelayedVetoable.t.sol +++ b/packages/contracts-bedrock/test/DelayedVetoable.t.sol @@ -130,20 +130,3 @@ contract DelayedVetoable_HandleCall_TestFail is DelayedVetoable_Init { assertFalse(success); } } - -contract DelayedVetoable_Veto_Test is DelayedVetoable_Init { - function test_veto_succeeds(bytes memory data) external { - vm.expectEmit(true, false, false, true, address(delayedVetoable)); - emit Vetoed(keccak256(data), data); - - vm.prank(vetoer); - delayedVetoable.veto(data); - } -} - -contract DelayedVetoable_Veto_TestFail is DelayedVetoable_Init { - function test_veto_notVetoer_reverts() external { - vm.expectRevert(); - delayedVetoable.veto(hex""); - } -} From ef08493342724cd33611906d9c4a52dd4906aa9c Mon Sep 17 00:00:00 2001 From: Maurelian Date: Thu, 7 Sep 2023 10:28:22 -0400 Subject: [PATCH 38/87] feat(op-bindings): Add bindings for DelayedVetoable rebuild mips_more and preimageoracle_more bindings --- op-bindings/artifacts.json | 3 +- op-bindings/bindings/delayedvetoable.go | 794 +++++++++++++++++++ op-bindings/bindings/delayedvetoable_more.go | 25 + 3 files changed, 821 insertions(+), 1 deletion(-) create mode 100644 op-bindings/bindings/delayedvetoable.go create mode 100644 op-bindings/bindings/delayedvetoable_more.go diff --git a/op-bindings/artifacts.json b/op-bindings/artifacts.json index 77a33050fd8d..26ef1dee3c54 100644 --- a/op-bindings/artifacts.json +++ b/op-bindings/artifacts.json @@ -38,5 +38,6 @@ "SchemaRegistry", "ProtocolVersions", "Safe", - "SafeProxyFactory" + "SafeProxyFactory", + "DelayedVetoable" ] diff --git a/op-bindings/bindings/delayedvetoable.go b/op-bindings/bindings/delayedvetoable.go new file mode 100644 index 000000000000..79344ff5446a --- /dev/null +++ b/op-bindings/bindings/delayedvetoable.go @@ -0,0 +1,794 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package bindings + +import ( + "errors" + "math/big" + "strings" + + ethereum "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/accounts/abi" + "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/event" +) + +// Reference imports to suppress errors if they are not otherwise used. +var ( + _ = errors.New + _ = big.NewInt + _ = strings.NewReader + _ = ethereum.NotFound + _ = bind.Bind + _ = common.Big1 + _ = types.BloomLookup + _ = event.NewSubscription +) + +// DelayedVetoableMetaData contains all meta data concerning the DelayedVetoable contract. +var DelayedVetoableMetaData = &bind.MetaData{ + ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"vetoer_\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"initiator_\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"target_\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"delay_\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"ForwardingEarly\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TargetUnitialized\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"expected\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"actual\",\"type\":\"address\"}],\"name\":\"Unauthorized\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"callHash\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"Forwarded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"callHash\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"Initiated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"callHash\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"Vetoed\",\"type\":\"event\"},{\"stateMutability\":\"payable\",\"type\":\"fallback\"},{\"inputs\":[],\"name\":\"delay\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"initiator\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"target\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"version\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"vetoer\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}]", + Bin: "0x60e060405234801561001057600080fd5b50604051610a27380380610a2783398101604081905261002f9161009f565b6000608081905260a0819052600160c081905280546001600160a01b03199081166001600160a01b0397881617909155600280548216958716959095179094558054909316919093161790556004556100ea565b80516001600160a01b038116811461009a57600080fd5b919050565b600080600080608085870312156100b557600080fd5b6100be85610083565b93506100cc60208601610083565b92506100da60408601610083565b6060959095015193969295505050565b60805160a05160c05161090e61011960003960006104560152600061042d01526000610404015261090e6000f3fe60806040526004361061005e5760003560e01c80636a42b8f8116100435780636a42b8f8146100da578063d4b83992146100fd578063d8bff440146101125761006d565b806354fd4d50146100755780635c39fcc1146100a05761006d565b3661006d5761006b610127565b005b61006b610127565b34801561008157600080fd5b5061008a6103fd565b6040516100979190610692565b60405180910390f35b3480156100ac57600080fd5b506100b56104a0565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610097565b3480156100e657600080fd5b506100ef6104cf565b604051908152602001610097565b34801561010957600080fd5b506100b56104dd565b34801561011e57600080fd5b506100b5610501565b600080366040516101399291906106e3565b60405190819003902060025490915073ffffffffffffffffffffffffffffffffffffffff16331480156101785750600081815260036020526040902054155b156101cb576000818152600360205260408082204290555182917f87a332a414acbc7da074543639ce7ae02ff1ea72e88379da9f261b080beb5a13916101c0919036906106f3565b60405180910390a250565b60015473ffffffffffffffffffffffffffffffffffffffff16331480156101ff575060008181526003602052604090205415155b80156102265750600454600082815260036020526040902054610222919061076f565b4211155b1561026e576000818152600360205260408082208290555182917fbede6852c1d97d93ff557f676de76670cd0dec861e7fe8beb13aa0ba2b0ab040916101c0919036906106f3565b60008181526003602052604081205490036102db576002546040517f295a81c100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff909116600482015233602482015260440160405180910390fd5b60045460008281526003602052604090205442916102f89161076f565b1015610330576040517f43dc986d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000818152600360205260408082208290555182917f4c109d85bcd0bb5c735b4be850953d652afe4cd9aa2e0b1426a65a4dcb2e122991610373919036906106f3565b60405180910390a26000805460405173ffffffffffffffffffffffffffffffffffffffff909116906103a890839036906106e3565b6000604051808303816000865af19150503d80600081146103e5576040519150601f19603f3d011682016040523d82523d6000602084013e6103ea565b606091505b50509050806103f8573d6000fd5b3d6000f35b60606104287f0000000000000000000000000000000000000000000000000000000000000000610525565b6104517f0000000000000000000000000000000000000000000000000000000000000000610525565b61047a7f0000000000000000000000000000000000000000000000000000000000000000610525565b60405160200161048c93929190610787565b604051602081830303815290604052905090565b6000336104c4575060025473ffffffffffffffffffffffffffffffffffffffff1690565b6104cc610127565b90565b6000336104c4575060045490565b6000336104c4575060005473ffffffffffffffffffffffffffffffffffffffff1690565b6000336104c4575060015473ffffffffffffffffffffffffffffffffffffffff1690565b60608160000361056857505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115610592578061057c816107fd565b915061058b9050600a83610864565b915061056c565b60008167ffffffffffffffff8111156105ad576105ad610878565b6040519080825280601f01601f1916602001820160405280156105d7576020820181803683370190505b5090505b841561065a576105ec6001836108a7565b91506105f9600a866108be565b61060490603061076f565b60f81b818381518110610619576106196108d2565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350610653600a86610864565b94506105db565b949350505050565b60005b8381101561067d578181015183820152602001610665565b8381111561068c576000848401525b50505050565b60208152600082518060208401526106b1816040850160208701610662565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b8183823760009101908152919050565b60208152816020820152818360408301376000818301604090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0160101919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000821982111561078257610782610740565b500190565b60008451610799818460208901610662565b80830190507f2e0000000000000000000000000000000000000000000000000000000000000080825285516107d5816001850160208a01610662565b600192019182015283516107f0816002840160208801610662565b0160020195945050505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361082e5761082e610740565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60008261087357610873610835565b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000828210156108b9576108b9610740565b500390565b6000826108cd576108cd610835565b500690565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fdfea164736f6c634300080f000a", +} + +// DelayedVetoableABI is the input ABI used to generate the binding from. +// Deprecated: Use DelayedVetoableMetaData.ABI instead. +var DelayedVetoableABI = DelayedVetoableMetaData.ABI + +// DelayedVetoableBin is the compiled bytecode used for deploying new contracts. +// Deprecated: Use DelayedVetoableMetaData.Bin instead. +var DelayedVetoableBin = DelayedVetoableMetaData.Bin + +// DeployDelayedVetoable deploys a new Ethereum contract, binding an instance of DelayedVetoable to it. +func DeployDelayedVetoable(auth *bind.TransactOpts, backend bind.ContractBackend, vetoer_ common.Address, initiator_ common.Address, target_ common.Address, delay_ *big.Int) (common.Address, *types.Transaction, *DelayedVetoable, error) { + parsed, err := DelayedVetoableMetaData.GetAbi() + if err != nil { + return common.Address{}, nil, nil, err + } + if parsed == nil { + return common.Address{}, nil, nil, errors.New("GetABI returned nil") + } + + address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(DelayedVetoableBin), backend, vetoer_, initiator_, target_, delay_) + if err != nil { + return common.Address{}, nil, nil, err + } + return address, tx, &DelayedVetoable{DelayedVetoableCaller: DelayedVetoableCaller{contract: contract}, DelayedVetoableTransactor: DelayedVetoableTransactor{contract: contract}, DelayedVetoableFilterer: DelayedVetoableFilterer{contract: contract}}, nil +} + +// DelayedVetoable is an auto generated Go binding around an Ethereum contract. +type DelayedVetoable struct { + DelayedVetoableCaller // Read-only binding to the contract + DelayedVetoableTransactor // Write-only binding to the contract + DelayedVetoableFilterer // Log filterer for contract events +} + +// DelayedVetoableCaller is an auto generated read-only Go binding around an Ethereum contract. +type DelayedVetoableCaller struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// DelayedVetoableTransactor is an auto generated write-only Go binding around an Ethereum contract. +type DelayedVetoableTransactor struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// DelayedVetoableFilterer is an auto generated log filtering Go binding around an Ethereum contract events. +type DelayedVetoableFilterer struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// DelayedVetoableSession is an auto generated Go binding around an Ethereum contract, +// with pre-set call and transact options. +type DelayedVetoableSession struct { + Contract *DelayedVetoable // Generic contract binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// DelayedVetoableCallerSession is an auto generated read-only Go binding around an Ethereum contract, +// with pre-set call options. +type DelayedVetoableCallerSession struct { + Contract *DelayedVetoableCaller // Generic contract caller binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session +} + +// DelayedVetoableTransactorSession is an auto generated write-only Go binding around an Ethereum contract, +// with pre-set transact options. +type DelayedVetoableTransactorSession struct { + Contract *DelayedVetoableTransactor // Generic contract transactor binding to set the session for + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// DelayedVetoableRaw is an auto generated low-level Go binding around an Ethereum contract. +type DelayedVetoableRaw struct { + Contract *DelayedVetoable // Generic contract binding to access the raw methods on +} + +// DelayedVetoableCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. +type DelayedVetoableCallerRaw struct { + Contract *DelayedVetoableCaller // Generic read-only contract binding to access the raw methods on +} + +// DelayedVetoableTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. +type DelayedVetoableTransactorRaw struct { + Contract *DelayedVetoableTransactor // Generic write-only contract binding to access the raw methods on +} + +// NewDelayedVetoable creates a new instance of DelayedVetoable, bound to a specific deployed contract. +func NewDelayedVetoable(address common.Address, backend bind.ContractBackend) (*DelayedVetoable, error) { + contract, err := bindDelayedVetoable(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &DelayedVetoable{DelayedVetoableCaller: DelayedVetoableCaller{contract: contract}, DelayedVetoableTransactor: DelayedVetoableTransactor{contract: contract}, DelayedVetoableFilterer: DelayedVetoableFilterer{contract: contract}}, nil +} + +// NewDelayedVetoableCaller creates a new read-only instance of DelayedVetoable, bound to a specific deployed contract. +func NewDelayedVetoableCaller(address common.Address, caller bind.ContractCaller) (*DelayedVetoableCaller, error) { + contract, err := bindDelayedVetoable(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &DelayedVetoableCaller{contract: contract}, nil +} + +// NewDelayedVetoableTransactor creates a new write-only instance of DelayedVetoable, bound to a specific deployed contract. +func NewDelayedVetoableTransactor(address common.Address, transactor bind.ContractTransactor) (*DelayedVetoableTransactor, error) { + contract, err := bindDelayedVetoable(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &DelayedVetoableTransactor{contract: contract}, nil +} + +// NewDelayedVetoableFilterer creates a new log filterer instance of DelayedVetoable, bound to a specific deployed contract. +func NewDelayedVetoableFilterer(address common.Address, filterer bind.ContractFilterer) (*DelayedVetoableFilterer, error) { + contract, err := bindDelayedVetoable(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &DelayedVetoableFilterer{contract: contract}, nil +} + +// bindDelayedVetoable binds a generic wrapper to an already deployed contract. +func bindDelayedVetoable(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := abi.JSON(strings.NewReader(DelayedVetoableABI)) + if err != nil { + return nil, err + } + return bind.NewBoundContract(address, parsed, caller, transactor, filterer), nil +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_DelayedVetoable *DelayedVetoableRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _DelayedVetoable.Contract.DelayedVetoableCaller.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_DelayedVetoable *DelayedVetoableRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _DelayedVetoable.Contract.DelayedVetoableTransactor.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_DelayedVetoable *DelayedVetoableRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _DelayedVetoable.Contract.DelayedVetoableTransactor.contract.Transact(opts, method, params...) +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_DelayedVetoable *DelayedVetoableCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _DelayedVetoable.Contract.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_DelayedVetoable *DelayedVetoableTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _DelayedVetoable.Contract.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_DelayedVetoable *DelayedVetoableTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _DelayedVetoable.Contract.contract.Transact(opts, method, params...) +} + +// Version is a free data retrieval call binding the contract method 0x54fd4d50. +// +// Solidity: function version() view returns(string) +func (_DelayedVetoable *DelayedVetoableCaller) Version(opts *bind.CallOpts) (string, error) { + var out []interface{} + err := _DelayedVetoable.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 (_DelayedVetoable *DelayedVetoableSession) Version() (string, error) { + return _DelayedVetoable.Contract.Version(&_DelayedVetoable.CallOpts) +} + +// Version is a free data retrieval call binding the contract method 0x54fd4d50. +// +// Solidity: function version() view returns(string) +func (_DelayedVetoable *DelayedVetoableCallerSession) Version() (string, error) { + return _DelayedVetoable.Contract.Version(&_DelayedVetoable.CallOpts) +} + +// Delay is a paid mutator transaction binding the contract method 0x6a42b8f8. +// +// Solidity: function delay() returns(uint256) +func (_DelayedVetoable *DelayedVetoableTransactor) Delay(opts *bind.TransactOpts) (*types.Transaction, error) { + return _DelayedVetoable.contract.Transact(opts, "delay") +} + +// Delay is a paid mutator transaction binding the contract method 0x6a42b8f8. +// +// Solidity: function delay() returns(uint256) +func (_DelayedVetoable *DelayedVetoableSession) Delay() (*types.Transaction, error) { + return _DelayedVetoable.Contract.Delay(&_DelayedVetoable.TransactOpts) +} + +// Delay is a paid mutator transaction binding the contract method 0x6a42b8f8. +// +// Solidity: function delay() returns(uint256) +func (_DelayedVetoable *DelayedVetoableTransactorSession) Delay() (*types.Transaction, error) { + return _DelayedVetoable.Contract.Delay(&_DelayedVetoable.TransactOpts) +} + +// Initiator is a paid mutator transaction binding the contract method 0x5c39fcc1. +// +// Solidity: function initiator() returns(address) +func (_DelayedVetoable *DelayedVetoableTransactor) Initiator(opts *bind.TransactOpts) (*types.Transaction, error) { + return _DelayedVetoable.contract.Transact(opts, "initiator") +} + +// Initiator is a paid mutator transaction binding the contract method 0x5c39fcc1. +// +// Solidity: function initiator() returns(address) +func (_DelayedVetoable *DelayedVetoableSession) Initiator() (*types.Transaction, error) { + return _DelayedVetoable.Contract.Initiator(&_DelayedVetoable.TransactOpts) +} + +// Initiator is a paid mutator transaction binding the contract method 0x5c39fcc1. +// +// Solidity: function initiator() returns(address) +func (_DelayedVetoable *DelayedVetoableTransactorSession) Initiator() (*types.Transaction, error) { + return _DelayedVetoable.Contract.Initiator(&_DelayedVetoable.TransactOpts) +} + +// Target is a paid mutator transaction binding the contract method 0xd4b83992. +// +// Solidity: function target() returns(address) +func (_DelayedVetoable *DelayedVetoableTransactor) Target(opts *bind.TransactOpts) (*types.Transaction, error) { + return _DelayedVetoable.contract.Transact(opts, "target") +} + +// Target is a paid mutator transaction binding the contract method 0xd4b83992. +// +// Solidity: function target() returns(address) +func (_DelayedVetoable *DelayedVetoableSession) Target() (*types.Transaction, error) { + return _DelayedVetoable.Contract.Target(&_DelayedVetoable.TransactOpts) +} + +// Target is a paid mutator transaction binding the contract method 0xd4b83992. +// +// Solidity: function target() returns(address) +func (_DelayedVetoable *DelayedVetoableTransactorSession) Target() (*types.Transaction, error) { + return _DelayedVetoable.Contract.Target(&_DelayedVetoable.TransactOpts) +} + +// Vetoer is a paid mutator transaction binding the contract method 0xd8bff440. +// +// Solidity: function vetoer() returns(address) +func (_DelayedVetoable *DelayedVetoableTransactor) Vetoer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _DelayedVetoable.contract.Transact(opts, "vetoer") +} + +// Vetoer is a paid mutator transaction binding the contract method 0xd8bff440. +// +// Solidity: function vetoer() returns(address) +func (_DelayedVetoable *DelayedVetoableSession) Vetoer() (*types.Transaction, error) { + return _DelayedVetoable.Contract.Vetoer(&_DelayedVetoable.TransactOpts) +} + +// Vetoer is a paid mutator transaction binding the contract method 0xd8bff440. +// +// Solidity: function vetoer() returns(address) +func (_DelayedVetoable *DelayedVetoableTransactorSession) Vetoer() (*types.Transaction, error) { + return _DelayedVetoable.Contract.Vetoer(&_DelayedVetoable.TransactOpts) +} + +// Fallback is a paid mutator transaction binding the contract fallback function. +// +// Solidity: fallback() payable returns() +func (_DelayedVetoable *DelayedVetoableTransactor) Fallback(opts *bind.TransactOpts, calldata []byte) (*types.Transaction, error) { + return _DelayedVetoable.contract.RawTransact(opts, calldata) +} + +// Fallback is a paid mutator transaction binding the contract fallback function. +// +// Solidity: fallback() payable returns() +func (_DelayedVetoable *DelayedVetoableSession) Fallback(calldata []byte) (*types.Transaction, error) { + return _DelayedVetoable.Contract.Fallback(&_DelayedVetoable.TransactOpts, calldata) +} + +// Fallback is a paid mutator transaction binding the contract fallback function. +// +// Solidity: fallback() payable returns() +func (_DelayedVetoable *DelayedVetoableTransactorSession) Fallback(calldata []byte) (*types.Transaction, error) { + return _DelayedVetoable.Contract.Fallback(&_DelayedVetoable.TransactOpts, calldata) +} + +// Receive is a paid mutator transaction binding the contract receive function. +// +// Solidity: receive() payable returns() +func (_DelayedVetoable *DelayedVetoableTransactor) Receive(opts *bind.TransactOpts) (*types.Transaction, error) { + return _DelayedVetoable.contract.RawTransact(opts, nil) // calldata is disallowed for receive function +} + +// Receive is a paid mutator transaction binding the contract receive function. +// +// Solidity: receive() payable returns() +func (_DelayedVetoable *DelayedVetoableSession) Receive() (*types.Transaction, error) { + return _DelayedVetoable.Contract.Receive(&_DelayedVetoable.TransactOpts) +} + +// Receive is a paid mutator transaction binding the contract receive function. +// +// Solidity: receive() payable returns() +func (_DelayedVetoable *DelayedVetoableTransactorSession) Receive() (*types.Transaction, error) { + return _DelayedVetoable.Contract.Receive(&_DelayedVetoable.TransactOpts) +} + +// DelayedVetoableForwardedIterator is returned from FilterForwarded and is used to iterate over the raw logs and unpacked data for Forwarded events raised by the DelayedVetoable contract. +type DelayedVetoableForwardedIterator struct { + Event *DelayedVetoableForwarded // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *DelayedVetoableForwardedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(DelayedVetoableForwarded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(DelayedVetoableForwarded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *DelayedVetoableForwardedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *DelayedVetoableForwardedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// DelayedVetoableForwarded represents a Forwarded event raised by the DelayedVetoable contract. +type DelayedVetoableForwarded struct { + CallHash [32]byte + Data []byte + Raw types.Log // Blockchain specific contextual infos +} + +// FilterForwarded is a free log retrieval operation binding the contract event 0x4c109d85bcd0bb5c735b4be850953d652afe4cd9aa2e0b1426a65a4dcb2e1229. +// +// Solidity: event Forwarded(bytes32 indexed callHash, bytes data) +func (_DelayedVetoable *DelayedVetoableFilterer) FilterForwarded(opts *bind.FilterOpts, callHash [][32]byte) (*DelayedVetoableForwardedIterator, error) { + + var callHashRule []interface{} + for _, callHashItem := range callHash { + callHashRule = append(callHashRule, callHashItem) + } + + logs, sub, err := _DelayedVetoable.contract.FilterLogs(opts, "Forwarded", callHashRule) + if err != nil { + return nil, err + } + return &DelayedVetoableForwardedIterator{contract: _DelayedVetoable.contract, event: "Forwarded", logs: logs, sub: sub}, nil +} + +// WatchForwarded is a free log subscription operation binding the contract event 0x4c109d85bcd0bb5c735b4be850953d652afe4cd9aa2e0b1426a65a4dcb2e1229. +// +// Solidity: event Forwarded(bytes32 indexed callHash, bytes data) +func (_DelayedVetoable *DelayedVetoableFilterer) WatchForwarded(opts *bind.WatchOpts, sink chan<- *DelayedVetoableForwarded, callHash [][32]byte) (event.Subscription, error) { + + var callHashRule []interface{} + for _, callHashItem := range callHash { + callHashRule = append(callHashRule, callHashItem) + } + + logs, sub, err := _DelayedVetoable.contract.WatchLogs(opts, "Forwarded", callHashRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(DelayedVetoableForwarded) + if err := _DelayedVetoable.contract.UnpackLog(event, "Forwarded", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseForwarded is a log parse operation binding the contract event 0x4c109d85bcd0bb5c735b4be850953d652afe4cd9aa2e0b1426a65a4dcb2e1229. +// +// Solidity: event Forwarded(bytes32 indexed callHash, bytes data) +func (_DelayedVetoable *DelayedVetoableFilterer) ParseForwarded(log types.Log) (*DelayedVetoableForwarded, error) { + event := new(DelayedVetoableForwarded) + if err := _DelayedVetoable.contract.UnpackLog(event, "Forwarded", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// DelayedVetoableInitiatedIterator is returned from FilterInitiated and is used to iterate over the raw logs and unpacked data for Initiated events raised by the DelayedVetoable contract. +type DelayedVetoableInitiatedIterator struct { + Event *DelayedVetoableInitiated // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *DelayedVetoableInitiatedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(DelayedVetoableInitiated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(DelayedVetoableInitiated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *DelayedVetoableInitiatedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *DelayedVetoableInitiatedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// DelayedVetoableInitiated represents a Initiated event raised by the DelayedVetoable contract. +type DelayedVetoableInitiated struct { + CallHash [32]byte + Data []byte + Raw types.Log // Blockchain specific contextual infos +} + +// FilterInitiated is a free log retrieval operation binding the contract event 0x87a332a414acbc7da074543639ce7ae02ff1ea72e88379da9f261b080beb5a13. +// +// Solidity: event Initiated(bytes32 indexed callHash, bytes data) +func (_DelayedVetoable *DelayedVetoableFilterer) FilterInitiated(opts *bind.FilterOpts, callHash [][32]byte) (*DelayedVetoableInitiatedIterator, error) { + + var callHashRule []interface{} + for _, callHashItem := range callHash { + callHashRule = append(callHashRule, callHashItem) + } + + logs, sub, err := _DelayedVetoable.contract.FilterLogs(opts, "Initiated", callHashRule) + if err != nil { + return nil, err + } + return &DelayedVetoableInitiatedIterator{contract: _DelayedVetoable.contract, event: "Initiated", logs: logs, sub: sub}, nil +} + +// WatchInitiated is a free log subscription operation binding the contract event 0x87a332a414acbc7da074543639ce7ae02ff1ea72e88379da9f261b080beb5a13. +// +// Solidity: event Initiated(bytes32 indexed callHash, bytes data) +func (_DelayedVetoable *DelayedVetoableFilterer) WatchInitiated(opts *bind.WatchOpts, sink chan<- *DelayedVetoableInitiated, callHash [][32]byte) (event.Subscription, error) { + + var callHashRule []interface{} + for _, callHashItem := range callHash { + callHashRule = append(callHashRule, callHashItem) + } + + logs, sub, err := _DelayedVetoable.contract.WatchLogs(opts, "Initiated", callHashRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(DelayedVetoableInitiated) + if err := _DelayedVetoable.contract.UnpackLog(event, "Initiated", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseInitiated is a log parse operation binding the contract event 0x87a332a414acbc7da074543639ce7ae02ff1ea72e88379da9f261b080beb5a13. +// +// Solidity: event Initiated(bytes32 indexed callHash, bytes data) +func (_DelayedVetoable *DelayedVetoableFilterer) ParseInitiated(log types.Log) (*DelayedVetoableInitiated, error) { + event := new(DelayedVetoableInitiated) + if err := _DelayedVetoable.contract.UnpackLog(event, "Initiated", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// DelayedVetoableVetoedIterator is returned from FilterVetoed and is used to iterate over the raw logs and unpacked data for Vetoed events raised by the DelayedVetoable contract. +type DelayedVetoableVetoedIterator struct { + Event *DelayedVetoableVetoed // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *DelayedVetoableVetoedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(DelayedVetoableVetoed) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(DelayedVetoableVetoed) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *DelayedVetoableVetoedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *DelayedVetoableVetoedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// DelayedVetoableVetoed represents a Vetoed event raised by the DelayedVetoable contract. +type DelayedVetoableVetoed struct { + CallHash [32]byte + Data []byte + Raw types.Log // Blockchain specific contextual infos +} + +// FilterVetoed is a free log retrieval operation binding the contract event 0xbede6852c1d97d93ff557f676de76670cd0dec861e7fe8beb13aa0ba2b0ab040. +// +// Solidity: event Vetoed(bytes32 indexed callHash, bytes data) +func (_DelayedVetoable *DelayedVetoableFilterer) FilterVetoed(opts *bind.FilterOpts, callHash [][32]byte) (*DelayedVetoableVetoedIterator, error) { + + var callHashRule []interface{} + for _, callHashItem := range callHash { + callHashRule = append(callHashRule, callHashItem) + } + + logs, sub, err := _DelayedVetoable.contract.FilterLogs(opts, "Vetoed", callHashRule) + if err != nil { + return nil, err + } + return &DelayedVetoableVetoedIterator{contract: _DelayedVetoable.contract, event: "Vetoed", logs: logs, sub: sub}, nil +} + +// WatchVetoed is a free log subscription operation binding the contract event 0xbede6852c1d97d93ff557f676de76670cd0dec861e7fe8beb13aa0ba2b0ab040. +// +// Solidity: event Vetoed(bytes32 indexed callHash, bytes data) +func (_DelayedVetoable *DelayedVetoableFilterer) WatchVetoed(opts *bind.WatchOpts, sink chan<- *DelayedVetoableVetoed, callHash [][32]byte) (event.Subscription, error) { + + var callHashRule []interface{} + for _, callHashItem := range callHash { + callHashRule = append(callHashRule, callHashItem) + } + + logs, sub, err := _DelayedVetoable.contract.WatchLogs(opts, "Vetoed", callHashRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(DelayedVetoableVetoed) + if err := _DelayedVetoable.contract.UnpackLog(event, "Vetoed", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseVetoed is a log parse operation binding the contract event 0xbede6852c1d97d93ff557f676de76670cd0dec861e7fe8beb13aa0ba2b0ab040. +// +// Solidity: event Vetoed(bytes32 indexed callHash, bytes data) +func (_DelayedVetoable *DelayedVetoableFilterer) ParseVetoed(log types.Log) (*DelayedVetoableVetoed, error) { + event := new(DelayedVetoableVetoed) + if err := _DelayedVetoable.contract.UnpackLog(event, "Vetoed", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} diff --git a/op-bindings/bindings/delayedvetoable_more.go b/op-bindings/bindings/delayedvetoable_more.go new file mode 100644 index 000000000000..fd801c7dd680 --- /dev/null +++ b/op-bindings/bindings/delayedvetoable_more.go @@ -0,0 +1,25 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package bindings + +import ( + "encoding/json" + + "github.com/ethereum-optimism/optimism/op-bindings/solc" +) + +const DelayedVetoableStorageLayoutJSON = "{\"storage\":[{\"astId\":1000,\"contract\":\"src/L1/DelayedVetoable.sol:DelayedVetoable\",\"label\":\"_target\",\"offset\":0,\"slot\":\"0\",\"type\":\"t_address\"},{\"astId\":1001,\"contract\":\"src/L1/DelayedVetoable.sol:DelayedVetoable\",\"label\":\"_vetoer\",\"offset\":0,\"slot\":\"1\",\"type\":\"t_address\"},{\"astId\":1002,\"contract\":\"src/L1/DelayedVetoable.sol:DelayedVetoable\",\"label\":\"_initiator\",\"offset\":0,\"slot\":\"2\",\"type\":\"t_address\"},{\"astId\":1003,\"contract\":\"src/L1/DelayedVetoable.sol:DelayedVetoable\",\"label\":\"_queuedAt\",\"offset\":0,\"slot\":\"3\",\"type\":\"t_mapping(t_bytes32,t_uint256)\"},{\"astId\":1004,\"contract\":\"src/L1/DelayedVetoable.sol:DelayedVetoable\",\"label\":\"_delay\",\"offset\":0,\"slot\":\"4\",\"type\":\"t_uint256\"}],\"types\":{\"t_address\":{\"encoding\":\"inplace\",\"label\":\"address\",\"numberOfBytes\":\"20\"},\"t_bytes32\":{\"encoding\":\"inplace\",\"label\":\"bytes32\",\"numberOfBytes\":\"32\"},\"t_mapping(t_bytes32,t_uint256)\":{\"encoding\":\"mapping\",\"label\":\"mapping(bytes32 =\u003e uint256)\",\"numberOfBytes\":\"32\",\"key\":\"t_bytes32\",\"value\":\"t_uint256\"},\"t_uint256\":{\"encoding\":\"inplace\",\"label\":\"uint256\",\"numberOfBytes\":\"32\"}}}" + +var DelayedVetoableStorageLayout = new(solc.StorageLayout) + +var DelayedVetoableDeployedBin = "0x60806040526004361061005e5760003560e01c80636a42b8f8116100435780636a42b8f8146100da578063d4b83992146100fd578063d8bff440146101125761006d565b806354fd4d50146100755780635c39fcc1146100a05761006d565b3661006d5761006b610127565b005b61006b610127565b34801561008157600080fd5b5061008a6103fd565b6040516100979190610692565b60405180910390f35b3480156100ac57600080fd5b506100b56104a0565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610097565b3480156100e657600080fd5b506100ef6104cf565b604051908152602001610097565b34801561010957600080fd5b506100b56104dd565b34801561011e57600080fd5b506100b5610501565b600080366040516101399291906106e3565b60405190819003902060025490915073ffffffffffffffffffffffffffffffffffffffff16331480156101785750600081815260036020526040902054155b156101cb576000818152600360205260408082204290555182917f87a332a414acbc7da074543639ce7ae02ff1ea72e88379da9f261b080beb5a13916101c0919036906106f3565b60405180910390a250565b60015473ffffffffffffffffffffffffffffffffffffffff16331480156101ff575060008181526003602052604090205415155b80156102265750600454600082815260036020526040902054610222919061076f565b4211155b1561026e576000818152600360205260408082208290555182917fbede6852c1d97d93ff557f676de76670cd0dec861e7fe8beb13aa0ba2b0ab040916101c0919036906106f3565b60008181526003602052604081205490036102db576002546040517f295a81c100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff909116600482015233602482015260440160405180910390fd5b60045460008281526003602052604090205442916102f89161076f565b1015610330576040517f43dc986d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000818152600360205260408082208290555182917f4c109d85bcd0bb5c735b4be850953d652afe4cd9aa2e0b1426a65a4dcb2e122991610373919036906106f3565b60405180910390a26000805460405173ffffffffffffffffffffffffffffffffffffffff909116906103a890839036906106e3565b6000604051808303816000865af19150503d80600081146103e5576040519150601f19603f3d011682016040523d82523d6000602084013e6103ea565b606091505b50509050806103f8573d6000fd5b3d6000f35b60606104287f0000000000000000000000000000000000000000000000000000000000000000610525565b6104517f0000000000000000000000000000000000000000000000000000000000000000610525565b61047a7f0000000000000000000000000000000000000000000000000000000000000000610525565b60405160200161048c93929190610787565b604051602081830303815290604052905090565b6000336104c4575060025473ffffffffffffffffffffffffffffffffffffffff1690565b6104cc610127565b90565b6000336104c4575060045490565b6000336104c4575060005473ffffffffffffffffffffffffffffffffffffffff1690565b6000336104c4575060015473ffffffffffffffffffffffffffffffffffffffff1690565b60608160000361056857505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115610592578061057c816107fd565b915061058b9050600a83610864565b915061056c565b60008167ffffffffffffffff8111156105ad576105ad610878565b6040519080825280601f01601f1916602001820160405280156105d7576020820181803683370190505b5090505b841561065a576105ec6001836108a7565b91506105f9600a866108be565b61060490603061076f565b60f81b818381518110610619576106196108d2565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350610653600a86610864565b94506105db565b949350505050565b60005b8381101561067d578181015183820152602001610665565b8381111561068c576000848401525b50505050565b60208152600082518060208401526106b1816040850160208701610662565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b8183823760009101908152919050565b60208152816020820152818360408301376000818301604090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0160101919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000821982111561078257610782610740565b500190565b60008451610799818460208901610662565b80830190507f2e0000000000000000000000000000000000000000000000000000000000000080825285516107d5816001850160208a01610662565b600192019182015283516107f0816002840160208801610662565b0160020195945050505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361082e5761082e610740565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60008261087357610873610835565b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000828210156108b9576108b9610740565b500390565b6000826108cd576108cd610835565b500690565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fdfea164736f6c634300080f000a" + +func init() { + if err := json.Unmarshal([]byte(DelayedVetoableStorageLayoutJSON), DelayedVetoableStorageLayout); err != nil { + panic(err) + } + + layouts["DelayedVetoable"] = DelayedVetoableStorageLayout + deployedBytecodes["DelayedVetoable"] = DelayedVetoableDeployedBin +} From abd752e2df286de67f8dfeef64bed4b3e743d59e Mon Sep 17 00:00:00 2001 From: Maurelian Date: Mon, 11 Sep 2023 14:03:12 -0400 Subject: [PATCH 39/87] feat(ctb): make vetoer and iniator getters virtual This will facilitate reusability of this contract, as a future change will put the these values in to another contract. --- packages/contracts-bedrock/src/L1/DelayedVetoable.sol | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/contracts-bedrock/src/L1/DelayedVetoable.sol b/packages/contracts-bedrock/src/L1/DelayedVetoable.sol index 386ab36e01cd..c8b6cd165790 100644 --- a/packages/contracts-bedrock/src/L1/DelayedVetoable.sol +++ b/packages/contracts-bedrock/src/L1/DelayedVetoable.sol @@ -73,13 +73,13 @@ contract DelayedVetoable is Semver { /// @notice Gets the initiator /// @return Initiator address. - function initiator() external readOrHandle returns (address) { + function initiator() external virtual readOrHandle returns (address) { return _initiator; } //// @notice Queries the vetoer address. /// @return Vetoer address. - function vetoer() external readOrHandle returns (address) { + function vetoer() external virtual readOrHandle returns (address) { return _vetoer; } From 12c9e3b78842b60001fb051f3df0f60c7eac1077 Mon Sep 17 00:00:00 2001 From: Maurelian Date: Tue, 12 Sep 2023 16:47:05 -0400 Subject: [PATCH 40/87] chore(ctb): Update semver and import path --- packages/contracts-bedrock/src/L1/DelayedVetoable.sol | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/packages/contracts-bedrock/src/L1/DelayedVetoable.sol b/packages/contracts-bedrock/src/L1/DelayedVetoable.sol index c8b6cd165790..709b5ac334e6 100644 --- a/packages/contracts-bedrock/src/L1/DelayedVetoable.sol +++ b/packages/contracts-bedrock/src/L1/DelayedVetoable.sol @@ -1,9 +1,9 @@ // SPDX-License-Identifier: MIT pragma solidity 0.8.15; -import { Semver } from "../universal/Semver.sol"; +import { ISemver } from "src/universal/ISemver.sol"; -contract DelayedVetoable is Semver { +contract DelayedVetoable is ISemver { /// @notice Error for when attempting to forward too early. error ForwardingEarly(); @@ -58,13 +58,16 @@ contract DelayedVetoable is Semver { } } + /// @notice Semantic version. /// @custom:semver 0.0.1 + string public constant version = "0.0.1"; + /// @notice Sets the target admin during contract deployment. /// @param vetoer_ Address of the vetoer. /// @param initiator_ Address of the initiator. /// @param target_ Address of the target. /// @param delay_ Address of the delay. - constructor(address vetoer_, address initiator_, address target_, uint256 delay_) Semver(0, 0, 1) { + constructor(address vetoer_, address initiator_, address target_, uint256 delay_) { _vetoer = vetoer_; _initiator = initiator_; _target = target_; From e096a62e03f2b87359f736ddbec100295ccf0792 Mon Sep 17 00:00:00 2001 From: Maurelian Date: Wed, 13 Sep 2023 09:15:02 -0400 Subject: [PATCH 41/87] feat(ctb): Make storage variables immutable This contract is not intended to be upgradeable. --- packages/contracts-bedrock/src/L1/DelayedVetoable.sol | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/packages/contracts-bedrock/src/L1/DelayedVetoable.sol b/packages/contracts-bedrock/src/L1/DelayedVetoable.sol index 709b5ac334e6..5c94218445d3 100644 --- a/packages/contracts-bedrock/src/L1/DelayedVetoable.sol +++ b/packages/contracts-bedrock/src/L1/DelayedVetoable.sol @@ -29,15 +29,13 @@ contract DelayedVetoable is ISemver { event Vetoed(bytes32 indexed callHash, bytes data); /// @notice The address that all calls are forwarded to after the delay. - address internal _target; + address internal immutable _target; - // TODO(maurelian): move this to the new SuperChainConfig contract /// @notice The address that can veto a call. - address internal _vetoer; + address internal immutable _vetoer; - // TODO(maurelian): move this to the new SuperChainConfig contract /// @notice The address that can initiate a call. - address internal _initiator; + address internal immutable _initiator; /// @notice The time that a call was initiated. mapping(bytes32 => uint256) internal _queuedAt; From f95b314013a9595ef80ccaa08ef295c4d07b4fe6 Mon Sep 17 00:00:00 2001 From: Maurelian Date: Wed, 13 Sep 2023 09:16:39 -0400 Subject: [PATCH 42/87] feat(ctb): Remove ability to receive eth We don't expect to need this, and it adds complexity to the message digest which we'd prefer to avoid. --- .../contracts-bedrock/src/L1/DelayedVetoable.sol | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/packages/contracts-bedrock/src/L1/DelayedVetoable.sol b/packages/contracts-bedrock/src/L1/DelayedVetoable.sol index 5c94218445d3..942f35ba1ab4 100644 --- a/packages/contracts-bedrock/src/L1/DelayedVetoable.sol +++ b/packages/contracts-bedrock/src/L1/DelayedVetoable.sol @@ -96,18 +96,8 @@ contract DelayedVetoable is ISemver { return _delay; } - // TODO(maurelian): Remove this? The contract currently cannot handle forwarding ETH and I'm - // not sure the complexity is warranted. - // If we do allow it: - // 1. the callHash will need to include the value - // 2. forwarding will need to be done by passing the callHash, rather than the unhashed data - /// @notice Used when no data is passed to the contract. - receive() external payable { - _handleCall(); - } - /// @notice Used for all calls that pass data to the contract. - fallback() external payable { + fallback() external { _handleCall(); } From 70df6757d940321059f5fbfeb0681d272a300100 Mon Sep 17 00:00:00 2001 From: Maurelian Date: Wed, 13 Sep 2023 23:39:54 -0400 Subject: [PATCH 43/87] feat(ctb): Start with a delay of zero and forward instantly This allows us to include this contract in the initial deployment without having to swap it in later. feat(ctb): Add missing annotations --- .../src/L1/DelayedVetoable.sol | 55 +++++++++++++++++-- .../test/DelayedVetoable.t.sol | 54 +++++++++++++++--- 2 files changed, 94 insertions(+), 15 deletions(-) diff --git a/packages/contracts-bedrock/src/L1/DelayedVetoable.sol b/packages/contracts-bedrock/src/L1/DelayedVetoable.sol index 942f35ba1ab4..ec86ce12e299 100644 --- a/packages/contracts-bedrock/src/L1/DelayedVetoable.sol +++ b/packages/contracts-bedrock/src/L1/DelayedVetoable.sol @@ -4,6 +4,9 @@ pragma solidity 0.8.15; import { ISemver } from "src/universal/ISemver.sol"; contract DelayedVetoable is ISemver { + /// @notice Error for when the delay has already been set. + error AlreadyDelayed(); + /// @notice Error for when attempting to forward too early. error ForwardingEarly(); @@ -13,6 +16,10 @@ contract DelayedVetoable is ISemver { /// @notice Error for unauthorized calls. error Unauthorized(address expected, address actual); + /// @notice An event that is emitted when the delay is activated. + /// @param delay The delay that was activated. + event DelayActivated(uint256 delay); + /// @notice An event that is emitted when a call is initiated. /// @param callHash The hash of the call data. /// @param data The data of the initiated call. @@ -37,12 +44,15 @@ contract DelayedVetoable is ISemver { /// @notice The address that can initiate a call. address internal immutable _initiator; + /// @notice The current amount of time to wait before forwarding a call. + uint256 internal _delay; + + /// @notice The delay which will be set after the initial system deployment is completed. + uint256 internal immutable _operatingDelay; + /// @notice The time that a call was initiated. mapping(bytes32 => uint256) internal _queuedAt; - /// @notice The time to wait before forwarding a call. - uint256 internal _delay; - /// @notice A modifier that reverts if not called by the vetoer or by address(0) to allow /// eth_call to interact with this proxy without needing to use low-level storage /// inspection. We assume that nobody is able to trigger calls from address(0) during @@ -64,12 +74,13 @@ contract DelayedVetoable is ISemver { /// @param vetoer_ Address of the vetoer. /// @param initiator_ Address of the initiator. /// @param target_ Address of the target. - /// @param delay_ Address of the delay. - constructor(address vetoer_, address initiator_, address target_, uint256 delay_) { + /// @param operatingDelay_ Time to delay when the system is operational. + constructor(address vetoer_, address initiator_, address target_, uint256 operatingDelay_) { _vetoer = vetoer_; _initiator = initiator_; _target = target_; - _delay = delay_; + _delay = 0; + _operatingDelay = operatingDelay_; } /// @notice Gets the initiator @@ -96,6 +107,13 @@ contract DelayedVetoable is ISemver { return _delay; } + /// @notice Gets entries in the _queuedAt mapping. + /// @param callHash The hash of the call data. + /// @return The time the callHash was recorded. + function queuedAt(bytes32 callHash) external readOrHandle returns (uint256) { + return _queuedAt[callHash]; + } + /// @notice Used for all calls that pass data to the contract. fallback() external { _handleCall(); @@ -105,10 +123,24 @@ contract DelayedVetoable is ISemver { /// This enables transparent initiation and forwarding of calls to the target and avoids /// the need for additional layers of abi encoding. function _handleCall() internal { + // The initiator and vetoer activate the delay by passing in null data. + if (msg.data.length == 0) { + if (msg.sender != _initiator && msg.sender != _vetoer) { + // todo(maurelian): make this error have an expected array. + revert Unauthorized(_initiator, msg.sender); + } + _activateDelay(); + return; + } + bytes32 callHash = keccak256(msg.data); // Case 1: The initiator is calling the contract to initiate a call. if (msg.sender == _initiator && _queuedAt[callHash] == 0) { + if (_delay == 0) { + // This forward function will halt the call frame on completion. + _forwardAndHalt(callHash, msg.data); + } _queuedAt[callHash] = block.timestamp; emit Initiated(callHash, msg.data); return; @@ -135,7 +167,11 @@ contract DelayedVetoable is ISemver { // Delete the call to prevent replays delete _queuedAt[callHash]; + _forwardAndHalt(callHash, msg.data); + } + /// @notice Forwards the call to the target and halts the call frame. + function _forwardAndHalt(bytes32 callHash, bytes memory data) internal { // Forward the call emit Forwarded(callHash, msg.data); (bool success,) = _target.call(msg.data); @@ -147,4 +183,11 @@ contract DelayedVetoable is ISemver { return(0x0, returndatasize()) } } + + /// @notice Sets the delay to the operating delay. + function _activateDelay() internal { + if (_delay != 0) revert AlreadyDelayed(); + _delay = _operatingDelay; + emit DelayActivated(_delay); + } } diff --git a/packages/contracts-bedrock/test/DelayedVetoable.t.sol b/packages/contracts-bedrock/test/DelayedVetoable.t.sol index d13999b3a1b4..1c9c0c5aa89f 100644 --- a/packages/contracts-bedrock/test/DelayedVetoable.t.sol +++ b/packages/contracts-bedrock/test/DelayedVetoable.t.sol @@ -15,7 +15,7 @@ contract DelayedVetoable_Init is CommonTest { address target = address(0xabba); address initiator = alice; address vetoer = bob; - uint256 delay = 14 days; + uint256 operatingDelay = 14 days; DelayedVetoable delayedVetoable; Reverter reverter; @@ -25,8 +25,14 @@ contract DelayedVetoable_Init is CommonTest { initiator_: alice, vetoer_: bob, target_: address(target), - delay_: delay + operatingDelay_: operatingDelay }); + // Most tests will use the operating delay, so we call as the initiator with null data + // to set the delay. For tests that need to use the initial zero delay, we'll modify the + // value in storage. + vm.prank(initiator); + (bool success,) = address(delayedVetoable).call(hex""); + reverter = new Reverter(); } } @@ -37,7 +43,7 @@ contract DelayedVetoable_Getters_Test is DelayedVetoable_Init { assertEq(delayedVetoable.initiator(), initiator); assertEq(delayedVetoable.vetoer(), vetoer); assertEq(delayedVetoable.target(), target); - assertEq(delayedVetoable.delay(), delay); + assertEq(delayedVetoable.delay(), operatingDelay); } } @@ -57,7 +63,12 @@ contract DelayedVetoable_Getters_TestFail is DelayedVetoable_Init { } contract DelayedVetoable_HandleCall_Test is DelayedVetoable_Init { + /// @dev A call can be initiated by the initiator. function testFuzz_handleCall_initiation_succeeds(bytes memory data) external { + // Calls with no data are used to activate the delay and are not valid otherwise, + // so we assume a non-zero data value. + vm.assume(data.length > 0); + vm.expectEmit(true, false, false, true, address(delayedVetoable)); emit Initiated(keccak256(data), data); @@ -66,12 +77,32 @@ contract DelayedVetoable_HandleCall_Test is DelayedVetoable_Init { assert(success); } - function testFuzz_handleCall_forwarding_succeeds(bytes memory data) external { - // Initiate the call + /// @dev The delay is inititially set to zero and the call is immediately forwarded. + function testFuzz_handleCall_initialForwardingImmediately_succeeds(bytes memory data) external { + // Calls with no data are used to activate the delay and are not valid otherwise, + // so we assume a non-zero data value. + vm.assume(data.length > 0); + + // Reset the delay to zero + vm.store(address(delayedVetoable), bytes32(uint256(0)), bytes32(uint256(0))); + + vm.prank(initiator); + vm.expectEmit(true, false, false, true, address(delayedVetoable)); + vm.expectCall({ callee: target, data: data }); + emit Forwarded(keccak256(data), data); + (bool success,) = address(delayedVetoable).call(data); + assert(success); + } + + /// @dev The delay can be activated by the vetoer or initiator, and are not forwarded until the delay has passed + /// once activated. + function testFuzz_handleCall_forwardingWithDelay_succeeds(bytes memory data) external { + vm.assume(data.length > 0); vm.prank(initiator); + // it's immediately forwarding for some reason. (bool success,) = address(delayedVetoable).call(data); - vm.warp(block.timestamp + delay); + vm.warp(block.timestamp + operatingDelay); vm.expectEmit(true, false, false, true, address(delayedVetoable)); emit Forwarded(keccak256(data), data); @@ -82,12 +113,14 @@ contract DelayedVetoable_HandleCall_Test is DelayedVetoable_Init { } contract DelayedVetoable_HandleCall_TestFail is DelayedVetoable_Init { + /// @dev The delay is inititially set to zero and the call is immediately forwarded. function test_handleCall_unauthorizedInitiation_reverts() external { vm.expectRevert(abi.encodeWithSelector(Unauthorized.selector, initiator, address(this))); - (bool success,) = address(delayedVetoable).call(hex""); + (bool success,) = address(delayedVetoable).call(NON_ZERO_DATA); assert(success); } + /// @dev The call cannot be forewarded until the delay has passed. function test_handleCall_forwardingTooSoon_reverts(bytes memory data) external { vm.prank(initiator); (bool success,) = address(delayedVetoable).call(data); @@ -97,15 +130,17 @@ contract DelayedVetoable_HandleCall_TestFail is DelayedVetoable_Init { assertFalse(success); } + /// @dev The call cannot be forwarded a second time. function test_handleCall_forwardingTwice_reverts(bytes memory data) external { // Initiate the call vm.prank(initiator); (bool success,) = address(delayedVetoable).call(data); - vm.warp(block.timestamp + delay); + vm.warp(block.timestamp + operatingDelay); vm.expectEmit(true, false, false, true, address(delayedVetoable)); emit Forwarded(keccak256(data), data); + // Forward the call vm.expectCall({ callee: target, data: data }); (success,) = address(delayedVetoable).call(data); assert(success); @@ -116,13 +151,14 @@ contract DelayedVetoable_HandleCall_TestFail is DelayedVetoable_Init { assert(success); } + /// @dev If the target reverts, it is bubbled up. function test_handleCall_forwardingTargetReverts_reverts(bytes memory data) external { vm.etch(target, address(reverter).code); vm.prank(initiator); (bool success,) = address(delayedVetoable).call(data); - vm.warp(block.timestamp + delay); + vm.warp(block.timestamp + operatingDelay); vm.expectEmit(true, false, false, true, address(delayedVetoable)); emit Forwarded(keccak256(data), data); From af490bbf8057039abe8485e13922d3eab74be68c Mon Sep 17 00:00:00 2001 From: Maurelian Date: Thu, 14 Sep 2023 14:19:22 -0400 Subject: [PATCH 44/87] chore(ctb): Allow vetoing after the delay test(ctb): Some DV test clean up --- .../src/L1/DelayedVetoable.sol | 4 ++- .../test/DelayedVetoable.t.sol | 25 +++++++++++++------ 2 files changed, 20 insertions(+), 9 deletions(-) diff --git a/packages/contracts-bedrock/src/L1/DelayedVetoable.sol b/packages/contracts-bedrock/src/L1/DelayedVetoable.sol index ec86ce12e299..882ea6ebfa55 100644 --- a/packages/contracts-bedrock/src/L1/DelayedVetoable.sol +++ b/packages/contracts-bedrock/src/L1/DelayedVetoable.sol @@ -147,7 +147,9 @@ contract DelayedVetoable is ISemver { } // Case 2: The vetoer is calling the contract to veto a call. - if (msg.sender == _vetoer && _queuedAt[callHash] != 0 && block.timestamp <= _queuedAt[callHash] + _delay) { + // Note: The vetoer retains the ability to veto even after the delay has passed. This makes censoring the vetoer + // more costly, as there is no time limit after which their transaction can be included. + if (msg.sender == _vetoer && _queuedAt[callHash] != 0) { delete _queuedAt[callHash]; emit Vetoed(callHash, msg.data); return; diff --git a/packages/contracts-bedrock/test/DelayedVetoable.t.sol b/packages/contracts-bedrock/test/DelayedVetoable.t.sol index 1c9c0c5aa89f..988d1f84c39c 100644 --- a/packages/contracts-bedrock/test/DelayedVetoable.t.sol +++ b/packages/contracts-bedrock/test/DelayedVetoable.t.sol @@ -35,9 +35,16 @@ contract DelayedVetoable_Init is CommonTest { reverter = new Reverter(); } + + /// @dev This function is used to prevent initiating the delay unintentionally.. + /// @param data The data to be used in the call. + function assumeNonzeroData(bytes memory data) internal pure { + vm.assume(data.length > 0); + } } contract DelayedVetoable_Getters_Test is DelayedVetoable_Init { + /// @dev The getters return the expected values when called by the zero address. function test_getters() external { vm.startPrank(address(0)); assertEq(delayedVetoable.initiator(), initiator); @@ -49,8 +56,9 @@ contract DelayedVetoable_Getters_Test is DelayedVetoable_Init { contract DelayedVetoable_Getters_TestFail is DelayedVetoable_Init { function test_getters_notVetoer() external { - // getter calls from addresses other than the vetoer or zero address will revert in the + // getter calls from addresses other than the zero address will revert in the // initiation branch of the proxy. + vm.assume(msg.sender != address(0) && msg.sender != initiator && msg.sender != vetoer); vm.expectRevert(abi.encodeWithSelector(Unauthorized.selector, initiator, address(this))); delayedVetoable.initiator(); vm.expectRevert(abi.encodeWithSelector(Unauthorized.selector, initiator, address(this))); @@ -65,9 +73,7 @@ contract DelayedVetoable_Getters_TestFail is DelayedVetoable_Init { contract DelayedVetoable_HandleCall_Test is DelayedVetoable_Init { /// @dev A call can be initiated by the initiator. function testFuzz_handleCall_initiation_succeeds(bytes memory data) external { - // Calls with no data are used to activate the delay and are not valid otherwise, - // so we assume a non-zero data value. - vm.assume(data.length > 0); + assumeNonzeroData(data); vm.expectEmit(true, false, false, true, address(delayedVetoable)); emit Initiated(keccak256(data), data); @@ -79,9 +85,7 @@ contract DelayedVetoable_HandleCall_Test is DelayedVetoable_Init { /// @dev The delay is inititially set to zero and the call is immediately forwarded. function testFuzz_handleCall_initialForwardingImmediately_succeeds(bytes memory data) external { - // Calls with no data are used to activate the delay and are not valid otherwise, - // so we assume a non-zero data value. - vm.assume(data.length > 0); + assumeNonzeroData(data); // Reset the delay to zero vm.store(address(delayedVetoable), bytes32(uint256(0)), bytes32(uint256(0))); @@ -97,7 +101,8 @@ contract DelayedVetoable_HandleCall_Test is DelayedVetoable_Init { /// @dev The delay can be activated by the vetoer or initiator, and are not forwarded until the delay has passed /// once activated. function testFuzz_handleCall_forwardingWithDelay_succeeds(bytes memory data) external { - vm.assume(data.length > 0); + assumeNonzeroData(data); + vm.prank(initiator); // it's immediately forwarding for some reason. (bool success,) = address(delayedVetoable).call(data); @@ -132,6 +137,8 @@ contract DelayedVetoable_HandleCall_TestFail is DelayedVetoable_Init { /// @dev The call cannot be forwarded a second time. function test_handleCall_forwardingTwice_reverts(bytes memory data) external { + assumeNonzeroData(data); + // Initiate the call vm.prank(initiator); (bool success,) = address(delayedVetoable).call(data); @@ -153,6 +160,8 @@ contract DelayedVetoable_HandleCall_TestFail is DelayedVetoable_Init { /// @dev If the target reverts, it is bubbled up. function test_handleCall_forwardingTargetReverts_reverts(bytes memory data) external { + assumeNonzeroData(data); + vm.etch(target, address(reverter).code); vm.prank(initiator); From 1d099302d9183f01733c6bbc14af05c38816600c Mon Sep 17 00:00:00 2001 From: Maurelian Date: Thu, 14 Sep 2023 14:42:18 -0400 Subject: [PATCH 45/87] fix(ctb): Address compiler warnings fix(ctb): Fix names on fuzz tests --- .../src/L1/DelayedVetoable.sol | 36 +++++++++---------- .../test/DelayedVetoable.t.sol | 12 +++---- 2 files changed, 23 insertions(+), 25 deletions(-) diff --git a/packages/contracts-bedrock/src/L1/DelayedVetoable.sol b/packages/contracts-bedrock/src/L1/DelayedVetoable.sol index 882ea6ebfa55..0c8b45c7e96d 100644 --- a/packages/contracts-bedrock/src/L1/DelayedVetoable.sol +++ b/packages/contracts-bedrock/src/L1/DelayedVetoable.sol @@ -84,34 +84,34 @@ contract DelayedVetoable is ISemver { } /// @notice Gets the initiator - /// @return Initiator address. - function initiator() external virtual readOrHandle returns (address) { - return _initiator; + /// @return initiator_ Initiator address. + function initiator() external virtual readOrHandle returns (address initiator_) { + initiator_ = _initiator; } //// @notice Queries the vetoer address. - /// @return Vetoer address. - function vetoer() external virtual readOrHandle returns (address) { - return _vetoer; + /// @return vetoer_ Vetoer address. + function vetoer() external virtual readOrHandle returns (address vetoer_) { + vetoer_ = _vetoer; } //// @notice Queries the target address. - /// @return Target address. - function target() external readOrHandle returns (address) { - return _target; + /// @return target_ Target address. + function target() external readOrHandle returns (address target_) { + target_ = _target; } /// @notice Gets the delay - /// @return Delay address. - function delay() external readOrHandle returns (uint256) { - return _delay; + /// @return delay_ Delay address. + function delay() external readOrHandle returns (uint256 delay_) { + delay_ = _delay; } /// @notice Gets entries in the _queuedAt mapping. /// @param callHash The hash of the call data. - /// @return The time the callHash was recorded. - function queuedAt(bytes32 callHash) external readOrHandle returns (uint256) { - return _queuedAt[callHash]; + /// @return queuedAt_ The time the callHash was recorded. + function queuedAt(bytes32 callHash) external readOrHandle returns (uint256 queuedAt_) { + queuedAt_ = _queuedAt[callHash]; } /// @notice Used for all calls that pass data to the contract. @@ -139,7 +139,7 @@ contract DelayedVetoable is ISemver { if (msg.sender == _initiator && _queuedAt[callHash] == 0) { if (_delay == 0) { // This forward function will halt the call frame on completion. - _forwardAndHalt(callHash, msg.data); + _forwardAndHalt(callHash); } _queuedAt[callHash] = block.timestamp; emit Initiated(callHash, msg.data); @@ -169,11 +169,11 @@ contract DelayedVetoable is ISemver { // Delete the call to prevent replays delete _queuedAt[callHash]; - _forwardAndHalt(callHash, msg.data); + _forwardAndHalt(callHash); } /// @notice Forwards the call to the target and halts the call frame. - function _forwardAndHalt(bytes32 callHash, bytes memory data) internal { + function _forwardAndHalt(bytes32 callHash) internal { // Forward the call emit Forwarded(callHash, msg.data); (bool success,) = _target.call(msg.data); diff --git a/packages/contracts-bedrock/test/DelayedVetoable.t.sol b/packages/contracts-bedrock/test/DelayedVetoable.t.sol index 988d1f84c39c..6e989ff64a2d 100644 --- a/packages/contracts-bedrock/test/DelayedVetoable.t.sol +++ b/packages/contracts-bedrock/test/DelayedVetoable.t.sol @@ -55,10 +55,8 @@ contract DelayedVetoable_Getters_Test is DelayedVetoable_Init { } contract DelayedVetoable_Getters_TestFail is DelayedVetoable_Init { - function test_getters_notVetoer() external { - // getter calls from addresses other than the zero address will revert in the - // initiation branch of the proxy. - vm.assume(msg.sender != address(0) && msg.sender != initiator && msg.sender != vetoer); + /// @dev Check that getter calls from unauthorized entities will revert. + function test_getters_notZeroAddress_reverts() external { vm.expectRevert(abi.encodeWithSelector(Unauthorized.selector, initiator, address(this))); delayedVetoable.initiator(); vm.expectRevert(abi.encodeWithSelector(Unauthorized.selector, initiator, address(this))); @@ -126,7 +124,7 @@ contract DelayedVetoable_HandleCall_TestFail is DelayedVetoable_Init { } /// @dev The call cannot be forewarded until the delay has passed. - function test_handleCall_forwardingTooSoon_reverts(bytes memory data) external { + function testFuzz_handleCall_forwardingTooSoon_reverts(bytes memory data) external { vm.prank(initiator); (bool success,) = address(delayedVetoable).call(data); @@ -136,7 +134,7 @@ contract DelayedVetoable_HandleCall_TestFail is DelayedVetoable_Init { } /// @dev The call cannot be forwarded a second time. - function test_handleCall_forwardingTwice_reverts(bytes memory data) external { + function testFuzz_handleCall_forwardingTwice_reverts(bytes memory data) external { assumeNonzeroData(data); // Initiate the call @@ -159,7 +157,7 @@ contract DelayedVetoable_HandleCall_TestFail is DelayedVetoable_Init { } /// @dev If the target reverts, it is bubbled up. - function test_handleCall_forwardingTargetReverts_reverts(bytes memory data) external { + function testFuzz_handleCall_forwardingTargetReverts_reverts(bytes memory data) external { assumeNonzeroData(data); vm.etch(target, address(reverter).code); From 0a1ffdc460e228c4115f466ea9114da1de507f1d Mon Sep 17 00:00:00 2001 From: Maurelian Date: Thu, 14 Sep 2023 15:29:14 -0400 Subject: [PATCH 46/87] fix(ctb): Immutables scream like a snake --- .../src/L1/DelayedVetoable.sol | 42 ++++++++++--------- 1 file changed, 23 insertions(+), 19 deletions(-) diff --git a/packages/contracts-bedrock/src/L1/DelayedVetoable.sol b/packages/contracts-bedrock/src/L1/DelayedVetoable.sol index 0c8b45c7e96d..be08c0877605 100644 --- a/packages/contracts-bedrock/src/L1/DelayedVetoable.sol +++ b/packages/contracts-bedrock/src/L1/DelayedVetoable.sol @@ -3,6 +3,9 @@ pragma solidity 0.8.15; import { ISemver } from "src/universal/ISemver.sol"; +/// @title DelayedVetoable +/// @notice This contract enables a delay before a call is forwarded to a target contract, and during the delay period +/// the call can be vetoed by the authorized vetoer. contract DelayedVetoable is ISemver { /// @notice Error for when the delay has already been set. error AlreadyDelayed(); @@ -36,19 +39,19 @@ contract DelayedVetoable is ISemver { event Vetoed(bytes32 indexed callHash, bytes data); /// @notice The address that all calls are forwarded to after the delay. - address internal immutable _target; + address internal immutable TARGET; /// @notice The address that can veto a call. - address internal immutable _vetoer; + address internal immutable VETOER; /// @notice The address that can initiate a call. - address internal immutable _initiator; + address internal immutable INITIATOR; /// @notice The current amount of time to wait before forwarding a call. uint256 internal _delay; /// @notice The delay which will be set after the initial system deployment is completed. - uint256 internal immutable _operatingDelay; + uint256 internal immutable OPERATING_DELAY; /// @notice The time that a call was initiated. mapping(bytes32 => uint256) internal _queuedAt; @@ -76,29 +79,30 @@ contract DelayedVetoable is ISemver { /// @param target_ Address of the target. /// @param operatingDelay_ Time to delay when the system is operational. constructor(address vetoer_, address initiator_, address target_, uint256 operatingDelay_) { - _vetoer = vetoer_; - _initiator = initiator_; - _target = target_; - _delay = 0; - _operatingDelay = operatingDelay_; + // Note that the _delay value is not set here. Having an initial delay of 0 is helpful + // during the deployment of a new system. + VETOER = vetoer_; + INITIATOR = initiator_; + TARGET = target_; + OPERATING_DELAY = operatingDelay_; } /// @notice Gets the initiator /// @return initiator_ Initiator address. function initiator() external virtual readOrHandle returns (address initiator_) { - initiator_ = _initiator; + initiator_ = INITIATOR; } //// @notice Queries the vetoer address. /// @return vetoer_ Vetoer address. function vetoer() external virtual readOrHandle returns (address vetoer_) { - vetoer_ = _vetoer; + vetoer_ = VETOER; } //// @notice Queries the target address. /// @return target_ Target address. function target() external readOrHandle returns (address target_) { - target_ = _target; + target_ = TARGET; } /// @notice Gets the delay @@ -125,9 +129,9 @@ contract DelayedVetoable is ISemver { function _handleCall() internal { // The initiator and vetoer activate the delay by passing in null data. if (msg.data.length == 0) { - if (msg.sender != _initiator && msg.sender != _vetoer) { + if (msg.sender != INITIATOR && msg.sender != VETOER) { // todo(maurelian): make this error have an expected array. - revert Unauthorized(_initiator, msg.sender); + revert Unauthorized(INITIATOR, msg.sender); } _activateDelay(); return; @@ -136,7 +140,7 @@ contract DelayedVetoable is ISemver { bytes32 callHash = keccak256(msg.data); // Case 1: The initiator is calling the contract to initiate a call. - if (msg.sender == _initiator && _queuedAt[callHash] == 0) { + if (msg.sender == INITIATOR && _queuedAt[callHash] == 0) { if (_delay == 0) { // This forward function will halt the call frame on completion. _forwardAndHalt(callHash); @@ -149,7 +153,7 @@ contract DelayedVetoable is ISemver { // Case 2: The vetoer is calling the contract to veto a call. // Note: The vetoer retains the ability to veto even after the delay has passed. This makes censoring the vetoer // more costly, as there is no time limit after which their transaction can be included. - if (msg.sender == _vetoer && _queuedAt[callHash] != 0) { + if (msg.sender == VETOER && _queuedAt[callHash] != 0) { delete _queuedAt[callHash]; emit Vetoed(callHash, msg.data); return; @@ -159,7 +163,7 @@ contract DelayedVetoable is ISemver { // passed. if (_queuedAt[callHash] == 0) { // The call has not been initiated, so we'll treat this is an unauthorized initiation attempt. - revert Unauthorized(_initiator, msg.sender); + revert Unauthorized(INITIATOR, msg.sender); } if (_queuedAt[callHash] + _delay < block.timestamp) { @@ -176,7 +180,7 @@ contract DelayedVetoable is ISemver { function _forwardAndHalt(bytes32 callHash) internal { // Forward the call emit Forwarded(callHash, msg.data); - (bool success,) = _target.call(msg.data); + (bool success,) = TARGET.call(msg.data); assembly { // Success == 0 means a revert. We'll revert too and pass the data up. if iszero(success) { revert(0x0, returndatasize()) } @@ -189,7 +193,7 @@ contract DelayedVetoable is ISemver { /// @notice Sets the delay to the operating delay. function _activateDelay() internal { if (_delay != 0) revert AlreadyDelayed(); - _delay = _operatingDelay; + _delay = OPERATING_DELAY; emit DelayActivated(_delay); } } From a4c6644060e576b5ece3ed6cdd426f95d51b9a60 Mon Sep 17 00:00:00 2001 From: Maurelian Date: Thu, 14 Sep 2023 22:12:40 -0400 Subject: [PATCH 47/87] fix(ctb): Properly handle return data Also adds a test that checks the return data. --- .../src/L1/DelayedVetoable.sol | 23 ++++---- .../test/DelayedVetoable.t.sol | 56 ++++++++++--------- 2 files changed, 43 insertions(+), 36 deletions(-) diff --git a/packages/contracts-bedrock/src/L1/DelayedVetoable.sol b/packages/contracts-bedrock/src/L1/DelayedVetoable.sol index be08c0877605..6dcd21931839 100644 --- a/packages/contracts-bedrock/src/L1/DelayedVetoable.sol +++ b/packages/contracts-bedrock/src/L1/DelayedVetoable.sol @@ -47,12 +47,12 @@ contract DelayedVetoable is ISemver { /// @notice The address that can initiate a call. address internal immutable INITIATOR; - /// @notice The current amount of time to wait before forwarding a call. - uint256 internal _delay; - /// @notice The delay which will be set after the initial system deployment is completed. uint256 internal immutable OPERATING_DELAY; + /// @notice The current amount of time to wait before forwarding a call. + uint256 internal _delay; + /// @notice The time that a call was initiated. mapping(bytes32 => uint256) internal _queuedAt; @@ -130,7 +130,6 @@ contract DelayedVetoable is ISemver { // The initiator and vetoer activate the delay by passing in null data. if (msg.data.length == 0) { if (msg.sender != INITIATOR && msg.sender != VETOER) { - // todo(maurelian): make this error have an expected array. revert Unauthorized(INITIATOR, msg.sender); } _activateDelay(); @@ -180,13 +179,15 @@ contract DelayedVetoable is ISemver { function _forwardAndHalt(bytes32 callHash) internal { // Forward the call emit Forwarded(callHash, msg.data); - (bool success,) = TARGET.call(msg.data); - assembly { - // Success == 0 means a revert. We'll revert too and pass the data up. - if iszero(success) { revert(0x0, returndatasize()) } - - // Otherwise we'll just return and pass the data up. - return(0x0, returndatasize()) + (bool success, bytes memory returndata) = TARGET.call(msg.data); + if (success == true) { + assembly { + return(add(returndata, 0x20), mload(returndata)) + } + } else { + assembly { + revert(add(returndata, 0x20), mload(returndata)) + } } } diff --git a/packages/contracts-bedrock/test/DelayedVetoable.t.sol b/packages/contracts-bedrock/test/DelayedVetoable.t.sol index 6e989ff64a2d..9093ca36fdbf 100644 --- a/packages/contracts-bedrock/test/DelayedVetoable.t.sol +++ b/packages/contracts-bedrock/test/DelayedVetoable.t.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: MIT pragma solidity 0.8.15; -import { CommonTest, Reverter } from "./CommonTest.t.sol"; +import { CommonTest } from "./CommonTest.t.sol"; import { DelayedVetoable } from "../src/L1/DelayedVetoable.sol"; contract DelayedVetoable_Init is CommonTest { @@ -17,7 +17,6 @@ contract DelayedVetoable_Init is CommonTest { address vetoer = bob; uint256 operatingDelay = 14 days; DelayedVetoable delayedVetoable; - Reverter reverter; function setUp() public override { super.setUp(); @@ -27,13 +26,12 @@ contract DelayedVetoable_Init is CommonTest { target_: address(target), operatingDelay_: operatingDelay }); + // Most tests will use the operating delay, so we call as the initiator with null data // to set the delay. For tests that need to use the initial zero delay, we'll modify the // value in storage. vm.prank(initiator); (bool success,) = address(delayedVetoable).call(hex""); - - reverter = new Reverter(); } /// @dev This function is used to prevent initiating the delay unintentionally.. @@ -78,22 +76,29 @@ contract DelayedVetoable_HandleCall_Test is DelayedVetoable_Init { vm.prank(initiator); (bool success,) = address(delayedVetoable).call(data); - assert(success); + assertTrue(success); } /// @dev The delay is inititially set to zero and the call is immediately forwarded. - function testFuzz_handleCall_initialForwardingImmediately_succeeds(bytes memory data) external { - assumeNonzeroData(data); + function testFuzz_handleCall_initialForwardingImmediately_succeeds( + bytes memory inData, + bytes memory outData + ) + external + { + assumeNonzeroData(inData); // Reset the delay to zero vm.store(address(delayedVetoable), bytes32(uint256(0)), bytes32(uint256(0))); - vm.prank(initiator); + vm.mockCall(target, inData, outData); vm.expectEmit(true, false, false, true, address(delayedVetoable)); - vm.expectCall({ callee: target, data: data }); - emit Forwarded(keccak256(data), data); - (bool success,) = address(delayedVetoable).call(data); - assert(success); + vm.expectCall({ callee: target, data: inData }); + emit Forwarded(keccak256(inData), inData); + vm.prank(initiator); + (bool success, bytes memory returnData) = address(delayedVetoable).call(inData); + assertTrue(success); + assertEq(returnData, outData); } /// @dev The delay can be activated by the vetoer or initiator, and are not forwarded until the delay has passed @@ -102,7 +107,6 @@ contract DelayedVetoable_HandleCall_Test is DelayedVetoable_Init { assumeNonzeroData(data); vm.prank(initiator); - // it's immediately forwarding for some reason. (bool success,) = address(delayedVetoable).call(data); vm.warp(block.timestamp + operatingDelay); @@ -111,7 +115,7 @@ contract DelayedVetoable_HandleCall_Test is DelayedVetoable_Init { vm.expectCall({ callee: target, data: data }); (success,) = address(delayedVetoable).call(data); - assert(success); + assertTrue(success); } } @@ -120,7 +124,7 @@ contract DelayedVetoable_HandleCall_TestFail is DelayedVetoable_Init { function test_handleCall_unauthorizedInitiation_reverts() external { vm.expectRevert(abi.encodeWithSelector(Unauthorized.selector, initiator, address(this))); (bool success,) = address(delayedVetoable).call(NON_ZERO_DATA); - assert(success); + assertTrue(success); } /// @dev The call cannot be forewarded until the delay has passed. @@ -148,28 +152,30 @@ contract DelayedVetoable_HandleCall_TestFail is DelayedVetoable_Init { // Forward the call vm.expectCall({ callee: target, data: data }); (success,) = address(delayedVetoable).call(data); - assert(success); + assertTrue(success); // Attempt to foward the same call again. vm.expectRevert(abi.encodeWithSelector(Unauthorized.selector, initiator, address(this))); (success,) = address(delayedVetoable).call(data); - assert(success); + assertTrue(success); } /// @dev If the target reverts, it is bubbled up. - function testFuzz_handleCall_forwardingTargetReverts_reverts(bytes memory data) external { - assumeNonzeroData(data); - - vm.etch(target, address(reverter).code); + function testFuzz_handleCall_forwardingTargetReverts_reverts(bytes memory inData, bytes memory outData) external { + assumeNonzeroData(inData); + // Initiate the call vm.prank(initiator); - (bool success,) = address(delayedVetoable).call(data); + (bool success,) = address(delayedVetoable).call(inData); vm.warp(block.timestamp + operatingDelay); vm.expectEmit(true, false, false, true, address(delayedVetoable)); - emit Forwarded(keccak256(data), data); + emit Forwarded(keccak256(inData), inData); - (success,) = address(delayedVetoable).call(data); - assertFalse(success); + vm.mockCallRevert(target, inData, outData); + + // Forward the call + vm.expectRevert(outData); + (bool success2,) = address(delayedVetoable).call(inData); } } From 82f27c290186d4a7e86139286c33553920105caa Mon Sep 17 00:00:00 2001 From: Maurelian Date: Fri, 15 Sep 2023 08:53:16 -0400 Subject: [PATCH 48/87] refactor(ctb): Inline the _activateDelay logic This change will enable forwarding zero length data --- .../contracts-bedrock/src/L1/DelayedVetoable.sol | 13 ++++--------- .../contracts-bedrock/test/DelayedVetoable.t.sol | 9 ++++++--- 2 files changed, 10 insertions(+), 12 deletions(-) diff --git a/packages/contracts-bedrock/src/L1/DelayedVetoable.sol b/packages/contracts-bedrock/src/L1/DelayedVetoable.sol index 6dcd21931839..ca25ae75210f 100644 --- a/packages/contracts-bedrock/src/L1/DelayedVetoable.sol +++ b/packages/contracts-bedrock/src/L1/DelayedVetoable.sol @@ -6,6 +6,7 @@ import { ISemver } from "src/universal/ISemver.sol"; /// @title DelayedVetoable /// @notice This contract enables a delay before a call is forwarded to a target contract, and during the delay period /// the call can be vetoed by the authorized vetoer. +/// This contract does not support value transfers, only data is forwarded. contract DelayedVetoable is ISemver { /// @notice Error for when the delay has already been set. error AlreadyDelayed(); @@ -128,11 +129,12 @@ contract DelayedVetoable is ISemver { /// the need for additional layers of abi encoding. function _handleCall() internal { // The initiator and vetoer activate the delay by passing in null data. - if (msg.data.length == 0) { + if (msg.data.length == 0 && _delay == 0) { if (msg.sender != INITIATOR && msg.sender != VETOER) { revert Unauthorized(INITIATOR, msg.sender); } - _activateDelay(); + _delay = OPERATING_DELAY; + emit DelayActivated(_delay); return; } @@ -190,11 +192,4 @@ contract DelayedVetoable is ISemver { } } } - - /// @notice Sets the delay to the operating delay. - function _activateDelay() internal { - if (_delay != 0) revert AlreadyDelayed(); - _delay = OPERATING_DELAY; - emit DelayActivated(_delay); - } } diff --git a/packages/contracts-bedrock/test/DelayedVetoable.t.sol b/packages/contracts-bedrock/test/DelayedVetoable.t.sol index 9093ca36fdbf..e674e755cee6 100644 --- a/packages/contracts-bedrock/test/DelayedVetoable.t.sol +++ b/packages/contracts-bedrock/test/DelayedVetoable.t.sol @@ -2,7 +2,7 @@ pragma solidity 0.8.15; import { CommonTest } from "./CommonTest.t.sol"; -import { DelayedVetoable } from "../src/L1/DelayedVetoable.sol"; +import { DelayedVetoable } from "src/L1/DelayedVetoable.sol"; contract DelayedVetoable_Init is CommonTest { error Unauthorized(address expected, address actual); @@ -109,6 +109,11 @@ contract DelayedVetoable_HandleCall_Test is DelayedVetoable_Init { vm.prank(initiator); (bool success,) = address(delayedVetoable).call(data); + // Check that the call is in the _queuedAt mapping + bytes32 callHash = keccak256(data); + vm.prank(address(0)); + assertEq(delayedVetoable.queuedAt(callHash), block.timestamp); + vm.warp(block.timestamp + operatingDelay); vm.expectEmit(true, false, false, true, address(delayedVetoable)); emit Forwarded(keccak256(data), data); @@ -124,7 +129,6 @@ contract DelayedVetoable_HandleCall_TestFail is DelayedVetoable_Init { function test_handleCall_unauthorizedInitiation_reverts() external { vm.expectRevert(abi.encodeWithSelector(Unauthorized.selector, initiator, address(this))); (bool success,) = address(delayedVetoable).call(NON_ZERO_DATA); - assertTrue(success); } /// @dev The call cannot be forewarded until the delay has passed. @@ -134,7 +138,6 @@ contract DelayedVetoable_HandleCall_TestFail is DelayedVetoable_Init { vm.expectRevert(abi.encodeWithSelector(ForwardingEarly.selector)); (success,) = address(delayedVetoable).call(data); - assertFalse(success); } /// @dev The call cannot be forwarded a second time. From 7cd55c4b07cca1c95ccedc91b8d3ee815f84c55a Mon Sep 17 00:00:00 2001 From: Maurelian Date: Fri, 15 Sep 2023 09:05:04 -0400 Subject: [PATCH 49/87] feat(ctb): Update semver to 1.0.0 --- packages/contracts-bedrock/src/L1/DelayedVetoable.sol | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/contracts-bedrock/src/L1/DelayedVetoable.sol b/packages/contracts-bedrock/src/L1/DelayedVetoable.sol index ca25ae75210f..00240200ec05 100644 --- a/packages/contracts-bedrock/src/L1/DelayedVetoable.sol +++ b/packages/contracts-bedrock/src/L1/DelayedVetoable.sol @@ -71,8 +71,8 @@ contract DelayedVetoable is ISemver { } /// @notice Semantic version. - /// @custom:semver 0.0.1 - string public constant version = "0.0.1"; + /// @custom:semver 1.0.0 + string public constant version = "1.0.0"; /// @notice Sets the target admin during contract deployment. /// @param vetoer_ Address of the vetoer. From 76e632cdda74742bc73b3e71fe3ace9bdb348a9c Mon Sep 17 00:00:00 2001 From: Maurelian Date: Mon, 18 Sep 2023 15:34:15 -0400 Subject: [PATCH 50/87] feat(ctb): Update tests and add comments for queuedAt selector clash --- .../src/L1/DelayedVetoable.sol | 3 +++ .../test/DelayedVetoable.t.sol | 21 +++++++++++++++++-- 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/packages/contracts-bedrock/src/L1/DelayedVetoable.sol b/packages/contracts-bedrock/src/L1/DelayedVetoable.sol index 00240200ec05..8a1f08cb0ef3 100644 --- a/packages/contracts-bedrock/src/L1/DelayedVetoable.sol +++ b/packages/contracts-bedrock/src/L1/DelayedVetoable.sol @@ -7,6 +7,9 @@ import { ISemver } from "src/universal/ISemver.sol"; /// @notice This contract enables a delay before a call is forwarded to a target contract, and during the delay period /// the call can be vetoed by the authorized vetoer. /// This contract does not support value transfers, only data is forwarded. +/// Additionally, this contract cannot be used to forward calls with data beginning with the function selector +/// of the queuedAt(bytes32) function. This is because of input validation checks which solidity performs at +/// runtime on functions which take an argument. contract DelayedVetoable is ISemver { /// @notice Error for when the delay has already been set. error AlreadyDelayed(); diff --git a/packages/contracts-bedrock/test/DelayedVetoable.t.sol b/packages/contracts-bedrock/test/DelayedVetoable.t.sol index e674e755cee6..34cd210d6be8 100644 --- a/packages/contracts-bedrock/test/DelayedVetoable.t.sol +++ b/packages/contracts-bedrock/test/DelayedVetoable.t.sol @@ -81,12 +81,15 @@ contract DelayedVetoable_HandleCall_Test is DelayedVetoable_Init { /// @dev The delay is inititially set to zero and the call is immediately forwarded. function testFuzz_handleCall_initialForwardingImmediately_succeeds( - bytes memory inData, - bytes memory outData + bytes calldata inData, + bytes calldata outData ) external { assumeNonzeroData(inData); + if (inData.length >= 4) { + vm.assume(bytes4(inData[0:4]) != bytes4(keccak256("queuedAt(bytes32)"))); + } // Reset the delay to zero vm.store(address(delayedVetoable), bytes32(uint256(0)), bytes32(uint256(0))); @@ -181,4 +184,18 @@ contract DelayedVetoable_HandleCall_TestFail is DelayedVetoable_Init { vm.expectRevert(outData); (bool success2,) = address(delayedVetoable).call(inData); } + + /// @dev A test documenting the single instance in which the contract is not 'transparent' to the initiator. + function testFuzz_handleCall_queuedAtClash_reverts(bytes memory outData) external { + // This will get us calldata with the same function selector as the queuedAt function, but + // with the incorrect input data length. + bytes memory inData = abi.encodePacked(keccak256("queuedAt(bytes32)")); + + // Reset the delay to zero + vm.store(address(delayedVetoable), bytes32(uint256(0)), bytes32(uint256(0))); + + vm.prank(initiator); + vm.expectRevert(outData); + (bool success,) = address(delayedVetoable).call(inData); + } } From cabfcd78c63ceac9380cb99eb76b757bb5ac56c9 Mon Sep 17 00:00:00 2001 From: Maurelian Date: Fri, 15 Sep 2023 15:10:56 -0400 Subject: [PATCH 51/87] locks and bindings --- op-bindings/bindings/delayedvetoable.go | 196 ++++++++++++++++--- op-bindings/bindings/delayedvetoable_more.go | 4 +- op-bindings/bindings/mips_more.go | 2 +- op-bindings/bindings/preimageoracle_more.go | 2 +- packages/contracts-bedrock/.gas-snapshot | 11 +- packages/contracts-bedrock/semver-lock.json | 1 + 6 files changed, 173 insertions(+), 43 deletions(-) diff --git a/op-bindings/bindings/delayedvetoable.go b/op-bindings/bindings/delayedvetoable.go index 79344ff5446a..0166fdc68f78 100644 --- a/op-bindings/bindings/delayedvetoable.go +++ b/op-bindings/bindings/delayedvetoable.go @@ -30,8 +30,8 @@ var ( // DelayedVetoableMetaData contains all meta data concerning the DelayedVetoable contract. var DelayedVetoableMetaData = &bind.MetaData{ - ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"vetoer_\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"initiator_\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"target_\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"delay_\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"ForwardingEarly\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TargetUnitialized\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"expected\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"actual\",\"type\":\"address\"}],\"name\":\"Unauthorized\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"callHash\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"Forwarded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"callHash\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"Initiated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"callHash\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"Vetoed\",\"type\":\"event\"},{\"stateMutability\":\"payable\",\"type\":\"fallback\"},{\"inputs\":[],\"name\":\"delay\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"initiator\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"target\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"version\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"vetoer\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}]", - Bin: "0x60e060405234801561001057600080fd5b50604051610a27380380610a2783398101604081905261002f9161009f565b6000608081905260a0819052600160c081905280546001600160a01b03199081166001600160a01b0397881617909155600280548216958716959095179094558054909316919093161790556004556100ea565b80516001600160a01b038116811461009a57600080fd5b919050565b600080600080608085870312156100b557600080fd5b6100be85610083565b93506100cc60208601610083565b92506100da60408601610083565b6060959095015193969295505050565b60805160a05160c05161090e61011960003960006104560152600061042d01526000610404015261090e6000f3fe60806040526004361061005e5760003560e01c80636a42b8f8116100435780636a42b8f8146100da578063d4b83992146100fd578063d8bff440146101125761006d565b806354fd4d50146100755780635c39fcc1146100a05761006d565b3661006d5761006b610127565b005b61006b610127565b34801561008157600080fd5b5061008a6103fd565b6040516100979190610692565b60405180910390f35b3480156100ac57600080fd5b506100b56104a0565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610097565b3480156100e657600080fd5b506100ef6104cf565b604051908152602001610097565b34801561010957600080fd5b506100b56104dd565b34801561011e57600080fd5b506100b5610501565b600080366040516101399291906106e3565b60405190819003902060025490915073ffffffffffffffffffffffffffffffffffffffff16331480156101785750600081815260036020526040902054155b156101cb576000818152600360205260408082204290555182917f87a332a414acbc7da074543639ce7ae02ff1ea72e88379da9f261b080beb5a13916101c0919036906106f3565b60405180910390a250565b60015473ffffffffffffffffffffffffffffffffffffffff16331480156101ff575060008181526003602052604090205415155b80156102265750600454600082815260036020526040902054610222919061076f565b4211155b1561026e576000818152600360205260408082208290555182917fbede6852c1d97d93ff557f676de76670cd0dec861e7fe8beb13aa0ba2b0ab040916101c0919036906106f3565b60008181526003602052604081205490036102db576002546040517f295a81c100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff909116600482015233602482015260440160405180910390fd5b60045460008281526003602052604090205442916102f89161076f565b1015610330576040517f43dc986d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000818152600360205260408082208290555182917f4c109d85bcd0bb5c735b4be850953d652afe4cd9aa2e0b1426a65a4dcb2e122991610373919036906106f3565b60405180910390a26000805460405173ffffffffffffffffffffffffffffffffffffffff909116906103a890839036906106e3565b6000604051808303816000865af19150503d80600081146103e5576040519150601f19603f3d011682016040523d82523d6000602084013e6103ea565b606091505b50509050806103f8573d6000fd5b3d6000f35b60606104287f0000000000000000000000000000000000000000000000000000000000000000610525565b6104517f0000000000000000000000000000000000000000000000000000000000000000610525565b61047a7f0000000000000000000000000000000000000000000000000000000000000000610525565b60405160200161048c93929190610787565b604051602081830303815290604052905090565b6000336104c4575060025473ffffffffffffffffffffffffffffffffffffffff1690565b6104cc610127565b90565b6000336104c4575060045490565b6000336104c4575060005473ffffffffffffffffffffffffffffffffffffffff1690565b6000336104c4575060015473ffffffffffffffffffffffffffffffffffffffff1690565b60608160000361056857505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115610592578061057c816107fd565b915061058b9050600a83610864565b915061056c565b60008167ffffffffffffffff8111156105ad576105ad610878565b6040519080825280601f01601f1916602001820160405280156105d7576020820181803683370190505b5090505b841561065a576105ec6001836108a7565b91506105f9600a866108be565b61060490603061076f565b60f81b818381518110610619576106196108d2565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350610653600a86610864565b94506105db565b949350505050565b60005b8381101561067d578181015183820152602001610665565b8381111561068c576000848401525b50505050565b60208152600082518060208401526106b1816040850160208701610662565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b8183823760009101908152919050565b60208152816020820152818360408301376000818301604090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0160101919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000821982111561078257610782610740565b500190565b60008451610799818460208901610662565b80830190507f2e0000000000000000000000000000000000000000000000000000000000000080825285516107d5816001850160208a01610662565b600192019182015283516107f0816002840160208801610662565b0160020195945050505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361082e5761082e610740565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60008261087357610873610835565b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000828210156108b9576108b9610740565b500390565b6000826108cd576108cd610835565b500690565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fdfea164736f6c634300080f000a", + ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"vetoer_\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"initiator_\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"target_\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"operatingDelay_\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"AlreadyDelayed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ForwardingEarly\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TargetUnitialized\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"expected\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"actual\",\"type\":\"address\"}],\"name\":\"Unauthorized\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"delay\",\"type\":\"uint256\"}],\"name\":\"DelayActivated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"callHash\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"Forwarded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"callHash\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"Initiated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"callHash\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"Vetoed\",\"type\":\"event\"},{\"stateMutability\":\"nonpayable\",\"type\":\"fallback\"},{\"inputs\":[],\"name\":\"delay\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"delay_\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"initiator\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"initiator_\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"callHash\",\"type\":\"bytes32\"}],\"name\":\"queuedAt\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"queuedAt_\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"target\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"target_\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"version\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"vetoer\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"vetoer_\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", + Bin: "0x61010060405234801561001157600080fd5b506040516108ff3803806108ff8339810160408190526100309161006e565b6001600160a01b0393841660a05291831660c05290911660805260e0526100b9565b80516001600160a01b038116811461006957600080fd5b919050565b6000806000806080858703121561008457600080fd5b61008d85610052565b935061009b60208601610052565b92506100a960408601610052565b6060959095015193969295505050565b60805160a05160c05160e0516107dc610123600039600061023f01526000818161015f01528181610205015281816102cd0152818161045801526105050152600081816101a001528181610384015261059d01526000818161057101526105ff01526107dc6000f3fe608060405234801561001057600080fd5b50600436106100725760003560e01c8063b912de5d11610050578063b912de5d14610111578063d4b8399214610124578063d8bff4401461012c57610072565b806354fd4d501461007c5780635c39fcc1146100ce5780636a42b8f8146100fb575b61007a610134565b005b6100b86040518060400160405280600581526020017f312e302e3000000000000000000000000000000000000000000000000000000081525081565b6040516100c591906106a7565b60405180910390f35b6100d66104fb565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100c5565b610103610532565b6040519081526020016100c5565b61010361011f36600461071a565b610540565b6100d6610567565b6100d6610593565b361580156101425750600054155b15610298573373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016148015906101c357503373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614155b1561023d576040517f295a81c100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001660048201523360248201526044015b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000060008190556040519081527febf28bfb587e28dfffd9173cf71c32ba5d3f0544a0117b5539c9b274a5bba2a89060200160405180910390a1565b600080366040516102aa929190610733565b60405190819003902090503373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161480156103065750600081815260016020526040902054155b1561036c5760005460000361031e5761031e816105bf565b6000818152600160205260408082204290555182917f87a332a414acbc7da074543639ce7ae02ff1ea72e88379da9f261b080beb5a139161036191903690610743565b60405180910390a250565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161480156103be575060008181526001602052604090205415155b15610406576000818152600160205260408082208290555182917fbede6852c1d97d93ff557f676de76670cd0dec861e7fe8beb13aa0ba2b0ab0409161036191903690610743565b600081815260016020526040812054900361048b576040517f295a81c100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000166004820152336024820152604401610234565b60008054828252600160205260409091205442916104a891610790565b10156104e0576040517f43dc986d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000818152600160205260408120556104f8816105bf565b50565b60003361052757507f000000000000000000000000000000000000000000000000000000000000000090565b61052f610134565b90565b600033610527575060005490565b60003361055a575060009081526001602052604090205490565b610562610134565b919050565b60003361052757507f000000000000000000000000000000000000000000000000000000000000000090565b60003361052757507f000000000000000000000000000000000000000000000000000000000000000090565b807f4c109d85bcd0bb5c735b4be850953d652afe4cd9aa2e0b1426a65a4dcb2e12296000366040516105f2929190610743565b60405180910390a26000807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16600036604051610645929190610733565b6000604051808303816000865af19150503d8060008114610682576040519150601f19603f3d011682016040523d82523d6000602084013e610687565b606091505b50909250905081151560010361069f57805160208201f35b805160208201fd5b600060208083528351808285015260005b818110156106d4578581018301518582016040015282016106b8565b818111156106e6576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b60006020828403121561072c57600080fd5b5035919050565b8183823760009101908152919050565b60208152816020820152818360408301376000818301604090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0160101919050565b600082198211156107ca577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b50019056fea164736f6c634300080f000a", } // DelayedVetoableABI is the input ABI used to generate the binding from. @@ -43,7 +43,7 @@ var DelayedVetoableABI = DelayedVetoableMetaData.ABI var DelayedVetoableBin = DelayedVetoableMetaData.Bin // DeployDelayedVetoable deploys a new Ethereum contract, binding an instance of DelayedVetoable to it. -func DeployDelayedVetoable(auth *bind.TransactOpts, backend bind.ContractBackend, vetoer_ common.Address, initiator_ common.Address, target_ common.Address, delay_ *big.Int) (common.Address, *types.Transaction, *DelayedVetoable, error) { +func DeployDelayedVetoable(auth *bind.TransactOpts, backend bind.ContractBackend, vetoer_ common.Address, initiator_ common.Address, target_ common.Address, operatingDelay_ *big.Int) (common.Address, *types.Transaction, *DelayedVetoable, error) { parsed, err := DelayedVetoableMetaData.GetAbi() if err != nil { return common.Address{}, nil, nil, err @@ -52,7 +52,7 @@ func DeployDelayedVetoable(auth *bind.TransactOpts, backend bind.ContractBackend return common.Address{}, nil, nil, errors.New("GetABI returned nil") } - address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(DelayedVetoableBin), backend, vetoer_, initiator_, target_, delay_) + address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(DelayedVetoableBin), backend, vetoer_, initiator_, target_, operatingDelay_) if err != nil { return common.Address{}, nil, nil, err } @@ -234,128 +234,262 @@ func (_DelayedVetoable *DelayedVetoableCallerSession) Version() (string, error) // Delay is a paid mutator transaction binding the contract method 0x6a42b8f8. // -// Solidity: function delay() returns(uint256) +// Solidity: function delay() returns(uint256 delay_) func (_DelayedVetoable *DelayedVetoableTransactor) Delay(opts *bind.TransactOpts) (*types.Transaction, error) { return _DelayedVetoable.contract.Transact(opts, "delay") } // Delay is a paid mutator transaction binding the contract method 0x6a42b8f8. // -// Solidity: function delay() returns(uint256) +// Solidity: function delay() returns(uint256 delay_) func (_DelayedVetoable *DelayedVetoableSession) Delay() (*types.Transaction, error) { return _DelayedVetoable.Contract.Delay(&_DelayedVetoable.TransactOpts) } // Delay is a paid mutator transaction binding the contract method 0x6a42b8f8. // -// Solidity: function delay() returns(uint256) +// Solidity: function delay() returns(uint256 delay_) func (_DelayedVetoable *DelayedVetoableTransactorSession) Delay() (*types.Transaction, error) { return _DelayedVetoable.Contract.Delay(&_DelayedVetoable.TransactOpts) } // Initiator is a paid mutator transaction binding the contract method 0x5c39fcc1. // -// Solidity: function initiator() returns(address) +// Solidity: function initiator() returns(address initiator_) func (_DelayedVetoable *DelayedVetoableTransactor) Initiator(opts *bind.TransactOpts) (*types.Transaction, error) { return _DelayedVetoable.contract.Transact(opts, "initiator") } // Initiator is a paid mutator transaction binding the contract method 0x5c39fcc1. // -// Solidity: function initiator() returns(address) +// Solidity: function initiator() returns(address initiator_) func (_DelayedVetoable *DelayedVetoableSession) Initiator() (*types.Transaction, error) { return _DelayedVetoable.Contract.Initiator(&_DelayedVetoable.TransactOpts) } // Initiator is a paid mutator transaction binding the contract method 0x5c39fcc1. // -// Solidity: function initiator() returns(address) +// Solidity: function initiator() returns(address initiator_) func (_DelayedVetoable *DelayedVetoableTransactorSession) Initiator() (*types.Transaction, error) { return _DelayedVetoable.Contract.Initiator(&_DelayedVetoable.TransactOpts) } +// QueuedAt is a paid mutator transaction binding the contract method 0xb912de5d. +// +// Solidity: function queuedAt(bytes32 callHash) returns(uint256 queuedAt_) +func (_DelayedVetoable *DelayedVetoableTransactor) QueuedAt(opts *bind.TransactOpts, callHash [32]byte) (*types.Transaction, error) { + return _DelayedVetoable.contract.Transact(opts, "queuedAt", callHash) +} + +// QueuedAt is a paid mutator transaction binding the contract method 0xb912de5d. +// +// Solidity: function queuedAt(bytes32 callHash) returns(uint256 queuedAt_) +func (_DelayedVetoable *DelayedVetoableSession) QueuedAt(callHash [32]byte) (*types.Transaction, error) { + return _DelayedVetoable.Contract.QueuedAt(&_DelayedVetoable.TransactOpts, callHash) +} + +// QueuedAt is a paid mutator transaction binding the contract method 0xb912de5d. +// +// Solidity: function queuedAt(bytes32 callHash) returns(uint256 queuedAt_) +func (_DelayedVetoable *DelayedVetoableTransactorSession) QueuedAt(callHash [32]byte) (*types.Transaction, error) { + return _DelayedVetoable.Contract.QueuedAt(&_DelayedVetoable.TransactOpts, callHash) +} + // Target is a paid mutator transaction binding the contract method 0xd4b83992. // -// Solidity: function target() returns(address) +// Solidity: function target() returns(address target_) func (_DelayedVetoable *DelayedVetoableTransactor) Target(opts *bind.TransactOpts) (*types.Transaction, error) { return _DelayedVetoable.contract.Transact(opts, "target") } // Target is a paid mutator transaction binding the contract method 0xd4b83992. // -// Solidity: function target() returns(address) +// Solidity: function target() returns(address target_) func (_DelayedVetoable *DelayedVetoableSession) Target() (*types.Transaction, error) { return _DelayedVetoable.Contract.Target(&_DelayedVetoable.TransactOpts) } // Target is a paid mutator transaction binding the contract method 0xd4b83992. // -// Solidity: function target() returns(address) +// Solidity: function target() returns(address target_) func (_DelayedVetoable *DelayedVetoableTransactorSession) Target() (*types.Transaction, error) { return _DelayedVetoable.Contract.Target(&_DelayedVetoable.TransactOpts) } // Vetoer is a paid mutator transaction binding the contract method 0xd8bff440. // -// Solidity: function vetoer() returns(address) +// Solidity: function vetoer() returns(address vetoer_) func (_DelayedVetoable *DelayedVetoableTransactor) Vetoer(opts *bind.TransactOpts) (*types.Transaction, error) { return _DelayedVetoable.contract.Transact(opts, "vetoer") } // Vetoer is a paid mutator transaction binding the contract method 0xd8bff440. // -// Solidity: function vetoer() returns(address) +// Solidity: function vetoer() returns(address vetoer_) func (_DelayedVetoable *DelayedVetoableSession) Vetoer() (*types.Transaction, error) { return _DelayedVetoable.Contract.Vetoer(&_DelayedVetoable.TransactOpts) } // Vetoer is a paid mutator transaction binding the contract method 0xd8bff440. // -// Solidity: function vetoer() returns(address) +// Solidity: function vetoer() returns(address vetoer_) func (_DelayedVetoable *DelayedVetoableTransactorSession) Vetoer() (*types.Transaction, error) { return _DelayedVetoable.Contract.Vetoer(&_DelayedVetoable.TransactOpts) } // Fallback is a paid mutator transaction binding the contract fallback function. // -// Solidity: fallback() payable returns() +// Solidity: fallback() returns() func (_DelayedVetoable *DelayedVetoableTransactor) Fallback(opts *bind.TransactOpts, calldata []byte) (*types.Transaction, error) { return _DelayedVetoable.contract.RawTransact(opts, calldata) } // Fallback is a paid mutator transaction binding the contract fallback function. // -// Solidity: fallback() payable returns() +// Solidity: fallback() returns() func (_DelayedVetoable *DelayedVetoableSession) Fallback(calldata []byte) (*types.Transaction, error) { return _DelayedVetoable.Contract.Fallback(&_DelayedVetoable.TransactOpts, calldata) } // Fallback is a paid mutator transaction binding the contract fallback function. // -// Solidity: fallback() payable returns() +// Solidity: fallback() returns() func (_DelayedVetoable *DelayedVetoableTransactorSession) Fallback(calldata []byte) (*types.Transaction, error) { return _DelayedVetoable.Contract.Fallback(&_DelayedVetoable.TransactOpts, calldata) } -// Receive is a paid mutator transaction binding the contract receive function. +// DelayedVetoableDelayActivatedIterator is returned from FilterDelayActivated and is used to iterate over the raw logs and unpacked data for DelayActivated events raised by the DelayedVetoable contract. +type DelayedVetoableDelayActivatedIterator struct { + Event *DelayedVetoableDelayActivated // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *DelayedVetoableDelayActivatedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(DelayedVetoableDelayActivated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(DelayedVetoableDelayActivated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *DelayedVetoableDelayActivatedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *DelayedVetoableDelayActivatedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// DelayedVetoableDelayActivated represents a DelayActivated event raised by the DelayedVetoable contract. +type DelayedVetoableDelayActivated struct { + Delay *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterDelayActivated is a free log retrieval operation binding the contract event 0xebf28bfb587e28dfffd9173cf71c32ba5d3f0544a0117b5539c9b274a5bba2a8. // -// Solidity: receive() payable returns() -func (_DelayedVetoable *DelayedVetoableTransactor) Receive(opts *bind.TransactOpts) (*types.Transaction, error) { - return _DelayedVetoable.contract.RawTransact(opts, nil) // calldata is disallowed for receive function +// Solidity: event DelayActivated(uint256 delay) +func (_DelayedVetoable *DelayedVetoableFilterer) FilterDelayActivated(opts *bind.FilterOpts) (*DelayedVetoableDelayActivatedIterator, error) { + + logs, sub, err := _DelayedVetoable.contract.FilterLogs(opts, "DelayActivated") + if err != nil { + return nil, err + } + return &DelayedVetoableDelayActivatedIterator{contract: _DelayedVetoable.contract, event: "DelayActivated", logs: logs, sub: sub}, nil } -// Receive is a paid mutator transaction binding the contract receive function. +// WatchDelayActivated is a free log subscription operation binding the contract event 0xebf28bfb587e28dfffd9173cf71c32ba5d3f0544a0117b5539c9b274a5bba2a8. // -// Solidity: receive() payable returns() -func (_DelayedVetoable *DelayedVetoableSession) Receive() (*types.Transaction, error) { - return _DelayedVetoable.Contract.Receive(&_DelayedVetoable.TransactOpts) +// Solidity: event DelayActivated(uint256 delay) +func (_DelayedVetoable *DelayedVetoableFilterer) WatchDelayActivated(opts *bind.WatchOpts, sink chan<- *DelayedVetoableDelayActivated) (event.Subscription, error) { + + logs, sub, err := _DelayedVetoable.contract.WatchLogs(opts, "DelayActivated") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(DelayedVetoableDelayActivated) + if err := _DelayedVetoable.contract.UnpackLog(event, "DelayActivated", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil } -// Receive is a paid mutator transaction binding the contract receive function. +// ParseDelayActivated is a log parse operation binding the contract event 0xebf28bfb587e28dfffd9173cf71c32ba5d3f0544a0117b5539c9b274a5bba2a8. // -// Solidity: receive() payable returns() -func (_DelayedVetoable *DelayedVetoableTransactorSession) Receive() (*types.Transaction, error) { - return _DelayedVetoable.Contract.Receive(&_DelayedVetoable.TransactOpts) +// Solidity: event DelayActivated(uint256 delay) +func (_DelayedVetoable *DelayedVetoableFilterer) ParseDelayActivated(log types.Log) (*DelayedVetoableDelayActivated, error) { + event := new(DelayedVetoableDelayActivated) + if err := _DelayedVetoable.contract.UnpackLog(event, "DelayActivated", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil } // DelayedVetoableForwardedIterator is returned from FilterForwarded and is used to iterate over the raw logs and unpacked data for Forwarded events raised by the DelayedVetoable contract. diff --git a/op-bindings/bindings/delayedvetoable_more.go b/op-bindings/bindings/delayedvetoable_more.go index fd801c7dd680..3ad43c89e384 100644 --- a/op-bindings/bindings/delayedvetoable_more.go +++ b/op-bindings/bindings/delayedvetoable_more.go @@ -9,11 +9,11 @@ import ( "github.com/ethereum-optimism/optimism/op-bindings/solc" ) -const DelayedVetoableStorageLayoutJSON = "{\"storage\":[{\"astId\":1000,\"contract\":\"src/L1/DelayedVetoable.sol:DelayedVetoable\",\"label\":\"_target\",\"offset\":0,\"slot\":\"0\",\"type\":\"t_address\"},{\"astId\":1001,\"contract\":\"src/L1/DelayedVetoable.sol:DelayedVetoable\",\"label\":\"_vetoer\",\"offset\":0,\"slot\":\"1\",\"type\":\"t_address\"},{\"astId\":1002,\"contract\":\"src/L1/DelayedVetoable.sol:DelayedVetoable\",\"label\":\"_initiator\",\"offset\":0,\"slot\":\"2\",\"type\":\"t_address\"},{\"astId\":1003,\"contract\":\"src/L1/DelayedVetoable.sol:DelayedVetoable\",\"label\":\"_queuedAt\",\"offset\":0,\"slot\":\"3\",\"type\":\"t_mapping(t_bytes32,t_uint256)\"},{\"astId\":1004,\"contract\":\"src/L1/DelayedVetoable.sol:DelayedVetoable\",\"label\":\"_delay\",\"offset\":0,\"slot\":\"4\",\"type\":\"t_uint256\"}],\"types\":{\"t_address\":{\"encoding\":\"inplace\",\"label\":\"address\",\"numberOfBytes\":\"20\"},\"t_bytes32\":{\"encoding\":\"inplace\",\"label\":\"bytes32\",\"numberOfBytes\":\"32\"},\"t_mapping(t_bytes32,t_uint256)\":{\"encoding\":\"mapping\",\"label\":\"mapping(bytes32 =\u003e uint256)\",\"numberOfBytes\":\"32\",\"key\":\"t_bytes32\",\"value\":\"t_uint256\"},\"t_uint256\":{\"encoding\":\"inplace\",\"label\":\"uint256\",\"numberOfBytes\":\"32\"}}}" +const DelayedVetoableStorageLayoutJSON = "{\"storage\":[{\"astId\":1000,\"contract\":\"src/L1/DelayedVetoable.sol:DelayedVetoable\",\"label\":\"_delay\",\"offset\":0,\"slot\":\"0\",\"type\":\"t_uint256\"},{\"astId\":1001,\"contract\":\"src/L1/DelayedVetoable.sol:DelayedVetoable\",\"label\":\"_queuedAt\",\"offset\":0,\"slot\":\"1\",\"type\":\"t_mapping(t_bytes32,t_uint256)\"}],\"types\":{\"t_bytes32\":{\"encoding\":\"inplace\",\"label\":\"bytes32\",\"numberOfBytes\":\"32\"},\"t_mapping(t_bytes32,t_uint256)\":{\"encoding\":\"mapping\",\"label\":\"mapping(bytes32 =\u003e uint256)\",\"numberOfBytes\":\"32\",\"key\":\"t_bytes32\",\"value\":\"t_uint256\"},\"t_uint256\":{\"encoding\":\"inplace\",\"label\":\"uint256\",\"numberOfBytes\":\"32\"}}}" var DelayedVetoableStorageLayout = new(solc.StorageLayout) -var DelayedVetoableDeployedBin = "0x60806040526004361061005e5760003560e01c80636a42b8f8116100435780636a42b8f8146100da578063d4b83992146100fd578063d8bff440146101125761006d565b806354fd4d50146100755780635c39fcc1146100a05761006d565b3661006d5761006b610127565b005b61006b610127565b34801561008157600080fd5b5061008a6103fd565b6040516100979190610692565b60405180910390f35b3480156100ac57600080fd5b506100b56104a0565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610097565b3480156100e657600080fd5b506100ef6104cf565b604051908152602001610097565b34801561010957600080fd5b506100b56104dd565b34801561011e57600080fd5b506100b5610501565b600080366040516101399291906106e3565b60405190819003902060025490915073ffffffffffffffffffffffffffffffffffffffff16331480156101785750600081815260036020526040902054155b156101cb576000818152600360205260408082204290555182917f87a332a414acbc7da074543639ce7ae02ff1ea72e88379da9f261b080beb5a13916101c0919036906106f3565b60405180910390a250565b60015473ffffffffffffffffffffffffffffffffffffffff16331480156101ff575060008181526003602052604090205415155b80156102265750600454600082815260036020526040902054610222919061076f565b4211155b1561026e576000818152600360205260408082208290555182917fbede6852c1d97d93ff557f676de76670cd0dec861e7fe8beb13aa0ba2b0ab040916101c0919036906106f3565b60008181526003602052604081205490036102db576002546040517f295a81c100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff909116600482015233602482015260440160405180910390fd5b60045460008281526003602052604090205442916102f89161076f565b1015610330576040517f43dc986d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000818152600360205260408082208290555182917f4c109d85bcd0bb5c735b4be850953d652afe4cd9aa2e0b1426a65a4dcb2e122991610373919036906106f3565b60405180910390a26000805460405173ffffffffffffffffffffffffffffffffffffffff909116906103a890839036906106e3565b6000604051808303816000865af19150503d80600081146103e5576040519150601f19603f3d011682016040523d82523d6000602084013e6103ea565b606091505b50509050806103f8573d6000fd5b3d6000f35b60606104287f0000000000000000000000000000000000000000000000000000000000000000610525565b6104517f0000000000000000000000000000000000000000000000000000000000000000610525565b61047a7f0000000000000000000000000000000000000000000000000000000000000000610525565b60405160200161048c93929190610787565b604051602081830303815290604052905090565b6000336104c4575060025473ffffffffffffffffffffffffffffffffffffffff1690565b6104cc610127565b90565b6000336104c4575060045490565b6000336104c4575060005473ffffffffffffffffffffffffffffffffffffffff1690565b6000336104c4575060015473ffffffffffffffffffffffffffffffffffffffff1690565b60608160000361056857505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115610592578061057c816107fd565b915061058b9050600a83610864565b915061056c565b60008167ffffffffffffffff8111156105ad576105ad610878565b6040519080825280601f01601f1916602001820160405280156105d7576020820181803683370190505b5090505b841561065a576105ec6001836108a7565b91506105f9600a866108be565b61060490603061076f565b60f81b818381518110610619576106196108d2565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350610653600a86610864565b94506105db565b949350505050565b60005b8381101561067d578181015183820152602001610665565b8381111561068c576000848401525b50505050565b60208152600082518060208401526106b1816040850160208701610662565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b8183823760009101908152919050565b60208152816020820152818360408301376000818301604090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0160101919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000821982111561078257610782610740565b500190565b60008451610799818460208901610662565b80830190507f2e0000000000000000000000000000000000000000000000000000000000000080825285516107d5816001850160208a01610662565b600192019182015283516107f0816002840160208801610662565b0160020195945050505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361082e5761082e610740565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60008261087357610873610835565b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000828210156108b9576108b9610740565b500390565b6000826108cd576108cd610835565b500690565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fdfea164736f6c634300080f000a" +var DelayedVetoableDeployedBin = "0x608060405234801561001057600080fd5b50600436106100725760003560e01c8063b912de5d11610050578063b912de5d14610111578063d4b8399214610124578063d8bff4401461012c57610072565b806354fd4d501461007c5780635c39fcc1146100ce5780636a42b8f8146100fb575b61007a610134565b005b6100b86040518060400160405280600581526020017f312e302e3000000000000000000000000000000000000000000000000000000081525081565b6040516100c591906106a7565b60405180910390f35b6100d66104fb565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100c5565b610103610532565b6040519081526020016100c5565b61010361011f36600461071a565b610540565b6100d6610567565b6100d6610593565b361580156101425750600054155b15610298573373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016148015906101c357503373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614155b1561023d576040517f295a81c100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001660048201523360248201526044015b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000060008190556040519081527febf28bfb587e28dfffd9173cf71c32ba5d3f0544a0117b5539c9b274a5bba2a89060200160405180910390a1565b600080366040516102aa929190610733565b60405190819003902090503373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161480156103065750600081815260016020526040902054155b1561036c5760005460000361031e5761031e816105bf565b6000818152600160205260408082204290555182917f87a332a414acbc7da074543639ce7ae02ff1ea72e88379da9f261b080beb5a139161036191903690610743565b60405180910390a250565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161480156103be575060008181526001602052604090205415155b15610406576000818152600160205260408082208290555182917fbede6852c1d97d93ff557f676de76670cd0dec861e7fe8beb13aa0ba2b0ab0409161036191903690610743565b600081815260016020526040812054900361048b576040517f295a81c100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000166004820152336024820152604401610234565b60008054828252600160205260409091205442916104a891610790565b10156104e0576040517f43dc986d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000818152600160205260408120556104f8816105bf565b50565b60003361052757507f000000000000000000000000000000000000000000000000000000000000000090565b61052f610134565b90565b600033610527575060005490565b60003361055a575060009081526001602052604090205490565b610562610134565b919050565b60003361052757507f000000000000000000000000000000000000000000000000000000000000000090565b60003361052757507f000000000000000000000000000000000000000000000000000000000000000090565b807f4c109d85bcd0bb5c735b4be850953d652afe4cd9aa2e0b1426a65a4dcb2e12296000366040516105f2929190610743565b60405180910390a26000807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16600036604051610645929190610733565b6000604051808303816000865af19150503d8060008114610682576040519150601f19603f3d011682016040523d82523d6000602084013e610687565b606091505b50909250905081151560010361069f57805160208201f35b805160208201fd5b600060208083528351808285015260005b818110156106d4578581018301518582016040015282016106b8565b818111156106e6576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b60006020828403121561072c57600080fd5b5035919050565b8183823760009101908152919050565b60208152816020820152818360408301376000818301604090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0160101919050565b600082198211156107ca577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b50019056fea164736f6c634300080f000a" func init() { if err := json.Unmarshal([]byte(DelayedVetoableStorageLayoutJSON), DelayedVetoableStorageLayout); err != nil { diff --git a/op-bindings/bindings/mips_more.go b/op-bindings/bindings/mips_more.go index 064bd4392c93..32419e65c615 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:125:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1710:45;;1745:10;1710:45;;;;;188:10:279;176:23;;;158:42;;146:2;131:18;1710:45:125;;;;;;;;2448:99;;;412:42:279;2534:6:125;400:55:279;382:74;;370:2;355:18;2448:99:125;211:251:279;25555:6339:125;;;;;;:::i;:::-;;:::i;:::-;;;1687:25:279;;;1675:2;1660:18;25555:6339:125;1541:177:279;25555:6339:125;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:125;;-1:-1:-1;28096:7:125;:20::i;:::-;28082:34;-1:-1:-1;28146:10:125;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:125;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:125;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:125;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:125;;;;;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:125;;;5305:32;;5365:19;5361:30;5397:3;5393:16;;;;5358:52;;3092:2334;-1:-1:-1;3092:2334:125: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:125;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:125;23337:14;;;;23325:10;23321:31;23318:1;23314:39;23382:16;;;;23400:10;23378:33;;21610:1831;-1:-1:-1;;;21610:1831:125: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:279;19028:28:125;;;2096:21:279;2153:2;2133:18;;;2126:30;2192:20;2172:18;;;2165:48;2230:18;;19028:28:125;;;;;;;;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:125: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:125;;;;:::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:279;13956:30:125;;;2443:21:279;2500:2;2480:18;;;2473:30;2539:22;2519:18;;;2512:50;2579:18;;13956:30:125;2259:344:279;13904:97:125;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:125: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:125;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:125;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:125;;;33448:4;33443:9;;33436:17;33429:24;;33389:3555;33522:4;:11;;33530:3;33522:11;33518:3426;;-1:-1:-1;;;33564:17:125;;;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:125;;;35722:16;;35682:1262;35807:4;:12;;35815:4;35807:12;35803:1141;;-1:-1:-1;;;35851:7:125;;;35843:16;;35803:1141;35927:4;:12;;35935:4;35927:12;35923:1021;;-1:-1:-1;;;35971:7:125;;;35963:16;;35923:1021;36048:4;:12;;36056:4;36048:12;36044:900;;-1:-1:-1;;;36092:7:125;;;36084:16;;36044:900;36168:4;:12;;36176:4;36168:12;36164:780;;-1:-1:-1;;;36212:7:125;;;36204:16;;36164:780;36287:4;:12;;36295:4;36287:12;36283:661;;-1:-1:-1;;;36331:7:125;;;36323:16;;36283:661;36407:4;:12;;36415:4;36407:12;36403:541;;-1:-1:-1;;;36451:7:125;;;36443:16;;36403:541;36527:4;:12;;36535:4;36527:12;36523:421;;-1:-1:-1;;;36572:7:125;;;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:279;36896:29:125;;;2792:21:279;2849:2;2829:18;;;2822:30;2888:21;2868:18;;;2861:49;2927:18;;36896:29:125;2608:343:279;36787:157:125;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:125;;;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:125;;-1:-1:-1;;37654:8:125;37010:3590;37752:6;:14;;37762:4;37752:14;37748:2852;;-1:-1:-1;;37797:8:125;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:125;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:125;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:125;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:125;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:125;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:125;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:125;20172:2;20160:14;;;;20152:41;;;;;;;3158:2:279;20152:41:125;;;3140:21:279;3197:2;3177:18;;;3170:30;3236:16;3216:18;;;3209:44;3270:18;;20152:41:125;2956:338:279;20152:41:125;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:125;;: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:125;;;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:125;7737:19;7909:14;7928:1;7903:26;7899:131;;7971:36;7995:11;1277:21:126;1426:15;;;1467:8;1461:4;1454:22;1595:4;1582:18;;1602:19;1578:44;1624:11;1575:61;;1222:430;7971:36:125;7957:50;;7899:131;8116:20;;;;;8083:54;;;;;;;;3472:25:279;;;8083:54:125;3533:23:279;;;3513:18;;;3506:51;8052:11:125;;;;8083:19;:6;:19;;;;3445:18:279;;8083:54:125;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::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:125;;-1:-1:-1;;;7506:2538:125;;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:125;;;1859:1;10346:15;10327:34;:57;;;-1:-1:-1;10365:19:125;;;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:125;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:125;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:125;;;1978:1;12339:22;12321:40;:62;;;-1:-1:-1;12365:18:125;;;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:125;;;1859:1;12481:15;12462:34;:61;;;-1:-1:-1;12500:23:125;;;2021:1;12500:23;12462:61;:84;;;-1:-1:-1;12527:19:125;;;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:125;;;;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:125;16228:10;16336:13;;;16345:4;16336:13;16332:1705;;-1:-1:-1;16375:8:125;;;;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:125;;;;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:125: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:125;24984:9;24948:343;;;-1:-1:-1;;25390:4:125;25383:18;-1:-1:-1;;;;23777:1654:125:o;20810:586::-;21132:20;;;21156:7;21132:32;21125:3;:40;;;21238:14;;21293:17;;21287:24;;;21279:72;;;;;;;4209:2:279;21279:72:125;;;4191:21:279;4248:2;4228:18;;;4221:30;4287:34;4267:18;;;4260:62;4358:5;4338:18;;;4331:33;4381:19;;21279:72:125;4007:399:279;21279:72:125;21365:14;20810:586;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;467:347:279:-;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:279;;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:279;-1:-1:-1;1332:2:279;1317:18;;1304:32;;-1:-1:-1;1348:16:279;;;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:279;-1:-1:-1;;;;819:717:279: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:279;;3803:2;3788:18;;;3782:25;3747:16;;3782:25;;-1:-1:-1;3568:245:279:o;3818:184::-;3870:77;3867:1;3860:88;3967:4;3964:1;3957:15;3991:4;3988:1;3981:15" +var MIPSDeployedSourceMap = "1131:39544:126:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1710:45;;1745:10;1710:45;;;;;188:10:281;176:23;;;158:42;;146:2;131:18;1710:45:126;;;;;;;;2448:99;;;412:42:281;2534:6:126;400:55:281;382:74;;370:2;355:18;2448:99:126;211:251:281;25555:6339:126;;;;;;:::i;:::-;;:::i;:::-;;;1687:25:281;;;1675:2;1660:18;25555:6339:126;1541:177:281;25555:6339:126;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:126;;-1:-1:-1;28096:7:126;:20::i;:::-;28082:34;-1:-1:-1;28146:10:126;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:126;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:126;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:126;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:126;;;;;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:126;;;5305:32;;5365:19;5361:30;5397:3;5393:16;;;;5358:52;;3092:2334;-1:-1:-1;3092:2334:126: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:126;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:126;23337:14;;;;23325:10;23321:31;23318:1;23314:39;23382:16;;;;23400:10;23378:33;;21610:1831;-1:-1:-1;;;21610:1831:126: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:281;19028:28:126;;;2096:21:281;2153:2;2133:18;;;2126:30;2192:20;2172:18;;;2165:48;2230:18;;19028:28:126;;;;;;;;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:126: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:126;;;;:::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:281;13956:30:126;;;2443:21:281;2500:2;2480:18;;;2473:30;2539:22;2519:18;;;2512:50;2579:18;;13956:30:126;2259:344:281;13904:97:126;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:126: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:126;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:126;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:126;;;33448:4;33443:9;;33436:17;33429:24;;33389:3555;33522:4;:11;;33530:3;33522:11;33518:3426;;-1:-1:-1;;;33564:17:126;;;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:126;;;35722:16;;35682:1262;35807:4;:12;;35815:4;35807:12;35803:1141;;-1:-1:-1;;;35851:7:126;;;35843:16;;35803:1141;35927:4;:12;;35935:4;35927:12;35923:1021;;-1:-1:-1;;;35971:7:126;;;35963:16;;35923:1021;36048:4;:12;;36056:4;36048:12;36044:900;;-1:-1:-1;;;36092:7:126;;;36084:16;;36044:900;36168:4;:12;;36176:4;36168:12;36164:780;;-1:-1:-1;;;36212:7:126;;;36204:16;;36164:780;36287:4;:12;;36295:4;36287:12;36283:661;;-1:-1:-1;;;36331:7:126;;;36323:16;;36283:661;36407:4;:12;;36415:4;36407:12;36403:541;;-1:-1:-1;;;36451:7:126;;;36443:16;;36403:541;36527:4;:12;;36535:4;36527:12;36523:421;;-1:-1:-1;;;36572:7:126;;;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:281;36896:29:126;;;2792:21:281;2849:2;2829:18;;;2822:30;2888:21;2868:18;;;2861:49;2927:18;;36896:29:126;2608:343:281;36787:157:126;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:126;;;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:126;;-1:-1:-1;;37654:8:126;37010:3590;37752:6;:14;;37762:4;37752:14;37748:2852;;-1:-1:-1;;37797:8:126;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:126;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:126;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:126;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:126;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:126;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:126;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:126;20172:2;20160:14;;;;20152:41;;;;;;;3158:2:281;20152:41:126;;;3140:21:281;3197:2;3177:18;;;3170:30;3236:16;3216:18;;;3209:44;3270:18;;20152:41:126;2956:338:281;20152:41:126;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:126;;: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:126;;;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:126;7737:19;7909:14;7928:1;7903:26;7899:131;;7971:36;7995:11;1277:21:127;1426:15;;;1467:8;1461:4;1454:22;1595:4;1582:18;;1602:19;1578:44;1624:11;1575:61;;1222:430;7971:36:126;7957:50;;7899:131;8116:20;;;;;8083:54;;;;;;;;3472:25:281;;;8083:54:126;3533:23:281;;;3513:18;;;3506:51;8052:11:126;;;;8083:19;:6;:19;;;;3445:18:281;;8083:54:126;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::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:126;;-1:-1:-1;;;7506:2538:126;;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:126;;;1859:1;10346:15;10327:34;:57;;;-1:-1:-1;10365:19:126;;;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:126;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:126;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:126;;;1978:1;12339:22;12321:40;:62;;;-1:-1:-1;12365:18:126;;;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:126;;;1859:1;12481:15;12462:34;:61;;;-1:-1:-1;12500:23:126;;;2021:1;12500:23;12462:61;:84;;;-1:-1:-1;12527:19:126;;;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:126;;;;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:126;16228:10;16336:13;;;16345:4;16336:13;16332:1705;;-1:-1:-1;16375:8:126;;;;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:126;;;;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:126: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:126;24984:9;24948:343;;;-1:-1:-1;;25390:4:126;25383:18;-1:-1:-1;;;;23777:1654:126:o;20810:586::-;21132:20;;;21156:7;21132:32;21125:3;:40;;;21238:14;;21293:17;;21287:24;;;21279:72;;;;;;;4209:2:281;21279:72:126;;;4191:21:281;4248:2;4228:18;;;4221:30;4287:34;4267:18;;;4260:62;4358:5;4338:18;;;4331:33;4381:19;;21279:72:126;4007:399:281;21279:72:126;21365:14;20810:586;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;467:347:281:-;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:281;;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:281;-1:-1:-1;1332:2:281;1317:18;;1304:32;;-1:-1:-1;1348:16:281;;;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:281;-1:-1:-1;;;;819:717:281: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:281;;3803:2;3788:18;;;3782:25;3747:16;;3782:25;;-1:-1:-1;3568:245:281: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-bindings/bindings/preimageoracle_more.go b/op-bindings/bindings/preimageoracle_more.go index 32d4d16b0248..edd25f9efc77 100644 --- a/op-bindings/bindings/preimageoracle_more.go +++ b/op-bindings/bindings/preimageoracle_more.go @@ -15,7 +15,7 @@ var PreimageOracleStorageLayout = new(solc.StorageLayout) var PreimageOracleDeployedBin = "0x608060405234801561001057600080fd5b506004361061007d5760003560e01c8063e03110e11161005b578063e03110e114610111578063e159261114610139578063fe4ac08e1461014e578063fef2b4ed146101c357600080fd5b806361238bde146100825780638542cf50146100c05780639a1f5e7f146100fe575b600080fd5b6100ad610090366004610551565b600160209081526000928352604080842090915290825290205481565b6040519081526020015b60405180910390f35b6100ee6100ce366004610551565b600260209081526000928352604080842090915290825290205460ff1681565b60405190151581526020016100b7565b6100ad61010c366004610573565b6101e3565b61012461011f366004610551565b6102b6565b604080519283526020830191909152016100b7565b61014c6101473660046105a5565b6103a7565b005b61014c61015c366004610573565b6000838152600260209081526040808320878452825280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660019081179091558684528252808320968352958152858220939093559283529082905291902055565b6100ad6101d1366004610621565b60006020819052908152604090205481565b60006101ee856104b0565b90506101fb836008610669565b8211806102085750602083115b1561023f576040517ffe25498700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000602081815260c085901b82526008959095528251828252600286526040808320858452875280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600190811790915584845287528083209483529386528382205581815293849052922055919050565b6000828152600260209081526040808320848452909152812054819060ff1661033f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f7072652d696d616765206d757374206578697374000000000000000000000000604482015260640160405180910390fd5b506000838152602081815260409091205461035b816008610669565b610366856020610669565b106103845783610377826008610669565b6103819190610681565b91505b506000938452600160209081526040808620948652939052919092205492909150565b604435600080600883018611156103c65763fe2549876000526004601cfd5b60c083901b6080526088838682378087017ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80151908490207effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f02000000000000000000000000000000000000000000000000000000000000001760008181526002602090815260408083208b8452825280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600190811790915584845282528083209a83529981528982209390935590815290819052959095209190915550505050565b7f01000000000000000000000000000000000000000000000000000000000000007effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82161761054b81600090815233602052604090207effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f01000000000000000000000000000000000000000000000000000000000000001790565b92915050565b6000806040838503121561056457600080fd5b50508035926020909101359150565b6000806000806080858703121561058957600080fd5b5050823594602084013594506040840135936060013592509050565b6000806000604084860312156105ba57600080fd5b83359250602084013567ffffffffffffffff808211156105d957600080fd5b818601915086601f8301126105ed57600080fd5b8135818111156105fc57600080fd5b87602082850101111561060e57600080fd5b6020830194508093505050509250925092565b60006020828403121561063357600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000821982111561067c5761067c61063a565b500190565b6000828210156106935761069361063a565b50039056fea164736f6c634300080f000a" -var PreimageOracleDeployedSourceMap = "306:4436:127:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;537:68;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;413:25:279;;;401:2;386:18;537:68:127;;;;;;;;680:66;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;614:14:279;;607:22;589:41;;577:2;562:18;680:66:127;449:187:279;1938:1165:127;;;;;;:::i;:::-;;:::i;789:536::-;;;;;;:::i;:::-;;:::i;:::-;;;;1205:25:279;;;1261:2;1246:18;;1239:34;;;;1178:18;789:536:127;1031:248:279;3145:1595:127;;;;;;:::i;:::-;;:::i;:::-;;1672:224;;;;;;:::i;:::-;1767:19;;;;:14;:19;;;;;;;;:31;;;;;;;;:38;;;;1801:4;1767:38;;;;;;1815:18;;;;;;;;:30;;;;;;;;;:37;;;;1862:20;;;;;;;;;;:27;1672:224;419:50;;;;;;:::i;:::-;;;;;;;;;;;;;;;1938:1165;2100:12;2205:36;2234:6;2205:28;:36::i;:::-;2198:43;-1:-1:-1;2335:9:127;:5;2343:1;2335:9;:::i;:::-;2321:11;:23;:37;;;;2356:2;2348:5;:10;2321:37;2317:90;;;2381:15;;;;;;;;;;;;;;2317:90;2476:12;2576:4;2569:18;;;2677:3;2673:15;;;2660:29;;2709:4;2702:19;;;;2811:18;;2901:20;;;:14;:20;;;;;;:33;;;;;;;;:40;;;;2937:4;2901:40;;;;;;2951:19;;;;;;;;:32;;;;;;;;;:39;3067:21;;;;;;;;;:29;2916:4;1938:1165;-1:-1:-1;1938:1165:127:o;789:536::-;865:12;914:20;;;:14;:20;;;;;;;;:29;;;;;;;;;865:12;;914:29;;906:62;;;;;;;3229:2:279;906:62:127;;;3211:21:279;3268:2;3248:18;;;3241:30;3307:22;3287:18;;;3280:50;3347:18;;906:62:127;;;;;;;;-1:-1:-1;1099:14:127;1116:21;;;1087:2;1116:21;;;;;;;;1167:10;1116:21;1176:1;1167:10;:::i;:::-;1151:12;:7;1161:2;1151:12;:::i;:::-;:26;1147:87;;1216:7;1203:10;:6;1212:1;1203:10;:::i;:::-;:20;;;;:::i;:::-;1193:30;;1147:87;-1:-1:-1;1290:19:127;;;;:13;:19;;;;;;;;:28;;;;;;;;;;;;789:536;;-1:-1:-1;789:536:127:o;3145:1595::-;3441:4;3428:18;3246:12;;3570:1;3560:12;;3544:29;;3541:210;;;3645:10;3642:1;3635:21;3735:1;3729:4;3722:15;3541:210;3994:3;3990:14;;;3894:4;3978:27;4025:11;3999:4;4144:16;4025:11;4126:41;4357:29;;;4361:11;4357:29;4351:36;4409:20;;;;4556:19;4549:27;4578:11;4546:44;4609:19;;;;4587:1;4609:19;;;;;;;;:32;;;;;;;;:39;;;;4644:4;4609:39;;;;;;4658:18;;;;;;;;:31;;;;;;;;;:38;;;;4706:20;;;;;;;;;;;:27;;;;-1:-1:-1;;;;3145:1595:127:o;492:353:126:-;752:11;777:19;765:32;;749:49;824:14;749:49;1277:21;1426:15;;;1467:8;1461:4;1454:22;1595:4;1582:18;;1602:19;1578:44;1624:11;1575:61;;1222:430;824:14;817:21;492:353;-1:-1:-1;;492:353:126:o;14:248:279:-;82:6;90;143:2;131:9;122:7;118:23;114:32;111:52;;;159:1;156;149:12;111:52;-1:-1:-1;;182:23:279;;;252:2;237:18;;;224:32;;-1:-1:-1;14:248:279:o;641:385::-;727:6;735;743;751;804:3;792:9;783:7;779:23;775:33;772:53;;;821:1;818;811:12;772:53;-1:-1:-1;;844:23:279;;;914:2;899:18;;886:32;;-1:-1:-1;965:2:279;950:18;;937:32;;1016:2;1001:18;988:32;;-1:-1:-1;641:385:279;-1:-1:-1;641:385:279:o;1284:659::-;1363:6;1371;1379;1432:2;1420:9;1411:7;1407:23;1403:32;1400:52;;;1448:1;1445;1438:12;1400:52;1484:9;1471:23;1461:33;;1545:2;1534:9;1530:18;1517:32;1568:18;1609:2;1601:6;1598:14;1595:34;;;1625:1;1622;1615:12;1595:34;1663:6;1652:9;1648:22;1638:32;;1708:7;1701:4;1697:2;1693:13;1689:27;1679:55;;1730:1;1727;1720:12;1679:55;1770:2;1757:16;1796:2;1788:6;1785:14;1782:34;;;1812:1;1809;1802:12;1782:34;1857:7;1852:2;1843:6;1839:2;1835:15;1831:24;1828:37;1825:57;;;1878:1;1875;1868:12;1825:57;1909:2;1905;1901:11;1891:21;;1931:6;1921:16;;;;;1284:659;;;;;:::o;2338:180::-;2397:6;2450:2;2438:9;2429:7;2425:23;2421:32;2418:52;;;2466:1;2463;2456:12;2418:52;-1:-1:-1;2489:23:279;;2338:180;-1:-1:-1;2338:180:279:o;2705:184::-;2757:77;2754:1;2747:88;2854:4;2851:1;2844:15;2878:4;2875:1;2868:15;2894:128;2934:3;2965:1;2961:6;2958:1;2955:13;2952:39;;;2971:18;;:::i;:::-;-1:-1:-1;3007:9:279;;2894:128::o;3376:125::-;3416:4;3444:1;3441;3438:8;3435:34;;;3449:18;;:::i;:::-;-1:-1:-1;3486:9:279;;3376:125::o" +var PreimageOracleDeployedSourceMap = "306:4436:128:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;537:68;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;413:25:281;;;401:2;386:18;537:68:128;;;;;;;;680:66;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;614:14:281;;607:22;589:41;;577:2;562:18;680:66:128;449:187:281;1938:1165:128;;;;;;:::i;:::-;;:::i;789:536::-;;;;;;:::i;:::-;;:::i;:::-;;;;1205:25:281;;;1261:2;1246:18;;1239:34;;;;1178:18;789:536:128;1031:248:281;3145:1595:128;;;;;;:::i;:::-;;:::i;:::-;;1672:224;;;;;;:::i;:::-;1767:19;;;;:14;:19;;;;;;;;:31;;;;;;;;:38;;;;1801:4;1767:38;;;;;;1815:18;;;;;;;;:30;;;;;;;;;:37;;;;1862:20;;;;;;;;;;:27;1672:224;419:50;;;;;;:::i;:::-;;;;;;;;;;;;;;;1938:1165;2100:12;2205:36;2234:6;2205:28;:36::i;:::-;2198:43;-1:-1:-1;2335:9:128;:5;2343:1;2335:9;:::i;:::-;2321:11;:23;:37;;;;2356:2;2348:5;:10;2321:37;2317:90;;;2381:15;;;;;;;;;;;;;;2317:90;2476:12;2576:4;2569:18;;;2677:3;2673:15;;;2660:29;;2709:4;2702:19;;;;2811:18;;2901:20;;;:14;:20;;;;;;:33;;;;;;;;:40;;;;2937:4;2901:40;;;;;;2951:19;;;;;;;;:32;;;;;;;;;:39;3067:21;;;;;;;;;:29;2916:4;1938:1165;-1:-1:-1;1938:1165:128:o;789:536::-;865:12;914:20;;;:14;:20;;;;;;;;:29;;;;;;;;;865:12;;914:29;;906:62;;;;;;;3229:2:281;906:62:128;;;3211:21:281;3268:2;3248:18;;;3241:30;3307:22;3287:18;;;3280:50;3347:18;;906:62:128;;;;;;;;-1:-1:-1;1099:14:128;1116:21;;;1087:2;1116:21;;;;;;;;1167:10;1116:21;1176:1;1167:10;:::i;:::-;1151:12;:7;1161:2;1151:12;:::i;:::-;:26;1147:87;;1216:7;1203:10;:6;1212:1;1203:10;:::i;:::-;:20;;;;:::i;:::-;1193:30;;1147:87;-1:-1:-1;1290:19:128;;;;:13;:19;;;;;;;;:28;;;;;;;;;;;;789:536;;-1:-1:-1;789:536:128:o;3145:1595::-;3441:4;3428:18;3246:12;;3570:1;3560:12;;3544:29;;3541:210;;;3645:10;3642:1;3635:21;3735:1;3729:4;3722:15;3541:210;3994:3;3990:14;;;3894:4;3978:27;4025:11;3999:4;4144:16;4025:11;4126:41;4357:29;;;4361:11;4357:29;4351:36;4409:20;;;;4556:19;4549:27;4578:11;4546:44;4609:19;;;;4587:1;4609:19;;;;;;;;:32;;;;;;;;:39;;;;4644:4;4609:39;;;;;;4658:18;;;;;;;;:31;;;;;;;;;:38;;;;4706:20;;;;;;;;;;;:27;;;;-1:-1:-1;;;;3145:1595:128:o;492:353:127:-;752:11;777:19;765:32;;749:49;824:14;749:49;1277:21;1426:15;;;1467:8;1461:4;1454:22;1595:4;1582:18;;1602:19;1578:44;1624:11;1575:61;;1222:430;824:14;817:21;492:353;-1:-1:-1;;492:353:127:o;14:248:281:-;82:6;90;143:2;131:9;122:7;118:23;114:32;111:52;;;159:1;156;149:12;111:52;-1:-1:-1;;182:23:281;;;252:2;237:18;;;224:32;;-1:-1:-1;14:248:281:o;641:385::-;727:6;735;743;751;804:3;792:9;783:7;779:23;775:33;772:53;;;821:1;818;811:12;772:53;-1:-1:-1;;844:23:281;;;914:2;899:18;;886:32;;-1:-1:-1;965:2:281;950:18;;937:32;;1016:2;1001:18;988:32;;-1:-1:-1;641:385:281;-1:-1:-1;641:385:281:o;1284:659::-;1363:6;1371;1379;1432:2;1420:9;1411:7;1407:23;1403:32;1400:52;;;1448:1;1445;1438:12;1400:52;1484:9;1471:23;1461:33;;1545:2;1534:9;1530:18;1517:32;1568:18;1609:2;1601:6;1598:14;1595:34;;;1625:1;1622;1615:12;1595:34;1663:6;1652:9;1648:22;1638:32;;1708:7;1701:4;1697:2;1693:13;1689:27;1679:55;;1730:1;1727;1720:12;1679:55;1770:2;1757:16;1796:2;1788:6;1785:14;1782:34;;;1812:1;1809;1802:12;1782:34;1857:7;1852:2;1843:6;1839:2;1835:15;1831:24;1828:37;1825:57;;;1878:1;1875;1868:12;1825:57;1909:2;1905;1901:11;1891:21;;1931:6;1921:16;;;;;1284:659;;;;;:::o;2338:180::-;2397:6;2450:2;2438:9;2429:7;2425:23;2421:32;2418:52;;;2466:1;2463;2456:12;2418:52;-1:-1:-1;2489:23:281;;2338:180;-1:-1:-1;2338:180:281:o;2705:184::-;2757:77;2754:1;2747:88;2854:4;2851:1;2844:15;2878:4;2875:1;2868:15;2894:128;2934:3;2965:1;2961:6;2958:1;2955:13;2952:39;;;2971:18;;:::i;:::-;-1:-1:-1;3007:9:281;;2894:128::o;3376:125::-;3416:4;3444:1;3441;3438:8;3435:34;;;3449:18;;:::i;:::-;-1:-1:-1;3486:9:281;;3376:125::o" func init() { if err := json.Unmarshal([]byte(PreimageOracleStorageLayoutJSON), PreimageOracleStorageLayout); err != nil { diff --git a/packages/contracts-bedrock/.gas-snapshot b/packages/contracts-bedrock/.gas-snapshot index bdb22303f4de..a33150cfd073 100644 --- a/packages/contracts-bedrock/.gas-snapshot +++ b/packages/contracts-bedrock/.gas-snapshot @@ -46,14 +46,9 @@ CrossDomainOwnable3_Test:test_transferOwnership_zeroAddress_reverts() (gas: 1208 CrossDomainOwnableThroughPortal_Test:test_depositTransaction_crossDomainOwner_succeeds() (gas: 81417) CrossDomainOwnable_Test:test_onlyOwner_notOwner_reverts() (gas: 10597) CrossDomainOwnable_Test:test_onlyOwner_succeeds() (gas: 34883) -DelayedVetoable_Getters_Test:test_getters() (gas: 28128) -DelayedVetoable_Getters_TestFail:test_getters_notVetoer() (gas: 52018) -DelayedVetoable_HandleCall_TestFail:test_handleCall_forwardingTargetReverts_reverts(bytes) (runs: 256, μ: 59701, ~: 59067) -DelayedVetoable_HandleCall_TestFail:test_handleCall_forwardingTooSoon_reverts(bytes) (runs: 256, μ: 49589, ~: 49170) -DelayedVetoable_HandleCall_TestFail:test_handleCall_targetIsZero_reverts() (gas: 17599) -DelayedVetoable_HandleCall_TestFail:test_handleCall_unAuthorizedInitiation_reverts() (gas: 6627) -DelayedVetoable_Veto_Test:test_veto_succeeds(bytes) (runs: 256, μ: 21411, ~: 20927) -DelayedVetoable_Veto_TestFail:test_veto_notVetoer_reverts() (gas: 17552) +DelayedVetoable_Getters_Test:test_getters() (gas: 21342) +DelayedVetoable_Getters_TestFail:test_getters_notZeroAddress_reverts() (gas: 26649) +DelayedVetoable_HandleCall_TestFail:test_handleCall_unauthorizedInitiation_reverts() (gas: 20234) DeleteOutput:test_script_succeeds() (gas: 3100) DeployerWhitelist_Test:test_owner_succeeds() (gas: 7582) DeployerWhitelist_Test:test_storageSlots_succeeds() (gas: 33395) diff --git a/packages/contracts-bedrock/semver-lock.json b/packages/contracts-bedrock/semver-lock.json index 5e4580fe5eee..12e92838ed86 100644 --- a/packages/contracts-bedrock/semver-lock.json +++ b/packages/contracts-bedrock/semver-lock.json @@ -1,6 +1,7 @@ { "src/EAS/EAS.sol": "0x1acb25751a1206eb859cc5fcf934da2f84cfb907b8e8951d86fc4e43c53a7303", "src/EAS/SchemaRegistry.sol": "0x305f3afed2e337cd70aac70fc202e6503b947b0a31e0d4e18c49486eeb635bb5", + "src/L1/DelayedVetoable.sol": "0x276c6276292095e6aa37a70008cf4e0d1cbcc020dbc9107459bbc72ab5ed744f", "src/L1/L1CrossDomainMessenger.sol": "0x14f5991022705b8bd3bf931e138a528cc9c9e90d0f1ec398efd5079224d61b3b", "src/L1/L1ERC721Bridge.sol": "0x3e0e3d2f4c151e41585850f06e6452cdda86348debfe6ff16e364a839266450b", "src/L1/L1StandardBridge.sol": "0x12e227c6054660a83b92d823a7447db96a7d476b7a94e0f1807772d400329880", From 5d9369748e10db2272b168fab99b2f016f1bd0a4 Mon Sep 17 00:00:00 2001 From: Inphi Date: Tue, 19 Sep 2023 11:22:19 -0400 Subject: [PATCH 52/87] op-node: Fix race condition while closing OpNode (#7303) Before the `OpNode` closes it closes its data sources. If the runtime config reloader goroutine is still using the data sources then it may creates a goroutine panic. Specifically, when a `limitClient` is used, it will be fail to write an in-flight request to its semaphore after the client is closed. --- op-node/node/node.go | 42 ++++++++++++++++++++++++++++++-------- op-node/node/superchain.go | 19 +++++++++-------- 2 files changed, 44 insertions(+), 17 deletions(-) diff --git a/op-node/node/node.go b/op-node/node/node.go index 740467fe6b06..619509d589d4 100644 --- a/op-node/node/node.go +++ b/op-node/node/node.go @@ -49,6 +49,9 @@ type OpNode struct { resourcesCtx context.Context resourcesClose context.CancelFunc + // Indicates when it's safe to close data sources used by the runtimeConfig bg loader + runtimeConfigReloaderDone chan struct{} + closed atomic.Bool } @@ -197,9 +200,8 @@ func (n *OpNode) initRuntimeConfig(ctx context.Context, cfg *Config) error { return l1Head, err } - n.handleProtocolVersionsUpdate(ctx) - - return l1Head, nil + err = n.handleProtocolVersionsUpdate(ctx) + return l1Head, err } // initialize the runtime config before unblocking @@ -210,10 +212,10 @@ func (n *OpNode) initRuntimeConfig(ctx context.Context, cfg *Config) error { } // start a background loop, to keep reloading it at the configured reload interval - go func(ctx context.Context, reloadInterval time.Duration) { + reloader := func(ctx context.Context, reloadInterval time.Duration) bool { if reloadInterval <= 0 { n.log.Debug("not running runtime-config reloading background loop") - return + return false } ticker := time.NewTicker(reloadInterval) defer ticker.Stop() @@ -222,13 +224,30 @@ func (n *OpNode) initRuntimeConfig(ctx context.Context, cfg *Config) error { case <-ticker.C: // If the reload fails, we will try again the next interval. // Missing a runtime-config update is not critical, and we do not want to overwhelm the L1 RPC. - if l1Head, err := reload(ctx); err != nil { - n.log.Warn("failed to reload runtime config", "err", err) - } else { + l1Head, err := reload(ctx) + switch err { + case errNodeHalt, nil: n.log.Debug("reloaded runtime config", "l1_head", l1Head) + if err == errNodeHalt { + return true + } + default: + n.log.Warn("failed to reload runtime config", "err", err) } case <-ctx.Done(): - return + return false + } + } + } + + n.runtimeConfigReloaderDone = make(chan struct{}) + // Manages the lifetime of reloader. In order to safely Close the OpNode + go func(ctx context.Context, reloadInterval time.Duration) { + halt := reloader(ctx, reloadInterval) + close(n.runtimeConfigReloaderDone) + if halt { + if err := n.Close(); err != nil { + n.log.Error("Failed to halt rollup", "err", err) } } }(n.resourcesCtx, cfg.RuntimeConfigReloadInterval) // this keeps running after initialization @@ -499,6 +518,11 @@ func (n *OpNode) Close() error { } } + // Wait for the runtime config loader to be done using the data sources before closing them + if n.runtimeConfigReloaderDone != nil { + <-n.runtimeConfigReloaderDone + } + // close L2 engine RPC client if n.l2Source != nil { n.l2Source.Close() diff --git a/op-node/node/superchain.go b/op-node/node/superchain.go index f7ec013767f2..071198f6f760 100644 --- a/op-node/node/superchain.go +++ b/op-node/node/superchain.go @@ -2,18 +2,21 @@ package node import ( "context" + "errors" "github.com/ethereum-optimism/optimism/op-node/rollup" "github.com/ethereum/go-ethereum/eth/catalyst" "github.com/ethereum/go-ethereum/params" ) -func (n *OpNode) handleProtocolVersionsUpdate(ctx context.Context) { +var errNodeHalt = errors.New("opted to halt, unprepared for protocol change") + +func (n *OpNode) handleProtocolVersionsUpdate(ctx context.Context) error { recommended := n.runCfg.RecommendedProtocolVersion() required := n.runCfg.RequiredProtocolVersion() // if the protocol version sources are disabled we do not process them if recommended == (params.ProtocolVersion{}) && required == (params.ProtocolVersion{}) { - return + return nil } local := rollup.OPStackSupport // forward to execution engine, and get back the protocol version that op-geth supports @@ -30,20 +33,20 @@ func (n *OpNode) handleProtocolVersionsUpdate(ctx context.Context) { catalyst.LogProtocolVersionSupport(n.log.New("node", "engine"), local, required, "required") // We may need to halt the node, if the user opted in to handling incompatible protocol-version signals - n.HaltMaybe() + return n.haltMaybe() } -// HaltMaybe halts the rollup node if the runtime config indicates an incompatible required protocol change +// haltMaybe returns errNodeHalt if the runtime config indicates an incompatible required protocol change // and the node is configured to opt-in to halting at this protocol-change level. -func (n *OpNode) HaltMaybe() { +func (n *OpNode) haltMaybe() error { local := rollup.OPStackSupport required := n.runCfg.RequiredProtocolVersion() if haltMaybe(n.rollupHalt, local.Compare(required)) { // halt if we opted in to do so at this granularity n.log.Error("Opted to halt, unprepared for protocol change", "required", required, "local", local) - if err := n.Close(); err != nil { - n.log.Error("Failed to halt rollup", "err", err) - } + // Avoid deadlocking the runtime config reloader by closing the OpNode elsewhere + return errNodeHalt } + return nil } // haltMaybe returns true when we should halt, given the halt-option and required-version comparison From b6c8e14ed8b29a423054503190a7f689df435d44 Mon Sep 17 00:00:00 2001 From: Andreas Bigger Date: Fri, 15 Sep 2023 17:05:05 -0400 Subject: [PATCH 53/87] introduce the rollup rpc url flag --- op-challenger/flags/flags.go | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/op-challenger/flags/flags.go b/op-challenger/flags/flags.go index a57f5c43f927..2fb4bf1d92a6 100644 --- a/op-challenger/flags/flags.go +++ b/op-challenger/flags/flags.go @@ -76,14 +76,22 @@ var ( EnvVars: prefixEnvVars("HTTP_POLL_INTERVAL"), Value: config.DefaultPollInterval, } + RollupRpcFlag = &cli.StringFlag{ + Name: "rollup-rpc", + Usage: "HTTP provider URL for the rollup node", + EnvVars: prefixEnvVars("ROLLUP_RPC"), + } AlphabetFlag = &cli.StringFlag{ Name: "alphabet", Usage: "Correct Alphabet Trace (alphabet trace type only)", EnvVars: prefixEnvVars("ALPHABET"), } CannonNetworkFlag = &cli.StringFlag{ - Name: "cannon-network", - Usage: fmt.Sprintf("Predefined network selection. Available networks: %s (cannon trace type only)", strings.Join(chaincfg.AvailableNetworks(), ", ")), + Name: "cannon-network", + Usage: fmt.Sprintf( + "Predefined network selection. Available networks: %s (cannon trace type only)", + strings.Join(chaincfg.AvailableNetworks(), ", "), + ), EnvVars: prefixEnvVars("CANNON_NETWORK"), } CannonRollupConfigFlag = &cli.StringFlag{ @@ -149,6 +157,7 @@ var requiredFlags = []cli.Flag{ var optionalFlags = []cli.Flag{ MaxConcurrencyFlag, HTTPPollInterval, + RollupRpcFlag, AlphabetFlag, GameAllowlistFlag, CannonNetworkFlag, From 4cfe73f614c02fa9fe02092a7e4e2cbddb2284b9 Mon Sep 17 00:00:00 2001 From: Andreas Bigger Date: Fri, 15 Sep 2023 17:39:16 -0400 Subject: [PATCH 54/87] Rollup RPC Flag --- op-challenger/cmd/main_test.go | 23 +++++++++++++++++++++++ op-challenger/config/config.go | 9 +++++++++ op-challenger/config/config_test.go | 10 ++++++++++ op-challenger/flags/flags.go | 4 ++++ 4 files changed, 46 insertions(+) diff --git a/op-challenger/cmd/main_test.go b/op-challenger/cmd/main_test.go index 630bf196e1de..2ba686b3e60c 100644 --- a/op-challenger/cmd/main_test.go +++ b/op-challenger/cmd/main_test.go @@ -24,6 +24,7 @@ var ( cannonPreState = "./pre.json" datadir = "./test_data" cannonL2 = "http://example.com:9545" + rollupRpc = "http://example.com:8555" alphabetTrace = "abcdefghijz" agreeWithProposedOutput = "true" ) @@ -249,6 +250,25 @@ func TestDataDir(t *testing.T) { }) } +func TestRollupRpc(t *testing.T) { + t.Run("NotRequiredForAlphabetTrace", func(t *testing.T) { + configForArgs(t, addRequiredArgsExcept(config.TraceTypeAlphabet, "--rollup-rpc")) + }) + + t.Run("NotRequiredForAlphabetTrace", func(t *testing.T) { + configForArgs(t, addRequiredArgsExcept(config.TraceTypeCannon, "--rollup-rpc")) + }) + + t.Run("RequiredForOutputCannonTrace", func(t *testing.T) { + verifyArgsInvalid(t, "flag rollup-rpc is required", addRequiredArgsExcept(config.TraceTypeOutputCannon, "--rollup-rpc")) + }) + + t.Run("Valid", func(t *testing.T) { + cfg := configForArgs(t, addRequiredArgs(config.TraceTypeOutputCannon)) + require.Equal(t, rollupRpc, cfg.RollupRpc) + }) +} + func TestCannonL2(t *testing.T) { t.Run("NotRequiredForAlphabetTrace", func(t *testing.T) { configForArgs(t, addRequiredArgsExcept(config.TraceTypeAlphabet, "--cannon-l2")) @@ -429,6 +449,9 @@ func requiredArgs(traceType config.TraceType) map[string]string { args["--cannon-prestate"] = cannonPreState args["--cannon-l2"] = cannonL2 } + if traceType == config.TraceTypeOutputCannon { + args["--rollup-rpc"] = rollupRpc + } return args } diff --git a/op-challenger/config/config.go b/op-challenger/config/config.go index 983ab5cfcb5a..9072a08334e4 100644 --- a/op-challenger/config/config.go +++ b/op-challenger/config/config.go @@ -32,6 +32,7 @@ var ( ErrCannonNetworkAndRollupConfig = errors.New("only specify one of network or rollup config path") ErrCannonNetworkAndL2Genesis = errors.New("only specify one of network or l2 genesis path") ErrCannonNetworkUnknown = errors.New("unknown cannon network") + ErrMissingRollupRpc = errors.New("missing rollup rpc url") ) type TraceType string @@ -107,6 +108,9 @@ type Config struct { // Specific to the alphabet trace provider AlphabetTrace string // String for the AlphabetTraceProvider + // Specific to the output cannon trace type + RollupRpc string + // Specific to the cannon trace provider CannonBin string // Path to the cannon executable to run when generating trace data CannonServer string // Path to the op-program executable that provides the pre-image oracle server @@ -168,6 +172,11 @@ func (c Config) Check() error { if c.MaxConcurrency == 0 { return ErrMaxConcurrencyZero } + if c.TraceType == TraceTypeOutputCannon { + if c.RollupRpc == "" { + return ErrMissingRollupRpc + } + } if c.TraceType == TraceTypeCannon || c.TraceType == TraceTypeOutputCannon { if c.CannonBin == "" { return ErrMissingCannonBin diff --git a/op-challenger/config/config_test.go b/op-challenger/config/config_test.go index 63d33f78da06..84f8a0e977dd 100644 --- a/op-challenger/config/config_test.go +++ b/op-challenger/config/config_test.go @@ -20,6 +20,7 @@ var ( validCannonAbsolutPreState = "pre.json" validDatadir = "/tmp/data" validCannonL2 = "http://localhost:9545" + validRollupRpc = "http://localhost:8555" agreeWithProposedOutput = true ) @@ -35,6 +36,9 @@ func validConfig(traceType TraceType) Config { cfg.CannonL2 = validCannonL2 cfg.CannonNetwork = validCannonNetwork } + if traceType == TraceTypeOutputCannon { + cfg.RollupRpc = validRollupRpc + } return cfg } @@ -125,6 +129,12 @@ func TestHttpPollInterval(t *testing.T) { }) } +func TestRollupRpcRequired(t *testing.T) { + config := validConfig(TraceTypeOutputCannon) + config.RollupRpc = "" + require.ErrorIs(t, config.Check(), ErrMissingRollupRpc) +} + func TestCannonL2Required(t *testing.T) { config := validConfig(TraceTypeCannon) config.CannonL2 = "" diff --git a/op-challenger/flags/flags.go b/op-challenger/flags/flags.go index 2fb4bf1d92a6..8e08c7a43fb1 100644 --- a/op-challenger/flags/flags.go +++ b/op-challenger/flags/flags.go @@ -230,6 +230,9 @@ func CheckRequired(ctx *cli.Context) error { if err := CheckCannonFlags(ctx); err != nil { return err } + if !ctx.IsSet(RollupRpcFlag.Name) { + return fmt.Errorf("flag %s is required", RollupRpcFlag.Name) + } default: return fmt.Errorf("invalid trace type. must be one of %v", config.TraceTypes) } @@ -275,6 +278,7 @@ func NewConfigFromCLI(ctx *cli.Context) (*config.Config, error) { GameWindow: ctx.Duration(GameWindowFlag.Name), MaxConcurrency: maxConcurrency, PollInterval: ctx.Duration(HTTPPollInterval.Name), + RollupRpc: ctx.String(RollupRpcFlag.Name), AlphabetTrace: ctx.String(AlphabetFlag.Name), CannonNetwork: ctx.String(CannonNetworkFlag.Name), CannonRollupConfigPath: ctx.String(CannonRollupConfigFlag.Name), From 122a015bbb61724f5aad32e05c4d6bd482d47d51 Mon Sep 17 00:00:00 2001 From: Will Cory Date: Fri, 15 Sep 2023 11:17:02 -0700 Subject: [PATCH 55/87] Revert "Merge pull request #6863 from ethereum-optimism/08-17-chore_indexer_Disable_flaky_indexer_tests" This reverts commit 306979114416fec040162506d1c927a3f3b2224b, reversing changes made to 6f36f623eb0924244d63da346fc0770b057a08ef. --- ops/check-changed/main.py | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/ops/check-changed/main.py b/ops/check-changed/main.py index c703c9100b58..fb3a9a458abf 100644 --- a/ops/check-changed/main.py +++ b/ops/check-changed/main.py @@ -56,11 +56,7 @@ def main(): patterns = sys.argv[1].split(',') - - # temporarily only run indexer tests if indexer is changed because the tests are flaky - if len(patterns) != 1 or patterns[0] != "indexer": - patterns = patterns + REBUILD_ALL_PATTERNS - + patterns = patterns + REBUILD_ALL_PATTERNS fp = os.path.realpath(__file__) monorepo_path = os.path.realpath(os.path.join(fp, '..', '..')) From 802b3a2f5bcc839c326fc73ac904dcabcc003859 Mon Sep 17 00:00:00 2001 From: inphi Date: Wed, 30 Aug 2023 00:34:45 -0400 Subject: [PATCH 56/87] feat(ctb): Rework FaultDisputeGame resolution Initial changes to the FDG resolution function to be incentive compatible with bonds. --- op-bindings/bindings/faultdisputegame.go | 25 +++- op-bindings/bindings/faultdisputegame_more.go | 4 +- packages/contracts-bedrock/.gas-snapshot | 68 +++++---- packages/contracts-bedrock/semver-lock.json | 2 +- .../src/dispute/FaultDisputeGame.sol | 113 +++++++------- .../dispute/interfaces/IFaultDisputeGame.sol | 8 + .../src/dispute/lib/LibHashing.sol | 15 +- .../src/libraries/DisputeErrors.sol | 6 + .../test/FaultDisputeGame.t.sol | 141 ++++++++++++++++-- 9 files changed, 277 insertions(+), 105 deletions(-) diff --git a/op-bindings/bindings/faultdisputegame.go b/op-bindings/bindings/faultdisputegame.go index 2da88ef8329b..8c5557cf8820 100644 --- a/op-bindings/bindings/faultdisputegame.go +++ b/op-bindings/bindings/faultdisputegame.go @@ -37,8 +37,8 @@ type IFaultDisputeGameOutputProposal struct { // FaultDisputeGameMetaData contains all meta data concerning the FaultDisputeGame contract. var FaultDisputeGameMetaData = &bind.MetaData{ - ABI: "[{\"inputs\":[{\"internalType\":\"GameType\",\"name\":\"_gameType\",\"type\":\"uint8\"},{\"internalType\":\"Claim\",\"name\":\"_absolutePrestate\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"_maxGameDepth\",\"type\":\"uint256\"},{\"internalType\":\"Duration\",\"name\":\"_gameDuration\",\"type\":\"uint64\"},{\"internalType\":\"contractIBigStepper\",\"name\":\"_vm\",\"type\":\"address\"},{\"internalType\":\"contractL2OutputOracle\",\"name\":\"_l2oo\",\"type\":\"address\"},{\"internalType\":\"contractBlockOracle\",\"name\":\"_blockOracle\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"CannotDefendRootClaim\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ClaimAlreadyExists\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ClockNotExpired\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ClockTimeExceeded\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"GameDepthExceeded\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"GameNotInProgress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidParent\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidPrestate\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1HeadTooOld\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"Claim\",\"name\":\"rootClaim\",\"type\":\"bytes32\"}],\"name\":\"UnexpectedRootClaim\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ValidStep\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"parentIndex\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"Claim\",\"name\":\"claim\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"claimant\",\"type\":\"address\"}],\"name\":\"Move\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"enumGameStatus\",\"name\":\"status\",\"type\":\"uint8\"}],\"name\":\"Resolved\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"ABSOLUTE_PRESTATE\",\"outputs\":[{\"internalType\":\"Claim\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"BLOCK_ORACLE\",\"outputs\":[{\"internalType\":\"contractBlockOracle\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"GAME_DURATION\",\"outputs\":[{\"internalType\":\"Duration\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"L2_OUTPUT_ORACLE\",\"outputs\":[{\"internalType\":\"contractL2OutputOracle\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MAX_GAME_DEPTH\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"VM\",\"outputs\":[{\"internalType\":\"contractIBigStepper\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_ident\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_partOffset\",\"type\":\"uint256\"}],\"name\":\"addLocalData\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_parentIndex\",\"type\":\"uint256\"},{\"internalType\":\"Claim\",\"name\":\"_claim\",\"type\":\"bytes32\"}],\"name\":\"attack\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"bondManager\",\"outputs\":[{\"internalType\":\"contractIBondManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"claimData\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"parentIndex\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"countered\",\"type\":\"bool\"},{\"internalType\":\"Claim\",\"name\":\"claim\",\"type\":\"bytes32\"},{\"internalType\":\"Position\",\"name\":\"position\",\"type\":\"uint128\"},{\"internalType\":\"Clock\",\"name\":\"clock\",\"type\":\"uint128\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"claimDataLen\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"len_\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"createdAt\",\"outputs\":[{\"internalType\":\"Timestamp\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_parentIndex\",\"type\":\"uint256\"},{\"internalType\":\"Claim\",\"name\":\"_claim\",\"type\":\"bytes32\"}],\"name\":\"defend\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"extraData\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"extraData_\",\"type\":\"bytes\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"gameData\",\"outputs\":[{\"internalType\":\"GameType\",\"name\":\"gameType_\",\"type\":\"uint8\"},{\"internalType\":\"Claim\",\"name\":\"rootClaim_\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"extraData_\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"gameType\",\"outputs\":[{\"internalType\":\"GameType\",\"name\":\"gameType_\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"l1BlockNumber\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"l1BlockNumber_\",\"type\":\"uint256\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"l1Head\",\"outputs\":[{\"internalType\":\"Hash\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"l2BlockNumber\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"l2BlockNumber_\",\"type\":\"uint256\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_challengeIndex\",\"type\":\"uint256\"},{\"internalType\":\"Claim\",\"name\":\"_claim\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"_isAttack\",\"type\":\"bool\"}],\"name\":\"move\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"proposals\",\"outputs\":[{\"components\":[{\"internalType\":\"uint128\",\"name\":\"index\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"l2BlockNumber\",\"type\":\"uint128\"},{\"internalType\":\"Hash\",\"name\":\"outputRoot\",\"type\":\"bytes32\"}],\"internalType\":\"structIFaultDisputeGame.OutputProposal\",\"name\":\"starting\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint128\",\"name\":\"index\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"l2BlockNumber\",\"type\":\"uint128\"},{\"internalType\":\"Hash\",\"name\":\"outputRoot\",\"type\":\"bytes32\"}],\"internalType\":\"structIFaultDisputeGame.OutputProposal\",\"name\":\"disputed\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"enumGameStatus\",\"name\":\"status_\",\"type\":\"uint8\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"rootClaim\",\"outputs\":[{\"internalType\":\"Claim\",\"name\":\"rootClaim_\",\"type\":\"bytes32\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"status\",\"outputs\":[{\"internalType\":\"enumGameStatus\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_claimIndex\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"_isAttack\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"_stateData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"_proof\",\"type\":\"bytes\"}],\"name\":\"step\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"version\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]", - Bin: "0x6101c06040523480156200001257600080fd5b5060405162002d6238038062002d628339810160408190526200003591620000a1565b6000608081905260a052600960c05260ff9096166101a05260e094909452610100929092526001600160401b0316610120526001600160a01b039081166101405290811661016052166101805262000145565b6001600160a01b03811681146200009e57600080fd5b50565b600080600080600080600060e0888a031215620000bd57600080fd5b875160ff81168114620000cf57600080fd5b602089015160408a015160608b015192995090975095506001600160401b0381168114620000fc57600080fd5b60808901519094506200010f8162000088565b60a0890151909350620001228162000088565b60c0890151909250620001358162000088565b8091505092959891949750929550565b60805160a05160c05160e05161010051610120516101405161016051610180516101a051612b466200021c600039600081816105220152611f0c01526000818161035e015261178d01526000818161059b0152818161155a0152818161162e01526117070152600081816104ec015281816107450152611c8b0152600081816105cf01528181610ab7015261109801526000818161032a015281816109bf01528181610ed70152611a8a0152600081816102210152611be601526000610d3401526000610d0b01526000610ce20152612b466000f3fe6080604052600436106101ac5760003560e01c80636361506d116100ec578063c0c3a0921161008a578063c6f0308c11610064578063c6f0308c1461061d578063cf09e0d014610681578063d8cc1a3c146106a2578063fa24f743146106c257600080fd5b8063c0c3a09214610589578063c31b29ce146105bd578063c55cd0c71461060a57600080fd5b80638b85902b116100c65780638b85902b1461049a57806392931298146104da578063bbdc02db1461050e578063bcef3b551461054c57600080fd5b80636361506d1461045a5780638129fc1c146104705780638980e0cc1461048557600080fd5b8063363cc4271161015957806354fd4d501161013357806354fd4d501461038057806355ef20e6146103a2578063609d333414610432578063632247ea1461044757600080fd5b8063363cc427146102b95780634778efe814610318578063529184c91461034c57600080fd5b80632810e1d61161018a5780632810e1d614610251578063298c90051461026657806335fef567146102a657600080fd5b80631e27052a146101b1578063200d2ed2146101d3578063266198f91461020f575b600080fd5b3480156101bd57600080fd5b506101d16101cc3660046123e7565b6106e6565b005b3480156101df57600080fd5b506000546101f99068010000000000000000900460ff1681565b6040516102069190612438565b60405180910390f35b34801561021b57600080fd5b506102437f000000000000000000000000000000000000000000000000000000000000000081565b604051908152602001610206565b34801561025d57600080fd5b506101f96108a5565b34801561027257600080fd5b50367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c900360400135610243565b6101d16102b43660046123e7565b610ccb565b3480156102c557600080fd5b506000546102f3906901000000000000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610206565b34801561032457600080fd5b506102437f000000000000000000000000000000000000000000000000000000000000000081565b34801561035857600080fd5b506102f37f000000000000000000000000000000000000000000000000000000000000000081565b34801561038c57600080fd5b50610395610cdb565b60405161020691906124ef565b3480156103ae57600080fd5b5060408051606080820183526003546fffffffffffffffffffffffffffffffff808216845270010000000000000000000000000000000091829004811660208086019190915260045485870152855193840186526005548083168552929092041690820152600654928101929092526104249182565b604051610206929190612509565b34801561043e57600080fd5b50610395610d7e565b6101d1610455366004612572565b610d8c565b34801561046657600080fd5b5061024360015481565b34801561047c57600080fd5b506101d1611360565b34801561049157600080fd5b50600254610243565b3480156104a657600080fd5b50367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c900360200135610243565b3480156104e657600080fd5b506102f37f000000000000000000000000000000000000000000000000000000000000000081565b34801561051a57600080fd5b5060405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610206565b34801561055857600080fd5b50367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c900335610243565b34801561059557600080fd5b506102f37f000000000000000000000000000000000000000000000000000000000000000081565b3480156105c957600080fd5b506105f17f000000000000000000000000000000000000000000000000000000000000000081565b60405167ffffffffffffffff9091168152602001610206565b6101d16106183660046123e7565b611964565b34801561062957600080fd5b5061063d6106383660046125a7565b611970565b6040805163ffffffff90961686529315156020860152928401919091526fffffffffffffffffffffffffffffffff908116606084015216608082015260a001610206565b34801561068d57600080fd5b506000546105f19067ffffffffffffffff1681565b3480156106ae57600080fd5b506101d16106bd366004612609565b6119e1565b3480156106ce57600080fd5b506106d7611f0a565b60405161020693929190612693565b6000805468010000000000000000900460ff16600281111561070a5761070a612409565b14610741576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16637dc0d1d06040518163ffffffff1660e01b8152600401602060405180830381865afa1580156107ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107d291906126be565b7f9a1f5e7f00000000000000000000000000000000000000000000000000000000601c8190526020859052909150600084600181146108395760028114610843576003811461084d576004811461085757600581146108675763ff137e656000526004601cfd5b600154915061086e565b600454915061086e565b600654915061086e565b60035460801c60c01b915061086e565b4660c01b91505b50604052600160038511811b6005031b60605260808390526000806084601c82865af161089f573d6000803e3d6000fd5b50505050565b60008060005468010000000000000000900460ff1660028111156108cb576108cb612409565b14610902576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60025460009061091490600190612723565b90506fffffffffffffffffffffffffffffffff815b67ffffffffffffffff8110156109fe5760006002828154811061094e5761094e61273a565b6000918252602090912060039091020180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9093019290915060ff640100000000909104161561099f5750610929565b60028101546000906109e3906fffffffffffffffffffffffffffffffff167f0000000000000000000000000000000000000000000000000000000000000000611f67565b9050838110156109f7578093508260010194505b5050610929565b50600060028381548110610a1457610a1461273a565b600091825260208220600390910201805490925063ffffffff90811691908214610a7e5760028281548110610a4b57610a4b61273a565b906000526020600020906003020160020160109054906101000a90046fffffffffffffffffffffffffffffffff16610aaa565b600283015470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff165b9050677fffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000060011c16610aee67ffffffffffffffff831642612723565b610b0a836fffffffffffffffffffffffffffffffff1660401c90565b67ffffffffffffffff16610b1e9190612769565b11610b55576040517ff2440b5300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600283810154610bf7906fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b610c0191906127b0565b67ffffffffffffffff16158015610c2857506fffffffffffffffffffffffffffffffff8414155b15610c365760029550610c3b565b600195505b600080548791907fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff1668010000000000000000836002811115610c8057610c80612409565b021790556002811115610c9557610c95612409565b6040517f5e186f09b9c93491f14e277eea7faa5de6a2d4bda75a79af7a3684fbfb42da6090600090a2505050505090565b905090565b610cd782826000610d8c565b5050565b6060610d067f000000000000000000000000000000000000000000000000000000000000000061201c565b610d2f7f000000000000000000000000000000000000000000000000000000000000000061201c565b610d587f000000000000000000000000000000000000000000000000000000000000000061201c565b604051602001610d6a939291906127d7565b604051602081830303815290604052905090565b6060610cc660206040612159565b6000805468010000000000000000900460ff166002811115610db057610db0612409565b14610de7576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b82158015610df3575080155b15610e2a576040517fa42637bc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060028481548110610e3f57610e3f61273a565b600091825260208083206040805160a081018252600394909402909101805463ffffffff808216865264010000000090910460ff16151593850193909352600181015491840191909152600201546fffffffffffffffffffffffffffffffff80821660608501819052700100000000000000000000000000000000909204166080840152919350610ed3919085906121f016565b90507f0000000000000000000000000000000000000000000000000000000000000000610f92826fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b67ffffffffffffffff161115610fd4576040517f56f57b2b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815160009063ffffffff90811614611034576002836000015163ffffffff16815481106110035761100361273a565b906000526020600020906003020160020160109054906101000a90046fffffffffffffffffffffffffffffffff1690505b608083015160009067ffffffffffffffff1667ffffffffffffffff164261106d846fffffffffffffffffffffffffffffffff1660401c90565b67ffffffffffffffff166110819190612769565b61108b9190612723565b9050677fffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000060011c1667ffffffffffffffff821611156110fe576040517f3381d11400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000604082901b42179050600061111f888660009182526020526040902090565b60008181526007602052604090205490915060ff161561116b576040517f80497e3b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600081815260076020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001908117909155815160a08101835263ffffffff808f1682529381018581529281018d81526fffffffffffffffffffffffffffffffff808c16606084019081528982166080850190815260028054808801825599819052945160039099027f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace8101805498511515640100000000027fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000009099169a909916999099179690961790965590517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5acf8701559351925184167001000000000000000000000000000000000292909316919091177f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad09093019290925580548b9081106112e3576112e361273a565b6000918252602082206003909102018054921515640100000000027fffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffff9093169290921790915560405133918a918c917f9b3245740ec3b155098a55be84957a4da13eaf7f14a8bc6f53126c0b9350f2be91a4505050505050505050565b367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90033560001a60018114806113a0575060ff81166002145b611406576040517ff40239db000000000000000000000000000000000000000000000000000000008152367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c900335600482015260240160405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000164267ffffffffffffffff161781556040805160a08101825263ffffffff8152602081019290925260029190810161148b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe369081013560f01c90033590565b815260016020820152604001426fffffffffffffffffffffffffffffffff9081169091528254600181810185556000948552602080862085516003909402018054918601511515640100000000027fffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000090921663ffffffff909416939093171782556040840151908201556060830151608090930151821670010000000000000000000000000000000002929091169190911760029091015573ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016637f0064206115b460207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe369081013560f01c9003013590565b6040518263ffffffff1660e01b81526004016115d291815260200190565b602060405180830381865afa1580156115ef573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611613919061284d565b9050600073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001663a25ae55761165e600185612723565b6040518263ffffffff1660e01b815260040161167c91815260200190565b606060405180830381865afa158015611699573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116bd91906128b5565b6040517fa25ae5570000000000000000000000000000000000000000000000000000000081526004810184905290915060009073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063a25ae55790602401606060405180830381865afa15801561174e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061177291906128b5565b9050600073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000166399d548aa367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c9003604001356040518263ffffffff1660e01b81526004016117fe91815260200190565b6040805180830381865afa15801561181a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061183e9190612941565b905081602001516fffffffffffffffffffffffffffffffff16816020015167ffffffffffffffff161161189d576040517f13809ba500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805160a0810182529081908101806118b8600189612723565b6fffffffffffffffffffffffffffffffff908116825260408881015182166020808501919091529851928101929092529183528051606081018252978216885285810151821688880152945187860152908501959095528051805181860151908716700100000000000000000000000000000000918816820217600355908401516004559084015180519481015194861694909516029290921760055591909101516006555160015550565b610cd782826001610d8c565b6002818154811061198057600080fd5b600091825260209091206003909102018054600182015460029092015463ffffffff8216935064010000000090910460ff1691906fffffffffffffffffffffffffffffffff8082169170010000000000000000000000000000000090041685565b6000805468010000000000000000900460ff166002811115611a0557611a05612409565b14611a3c576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060028781548110611a5157611a5161273a565b6000918252602082206003919091020160028101549092506fffffffffffffffffffffffffffffffff16908715821760011b9050611ab07f00000000000000000000000000000000000000000000000000000000000000006001612769565b611b4c826fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b67ffffffffffffffff1614611b8d576040517f5f53dd9800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000808915611c1057611bb1836fffffffffffffffffffffffffffffffff166121f8565b67ffffffffffffffff1615611be457611bdb611bce6001866129c8565b865463ffffffff1661229e565b60010154611c06565b7f00000000000000000000000000000000000000000000000000000000000000005b9150849050611c2a565b84600101549150611c27846001611bce91906129f9565b90505b600882901b60088a8a604051611c41929190612a2d565b6040518091039020901b14611c82576040517f696550ff00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600081600101547f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663f8e0cb968c8c8c8c6040518563ffffffff1660e01b8152600401611ce89493929190612a86565b6020604051808303816000875af1158015611d07573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d2b919061284d565b600284810154929091149250600091611dd6906fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b611e72886fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b611e7c9190612ab8565b611e8691906127b0565b67ffffffffffffffff161590508115158103611ece576040517ffb4e40dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505084547fffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffff166401000000001790945550505050505050505050565b7f0000000000000000000000000000000000000000000000000000000000000000367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c9003356060611f60610d7e565b9050909192565b600080611ff4847e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b67ffffffffffffffff1690508083036001841b600180831b0386831b17039250505092915050565b60608160000361205f57505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115612089578061207381612ad9565b91506120829050600a83612b11565b9150612063565b60008167ffffffffffffffff8111156120a4576120a4612866565b6040519080825280601f01601f1916602001820160405280156120ce576020820181803683370190505b5090505b8415612151576120e3600183612723565b91506120f0600a86612b25565b6120fb906030612769565b60f81b8183815181106121105761211061273a565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535061214a600a86612b11565b94506120d2565b949350505050565b6060600061219084367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c9003612769565b90508267ffffffffffffffff1667ffffffffffffffff8111156121b5576121b5612866565b6040519080825280601f01601f1916602001820160405280156121df576020820181803683370190505b509150828160208401375092915050565b151760011b90565b600080612285837e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b600167ffffffffffffffff919091161b90920392915050565b6000806122bc846fffffffffffffffffffffffffffffffff1661233b565b9050600283815481106122d1576122d161273a565b906000526020600020906003020191505b60028201546fffffffffffffffffffffffffffffffff82811691161461233457815460028054909163ffffffff1690811061231f5761231f61273a565b906000526020600020906003020191506122e2565b5092915050565b600081196001830116816123cf827e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b67ffffffffffffffff169390931c8015179392505050565b600080604083850312156123fa57600080fd5b50508035926020909101359150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6020810160038310612473577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b60005b8381101561249457818101518382015260200161247c565b8381111561089f5750506000910152565b600081518084526124bd816020860160208601612479565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061250260208301846124a5565b9392505050565b82516fffffffffffffffffffffffffffffffff90811682526020808501518216818401526040808601518185015284518316606085015290840151909116608083015282015160a082015260c08101612502565b8035801515811461256d57600080fd5b919050565b60008060006060848603121561258757600080fd5b833592506020840135915061259e6040850161255d565b90509250925092565b6000602082840312156125b957600080fd5b5035919050565b60008083601f8401126125d257600080fd5b50813567ffffffffffffffff8111156125ea57600080fd5b60208301915083602082850101111561260257600080fd5b9250929050565b6000806000806000806080878903121561262257600080fd5b863595506126326020880161255d565b9450604087013567ffffffffffffffff8082111561264f57600080fd5b61265b8a838b016125c0565b9096509450606089013591508082111561267457600080fd5b5061268189828a016125c0565b979a9699509497509295939492505050565b60ff841681528260208201526060604082015260006126b560608301846124a5565b95945050505050565b6000602082840312156126d057600080fd5b815173ffffffffffffffffffffffffffffffffffffffff8116811461250257600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082821015612735576127356126f4565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000821982111561277c5761277c6126f4565b500190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600067ffffffffffffffff808416806127cb576127cb612781565b92169190910692915050565b600084516127e9818460208901612479565b80830190507f2e000000000000000000000000000000000000000000000000000000000000008082528551612825816001850160208a01612479565b60019201918201528351612840816002840160208801612479565b0160020195945050505050565b60006020828403121561285f57600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b80516fffffffffffffffffffffffffffffffff8116811461256d57600080fd5b6000606082840312156128c757600080fd5b6040516060810181811067ffffffffffffffff82111715612911577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040528251815261292460208401612895565b602082015261293560408401612895565b60408201529392505050565b60006040828403121561295357600080fd5b6040516040810167ffffffffffffffff828210818311171561299e577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b81604052845183526020850151915080821682146129bb57600080fd5b5060208201529392505050565b60006fffffffffffffffffffffffffffffffff838116908316818110156129f1576129f16126f4565b039392505050565b60006fffffffffffffffffffffffffffffffff808316818516808303821115612a2457612a246126f4565b01949350505050565b8183823760009101908152919050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b604081526000612a9a604083018688612a3d565b8281036020840152612aad818587612a3d565b979650505050505050565b600067ffffffffffffffff838116908316818110156129f1576129f16126f4565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612b0a57612b0a6126f4565b5060010190565b600082612b2057612b20612781565b500490565b600082612b3457612b34612781565b50069056fea164736f6c634300080f000a", + ABI: "[{\"inputs\":[{\"internalType\":\"GameType\",\"name\":\"_gameType\",\"type\":\"uint8\"},{\"internalType\":\"Claim\",\"name\":\"_absolutePrestate\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"_maxGameDepth\",\"type\":\"uint256\"},{\"internalType\":\"Duration\",\"name\":\"_gameDuration\",\"type\":\"uint64\"},{\"internalType\":\"contractIBigStepper\",\"name\":\"_vm\",\"type\":\"address\"},{\"internalType\":\"contractL2OutputOracle\",\"name\":\"_l2oo\",\"type\":\"address\"},{\"internalType\":\"contractBlockOracle\",\"name\":\"_blockOracle\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"CannotDefendRootClaim\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ClaimAlreadyExists\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ClaimAlreadyResolved\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ClockNotExpired\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ClockTimeExceeded\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"GameDepthExceeded\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"GameNotInProgress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidParent\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidPrestate\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1HeadTooOld\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OutOfOrderResolution\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"Claim\",\"name\":\"rootClaim\",\"type\":\"bytes32\"}],\"name\":\"UnexpectedRootClaim\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ValidStep\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"parentIndex\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"Claim\",\"name\":\"claim\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"claimant\",\"type\":\"address\"}],\"name\":\"Move\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"enumGameStatus\",\"name\":\"status\",\"type\":\"uint8\"}],\"name\":\"Resolved\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"ABSOLUTE_PRESTATE\",\"outputs\":[{\"internalType\":\"Claim\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"BLOCK_ORACLE\",\"outputs\":[{\"internalType\":\"contractBlockOracle\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"GAME_DURATION\",\"outputs\":[{\"internalType\":\"Duration\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"L2_OUTPUT_ORACLE\",\"outputs\":[{\"internalType\":\"contractL2OutputOracle\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MAX_GAME_DEPTH\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"VM\",\"outputs\":[{\"internalType\":\"contractIBigStepper\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_ident\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_partOffset\",\"type\":\"uint256\"}],\"name\":\"addLocalData\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_parentIndex\",\"type\":\"uint256\"},{\"internalType\":\"Claim\",\"name\":\"_claim\",\"type\":\"bytes32\"}],\"name\":\"attack\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"bondManager\",\"outputs\":[{\"internalType\":\"contractIBondManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"claimData\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"parentIndex\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"countered\",\"type\":\"bool\"},{\"internalType\":\"Claim\",\"name\":\"claim\",\"type\":\"bytes32\"},{\"internalType\":\"Position\",\"name\":\"position\",\"type\":\"uint128\"},{\"internalType\":\"Clock\",\"name\":\"clock\",\"type\":\"uint128\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"claimDataLen\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"len_\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"createdAt\",\"outputs\":[{\"internalType\":\"Timestamp\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_parentIndex\",\"type\":\"uint256\"},{\"internalType\":\"Claim\",\"name\":\"_claim\",\"type\":\"bytes32\"}],\"name\":\"defend\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"extraData\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"extraData_\",\"type\":\"bytes\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"gameData\",\"outputs\":[{\"internalType\":\"GameType\",\"name\":\"gameType_\",\"type\":\"uint8\"},{\"internalType\":\"Claim\",\"name\":\"rootClaim_\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"extraData_\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"gameType\",\"outputs\":[{\"internalType\":\"GameType\",\"name\":\"gameType_\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"l1BlockNumber\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"l1BlockNumber_\",\"type\":\"uint256\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"l1Head\",\"outputs\":[{\"internalType\":\"Hash\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"l2BlockNumber\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"l2BlockNumber_\",\"type\":\"uint256\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_challengeIndex\",\"type\":\"uint256\"},{\"internalType\":\"Claim\",\"name\":\"_claim\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"_isAttack\",\"type\":\"bool\"}],\"name\":\"move\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"proposals\",\"outputs\":[{\"components\":[{\"internalType\":\"uint128\",\"name\":\"index\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"l2BlockNumber\",\"type\":\"uint128\"},{\"internalType\":\"Hash\",\"name\":\"outputRoot\",\"type\":\"bytes32\"}],\"internalType\":\"structIFaultDisputeGame.OutputProposal\",\"name\":\"starting\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint128\",\"name\":\"index\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"l2BlockNumber\",\"type\":\"uint128\"},{\"internalType\":\"Hash\",\"name\":\"outputRoot\",\"type\":\"bytes32\"}],\"internalType\":\"structIFaultDisputeGame.OutputProposal\",\"name\":\"disputed\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"enumGameStatus\",\"name\":\"status_\",\"type\":\"uint8\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_claimIndex\",\"type\":\"uint256\"}],\"name\":\"resolveClaim\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"rootClaim\",\"outputs\":[{\"internalType\":\"Claim\",\"name\":\"rootClaim_\",\"type\":\"bytes32\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"status\",\"outputs\":[{\"internalType\":\"enumGameStatus\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_claimIndex\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"_isAttack\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"_stateData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"_proof\",\"type\":\"bytes\"}],\"name\":\"step\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"version\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]", + Bin: "0x6101c06040523480156200001257600080fd5b5060405162002daf38038062002daf8339810160408190526200003591620000a1565b6000608081905260a052600960c05260ff9096166101a05260e094909452610100929092526001600160401b0316610120526001600160a01b039081166101405290811661016052166101805262000145565b6001600160a01b03811681146200009e57600080fd5b50565b600080600080600080600060e0888a031215620000bd57600080fd5b875160ff81168114620000cf57600080fd5b602089015160408a015160608b015192995090975095506001600160401b0381168114620000fc57600080fd5b60808901519094506200010f8162000088565b60a0890151909350620001228162000088565b60c0890151909250620001358162000088565b8091505092959891949750929550565b60805160a05160c05160e05161010051610120516101405161016051610180516101a051612b9a620002156000396000818161052d0152611caa015260008181610369015261152b0152600081816105a6015281816112f8015281816113cc01526114a50152600081816104f7015281816107630152611a290152600081816105da01528181610df40152611d9901526000818161033501528181610c33015261182801526000818161022c015261198401526000610a9001526000610a6701526000610a3e0152612b9a6000f3fe6080604052600436106101b75760003560e01c80638129fc1c116100ec578063c31b29ce1161008a578063cf09e0d011610064578063cf09e0d01461068c578063d8cc1a3c146106ad578063fa24f743146106cd578063fdffbb28146106f157600080fd5b8063c31b29ce146105c8578063c55cd0c714610615578063c6f0308c1461062857600080fd5b806392931298116100c657806392931298146104e5578063bbdc02db14610519578063bcef3b5514610557578063c0c3a0921461059457600080fd5b80638129fc1c1461047b5780638980e0cc146104905780638b85902b146104a557600080fd5b80634778efe81161015957806355ef20e61161013357806355ef20e6146103ad578063609d33341461043d578063632247ea146104525780636361506d1461046557600080fd5b80634778efe814610323578063529184c91461035757806354fd4d501461038b57600080fd5b80632810e1d6116101955780632810e1d61461025c578063298c90051461027157806335fef567146102b1578063363cc427146102c457600080fd5b80631e27052a146101bc578063200d2ed2146101de578063266198f91461021a575b600080fd5b3480156101c857600080fd5b506101dc6101d736600461243b565b610704565b005b3480156101ea57600080fd5b506000546102049068010000000000000000900460ff1681565b604051610211919061248c565b60405180910390f35b34801561022657600080fd5b5061024e7f000000000000000000000000000000000000000000000000000000000000000081565b604051908152602001610211565b34801561026857600080fd5b506102046108c3565b34801561027d57600080fd5b50367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90036040013561024e565b6101dc6102bf36600461243b565b610a27565b3480156102d057600080fd5b506000546102fe906901000000000000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610211565b34801561032f57600080fd5b5061024e7f000000000000000000000000000000000000000000000000000000000000000081565b34801561036357600080fd5b506102fe7f000000000000000000000000000000000000000000000000000000000000000081565b34801561039757600080fd5b506103a0610a37565b6040516102119190612543565b3480156103b957600080fd5b5060408051606080820183526003546fffffffffffffffffffffffffffffffff8082168452700100000000000000000000000000000000918290048116602080860191909152600454858701528551938401865260055480831685529290920416908201526006549281019290925261042f9182565b60405161021192919061255d565b34801561044957600080fd5b506103a0610ada565b6101dc6104603660046125c6565b610ae8565b34801561047157600080fd5b5061024e60015481565b34801561048757600080fd5b506101dc6110fe565b34801561049c57600080fd5b5060025461024e565b3480156104b157600080fd5b50367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90036020013561024e565b3480156104f157600080fd5b506102fe7f000000000000000000000000000000000000000000000000000000000000000081565b34801561052557600080fd5b5060405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610211565b34801561056357600080fd5b50367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90033561024e565b3480156105a057600080fd5b506102fe7f000000000000000000000000000000000000000000000000000000000000000081565b3480156105d457600080fd5b506105fc7f000000000000000000000000000000000000000000000000000000000000000081565b60405167ffffffffffffffff9091168152602001610211565b6101dc61062336600461243b565b611702565b34801561063457600080fd5b506106486106433660046125fb565b61170e565b6040805163ffffffff90961686529315156020860152928401919091526fffffffffffffffffffffffffffffffff908116606084015216608082015260a001610211565b34801561069857600080fd5b506000546105fc9067ffffffffffffffff1681565b3480156106b957600080fd5b506101dc6106c836600461265d565b61177f565b3480156106d957600080fd5b506106e2611ca8565b604051610211939291906126e7565b6101dc6106ff3660046125fb565b611d05565b6000805468010000000000000000900460ff1660028111156107285761072861245d565b1461075f576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16637dc0d1d06040518163ffffffff1660e01b8152600401602060405180830381865afa1580156107cc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107f09190612712565b7f9a1f5e7f00000000000000000000000000000000000000000000000000000000601c8190526020859052909150600084600181146108575760028114610861576003811461086b576004811461087557600581146108855763ff137e656000526004601cfd5b600154915061088c565b600454915061088c565b600654915061088c565b60035460801c60c01b915061088c565b4660c01b91505b50604052600160038511811b6005031b60605260808390526000806084601c82865af16108bd573d6000803e3d6000fd5b50505050565b60008060005468010000000000000000900460ff1660028111156108e9576108e961245d565b14610920576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60095460ff1661095c576040517f9a07664600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600260008154811061097057610970612748565b6000918252602090912060039091020154640100000000900460ff1661099757600261099a565b60015b6000805491925082917fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff16680100000000000000008360028111156109e1576109e161245d565b0217905560028111156109f6576109f661245d565b6040517f5e186f09b9c93491f14e277eea7faa5de6a2d4bda75a79af7a3684fbfb42da6090600090a290565b905090565b610a3382826000610ae8565b5050565b6060610a627f0000000000000000000000000000000000000000000000000000000000000000612036565b610a8b7f0000000000000000000000000000000000000000000000000000000000000000612036565b610ab47f0000000000000000000000000000000000000000000000000000000000000000612036565b604051602001610ac693929190612777565b604051602081830303815290604052905090565b6060610a2260206040612173565b6000805468010000000000000000900460ff166002811115610b0c57610b0c61245d565b14610b43576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b82158015610b4f575080155b15610b86576040517fa42637bc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060028481548110610b9b57610b9b612748565b600091825260208083206040805160a081018252600394909402909101805463ffffffff808216865264010000000090910460ff16151593850193909352600181015491840191909152600201546fffffffffffffffffffffffffffffffff80821660608501819052700100000000000000000000000000000000909204166080840152919350610c2f9190859061220a16565b90507f0000000000000000000000000000000000000000000000000000000000000000610cee826fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b67ffffffffffffffff161115610d30576040517f56f57b2b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815160009063ffffffff90811614610d90576002836000015163ffffffff1681548110610d5f57610d5f612748565b906000526020600020906003020160020160109054906101000a90046fffffffffffffffffffffffffffffffff1690505b608083015160009067ffffffffffffffff1667ffffffffffffffff1642610dc9846fffffffffffffffffffffffffffffffff1660401c90565b67ffffffffffffffff16610ddd919061281c565b610de79190612834565b9050677fffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000060011c1667ffffffffffffffff82161115610e5a576040517f3381d11400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000604082901b42176000888152608086901b6fffffffffffffffffffffffffffffffff8b1617602052604081209192509060008181526007602052604090205490915060ff1615610ed8576040517f80497e3b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600081815260076020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001908117909155815160a08101835263ffffffff808f1682529381018581529281018d81526fffffffffffffffffffffffffffffffff808c16606084019081528982166080850190815260028054808801825599819052945160039099027f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace8101805498511515640100000000027fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000009099169a909916999099179690961790965590517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5acf8701559351925184167001000000000000000000000000000000000292909316919091177f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad09093019290925580548b90811061105057611050612748565b6000918252602080832060039092029091018054931515640100000000027fffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffff909416939093179092558a81526008909152604090206002546110b490600190612834565b8154600181018355600092835260208320015560405133918a918c917f9b3245740ec3b155098a55be84957a4da13eaf7f14a8bc6f53126c0b9350f2be91a4505050505050505050565b367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90033560001a600181148061113e575060ff81166002145b6111a4576040517ff40239db000000000000000000000000000000000000000000000000000000008152367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c900335600482015260240160405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000164267ffffffffffffffff161781556040805160a08101825263ffffffff815260208101929092526002919081016112297ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe369081013560f01c90033590565b815260016020820152604001426fffffffffffffffffffffffffffffffff9081169091528254600181810185556000948552602080862085516003909402018054918601511515640100000000027fffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000090921663ffffffff909416939093171782556040840151908201556060830151608090930151821670010000000000000000000000000000000002929091169190911760029091015573ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016637f00642061135260207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe369081013560f01c9003013590565b6040518263ffffffff1660e01b815260040161137091815260200190565b602060405180830381865afa15801561138d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113b1919061284b565b9050600073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001663a25ae5576113fc600185612834565b6040518263ffffffff1660e01b815260040161141a91815260200190565b606060405180830381865afa158015611437573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061145b91906128b3565b6040517fa25ae5570000000000000000000000000000000000000000000000000000000081526004810184905290915060009073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063a25ae55790602401606060405180830381865afa1580156114ec573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061151091906128b3565b9050600073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000166399d548aa367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c9003604001356040518263ffffffff1660e01b815260040161159c91815260200190565b6040805180830381865afa1580156115b8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115dc919061293f565b905081602001516fffffffffffffffffffffffffffffffff16816020015167ffffffffffffffff161161163b576040517f13809ba500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805160a081018252908190810180611656600189612834565b6fffffffffffffffffffffffffffffffff908116825260408881015182166020808501919091529851928101929092529183528051606081018252978216885285810151821688880152945187860152908501959095528051805181860151908716700100000000000000000000000000000000918816820217600355908401516004559084015180519481015194861694909516029290921760055591909101516006555160015550565b610a3382826001610ae8565b6002818154811061171e57600080fd5b600091825260209091206003909102018054600182015460029092015463ffffffff8216935064010000000090910460ff1691906fffffffffffffffffffffffffffffffff8082169170010000000000000000000000000000000090041685565b6000805468010000000000000000900460ff1660028111156117a3576117a361245d565b146117da576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600287815481106117ef576117ef612748565b6000918252602082206003919091020160028101549092506fffffffffffffffffffffffffffffffff16908715821760011b905061184e7f0000000000000000000000000000000000000000000000000000000000000000600161281c565b6118ea826fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b67ffffffffffffffff161461192b576040517f5f53dd9800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008089156119ae5761194f836fffffffffffffffffffffffffffffffff16612212565b67ffffffffffffffff16156119825761197961196c6001866129c6565b865463ffffffff166122b8565b600101546119a4565b7f00000000000000000000000000000000000000000000000000000000000000005b91508490506119c8565b846001015491506119c584600161196c91906129f7565b90505b600882901b60088a8a6040516119df929190612a2b565b6040518091039020901b14611a20576040517f696550ff00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600081600101547f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663f8e0cb968c8c8c8c6040518563ffffffff1660e01b8152600401611a869493929190612a84565b6020604051808303816000875af1158015611aa5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ac9919061284b565b600284810154929091149250600091611b74906fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b611c10886fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b611c1a9190612ab6565b611c249190612b06565b67ffffffffffffffff161590508115158103611c6c576040517ffb4e40dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505084547fffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffff166401000000001790945550505050505050505050565b7f0000000000000000000000000000000000000000000000000000000000000000367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c9003356060611cfe610ada565b9050909192565b6000805468010000000000000000900460ff166002811115611d2957611d2961245d565b14611d60576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060028281548110611d7557611d75612748565b60009182526020909120600260039092020190810154909150677fffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000060011c1690611de590700100000000000000000000000000000000900467ffffffffffffffff1642612834565b6002830154611e159190700100000000000000000000000000000000900460401c67ffffffffffffffff1661281c565b11611e4c576040517ff2440b5300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600082815260086020526040902082158015611e6a575060095460ff165b15611ea1576040517ff1a9458100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8054158015611eaf57508215155b15611ee6576040517ff1a9458100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000805b8254811015611fb4576000838281548110611f0757611f07612748565b6000918252602080832090910154808352600890915260409091205490915015611f5d576040517f9a07664600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060028281548110611f7257611f72612748565b600091825260209091206003909102018054909150640100000000900460ff16611fa157600193505050611fb4565b505080611fad90612b2d565b9050611eea565b5082547fffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffff16640100000000821515021783556000848152600860205260408120611ffd91612401565b836000036108bd57600980547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905550505050565b60608160000361207957505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b81156120a3578061208d81612b2d565b915061209c9050600a83612b65565b915061207d565b60008167ffffffffffffffff8111156120be576120be612864565b6040519080825280601f01601f1916602001820160405280156120e8576020820181803683370190505b5090505b841561216b576120fd600183612834565b915061210a600a86612b79565b61211590603061281c565b60f81b81838151811061212a5761212a612748565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350612164600a86612b65565b94506120ec565b949350505050565b606060006121aa84367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c900361281c565b90508267ffffffffffffffff1667ffffffffffffffff8111156121cf576121cf612864565b6040519080825280601f01601f1916602001820160405280156121f9576020820181803683370190505b509150828160208401375092915050565b151760011b90565b60008061229f837e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b600167ffffffffffffffff919091161b90920392915050565b6000806122d6846fffffffffffffffffffffffffffffffff16612355565b9050600283815481106122eb576122eb612748565b906000526020600020906003020191505b60028201546fffffffffffffffffffffffffffffffff82811691161461234e57815460028054909163ffffffff1690811061233957612339612748565b906000526020600020906003020191506122fc565b5092915050565b600081196001830116816123e9827e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b67ffffffffffffffff169390931c8015179392505050565b508054600082559060005260206000209081019061241f9190612422565b50565b5b808211156124375760008155600101612423565b5090565b6000806040838503121561244e57600080fd5b50508035926020909101359150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60208101600383106124c7577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b60005b838110156124e85781810151838201526020016124d0565b838111156108bd5750506000910152565b600081518084526125118160208601602086016124cd565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061255660208301846124f9565b9392505050565b82516fffffffffffffffffffffffffffffffff90811682526020808501518216818401526040808601518185015284518316606085015290840151909116608083015282015160a082015260c08101612556565b803580151581146125c157600080fd5b919050565b6000806000606084860312156125db57600080fd5b83359250602084013591506125f2604085016125b1565b90509250925092565b60006020828403121561260d57600080fd5b5035919050565b60008083601f84011261262657600080fd5b50813567ffffffffffffffff81111561263e57600080fd5b60208301915083602082850101111561265657600080fd5b9250929050565b6000806000806000806080878903121561267657600080fd5b86359550612686602088016125b1565b9450604087013567ffffffffffffffff808211156126a357600080fd5b6126af8a838b01612614565b909650945060608901359150808211156126c857600080fd5b506126d589828a01612614565b979a9699509497509295939492505050565b60ff8416815282602082015260606040820152600061270960608301846124f9565b95945050505050565b60006020828403121561272457600080fd5b815173ffffffffffffffffffffffffffffffffffffffff8116811461255657600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600084516127898184602089016124cd565b80830190507f2e0000000000000000000000000000000000000000000000000000000000000080825285516127c5816001850160208a016124cd565b600192019182015283516127e08160028401602088016124cd565b0160020195945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000821982111561282f5761282f6127ed565b500190565b600082821015612846576128466127ed565b500390565b60006020828403121561285d57600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b80516fffffffffffffffffffffffffffffffff811681146125c157600080fd5b6000606082840312156128c557600080fd5b6040516060810181811067ffffffffffffffff8211171561290f577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040528251815261292260208401612893565b602082015261293360408401612893565b60408201529392505050565b60006040828403121561295157600080fd5b6040516040810167ffffffffffffffff828210818311171561299c577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b81604052845183526020850151915080821682146129b957600080fd5b5060208201529392505050565b60006fffffffffffffffffffffffffffffffff838116908316818110156129ef576129ef6127ed565b039392505050565b60006fffffffffffffffffffffffffffffffff808316818516808303821115612a2257612a226127ed565b01949350505050565b8183823760009101908152919050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b604081526000612a98604083018688612a3b565b8281036020840152612aab818587612a3b565b979650505050505050565b600067ffffffffffffffff838116908316818110156129ef576129ef6127ed565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600067ffffffffffffffff80841680612b2157612b21612ad7565b92169190910692915050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612b5e57612b5e6127ed565b5060010190565b600082612b7457612b74612ad7565b500490565b600082612b8857612b88612ad7565b50069056fea164736f6c634300080f000a", } // FaultDisputeGameABI is the input ABI used to generate the binding from. @@ -1016,6 +1016,27 @@ func (_FaultDisputeGame *FaultDisputeGameTransactorSession) Resolve() (*types.Tr return _FaultDisputeGame.Contract.Resolve(&_FaultDisputeGame.TransactOpts) } +// ResolveClaim is a paid mutator transaction binding the contract method 0xfdffbb28. +// +// Solidity: function resolveClaim(uint256 _claimIndex) payable returns() +func (_FaultDisputeGame *FaultDisputeGameTransactor) ResolveClaim(opts *bind.TransactOpts, _claimIndex *big.Int) (*types.Transaction, error) { + return _FaultDisputeGame.contract.Transact(opts, "resolveClaim", _claimIndex) +} + +// ResolveClaim is a paid mutator transaction binding the contract method 0xfdffbb28. +// +// Solidity: function resolveClaim(uint256 _claimIndex) payable returns() +func (_FaultDisputeGame *FaultDisputeGameSession) ResolveClaim(_claimIndex *big.Int) (*types.Transaction, error) { + return _FaultDisputeGame.Contract.ResolveClaim(&_FaultDisputeGame.TransactOpts, _claimIndex) +} + +// ResolveClaim is a paid mutator transaction binding the contract method 0xfdffbb28. +// +// Solidity: function resolveClaim(uint256 _claimIndex) payable returns() +func (_FaultDisputeGame *FaultDisputeGameTransactorSession) ResolveClaim(_claimIndex *big.Int) (*types.Transaction, error) { + return _FaultDisputeGame.Contract.ResolveClaim(&_FaultDisputeGame.TransactOpts, _claimIndex) +} + // Step is a paid mutator transaction binding the contract method 0xd8cc1a3c. // // Solidity: function step(uint256 _claimIndex, bool _isAttack, bytes _stateData, bytes _proof) returns() diff --git a/op-bindings/bindings/faultdisputegame_more.go b/op-bindings/bindings/faultdisputegame_more.go index 42a701fb4b1e..7fd2c642f16a 100644 --- a/op-bindings/bindings/faultdisputegame_more.go +++ b/op-bindings/bindings/faultdisputegame_more.go @@ -9,11 +9,11 @@ import ( "github.com/ethereum-optimism/optimism/op-bindings/solc" ) -const FaultDisputeGameStorageLayoutJSON = "{\"storage\":[{\"astId\":1000,\"contract\":\"src/dispute/FaultDisputeGame.sol:FaultDisputeGame\",\"label\":\"createdAt\",\"offset\":0,\"slot\":\"0\",\"type\":\"t_userDefinedValueType(Timestamp)1017\"},{\"astId\":1001,\"contract\":\"src/dispute/FaultDisputeGame.sol:FaultDisputeGame\",\"label\":\"status\",\"offset\":8,\"slot\":\"0\",\"type\":\"t_enum(GameStatus)1008\"},{\"astId\":1002,\"contract\":\"src/dispute/FaultDisputeGame.sol:FaultDisputeGame\",\"label\":\"bondManager\",\"offset\":9,\"slot\":\"0\",\"type\":\"t_contract(IBondManager)1007\"},{\"astId\":1003,\"contract\":\"src/dispute/FaultDisputeGame.sol:FaultDisputeGame\",\"label\":\"l1Head\",\"offset\":0,\"slot\":\"1\",\"type\":\"t_userDefinedValueType(Hash)1015\"},{\"astId\":1004,\"contract\":\"src/dispute/FaultDisputeGame.sol:FaultDisputeGame\",\"label\":\"claimData\",\"offset\":0,\"slot\":\"2\",\"type\":\"t_array(t_struct(ClaimData)1009_storage)dyn_storage\"},{\"astId\":1005,\"contract\":\"src/dispute/FaultDisputeGame.sol:FaultDisputeGame\",\"label\":\"proposals\",\"offset\":0,\"slot\":\"3\",\"type\":\"t_struct(OutputProposals)1011_storage\"},{\"astId\":1006,\"contract\":\"src/dispute/FaultDisputeGame.sol:FaultDisputeGame\",\"label\":\"claims\",\"offset\":0,\"slot\":\"7\",\"type\":\"t_mapping(t_userDefinedValueType(ClaimHash)1013,t_bool)\"}],\"types\":{\"t_array(t_struct(ClaimData)1009_storage)dyn_storage\":{\"encoding\":\"dynamic_array\",\"label\":\"struct IFaultDisputeGame.ClaimData[]\",\"numberOfBytes\":\"32\",\"base\":\"t_struct(ClaimData)1009_storage\"},\"t_bool\":{\"encoding\":\"inplace\",\"label\":\"bool\",\"numberOfBytes\":\"1\"},\"t_contract(IBondManager)1007\":{\"encoding\":\"inplace\",\"label\":\"contract IBondManager\",\"numberOfBytes\":\"20\"},\"t_enum(GameStatus)1008\":{\"encoding\":\"inplace\",\"label\":\"enum GameStatus\",\"numberOfBytes\":\"1\"},\"t_mapping(t_userDefinedValueType(ClaimHash)1013,t_bool)\":{\"encoding\":\"mapping\",\"label\":\"mapping(ClaimHash =\u003e bool)\",\"numberOfBytes\":\"32\",\"key\":\"t_userDefinedValueType(ClaimHash)1013\",\"value\":\"t_bool\"},\"t_struct(ClaimData)1009_storage\":{\"encoding\":\"inplace\",\"label\":\"struct IFaultDisputeGame.ClaimData\",\"numberOfBytes\":\"96\"},\"t_struct(OutputProposal)1010_storage\":{\"encoding\":\"inplace\",\"label\":\"struct IFaultDisputeGame.OutputProposal\",\"numberOfBytes\":\"64\"},\"t_struct(OutputProposals)1011_storage\":{\"encoding\":\"inplace\",\"label\":\"struct IFaultDisputeGame.OutputProposals\",\"numberOfBytes\":\"128\"},\"t_uint128\":{\"encoding\":\"inplace\",\"label\":\"uint128\",\"numberOfBytes\":\"16\"},\"t_uint32\":{\"encoding\":\"inplace\",\"label\":\"uint32\",\"numberOfBytes\":\"4\"},\"t_userDefinedValueType(Claim)1012\":{\"encoding\":\"inplace\",\"label\":\"Claim\",\"numberOfBytes\":\"32\"},\"t_userDefinedValueType(ClaimHash)1013\":{\"encoding\":\"inplace\",\"label\":\"ClaimHash\",\"numberOfBytes\":\"32\"},\"t_userDefinedValueType(Clock)1014\":{\"encoding\":\"inplace\",\"label\":\"Clock\",\"numberOfBytes\":\"16\"},\"t_userDefinedValueType(Hash)1015\":{\"encoding\":\"inplace\",\"label\":\"Hash\",\"numberOfBytes\":\"32\"},\"t_userDefinedValueType(Position)1016\":{\"encoding\":\"inplace\",\"label\":\"Position\",\"numberOfBytes\":\"16\"},\"t_userDefinedValueType(Timestamp)1017\":{\"encoding\":\"inplace\",\"label\":\"Timestamp\",\"numberOfBytes\":\"8\"}}}" +const FaultDisputeGameStorageLayoutJSON = "{\"storage\":[{\"astId\":1000,\"contract\":\"src/dispute/FaultDisputeGame.sol:FaultDisputeGame\",\"label\":\"createdAt\",\"offset\":0,\"slot\":\"0\",\"type\":\"t_userDefinedValueType(Timestamp)1019\"},{\"astId\":1001,\"contract\":\"src/dispute/FaultDisputeGame.sol:FaultDisputeGame\",\"label\":\"status\",\"offset\":8,\"slot\":\"0\",\"type\":\"t_enum(GameStatus)1010\"},{\"astId\":1002,\"contract\":\"src/dispute/FaultDisputeGame.sol:FaultDisputeGame\",\"label\":\"bondManager\",\"offset\":9,\"slot\":\"0\",\"type\":\"t_contract(IBondManager)1009\"},{\"astId\":1003,\"contract\":\"src/dispute/FaultDisputeGame.sol:FaultDisputeGame\",\"label\":\"l1Head\",\"offset\":0,\"slot\":\"1\",\"type\":\"t_userDefinedValueType(Hash)1017\"},{\"astId\":1004,\"contract\":\"src/dispute/FaultDisputeGame.sol:FaultDisputeGame\",\"label\":\"claimData\",\"offset\":0,\"slot\":\"2\",\"type\":\"t_array(t_struct(ClaimData)1011_storage)dyn_storage\"},{\"astId\":1005,\"contract\":\"src/dispute/FaultDisputeGame.sol:FaultDisputeGame\",\"label\":\"proposals\",\"offset\":0,\"slot\":\"3\",\"type\":\"t_struct(OutputProposals)1013_storage\"},{\"astId\":1006,\"contract\":\"src/dispute/FaultDisputeGame.sol:FaultDisputeGame\",\"label\":\"claims\",\"offset\":0,\"slot\":\"7\",\"type\":\"t_mapping(t_userDefinedValueType(ClaimHash)1015,t_bool)\"},{\"astId\":1007,\"contract\":\"src/dispute/FaultDisputeGame.sol:FaultDisputeGame\",\"label\":\"subgames\",\"offset\":0,\"slot\":\"8\",\"type\":\"t_mapping(t_uint256,t_array(t_uint256)dyn_storage)\"},{\"astId\":1008,\"contract\":\"src/dispute/FaultDisputeGame.sol:FaultDisputeGame\",\"label\":\"subgameAtRootResolved\",\"offset\":0,\"slot\":\"9\",\"type\":\"t_bool\"}],\"types\":{\"t_array(t_struct(ClaimData)1011_storage)dyn_storage\":{\"encoding\":\"dynamic_array\",\"label\":\"struct IFaultDisputeGame.ClaimData[]\",\"numberOfBytes\":\"32\",\"base\":\"t_struct(ClaimData)1011_storage\"},\"t_array(t_uint256)dyn_storage\":{\"encoding\":\"dynamic_array\",\"label\":\"uint256[]\",\"numberOfBytes\":\"32\",\"base\":\"t_uint256\"},\"t_bool\":{\"encoding\":\"inplace\",\"label\":\"bool\",\"numberOfBytes\":\"1\"},\"t_contract(IBondManager)1009\":{\"encoding\":\"inplace\",\"label\":\"contract IBondManager\",\"numberOfBytes\":\"20\"},\"t_enum(GameStatus)1010\":{\"encoding\":\"inplace\",\"label\":\"enum GameStatus\",\"numberOfBytes\":\"1\"},\"t_mapping(t_uint256,t_array(t_uint256)dyn_storage)\":{\"encoding\":\"mapping\",\"label\":\"mapping(uint256 =\u003e uint256[])\",\"numberOfBytes\":\"32\",\"key\":\"t_uint256\",\"value\":\"t_array(t_uint256)dyn_storage\"},\"t_mapping(t_userDefinedValueType(ClaimHash)1015,t_bool)\":{\"encoding\":\"mapping\",\"label\":\"mapping(ClaimHash =\u003e bool)\",\"numberOfBytes\":\"32\",\"key\":\"t_userDefinedValueType(ClaimHash)1015\",\"value\":\"t_bool\"},\"t_struct(ClaimData)1011_storage\":{\"encoding\":\"inplace\",\"label\":\"struct IFaultDisputeGame.ClaimData\",\"numberOfBytes\":\"96\"},\"t_struct(OutputProposal)1012_storage\":{\"encoding\":\"inplace\",\"label\":\"struct IFaultDisputeGame.OutputProposal\",\"numberOfBytes\":\"64\"},\"t_struct(OutputProposals)1013_storage\":{\"encoding\":\"inplace\",\"label\":\"struct IFaultDisputeGame.OutputProposals\",\"numberOfBytes\":\"128\"},\"t_uint128\":{\"encoding\":\"inplace\",\"label\":\"uint128\",\"numberOfBytes\":\"16\"},\"t_uint256\":{\"encoding\":\"inplace\",\"label\":\"uint256\",\"numberOfBytes\":\"32\"},\"t_uint32\":{\"encoding\":\"inplace\",\"label\":\"uint32\",\"numberOfBytes\":\"4\"},\"t_userDefinedValueType(Claim)1014\":{\"encoding\":\"inplace\",\"label\":\"Claim\",\"numberOfBytes\":\"32\"},\"t_userDefinedValueType(ClaimHash)1015\":{\"encoding\":\"inplace\",\"label\":\"ClaimHash\",\"numberOfBytes\":\"32\"},\"t_userDefinedValueType(Clock)1016\":{\"encoding\":\"inplace\",\"label\":\"Clock\",\"numberOfBytes\":\"16\"},\"t_userDefinedValueType(Hash)1017\":{\"encoding\":\"inplace\",\"label\":\"Hash\",\"numberOfBytes\":\"32\"},\"t_userDefinedValueType(Position)1018\":{\"encoding\":\"inplace\",\"label\":\"Position\",\"numberOfBytes\":\"16\"},\"t_userDefinedValueType(Timestamp)1019\":{\"encoding\":\"inplace\",\"label\":\"Timestamp\",\"numberOfBytes\":\"8\"}}}" var FaultDisputeGameStorageLayout = new(solc.StorageLayout) -var FaultDisputeGameDeployedBin = "0x6080604052600436106101ac5760003560e01c80636361506d116100ec578063c0c3a0921161008a578063c6f0308c11610064578063c6f0308c1461061d578063cf09e0d014610681578063d8cc1a3c146106a2578063fa24f743146106c257600080fd5b8063c0c3a09214610589578063c31b29ce146105bd578063c55cd0c71461060a57600080fd5b80638b85902b116100c65780638b85902b1461049a57806392931298146104da578063bbdc02db1461050e578063bcef3b551461054c57600080fd5b80636361506d1461045a5780638129fc1c146104705780638980e0cc1461048557600080fd5b8063363cc4271161015957806354fd4d501161013357806354fd4d501461038057806355ef20e6146103a2578063609d333414610432578063632247ea1461044757600080fd5b8063363cc427146102b95780634778efe814610318578063529184c91461034c57600080fd5b80632810e1d61161018a5780632810e1d614610251578063298c90051461026657806335fef567146102a657600080fd5b80631e27052a146101b1578063200d2ed2146101d3578063266198f91461020f575b600080fd5b3480156101bd57600080fd5b506101d16101cc3660046123e7565b6106e6565b005b3480156101df57600080fd5b506000546101f99068010000000000000000900460ff1681565b6040516102069190612438565b60405180910390f35b34801561021b57600080fd5b506102437f000000000000000000000000000000000000000000000000000000000000000081565b604051908152602001610206565b34801561025d57600080fd5b506101f96108a5565b34801561027257600080fd5b50367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c900360400135610243565b6101d16102b43660046123e7565b610ccb565b3480156102c557600080fd5b506000546102f3906901000000000000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610206565b34801561032457600080fd5b506102437f000000000000000000000000000000000000000000000000000000000000000081565b34801561035857600080fd5b506102f37f000000000000000000000000000000000000000000000000000000000000000081565b34801561038c57600080fd5b50610395610cdb565b60405161020691906124ef565b3480156103ae57600080fd5b5060408051606080820183526003546fffffffffffffffffffffffffffffffff808216845270010000000000000000000000000000000091829004811660208086019190915260045485870152855193840186526005548083168552929092041690820152600654928101929092526104249182565b604051610206929190612509565b34801561043e57600080fd5b50610395610d7e565b6101d1610455366004612572565b610d8c565b34801561046657600080fd5b5061024360015481565b34801561047c57600080fd5b506101d1611360565b34801561049157600080fd5b50600254610243565b3480156104a657600080fd5b50367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c900360200135610243565b3480156104e657600080fd5b506102f37f000000000000000000000000000000000000000000000000000000000000000081565b34801561051a57600080fd5b5060405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610206565b34801561055857600080fd5b50367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c900335610243565b34801561059557600080fd5b506102f37f000000000000000000000000000000000000000000000000000000000000000081565b3480156105c957600080fd5b506105f17f000000000000000000000000000000000000000000000000000000000000000081565b60405167ffffffffffffffff9091168152602001610206565b6101d16106183660046123e7565b611964565b34801561062957600080fd5b5061063d6106383660046125a7565b611970565b6040805163ffffffff90961686529315156020860152928401919091526fffffffffffffffffffffffffffffffff908116606084015216608082015260a001610206565b34801561068d57600080fd5b506000546105f19067ffffffffffffffff1681565b3480156106ae57600080fd5b506101d16106bd366004612609565b6119e1565b3480156106ce57600080fd5b506106d7611f0a565b60405161020693929190612693565b6000805468010000000000000000900460ff16600281111561070a5761070a612409565b14610741576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16637dc0d1d06040518163ffffffff1660e01b8152600401602060405180830381865afa1580156107ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107d291906126be565b7f9a1f5e7f00000000000000000000000000000000000000000000000000000000601c8190526020859052909150600084600181146108395760028114610843576003811461084d576004811461085757600581146108675763ff137e656000526004601cfd5b600154915061086e565b600454915061086e565b600654915061086e565b60035460801c60c01b915061086e565b4660c01b91505b50604052600160038511811b6005031b60605260808390526000806084601c82865af161089f573d6000803e3d6000fd5b50505050565b60008060005468010000000000000000900460ff1660028111156108cb576108cb612409565b14610902576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60025460009061091490600190612723565b90506fffffffffffffffffffffffffffffffff815b67ffffffffffffffff8110156109fe5760006002828154811061094e5761094e61273a565b6000918252602090912060039091020180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9093019290915060ff640100000000909104161561099f5750610929565b60028101546000906109e3906fffffffffffffffffffffffffffffffff167f0000000000000000000000000000000000000000000000000000000000000000611f67565b9050838110156109f7578093508260010194505b5050610929565b50600060028381548110610a1457610a1461273a565b600091825260208220600390910201805490925063ffffffff90811691908214610a7e5760028281548110610a4b57610a4b61273a565b906000526020600020906003020160020160109054906101000a90046fffffffffffffffffffffffffffffffff16610aaa565b600283015470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff165b9050677fffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000060011c16610aee67ffffffffffffffff831642612723565b610b0a836fffffffffffffffffffffffffffffffff1660401c90565b67ffffffffffffffff16610b1e9190612769565b11610b55576040517ff2440b5300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600283810154610bf7906fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b610c0191906127b0565b67ffffffffffffffff16158015610c2857506fffffffffffffffffffffffffffffffff8414155b15610c365760029550610c3b565b600195505b600080548791907fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff1668010000000000000000836002811115610c8057610c80612409565b021790556002811115610c9557610c95612409565b6040517f5e186f09b9c93491f14e277eea7faa5de6a2d4bda75a79af7a3684fbfb42da6090600090a2505050505090565b905090565b610cd782826000610d8c565b5050565b6060610d067f000000000000000000000000000000000000000000000000000000000000000061201c565b610d2f7f000000000000000000000000000000000000000000000000000000000000000061201c565b610d587f000000000000000000000000000000000000000000000000000000000000000061201c565b604051602001610d6a939291906127d7565b604051602081830303815290604052905090565b6060610cc660206040612159565b6000805468010000000000000000900460ff166002811115610db057610db0612409565b14610de7576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b82158015610df3575080155b15610e2a576040517fa42637bc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060028481548110610e3f57610e3f61273a565b600091825260208083206040805160a081018252600394909402909101805463ffffffff808216865264010000000090910460ff16151593850193909352600181015491840191909152600201546fffffffffffffffffffffffffffffffff80821660608501819052700100000000000000000000000000000000909204166080840152919350610ed3919085906121f016565b90507f0000000000000000000000000000000000000000000000000000000000000000610f92826fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b67ffffffffffffffff161115610fd4576040517f56f57b2b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815160009063ffffffff90811614611034576002836000015163ffffffff16815481106110035761100361273a565b906000526020600020906003020160020160109054906101000a90046fffffffffffffffffffffffffffffffff1690505b608083015160009067ffffffffffffffff1667ffffffffffffffff164261106d846fffffffffffffffffffffffffffffffff1660401c90565b67ffffffffffffffff166110819190612769565b61108b9190612723565b9050677fffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000060011c1667ffffffffffffffff821611156110fe576040517f3381d11400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000604082901b42179050600061111f888660009182526020526040902090565b60008181526007602052604090205490915060ff161561116b576040517f80497e3b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600081815260076020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001908117909155815160a08101835263ffffffff808f1682529381018581529281018d81526fffffffffffffffffffffffffffffffff808c16606084019081528982166080850190815260028054808801825599819052945160039099027f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace8101805498511515640100000000027fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000009099169a909916999099179690961790965590517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5acf8701559351925184167001000000000000000000000000000000000292909316919091177f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad09093019290925580548b9081106112e3576112e361273a565b6000918252602082206003909102018054921515640100000000027fffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffff9093169290921790915560405133918a918c917f9b3245740ec3b155098a55be84957a4da13eaf7f14a8bc6f53126c0b9350f2be91a4505050505050505050565b367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90033560001a60018114806113a0575060ff81166002145b611406576040517ff40239db000000000000000000000000000000000000000000000000000000008152367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c900335600482015260240160405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000164267ffffffffffffffff161781556040805160a08101825263ffffffff8152602081019290925260029190810161148b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe369081013560f01c90033590565b815260016020820152604001426fffffffffffffffffffffffffffffffff9081169091528254600181810185556000948552602080862085516003909402018054918601511515640100000000027fffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000090921663ffffffff909416939093171782556040840151908201556060830151608090930151821670010000000000000000000000000000000002929091169190911760029091015573ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016637f0064206115b460207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe369081013560f01c9003013590565b6040518263ffffffff1660e01b81526004016115d291815260200190565b602060405180830381865afa1580156115ef573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611613919061284d565b9050600073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001663a25ae55761165e600185612723565b6040518263ffffffff1660e01b815260040161167c91815260200190565b606060405180830381865afa158015611699573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116bd91906128b5565b6040517fa25ae5570000000000000000000000000000000000000000000000000000000081526004810184905290915060009073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063a25ae55790602401606060405180830381865afa15801561174e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061177291906128b5565b9050600073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000166399d548aa367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c9003604001356040518263ffffffff1660e01b81526004016117fe91815260200190565b6040805180830381865afa15801561181a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061183e9190612941565b905081602001516fffffffffffffffffffffffffffffffff16816020015167ffffffffffffffff161161189d576040517f13809ba500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805160a0810182529081908101806118b8600189612723565b6fffffffffffffffffffffffffffffffff908116825260408881015182166020808501919091529851928101929092529183528051606081018252978216885285810151821688880152945187860152908501959095528051805181860151908716700100000000000000000000000000000000918816820217600355908401516004559084015180519481015194861694909516029290921760055591909101516006555160015550565b610cd782826001610d8c565b6002818154811061198057600080fd5b600091825260209091206003909102018054600182015460029092015463ffffffff8216935064010000000090910460ff1691906fffffffffffffffffffffffffffffffff8082169170010000000000000000000000000000000090041685565b6000805468010000000000000000900460ff166002811115611a0557611a05612409565b14611a3c576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060028781548110611a5157611a5161273a565b6000918252602082206003919091020160028101549092506fffffffffffffffffffffffffffffffff16908715821760011b9050611ab07f00000000000000000000000000000000000000000000000000000000000000006001612769565b611b4c826fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b67ffffffffffffffff1614611b8d576040517f5f53dd9800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000808915611c1057611bb1836fffffffffffffffffffffffffffffffff166121f8565b67ffffffffffffffff1615611be457611bdb611bce6001866129c8565b865463ffffffff1661229e565b60010154611c06565b7f00000000000000000000000000000000000000000000000000000000000000005b9150849050611c2a565b84600101549150611c27846001611bce91906129f9565b90505b600882901b60088a8a604051611c41929190612a2d565b6040518091039020901b14611c82576040517f696550ff00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600081600101547f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663f8e0cb968c8c8c8c6040518563ffffffff1660e01b8152600401611ce89493929190612a86565b6020604051808303816000875af1158015611d07573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d2b919061284d565b600284810154929091149250600091611dd6906fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b611e72886fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b611e7c9190612ab8565b611e8691906127b0565b67ffffffffffffffff161590508115158103611ece576040517ffb4e40dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505084547fffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffff166401000000001790945550505050505050505050565b7f0000000000000000000000000000000000000000000000000000000000000000367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c9003356060611f60610d7e565b9050909192565b600080611ff4847e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b67ffffffffffffffff1690508083036001841b600180831b0386831b17039250505092915050565b60608160000361205f57505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115612089578061207381612ad9565b91506120829050600a83612b11565b9150612063565b60008167ffffffffffffffff8111156120a4576120a4612866565b6040519080825280601f01601f1916602001820160405280156120ce576020820181803683370190505b5090505b8415612151576120e3600183612723565b91506120f0600a86612b25565b6120fb906030612769565b60f81b8183815181106121105761211061273a565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535061214a600a86612b11565b94506120d2565b949350505050565b6060600061219084367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c9003612769565b90508267ffffffffffffffff1667ffffffffffffffff8111156121b5576121b5612866565b6040519080825280601f01601f1916602001820160405280156121df576020820181803683370190505b509150828160208401375092915050565b151760011b90565b600080612285837e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b600167ffffffffffffffff919091161b90920392915050565b6000806122bc846fffffffffffffffffffffffffffffffff1661233b565b9050600283815481106122d1576122d161273a565b906000526020600020906003020191505b60028201546fffffffffffffffffffffffffffffffff82811691161461233457815460028054909163ffffffff1690811061231f5761231f61273a565b906000526020600020906003020191506122e2565b5092915050565b600081196001830116816123cf827e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b67ffffffffffffffff169390931c8015179392505050565b600080604083850312156123fa57600080fd5b50508035926020909101359150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6020810160038310612473577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b60005b8381101561249457818101518382015260200161247c565b8381111561089f5750506000910152565b600081518084526124bd816020860160208601612479565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061250260208301846124a5565b9392505050565b82516fffffffffffffffffffffffffffffffff90811682526020808501518216818401526040808601518185015284518316606085015290840151909116608083015282015160a082015260c08101612502565b8035801515811461256d57600080fd5b919050565b60008060006060848603121561258757600080fd5b833592506020840135915061259e6040850161255d565b90509250925092565b6000602082840312156125b957600080fd5b5035919050565b60008083601f8401126125d257600080fd5b50813567ffffffffffffffff8111156125ea57600080fd5b60208301915083602082850101111561260257600080fd5b9250929050565b6000806000806000806080878903121561262257600080fd5b863595506126326020880161255d565b9450604087013567ffffffffffffffff8082111561264f57600080fd5b61265b8a838b016125c0565b9096509450606089013591508082111561267457600080fd5b5061268189828a016125c0565b979a9699509497509295939492505050565b60ff841681528260208201526060604082015260006126b560608301846124a5565b95945050505050565b6000602082840312156126d057600080fd5b815173ffffffffffffffffffffffffffffffffffffffff8116811461250257600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082821015612735576127356126f4565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000821982111561277c5761277c6126f4565b500190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600067ffffffffffffffff808416806127cb576127cb612781565b92169190910692915050565b600084516127e9818460208901612479565b80830190507f2e000000000000000000000000000000000000000000000000000000000000008082528551612825816001850160208a01612479565b60019201918201528351612840816002840160208801612479565b0160020195945050505050565b60006020828403121561285f57600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b80516fffffffffffffffffffffffffffffffff8116811461256d57600080fd5b6000606082840312156128c757600080fd5b6040516060810181811067ffffffffffffffff82111715612911577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040528251815261292460208401612895565b602082015261293560408401612895565b60408201529392505050565b60006040828403121561295357600080fd5b6040516040810167ffffffffffffffff828210818311171561299e577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b81604052845183526020850151915080821682146129bb57600080fd5b5060208201529392505050565b60006fffffffffffffffffffffffffffffffff838116908316818110156129f1576129f16126f4565b039392505050565b60006fffffffffffffffffffffffffffffffff808316818516808303821115612a2457612a246126f4565b01949350505050565b8183823760009101908152919050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b604081526000612a9a604083018688612a3d565b8281036020840152612aad818587612a3d565b979650505050505050565b600067ffffffffffffffff838116908316818110156129f1576129f16126f4565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612b0a57612b0a6126f4565b5060010190565b600082612b2057612b20612781565b500490565b600082612b3457612b34612781565b50069056fea164736f6c634300080f000a" +var FaultDisputeGameDeployedBin = "0x6080604052600436106101b75760003560e01c80638129fc1c116100ec578063c31b29ce1161008a578063cf09e0d011610064578063cf09e0d01461068c578063d8cc1a3c146106ad578063fa24f743146106cd578063fdffbb28146106f157600080fd5b8063c31b29ce146105c8578063c55cd0c714610615578063c6f0308c1461062857600080fd5b806392931298116100c657806392931298146104e5578063bbdc02db14610519578063bcef3b5514610557578063c0c3a0921461059457600080fd5b80638129fc1c1461047b5780638980e0cc146104905780638b85902b146104a557600080fd5b80634778efe81161015957806355ef20e61161013357806355ef20e6146103ad578063609d33341461043d578063632247ea146104525780636361506d1461046557600080fd5b80634778efe814610323578063529184c91461035757806354fd4d501461038b57600080fd5b80632810e1d6116101955780632810e1d61461025c578063298c90051461027157806335fef567146102b1578063363cc427146102c457600080fd5b80631e27052a146101bc578063200d2ed2146101de578063266198f91461021a575b600080fd5b3480156101c857600080fd5b506101dc6101d736600461243b565b610704565b005b3480156101ea57600080fd5b506000546102049068010000000000000000900460ff1681565b604051610211919061248c565b60405180910390f35b34801561022657600080fd5b5061024e7f000000000000000000000000000000000000000000000000000000000000000081565b604051908152602001610211565b34801561026857600080fd5b506102046108c3565b34801561027d57600080fd5b50367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90036040013561024e565b6101dc6102bf36600461243b565b610a27565b3480156102d057600080fd5b506000546102fe906901000000000000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610211565b34801561032f57600080fd5b5061024e7f000000000000000000000000000000000000000000000000000000000000000081565b34801561036357600080fd5b506102fe7f000000000000000000000000000000000000000000000000000000000000000081565b34801561039757600080fd5b506103a0610a37565b6040516102119190612543565b3480156103b957600080fd5b5060408051606080820183526003546fffffffffffffffffffffffffffffffff8082168452700100000000000000000000000000000000918290048116602080860191909152600454858701528551938401865260055480831685529290920416908201526006549281019290925261042f9182565b60405161021192919061255d565b34801561044957600080fd5b506103a0610ada565b6101dc6104603660046125c6565b610ae8565b34801561047157600080fd5b5061024e60015481565b34801561048757600080fd5b506101dc6110fe565b34801561049c57600080fd5b5060025461024e565b3480156104b157600080fd5b50367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90036020013561024e565b3480156104f157600080fd5b506102fe7f000000000000000000000000000000000000000000000000000000000000000081565b34801561052557600080fd5b5060405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610211565b34801561056357600080fd5b50367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90033561024e565b3480156105a057600080fd5b506102fe7f000000000000000000000000000000000000000000000000000000000000000081565b3480156105d457600080fd5b506105fc7f000000000000000000000000000000000000000000000000000000000000000081565b60405167ffffffffffffffff9091168152602001610211565b6101dc61062336600461243b565b611702565b34801561063457600080fd5b506106486106433660046125fb565b61170e565b6040805163ffffffff90961686529315156020860152928401919091526fffffffffffffffffffffffffffffffff908116606084015216608082015260a001610211565b34801561069857600080fd5b506000546105fc9067ffffffffffffffff1681565b3480156106b957600080fd5b506101dc6106c836600461265d565b61177f565b3480156106d957600080fd5b506106e2611ca8565b604051610211939291906126e7565b6101dc6106ff3660046125fb565b611d05565b6000805468010000000000000000900460ff1660028111156107285761072861245d565b1461075f576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16637dc0d1d06040518163ffffffff1660e01b8152600401602060405180830381865afa1580156107cc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107f09190612712565b7f9a1f5e7f00000000000000000000000000000000000000000000000000000000601c8190526020859052909150600084600181146108575760028114610861576003811461086b576004811461087557600581146108855763ff137e656000526004601cfd5b600154915061088c565b600454915061088c565b600654915061088c565b60035460801c60c01b915061088c565b4660c01b91505b50604052600160038511811b6005031b60605260808390526000806084601c82865af16108bd573d6000803e3d6000fd5b50505050565b60008060005468010000000000000000900460ff1660028111156108e9576108e961245d565b14610920576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60095460ff1661095c576040517f9a07664600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600260008154811061097057610970612748565b6000918252602090912060039091020154640100000000900460ff1661099757600261099a565b60015b6000805491925082917fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff16680100000000000000008360028111156109e1576109e161245d565b0217905560028111156109f6576109f661245d565b6040517f5e186f09b9c93491f14e277eea7faa5de6a2d4bda75a79af7a3684fbfb42da6090600090a290565b905090565b610a3382826000610ae8565b5050565b6060610a627f0000000000000000000000000000000000000000000000000000000000000000612036565b610a8b7f0000000000000000000000000000000000000000000000000000000000000000612036565b610ab47f0000000000000000000000000000000000000000000000000000000000000000612036565b604051602001610ac693929190612777565b604051602081830303815290604052905090565b6060610a2260206040612173565b6000805468010000000000000000900460ff166002811115610b0c57610b0c61245d565b14610b43576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b82158015610b4f575080155b15610b86576040517fa42637bc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060028481548110610b9b57610b9b612748565b600091825260208083206040805160a081018252600394909402909101805463ffffffff808216865264010000000090910460ff16151593850193909352600181015491840191909152600201546fffffffffffffffffffffffffffffffff80821660608501819052700100000000000000000000000000000000909204166080840152919350610c2f9190859061220a16565b90507f0000000000000000000000000000000000000000000000000000000000000000610cee826fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b67ffffffffffffffff161115610d30576040517f56f57b2b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815160009063ffffffff90811614610d90576002836000015163ffffffff1681548110610d5f57610d5f612748565b906000526020600020906003020160020160109054906101000a90046fffffffffffffffffffffffffffffffff1690505b608083015160009067ffffffffffffffff1667ffffffffffffffff1642610dc9846fffffffffffffffffffffffffffffffff1660401c90565b67ffffffffffffffff16610ddd919061281c565b610de79190612834565b9050677fffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000060011c1667ffffffffffffffff82161115610e5a576040517f3381d11400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000604082901b42176000888152608086901b6fffffffffffffffffffffffffffffffff8b1617602052604081209192509060008181526007602052604090205490915060ff1615610ed8576040517f80497e3b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600081815260076020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001908117909155815160a08101835263ffffffff808f1682529381018581529281018d81526fffffffffffffffffffffffffffffffff808c16606084019081528982166080850190815260028054808801825599819052945160039099027f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace8101805498511515640100000000027fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000009099169a909916999099179690961790965590517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5acf8701559351925184167001000000000000000000000000000000000292909316919091177f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad09093019290925580548b90811061105057611050612748565b6000918252602080832060039092029091018054931515640100000000027fffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffff909416939093179092558a81526008909152604090206002546110b490600190612834565b8154600181018355600092835260208320015560405133918a918c917f9b3245740ec3b155098a55be84957a4da13eaf7f14a8bc6f53126c0b9350f2be91a4505050505050505050565b367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90033560001a600181148061113e575060ff81166002145b6111a4576040517ff40239db000000000000000000000000000000000000000000000000000000008152367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c900335600482015260240160405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000164267ffffffffffffffff161781556040805160a08101825263ffffffff815260208101929092526002919081016112297ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe369081013560f01c90033590565b815260016020820152604001426fffffffffffffffffffffffffffffffff9081169091528254600181810185556000948552602080862085516003909402018054918601511515640100000000027fffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000090921663ffffffff909416939093171782556040840151908201556060830151608090930151821670010000000000000000000000000000000002929091169190911760029091015573ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016637f00642061135260207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe369081013560f01c9003013590565b6040518263ffffffff1660e01b815260040161137091815260200190565b602060405180830381865afa15801561138d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113b1919061284b565b9050600073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001663a25ae5576113fc600185612834565b6040518263ffffffff1660e01b815260040161141a91815260200190565b606060405180830381865afa158015611437573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061145b91906128b3565b6040517fa25ae5570000000000000000000000000000000000000000000000000000000081526004810184905290915060009073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063a25ae55790602401606060405180830381865afa1580156114ec573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061151091906128b3565b9050600073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000166399d548aa367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c9003604001356040518263ffffffff1660e01b815260040161159c91815260200190565b6040805180830381865afa1580156115b8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115dc919061293f565b905081602001516fffffffffffffffffffffffffffffffff16816020015167ffffffffffffffff161161163b576040517f13809ba500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805160a081018252908190810180611656600189612834565b6fffffffffffffffffffffffffffffffff908116825260408881015182166020808501919091529851928101929092529183528051606081018252978216885285810151821688880152945187860152908501959095528051805181860151908716700100000000000000000000000000000000918816820217600355908401516004559084015180519481015194861694909516029290921760055591909101516006555160015550565b610a3382826001610ae8565b6002818154811061171e57600080fd5b600091825260209091206003909102018054600182015460029092015463ffffffff8216935064010000000090910460ff1691906fffffffffffffffffffffffffffffffff8082169170010000000000000000000000000000000090041685565b6000805468010000000000000000900460ff1660028111156117a3576117a361245d565b146117da576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600287815481106117ef576117ef612748565b6000918252602082206003919091020160028101549092506fffffffffffffffffffffffffffffffff16908715821760011b905061184e7f0000000000000000000000000000000000000000000000000000000000000000600161281c565b6118ea826fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b67ffffffffffffffff161461192b576040517f5f53dd9800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008089156119ae5761194f836fffffffffffffffffffffffffffffffff16612212565b67ffffffffffffffff16156119825761197961196c6001866129c6565b865463ffffffff166122b8565b600101546119a4565b7f00000000000000000000000000000000000000000000000000000000000000005b91508490506119c8565b846001015491506119c584600161196c91906129f7565b90505b600882901b60088a8a6040516119df929190612a2b565b6040518091039020901b14611a20576040517f696550ff00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600081600101547f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663f8e0cb968c8c8c8c6040518563ffffffff1660e01b8152600401611a869493929190612a84565b6020604051808303816000875af1158015611aa5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ac9919061284b565b600284810154929091149250600091611b74906fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b611c10886fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b611c1a9190612ab6565b611c249190612b06565b67ffffffffffffffff161590508115158103611c6c576040517ffb4e40dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505084547fffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffff166401000000001790945550505050505050505050565b7f0000000000000000000000000000000000000000000000000000000000000000367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c9003356060611cfe610ada565b9050909192565b6000805468010000000000000000900460ff166002811115611d2957611d2961245d565b14611d60576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060028281548110611d7557611d75612748565b60009182526020909120600260039092020190810154909150677fffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000060011c1690611de590700100000000000000000000000000000000900467ffffffffffffffff1642612834565b6002830154611e159190700100000000000000000000000000000000900460401c67ffffffffffffffff1661281c565b11611e4c576040517ff2440b5300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600082815260086020526040902082158015611e6a575060095460ff165b15611ea1576040517ff1a9458100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8054158015611eaf57508215155b15611ee6576040517ff1a9458100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000805b8254811015611fb4576000838281548110611f0757611f07612748565b6000918252602080832090910154808352600890915260409091205490915015611f5d576040517f9a07664600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060028281548110611f7257611f72612748565b600091825260209091206003909102018054909150640100000000900460ff16611fa157600193505050611fb4565b505080611fad90612b2d565b9050611eea565b5082547fffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffff16640100000000821515021783556000848152600860205260408120611ffd91612401565b836000036108bd57600980547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905550505050565b60608160000361207957505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b81156120a3578061208d81612b2d565b915061209c9050600a83612b65565b915061207d565b60008167ffffffffffffffff8111156120be576120be612864565b6040519080825280601f01601f1916602001820160405280156120e8576020820181803683370190505b5090505b841561216b576120fd600183612834565b915061210a600a86612b79565b61211590603061281c565b60f81b81838151811061212a5761212a612748565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350612164600a86612b65565b94506120ec565b949350505050565b606060006121aa84367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c900361281c565b90508267ffffffffffffffff1667ffffffffffffffff8111156121cf576121cf612864565b6040519080825280601f01601f1916602001820160405280156121f9576020820181803683370190505b509150828160208401375092915050565b151760011b90565b60008061229f837e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b600167ffffffffffffffff919091161b90920392915050565b6000806122d6846fffffffffffffffffffffffffffffffff16612355565b9050600283815481106122eb576122eb612748565b906000526020600020906003020191505b60028201546fffffffffffffffffffffffffffffffff82811691161461234e57815460028054909163ffffffff1690811061233957612339612748565b906000526020600020906003020191506122fc565b5092915050565b600081196001830116816123e9827e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b67ffffffffffffffff169390931c8015179392505050565b508054600082559060005260206000209081019061241f9190612422565b50565b5b808211156124375760008155600101612423565b5090565b6000806040838503121561244e57600080fd5b50508035926020909101359150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60208101600383106124c7577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b60005b838110156124e85781810151838201526020016124d0565b838111156108bd5750506000910152565b600081518084526125118160208601602086016124cd565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061255660208301846124f9565b9392505050565b82516fffffffffffffffffffffffffffffffff90811682526020808501518216818401526040808601518185015284518316606085015290840151909116608083015282015160a082015260c08101612556565b803580151581146125c157600080fd5b919050565b6000806000606084860312156125db57600080fd5b83359250602084013591506125f2604085016125b1565b90509250925092565b60006020828403121561260d57600080fd5b5035919050565b60008083601f84011261262657600080fd5b50813567ffffffffffffffff81111561263e57600080fd5b60208301915083602082850101111561265657600080fd5b9250929050565b6000806000806000806080878903121561267657600080fd5b86359550612686602088016125b1565b9450604087013567ffffffffffffffff808211156126a357600080fd5b6126af8a838b01612614565b909650945060608901359150808211156126c857600080fd5b506126d589828a01612614565b979a9699509497509295939492505050565b60ff8416815282602082015260606040820152600061270960608301846124f9565b95945050505050565b60006020828403121561272457600080fd5b815173ffffffffffffffffffffffffffffffffffffffff8116811461255657600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600084516127898184602089016124cd565b80830190507f2e0000000000000000000000000000000000000000000000000000000000000080825285516127c5816001850160208a016124cd565b600192019182015283516127e08160028401602088016124cd565b0160020195945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000821982111561282f5761282f6127ed565b500190565b600082821015612846576128466127ed565b500390565b60006020828403121561285d57600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b80516fffffffffffffffffffffffffffffffff811681146125c157600080fd5b6000606082840312156128c557600080fd5b6040516060810181811067ffffffffffffffff8211171561290f577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040528251815261292260208401612893565b602082015261293360408401612893565b60408201529392505050565b60006040828403121561295157600080fd5b6040516040810167ffffffffffffffff828210818311171561299c577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b81604052845183526020850151915080821682146129b957600080fd5b5060208201529392505050565b60006fffffffffffffffffffffffffffffffff838116908316818110156129ef576129ef6127ed565b039392505050565b60006fffffffffffffffffffffffffffffffff808316818516808303821115612a2257612a226127ed565b01949350505050565b8183823760009101908152919050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b604081526000612a98604083018688612a3b565b8281036020840152612aab818587612a3b565b979650505050505050565b600067ffffffffffffffff838116908316818110156129ef576129ef6127ed565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600067ffffffffffffffff80841680612b2157612b21612ad7565b92169190910692915050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612b5e57612b5e6127ed565b5060010190565b600082612b7457612b74612ad7565b500490565b600082612b8857612b88612ad7565b50069056fea164736f6c634300080f000a" func init() { if err := json.Unmarshal([]byte(FaultDisputeGameStorageLayoutJSON), FaultDisputeGameStorageLayout); err != nil { diff --git a/packages/contracts-bedrock/.gas-snapshot b/packages/contracts-bedrock/.gas-snapshot index d00302c1e96b..4f1f35298f0d 100644 --- a/packages/contracts-bedrock/.gas-snapshot +++ b/packages/contracts-bedrock/.gas-snapshot @@ -88,39 +88,45 @@ FaucetTest:test_nonAdmin_drip_fails() (gas: 262520) FaucetTest:test_receive_succeeds() (gas: 17401) FaucetTest:test_withdraw_nonAdmin_reverts() (gas: 13145) FaucetTest:test_withdraw_succeeds() (gas: 78359) -FaultDisputeGame_ResolvesCorrectly_CorrectRoot1:test_resolvesCorrectly_succeeds() (gas: 499197) -FaultDisputeGame_ResolvesCorrectly_CorrectRoot2:test_resolvesCorrectly_succeeds() (gas: 506057) -FaultDisputeGame_ResolvesCorrectly_CorrectRoot3:test_resolvesCorrectly_succeeds() (gas: 502738) -FaultDisputeGame_ResolvesCorrectly_CorrectRoot4:test_resolvesCorrectly_succeeds() (gas: 505955) -FaultDisputeGame_ResolvesCorrectly_CorrectRoot5:test_resolvesCorrectly_succeeds() (gas: 505224) -FaultDisputeGame_ResolvesCorrectly_IncorrectRoot1:test_resolvesCorrectly_succeeds() (gas: 497962) -FaultDisputeGame_ResolvesCorrectly_IncorrectRoot2:test_resolvesCorrectly_succeeds() (gas: 504822) -FaultDisputeGame_ResolvesCorrectly_IncorrectRoot3:test_resolvesCorrectly_succeeds() (gas: 501503) -FaultDisputeGame_ResolvesCorrectly_IncorrectRoot4:test_resolvesCorrectly_succeeds() (gas: 502720) -FaultDisputeGame_ResolvesCorrectly_IncorrectRoot5:test_resolvesCorrectly_succeeds() (gas: 501989) -FaultDisputeGame_Test:test_addLocalData_static_succeeds() (gas: 640504) +FaultDisputeGame_ResolvesCorrectly_CorrectRoot1:test_resolvesCorrectly_succeeds() (gas: 660411) +FaultDisputeGame_ResolvesCorrectly_CorrectRoot2:test_resolvesCorrectly_succeeds() (gas: 667293) +FaultDisputeGame_ResolvesCorrectly_CorrectRoot3:test_resolvesCorrectly_succeeds() (gas: 663974) +FaultDisputeGame_ResolvesCorrectly_CorrectRoot4:test_resolvesCorrectly_succeeds() (gas: 667169) +FaultDisputeGame_ResolvesCorrectly_CorrectRoot5:test_resolvesCorrectly_succeeds() (gas: 666460) +FaultDisputeGame_ResolvesCorrectly_IncorrectRoot1:test_resolvesCorrectly_succeeds() (gas: 653092) +FaultDisputeGame_ResolvesCorrectly_IncorrectRoot2:test_resolvesCorrectly_succeeds() (gas: 658598) +FaultDisputeGame_ResolvesCorrectly_IncorrectRoot3:test_resolvesCorrectly_succeeds() (gas: 655943) +FaultDisputeGame_ResolvesCorrectly_IncorrectRoot4:test_resolvesCorrectly_succeeds() (gas: 656899) +FaultDisputeGame_ResolvesCorrectly_IncorrectRoot5:test_resolvesCorrectly_succeeds() (gas: 656332) +FaultDisputeGame_Test:test_addLocalData_static_succeeds() (gas: 640567) FaultDisputeGame_Test:test_createdAt_succeeds() (gas: 10342) -FaultDisputeGame_Test:test_extraData_succeeds() (gas: 32377) -FaultDisputeGame_Test:test_gameData_succeeds() (gas: 32804) -FaultDisputeGame_Test:test_gameType_succeeds() (gas: 8309) -FaultDisputeGame_Test:test_initialize_correctData_succeeds() (gas: 57628) -FaultDisputeGame_Test:test_initialize_firstOutput_reverts() (gas: 210629) -FaultDisputeGame_Test:test_initialize_l1HeadTooOld_reverts() (gas: 228390) -FaultDisputeGame_Test:test_move_clockCorrectness_succeeds() (gas: 415971) -FaultDisputeGame_Test:test_move_clockTimeExceeded_reverts() (gas: 23197) -FaultDisputeGame_Test:test_move_defendRoot_reverts() (gas: 13344) -FaultDisputeGame_Test:test_move_duplicateClaim_reverts() (gas: 102898) -FaultDisputeGame_Test:test_move_gameDepthExceeded_reverts() (gas: 407913) +FaultDisputeGame_Test:test_extraData_succeeds() (gas: 32355) +FaultDisputeGame_Test:test_gameData_succeeds() (gas: 32782) +FaultDisputeGame_Test:test_gameType_succeeds() (gas: 8265) +FaultDisputeGame_Test:test_initialize_correctData_succeeds() (gas: 57739) +FaultDisputeGame_Test:test_initialize_firstOutput_reverts() (gas: 210563) +FaultDisputeGame_Test:test_initialize_l1HeadTooOld_reverts() (gas: 228368) +FaultDisputeGame_Test:test_move_clockCorrectness_succeeds() (gas: 594268) +FaultDisputeGame_Test:test_move_clockTimeExceeded_reverts() (gas: 23175) +FaultDisputeGame_Test:test_move_defendRoot_reverts() (gas: 13366) +FaultDisputeGame_Test:test_move_duplicateClaim_reverts() (gas: 147389) +FaultDisputeGame_Test:test_move_duplicateClaimsDifferentSubgames_succeeds() (gas: 556885) +FaultDisputeGame_Test:test_move_gameDepthExceeded_reverts() (gas: 585897) FaultDisputeGame_Test:test_move_gameNotInProgress_reverts() (gas: 11002) -FaultDisputeGame_Test:test_move_nonExistentParent_reverts() (gas: 24710) -FaultDisputeGame_Test:test_move_simpleAttack_succeeds() (gas: 107384) -FaultDisputeGame_Test:test_resolve_challengeContested_succeeds() (gas: 224949) -FaultDisputeGame_Test:test_resolve_notInProgress_reverts() (gas: 9686) -FaultDisputeGame_Test:test_resolve_rootContested_succeeds() (gas: 109879) -FaultDisputeGame_Test:test_resolve_rootUncontestedClockNotExpired_succeeds() (gas: 21421) -FaultDisputeGame_Test:test_resolve_rootUncontested_succeeds() (gas: 27279) -FaultDisputeGame_Test:test_resolve_teamDeathmatch_succeeds() (gas: 395658) -FaultDisputeGame_Test:test_rootClaim_succeeds() (gas: 8276) +FaultDisputeGame_Test:test_move_nonExistentParent_reverts() (gas: 24666) +FaultDisputeGame_Test:test_move_simpleAttack_succeeds() (gas: 151959) +FaultDisputeGame_Test:test_resolve_challengeContested_succeeds() (gas: 269413) +FaultDisputeGame_Test:test_resolve_claimAlreadyResolved_reverts() (gas: 272356) +FaultDisputeGame_Test:test_resolve_claimAtMaxDepthAlreadyResolved_reverts() (gas: 586672) +FaultDisputeGame_Test:test_resolve_notInProgress_reverts() (gas: 9732) +FaultDisputeGame_Test:test_resolve_outOfOrderResolution_reverts() (gas: 309037) +FaultDisputeGame_Test:test_resolve_rootContested_succeeds() (gas: 139044) +FaultDisputeGame_Test:test_resolve_rootUncontestedButUnresolved_reverts() (gas: 15883) +FaultDisputeGame_Test:test_resolve_rootUncontestedClockNotExpired_succeeds() (gas: 18406) +FaultDisputeGame_Test:test_resolve_rootUncontested_succeeds() (gas: 51409) +FaultDisputeGame_Test:test_resolve_stepReached_succeeds() (gas: 498476) +FaultDisputeGame_Test:test_resolve_teamDeathmatch_succeeds() (gas: 443373) +FaultDisputeGame_Test:test_rootClaim_succeeds() (gas: 8232) FeeVault_Test:test_constructor_succeeds() (gas: 18185) GasBenchMark_L1CrossDomainMessenger:test_sendMessage_benchmark_0() (gas: 354421) GasBenchMark_L1CrossDomainMessenger:test_sendMessage_benchmark_1() (gas: 2952628) diff --git a/packages/contracts-bedrock/semver-lock.json b/packages/contracts-bedrock/semver-lock.json index 5e4580fe5eee..124de724497a 100644 --- a/packages/contracts-bedrock/semver-lock.json +++ b/packages/contracts-bedrock/semver-lock.json @@ -17,7 +17,7 @@ "src/L2/L2StandardBridge.sol": "0xfe01bcb1ddc947b9b8a7093d0971854b9fa8d49da5bd933a3dd106167907f882", "src/L2/L2ToL1MessagePasser.sol": "0xafc710b4d320ef450586d96a61cbd58cac814cb3b0c4fdc280eace3efdcdf321", "src/L2/SequencerFeeVault.sol": "0xc2f733c1128d06ad60bf1e1d98c8f684a4825b11875ccdf2376ede33f5aad4e6", - "src/dispute/FaultDisputeGame.sol": "0x7b8462c29d003e96a73491c644001e1a9034bcc45c5be2a7bac3caf80d521635", + "src/dispute/FaultDisputeGame.sol": "0x76e7c16431faa32e2074e6abdfe3e86f5ec90b4ac8a6b662edba8c3ce791ad80", "src/legacy/DeployerWhitelist.sol": "0xf2129ec3da75307ba8e21bc943c332bb04704642e6e263149b5c8ee92dbcb7a8", "src/legacy/L1BlockNumber.sol": "0x30aae1fc85103476af0226b6e98c71c01feebbdc35d93401390b1ad438a37be6", "src/legacy/LegacyMessagePasser.sol": "0x5c08b0a663cc49d30e4e38540f6aefab19ef287c3ecd31c8d8c3decd5f5bd497", diff --git a/packages/contracts-bedrock/src/dispute/FaultDisputeGame.sol b/packages/contracts-bedrock/src/dispute/FaultDisputeGame.sol index 398071d1e296..d86fea087a5c 100644 --- a/packages/contracts-bedrock/src/dispute/FaultDisputeGame.sol +++ b/packages/contracts-bedrock/src/dispute/FaultDisputeGame.sol @@ -75,6 +75,12 @@ contract FaultDisputeGame is IFaultDisputeGame, Clone, Semver { /// @notice An internal mapping to allow for constant-time lookups of existing claims. mapping(ClaimHash => bool) internal claims; + /// @notice An internal mapping of subgames rooted at a claim index to other claim indices in the subgame. + mapping(uint256 => uint256[]) internal subgames; + + /// @notice Indicates whether the subgame rooted at the root claim has been resolved. + bool internal subgameAtRootResolved; + /// @param _gameType The type ID of the game. /// @param _absolutePrestate The absolute prestate of the instruction trace. /// @param _maxGameDepth The maximum depth of bisection. @@ -232,9 +238,10 @@ contract FaultDisputeGame is IFaultDisputeGame, Clone, Semver { // Construct the next clock with the new duration and the current block timestamp. Clock nextClock = LibClock.wrap(nextDuration, Timestamp.wrap(uint64(block.timestamp))); - // INVARIANT: A claim may only exist at a given position once. Multiple claims may exist - // at the same position, however they must have different values. - ClaimHash claimHash = _claim.hashClaimPos(nextPosition); + // INVARIANT: There cannot be multiple identical claims with identical moves on the same challengeIndex. Multiple + // claims + // at the same position may dispute the same challengeIndex. However, the must have different values. + ClaimHash claimHash = _claim.hashClaimPos(nextPosition, _challengeIndex); if (claims[claimHash]) revert ClaimAlreadyExists(); claims[claimHash] = true; @@ -252,6 +259,9 @@ contract FaultDisputeGame is IFaultDisputeGame, Clone, Semver { // Set the parent claim as countered. claimData[_challengeIndex].countered = true; + // Update the subgame rooted at the parent claim. + subgames[_challengeIndex].push(claimData.length - 1); + // Emit the appropriate event for the attack or defense. emit Move(_challengeIndex, _claim, msg.sender); } @@ -348,67 +358,64 @@ contract FaultDisputeGame is IFaultDisputeGame, Clone, Semver { // INVARIANT: Resolution cannot occur unless the game is currently in progress. if (status != GameStatus.IN_PROGRESS) revert GameNotInProgress(); - // Search for the left-most dangling non-bottom node - // The most recent claim is always a dangling, non-bottom node so we start with that - uint256 leftMostIndex = claimData.length - 1; - uint256 leftMostTraceIndex = type(uint128).max; - for (uint256 i = leftMostIndex; i < type(uint64).max;) { - // Fetch the claim at the current index. - ClaimData storage claim = claimData[i]; - - // Decrement the loop counter; If it underflows, we've reached the root - // claim and can stop searching. - unchecked { - --i; - } + // INVARIANT: Resolution cannot occur unless the absolute root subgame has been resolved. + if (!subgameAtRootResolved) revert OutOfOrderResolution(); - // INVARIANT: A claim can never be considered as the leftMostIndex or leftMostTraceIndex - // if it has been countered. - if (claim.countered) continue; - - // If the claim is a dangling node, we can check if it is the left-most - // dangling node we've come across so far. If it is, we can update the - // left-most trace index. - uint256 traceIndex = claim.position.traceIndex(MAX_GAME_DEPTH); - if (traceIndex < leftMostTraceIndex) { - leftMostTraceIndex = traceIndex; - unchecked { - leftMostIndex = i + 1; - } - } - } + status_ = claimData[0].countered ? GameStatus.CHALLENGER_WINS : GameStatus.DEFENDER_WINS; + emit Resolved(status = status_); + } - // Create a reference to the left most uncontested claim and its parent. - ClaimData storage leftMostUncontested = claimData[leftMostIndex]; + /// @inheritdoc IFaultDisputeGame + function resolveClaim(uint256 _claimIndex) external payable { + // INVARIANT: Resolution cannot occur unless the game is currently in progress. + if (status != GameStatus.IN_PROGRESS) revert GameNotInProgress(); - // INVARIANT: The game may never be resolved unless the clock of the left-most uncontested - // claim's parent has expired. If the left-most uncontested claim is the root - // claim, it is uncountered, and we check if 3.5 days has passed since its - // creation. - uint256 parentIndex = leftMostUncontested.parentIndex; - Clock opposingClock = parentIndex == type(uint32).max ? leftMostUncontested.clock : claimData[parentIndex].clock; + ClaimData storage parent = claimData[_claimIndex]; + + // INVARIANT: Cannot resolve a subgame unless the clock of its root has expired if ( - Duration.unwrap(opposingClock.duration()) + (block.timestamp - Timestamp.unwrap(opposingClock.timestamp())) + Duration.unwrap(parent.clock.duration()) + (block.timestamp - Timestamp.unwrap(parent.clock.timestamp())) <= Duration.unwrap(GAME_DURATION) >> 1 ) { revert ClockNotExpired(); } - // If the left-most dangling node is at an even depth, the defender wins. - // Otherwise, the challenger wins and the root claim is deemed invalid. - if ( - leftMostUncontested - .position - // slither-disable-next-line weak-prng - .depth() % 2 == 0 && leftMostTraceIndex != type(uint128).max - ) { - status_ = GameStatus.DEFENDER_WINS; - } else { - status_ = GameStatus.CHALLENGER_WINS; + uint256[] storage challengeIndices = subgames[_claimIndex]; + + // INVARIANT: Cannot resolve subgames twice + // Uncontested claims are resolved implicitly unless they are the root claim + if (_claimIndex == 0 && subgameAtRootResolved) revert ClaimAlreadyResolved(); + if (challengeIndices.length == 0 && _claimIndex != 0) revert ClaimAlreadyResolved(); + + // Assume parent is honest until proven otherwise + bool countered = false; + + for (uint256 i = 0; i < challengeIndices.length; ++i) { + uint256 challengeIndex = challengeIndices[i]; + + // INVARIANT: Cannot resolve a subgame containing an unresolved claim + if (subgames[challengeIndex].length != 0) revert OutOfOrderResolution(); + + ClaimData storage claim = claimData[challengeIndex]; + + // Ignore false claims + if (!claim.countered) { + countered = true; + break; + } } - // Update the game status - emit Resolved(status = status_); + // Once a subgame is resolved, we percolate the result up the DAG so subsequent calls to + // resolveClaim will not need to traverse this subgame. + parent.countered = countered; + + // Resolved subgames have no entries + delete subgames[_claimIndex]; + + // Indicate the game is ready to be resolved + if (_claimIndex == 0) { + subgameAtRootResolved = true; + } } /// @inheritdoc IDisputeGame diff --git a/packages/contracts-bedrock/src/dispute/interfaces/IFaultDisputeGame.sol b/packages/contracts-bedrock/src/dispute/interfaces/IFaultDisputeGame.sol index f78669186f85..c6506599e9e2 100644 --- a/packages/contracts-bedrock/src/dispute/interfaces/IFaultDisputeGame.sol +++ b/packages/contracts-bedrock/src/dispute/interfaces/IFaultDisputeGame.sol @@ -73,6 +73,14 @@ interface IFaultDisputeGame is IDisputeGame { /// @param _partOffset The offset of the data to post. function addLocalData(uint256 _ident, uint256 _partOffset) external; + /// @notice Resolves the subgame rooted at the given claim index. + /// @dev This function must be called bottom-up in the DAG + /// A subgame is a tree of claims that has a maximum depth of 1. + /// A subgame root claims is valid if, and only if, all of its child claims are invalid. + /// At the deepest level in the DAG, a claim is invalid if there's a successful step against it. + /// @param _claimIndex The index of the subgame root claim to resolve. + function resolveClaim(uint256 _claimIndex) external payable; + /// @notice An L1 block hash that contains the disputed output root, fetched from the /// `BlockOracle` and verified by referencing the timestamp associated with the /// first L2 Output Proposal in the `L2OutputOracle` that contains the disputed diff --git a/packages/contracts-bedrock/src/dispute/lib/LibHashing.sol b/packages/contracts-bedrock/src/dispute/lib/LibHashing.sol index 25b99e0f9809..800eeb1bde67 100644 --- a/packages/contracts-bedrock/src/dispute/lib/LibHashing.sol +++ b/packages/contracts-bedrock/src/dispute/lib/LibHashing.sol @@ -9,11 +9,20 @@ library LibHashing { /// @notice Hashes a claim and a position together. /// @param _claim A Claim type. /// @param _position The position of `claim`. - /// @return claimHash_ A hash of abi.encodePacked(claim, position); - function hashClaimPos(Claim _claim, Position _position) internal pure returns (ClaimHash claimHash_) { + /// @param _challengeIndex The index of the claim being moved against. + /// @return claimHash_ A hash of abi.encodePacked(claim, position|challengeIndex); + function hashClaimPos( + Claim _claim, + Position _position, + uint256 _challengeIndex + ) + internal + pure + returns (ClaimHash claimHash_) + { assembly { mstore(0x00, _claim) - mstore(0x20, _position) + mstore(0x20, or(shl(128, _position), and(0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF, _challengeIndex))) claimHash_ := keccak256(0x00, 0x40) } } diff --git a/packages/contracts-bedrock/src/libraries/DisputeErrors.sol b/packages/contracts-bedrock/src/libraries/DisputeErrors.sol index a2ba22eb83bb..919fce0cad88 100644 --- a/packages/contracts-bedrock/src/libraries/DisputeErrors.sol +++ b/packages/contracts-bedrock/src/libraries/DisputeErrors.sol @@ -66,6 +66,12 @@ error L1HeadTooOld(); /// @notice Thrown when an invalid local identifier is passed to the `addLocalData` function. error InvalidLocalIdent(); +/// @notice Thrown when resolving claims out of order. +error OutOfOrderResolution(); + +/// @notice Thrown when resolving a claim that has already been resolved. +error ClaimAlreadyResolved(); + //////////////////////////////////////////////////////////////// // `AttestationDisputeGame` Errors // //////////////////////////////////////////////////////////////// diff --git a/packages/contracts-bedrock/test/FaultDisputeGame.t.sol b/packages/contracts-bedrock/test/FaultDisputeGame.t.sol index 1857404a9bad..782b6581d922 100644 --- a/packages/contracts-bedrock/test/FaultDisputeGame.t.sol +++ b/packages/contracts-bedrock/test/FaultDisputeGame.t.sol @@ -303,6 +303,19 @@ contract FaultDisputeGame_Test is FaultDisputeGame_Init { gameProxy.attack(0, claim); } + /// @dev Static unit test asserting that identical claims at the same position can be made in different subgames. + function test_move_duplicateClaimsDifferentSubgames_succeeds() public { + Claim claimA = Claim.wrap(bytes32(uint256(5))); + Claim claimB = Claim.wrap(bytes32(uint256(6))); + + // Make the first move. This should succeed. + gameProxy.attack(0, claimA); + gameProxy.attack(0, claimB); + + gameProxy.attack(1, claimB); + gameProxy.attack(2, claimA); + } + /// @dev Static unit test for the correctness of an opening attack. function test_move_simpleAttack_succeeds() public { // Warp ahead 5 seconds. @@ -344,15 +357,22 @@ contract FaultDisputeGame_Test is FaultDisputeGame_Init { /// @dev Static unit test for the correctness an uncontested root resolution. function test_resolve_rootUncontested_succeeds() public { vm.warp(block.timestamp + 3 days + 12 hours + 1 seconds); - GameStatus status = gameProxy.resolve(); - assertEq(uint8(status), uint8(GameStatus.DEFENDER_WINS)); - assertEq(uint8(gameProxy.status()), uint8(GameStatus.DEFENDER_WINS)); + gameProxy.resolveClaim(0); + assertEq(uint8(gameProxy.resolve()), uint8(GameStatus.DEFENDER_WINS)); } /// @dev Static unit test for the correctness an uncontested root resolution. function test_resolve_rootUncontestedClockNotExpired_succeeds() public { vm.warp(block.timestamp + 3 days + 12 hours); vm.expectRevert(ClockNotExpired.selector); + gameProxy.resolveClaim(0); + } + + /// @dev Static unit test asserting that resolve reverts when the absolute root + /// subgame has not been resolved. + function test_resolve_rootUncontestedButUnresolved_reverts() public { + vm.warp(block.timestamp + 3 days + 12 hours + 1 seconds); + vm.expectRevert(OutOfOrderResolution.selector); gameProxy.resolve(); } @@ -370,7 +390,7 @@ contract FaultDisputeGame_Test is FaultDisputeGame_Init { vm.store(address(gameProxy), bytes32(uint256(0)), bytes32(slot)); vm.expectRevert(GameNotInProgress.selector); - gameProxy.resolve(); + gameProxy.resolveClaim(0); } /// @dev Static unit test for the correctness of resolving a single attack game state. @@ -379,9 +399,8 @@ contract FaultDisputeGame_Test is FaultDisputeGame_Init { vm.warp(block.timestamp + 3 days + 12 hours + 1 seconds); - GameStatus status = gameProxy.resolve(); - assertEq(uint8(status), uint8(GameStatus.CHALLENGER_WINS)); - assertEq(uint8(gameProxy.status()), uint8(GameStatus.CHALLENGER_WINS)); + gameProxy.resolveClaim(0); + assertEq(uint8(gameProxy.resolve()), uint8(GameStatus.CHALLENGER_WINS)); } /// @dev Static unit test for the correctness of resolving a game with a contested challenge claim. @@ -391,9 +410,9 @@ contract FaultDisputeGame_Test is FaultDisputeGame_Init { vm.warp(block.timestamp + 3 days + 12 hours + 1 seconds); - GameStatus status = gameProxy.resolve(); - assertEq(uint8(status), uint8(GameStatus.DEFENDER_WINS)); - assertEq(uint8(gameProxy.status()), uint8(GameStatus.DEFENDER_WINS)); + gameProxy.resolveClaim(1); + gameProxy.resolveClaim(0); + assertEq(uint8(gameProxy.resolve()), uint8(GameStatus.DEFENDER_WINS)); } /// @dev Static unit test for the correctness of resolving a game with multiplayer moves. @@ -405,9 +424,62 @@ contract FaultDisputeGame_Test is FaultDisputeGame_Init { vm.warp(block.timestamp + 3 days + 12 hours + 1 seconds); - GameStatus status = gameProxy.resolve(); - assertEq(uint8(status), uint8(GameStatus.CHALLENGER_WINS)); - assertEq(uint8(gameProxy.status()), uint8(GameStatus.CHALLENGER_WINS)); + gameProxy.resolveClaim(1); + gameProxy.resolveClaim(0); + assertEq(uint8(gameProxy.resolve()), uint8(GameStatus.CHALLENGER_WINS)); + } + + /// @dev Static unit test for the correctness of resolving a game that reaches max game depth. + function test_resolve_stepReached_succeeds() public { + gameProxy.attack(0, Claim.wrap(bytes32(uint256(5)))); + gameProxy.attack(1, Claim.wrap(bytes32(uint256(5)))); + gameProxy.attack(2, Claim.wrap(bytes32(uint256(5)))); + gameProxy.attack(3, Claim.wrap(bytes32(uint256(5)))); + + vm.warp(block.timestamp + 3 days + 12 hours + 1 seconds); + + // resolving claim at 4 isn't necessary + gameProxy.resolveClaim(3); + gameProxy.resolveClaim(2); + gameProxy.resolveClaim(1); + gameProxy.resolveClaim(0); + assertEq(uint8(gameProxy.resolve()), uint8(GameStatus.DEFENDER_WINS)); + } + + /// @dev Static unit test asserting that resolve reverts when attempting to resolve a subgame multiple times + function test_resolve_claimAlreadyResolved_reverts() public { + gameProxy.attack(0, Claim.wrap(bytes32(uint256(5)))); + gameProxy.attack(1, Claim.wrap(bytes32(uint256(5)))); + + vm.warp(block.timestamp + 3 days + 12 hours + 1 seconds); + + gameProxy.resolveClaim(1); + vm.expectRevert(ClaimAlreadyResolved.selector); + gameProxy.resolveClaim(1); + } + + /// @dev Static unit test asserting that resolve reverts when attempting to resolve a subgame at max depth + function test_resolve_claimAtMaxDepthAlreadyResolved_reverts() public { + gameProxy.attack(0, Claim.wrap(bytes32(uint256(5)))); + gameProxy.attack(1, Claim.wrap(bytes32(uint256(5)))); + gameProxy.attack(2, Claim.wrap(bytes32(uint256(5)))); + gameProxy.attack(3, Claim.wrap(bytes32(uint256(5)))); + + vm.warp(block.timestamp + 3 days + 12 hours + 1 seconds); + + vm.expectRevert(ClaimAlreadyResolved.selector); + gameProxy.resolveClaim(4); + } + + /// @dev Static unit test asserting that resolve reverts when attempting to resolve subgames out of order + function test_resolve_outOfOrderResolution_reverts() public { + gameProxy.attack(0, Claim.wrap(bytes32(uint256(5)))); + gameProxy.attack(1, Claim.wrap(bytes32(uint256(5)))); + + vm.warp(block.timestamp + 3 days + 12 hours + 1 seconds); + + vm.expectRevert(OutOfOrderResolution.selector); + gameProxy.resolveClaim(0); } /// @dev Tests that adding local data with an out of bounds identifier reverts. @@ -623,6 +695,33 @@ contract GamePlayer { } } +contract Resolver { + FaultDisputeGame public gameProxy; + + mapping(uint256 => bool) subgames; + + constructor(FaultDisputeGame gameProxy_) { + gameProxy = gameProxy_; + } + + /// @notice Auto-resolves all subgames in the game + function run() public { + for (uint256 i = gameProxy.claimDataLen() - 1; i > 0; i--) { + (uint32 parentIndex,,,,) = gameProxy.claimData(i); + subgames[parentIndex] = true; + + // Subgames containing only one node are implicitly resolved + // i.e. uncountered claims and claims at MAX_DEPTH + if (!subgames[i]) { + continue; + } + + gameProxy.resolveClaim(i); + } + gameProxy.resolveClaim(0); + } +} + contract OneVsOne_Arena is FaultDisputeGame_Init { /// @dev The absolute prestate of the trace. bytes ABSOLUTE_PRESTATE = abi.encode(15); @@ -633,12 +732,15 @@ contract OneVsOne_Arena is FaultDisputeGame_Init { GamePlayer internal defender; /// @dev The challenger. GamePlayer internal challenger; + /// @dev The resolver. + Resolver internal resolver; function init(GamePlayer _defender, GamePlayer _challenger, uint256 _finalTraceIndex) public { Claim rootClaim = _defender.claimAt(_finalTraceIndex); super.init(rootClaim, ABSOLUTE_PRESTATE_CLAIM); defender = _defender; challenger = _challenger; + resolver = new Resolver(gameProxy); // Set the counterparties. defender.init(gameProxy, challenger, vm); @@ -647,6 +749,7 @@ contract OneVsOne_Arena is FaultDisputeGame_Init { // Label actors for trace. vm.label(address(challenger), "Challenger"); vm.label(address(defender), "Defender"); + vm.label(address(resolver), "Resolver"); } } @@ -666,6 +769,7 @@ contract FaultDisputeGame_ResolvesCorrectly_IncorrectRoot1 is OneVsOne_Arena { // Resolve the game and assert that the honest player challenged the root // claim successfully. + resolver.run(); assertEq(uint8(gameProxy.resolve()), uint8(GameStatus.CHALLENGER_WINS)); assertFalse(defender.failedToStep()); } @@ -687,6 +791,7 @@ contract FaultDisputeGame_ResolvesCorrectly_CorrectRoot1 is OneVsOne_Arena { // Resolve the game and assert that the dishonest player challenged the root // claim unsuccessfully. + resolver.run(); assertEq(uint8(gameProxy.resolve()), uint8(GameStatus.DEFENDER_WINS)); assertTrue(challenger.failedToStep()); } @@ -708,6 +813,7 @@ contract FaultDisputeGame_ResolvesCorrectly_IncorrectRoot2 is OneVsOne_Arena { // Resolve the game and assert that the honest player challenged the root // claim successfully. + resolver.run(); assertEq(uint8(gameProxy.resolve()), uint8(GameStatus.CHALLENGER_WINS)); assertFalse(defender.failedToStep()); } @@ -729,6 +835,7 @@ contract FaultDisputeGame_ResolvesCorrectly_CorrectRoot2 is OneVsOne_Arena { // Resolve the game and assert that the dishonest player challenged the root // claim unsuccessfully. + resolver.run(); assertEq(uint8(gameProxy.resolve()), uint8(GameStatus.DEFENDER_WINS)); assertTrue(challenger.failedToStep()); } @@ -750,6 +857,7 @@ contract FaultDisputeGame_ResolvesCorrectly_IncorrectRoot3 is OneVsOne_Arena { // Resolve the game and assert that the honest player challenged the root // claim successfully. + resolver.run(); assertEq(uint8(gameProxy.resolve()), uint8(GameStatus.CHALLENGER_WINS)); assertFalse(defender.failedToStep()); } @@ -771,6 +879,7 @@ contract FaultDisputeGame_ResolvesCorrectly_CorrectRoot3 is OneVsOne_Arena { // Resolve the game and assert that the dishonest player challenged the root // claim unsuccessfully. + resolver.run(); assertEq(uint8(gameProxy.resolve()), uint8(GameStatus.DEFENDER_WINS)); assertTrue(challenger.failedToStep()); } @@ -792,6 +901,7 @@ contract FaultDisputeGame_ResolvesCorrectly_IncorrectRoot4 is OneVsOne_Arena { // Resolve the game and assert that the honest player challenged the root // claim successfully. + resolver.run(); assertEq(uint8(gameProxy.resolve()), uint8(GameStatus.CHALLENGER_WINS)); assertFalse(challenger.failedToStep()); } @@ -813,6 +923,7 @@ contract FaultDisputeGame_ResolvesCorrectly_CorrectRoot4 is OneVsOne_Arena { // Resolve the game and assert that the dishonest player challenged the root // claim unsuccessfully. + resolver.run(); assertEq(uint8(gameProxy.resolve()), uint8(GameStatus.DEFENDER_WINS)); assertTrue(challenger.failedToStep()); } @@ -834,6 +945,7 @@ contract FaultDisputeGame_ResolvesCorrectly_IncorrectRoot5 is OneVsOne_Arena { // Resolve the game and assert that the honest player challenged the root // claim successfully. + resolver.run(); assertEq(uint8(gameProxy.resolve()), uint8(GameStatus.CHALLENGER_WINS)); assertFalse(challenger.failedToStep()); } @@ -855,6 +967,7 @@ contract FaultDisputeGame_ResolvesCorrectly_CorrectRoot5 is OneVsOne_Arena { // Resolve the game and assert that the dishonest player challenged the root // claim unsuccessfully. + resolver.run(); assertEq(uint8(gameProxy.resolve()), uint8(GameStatus.DEFENDER_WINS)); assertTrue(challenger.failedToStep()); } @@ -883,6 +996,7 @@ contract FaultDisputeGame_ResolvesCorrectly_IncorrectRootFuzz is OneVsOne_Arena // Resolve the game and assert that the honest player challenged the root // claim successfully. + resolver.run(); assertEq(uint8(gameProxy.resolve()), uint8(GameStatus.CHALLENGER_WINS)); assertFalse(defender.failedToStep()); @@ -913,6 +1027,7 @@ contract FaultDisputeGame_ResolvesCorrectly_CorrectRootFuzz is OneVsOne_Arena { // Resolve the game and assert that the honest player challenged the root // claim successfully. + resolver.run(); assertEq(uint8(gameProxy.resolve()), uint8(GameStatus.DEFENDER_WINS)); assertTrue(challenger.failedToStep()); From 9c39a63dffd6589b5d1bad42a82032a50300a0ba Mon Sep 17 00:00:00 2001 From: Will Cory Date: Fri, 1 Sep 2023 08:46:53 -0700 Subject: [PATCH 57/87] :bug: fix(indexer): add retries to db connection --- indexer/database/db.go | 58 +++++++++++++++++++++++++----------------- 1 file changed, 34 insertions(+), 24 deletions(-) diff --git a/indexer/database/db.go b/indexer/database/db.go index b0f810d0ea7b..0a788ea1a460 100644 --- a/indexer/database/db.go +++ b/indexer/database/db.go @@ -2,10 +2,13 @@ package database import ( + "context" "fmt" "github.com/ethereum-optimism/optimism/indexer/config" _ "github.com/ethereum-optimism/optimism/indexer/database/serializers" + "github.com/ethereum-optimism/optimism/op-service/retry" + "github.com/pkg/errors" "gorm.io/driver/postgres" "gorm.io/gorm" @@ -31,35 +34,42 @@ type DB struct { } func NewDB(dbConfig config.DBConfig) (*DB, error) { - dsn := fmt.Sprintf("host=%s port=%d dbname=%s sslmode=disable", dbConfig.Host, dbConfig.Port, dbConfig.Name) - if dbConfig.User != "" { - dsn += fmt.Sprintf(" user=%s", dbConfig.User) - } - if dbConfig.Password != "" { - dsn += fmt.Sprintf(" password=%s", dbConfig.Password) - } - gorm, err := gorm.Open(postgres.Open(dsn), &gorm.Config{ - // The indexer will explicitly manage the transactions - SkipDefaultTransaction: true, + var db *DB + + retryStrategy := &retry.ExponentialStrategy{Min: 1000, Max: 20_000, MaxJitter: 250} + + _, err := retry.Do[interface{}](context.Background(), 10, retryStrategy, func() (interface{}, error) { + dsn := fmt.Sprintf("host=%s port=%d dbname=%s sslmode=disable", dbConfig.Host, dbConfig.Port, dbConfig.Name) + if dbConfig.User != "" { + dsn += fmt.Sprintf(" user=%s", dbConfig.User) + } + if dbConfig.Password != "" { + dsn += fmt.Sprintf(" password=%s", dbConfig.Password) + } + gorm, err := gorm.Open(postgres.Open(dsn), &gorm.Config{ + // The indexer will explicitly manage the transactions + SkipDefaultTransaction: true, + Logger: logger.Default.LogMode(logger.Silent), + }) - // We may choose to create an adapter such that the - // logger emits to the geth logger when on DEBUG mode - Logger: logger.Default.LogMode(logger.Silent), + if err != nil { + return nil, errors.Wrap(err, "failed to connect to database") + } + + db = &DB{ + gorm: gorm, + Blocks: newBlocksDB(gorm), + ContractEvents: newContractEventsDB(gorm), + BridgeTransfers: newBridgeTransfersDB(gorm), + BridgeMessages: newBridgeMessagesDB(gorm), + BridgeTransactions: newBridgeTransactionsDB(gorm), + } + return nil, nil }) if err != nil { - return nil, err - } - - db := &DB{ - gorm: gorm, - Blocks: newBlocksDB(gorm), - ContractEvents: newContractEventsDB(gorm), - BridgeTransfers: newBridgeTransfersDB(gorm), - BridgeMessages: newBridgeMessagesDB(gorm), - BridgeTransactions: newBridgeTransactionsDB(gorm), + return nil, errors.Wrap(err, "failed to connect to database after multiple retries") } - return db, nil } From a51c60a3703855837cee1c1ebfde73147c3606c5 Mon Sep 17 00:00:00 2001 From: Will Cory Date: Tue, 19 Sep 2023 09:25:38 -0700 Subject: [PATCH 58/87] cleaner --- indexer/database/db.go | 35 ++++++++++++++++++----------------- 1 file changed, 18 insertions(+), 17 deletions(-) diff --git a/indexer/database/db.go b/indexer/database/db.go index 0a788ea1a460..6d0d98ad3636 100644 --- a/indexer/database/db.go +++ b/indexer/database/db.go @@ -34,29 +34,30 @@ type DB struct { } func NewDB(dbConfig config.DBConfig) (*DB, error) { - var db *DB - retryStrategy := &retry.ExponentialStrategy{Min: 1000, Max: 20_000, MaxJitter: 250} - _, err := retry.Do[interface{}](context.Background(), 10, retryStrategy, func() (interface{}, error) { - dsn := fmt.Sprintf("host=%s port=%d dbname=%s sslmode=disable", dbConfig.Host, dbConfig.Port, dbConfig.Name) - if dbConfig.User != "" { - dsn += fmt.Sprintf(" user=%s", dbConfig.User) - } - if dbConfig.Password != "" { - dsn += fmt.Sprintf(" password=%s", dbConfig.Password) - } - gorm, err := gorm.Open(postgres.Open(dsn), &gorm.Config{ - // The indexer will explicitly manage the transactions - SkipDefaultTransaction: true, - Logger: logger.Default.LogMode(logger.Silent), - }) + dsn := fmt.Sprintf("host=%s port=%d dbname=%s sslmode=disable", dbConfig.Host, dbConfig.Port, dbConfig.Name) + if dbConfig.User != "" { + dsn += fmt.Sprintf(" user=%s", dbConfig.User) + } + if dbConfig.Password != "" { + dsn += fmt.Sprintf(" password=%s", dbConfig.Password) + } + + gormConfig := gorm.Config{ + // The indexer will explicitly manage the transactions + SkipDefaultTransaction: true, + Logger: logger.Default.LogMode(logger.Silent), + } + + db, err := retry.Do[*DB](context.Background(), 10, retryStrategy, func() (*DB, error) { + gorm, err := gorm.Open(postgres.Open(dsn), &gormConfig) if err != nil { return nil, errors.Wrap(err, "failed to connect to database") } - db = &DB{ + db := &DB{ gorm: gorm, Blocks: newBlocksDB(gorm), ContractEvents: newContractEventsDB(gorm), @@ -64,7 +65,7 @@ func NewDB(dbConfig config.DBConfig) (*DB, error) { BridgeMessages: newBridgeMessagesDB(gorm), BridgeTransactions: newBridgeTransactionsDB(gorm), } - return nil, nil + return db, nil }) if err != nil { From df4a2d62721667b74132c30885df96355b3bc397 Mon Sep 17 00:00:00 2001 From: Will Cory Date: Tue, 19 Sep 2023 09:28:20 -0700 Subject: [PATCH 59/87] cleaner again --- indexer/database/db.go | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/indexer/database/db.go b/indexer/database/db.go index 6d0d98ad3636..64218470180d 100644 --- a/indexer/database/db.go +++ b/indexer/database/db.go @@ -50,27 +50,28 @@ func NewDB(dbConfig config.DBConfig) (*DB, error) { Logger: logger.Default.LogMode(logger.Silent), } - db, err := retry.Do[*DB](context.Background(), 10, retryStrategy, func() (*DB, error) { + gorm, err := retry.Do[*gorm.DB](context.Background(), 10, retryStrategy, func() (*gorm.DB, error) { gorm, err := gorm.Open(postgres.Open(dsn), &gormConfig) if err != nil { return nil, errors.Wrap(err, "failed to connect to database") } - - db := &DB{ - gorm: gorm, - Blocks: newBlocksDB(gorm), - ContractEvents: newContractEventsDB(gorm), - BridgeTransfers: newBridgeTransfersDB(gorm), - BridgeMessages: newBridgeMessagesDB(gorm), - BridgeTransactions: newBridgeTransactionsDB(gorm), - } - return db, nil + return gorm, nil }) if err != nil { return nil, errors.Wrap(err, "failed to connect to database after multiple retries") } + + db := &DB{ + gorm: gorm, + Blocks: newBlocksDB(gorm), + ContractEvents: newContractEventsDB(gorm), + BridgeTransfers: newBridgeTransfersDB(gorm), + BridgeMessages: newBridgeMessagesDB(gorm), + BridgeTransactions: newBridgeTransactionsDB(gorm), + } + return db, nil } From 7fefff6e039d73bd395080ec8aa4dc426c7d14c7 Mon Sep 17 00:00:00 2001 From: Inphi Date: Tue, 19 Sep 2023 16:03:03 -0400 Subject: [PATCH 60/87] op-challenger: Updated for the revised resolution (#7155) * op-challenger: Update to the reworked fdg resolution * uint64 resolve claim index * Update op-e2e/e2eutils/disputegame/game_helper.go Co-authored-by: refcell.eth * Update op-e2e/e2eutils/disputegame/game_helper.go Co-authored-by: refcell.eth * Retry claims resolution until done * short-circuit tryResolveClaims for empty games * bad switch case ordering --------- Co-authored-by: refcell.eth --- op-challenger/game/fault/agent.go | 61 ++++ op-challenger/game/fault/agent_test.go | 23 +- .../game/fault/responder/responder.go | 28 ++ .../game/fault/responder/responder_test.go | 34 +++ .../game/fault/solver/game_solver.go | 12 +- .../game/fault/solver/game_solver_test.go | 20 +- op-challenger/game/fault/solver/rules.go | 11 +- op-challenger/game/fault/solver/solver.go | 69 ++++- .../game/fault/solver/solver_test.go | 271 ++++++++---------- .../game/fault/test/claim_builder.go | 3 +- op-challenger/game/fault/types/game.go | 79 +++-- op-challenger/game/fault/types/game_test.go | 60 ++-- op-e2e/e2eutils/challenger/helper.go | 8 +- .../e2eutils/disputegame/alphabet_helper.go | 10 + op-e2e/e2eutils/disputegame/game_helper.go | 202 ++++++++++++- op-e2e/faultproof_test.go | 134 +++++++-- 16 files changed, 742 insertions(+), 283 deletions(-) diff --git a/op-challenger/game/fault/agent.go b/op-challenger/game/fault/agent.go index 4e48c40ee042..0a8212c95ca5 100644 --- a/op-challenger/game/fault/agent.go +++ b/op-challenger/game/fault/agent.go @@ -4,6 +4,7 @@ import ( "context" "errors" "fmt" + "sync" "github.com/ethereum-optimism/optimism/op-challenger/game/fault/solver" "github.com/ethereum-optimism/optimism/op-challenger/game/fault/types" @@ -18,6 +19,8 @@ import ( type Responder interface { CallResolve(ctx context.Context) (gameTypes.GameStatus, error) Resolve(ctx context.Context) error + CallResolveClaim(ctx context.Context, claimIdx uint64) error + ResolveClaim(ctx context.Context, claimIdx uint64) error PerformAction(ctx context.Context, action types.Action) error } @@ -112,6 +115,10 @@ func (a *Agent) shouldResolve(status gameTypes.GameStatus) bool { // tryResolve resolves the game if it is in a winning state // Returns true if the game is resolvable (regardless of whether it was actually resolved) func (a *Agent) tryResolve(ctx context.Context) bool { + if err := a.resolveClaims(ctx); err != nil { + a.log.Error("Failed to resolve claims", "err", err) + return false + } status, err := a.responder.CallResolve(ctx) if err != nil || status == gameTypes.GameStatusInProgress { return false @@ -126,6 +133,60 @@ func (a *Agent) tryResolve(ctx context.Context) bool { return true } +var errNoResolvableClaims = errors.New("no resolvable claims") + +func (a *Agent) tryResolveClaims(ctx context.Context) error { + claims, err := a.loader.FetchClaims(ctx) + if err != nil { + return fmt.Errorf("failed to fetch claims: %w", err) + } + if len(claims) == 0 { + return errNoResolvableClaims + } + + var resolvableClaims []int64 + for _, claim := range claims { + a.log.Debug("checking if claim is resolvable", "claimIdx", claim.ContractIndex) + if err := a.responder.CallResolveClaim(ctx, uint64(claim.ContractIndex)); err == nil { + a.log.Info("Resolving claim", "claimIdx", claim.ContractIndex) + resolvableClaims = append(resolvableClaims, int64(claim.ContractIndex)) + } + } + a.log.Info("Resolving claims", "numClaims", len(resolvableClaims)) + if len(resolvableClaims) == 0 { + return errNoResolvableClaims + } + + var wg sync.WaitGroup + wg.Add(len(resolvableClaims)) + for _, claimIdx := range resolvableClaims { + claimIdx := claimIdx + go func() { + defer wg.Done() + err := a.responder.ResolveClaim(ctx, uint64(claimIdx)) + if err != nil { + a.log.Error("Failed to resolve claim", "err", err) + } + }() + } + wg.Wait() + return nil +} + +func (a *Agent) resolveClaims(ctx context.Context) error { + for { + err := a.tryResolveClaims(ctx) + switch err { + case errNoResolvableClaims: + return nil + case nil: + continue + default: + return err + } + } +} + // newGameFromContracts initializes a new game state from the state in the contract func (a *Agent) newGameFromContracts(ctx context.Context) (types.Game, error) { claims, err := a.loader.FetchClaims(ctx) diff --git a/op-challenger/game/fault/agent_test.go b/op-challenger/game/fault/agent_test.go index fb812c2da71f..169b8107b382 100644 --- a/op-challenger/game/fault/agent_test.go +++ b/op-challenger/game/fault/agent_test.go @@ -77,7 +77,7 @@ func TestDoNotMakeMovesWhenGameIsResolvable(t *testing.T) { require.NoError(t, agent.Act(ctx)) require.Equal(t, 1, responder.callResolveCount, "should check if game is resolvable") - require.Zero(t, claimLoader.callCount, "should not fetch claims for resolvable game") + require.Equal(t, 1, claimLoader.callCount, "should fetch claims once for resolveClaim") if test.shouldResolve { require.EqualValues(t, 1, responder.resolveCount, "should resolve winning game") @@ -92,6 +92,7 @@ func TestLoadClaimsWhenGameNotResolvable(t *testing.T) { // Checks that if the game isn't resolvable, that the agent continues on to start checking claims agent, claimLoader, responder := setupTestAgent(t, false) responder.callResolveErr = errors.New("game is not resolvable") + responder.callResolveClaimErr = errors.New("claim is not resolvable") depth := 4 claimBuilder := test.NewClaimBuilder(t, depth, alphabet.NewTraceProvider("abcdefg", uint64(depth))) @@ -101,7 +102,9 @@ func TestLoadClaimsWhenGameNotResolvable(t *testing.T) { require.NoError(t, agent.Act(context.Background())) - require.EqualValues(t, 1, claimLoader.callCount, "should load claims for unresolvable game") + require.EqualValues(t, 2, claimLoader.callCount, "should load claims for unresolvable game") + require.EqualValues(t, responder.callResolveClaimCount, 1, "should check if claim is resolvable") + require.Zero(t, responder.resolveClaimCount, "should not send resolveClaim") } func setupTestAgent(t *testing.T, agreeWithProposedOutput bool) (*Agent, *stubClaimLoader, *stubResponder) { @@ -132,6 +135,10 @@ type stubResponder struct { resolveCount int resolveErr error + + callResolveClaimCount int + callResolveClaimErr error + resolveClaimCount int } func (s *stubResponder) CallResolve(ctx context.Context) (gameTypes.GameStatus, error) { @@ -144,8 +151,18 @@ func (s *stubResponder) Resolve(ctx context.Context) error { return s.resolveErr } +func (s *stubResponder) CallResolveClaim(ctx context.Context, clainIdx uint64) error { + s.callResolveClaimCount++ + return s.callResolveClaimErr +} + +func (s *stubResponder) ResolveClaim(ctx context.Context, clainIdx uint64) error { + s.resolveClaimCount++ + return nil +} + func (s *stubResponder) PerformAction(ctx context.Context, response types.Action) error { - panic("Not implemented") + return nil } type stubUpdater struct { diff --git a/op-challenger/game/fault/responder/responder.go b/op-challenger/game/fault/responder/responder.go index c0160afe5021..6c261b508d6d 100644 --- a/op-challenger/game/fault/responder/responder.go +++ b/op-challenger/game/fault/responder/responder.go @@ -94,6 +94,34 @@ func (r *FaultResponder) Resolve(ctx context.Context) error { return r.sendTxAndWait(ctx, txData) } +// buildResolveClaimData creates the transaction data for the ResolveClaim function. +func (r *FaultResponder) buildResolveClaimData(ctx context.Context, claimIdx uint64) ([]byte, error) { + return r.fdgAbi.Pack("resolveClaim", big.NewInt(int64(claimIdx))) +} + +// CallResolveClaim determines if the resolveClaim function on the fault dispute game contract +// would succeed. +func (r *FaultResponder) CallResolveClaim(ctx context.Context, claimIdx uint64) error { + txData, err := r.buildResolveClaimData(ctx, claimIdx) + if err != nil { + return err + } + _, err = r.txMgr.Call(ctx, ethereum.CallMsg{ + To: &r.fdgAddr, + Data: txData, + }, nil) + return err +} + +// ResolveClaim executes a resolveClaim transaction to resolve a fault dispute game. +func (r *FaultResponder) ResolveClaim(ctx context.Context, claimIdx uint64) error { + txData, err := r.buildResolveClaimData(ctx, claimIdx) + if err != nil { + return err + } + return r.sendTxAndWait(ctx, txData) +} + func (r *FaultResponder) PerformAction(ctx context.Context, action types.Action) error { var txData []byte var err error diff --git a/op-challenger/game/fault/responder/responder_test.go b/op-challenger/game/fault/responder/responder_test.go index 15ff1688b16a..0d8519690a13 100644 --- a/op-challenger/game/fault/responder/responder_test.go +++ b/op-challenger/game/fault/responder/responder_test.go @@ -73,6 +73,40 @@ func TestResolve(t *testing.T) { }) } +func TestCallResolveClaim(t *testing.T) { + t.Run("SendFails", func(t *testing.T) { + responder, mockTxMgr := newTestFaultResponder(t) + mockTxMgr.callFails = true + err := responder.CallResolveClaim(context.Background(), 0) + require.ErrorIs(t, err, mockCallError) + require.Equal(t, 0, mockTxMgr.calls) + }) + + t.Run("Success", func(t *testing.T) { + responder, mockTxMgr := newTestFaultResponder(t) + err := responder.CallResolveClaim(context.Background(), 0) + require.NoError(t, err) + require.Equal(t, 1, mockTxMgr.calls) + }) +} + +func TestResolveClaim(t *testing.T) { + t.Run("SendFails", func(t *testing.T) { + responder, mockTxMgr := newTestFaultResponder(t) + mockTxMgr.sendFails = true + err := responder.ResolveClaim(context.Background(), 0) + require.ErrorIs(t, err, mockSendError) + require.Equal(t, 0, mockTxMgr.sends) + }) + + t.Run("Success", func(t *testing.T) { + responder, mockTxMgr := newTestFaultResponder(t) + err := responder.ResolveClaim(context.Background(), 0) + require.NoError(t, err) + require.Equal(t, 1, mockTxMgr.sends) + }) +} + // TestRespond tests the [Responder.Respond] method. func TestPerformAction(t *testing.T) { t.Run("send fails", func(t *testing.T) { diff --git a/op-challenger/game/fault/solver/game_solver.go b/op-challenger/game/fault/solver/game_solver.go index df500108abc9..adf9f0a846ed 100644 --- a/op-challenger/game/fault/solver/game_solver.go +++ b/op-challenger/game/fault/solver/game_solver.go @@ -48,7 +48,10 @@ func (s *GameSolver) calculateStep(ctx context.Context, game types.Game, claim t if game.AgreeWithClaimLevel(claim) { return nil, nil } - step, err := s.claimSolver.AttemptStep(ctx, claim, game.AgreeWithClaimLevel(claim)) + step, err := s.claimSolver.AttemptStep(ctx, game, claim) + if err == ErrStepIgnoreInvalidPath { + return nil, nil + } if err != nil { return nil, err } @@ -63,11 +66,14 @@ func (s *GameSolver) calculateStep(ctx context.Context, game types.Game, claim t } func (s *GameSolver) calculateMove(ctx context.Context, game types.Game, claim types.Claim) (*types.Action, error) { - move, err := s.claimSolver.NextMove(ctx, claim, game.AgreeWithClaimLevel(claim)) + if game.AgreeWithClaimLevel(claim) { + return nil, nil + } + move, err := s.claimSolver.NextMove(ctx, claim, game) if err != nil { return nil, fmt.Errorf("failed to calculate next move for claim index %v: %w", claim.ContractIndex, err) } - if move == nil || game.IsDuplicate(move.ClaimData) { + if move == nil || game.IsDuplicate(*move) { return nil, nil } return &types.Action{ diff --git a/op-challenger/game/fault/solver/game_solver_test.go b/op-challenger/game/fault/solver/game_solver_test.go index 810d2c149c50..d0eafdf1b0f0 100644 --- a/op-challenger/game/fault/solver/game_solver_test.go +++ b/op-challenger/game/fault/solver/game_solver_test.go @@ -48,7 +48,6 @@ func TestCalculateNextActions(t *testing.T) { rootClaimCorrect: true, setupGame: func(builder *faulttest.GameBuilder) {}, }, - { name: "DoNotPerformDuplicateMoves", agreeWithOutputRoot: true, @@ -93,16 +92,15 @@ func TestCalculateNextActions(t *testing.T) { maliciousStateHash := common.Hash{0x01, 0xaa} // Dishonest actor counters their own claims to set up a situation with an invalid prestate - // The honest actor should attack all claims that support the root claim (disagree with the output root) - builder.Seq().ExpectAttack(). // This expected action is the winning move. - Attack(maliciousStateHash). - Defend(maliciousStateHash).ExpectAttack(). - Attack(maliciousStateHash). - Attack(maliciousStateHash).ExpectStepAttack() - - // The attempt to step against our malicious leaf node will fail because the pre-state won't match our - // malicious state hash. However, it is the very first expected action, attacking the root claim with - // the correct hash that wins the game since it will be the left-most uncountered claim. + // The honest actor should ignore path created by the dishonest actor, only supporting its own attack on the root claim + honestMove := builder.Seq().AttackCorrect() // This expected action is the winning move. + dishonestMove := honestMove.Attack(maliciousStateHash) + // The expected action by the honest actor + dishonestMove.ExpectAttack() + // The honest actor will ignore this poisoned path + dishonestMove. + Defend(maliciousStateHash). + Attack(maliciousStateHash) }, }, } diff --git a/op-challenger/game/fault/solver/rules.go b/op-challenger/game/fault/solver/rules.go index 150321699440..627d7d50f3de 100644 --- a/op-challenger/game/fault/solver/rules.go +++ b/op-challenger/game/fault/solver/rules.go @@ -13,7 +13,6 @@ var rules = []actionRule{ parentMustExist, onlyStepAtMaxDepth, onlyMoveBeforeMaxDepth, - onlyCounterClaimsAtDisagreeingLevels, doNotDuplicateExistingMoves, doNotDefendRootClaim, } @@ -57,20 +56,12 @@ func onlyMoveBeforeMaxDepth(game types.Game, action types.Action) error { return nil } -func onlyCounterClaimsAtDisagreeingLevels(game types.Game, action types.Action) error { - parentClaim := game.Claims()[action.ParentIdx] - if game.AgreeWithClaimLevel(parentClaim) { - return fmt.Errorf("countering a claim at depth %v that supports our view of the root", parentClaim.Position.Depth()) - } - return nil -} - func doNotDuplicateExistingMoves(game types.Game, action types.Action) error { newClaimData := types.ClaimData{ Value: action.Value, Position: resultingPosition(game, action), } - if game.IsDuplicate(newClaimData) { + if game.IsDuplicate(types.Claim{ClaimData: newClaimData, ParentContractIndex: action.ParentIdx}) { return fmt.Errorf("creating duplicate claim at %v with value %v", newClaimData.Position.ToGIndex(), newClaimData.Value) } return nil diff --git a/op-challenger/game/fault/solver/solver.go b/op-challenger/game/fault/solver/solver.go index e7f6554589b8..0c5994ee117d 100644 --- a/op-challenger/game/fault/solver/solver.go +++ b/op-challenger/game/fault/solver/solver.go @@ -11,8 +11,9 @@ import ( ) var ( - ErrStepNonLeafNode = errors.New("cannot step on non-leaf claims") - ErrStepAgreedClaim = errors.New("cannot step on claims we agree with") + ErrStepNonLeafNode = errors.New("cannot step on non-leaf claims") + ErrStepAgreedClaim = errors.New("cannot step on claims we agree with") + ErrStepIgnoreInvalidPath = errors.New("cannot step on claims that dispute invalid paths") ) // claimSolver uses a [TraceProvider] to determine the moves to make in a dispute game. @@ -30,10 +31,7 @@ func newClaimSolver(gameDepth int, traceProvider types.TraceProvider) *claimSolv } // NextMove returns the next move to make given the current state of the game. -func (s *claimSolver) NextMove(ctx context.Context, claim types.Claim, agreeWithClaimLevel bool) (*types.Claim, error) { - if agreeWithClaimLevel { - return nil, nil - } +func (s *claimSolver) NextMove(ctx context.Context, claim types.Claim, game types.Game) (*types.Claim, error) { if claim.Depth() == s.gameDepth { return nil, types.ErrGameDepthReached } @@ -41,6 +39,24 @@ func (s *claimSolver) NextMove(ctx context.Context, claim types.Claim, agreeWith if err != nil { return nil, err } + + // Before challenging this claim, first check that the move wasn't warranted. + // If the parent claim is on a dishonest path, then we would have moved against it anyways. So we don't move. + // Avoiding dishonest paths ensures that there's always a valid claim available to support ours during step. + if !claim.IsRoot() { + parent, err := game.GetParent(claim) + if err != nil { + return nil, err + } + agreeWithParent, err := s.agreeWithClaimPath(ctx, game, parent) + if err != nil { + return nil, err + } + if !agreeWithParent { + return nil, nil + } + } + if agree { return s.defend(ctx, claim) } else { @@ -58,13 +74,25 @@ type StepData struct { // AttemptStep determines what step should occur for a given leaf claim. // An error will be returned if the claim is not at the max depth. -func (s *claimSolver) AttemptStep(ctx context.Context, claim types.Claim, agreeWithClaimLevel bool) (StepData, error) { +// Returns ErrStepIgnoreInvalidPath if the claim disputes an invalid path +func (s *claimSolver) AttemptStep(ctx context.Context, game types.Game, claim types.Claim) (StepData, error) { if claim.Depth() != s.gameDepth { return StepData{}, ErrStepNonLeafNode } - if agreeWithClaimLevel { - return StepData{}, ErrStepAgreedClaim + + // Step only on claims that dispute a valid path + parent, err := game.GetParent(claim) + if err != nil { + return StepData{}, err } + parentValid, err := s.agreeWithClaimPath(ctx, game, parent) + if err != nil { + return StepData{}, err + } + if !parentValid { + return StepData{}, ErrStepIgnoreInvalidPath + } + claimCorrect, err := s.agreeWithClaim(ctx, claim.ClaimData) if err != nil { return StepData{}, err @@ -142,3 +170,26 @@ func (s *claimSolver) traceAtPosition(ctx context.Context, p types.Position) (co hash, err := s.trace.Get(ctx, index) return hash, err } + +// agreeWithClaimPath returns true if the every other claim in the path to root is correct according to the internal [TraceProvider]. +func (s *claimSolver) agreeWithClaimPath(ctx context.Context, game types.Game, claim types.Claim) (bool, error) { + agree, err := s.agreeWithClaim(ctx, claim.ClaimData) + if err != nil { + return false, err + } + if !agree { + return false, nil + } + if claim.IsRoot() || claim.Parent.IsRootPosition() { + return true, nil + } + parent, err := game.GetParent(claim) + if err != nil { + return false, err + } + grandParent, err := game.GetParent(parent) + if err != nil { + return false, err + } + return s.agreeWithClaimPath(ctx, game, grandParent) +} diff --git a/op-challenger/game/fault/solver/solver_test.go b/op-challenger/game/fault/solver/solver_test.go index e135429dfe03..8a7f3fd74998 100644 --- a/op-challenger/game/fault/solver/solver_test.go +++ b/op-challenger/game/fault/solver/solver_test.go @@ -2,206 +2,171 @@ package solver import ( "context" - "errors" "testing" - "github.com/ethereum-optimism/optimism/op-challenger/game/fault/test" + faulttest "github.com/ethereum-optimism/optimism/op-challenger/game/fault/test" "github.com/ethereum-optimism/optimism/op-challenger/game/fault/types" + "github.com/ethereum/go-ethereum/common" "github.com/stretchr/testify/require" ) -func TestNextMove(t *testing.T) { - maxDepth := 4 - builder := test.NewAlphabetClaimBuilder(t, maxDepth) - tests := []struct { - name string - claim types.Claim - agreeWithLevel bool - expectedErr error - expectedMove func(claim types.Claim, correct bool) types.Claim - }{ - { - name: "AgreeWithLevel_CorrectRoot", - claim: builder.CreateRootClaim(true), - agreeWithLevel: true, - }, - { - name: "AgreeWithLevel_IncorrectRoot", - claim: builder.CreateRootClaim(false), - agreeWithLevel: true, - }, - { - name: "AgreeWithLevel_EvenDepth", - claim: builder.Seq(false).Attack(false).Get(), - agreeWithLevel: true, - }, - { - name: "AgreeWithLevel_OddDepth", - claim: builder.Seq(false).Attack(false).Defend(false).Get(), - agreeWithLevel: true, - }, - { - name: "Root_CorrectValue", - claim: builder.CreateRootClaim(true), - }, - { - name: "Root_IncorrectValue", - claim: builder.CreateRootClaim(false), - expectedMove: builder.AttackClaim, - }, - { - name: "NonRoot_AgreeWithParentAndClaim", - claim: builder.Seq(true).Attack(true).Get(), - expectedMove: builder.DefendClaim, - }, - { - name: "NonRoot_AgreeWithParentDisagreeWithClaim", - claim: builder.Seq(true).Attack(false).Get(), - expectedMove: builder.AttackClaim, - }, - { - name: "NonRoot_DisagreeWithParentAgreeWithClaim", - claim: builder.Seq(false).Attack(true).Get(), - expectedMove: builder.DefendClaim, - }, - { - name: "NonRoot_DisagreeWithParentAndClaim", - claim: builder.Seq(false).Attack(false).Get(), - expectedMove: builder.AttackClaim, - }, - { - name: "ErrorWhenClaimIsLeaf_Correct", - claim: builder.CreateLeafClaim(4, true), - expectedErr: types.ErrGameDepthReached, - }, - { - name: "ErrorWhenClaimIsLeaf_Incorrect", - claim: builder.CreateLeafClaim(6, false), - expectedErr: types.ErrGameDepthReached, - }, - } - for _, test := range tests { - test := test - t.Run(test.name, func(t *testing.T) { - solver := newClaimSolver(maxDepth, builder.CorrectTraceProvider()) - move, err := solver.NextMove(context.Background(), test.claim, test.agreeWithLevel) - if test.expectedErr == nil { - require.NoError(t, err) - } else { - require.ErrorIs(t, err, test.expectedErr) - } - if test.expectedMove == nil { - require.Nil(t, move) - } else { - expected := test.expectedMove(test.claim, true) - require.Equal(t, &expected, move) - } - }) - } -} - func TestAttemptStep(t *testing.T) { maxDepth := 3 - builder := test.NewAlphabetClaimBuilder(t, maxDepth) + claimBuilder := faulttest.NewAlphabetClaimBuilder(t, maxDepth) // Last accessible leaf is the second last trace index // The root node is used for the last trace index and can only be attacked. lastLeafTraceIndex := uint64(1< 0 { item := queue[0] @@ -124,17 +134,34 @@ func (g *gameState) MaxDepth() uint64 { return g.depth } -func (g *gameState) getChildren(c ClaimData) []ClaimData { +func (g *gameState) getChildren(c claimEntry) []claimEntry { return g.claims[c].children } -func (g *gameState) getParent(claim Claim) (Claim, error) { - if claim.IsRoot() { +func (g *gameState) GetParent(claim Claim) (Claim, error) { + parent := g.getParent(claim) + if parent == nil { return Claim{}, ErrClaimNotFound } - if parent, ok := g.claims[claim.Parent]; !ok { - return Claim{}, ErrClaimNotFound - } else { - return parent.self, nil + return parent.self, nil +} + +func (g *gameState) getParent(claim Claim) *extendedClaim { + if claim.IsRoot() { + return nil + } + // TODO(inphi): refactor gameState for faster parent lookups + for _, c := range g.claims { + if c.self.ContractIndex == claim.ParentContractIndex { + return c + } + } + return nil +} + +func makeClaimEntry(claim Claim) claimEntry { + return claimEntry{ + ClaimData: claim.ClaimData, + ParentContractIndex: claim.ParentContractIndex, } } diff --git a/op-challenger/game/fault/types/game_test.go b/op-challenger/game/fault/types/game_test.go index f0e93bcd022b..d4789f9b711b 100644 --- a/op-challenger/game/fault/types/game_test.go +++ b/op-challenger/game/fault/types/game_test.go @@ -24,14 +24,18 @@ func createTestClaims() (Claim, Claim, Claim, Claim) { Value: common.HexToHash("0x0000000000000000000000000000000000000000000000000000000000000364"), Position: NewPosition(1, 0), }, - Parent: root.ClaimData, + Parent: root.ClaimData, + ContractIndex: 1, + ParentContractIndex: 0, } middle := Claim{ ClaimData: ClaimData{ Value: common.HexToHash("0x0000000000000000000000000000000000000000000000000000000000000578"), Position: NewPosition(2, 2), }, - Parent: top.ClaimData, + Parent: top.ClaimData, + ContractIndex: 2, + ParentContractIndex: 1, } bottom := Claim{ @@ -39,7 +43,9 @@ func createTestClaims() (Claim, Claim, Claim, Claim) { Value: common.HexToHash("0x0000000000000000000000000000000000000000000000000000000000000465"), Position: NewPosition(3, 4), }, - Parent: middle.ClaimData, + Parent: middle.ClaimData, + ContractIndex: 3, + ParentContractIndex: 2, } return root, top, middle, bottom @@ -52,12 +58,12 @@ func TestIsDuplicate(t *testing.T) { require.NoError(t, g.Put(top)) // Root + Top should be duplicates - require.True(t, g.IsDuplicate(root.ClaimData)) - require.True(t, g.IsDuplicate(top.ClaimData)) + require.True(t, g.IsDuplicate(root)) + require.True(t, g.IsDuplicate(top)) // Middle + Bottom should not be a duplicate - require.False(t, g.IsDuplicate(middle.ClaimData)) - require.False(t, g.IsDuplicate(bottom.ClaimData)) + require.False(t, g.IsDuplicate(middle)) + require.False(t, g.IsDuplicate(bottom)) } // TestGame_Put_RootAlreadyExists tests the [Game.Put] method using a [gameState] @@ -104,20 +110,20 @@ func TestGame_PutAll_ParentsAndChildren(t *testing.T) { g := NewGameState(false, root, testMaxDepth) // We should not be able to get the parent of the root claim. - parent, err := g.getParent(root) + parent, err := g.GetParent(root) require.ErrorIs(t, err, ErrClaimNotFound) require.Equal(t, parent, Claim{}) // Put the rest of the claims in the state. err = g.PutAll([]Claim{top, middle, bottom}) require.NoError(t, err) - parent, err = g.getParent(top) + parent, err = g.GetParent(top) require.NoError(t, err) require.Equal(t, parent, root) - parent, err = g.getParent(middle) + parent, err = g.GetParent(middle) require.NoError(t, err) require.Equal(t, parent, top) - parent, err = g.getParent(bottom) + parent, err = g.GetParent(bottom) require.NoError(t, err) require.Equal(t, parent, middle) } @@ -145,28 +151,28 @@ func TestGame_Put_ParentsAndChildren(t *testing.T) { g := NewGameState(false, root, testMaxDepth) // We should not be able to get the parent of the root claim. - parent, err := g.getParent(root) + parent, err := g.GetParent(root) require.ErrorIs(t, err, ErrClaimNotFound) require.Equal(t, parent, Claim{}) // Put + Check Top err = g.Put(top) require.NoError(t, err) - parent, err = g.getParent(top) + parent, err = g.GetParent(top) require.NoError(t, err) require.Equal(t, parent, root) // Put + Check Top Middle err = g.Put(middle) require.NoError(t, err) - parent, err = g.getParent(middle) + parent, err = g.GetParent(middle) require.NoError(t, err) require.Equal(t, parent, top) // Put + Check Top Bottom err = g.Put(bottom) require.NoError(t, err) - parent, err = g.getParent(bottom) + parent, err = g.GetParent(bottom) require.NoError(t, err) require.Equal(t, parent, middle) } @@ -194,27 +200,3 @@ func TestGame_ClaimPairs(t *testing.T) { claims := g.Claims() require.ElementsMatch(t, expected, claims) } - -func TestAgreeWithClaimLevelDisagreeWithOutput(t *testing.T) { - // Setup the game state. - root, top, middle, bottom := createTestClaims() - g := NewGameState(false, root, testMaxDepth) - require.NoError(t, g.PutAll([]Claim{top, middle, bottom})) - - require.True(t, g.AgreeWithClaimLevel(root)) - require.False(t, g.AgreeWithClaimLevel(top)) - require.True(t, g.AgreeWithClaimLevel(middle)) - require.False(t, g.AgreeWithClaimLevel(bottom)) -} - -func TestAgreeWithClaimLevelAgreeWithOutput(t *testing.T) { - // Setup the game state. - root, top, middle, bottom := createTestClaims() - g := NewGameState(true, root, testMaxDepth) - require.NoError(t, g.PutAll([]Claim{top, middle, bottom})) - - require.False(t, g.AgreeWithClaimLevel(root)) - require.True(t, g.AgreeWithClaimLevel(top)) - require.False(t, g.AgreeWithClaimLevel(middle)) - require.True(t, g.AgreeWithClaimLevel(bottom)) -} diff --git a/op-e2e/e2eutils/challenger/helper.go b/op-e2e/e2eutils/challenger/helper.go index fd90661cbaf8..8a4e9e406ca8 100644 --- a/op-e2e/e2eutils/challenger/helper.go +++ b/op-e2e/e2eutils/challenger/helper.go @@ -68,6 +68,12 @@ func WithAlphabet(alphabet string) Option { } } +func WithPollInterval(pollInterval time.Duration) Option { + return func(c *config.Config) { + c.PollInterval = pollInterval + } +} + func WithCannon( t *testing.T, rollupCfg *rollup.Config, @@ -98,7 +104,7 @@ func WithCannon( } func NewChallenger(t *testing.T, ctx context.Context, l1Endpoint string, name string, options ...Option) *Helper { - log := testlog.Logger(t, log.LvlInfo).New("role", name) + log := testlog.Logger(t, log.LvlDebug).New("role", name) log.Info("Creating challenger", "l1", l1Endpoint) cfg := NewChallengerConfig(t, l1Endpoint, options...) diff --git a/op-e2e/e2eutils/disputegame/alphabet_helper.go b/op-e2e/e2eutils/disputegame/alphabet_helper.go index 73b4162c81b3..bbf550210899 100644 --- a/op-e2e/e2eutils/disputegame/alphabet_helper.go +++ b/op-e2e/e2eutils/disputegame/alphabet_helper.go @@ -4,6 +4,7 @@ import ( "context" "github.com/ethereum-optimism/optimism/op-challenger/config" + "github.com/ethereum-optimism/optimism/op-challenger/game/fault/trace/alphabet" "github.com/ethereum-optimism/optimism/op-e2e/e2eutils/challenger" "github.com/ethereum/go-ethereum/common" @@ -33,3 +34,12 @@ func (g *AlphabetGameHelper) StartChallenger(ctx context.Context, l1Endpoint str }) return c } + +func (g *AlphabetGameHelper) CreateHonestActor(ctx context.Context, alphabetTrace string, depth uint64) *HonestHelper { + return &HonestHelper{ + t: g.t, + require: g.require, + game: &g.FaultGameHelper, + correctTrace: alphabet.NewTraceProvider(alphabetTrace, depth), + } +} diff --git a/op-e2e/e2eutils/disputegame/game_helper.go b/op-e2e/e2eutils/disputegame/game_helper.go index 868772b1c0b0..c81f4f295d3a 100644 --- a/op-e2e/e2eutils/disputegame/game_helper.go +++ b/op-e2e/e2eutils/disputegame/game_helper.go @@ -2,16 +2,19 @@ package disputegame import ( "context" + "errors" "fmt" "math/big" "testing" "time" "github.com/ethereum-optimism/optimism/op-bindings/bindings" + "github.com/ethereum-optimism/optimism/op-challenger/game/fault" "github.com/ethereum-optimism/optimism/op-challenger/game/fault/types" "github.com/ethereum-optimism/optimism/op-e2e/e2eutils/wait" "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" + gethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/ethclient" "github.com/stretchr/testify/require" ) @@ -130,6 +133,10 @@ func (g *FaultGameHelper) getClaim(ctx context.Context, claimIdx int64) Contract return claimData } +func (g *FaultGameHelper) GetClaimUnsafe(ctx context.Context, claimIdx int64) ContractClaim { + return g.getClaim(ctx, claimIdx) +} + func (g *FaultGameHelper) WaitForClaimAtDepth(ctx context.Context, depth int) { g.waitForClaim( ctx, @@ -169,6 +176,12 @@ func (g *FaultGameHelper) Resolve(ctx context.Context) { g.require.NoError(err) } +func (g *FaultGameHelper) Status(ctx context.Context) Status { + status, err := g.game.Status(&bind.CallOpts{Context: ctx}) + g.require.NoError(err) + return Status(status) +} + func (g *FaultGameHelper) WaitForGameStatus(ctx context.Context, expected Status) { g.t.Logf("Waiting for game %v to have status %v", g.addr, expected) timedCtx, cancel := context.WithTimeout(ctx, time.Minute) @@ -186,6 +199,46 @@ func (g *FaultGameHelper) WaitForGameStatus(ctx context.Context, expected Status g.require.NoErrorf(err, "wait for game status. Game state: \n%v", g.gameData(ctx)) } +func (g *FaultGameHelper) WaitForInactivity(ctx context.Context, numInactiveBlocks int, untilGameEnds bool) { + g.t.Logf("Waiting for game %v to have no activity for %v blocks", g.addr, numInactiveBlocks) + headCh := make(chan *gethtypes.Header, 100) + headSub, err := g.client.SubscribeNewHead(ctx, headCh) + g.require.NoError(err) + defer headSub.Unsubscribe() + + var lastActiveBlock uint64 + for { + if untilGameEnds && g.Status(ctx) != StatusInProgress { + break + } + select { + case head := <-headCh: + if lastActiveBlock == 0 { + lastActiveBlock = head.Number.Uint64() + continue + } else if lastActiveBlock+uint64(numInactiveBlocks) < head.Number.Uint64() { + return + } + block, err := g.client.BlockByNumber(ctx, head.Number) + g.require.NoError(err) + numActions := 0 + for _, tx := range block.Transactions() { + if tx.To().Hex() == g.addr.Hex() { + numActions++ + } + } + if numActions != 0 { + g.t.Logf("Game %v has %v actions in block %d. Resetting inactivity timeout", g.addr, numActions, block.NumberU64()) + lastActiveBlock = head.Number.Uint64() + } + case err := <-headSub.Err(): + g.require.NoError(err) + case <-ctx.Done(): + g.require.Fail("Context canceled", ctx.Err()) + } + } +} + // Mover is a function that either attacks or defends the claim at parentClaimIdx type Mover func(parentClaimIdx int64) @@ -239,6 +292,21 @@ func (g *FaultGameHelper) ChallengeRootClaim(ctx context.Context, performMove Mo attemptStep(maxDepth) } +func (g *FaultGameHelper) WaitForNewClaim(ctx context.Context, checkPoint int64) (int64, error) { + timedCtx, cancel := context.WithTimeout(ctx, 2*time.Minute) + defer cancel() + var newClaimLen int64 + err := wait.For(timedCtx, time.Second, func() (bool, error) { + actual, err := g.game.ClaimDataLen(&bind.CallOpts{Context: ctx}) + if err != nil { + return false, err + } + newClaimLen = actual.Int64() + return actual.Cmp(big.NewInt(checkPoint)) > 0, nil + }) + return newClaimLen, err +} + func (g *FaultGameHelper) Attack(ctx context.Context, claimIdx int64, claim common.Hash) { tx, err := g.game.Attack(g.opts, big.NewInt(claimIdx), claim) g.require.NoError(err, "Attack transaction did not send") @@ -266,6 +334,33 @@ func (g *FaultGameHelper) StepFails(claimIdx int64, isAttack bool, stateData []b g.require.Equal("0xfb4e40dd", errData.ErrorData(), "Revert reason should be abi encoded ValidStep()") } +// ResolveClaim resolves a single subgame +func (g *FaultGameHelper) ResolveClaim(ctx context.Context, claimIdx int64) { + tx, err := g.game.ResolveClaim(g.opts, big.NewInt(claimIdx)) + g.require.NoError(err, "ResolveClaim transaction did not send") + _, err = wait.ForReceiptOK(ctx, g.client, tx.Hash()) + g.require.NoError(err, "ResolveClaim transaction was not OK") +} + +// ResolveAllClaims resolves all subgames +// This function does not resolve the game. That's the responsibility of challengers +func (g *FaultGameHelper) ResolveAllClaims(ctx context.Context) { + loader := fault.NewLoader(g.game) + claims, err := loader.FetchClaims(ctx) + g.require.NoError(err, "Failed to fetch claims") + subgames := make(map[int]bool) + for i := len(claims) - 1; i > 0; i-- { + subgames[claims[i].ParentContractIndex] = true + // Subgames containing only one node are implicitly resolved + // i.e. uncountered and claims at MAX_DEPTH + if !subgames[i] { + continue + } + g.ResolveClaim(ctx, int64(i)) + } + g.ResolveClaim(ctx, 0) +} + func (g *FaultGameHelper) gameData(ctx context.Context) string { opts := &bind.CallOpts{Context: ctx} maxDepth := int(g.MaxDepth(ctx)) @@ -277,8 +372,8 @@ func (g *FaultGameHelper) gameData(ctx context.Context) string { g.require.NoErrorf(err, "Fetch claim %v", i) pos := types.NewPositionFromGIndex(claim.Position.Uint64()) - info = info + fmt.Sprintf("%v - Position: %v, Depth: %v, IndexAtDepth: %v Trace Index: %v, Value: %v, Countered: %v\n", - i, claim.Position.Int64(), pos.Depth(), pos.IndexAtDepth(), pos.TraceIndex(maxDepth), common.Hash(claim.Claim).Hex(), claim.Countered) + info = info + fmt.Sprintf("%v - Position: %v, Depth: %v, IndexAtDepth: %v Trace Index: %v, Value: %v, Countered: %v, ParentIndex: %v\n", + i, claim.Position.Int64(), pos.Depth(), pos.IndexAtDepth(), pos.TraceIndex(maxDepth), common.Hash(claim.Claim).Hex(), claim.Countered, claim.ParentIndex) } status, err := g.game.Status(opts) g.require.NoError(err, "Load game status") @@ -288,3 +383,106 @@ func (g *FaultGameHelper) gameData(ctx context.Context) string { func (g *FaultGameHelper) LogGameData(ctx context.Context) { g.t.Log(g.gameData(ctx)) } + +type dishonestClaim struct { + ParentIndex int64 + IsAttack bool + Valid bool +} +type DishonestHelper struct { + *FaultGameHelper + *HonestHelper + claims map[dishonestClaim]bool + defender bool +} + +func NewDishonestHelper(g *FaultGameHelper, correctTrace *HonestHelper, defender bool) *DishonestHelper { + return &DishonestHelper{g, correctTrace, make(map[dishonestClaim]bool), defender} +} + +func (t *DishonestHelper) Attack(ctx context.Context, claimIndex int64) { + c := dishonestClaim{claimIndex, true, false} + if t.claims[c] { + return + } + t.claims[c] = true + t.FaultGameHelper.Attack(ctx, claimIndex, common.Hash{byte(claimIndex)}) +} + +func (t *DishonestHelper) Defend(ctx context.Context, claimIndex int64) { + c := dishonestClaim{claimIndex, false, false} + if t.claims[c] { + return + } + t.claims[c] = true + t.FaultGameHelper.Defend(ctx, claimIndex, common.Hash{byte(claimIndex)}) +} + +func (t *DishonestHelper) AttackCorrect(ctx context.Context, claimIndex int64) { + c := dishonestClaim{claimIndex, true, true} + if t.claims[c] { + return + } + t.claims[c] = true + t.HonestHelper.Attack(ctx, claimIndex) +} + +func (t *DishonestHelper) DefendCorrect(ctx context.Context, claimIndex int64) { + c := dishonestClaim{claimIndex, false, true} + if t.claims[c] { + return + } + t.claims[c] = true + t.HonestHelper.Defend(ctx, claimIndex) +} + +// ExhaustDishonestClaims makes all possible significant moves (mod honest challenger's) in a game. +// It is very inefficient and should NOT be used on games with large depths +func (d *DishonestHelper) ExhaustDishonestClaims(ctx context.Context) { + depth := d.MaxDepth(ctx) + + move := func(claimIndex int64, claimData ContractClaim) { + // dishonest level, valid attack + // dishonest level, invalid attack + // dishonest level, valid defense + // dishonest level, invalid defense + // honest level, invalid attack + // honest level, invalid defense + + pos := types.NewPositionFromGIndex(claimData.Position.Uint64()) + if int64(pos.Depth()) == depth { + return + } + + d.LogGameData(ctx) + d.FaultGameHelper.t.Logf("Dishonest moves against claimIndex %d", claimIndex) + agreeWithLevel := d.defender == (pos.Depth()%2 == 0) + if !agreeWithLevel { + d.AttackCorrect(ctx, claimIndex) + if claimIndex != 0 { + d.DefendCorrect(ctx, claimIndex) + } + } + d.Attack(ctx, claimIndex) + if claimIndex != 0 { + d.Defend(ctx, claimIndex) + } + } + + var numClaimsSeen int64 + for { + newCount, err := d.WaitForNewClaim(ctx, numClaimsSeen) + if errors.Is(err, context.DeadlineExceeded) { + // we assume that the honest challenger has stopped responding + // There's nothing to respond to. + break + } + d.FaultGameHelper.require.NoError(err) + + for i := numClaimsSeen; i < newCount; i++ { + claimData := d.getClaim(ctx, numClaimsSeen) + move(numClaimsSeen, claimData) + numClaimsSeen++ + } + } +} diff --git a/op-e2e/faultproof_test.go b/op-e2e/faultproof_test.go index d3ed7b42901b..31af555e492b 100644 --- a/op-e2e/faultproof_test.go +++ b/op-e2e/faultproof_test.go @@ -3,7 +3,9 @@ package op_e2e import ( "context" "testing" + "time" + "github.com/ethereum-optimism/optimism/op-challenger/game/fault/types" "github.com/ethereum-optimism/optimism/op-e2e/e2eutils/challenger" "github.com/ethereum-optimism/optimism/op-e2e/e2eutils/disputegame" l2oo2 "github.com/ethereum-optimism/optimism/op-e2e/e2eutils/l2oo" @@ -62,8 +64,12 @@ func TestMultipleCannonGames(t *testing.T) { sys.TimeTravelClock.AdvanceTime(gameDuration) require.NoError(t, wait.ForNextBlock(ctx, l1Client)) - game1.WaitForGameStatus(ctx, disputegame.StatusChallengerWins) - game2.WaitForGameStatus(ctx, disputegame.StatusChallengerWins) + game1.WaitForInactivity(ctx, 10, true) + game2.WaitForInactivity(ctx, 10, true) + game1.LogGameData(ctx) + game2.LogGameData(ctx) + require.EqualValues(t, disputegame.StatusChallengerWins, game1.Status(ctx)) + require.EqualValues(t, disputegame.StatusChallengerWins, game2.Status(ctx)) // Check that the game directories are removed challenger.WaitForGameDataDeletion(ctx, game1, game2) @@ -168,11 +174,72 @@ func TestChallengerCompleteDisputeGame(t *testing.T) { sys.TimeTravelClock.AdvanceTime(gameDuration) require.NoError(t, wait.ForNextBlock(ctx, l1Client)) - game.WaitForGameStatus(ctx, test.expectedResult) + game.WaitForInactivity(ctx, 10, true) + game.LogGameData(ctx) + require.EqualValues(t, test.expectedResult, game.Status(ctx)) }) } } +func TestChallengerCompleteExhaustiveDisputeGame(t *testing.T) { + InitParallel(t) + + testCase := func(t *testing.T, isRootCorrect bool) { + ctx := context.Background() + sys, l1Client := startFaultDisputeSystem(t) + t.Cleanup(sys.Close) + + disputeGameFactory := disputegame.NewFactoryHelper(t, ctx, sys.cfg.L1Deployments, l1Client) + rootClaimedAlphabet := disputegame.CorrectAlphabet + if !isRootCorrect { + rootClaimedAlphabet = "abcdexyz" + } + game := disputeGameFactory.StartAlphabetGame(ctx, rootClaimedAlphabet) + require.NotNil(t, game) + gameDuration := game.GameDuration(ctx) + + // Start honest challenger + game.StartChallenger(ctx, sys.NodeEndpoint("l1"), "Challenger", + challenger.WithAgreeProposedOutput(!isRootCorrect), + challenger.WithAlphabet(disputegame.CorrectAlphabet), + challenger.WithPrivKey(sys.cfg.Secrets.Alice), + // Ensures the challenger responds to all claims before test timeout + challenger.WithPollInterval(time.Millisecond*400), + ) + + // Start dishonest challenger + correctTrace := game.CreateHonestActor(ctx, disputegame.CorrectAlphabet, 4) + dishonestHelper := disputegame.NewDishonestHelper(&game.FaultGameHelper, correctTrace, !isRootCorrect) + dishonestHelper.ExhaustDishonestClaims(ctx) + + // Wait until we've reached max depth before checking for inactivity + game.WaitForClaimAtDepth(ctx, int(game.MaxDepth(ctx))) + + // Wait for 4 blocks of no challenger responses. The challenger may still be stepping on invalid claims at max depth + game.WaitForInactivity(ctx, 4, false) + + sys.TimeTravelClock.AdvanceTime(gameDuration) + require.NoError(t, wait.ForNextBlock(ctx, l1Client)) + + expectedStatus := disputegame.StatusChallengerWins + if isRootCorrect { + expectedStatus = disputegame.StatusDefenderWins + } + game.WaitForInactivity(ctx, 10, true) + game.LogGameData(ctx) + require.EqualValues(t, expectedStatus, game.Status(ctx)) + } + + t.Run("RootCorrect", func(t *testing.T) { + InitParallel(t) + testCase(t, true) + }) + t.Run("RootIncorrect", func(t *testing.T) { + InitParallel(t) + testCase(t, false) + }) +} + func TestCannonDisputeGame(t *testing.T) { InitParallel(t) @@ -217,8 +284,9 @@ func TestCannonDisputeGame(t *testing.T) { sys.TimeTravelClock.AdvanceTime(game.GameDuration(ctx)) require.NoError(t, wait.ForNextBlock(ctx, l1Client)) - game.WaitForGameStatus(ctx, disputegame.StatusChallengerWins) + game.WaitForInactivity(ctx, 10, true) game.LogGameData(ctx) + require.EqualValues(t, disputegame.StatusChallengerWins, game.Status(ctx)) }) } } @@ -260,8 +328,9 @@ func TestCannonDefendStep(t *testing.T) { sys.TimeTravelClock.AdvanceTime(game.GameDuration(ctx)) require.NoError(t, wait.ForNextBlock(ctx, l1Client)) - game.WaitForGameStatus(ctx, disputegame.StatusChallengerWins) + game.WaitForInactivity(ctx, 10, true) game.LogGameData(ctx) + require.EqualValues(t, disputegame.StatusChallengerWins, game.Status(ctx)) } func TestCannonProposedOutputRootInvalid(t *testing.T) { @@ -335,14 +404,14 @@ func TestCannonProposedOutputRootInvalid(t *testing.T) { sys.TimeTravelClock.AdvanceTime(game.GameDuration(ctx)) require.NoError(t, wait.ForNextBlock(ctx, l1Client)) - game.WaitForGameStatus(ctx, disputegame.StatusDefenderWins) + game.WaitForInactivity(ctx, 10, true) game.LogGameData(ctx) + require.EqualValues(t, disputegame.StatusDefenderWins, game.Status(ctx)) }) } } func TestCannonPoisonedPostState(t *testing.T) { - t.Skip("Known failure case") InitParallel(t) ctx := context.Background() @@ -365,9 +434,12 @@ func TestCannonPoisonedPostState(t *testing.T) { // Honest defense at "dishonest" level correctTrace.Defend(ctx, 1) - // Dishonest attack at "honest" level - honest move would be to defend + // Dishonest attack at "honest" level - honest move would be to ignore game.Attack(ctx, 2, common.Hash{0x03, 0xaa}) + // Honest attack at "dishonest" level - honest move would be to ignore + correctTrace.Attack(ctx, 3) + // Start the honest challenger game.StartChallenger(ctx, sys.RollupConfig, sys.L2GenesisCfg, l1Endpoint, l2Endpoint, "Honest", // Agree with the proposed output, so disagree with the root claim @@ -376,29 +448,40 @@ func TestCannonPoisonedPostState(t *testing.T) { ) // Start dishonest challenger that posts correct claims - game.StartChallenger(ctx, sys.RollupConfig, sys.L2GenesisCfg, l1Endpoint, l2Endpoint, "DishonestCorrect", - // Disagree with the proposed output, so agree with the root claim - challenger.WithAgreeProposedOutput(false), - challenger.WithPrivKey(sys.cfg.Secrets.Mallory), - ) - - // Give the challengers time to progress down the full game depth - depth := game.MaxDepth(ctx) - for i := 3; i <= int(depth); i++ { - game.WaitForClaimAtDepth(ctx, i) - game.LogGameData(ctx) - } + // It participates in the subgame root the honest claim index 4 + func() { + claimCount := int64(5) + depth := game.MaxDepth(ctx) + for { + game.LogGameData(ctx) + claimCount++ + // Wait for the challenger to counter + game.WaitForClaimCount(ctx, claimCount) + + // Respond with our own move + correctTrace.Defend(ctx, claimCount-1) + claimCount++ + game.WaitForClaimCount(ctx, claimCount) + + // Defender moves last. If we're at max depth, then we're done + dishonestClaim := game.GetClaimUnsafe(ctx, claimCount-1) + pos := types.NewPositionFromGIndex(dishonestClaim.Position.Uint64()) + if int64(pos.Depth()) == depth { + break + } + } + }() - // Wait for all the leaf nodes to be countered - // Wait for the challengers to drive the game down to the leaf node which should be countered - game.WaitForAllClaimsCountered(ctx) + // Wait for the challenger to drive the subgame at 4 to the leaf node, which should be countered + game.WaitForClaimAtMaxDepth(ctx, true) // Time travel past when the game will be resolvable. sys.TimeTravelClock.AdvanceTime(game.GameDuration(ctx)) require.NoError(t, wait.ForNextBlock(ctx, l1Client)) - game.WaitForGameStatus(ctx, disputegame.StatusChallengerWins) + game.WaitForInactivity(ctx, 10, true) game.LogGameData(ctx) + require.EqualValues(t, disputegame.StatusChallengerWins, game.Status(ctx)) } // setupDisputeGameForInvalidOutputRoot sets up an L2 chain with at least one valid output root followed by an invalid output root. @@ -470,8 +553,9 @@ func TestCannonChallengeWithCorrectRoot(t *testing.T) { sys.TimeTravelClock.AdvanceTime(game.GameDuration(ctx)) require.NoError(t, wait.ForNextBlock(ctx, l1Client)) - game.WaitForGameStatus(ctx, disputegame.StatusChallengerWins) + game.WaitForInactivity(ctx, 10, true) game.LogGameData(ctx) + require.EqualValues(t, disputegame.StatusChallengerWins, game.Status(ctx)) } func startFaultDisputeSystem(t *testing.T) (*System, *ethclient.Client) { From 8d8b6703df0fbb61247bce4a34cae939198726f9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 19 Sep 2023 16:13:56 -0400 Subject: [PATCH 61/87] build(deps-dev): bump @types/node from 20.5.0 to 20.6.2 (#7302) Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 20.5.0 to 20.6.2. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node) --- updated-dependencies: - dependency-name: "@types/node" dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com> --- pnpm-lock.yaml | 76 ++++++++++++-------------------------------------- 1 file changed, 18 insertions(+), 58 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0de869751785..8cf75d310852 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -35,7 +35,7 @@ importers: version: 10.0.1 '@types/node': specifier: ^20.5.3 - version: 20.6.1 + version: 20.6.2 '@typescript-eslint/eslint-plugin': specifier: ^6.7.0 version: 6.7.0(@typescript-eslint/parser@6.7.0)(eslint@8.49.0)(typescript@5.1.6) @@ -342,7 +342,7 @@ importers: version: 5.1.6 vite: specifier: ^4.4.6 - version: 4.4.6(@types/node@20.6.1) + version: 4.4.6(@types/node@20.6.2) vitest: specifier: ^0.34.2 version: 0.34.2(jsdom@22.1.0) @@ -436,7 +436,7 @@ importers: version: 1.3.1(typescript@5.1.6) vite: specifier: ^4.4.6 - version: 4.4.6(@types/node@20.6.1) + version: 4.4.6(@types/node@20.6.2) vitest: specifier: ^0.34.2 version: 0.34.2(jsdom@22.1.0) @@ -567,7 +567,7 @@ importers: version: 1.6.0(typescript@5.1.6)(zod@3.22.0) vite: specifier: ^4.4.9 - version: 4.4.9(@types/node@20.6.1) + version: 4.4.9(@types/node@20.6.2) vitest: specifier: ^0.34.1 version: 0.34.1 @@ -3783,7 +3783,7 @@ packages: resolution: {integrity: sha512-IO+MJPVhoqz+28h1qLAcBEH2+xHMK6MTyHJc7MTnnYb6wsoLR29POVGJ7LycmVXIqyy/4/2ShP5sUwTXuOwb/w==} dependencies: '@types/minimatch': 5.1.2 - '@types/node': 20.6.1 + '@types/node': 20.6.2 dev: true /@types/is-ci@3.0.0: @@ -3852,7 +3852,7 @@ packages: /@types/morgan@1.9.4: resolution: {integrity: sha512-cXoc4k+6+YAllH3ZHmx4hf7La1dzUk6keTR4bF4b4Sc0mZxU/zK4wO7l+ZzezXm/jkYj/qC+uYGZrarZdIVvyQ==} dependencies: - '@types/node': 20.6.1 + '@types/node': 20.6.2 dev: true /@types/ms@0.7.31: @@ -3876,10 +3876,6 @@ packages: resolution: {integrity: sha512-Mgq7eCtoTjT89FqNoTzzXg2XvCi5VMhRV6+I2aYanc6kQCBImeNaAYRs/DyoVqk1YEUJK5gN9VO7HRIdz4Wo3Q==} dev: true - /@types/node@20.6.1: - resolution: {integrity: sha512-4LcJvuXQlv4lTHnxwyHQZ3uR9Zw2j7m1C9DfuwoTFQQP4Pmu04O6IfLYgMmHoOCt0nosItLLZAH+sOrRE0Bo8g==} - dev: true - /@types/node@20.6.2: resolution: {integrity: sha512-Y+/1vGBHV/cYk6OI1Na/LHzwnlNCAfU3ZNGrc1LdRe/LAIbdDPTTv/HU3M7yXN448aTVDq3eKRm2cg7iKLb8gw==} @@ -14649,7 +14645,7 @@ packages: - zod dev: true - /vite-node@0.34.1(@types/node@20.6.1): + /vite-node@0.34.1(@types/node@20.6.2): resolution: {integrity: sha512-odAZAL9xFMuAg8aWd7nSPT+hU8u2r9gU3LRm9QKjxBEF2rRdWpMuqkrkjvyVQEdNFiBctqr2Gg4uJYizm5Le6w==} engines: {node: '>=v14.18.0'} hasBin: true @@ -14659,7 +14655,7 @@ packages: mlly: 1.4.0 pathe: 1.1.1 picocolors: 1.0.0 - vite: 4.4.9(@types/node@20.6.1) + vite: 4.4.9(@types/node@20.6.2) transitivePeerDependencies: - '@types/node' - less @@ -14671,7 +14667,7 @@ packages: - terser dev: true - /vite-node@0.34.2(@types/node@20.6.1): + /vite-node@0.34.2(@types/node@20.6.2): resolution: {integrity: sha512-JtW249Zm3FB+F7pQfH56uWSdlltCo1IOkZW5oHBzeQo0iX4jtC7o1t9aILMGd9kVekXBP2lfJBEQt9rBh07ebA==} engines: {node: '>=v14.18.0'} hasBin: true @@ -14681,7 +14677,7 @@ packages: mlly: 1.4.0 pathe: 1.1.1 picocolors: 1.0.0 - vite: 4.4.9(@types/node@20.6.1) + vite: 4.4.9(@types/node@20.6.2) transitivePeerDependencies: - '@types/node' - less @@ -14715,7 +14711,7 @@ packages: - terser dev: true - /vite@4.4.6(@types/node@20.6.1): + /vite@4.4.6(@types/node@20.6.2): resolution: {integrity: sha512-EY6Mm8vJ++S3D4tNAckaZfw3JwG3wa794Vt70M6cNJ6NxT87yhq7EC8Rcap3ahyHdo8AhCmV9PTk+vG1HiYn1A==} engines: {node: ^14.18.0 || >=16.0.0} hasBin: true @@ -14743,7 +14739,7 @@ packages: terser: optional: true dependencies: - '@types/node': 20.6.1 + '@types/node': 20.6.2 esbuild: 0.18.15 postcss: 8.4.27 rollup: 3.26.3 @@ -14751,42 +14747,6 @@ packages: fsevents: 2.3.2 dev: true - /vite@4.4.9(@types/node@20.6.1): - resolution: {integrity: sha512-2mbUn2LlUmNASWwSCNSJ/EG2HuSRTnVNaydp6vMCm5VIqJsjMfbIWtbH2kDuwUVW5mMUKKZvGPX/rqeqVvv1XA==} - engines: {node: ^14.18.0 || >=16.0.0} - hasBin: true - peerDependencies: - '@types/node': '>= 14' - less: '*' - lightningcss: ^1.21.0 - sass: '*' - stylus: '*' - sugarss: '*' - terser: ^5.4.0 - peerDependenciesMeta: - '@types/node': - optional: true - less: - optional: true - lightningcss: - optional: true - sass: - optional: true - stylus: - optional: true - sugarss: - optional: true - terser: - optional: true - dependencies: - '@types/node': 20.6.1 - esbuild: 0.18.15 - postcss: 8.4.27 - rollup: 3.28.0 - optionalDependencies: - fsevents: 2.3.2 - dev: true - /vite@4.4.9(@types/node@20.6.2): resolution: {integrity: sha512-2mbUn2LlUmNASWwSCNSJ/EG2HuSRTnVNaydp6vMCm5VIqJsjMfbIWtbH2kDuwUVW5mMUKKZvGPX/rqeqVvv1XA==} engines: {node: ^14.18.0 || >=16.0.0} @@ -14856,7 +14816,7 @@ packages: dependencies: '@types/chai': 4.3.6 '@types/chai-subset': 1.3.3 - '@types/node': 20.6.1 + '@types/node': 20.6.2 '@vitest/expect': 0.34.1 '@vitest/runner': 0.34.1 '@vitest/snapshot': 0.34.1 @@ -14875,8 +14835,8 @@ packages: strip-literal: 1.0.1 tinybench: 2.5.0 tinypool: 0.7.0 - vite: 4.4.9(@types/node@20.6.1) - vite-node: 0.34.1(@types/node@20.6.1) + vite: 4.4.9(@types/node@20.6.2) + vite-node: 0.34.1(@types/node@20.6.2) why-is-node-running: 2.2.2 transitivePeerDependencies: - less @@ -14921,7 +14881,7 @@ packages: dependencies: '@types/chai': 4.3.6 '@types/chai-subset': 1.3.3 - '@types/node': 20.6.1 + '@types/node': 20.6.2 '@vitest/expect': 0.34.2 '@vitest/runner': 0.34.2 '@vitest/snapshot': 0.34.2 @@ -14941,8 +14901,8 @@ packages: strip-literal: 1.0.1 tinybench: 2.5.0 tinypool: 0.7.0 - vite: 4.4.9(@types/node@20.6.1) - vite-node: 0.34.2(@types/node@20.6.1) + vite: 4.4.9(@types/node@20.6.2) + vite-node: 0.34.2(@types/node@20.6.2) why-is-node-running: 2.2.2 transitivePeerDependencies: - less From 220846d950b34576491013e3af0338566e2692a7 Mon Sep 17 00:00:00 2001 From: bnoieh <135800952+bnoieh@users.noreply.github.com> Date: Wed, 20 Sep 2023 04:26:51 +0800 Subject: [PATCH 62/87] fix(op-bootnode): add missed flags and enable metrics server (#7282) --- op-bootnode/bootnode/entrypoint.go | 12 ++++++++++++ op-bootnode/flags/flags.go | 3 +++ op-node/flags/flags.go | 2 +- op-node/flags/p2p_flags.go | 2 +- 4 files changed, 17 insertions(+), 2 deletions(-) diff --git a/op-bootnode/bootnode/entrypoint.go b/op-bootnode/bootnode/entrypoint.go index 65411b0aeb90..95d734583666 100644 --- a/op-bootnode/bootnode/entrypoint.go +++ b/op-bootnode/bootnode/entrypoint.go @@ -18,6 +18,7 @@ import ( "github.com/ethereum-optimism/optimism/op-node/rollup" "github.com/ethereum-optimism/optimism/op-service/eth" oplog "github.com/ethereum-optimism/optimism/op-service/log" + opmetrics "github.com/ethereum-optimism/optimism/op-service/metrics" "github.com/ethereum-optimism/optimism/op-service/opio" ) @@ -69,6 +70,17 @@ func Main(cliCtx *cli.Context) error { go p2pNode.DiscoveryProcess(ctx, logger, config, p2pConfig.TargetPeers()) + metricsCfg := opmetrics.ReadCLIConfig(cliCtx) + if metricsCfg.Enabled { + log.Info("starting metrics server", "addr", metricsCfg.ListenAddr, "port", metricsCfg.ListenPort) + go func() { + if err := m.Serve(ctx, metricsCfg.ListenAddr, metricsCfg.ListenPort); err != nil { + log.Error("error starting metrics server", err) + } + }() + m.RecordUp() + } + opio.BlockOnInterrupts() return nil diff --git a/op-bootnode/flags/flags.go b/op-bootnode/flags/flags.go index eaf02530f93c..ba6567050b57 100644 --- a/op-bootnode/flags/flags.go +++ b/op-bootnode/flags/flags.go @@ -8,6 +8,7 @@ import ( "github.com/ethereum-optimism/optimism/op-node/flags" opservice "github.com/ethereum-optimism/optimism/op-service" oplog "github.com/ethereum-optimism/optimism/op-service/log" + opmetrics "github.com/ethereum-optimism/optimism/op-service/metrics" "github.com/urfave/cli/v2" ) @@ -36,5 +37,7 @@ var Flags = []cli.Flag{ } func init() { + Flags = append(Flags, flags.P2pFlags...) + Flags = append(Flags, opmetrics.CLIFlags(envVarPrefix)...) Flags = append(Flags, oplog.CLIFlags(envVarPrefix)...) } diff --git a/op-node/flags/flags.go b/op-node/flags/flags.go index 6bdda51722b8..faaaebf7edc3 100644 --- a/op-node/flags/flags.go +++ b/op-node/flags/flags.go @@ -306,7 +306,7 @@ var optionalFlags = []cli.Flag{ var Flags []cli.Flag func init() { - optionalFlags = append(optionalFlags, p2pFlags...) + optionalFlags = append(optionalFlags, P2pFlags...) optionalFlags = append(optionalFlags, oplog.CLIFlags(EnvVarPrefix)...) Flags = append(requiredFlags, optionalFlags...) } diff --git a/op-node/flags/p2p_flags.go b/op-node/flags/p2p_flags.go index 8117437d8ad2..89408325c73c 100644 --- a/op-node/flags/p2p_flags.go +++ b/op-node/flags/p2p_flags.go @@ -308,7 +308,7 @@ var ( // None of these flags are strictly required. // Some are hidden if they are too technical, or not recommended. -var p2pFlags = []cli.Flag{ +var P2pFlags = []cli.Flag{ DisableP2P, NoDiscovery, P2PPrivPath, From 7e3850081347d37978a1ad6c6fc68328e1ebc246 Mon Sep 17 00:00:00 2001 From: Andreas Bigger Date: Tue, 19 Sep 2023 16:31:25 -0400 Subject: [PATCH 63/87] Chore: Cleanup the op-bootnode. --- op-bootnode/Makefile | 12 ++++++++++++ op-bootnode/cmd/main.go | 15 +++++---------- 2 files changed, 17 insertions(+), 10 deletions(-) diff --git a/op-bootnode/Makefile b/op-bootnode/Makefile index 155b3d6f13a9..43d0dfc1ff72 100644 --- a/op-bootnode/Makefile +++ b/op-bootnode/Makefile @@ -10,5 +10,17 @@ LDFLAGS := -ldflags "$(LDFLAGSSTRING)" op-bootnode: env GO111MODULE=on GOOS=$(TARGETOS) GOARCH=$(TARGETARCH) go build -v $(LDFLAGS) -o ./bin/op-bootnode ./cmd +clean: + rm -f bin/op-bootnode + +test: + go test -v ./... + lint: golangci-lint run -E goimports,sqlclosecheck,bodyclose,asciicheck,misspell,errorlint --timeout 5m -e "errors.As" -e "errors.Is" ./... + +.PHONY: \ + op-bootnode \ + clean \ + test \ + lint diff --git a/op-bootnode/cmd/main.go b/op-bootnode/cmd/main.go index f50df72208cf..1dbc82010cfc 100644 --- a/op-bootnode/cmd/main.go +++ b/op-bootnode/cmd/main.go @@ -3,21 +3,16 @@ package main import ( "os" - "github.com/ethereum-optimism/optimism/op-bootnode/bootnode" - "github.com/ethereum-optimism/optimism/op-bootnode/flags" "github.com/ethereum/go-ethereum/log" "github.com/urfave/cli/v2" + + "github.com/ethereum-optimism/optimism/op-bootnode/bootnode" + "github.com/ethereum-optimism/optimism/op-bootnode/flags" + oplog "github.com/ethereum-optimism/optimism/op-service/log" ) func main() { - // Set up logger with a default INFO level in case we fail to parse flags, - // otherwise the final critical log won't show what the parsing error was. - log.Root().SetHandler( - log.LvlFilterHandler( - log.LvlInfo, - log.StreamHandler(os.Stdout, log.TerminalFormat(true)), - ), - ) + oplog.SetupDefaults() app := cli.NewApp() app.Flags = flags.Flags From 27719369610934aaf33674083b5cefb4d8732e4d Mon Sep 17 00:00:00 2001 From: Maurelian Date: Tue, 19 Sep 2023 18:23:58 -0400 Subject: [PATCH 64/87] fix(ctb): Add vm.assume to prevent clashes on additional test cases (#7308) * fix(ctb): Add vm.assume to prevent clashes on additional test cases * Update DelayedVetoable.t.sol Co-authored-by: refcell.eth * Gas snapshot update --------- Co-authored-by: refcell.eth Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com> --- packages/contracts-bedrock/.gas-snapshot | 4 +- .../test/DelayedVetoable.t.sol | 54 +++++++++++++------ 2 files changed, 39 insertions(+), 19 deletions(-) diff --git a/packages/contracts-bedrock/.gas-snapshot b/packages/contracts-bedrock/.gas-snapshot index 2300beff882e..da71b1b2e8c4 100644 --- a/packages/contracts-bedrock/.gas-snapshot +++ b/packages/contracts-bedrock/.gas-snapshot @@ -46,8 +46,8 @@ CrossDomainOwnable3_Test:test_transferOwnership_zeroAddress_reverts() (gas: 1208 CrossDomainOwnableThroughPortal_Test:test_depositTransaction_crossDomainOwner_succeeds() (gas: 81417) CrossDomainOwnable_Test:test_onlyOwner_notOwner_reverts() (gas: 10597) CrossDomainOwnable_Test:test_onlyOwner_succeeds() (gas: 34883) -DelayedVetoable_Getters_Test:test_getters() (gas: 21342) -DelayedVetoable_Getters_TestFail:test_getters_notZeroAddress_reverts() (gas: 26649) +DelayedVetoable_Getters_Test:test_getters() (gas: 24466) +DelayedVetoable_Getters_TestFail:test_getters_notZeroAddress_reverts() (gas: 31166) DelayedVetoable_HandleCall_TestFail:test_handleCall_unauthorizedInitiation_reverts() (gas: 20234) DeleteOutput:test_script_succeeds() (gas: 3100) DeployerWhitelist_Test:test_owner_succeeds() (gas: 7582) diff --git a/packages/contracts-bedrock/test/DelayedVetoable.t.sol b/packages/contracts-bedrock/test/DelayedVetoable.t.sol index 34cd210d6be8..bbc9c9350944 100644 --- a/packages/contracts-bedrock/test/DelayedVetoable.t.sol +++ b/packages/contracts-bedrock/test/DelayedVetoable.t.sol @@ -34,11 +34,20 @@ contract DelayedVetoable_Init is CommonTest { (bool success,) = address(delayedVetoable).call(hex""); } - /// @dev This function is used to prevent initiating the delay unintentionally.. + /// @dev This function is used to prevent initiating the delay unintentionally. + /// It should only be used on tests prior to the delay being activated. /// @param data The data to be used in the call. function assumeNonzeroData(bytes memory data) internal pure { vm.assume(data.length > 0); } + + /// @dev This function is used to ensure that the data does not clash with the queuedAt function selector. + /// @param data The data to be used in the call. + function assumeNoClash(bytes calldata data) internal pure { + if (data.length >= 4) { + vm.assume(bytes4(data[0:4]) != bytes4(keccak256("queuedAt(bytes32)"))); + } + } } contract DelayedVetoable_Getters_Test is DelayedVetoable_Init { @@ -49,6 +58,7 @@ contract DelayedVetoable_Getters_Test is DelayedVetoable_Init { assertEq(delayedVetoable.vetoer(), vetoer); assertEq(delayedVetoable.target(), target); assertEq(delayedVetoable.delay(), operatingDelay); + assertEq(delayedVetoable.queuedAt(keccak256(abi.encode(0))), 0); } } @@ -63,14 +73,15 @@ contract DelayedVetoable_Getters_TestFail is DelayedVetoable_Init { delayedVetoable.target(); vm.expectRevert(abi.encodeWithSelector(Unauthorized.selector, initiator, address(this))); delayedVetoable.delay(); + vm.expectRevert(abi.encodeWithSelector(Unauthorized.selector, initiator, address(this))); + delayedVetoable.queuedAt(keccak256(abi.encode(0))); } } contract DelayedVetoable_HandleCall_Test is DelayedVetoable_Init { /// @dev A call can be initiated by the initiator. - function testFuzz_handleCall_initiation_succeeds(bytes memory data) external { - assumeNonzeroData(data); - + function testFuzz_handleCall_initiation_succeeds(bytes calldata data) external { + assumeNoClash(data); vm.expectEmit(true, false, false, true, address(delayedVetoable)); emit Initiated(keccak256(data), data); @@ -87,9 +98,7 @@ contract DelayedVetoable_HandleCall_Test is DelayedVetoable_Init { external { assumeNonzeroData(inData); - if (inData.length >= 4) { - vm.assume(bytes4(inData[0:4]) != bytes4(keccak256("queuedAt(bytes32)"))); - } + assumeNoClash(inData); // Reset the delay to zero vm.store(address(delayedVetoable), bytes32(uint256(0)), bytes32(uint256(0))); @@ -102,12 +111,17 @@ contract DelayedVetoable_HandleCall_Test is DelayedVetoable_Init { (bool success, bytes memory returnData) = address(delayedVetoable).call(inData); assertTrue(success); assertEq(returnData, outData); + + // Check that the callHash is not stored for future forwarding + bytes32 callHash = keccak256(inData); + vm.prank(address(0)); + assertEq(delayedVetoable.queuedAt(callHash), 0); } - /// @dev The delay can be activated by the vetoer or initiator, and are not forwarded until the delay has passed - /// once activated. - function testFuzz_handleCall_forwardingWithDelay_succeeds(bytes memory data) external { + /// @dev Calls are not forwarded until the delay has passed. + function testFuzz_handleCall_forwardingWithDelay_succeeds(bytes calldata data) external { assumeNonzeroData(data); + assumeNoClash(data); vm.prank(initiator); (bool success,) = address(delayedVetoable).call(data); @@ -128,14 +142,15 @@ contract DelayedVetoable_HandleCall_Test is DelayedVetoable_Init { } contract DelayedVetoable_HandleCall_TestFail is DelayedVetoable_Init { - /// @dev The delay is inititially set to zero and the call is immediately forwarded. + /// @dev Only the initiator can initiate a call. function test_handleCall_unauthorizedInitiation_reverts() external { vm.expectRevert(abi.encodeWithSelector(Unauthorized.selector, initiator, address(this))); (bool success,) = address(delayedVetoable).call(NON_ZERO_DATA); } - /// @dev The call cannot be forewarded until the delay has passed. - function testFuzz_handleCall_forwardingTooSoon_reverts(bytes memory data) external { + /// @dev The call cannot be forwarded until the delay has passed. + function testFuzz_handleCall_forwardingTooSoon_reverts(bytes calldata data) external { + assumeNoClash(data); vm.prank(initiator); (bool success,) = address(delayedVetoable).call(data); @@ -144,8 +159,8 @@ contract DelayedVetoable_HandleCall_TestFail is DelayedVetoable_Init { } /// @dev The call cannot be forwarded a second time. - function testFuzz_handleCall_forwardingTwice_reverts(bytes memory data) external { - assumeNonzeroData(data); + function testFuzz_handleCall_forwardingTwice_reverts(bytes calldata data) external { + assumeNoClash(data); // Initiate the call vm.prank(initiator); @@ -167,8 +182,13 @@ contract DelayedVetoable_HandleCall_TestFail is DelayedVetoable_Init { } /// @dev If the target reverts, it is bubbled up. - function testFuzz_handleCall_forwardingTargetReverts_reverts(bytes memory inData, bytes memory outData) external { - assumeNonzeroData(inData); + function testFuzz_handleCall_forwardingTargetReverts_reverts( + bytes calldata inData, + bytes calldata outData + ) + external + { + assumeNoClash(inData); // Initiate the call vm.prank(initiator); From d966ccf96664aab6bb9c2c449443e2b02abc5892 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 18 Sep 2023 22:26:49 +0000 Subject: [PATCH 65/87] build(deps-dev): bump @typescript-eslint/parser from 6.4.0 to 6.7.2 Bumps [@typescript-eslint/parser](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser) from 6.4.0 to 6.7.2. - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/parser/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v6.7.2/packages/parser) --- updated-dependencies: - dependency-name: "@typescript-eslint/parser" dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- pnpm-lock.yaml | 76 +++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 59 insertions(+), 17 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8cf75d310852..7892c2975c5e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -38,10 +38,10 @@ importers: version: 20.6.2 '@typescript-eslint/eslint-plugin': specifier: ^6.7.0 - version: 6.7.0(@typescript-eslint/parser@6.7.0)(eslint@8.49.0)(typescript@5.1.6) + version: 6.7.0(@typescript-eslint/parser@6.7.2)(eslint@8.49.0)(typescript@5.1.6) '@typescript-eslint/parser': specifier: ^6.7.0 - version: 6.7.0(eslint@8.49.0)(typescript@5.1.6) + version: 6.7.2(eslint@8.49.0)(typescript@5.1.6) chai: specifier: ^4.2.0 version: 4.3.7 @@ -62,7 +62,7 @@ importers: version: 16.0.3(eslint-plugin-import@2.28.1)(eslint-plugin-node@11.1.0)(eslint-plugin-promise@5.2.0)(eslint@8.49.0) eslint-plugin-import: specifier: ^2.26.0 - version: 2.28.1(@typescript-eslint/parser@6.7.0)(eslint@8.49.0) + version: 2.28.1(@typescript-eslint/parser@6.7.2)(eslint@8.49.0) eslint-plugin-jsdoc: specifier: ^35.1.2 version: 35.5.1(eslint@8.49.0) @@ -4076,7 +4076,7 @@ packages: - supports-color dev: true - /@typescript-eslint/eslint-plugin@6.7.0(@typescript-eslint/parser@6.7.0)(eslint@8.49.0)(typescript@5.1.6): + /@typescript-eslint/eslint-plugin@6.7.0(@typescript-eslint/parser@6.7.2)(eslint@8.49.0)(typescript@5.1.6): resolution: {integrity: sha512-gUqtknHm0TDs1LhY12K2NA3Rmlmp88jK9Tx8vGZMfHeNMLE3GH2e9TRub+y+SOjuYgtOmok+wt1AyDPZqxbNag==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: @@ -4088,7 +4088,7 @@ packages: optional: true dependencies: '@eslint-community/regexpp': 4.6.2 - '@typescript-eslint/parser': 6.7.0(eslint@8.49.0)(typescript@5.1.6) + '@typescript-eslint/parser': 6.7.2(eslint@8.49.0)(typescript@5.1.6) '@typescript-eslint/scope-manager': 6.7.0 '@typescript-eslint/type-utils': 6.7.0(eslint@8.49.0)(typescript@5.1.6) '@typescript-eslint/utils': 6.7.0(eslint@8.49.0)(typescript@5.1.6) @@ -4126,8 +4126,8 @@ packages: - supports-color dev: true - /@typescript-eslint/parser@6.7.0(eslint@8.49.0)(typescript@5.1.6): - resolution: {integrity: sha512-jZKYwqNpNm5kzPVP5z1JXAuxjtl2uG+5NpaMocFPTNC2EdYIgbXIPImObOkhbONxtFTTdoZstLZefbaK+wXZng==} + /@typescript-eslint/parser@6.7.2(eslint@8.49.0)(typescript@5.1.6): + resolution: {integrity: sha512-KA3E4ox0ws+SPyxQf9iSI25R6b4Ne78ORhNHeVKrPQnoYsb9UhieoiRoJgrzgEeKGOXhcY1i8YtOeCHHTDa6Fw==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: eslint: ^7.0.0 || ^8.0.0 @@ -4136,10 +4136,10 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/scope-manager': 6.7.0 - '@typescript-eslint/types': 6.7.0 - '@typescript-eslint/typescript-estree': 6.7.0(typescript@5.1.6) - '@typescript-eslint/visitor-keys': 6.7.0 + '@typescript-eslint/scope-manager': 6.7.2 + '@typescript-eslint/types': 6.7.2 + '@typescript-eslint/typescript-estree': 6.7.2(typescript@5.1.6) + '@typescript-eslint/visitor-keys': 6.7.2 debug: 4.3.4(supports-color@8.1.1) eslint: 8.49.0 typescript: 5.1.6 @@ -4163,6 +4163,14 @@ packages: '@typescript-eslint/visitor-keys': 6.7.0 dev: true + /@typescript-eslint/scope-manager@6.7.2: + resolution: {integrity: sha512-bgi6plgyZjEqapr7u2mhxGR6E8WCzKNUFWNh6fkpVe9+yzRZeYtDTbsIBzKbcxI+r1qVWt6VIoMSNZ4r2A+6Yw==} + engines: {node: ^16.0.0 || >=18.0.0} + dependencies: + '@typescript-eslint/types': 6.7.2 + '@typescript-eslint/visitor-keys': 6.7.2 + dev: true + /@typescript-eslint/type-utils@6.7.0(eslint@8.49.0)(typescript@5.1.6): resolution: {integrity: sha512-f/QabJgDAlpSz3qduCyQT0Fw7hHpmhOzY/Rv6zO3yO+HVIdPfIWhrQoAyG+uZVtWAIS85zAyzgAFfyEr+MgBpg==} engines: {node: ^16.0.0 || >=18.0.0} @@ -4193,6 +4201,11 @@ packages: engines: {node: ^16.0.0 || >=18.0.0} dev: true + /@typescript-eslint/types@6.7.2: + resolution: {integrity: sha512-flJYwMYgnUNDAN9/GAI3l8+wTmvTYdv64fcH8aoJK76Y+1FCZ08RtI5zDerM/FYT5DMkAc+19E4aLmd5KqdFyg==} + engines: {node: ^16.0.0 || >=18.0.0} + dev: true + /@typescript-eslint/typescript-estree@6.4.0(typescript@5.1.6): resolution: {integrity: sha512-iDPJArf/K2sxvjOR6skeUCNgHR/tCQXBsa+ee1/clRKr3olZjZ/dSkXPZjG6YkPtnW6p5D1egeEPMCW6Gn4yLA==} engines: {node: ^16.0.0 || >=18.0.0} @@ -4235,6 +4248,27 @@ packages: - supports-color dev: true + /@typescript-eslint/typescript-estree@6.7.2(typescript@5.1.6): + resolution: {integrity: sha512-kiJKVMLkoSciGyFU0TOY0fRxnp9qq1AzVOHNeN1+B9erKFCJ4Z8WdjAkKQPP+b1pWStGFqezMLltxO+308dJTQ==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/types': 6.7.2 + '@typescript-eslint/visitor-keys': 6.7.2 + debug: 4.3.4(supports-color@8.1.1) + globby: 11.1.0 + is-glob: 4.0.3 + semver: 7.5.4 + ts-api-utils: 1.0.1(typescript@5.1.6) + typescript: 5.1.6 + transitivePeerDependencies: + - supports-color + dev: true + /@typescript-eslint/utils@6.7.0(eslint@8.49.0)(typescript@5.1.6): resolution: {integrity: sha512-MfCq3cM0vh2slSikQYqK2Gq52gvOhe57vD2RM3V4gQRZYX4rDPnKLu5p6cm89+LJiGlwEXU8hkYxhqqEC/V3qA==} engines: {node: ^16.0.0 || >=18.0.0} @@ -4270,6 +4304,14 @@ packages: eslint-visitor-keys: 3.4.3 dev: true + /@typescript-eslint/visitor-keys@6.7.2: + resolution: {integrity: sha512-uVw9VIMFBUTz8rIeaUT3fFe8xIUx8r4ywAdlQv1ifH+6acn/XF8Y6rwJ7XNmkNMDrTW+7+vxFFPIF40nJCVsMQ==} + engines: {node: ^16.0.0 || >=18.0.0} + dependencies: + '@typescript-eslint/types': 6.7.2 + eslint-visitor-keys: 3.4.3 + dev: true + /@vitest/coverage-istanbul@0.34.1(vitest@0.34.1): resolution: {integrity: sha512-5GprlyY2t1g6+RrssWcN/w5RnZV3qIOM0eoaSDJw3jXbHpBpMvAfTg791zXo7PIqNYs5ORUqBWXIIU0gyAfZxA==} peerDependencies: @@ -7575,7 +7617,7 @@ packages: eslint-plugin-promise: ^4.2.1 || ^5.0.0 dependencies: eslint: 8.49.0 - eslint-plugin-import: 2.28.1(@typescript-eslint/parser@6.7.0)(eslint@8.49.0) + eslint-plugin-import: 2.28.1(@typescript-eslint/parser@6.7.2)(eslint@8.49.0) eslint-plugin-node: 11.1.0(eslint@8.49.0) eslint-plugin-promise: 5.2.0(eslint@8.49.0) dev: true @@ -7590,7 +7632,7 @@ packages: - supports-color dev: true - /eslint-module-utils@2.8.0(@typescript-eslint/parser@6.7.0)(eslint-import-resolver-node@0.3.9)(eslint@8.49.0): + /eslint-module-utils@2.8.0(@typescript-eslint/parser@6.7.2)(eslint-import-resolver-node@0.3.9)(eslint@8.49.0): resolution: {integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==} engines: {node: '>=4'} peerDependencies: @@ -7611,7 +7653,7 @@ packages: eslint-import-resolver-webpack: optional: true dependencies: - '@typescript-eslint/parser': 6.7.0(eslint@8.49.0)(typescript@5.1.6) + '@typescript-eslint/parser': 6.7.2(eslint@8.49.0)(typescript@5.1.6) debug: 3.2.7 eslint: 8.49.0 eslint-import-resolver-node: 0.3.9 @@ -7630,7 +7672,7 @@ packages: regexpp: 3.2.0 dev: true - /eslint-plugin-import@2.28.1(@typescript-eslint/parser@6.7.0)(eslint@8.49.0): + /eslint-plugin-import@2.28.1(@typescript-eslint/parser@6.7.2)(eslint@8.49.0): resolution: {integrity: sha512-9I9hFlITvOV55alzoKBI+K9q74kv0iKMeY6av5+umsNwayt59fz692daGyjR+oStBQgx6nwR9rXldDev3Clw+A==} engines: {node: '>=4'} peerDependencies: @@ -7640,7 +7682,7 @@ packages: '@typescript-eslint/parser': optional: true dependencies: - '@typescript-eslint/parser': 6.7.0(eslint@8.49.0)(typescript@5.1.6) + '@typescript-eslint/parser': 6.7.2(eslint@8.49.0)(typescript@5.1.6) array-includes: 3.1.6 array.prototype.findlastindex: 1.2.2 array.prototype.flat: 1.3.1 @@ -7649,7 +7691,7 @@ packages: doctrine: 2.1.0 eslint: 8.49.0 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.7.0)(eslint-import-resolver-node@0.3.9)(eslint@8.49.0) + eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.7.2)(eslint-import-resolver-node@0.3.9)(eslint@8.49.0) has: 1.0.3 is-core-module: 2.13.0 is-glob: 4.0.3 From 1732d9c5ad438397e7c57e62d21c4232d58da25c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 19 Sep 2023 23:03:22 +0000 Subject: [PATCH 66/87] build(deps): bump viem from 1.3.1 to 1.11.0 Bumps [viem](https://github.com/wagmi-dev/viem) from 1.3.1 to 1.11.0. - [Release notes](https://github.com/wagmi-dev/viem/releases) - [Changelog](https://github.com/wagmi-dev/viem/blob/main/CHANGELOG.md) - [Commits](https://github.com/wagmi-dev/viem/compare/viem@1.3.1...viem@1.11.0) --- updated-dependencies: - dependency-name: viem dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- pnpm-lock.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 7892c2975c5e..7ed0fedc91ab 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -3060,7 +3060,7 @@ packages: resolution: {integrity: sha512-bcKpo1oj54hGholplGLpqPHRbIsnbixFtc06nwuNM5/dwSXOq/AAYoIBRsBmnZJSdfeNW5rnff7NTAz3ZCqR9Q==} dependencies: '@noble/curves': 1.0.0 - '@noble/hashes': 1.3.1 + '@noble/hashes': 1.3.2 '@scure/base': 1.1.1 /@scure/bip32@1.3.1: @@ -3080,7 +3080,7 @@ packages: /@scure/bip39@1.2.0: resolution: {integrity: sha512-SX/uKq52cuxm4YFXWFaVByaSHJh2w3BnokVSeUJVCv6K7WulT9u2BuNRBhuFl8vAuYnzx9bEu9WgpcNYTrYieg==} dependencies: - '@noble/hashes': 1.3.1 + '@noble/hashes': 1.3.2 '@scure/base': 1.1.1 /@scure/bip39@1.2.1: From ae10db96463a2039cde5215ce5d721fcd955f406 Mon Sep 17 00:00:00 2001 From: Karl Bartel Date: Mon, 18 Sep 2023 13:58:35 +0200 Subject: [PATCH 67/87] Support old Make version by avoiding SHELLSTATUS SHELLSTATUS is only available on GNU Make 4.2 (released on 2016-05-22) and later, which is unfortunatly not installed on MacOS by default. While I am highly annoyed that Apple is unwilling to update their Make version and don't want encourage such behaviour, the change in this commit avoids this requirement and seems even simpler than the original code. --- Makefile | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/Makefile b/Makefile index 2ec2d871245f..5bc58c385e55 100644 --- a/Makefile +++ b/Makefile @@ -89,10 +89,8 @@ devnet-up: @if [ ! -e op-program/bin ]; then \ make cannon-prestate; \ fi - $(shell ./ops/scripts/newer-file.sh .devnet/allocs-l1.json ./packages/contracts-bedrock) - if [ $(.SHELLSTATUS) -ne 0 ]; then \ - make devnet-allocs; \ - fi + ./ops/scripts/newer-file.sh .devnet/allocs-l1.json ./packages/contracts-bedrock \ + || make devnet-allocs PYTHONPATH=./bedrock-devnet python3 ./bedrock-devnet/main.py --monorepo-dir=. .PHONY: devnet-up From a27f5621e9c0908c59ff8fcd97651b967bd0ec2f Mon Sep 17 00:00:00 2001 From: Andreas Bigger Date: Wed, 20 Sep 2023 11:43:54 -0400 Subject: [PATCH 68/87] Constant time parent lookup fix. --- op-challenger/game/fault/types/game.go | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/op-challenger/game/fault/types/game.go b/op-challenger/game/fault/types/game.go index 0549ce751743..e3782b6811be 100644 --- a/op-challenger/game/fault/types/game.go +++ b/op-challenger/game/fault/types/game.go @@ -51,23 +51,30 @@ type extendedClaim struct { type gameState struct { agreeWithProposedOutput bool root claimEntry - claims map[claimEntry]*extendedClaim - depth uint64 + // parents maps a contract index to it's extended claim. + // This is used to perform O(1) parent lookups. + parents map[int]*extendedClaim + // claims maps a claim entry to it's extended claim. + claims map[claimEntry]*extendedClaim + depth uint64 } // NewGameState returns a new game state. // The provided [Claim] is used as the root node. func NewGameState(agreeWithProposedOutput bool, root Claim, depth uint64) *gameState { claims := make(map[claimEntry]*extendedClaim) + parents := make(map[int]*extendedClaim) rootClaimEntry := makeClaimEntry(root) claims[rootClaimEntry] = &extendedClaim{ self: root, children: make([]claimEntry, 0), } + parents[root.ContractIndex] = claims[rootClaimEntry] return &gameState{ agreeWithProposedOutput: agreeWithProposedOutput, root: rootClaimEntry, claims: claims, + parents: parents, depth: depth, } } @@ -106,10 +113,12 @@ func (g *gameState) Put(claim Claim) error { return errors.New("no parent claim") } parent.children = append(parent.children, makeClaimEntry(claim)) - g.claims[makeClaimEntry(claim)] = &extendedClaim{ + claimWithExtension := &extendedClaim{ self: claim, children: make([]claimEntry, 0), } + g.claims[makeClaimEntry(claim)] = claimWithExtension + g.parents[claim.ContractIndex] = claimWithExtension return nil } @@ -150,11 +159,8 @@ func (g *gameState) getParent(claim Claim) *extendedClaim { if claim.IsRoot() { return nil } - // TODO(inphi): refactor gameState for faster parent lookups - for _, c := range g.claims { - if c.self.ContractIndex == claim.ParentContractIndex { - return c - } + if parent, ok := g.parents[claim.ParentContractIndex]; ok { + return parent } return nil } From 9267b85fad91ffff93323859724e73b5bb399d85 Mon Sep 17 00:00:00 2001 From: Andreas Bigger Date: Wed, 20 Sep 2023 14:16:03 -0400 Subject: [PATCH 69/87] Fix contract indices nit --- op-challenger/game/fault/types/game.go | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/op-challenger/game/fault/types/game.go b/op-challenger/game/fault/types/game.go index e3782b6811be..8df0638c4f10 100644 --- a/op-challenger/game/fault/types/game.go +++ b/op-challenger/game/fault/types/game.go @@ -51,9 +51,9 @@ type extendedClaim struct { type gameState struct { agreeWithProposedOutput bool root claimEntry - // parents maps a contract index to it's extended claim. + // contractIndicies maps a contract index to it's extended claim. // This is used to perform O(1) parent lookups. - parents map[int]*extendedClaim + contractIndicies map[int]*extendedClaim // claims maps a claim entry to it's extended claim. claims map[claimEntry]*extendedClaim depth uint64 @@ -74,7 +74,7 @@ func NewGameState(agreeWithProposedOutput bool, root Claim, depth uint64) *gameS agreeWithProposedOutput: agreeWithProposedOutput, root: rootClaimEntry, claims: claims, - parents: parents, + contractIndicies: parents, depth: depth, } } @@ -118,7 +118,7 @@ func (g *gameState) Put(claim Claim) error { children: make([]claimEntry, 0), } g.claims[makeClaimEntry(claim)] = claimWithExtension - g.parents[claim.ContractIndex] = claimWithExtension + g.contractIndicies[claim.ContractIndex] = claimWithExtension return nil } @@ -159,7 +159,7 @@ func (g *gameState) getParent(claim Claim) *extendedClaim { if claim.IsRoot() { return nil } - if parent, ok := g.parents[claim.ParentContractIndex]; ok { + if parent, ok := g.contractIndicies[claim.ParentContractIndex]; ok { return parent } return nil From d41133c8e01d584b466cb78e5efcf74a48880566 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 20 Sep 2023 20:33:00 +0000 Subject: [PATCH 70/87] build(deps): bump envalid from 7.3.1 to 8.0.0 Bumps [envalid](https://github.com/af/envalid) from 7.3.1 to 8.0.0. - [Release notes](https://github.com/af/envalid/releases) - [Commits](https://github.com/af/envalid/compare/v7.3.1...v8.0.0) --- updated-dependencies: - dependency-name: envalid dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- packages/common-ts/package.json | 2 +- pnpm-lock.yaml | 73 ++++++++++++++++----------------- 2 files changed, 37 insertions(+), 38 deletions(-) diff --git a/packages/common-ts/package.json b/packages/common-ts/package.json index 0de0568966cf..a519f399cb6a 100644 --- a/packages/common-ts/package.json +++ b/packages/common-ts/package.json @@ -40,7 +40,7 @@ "body-parser": "^1.20.2", "commander": "^11.0.0", "dotenv": "^16.3.1", - "envalid": "^7.3.1", + "envalid": "^8.0.0", "ethers": "^5.7.2", "express": "^4.18.2", "express-prom-bundle": "^6.6.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 7ed0fedc91ab..29bbf6dc3870 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -210,8 +210,8 @@ importers: specifier: ^16.3.1 version: 16.3.1 envalid: - specifier: ^7.3.1 - version: 7.3.1 + specifier: ^8.0.0 + version: 8.0.0 ethers: specifier: ^5.7.2 version: 5.7.2 @@ -2406,7 +2406,7 @@ packages: '@motionone/easing': 10.15.1 '@motionone/types': 10.15.1 '@motionone/utils': 10.15.1 - tslib: 2.6.0 + tslib: 2.6.2 /@motionone/dom@10.16.2: resolution: {integrity: sha512-bnuHdNbge1FutZXv+k7xub9oPWcF0hsu8y1HTH/qg6av58YI0VufZ3ngfC7p2xhMJMnoh0LXFma2EGTgPeCkeg==} @@ -2416,26 +2416,26 @@ packages: '@motionone/types': 10.15.1 '@motionone/utils': 10.15.1 hey-listen: 1.0.8 - tslib: 2.6.0 + tslib: 2.6.2 /@motionone/easing@10.15.1: resolution: {integrity: sha512-6hIHBSV+ZVehf9dcKZLT7p5PEKHGhDwky2k8RKkmOvUoYP3S+dXsKupyZpqx5apjd9f+php4vXk4LuS+ADsrWw==} dependencies: '@motionone/utils': 10.15.1 - tslib: 2.6.0 + tslib: 2.6.2 /@motionone/generators@10.15.1: resolution: {integrity: sha512-67HLsvHJbw6cIbLA/o+gsm7h+6D4Sn7AUrB/GPxvujse1cGZ38F5H7DzoH7PhX+sjvtDnt2IhFYF2Zp1QTMKWQ==} dependencies: '@motionone/types': 10.15.1 '@motionone/utils': 10.15.1 - tslib: 2.6.0 + tslib: 2.6.2 /@motionone/svelte@10.16.2: resolution: {integrity: sha512-38xsroKrfK+aHYhuQlE6eFcGy0EwrB43Q7RGjF73j/kRUTcLNu/LAaKiLLsN5lyqVzCgTBVt4TMT/ShWbTbc5Q==} dependencies: '@motionone/dom': 10.16.2 - tslib: 2.6.0 + tslib: 2.6.2 /@motionone/types@10.15.1: resolution: {integrity: sha512-iIUd/EgUsRZGrvW0jqdst8st7zKTzS9EsKkP+6c6n4MPZoQHwiHuVtTQLD6Kp0bsBLhNzKIBlHXponn/SDT4hA==} @@ -2445,13 +2445,13 @@ packages: dependencies: '@motionone/types': 10.15.1 hey-listen: 1.0.8 - tslib: 2.6.0 + tslib: 2.6.2 /@motionone/vue@10.16.2: resolution: {integrity: sha512-7/dEK/nWQXOkJ70bqb2KyNfSWbNvWqKKq1C8juj+0Mg/AorgD8O5wE3naddK0G+aXuNMqRuc4jlsYHHWHtIzVw==} dependencies: '@motionone/dom': 10.16.2 - tslib: 2.6.0 + tslib: 2.6.2 /@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1: resolution: {integrity: sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==} @@ -2825,7 +2825,7 @@ packages: hasBin: true dependencies: nx: 16.8.1 - tslib: 2.6.0 + tslib: 2.6.2 transitivePeerDependencies: - '@swc-node/register' - '@swc/core' @@ -3096,7 +3096,7 @@ packages: '@sentry/core': 7.64.0 '@sentry/types': 7.64.0 '@sentry/utils': 7.64.0 - tslib: 2.6.0 + tslib: 2.6.2 dev: false /@sentry/core@5.30.0: @@ -3116,7 +3116,7 @@ packages: dependencies: '@sentry/types': 7.64.0 '@sentry/utils': 7.64.0 - tslib: 2.6.0 + tslib: 2.6.2 dev: false /@sentry/hub@5.30.0: @@ -3204,7 +3204,7 @@ packages: engines: {node: '>=8'} dependencies: '@sentry/types': 7.64.0 - tslib: 2.6.0 + tslib: 2.6.2 dev: false /@sinclair/typebox@0.27.8: @@ -5238,7 +5238,7 @@ packages: engines: {node: '>=14.15.0'} dependencies: js-yaml: 3.14.1 - tslib: 2.6.0 + tslib: 2.6.2 dev: true /@zkochan/js-yaml@0.0.6: @@ -5694,7 +5694,7 @@ packages: /async-mutex@0.2.6: resolution: {integrity: sha512-Hs4R+4SPgamu6rSGW8C7cV9gaWUKEHykfzCCvIRuaVv636Ju10ZdeUbvb4TBEW0INuq2DHZqXbK4Nd3yG4RaRw==} dependencies: - tslib: 2.6.0 + tslib: 2.6.2 /async@2.6.4: resolution: {integrity: sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==} @@ -6122,7 +6122,7 @@ packages: resolution: {integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==} dependencies: pascal-case: 3.1.2 - tslib: 2.6.0 + tslib: 2.6.2 dev: true /camelcase-keys@6.2.2: @@ -6156,7 +6156,7 @@ packages: resolution: {integrity: sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==} dependencies: no-case: 3.0.4 - tslib: 2.6.0 + tslib: 2.6.2 upper-case-first: 2.0.2 dev: true @@ -6259,7 +6259,7 @@ packages: path-case: 3.0.4 sentence-case: 3.0.4 snake-case: 3.0.4 - tslib: 2.6.0 + tslib: 2.6.2 dev: true /character-entities-legacy@1.1.4: @@ -6520,7 +6520,7 @@ packages: resolution: {integrity: sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ==} dependencies: no-case: 3.0.4 - tslib: 2.6.0 + tslib: 2.6.2 upper-case: 2.0.2 dev: true @@ -7042,7 +7042,7 @@ packages: resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} dependencies: no-case: 3.0.4 - tslib: 2.6.0 + tslib: 2.6.2 dev: true /dotenv-expand@10.0.0: @@ -7183,11 +7183,11 @@ packages: engines: {node: '>=6'} dev: true - /envalid@7.3.1: - resolution: {integrity: sha512-KL1YRwn8WcoF/Ty7t+yLLtZol01xr9ZJMTjzoGRM8NaSU+nQQjSWOQKKJhJP2P57bpdakJ9jbxqQX4fGTOicZg==} + /envalid@8.0.0: + resolution: {integrity: sha512-PGeYJnJB5naN0ME6SH8nFcDj9HVbLpYIfg1p5lAyM9T4cH2lwtu2fLbozC/bq+HUUOIFxhX/LP0/GmlqPHT4tQ==} engines: {node: '>=8.12'} dependencies: - tslib: 2.3.1 + tslib: 2.6.2 dev: false /errno@0.1.8: @@ -9286,7 +9286,7 @@ packages: resolution: {integrity: sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q==} dependencies: capital-case: 1.0.4 - tslib: 2.6.0 + tslib: 2.6.2 dev: true /hexoid@1.0.0: @@ -10596,7 +10596,7 @@ packages: /lower-case@2.0.2: resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} dependencies: - tslib: 2.6.0 + tslib: 2.6.2 dev: true /lru-cache@10.0.1: @@ -11345,7 +11345,7 @@ packages: resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} dependencies: lower-case: 2.0.2 - tslib: 2.6.0 + tslib: 2.6.2 dev: true /node-addon-api@2.0.2: @@ -11885,7 +11885,7 @@ packages: resolution: {integrity: sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==} dependencies: dot-case: 3.0.4 - tslib: 2.6.0 + tslib: 2.6.2 dev: true /parent-module@1.0.1: @@ -11942,7 +11942,7 @@ packages: resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==} dependencies: no-case: 3.0.4 - tslib: 2.6.0 + tslib: 2.6.2 dev: true /patch-package@8.0.0: @@ -11975,7 +11975,7 @@ packages: resolution: {integrity: sha512-qO4qCFjXqVTrcbPt/hQfhTQ+VhFsqNKOPtytgNKkKxSoEp3XPUQ8ObFuePylOIok5gjn69ry8XiULxCwot3Wfg==} dependencies: dot-case: 3.0.4 - tslib: 2.6.0 + tslib: 2.6.2 dev: true /path-exists@2.1.0: @@ -13094,7 +13094,7 @@ packages: resolution: {integrity: sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg==} dependencies: no-case: 3.0.4 - tslib: 2.6.0 + tslib: 2.6.2 upper-case-first: 2.0.2 dev: true @@ -13223,7 +13223,7 @@ packages: resolution: {integrity: sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==} dependencies: dot-case: 3.0.4 - tslib: 2.6.0 + tslib: 2.6.2 dev: true /solc@0.4.26: @@ -14059,13 +14059,12 @@ packages: /tslib@1.14.1: resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} - /tslib@2.3.1: - resolution: {integrity: sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==} - dev: false - /tslib@2.6.0: resolution: {integrity: sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA==} + /tslib@2.6.2: + resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} + /tsort@0.0.1: resolution: {integrity: sha512-Tyrf5mxF8Ofs1tNoxA13lFeZ2Zrbd6cKbuH3V+MQ5sb6DtBj5FjrXVsRWT8YvNAQTqNoz66dz1WsbigI22aEnw==} dev: true @@ -14455,13 +14454,13 @@ packages: /upper-case-first@2.0.2: resolution: {integrity: sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg==} dependencies: - tslib: 2.6.0 + tslib: 2.6.2 dev: true /upper-case@2.0.2: resolution: {integrity: sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg==} dependencies: - tslib: 2.6.0 + tslib: 2.6.2 dev: true /uri-js@4.4.1: From 30fdc8fb25fccf7b2298b12cbd8f28150a9679e2 Mon Sep 17 00:00:00 2001 From: Andreas Bigger Date: Fri, 15 Sep 2023 14:02:47 -0400 Subject: [PATCH 71/87] Track the number of claims in each game. --- op-challenger/game/fault/agent.go | 5 ++++- op-challenger/game/fault/agent_test.go | 8 +++++--- op-challenger/game/fault/player.go | 2 +- op-challenger/metrics/metrics.go | 15 +++++++++++++++ op-challenger/metrics/noop.go | 2 ++ 5 files changed, 27 insertions(+), 5 deletions(-) diff --git a/op-challenger/game/fault/agent.go b/op-challenger/game/fault/agent.go index 0a8212c95ca5..95732a23cca8 100644 --- a/op-challenger/game/fault/agent.go +++ b/op-challenger/game/fault/agent.go @@ -30,6 +30,7 @@ type ClaimLoader interface { type Agent struct { metrics metrics.Metricer + fdgAddr common.Address solver *solver.GameSolver loader ClaimLoader responder Responder @@ -39,9 +40,10 @@ type Agent struct { log log.Logger } -func NewAgent(m metrics.Metricer, loader ClaimLoader, maxDepth int, trace types.TraceProvider, responder Responder, updater types.OracleUpdater, agreeWithProposedOutput bool, log log.Logger) *Agent { +func NewAgent(m metrics.Metricer, addr common.Address, loader ClaimLoader, maxDepth int, trace types.TraceProvider, responder Responder, updater types.OracleUpdater, agreeWithProposedOutput bool, log log.Logger) *Agent { return &Agent{ metrics: m, + fdgAddr: addr, solver: solver.NewGameSolver(maxDepth, trace), loader: loader, responder: responder, @@ -196,6 +198,7 @@ func (a *Agent) newGameFromContracts(ctx context.Context) (types.Game, error) { if len(claims) == 0 { return nil, errors.New("no claims") } + a.metrics.RecordGameClaimCount(a.fdgAddr.String(), len(claims)) game := types.NewGameState(a.agreeWithProposedOutput, claims[0], uint64(a.maxDepth)) if err := game.PutAll(claims[1:]); err != nil { return nil, fmt.Errorf("failed to load claims into the local state: %w", err) diff --git a/op-challenger/game/fault/agent_test.go b/op-challenger/game/fault/agent_test.go index 169b8107b382..afe7d0e47436 100644 --- a/op-challenger/game/fault/agent_test.go +++ b/op-challenger/game/fault/agent_test.go @@ -10,10 +10,11 @@ import ( "github.com/ethereum-optimism/optimism/op-challenger/game/fault/types" gameTypes "github.com/ethereum-optimism/optimism/op-challenger/game/types" "github.com/ethereum-optimism/optimism/op-challenger/metrics" + "github.com/ethereum-optimism/optimism/op-node/testlog" + + "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/log" "github.com/stretchr/testify/require" - - "github.com/ethereum-optimism/optimism/op-node/testlog" ) // TestShouldResolve tests the resolution logic. @@ -110,11 +111,12 @@ func TestLoadClaimsWhenGameNotResolvable(t *testing.T) { func setupTestAgent(t *testing.T, agreeWithProposedOutput bool) (*Agent, *stubClaimLoader, *stubResponder) { logger := testlog.Logger(t, log.LvlInfo) claimLoader := &stubClaimLoader{} + addr := common.HexToAddress("0x1234") depth := 4 trace := alphabet.NewTraceProvider("abcd", uint64(depth)) responder := &stubResponder{} updater := &stubUpdater{} - agent := NewAgent(metrics.NoopMetrics, claimLoader, depth, trace, responder, updater, agreeWithProposedOutput, logger) + agent := NewAgent(metrics.NoopMetrics, addr, claimLoader, depth, trace, responder, updater, agreeWithProposedOutput, logger) return agent, claimLoader, responder } diff --git a/op-challenger/game/fault/player.go b/op-challenger/game/fault/player.go index 110388ce15ff..5f7eda9da8f1 100644 --- a/op-challenger/game/fault/player.go +++ b/op-challenger/game/fault/player.go @@ -106,7 +106,7 @@ func NewGamePlayer( } return &GamePlayer{ - act: NewAgent(m, loader, int(gameDepth), provider, responder, updater, cfg.AgreeWithProposedOutput, logger).Act, + act: NewAgent(m, addr, loader, int(gameDepth), provider, responder, updater, cfg.AgreeWithProposedOutput, logger).Act, agreeWithProposedOutput: cfg.AgreeWithProposedOutput, loader: loader, logger: logger, diff --git a/op-challenger/metrics/metrics.go b/op-challenger/metrics/metrics.go index ced9fb249e58..3fa0fbd33093 100644 --- a/op-challenger/metrics/metrics.go +++ b/op-challenger/metrics/metrics.go @@ -25,6 +25,8 @@ type Metricer interface { RecordGameMove() RecordCannonExecutionTime(t float64) + RecordGameClaimCount(addr string, count int) + RecordGamesStatus(inProgress, defenderWon, challengerWon int) RecordGameUpdateScheduled() @@ -53,6 +55,8 @@ type Metrics struct { cannonExecutionTime prometheus.Histogram + gameClaimCount prometheus.GaugeVec + trackedGames prometheus.GaugeVec inflightGames prometheus.Gauge } @@ -107,6 +111,13 @@ func NewMetrics() *Metrics { []float64{1.0, 10.0}, prometheus.ExponentialBuckets(30.0, 2.0, 14)...), }), + gameClaimCount: *factory.NewGaugeVec(prometheus.GaugeOpts{ + Namespace: Namespace, + Name: "game_claim_count", + Help: "Number of claims in the game", + }, []string{ + "game_address", + }), trackedGames: *factory.NewGaugeVec(prometheus.GaugeOpts{ Namespace: Namespace, Name: "tracked_games", @@ -179,6 +190,10 @@ func (m *Metrics) DecIdleExecutors() { m.executors.WithLabelValues("idle").Dec() } +func (m *Metrics) RecordGameClaimCount(addr string, count int) { + m.gameClaimCount.With(prometheus.Labels{"game_address": addr}).Set(float64(count)) +} + func (m *Metrics) RecordGamesStatus(inProgress, defenderWon, challengerWon int) { m.trackedGames.WithLabelValues("in_progress").Set(float64(inProgress)) m.trackedGames.WithLabelValues("defender_won").Set(float64(defenderWon)) diff --git a/op-challenger/metrics/noop.go b/op-challenger/metrics/noop.go index 9737a5d7ccd3..d70d981af071 100644 --- a/op-challenger/metrics/noop.go +++ b/op-challenger/metrics/noop.go @@ -27,3 +27,5 @@ func (*NoopMetricsImpl) IncActiveExecutors() {} func (*NoopMetricsImpl) DecActiveExecutors() {} func (*NoopMetricsImpl) IncIdleExecutors() {} func (*NoopMetricsImpl) DecIdleExecutors() {} + +func (*NoopMetricsImpl) RecordGameClaimCount(addr string, count int) {} From 5f00fa17fa8440b5a87833623d3536567e895715 Mon Sep 17 00:00:00 2001 From: Andreas Bigger Date: Fri, 15 Sep 2023 14:09:57 -0400 Subject: [PATCH 72/87] zero out the claim count upon resolution --- op-challenger/game/fault/agent.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/op-challenger/game/fault/agent.go b/op-challenger/game/fault/agent.go index 95732a23cca8..b8c588f43111 100644 --- a/op-challenger/game/fault/agent.go +++ b/op-challenger/game/fault/agent.go @@ -57,6 +57,8 @@ func NewAgent(m metrics.Metricer, addr common.Address, loader ClaimLoader, maxDe // Act iterates the game & performs all of the next actions. func (a *Agent) Act(ctx context.Context) error { if a.tryResolve(ctx) { + // Zero out the game claim count since the game will no longer be tracked once resolved. + a.metrics.RecordGameClaimCount(a.fdgAddr.String(), 0) return nil } game, err := a.newGameFromContracts(ctx) From db4a9584ce6681d818b1f4d1915e5434f701461b Mon Sep 17 00:00:00 2001 From: Andreas Bigger Date: Tue, 19 Sep 2023 10:57:27 -0400 Subject: [PATCH 73/87] Fix nits --- op-challenger/game/fault/agent.go | 2 -- 1 file changed, 2 deletions(-) diff --git a/op-challenger/game/fault/agent.go b/op-challenger/game/fault/agent.go index b8c588f43111..95732a23cca8 100644 --- a/op-challenger/game/fault/agent.go +++ b/op-challenger/game/fault/agent.go @@ -57,8 +57,6 @@ func NewAgent(m metrics.Metricer, addr common.Address, loader ClaimLoader, maxDe // Act iterates the game & performs all of the next actions. func (a *Agent) Act(ctx context.Context) error { if a.tryResolve(ctx) { - // Zero out the game claim count since the game will no longer be tracked once resolved. - a.metrics.RecordGameClaimCount(a.fdgAddr.String(), 0) return nil } game, err := a.newGameFromContracts(ctx) From bddac5393119dc3957c8376a9a3afef0f7c36441 Mon Sep 17 00:00:00 2001 From: Will Cory Date: Wed, 20 Sep 2023 17:12:04 -0700 Subject: [PATCH 74/87] Apply suggestions from code review Co-authored-by: Hamdi Allam --- indexer/config/config.go | 1 - indexer/config/devnet.go | 3 --- 2 files changed, 4 deletions(-) diff --git a/indexer/config/config.go b/indexer/config/config.go index 62b5014c6973..a6e709285284 100644 --- a/indexer/config/config.go +++ b/indexer/config/config.go @@ -171,7 +171,6 @@ func LoadConfig(log log.Logger, path string) (Config, error) { log.Info("detected preset", "preset", conf.Chain.Preset, "name", preset.Name) log.Info("setting L1 information from preset") conf.Chain = preset.ChainConfig - log.Info(conf.Chain.L1Contracts.AddressManager.String()) } // Setup L2Contracts from predeploys diff --git a/indexer/config/devnet.go b/indexer/config/devnet.go index d1927b5f7823..7254104b509a 100644 --- a/indexer/config/devnet.go +++ b/indexer/config/devnet.go @@ -34,9 +34,6 @@ func GetDevnetPreset() (*Preset, error) { Name: "devnet", ChainConfig: ChainConfig{ Preset: DEVNET_L2_CHAIN_ID, - L1StartingHeight: 0, - L1BedrockStartingHeight: 0, - L2BedrockStartingHeight: 0, L1Contracts: l1Contracts, }, }, nil From 061dfdb5966718d57a6c6c88249438d82282b5e7 Mon Sep 17 00:00:00 2001 From: Wyatt Barnes Date: Wed, 20 Sep 2023 10:50:15 -1000 Subject: [PATCH 75/87] Init MM metrics --- ufm-test-services/docker-compose.yml | 3 +- .../grafana/dashboards/metamask.json | 182 ++++ .../grafana/provisioning/dashboards/all.yml | 9 + .../provisioning/datasources/datasources.yml} | 0 ufm-test-services/metamask/README.md | 30 + ufm-test-services/metamask/package.json | 6 +- ufm-test-services/metamask/pnpm-lock.yaml | 949 ++++++++++-------- .../metamask/tests/metamask.spec.ts | 55 +- .../metamask/tests/prometheusUtils.ts | 101 ++ ufm-test-services/prometheus.yml | 2 +- 10 files changed, 898 insertions(+), 439 deletions(-) create mode 100644 ufm-test-services/grafana/dashboards/metamask.json create mode 100644 ufm-test-services/grafana/provisioning/dashboards/all.yml rename ufm-test-services/{datesources.yml => grafana/provisioning/datasources/datasources.yml} (100%) create mode 100644 ufm-test-services/metamask/README.md create mode 100644 ufm-test-services/metamask/tests/prometheusUtils.ts diff --git a/ufm-test-services/docker-compose.yml b/ufm-test-services/docker-compose.yml index 8e9a65813955..5a117dd0398f 100644 --- a/ufm-test-services/docker-compose.yml +++ b/ufm-test-services/docker-compose.yml @@ -35,7 +35,8 @@ services: environment: - GF_SECURITY_ADMIN_PASSWORD=${GRAFANA_ADMIN_PWD} volumes: - - ./datasources.yml:/etc/grafana/provisioning/datasources/datasources.yaml + - ./grafana/provisioning:/etc/grafana/provisioning + - ./grafana/dashboards:/var/lib/grafana/dashboards security_opt: - "no-new-privileges:true" diff --git a/ufm-test-services/grafana/dashboards/metamask.json b/ufm-test-services/grafana/dashboards/metamask.json new file mode 100644 index 000000000000..2cb1d07d6bf2 --- /dev/null +++ b/ufm-test-services/grafana/dashboards/metamask.json @@ -0,0 +1,182 @@ +{ + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": { + "type": "grafana", + "uid": "-- Grafana --" + }, + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "type": "dashboard" + } + ] + }, + "editable": true, + "fiscalYearStartMonth": 0, + "graphTooltip": 0, + "links": [], + "liveNow": false, + "panels": [ + { + "datasource": { + "type": "prometheus", + "uid": "PBFA97CFB590B2093" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "red", + "value": null + }, + { + "color": "yellow", + "value": 1 + }, + { + "color": "green", + "value": 4 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 5, + "w": 6, + "x": 0, + "y": 0 + }, + "id": 1, + "options": { + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showThresholdLabels": false, + "showThresholdMarkers": true + }, + "pluginVersion": "10.1.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "PBFA97CFB590B2093" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "metamask_tx_success", + "fullMetaSearch": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "__auto", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "Number of Successful Transaction Since Last Failure", + "type": "gauge" + }, + { + "datasource": { + "type": "prometheus", + "uid": "PBFA97CFB590B2093" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "text", + "value": null + }, + { + "color": "red", + "value": 1 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 5, + "w": 6, + "x": 6, + "y": 0 + }, + "id": 2, + "options": { + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showThresholdLabels": false, + "showThresholdMarkers": true + }, + "pluginVersion": "10.1.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "PBFA97CFB590B2093" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "metamask_tx_failure", + "fullMetaSearch": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "__auto", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "Number of Failed Transactions Since Last Success", + "type": "gauge" + } + ], + "refresh": "5s", + "schemaVersion": 38, + "style": "dark", + "tags": [], + "templating": { + "list": [] + }, + "time": { + "from": "now-6h", + "to": "now" + }, + "timepicker": {}, + "timezone": "", + "title": "UFM: Metamask", + "uid": "f66f7076-c724-4f81-8ff9-58d6d99f2716", + "version": 1, + "weekStart": "" +} diff --git a/ufm-test-services/grafana/provisioning/dashboards/all.yml b/ufm-test-services/grafana/provisioning/dashboards/all.yml new file mode 100644 index 000000000000..3ce6e7c5bc69 --- /dev/null +++ b/ufm-test-services/grafana/provisioning/dashboards/all.yml @@ -0,0 +1,9 @@ +apiVersion: 1 +providers: +- name: 'default' + orgId: 1 + folder: '' + type: file + disableDeletion: false + options: + path: /var/lib/grafana/dashboards diff --git a/ufm-test-services/datesources.yml b/ufm-test-services/grafana/provisioning/datasources/datasources.yml similarity index 100% rename from ufm-test-services/datesources.yml rename to ufm-test-services/grafana/provisioning/datasources/datasources.yml diff --git a/ufm-test-services/metamask/README.md b/ufm-test-services/metamask/README.md new file mode 100644 index 000000000000..f2bddf940677 --- /dev/null +++ b/ufm-test-services/metamask/README.md @@ -0,0 +1,30 @@ +# User Facing Monitoring - Metamask Tests + +## Running Locally + +### Building Docker Image + +```bash +docker build -t ufm-test-service-metamask . +``` + +### Running the Docker Container on MacOS + +The following steps were taken from [here](https://www.oddbird.net/2022/11/30/headed-playwright-in-docker/#macos) + +Apple’s operating system doesn’t include a built-in XServer, but we can use [XQuartz](https://www.xquartz.org/) to provide one: + +1. Install XQuartz: `brew install --cask xquartz`` +2. Open XQuartz, go to `Preferences -> Security`, and check `Allow connections from network clients` +3. Restart your computer (restarting XQuartz might not be enough) +4. Start XQuartz by executing `xhost +localhost` in your terminal +5. Open Docker Desktop and edit settings to give access to `/tmp/.X11-unix` in `Preferences -> Resources -> File sharing` + +Once XQuartz is running with the right permissions, you can populate the environment variable and socket Docker args: + +```bash +docker run --rm -it \ +-e DISPLAY=host.docker.internal:0 \ +-v /tmp/.X11-unix:/tmp/.X11-unix \ +ufm-test-service-metamask +``` diff --git a/ufm-test-services/metamask/package.json b/ufm-test-services/metamask/package.json index 64fabd76ec3f..5e42934b74f4 100644 --- a/ufm-test-services/metamask/package.json +++ b/ufm-test-services/metamask/package.json @@ -20,10 +20,14 @@ "devDependencies": { "@metamask/test-dapp": "^7.1.0", "@playwright/test": "1.37.1", - "@synthetixio/synpress": "3.7.2-beta.5", + "@synthetixio/synpress": "3.7.2-beta.7", "dotenv": "^16.3.1", "static-server": "^2.2.1", "typescript": "^5.1.6", "viem": "^1.10.8" + }, + "dependencies": { + "prom-client": "^14.2.0", + "zod": "^3.22.2" } } diff --git a/ufm-test-services/metamask/pnpm-lock.yaml b/ufm-test-services/metamask/pnpm-lock.yaml index 7705b2113d48..cefcd148afa8 100644 --- a/ufm-test-services/metamask/pnpm-lock.yaml +++ b/ufm-test-services/metamask/pnpm-lock.yaml @@ -7,16 +7,23 @@ settings: importers: .: + dependencies: + prom-client: + specifier: ^14.2.0 + version: 14.2.0 + zod: + specifier: ^3.22.2 + version: 3.22.2 devDependencies: '@metamask/test-dapp': specifier: ^7.1.0 version: 7.1.0 '@playwright/test': - specifier: ^1.37.1 + specifier: 1.37.1 version: 1.37.1 '@synthetixio/synpress': - specifier: 3.7.2-beta.5 - version: 3.7.2-beta.5(@babel/core@7.22.17)(@babel/preset-env@7.22.15)(babel-loader@9.1.3)(react-dom@18.2.0)(react@18.2.0)(typescript@5.1.6)(webpack@5.88.2) + specifier: 3.7.2-beta.7 + version: 3.7.2-beta.7(@babel/core@7.22.20)(@babel/preset-env@7.22.20)(babel-loader@9.1.3)(react-dom@18.2.0)(react@18.2.0)(typescript@5.1.6)(webpack@5.88.2)(zod@3.22.2) dotenv: specifier: ^16.3.1 version: 16.3.1 @@ -28,7 +35,7 @@ importers: version: 5.1.6 viem: specifier: ^1.10.8 - version: 1.10.8(typescript@5.1.6) + version: 1.10.8(typescript@5.1.6)(zod@3.22.2) packages: @@ -56,25 +63,25 @@ packages: chalk: 2.4.2 dev: true - /@babel/compat-data@7.22.9: - resolution: {integrity: sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ==} + /@babel/compat-data@7.22.20: + resolution: {integrity: sha512-BQYjKbpXjoXwFW5jGqiizJQQT/aC7pFm9Ok1OWssonuguICi264lbgMzRp2ZMmRSlfkX6DsWDDcsrctK8Rwfiw==} engines: {node: '>=6.9.0'} dev: true - /@babel/core@7.22.17: - resolution: {integrity: sha512-2EENLmhpwplDux5PSsZnSbnSkB3tZ6QTksgO25xwEL7pIDcNOMhF5v/s6RzwjMZzZzw9Ofc30gHv5ChCC8pifQ==} + /@babel/core@7.22.20: + resolution: {integrity: sha512-Y6jd1ahLubuYweD/zJH+vvOY141v4f9igNQAQ+MBgq9JlHS2iTsZKn1aMsb3vGccZsXI16VzTBw52Xx0DWmtnA==} engines: {node: '>=6.9.0'} dependencies: '@ampproject/remapping': 2.2.1 '@babel/code-frame': 7.22.13 '@babel/generator': 7.22.15 '@babel/helper-compilation-targets': 7.22.15 - '@babel/helper-module-transforms': 7.22.17(@babel/core@7.22.17) + '@babel/helper-module-transforms': 7.22.20(@babel/core@7.22.20) '@babel/helpers': 7.22.15 '@babel/parser': 7.22.16 '@babel/template': 7.22.15 - '@babel/traverse': 7.22.17 - '@babel/types': 7.22.17 + '@babel/traverse': 7.22.20 + '@babel/types': 7.22.19 convert-source-map: 1.9.0 debug: 4.3.4(supports-color@8.1.1) gensync: 1.0.0-beta.2 @@ -88,7 +95,7 @@ packages: resolution: {integrity: sha512-Zu9oWARBqeVOW0dZOjXc3JObrzuqothQ3y/n1kUtrjCoCPLkXUwMvOo/F/TCfoHMbWIFlWwpZtkZVb9ga4U2pA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.22.17 + '@babel/types': 7.22.19 '@jridgewell/gen-mapping': 0.3.3 '@jridgewell/trace-mapping': 0.3.19 jsesc: 2.5.2 @@ -98,74 +105,74 @@ packages: resolution: {integrity: sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.22.17 + '@babel/types': 7.22.19 dev: true /@babel/helper-builder-binary-assignment-operator-visitor@7.22.15: resolution: {integrity: sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.22.17 + '@babel/types': 7.22.19 dev: true /@babel/helper-compilation-targets@7.22.15: resolution: {integrity: sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/compat-data': 7.22.9 + '@babel/compat-data': 7.22.20 '@babel/helper-validator-option': 7.22.15 browserslist: 4.21.10 lru-cache: 5.1.1 semver: 6.3.1 dev: true - /@babel/helper-create-class-features-plugin@7.22.15(@babel/core@7.22.17): + /@babel/helper-create-class-features-plugin@7.22.15(@babel/core@7.22.20): resolution: {integrity: sha512-jKkwA59IXcvSaiK2UN45kKwSC9o+KuoXsBDvHvU/7BecYIp8GQ2UwrVvFgJASUT+hBnwJx6MhvMCuMzwZZ7jlg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.22.17 + '@babel/core': 7.22.20 '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-environment-visitor': 7.22.5 + '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-function-name': 7.22.5 '@babel/helper-member-expression-to-functions': 7.22.15 '@babel/helper-optimise-call-expression': 7.22.5 - '@babel/helper-replace-supers': 7.22.9(@babel/core@7.22.17) + '@babel/helper-replace-supers': 7.22.20(@babel/core@7.22.20) '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 '@babel/helper-split-export-declaration': 7.22.6 semver: 6.3.1 dev: true - /@babel/helper-create-regexp-features-plugin@7.22.15(@babel/core@7.22.17): + /@babel/helper-create-regexp-features-plugin@7.22.15(@babel/core@7.22.20): resolution: {integrity: sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.22.17 + '@babel/core': 7.22.20 '@babel/helper-annotate-as-pure': 7.22.5 regexpu-core: 5.3.2 semver: 6.3.1 dev: true - /@babel/helper-define-polyfill-provider@0.4.2(@babel/core@7.22.17): + /@babel/helper-define-polyfill-provider@0.4.2(@babel/core@7.22.20): resolution: {integrity: sha512-k0qnnOqHn5dK9pZpfD5XXZ9SojAITdCKRn2Lp6rnDGzIbaP0rHyMPk/4wsSxVBVz4RfN0q6VpXWP2pDGIoQ7hw==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 dependencies: - '@babel/core': 7.22.17 + '@babel/core': 7.22.20 '@babel/helper-compilation-targets': 7.22.15 '@babel/helper-plugin-utils': 7.22.5 debug: 4.3.4(supports-color@8.1.1) lodash.debounce: 4.0.8 - resolve: 1.22.4 + resolve: 1.22.6 transitivePeerDependencies: - supports-color dev: true - /@babel/helper-environment-visitor@7.22.5: - resolution: {integrity: sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==} + /@babel/helper-environment-visitor@7.22.20: + resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==} engines: {node: '>=6.9.0'} dev: true @@ -174,49 +181,49 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/template': 7.22.15 - '@babel/types': 7.22.17 + '@babel/types': 7.22.19 dev: true /@babel/helper-hoist-variables@7.22.5: resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.22.17 + '@babel/types': 7.22.19 dev: true /@babel/helper-member-expression-to-functions@7.22.15: resolution: {integrity: sha512-qLNsZbgrNh0fDQBCPocSL8guki1hcPvltGDv/NxvUoABwFq7GkKSu1nRXeJkVZc+wJvne2E0RKQz+2SQrz6eAA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.22.17 + '@babel/types': 7.22.19 dev: true /@babel/helper-module-imports@7.22.15: resolution: {integrity: sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.22.17 + '@babel/types': 7.22.19 dev: true - /@babel/helper-module-transforms@7.22.17(@babel/core@7.22.17): - resolution: {integrity: sha512-XouDDhQESrLHTpnBtCKExJdyY4gJCdrvH2Pyv8r8kovX2U8G0dRUOT45T9XlbLtuu9CLXP15eusnkprhoPV5iQ==} + /@babel/helper-module-transforms@7.22.20(@babel/core@7.22.20): + resolution: {integrity: sha512-dLT7JVWIUUxKOs1UnJUBR3S70YK+pKX6AbJgB2vMIvEkZkrfJDbYDJesnPshtKV4LhDOR3Oc5YULeDizRek+5A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.22.17 - '@babel/helper-environment-visitor': 7.22.5 + '@babel/core': 7.22.20 + '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-module-imports': 7.22.15 '@babel/helper-simple-access': 7.22.5 '@babel/helper-split-export-declaration': 7.22.6 - '@babel/helper-validator-identifier': 7.22.15 + '@babel/helper-validator-identifier': 7.22.20 dev: true /@babel/helper-optimise-call-expression@7.22.5: resolution: {integrity: sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.22.17 + '@babel/types': 7.22.19 dev: true /@babel/helper-plugin-utils@7.22.5: @@ -224,26 +231,26 @@ packages: engines: {node: '>=6.9.0'} dev: true - /@babel/helper-remap-async-to-generator@7.22.17(@babel/core@7.22.17): - resolution: {integrity: sha512-bxH77R5gjH3Nkde6/LuncQoLaP16THYPscurp1S8z7S9ZgezCyV3G8Hc+TZiCmY8pz4fp8CvKSgtJMW0FkLAxA==} + /@babel/helper-remap-async-to-generator@7.22.20(@babel/core@7.22.20): + resolution: {integrity: sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.22.17 + '@babel/core': 7.22.20 '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-environment-visitor': 7.22.5 - '@babel/helper-wrap-function': 7.22.17 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-wrap-function': 7.22.20 dev: true - /@babel/helper-replace-supers@7.22.9(@babel/core@7.22.17): - resolution: {integrity: sha512-LJIKvvpgPOPUThdYqcX6IXRuIcTkcAub0IaDRGCZH0p5GPUp7PhRU9QVgFcDDd51BaPkk77ZjqFwh6DZTAEmGg==} + /@babel/helper-replace-supers@7.22.20(@babel/core@7.22.20): + resolution: {integrity: sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.22.17 - '@babel/helper-environment-visitor': 7.22.5 + '@babel/core': 7.22.20 + '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-member-expression-to-functions': 7.22.15 '@babel/helper-optimise-call-expression': 7.22.5 dev: true @@ -252,21 +259,21 @@ packages: resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.22.17 + '@babel/types': 7.22.19 dev: true /@babel/helper-skip-transparent-expression-wrappers@7.22.5: resolution: {integrity: sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.22.17 + '@babel/types': 7.22.19 dev: true /@babel/helper-split-export-declaration@7.22.6: resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.22.17 + '@babel/types': 7.22.19 dev: true /@babel/helper-string-parser@7.22.5: @@ -274,8 +281,8 @@ packages: engines: {node: '>=6.9.0'} dev: true - /@babel/helper-validator-identifier@7.22.15: - resolution: {integrity: sha512-4E/F9IIEi8WR94324mbDUMo074YTheJmd7eZF5vITTeYchqAi6sYXRLHUVsmkdmY4QjfKTcB2jB7dVP3NaBElQ==} + /@babel/helper-validator-identifier@7.22.20: + resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} engines: {node: '>=6.9.0'} dev: true @@ -284,13 +291,13 @@ packages: engines: {node: '>=6.9.0'} dev: true - /@babel/helper-wrap-function@7.22.17: - resolution: {integrity: sha512-nAhoheCMlrqU41tAojw9GpVEKDlTS8r3lzFmF0lP52LwblCPbuFSO7nGIZoIcoU5NIm1ABrna0cJExE4Ay6l2Q==} + /@babel/helper-wrap-function@7.22.20: + resolution: {integrity: sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==} engines: {node: '>=6.9.0'} dependencies: '@babel/helper-function-name': 7.22.5 '@babel/template': 7.22.15 - '@babel/types': 7.22.17 + '@babel/types': 7.22.19 dev: true /@babel/helpers@7.22.15: @@ -298,8 +305,8 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/template': 7.22.15 - '@babel/traverse': 7.22.17 - '@babel/types': 7.22.17 + '@babel/traverse': 7.22.20 + '@babel/types': 7.22.19 transitivePeerDependencies: - supports-color dev: true @@ -308,7 +315,7 @@ packages: resolution: {integrity: sha512-C/BaXcnnvBCmHTpz/VGZ8jgtE2aYlW4hxDhseJAWZb7gqGM/qtCK6iZUb0TyKFf7BOUsBH7Q7fkRsDRhg1XklQ==} engines: {node: '>=6.9.0'} dependencies: - '@babel/helper-validator-identifier': 7.22.15 + '@babel/helper-validator-identifier': 7.22.20 chalk: 2.4.2 js-tokens: 4.0.0 dev: true @@ -318,841 +325,841 @@ packages: engines: {node: '>=6.0.0'} hasBin: true dependencies: - '@babel/types': 7.22.17 + '@babel/types': 7.22.19 dev: true - /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.22.15(@babel/core@7.22.17): + /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.22.15(@babel/core@7.22.20): resolution: {integrity: sha512-FB9iYlz7rURmRJyXRKEnalYPPdn87H5no108cyuQQyMwlpJ2SJtpIUBI27kdTin956pz+LPypkPVPUTlxOmrsg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.22.17 + '@babel/core': 7.22.20 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.22.15(@babel/core@7.22.17): + /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.22.15(@babel/core@7.22.20): resolution: {integrity: sha512-Hyph9LseGvAeeXzikV88bczhsrLrIZqDPxO+sSmAunMPaGrBGhfMWzCPYTtiW9t+HzSE2wtV8e5cc5P6r1xMDQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.13.0 dependencies: - '@babel/core': 7.22.17 + '@babel/core': 7.22.20 '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/plugin-transform-optional-chaining': 7.22.15(@babel/core@7.22.17) + '@babel/plugin-transform-optional-chaining': 7.22.15(@babel/core@7.22.20) dev: true - /@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.22.17): + /@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.22.20): resolution: {integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==} engines: {node: '>=6.9.0'} deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-private-property-in-object instead. peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.17 + '@babel/core': 7.22.20 dev: true - /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.22.17): + /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.22.20): resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.17 + '@babel/core': 7.22.20 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.22.17): + /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.22.20): resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.17 + '@babel/core': 7.22.20 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.22.17): + /@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.22.20): resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.17 + '@babel/core': 7.22.20 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.22.17): + /@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.22.20): resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.17 + '@babel/core': 7.22.20 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.22.17): + /@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.22.20): resolution: {integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.17 + '@babel/core': 7.22.20 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-import-assertions@7.22.5(@babel/core@7.22.17): + /@babel/plugin-syntax-import-assertions@7.22.5(@babel/core@7.22.20): resolution: {integrity: sha512-rdV97N7KqsRzeNGoWUOK6yUsWarLjE5Su/Snk9IYPU9CwkWHs4t+rTGOvffTR8XGkJMTAdLfO0xVnXm8wugIJg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.17 + '@babel/core': 7.22.20 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-import-attributes@7.22.5(@babel/core@7.22.17): + /@babel/plugin-syntax-import-attributes@7.22.5(@babel/core@7.22.20): resolution: {integrity: sha512-KwvoWDeNKPETmozyFE0P2rOLqh39EoQHNjqizrI5B8Vt0ZNS7M56s7dAiAqbYfiAYOuIzIh96z3iR2ktgu3tEg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.17 + '@babel/core': 7.22.20 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.22.17): + /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.22.20): resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.17 + '@babel/core': 7.22.20 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.22.17): + /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.22.20): resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.17 + '@babel/core': 7.22.20 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.22.17): + /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.22.20): resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.17 + '@babel/core': 7.22.20 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.22.17): + /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.22.20): resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.17 + '@babel/core': 7.22.20 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.22.17): + /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.22.20): resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.17 + '@babel/core': 7.22.20 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.22.17): + /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.22.20): resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.17 + '@babel/core': 7.22.20 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.22.17): + /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.22.20): resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.17 + '@babel/core': 7.22.20 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.22.17): + /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.22.20): resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.17 + '@babel/core': 7.22.20 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.22.17): + /@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.22.20): resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.17 + '@babel/core': 7.22.20 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.22.17): + /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.22.20): resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.17 + '@babel/core': 7.22.20 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.22.17): + /@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.22.20): resolution: {integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.22.17 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.22.17) + '@babel/core': 7.22.20 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.22.20) '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-arrow-functions@7.22.5(@babel/core@7.22.17): + /@babel/plugin-transform-arrow-functions@7.22.5(@babel/core@7.22.20): resolution: {integrity: sha512-26lTNXoVRdAnsaDXPpvCNUq+OVWEVC6bx7Vvz9rC53F2bagUWW4u4ii2+h8Fejfh7RYqPxn+libeFBBck9muEw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.17 + '@babel/core': 7.22.20 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-async-generator-functions@7.22.15(@babel/core@7.22.17): + /@babel/plugin-transform-async-generator-functions@7.22.15(@babel/core@7.22.20): resolution: {integrity: sha512-jBm1Es25Y+tVoTi5rfd5t1KLmL8ogLKpXszboWOTTtGFGz2RKnQe2yn7HbZ+kb/B8N0FVSGQo874NSlOU1T4+w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.17 - '@babel/helper-environment-visitor': 7.22.5 + '@babel/core': 7.22.20 + '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-remap-async-to-generator': 7.22.17(@babel/core@7.22.17) - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.22.17) + '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.22.20) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.22.20) dev: true - /@babel/plugin-transform-async-to-generator@7.22.5(@babel/core@7.22.17): + /@babel/plugin-transform-async-to-generator@7.22.5(@babel/core@7.22.20): resolution: {integrity: sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.17 + '@babel/core': 7.22.20 '@babel/helper-module-imports': 7.22.15 '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-remap-async-to-generator': 7.22.17(@babel/core@7.22.17) + '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.22.20) dev: true - /@babel/plugin-transform-block-scoped-functions@7.22.5(@babel/core@7.22.17): + /@babel/plugin-transform-block-scoped-functions@7.22.5(@babel/core@7.22.20): resolution: {integrity: sha512-tdXZ2UdknEKQWKJP1KMNmuF5Lx3MymtMN/pvA+p/VEkhK8jVcQ1fzSy8KM9qRYhAf2/lV33hoMPKI/xaI9sADA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.17 + '@babel/core': 7.22.20 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-block-scoping@7.22.15(@babel/core@7.22.17): + /@babel/plugin-transform-block-scoping@7.22.15(@babel/core@7.22.20): resolution: {integrity: sha512-G1czpdJBZCtngoK1sJgloLiOHUnkb/bLZwqVZD8kXmq0ZnVfTTWUcs9OWtp0mBtYJ+4LQY1fllqBkOIPhXmFmw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.17 + '@babel/core': 7.22.20 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-class-properties@7.22.5(@babel/core@7.22.17): + /@babel/plugin-transform-class-properties@7.22.5(@babel/core@7.22.20): resolution: {integrity: sha512-nDkQ0NfkOhPTq8YCLiWNxp1+f9fCobEjCb0n8WdbNUBc4IB5V7P1QnX9IjpSoquKrXF5SKojHleVNs2vGeHCHQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.17 - '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.22.17) + '@babel/core': 7.22.20 + '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.22.20) '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-class-static-block@7.22.11(@babel/core@7.22.17): + /@babel/plugin-transform-class-static-block@7.22.11(@babel/core@7.22.20): resolution: {integrity: sha512-GMM8gGmqI7guS/llMFk1bJDkKfn3v3C4KHK9Yg1ey5qcHcOlKb0QvcMrgzvxo+T03/4szNh5lghY+fEC98Kq9g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.12.0 dependencies: - '@babel/core': 7.22.17 - '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.22.17) + '@babel/core': 7.22.20 + '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.22.20) '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.22.17) + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.22.20) dev: true - /@babel/plugin-transform-classes@7.22.15(@babel/core@7.22.17): + /@babel/plugin-transform-classes@7.22.15(@babel/core@7.22.20): resolution: {integrity: sha512-VbbC3PGjBdE0wAWDdHM9G8Gm977pnYI0XpqMd6LrKISj8/DJXEsWqgRuTYaNE9Bv0JGhTZUzHDlMk18IpOuoqw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.17 + '@babel/core': 7.22.20 '@babel/helper-annotate-as-pure': 7.22.5 '@babel/helper-compilation-targets': 7.22.15 - '@babel/helper-environment-visitor': 7.22.5 + '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-function-name': 7.22.5 '@babel/helper-optimise-call-expression': 7.22.5 '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-replace-supers': 7.22.9(@babel/core@7.22.17) + '@babel/helper-replace-supers': 7.22.20(@babel/core@7.22.20) '@babel/helper-split-export-declaration': 7.22.6 globals: 11.12.0 dev: true - /@babel/plugin-transform-computed-properties@7.22.5(@babel/core@7.22.17): + /@babel/plugin-transform-computed-properties@7.22.5(@babel/core@7.22.20): resolution: {integrity: sha512-4GHWBgRf0krxPX+AaPtgBAlTgTeZmqDynokHOX7aqqAB4tHs3U2Y02zH6ETFdLZGcg9UQSD1WCmkVrE9ErHeOg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.17 + '@babel/core': 7.22.20 '@babel/helper-plugin-utils': 7.22.5 '@babel/template': 7.22.15 dev: true - /@babel/plugin-transform-destructuring@7.22.15(@babel/core@7.22.17): + /@babel/plugin-transform-destructuring@7.22.15(@babel/core@7.22.20): resolution: {integrity: sha512-HzG8sFl1ZVGTme74Nw+X01XsUTqERVQ6/RLHo3XjGRzm7XD6QTtfS3NJotVgCGy8BzkDqRjRBD8dAyJn5TuvSQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.17 + '@babel/core': 7.22.20 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-dotall-regex@7.22.5(@babel/core@7.22.17): + /@babel/plugin-transform-dotall-regex@7.22.5(@babel/core@7.22.20): resolution: {integrity: sha512-5/Yk9QxCQCl+sOIB1WelKnVRxTJDSAIxtJLL2/pqL14ZVlbH0fUQUZa/T5/UnQtBNgghR7mfB8ERBKyKPCi7Vw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.17 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.22.17) + '@babel/core': 7.22.20 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.22.20) '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-duplicate-keys@7.22.5(@babel/core@7.22.17): + /@babel/plugin-transform-duplicate-keys@7.22.5(@babel/core@7.22.20): resolution: {integrity: sha512-dEnYD+9BBgld5VBXHnF/DbYGp3fqGMsyxKbtD1mDyIA7AkTSpKXFhCVuj/oQVOoALfBs77DudA0BE4d5mcpmqw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.17 + '@babel/core': 7.22.20 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-dynamic-import@7.22.11(@babel/core@7.22.17): + /@babel/plugin-transform-dynamic-import@7.22.11(@babel/core@7.22.20): resolution: {integrity: sha512-g/21plo58sfteWjaO0ZNVb+uEOkJNjAaHhbejrnBmu011l/eNDScmkbjCC3l4FKb10ViaGU4aOkFznSu2zRHgA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.17 + '@babel/core': 7.22.20 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.22.17) + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.22.20) dev: true - /@babel/plugin-transform-exponentiation-operator@7.22.5(@babel/core@7.22.17): + /@babel/plugin-transform-exponentiation-operator@7.22.5(@babel/core@7.22.20): resolution: {integrity: sha512-vIpJFNM/FjZ4rh1myqIya9jXwrwwgFRHPjT3DkUA9ZLHuzox8jiXkOLvwm1H+PQIP3CqfC++WPKeuDi0Sjdj1g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.17 + '@babel/core': 7.22.20 '@babel/helper-builder-binary-assignment-operator-visitor': 7.22.15 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-export-namespace-from@7.22.11(@babel/core@7.22.17): + /@babel/plugin-transform-export-namespace-from@7.22.11(@babel/core@7.22.20): resolution: {integrity: sha512-xa7aad7q7OiT8oNZ1mU7NrISjlSkVdMbNxn9IuLZyL9AJEhs1Apba3I+u5riX1dIkdptP5EKDG5XDPByWxtehw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.17 + '@babel/core': 7.22.20 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.22.17) + '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.22.20) dev: true - /@babel/plugin-transform-for-of@7.22.15(@babel/core@7.22.17): + /@babel/plugin-transform-for-of@7.22.15(@babel/core@7.22.20): resolution: {integrity: sha512-me6VGeHsx30+xh9fbDLLPi0J1HzmeIIyenoOQHuw2D4m2SAU3NrspX5XxJLBpqn5yrLzrlw2Iy3RA//Bx27iOA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.17 + '@babel/core': 7.22.20 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-function-name@7.22.5(@babel/core@7.22.17): + /@babel/plugin-transform-function-name@7.22.5(@babel/core@7.22.20): resolution: {integrity: sha512-UIzQNMS0p0HHiQm3oelztj+ECwFnj+ZRV4KnguvlsD2of1whUeM6o7wGNj6oLwcDoAXQ8gEqfgC24D+VdIcevg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.17 + '@babel/core': 7.22.20 '@babel/helper-compilation-targets': 7.22.15 '@babel/helper-function-name': 7.22.5 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-json-strings@7.22.11(@babel/core@7.22.17): + /@babel/plugin-transform-json-strings@7.22.11(@babel/core@7.22.20): resolution: {integrity: sha512-CxT5tCqpA9/jXFlme9xIBCc5RPtdDq3JpkkhgHQqtDdiTnTI0jtZ0QzXhr5DILeYifDPp2wvY2ad+7+hLMW5Pw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.17 + '@babel/core': 7.22.20 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.22.17) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.22.20) dev: true - /@babel/plugin-transform-literals@7.22.5(@babel/core@7.22.17): + /@babel/plugin-transform-literals@7.22.5(@babel/core@7.22.20): resolution: {integrity: sha512-fTLj4D79M+mepcw3dgFBTIDYpbcB9Sm0bpm4ppXPaO+U+PKFFyV9MGRvS0gvGw62sd10kT5lRMKXAADb9pWy8g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.17 + '@babel/core': 7.22.20 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-logical-assignment-operators@7.22.11(@babel/core@7.22.17): + /@babel/plugin-transform-logical-assignment-operators@7.22.11(@babel/core@7.22.20): resolution: {integrity: sha512-qQwRTP4+6xFCDV5k7gZBF3C31K34ut0tbEcTKxlX/0KXxm9GLcO14p570aWxFvVzx6QAfPgq7gaeIHXJC8LswQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.17 + '@babel/core': 7.22.20 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.22.17) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.22.20) dev: true - /@babel/plugin-transform-member-expression-literals@7.22.5(@babel/core@7.22.17): + /@babel/plugin-transform-member-expression-literals@7.22.5(@babel/core@7.22.20): resolution: {integrity: sha512-RZEdkNtzzYCFl9SE9ATaUMTj2hqMb4StarOJLrZRbqqU4HSBE7UlBw9WBWQiDzrJZJdUWiMTVDI6Gv/8DPvfew==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.17 + '@babel/core': 7.22.20 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-modules-amd@7.22.5(@babel/core@7.22.17): + /@babel/plugin-transform-modules-amd@7.22.5(@babel/core@7.22.20): resolution: {integrity: sha512-R+PTfLTcYEmb1+kK7FNkhQ1gP4KgjpSO6HfH9+f8/yfp2Nt3ggBjiVpRwmwTlfqZLafYKJACy36yDXlEmI9HjQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.17 - '@babel/helper-module-transforms': 7.22.17(@babel/core@7.22.17) + '@babel/core': 7.22.20 + '@babel/helper-module-transforms': 7.22.20(@babel/core@7.22.20) '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-modules-commonjs@7.22.15(@babel/core@7.22.17): + /@babel/plugin-transform-modules-commonjs@7.22.15(@babel/core@7.22.20): resolution: {integrity: sha512-jWL4eh90w0HQOTKP2MoXXUpVxilxsB2Vl4ji69rSjS3EcZ/v4sBmn+A3NpepuJzBhOaEBbR7udonlHHn5DWidg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.17 - '@babel/helper-module-transforms': 7.22.17(@babel/core@7.22.17) + '@babel/core': 7.22.20 + '@babel/helper-module-transforms': 7.22.20(@babel/core@7.22.20) '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-simple-access': 7.22.5 dev: true - /@babel/plugin-transform-modules-systemjs@7.22.11(@babel/core@7.22.17): + /@babel/plugin-transform-modules-systemjs@7.22.11(@babel/core@7.22.20): resolution: {integrity: sha512-rIqHmHoMEOhI3VkVf5jQ15l539KrwhzqcBO6wdCNWPWc/JWt9ILNYNUssbRpeq0qWns8svuw8LnMNCvWBIJ8wA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.17 + '@babel/core': 7.22.20 '@babel/helper-hoist-variables': 7.22.5 - '@babel/helper-module-transforms': 7.22.17(@babel/core@7.22.17) + '@babel/helper-module-transforms': 7.22.20(@babel/core@7.22.20) '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-validator-identifier': 7.22.15 + '@babel/helper-validator-identifier': 7.22.20 dev: true - /@babel/plugin-transform-modules-umd@7.22.5(@babel/core@7.22.17): + /@babel/plugin-transform-modules-umd@7.22.5(@babel/core@7.22.20): resolution: {integrity: sha512-+S6kzefN/E1vkSsKx8kmQuqeQsvCKCd1fraCM7zXm4SFoggI099Tr4G8U81+5gtMdUeMQ4ipdQffbKLX0/7dBQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.17 - '@babel/helper-module-transforms': 7.22.17(@babel/core@7.22.17) + '@babel/core': 7.22.20 + '@babel/helper-module-transforms': 7.22.20(@babel/core@7.22.20) '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-named-capturing-groups-regex@7.22.5(@babel/core@7.22.17): + /@babel/plugin-transform-named-capturing-groups-regex@7.22.5(@babel/core@7.22.20): resolution: {integrity: sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.22.17 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.22.17) + '@babel/core': 7.22.20 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.22.20) '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-new-target@7.22.5(@babel/core@7.22.17): + /@babel/plugin-transform-new-target@7.22.5(@babel/core@7.22.20): resolution: {integrity: sha512-AsF7K0Fx/cNKVyk3a+DW0JLo+Ua598/NxMRvxDnkpCIGFh43+h/v2xyhRUYf6oD8gE4QtL83C7zZVghMjHd+iw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.17 + '@babel/core': 7.22.20 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-nullish-coalescing-operator@7.22.11(@babel/core@7.22.17): + /@babel/plugin-transform-nullish-coalescing-operator@7.22.11(@babel/core@7.22.20): resolution: {integrity: sha512-YZWOw4HxXrotb5xsjMJUDlLgcDXSfO9eCmdl1bgW4+/lAGdkjaEvOnQ4p5WKKdUgSzO39dgPl0pTnfxm0OAXcg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.17 + '@babel/core': 7.22.20 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.22.17) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.22.20) dev: true - /@babel/plugin-transform-numeric-separator@7.22.11(@babel/core@7.22.17): + /@babel/plugin-transform-numeric-separator@7.22.11(@babel/core@7.22.20): resolution: {integrity: sha512-3dzU4QGPsILdJbASKhF/V2TVP+gJya1PsueQCxIPCEcerqF21oEcrob4mzjsp2Py/1nLfF5m+xYNMDpmA8vffg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.17 + '@babel/core': 7.22.20 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.22.17) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.22.20) dev: true - /@babel/plugin-transform-object-rest-spread@7.22.15(@babel/core@7.22.17): + /@babel/plugin-transform-object-rest-spread@7.22.15(@babel/core@7.22.20): resolution: {integrity: sha512-fEB+I1+gAmfAyxZcX1+ZUwLeAuuf8VIg67CTznZE0MqVFumWkh8xWtn58I4dxdVf080wn7gzWoF8vndOViJe9Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/compat-data': 7.22.9 - '@babel/core': 7.22.17 + '@babel/compat-data': 7.22.20 + '@babel/core': 7.22.20 '@babel/helper-compilation-targets': 7.22.15 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.22.17) - '@babel/plugin-transform-parameters': 7.22.15(@babel/core@7.22.17) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.22.20) + '@babel/plugin-transform-parameters': 7.22.15(@babel/core@7.22.20) dev: true - /@babel/plugin-transform-object-super@7.22.5(@babel/core@7.22.17): + /@babel/plugin-transform-object-super@7.22.5(@babel/core@7.22.20): resolution: {integrity: sha512-klXqyaT9trSjIUrcsYIfETAzmOEZL3cBYqOYLJxBHfMFFggmXOv+NYSX/Jbs9mzMVESw/WycLFPRx8ba/b2Ipw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.17 + '@babel/core': 7.22.20 '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-replace-supers': 7.22.9(@babel/core@7.22.17) + '@babel/helper-replace-supers': 7.22.20(@babel/core@7.22.20) dev: true - /@babel/plugin-transform-optional-catch-binding@7.22.11(@babel/core@7.22.17): + /@babel/plugin-transform-optional-catch-binding@7.22.11(@babel/core@7.22.20): resolution: {integrity: sha512-rli0WxesXUeCJnMYhzAglEjLWVDF6ahb45HuprcmQuLidBJFWjNnOzssk2kuc6e33FlLaiZhG/kUIzUMWdBKaQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.17 + '@babel/core': 7.22.20 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.22.17) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.22.20) dev: true - /@babel/plugin-transform-optional-chaining@7.22.15(@babel/core@7.22.17): + /@babel/plugin-transform-optional-chaining@7.22.15(@babel/core@7.22.20): resolution: {integrity: sha512-ngQ2tBhq5vvSJw2Q2Z9i7ealNkpDMU0rGWnHPKqRZO0tzZ5tlaoz4hDvhXioOoaE0X2vfNss1djwg0DXlfu30A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.17 + '@babel/core': 7.22.20 '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.22.17) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.22.20) dev: true - /@babel/plugin-transform-parameters@7.22.15(@babel/core@7.22.17): + /@babel/plugin-transform-parameters@7.22.15(@babel/core@7.22.20): resolution: {integrity: sha512-hjk7qKIqhyzhhUvRT683TYQOFa/4cQKwQy7ALvTpODswN40MljzNDa0YldevS6tGbxwaEKVn502JmY0dP7qEtQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.17 + '@babel/core': 7.22.20 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-private-methods@7.22.5(@babel/core@7.22.17): + /@babel/plugin-transform-private-methods@7.22.5(@babel/core@7.22.20): resolution: {integrity: sha512-PPjh4gyrQnGe97JTalgRGMuU4icsZFnWkzicB/fUtzlKUqvsWBKEpPPfr5a2JiyirZkHxnAqkQMO5Z5B2kK3fA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.17 - '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.22.17) + '@babel/core': 7.22.20 + '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.22.20) '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-private-property-in-object@7.22.11(@babel/core@7.22.17): + /@babel/plugin-transform-private-property-in-object@7.22.11(@babel/core@7.22.20): resolution: {integrity: sha512-sSCbqZDBKHetvjSwpyWzhuHkmW5RummxJBVbYLkGkaiTOWGxml7SXt0iWa03bzxFIx7wOj3g/ILRd0RcJKBeSQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.17 + '@babel/core': 7.22.20 '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.22.17) + '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.22.20) '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.22.17) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.22.20) dev: true - /@babel/plugin-transform-property-literals@7.22.5(@babel/core@7.22.17): + /@babel/plugin-transform-property-literals@7.22.5(@babel/core@7.22.20): resolution: {integrity: sha512-TiOArgddK3mK/x1Qwf5hay2pxI6wCZnvQqrFSqbtg1GLl2JcNMitVH/YnqjP+M31pLUeTfzY1HAXFDnUBV30rQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.17 + '@babel/core': 7.22.20 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-regenerator@7.22.10(@babel/core@7.22.17): + /@babel/plugin-transform-regenerator@7.22.10(@babel/core@7.22.20): resolution: {integrity: sha512-F28b1mDt8KcT5bUyJc/U9nwzw6cV+UmTeRlXYIl2TNqMMJif0Jeey9/RQ3C4NOd2zp0/TRsDns9ttj2L523rsw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.17 + '@babel/core': 7.22.20 '@babel/helper-plugin-utils': 7.22.5 regenerator-transform: 0.15.2 dev: true - /@babel/plugin-transform-reserved-words@7.22.5(@babel/core@7.22.17): + /@babel/plugin-transform-reserved-words@7.22.5(@babel/core@7.22.20): resolution: {integrity: sha512-DTtGKFRQUDm8svigJzZHzb/2xatPc6TzNvAIJ5GqOKDsGFYgAskjRulbR/vGsPKq3OPqtexnz327qYpP57RFyA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.17 + '@babel/core': 7.22.20 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-shorthand-properties@7.22.5(@babel/core@7.22.17): + /@babel/plugin-transform-shorthand-properties@7.22.5(@babel/core@7.22.20): resolution: {integrity: sha512-vM4fq9IXHscXVKzDv5itkO1X52SmdFBFcMIBZ2FRn2nqVYqw6dBexUgMvAjHW+KXpPPViD/Yo3GrDEBaRC0QYA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.17 + '@babel/core': 7.22.20 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-spread@7.22.5(@babel/core@7.22.17): + /@babel/plugin-transform-spread@7.22.5(@babel/core@7.22.20): resolution: {integrity: sha512-5ZzDQIGyvN4w8+dMmpohL6MBo+l2G7tfC/O2Dg7/hjpgeWvUx8FzfeOKxGog9IimPa4YekaQ9PlDqTLOljkcxg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.17 + '@babel/core': 7.22.20 '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 dev: true - /@babel/plugin-transform-sticky-regex@7.22.5(@babel/core@7.22.17): + /@babel/plugin-transform-sticky-regex@7.22.5(@babel/core@7.22.20): resolution: {integrity: sha512-zf7LuNpHG0iEeiyCNwX4j3gDg1jgt1k3ZdXBKbZSoA3BbGQGvMiSvfbZRR3Dr3aeJe3ooWFZxOOG3IRStYp2Bw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.17 + '@babel/core': 7.22.20 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-template-literals@7.22.5(@babel/core@7.22.17): + /@babel/plugin-transform-template-literals@7.22.5(@babel/core@7.22.20): resolution: {integrity: sha512-5ciOehRNf+EyUeewo8NkbQiUs4d6ZxiHo6BcBcnFlgiJfu16q0bQUw9Jvo0b0gBKFG1SMhDSjeKXSYuJLeFSMA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.17 + '@babel/core': 7.22.20 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-typeof-symbol@7.22.5(@babel/core@7.22.17): + /@babel/plugin-transform-typeof-symbol@7.22.5(@babel/core@7.22.20): resolution: {integrity: sha512-bYkI5lMzL4kPii4HHEEChkD0rkc+nvnlR6+o/qdqR6zrm0Sv/nodmyLhlq2DO0YKLUNd2VePmPRjJXSBh9OIdA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.17 + '@babel/core': 7.22.20 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-unicode-escapes@7.22.10(@babel/core@7.22.17): + /@babel/plugin-transform-unicode-escapes@7.22.10(@babel/core@7.22.20): resolution: {integrity: sha512-lRfaRKGZCBqDlRU3UIFovdp9c9mEvlylmpod0/OatICsSfuQ9YFthRo1tpTkGsklEefZdqlEFdY4A2dwTb6ohg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.17 + '@babel/core': 7.22.20 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-unicode-property-regex@7.22.5(@babel/core@7.22.17): + /@babel/plugin-transform-unicode-property-regex@7.22.5(@babel/core@7.22.20): resolution: {integrity: sha512-HCCIb+CbJIAE6sXn5CjFQXMwkCClcOfPCzTlilJ8cUatfzwHlWQkbtV0zD338u9dZskwvuOYTuuaMaA8J5EI5A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.17 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.22.17) + '@babel/core': 7.22.20 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.22.20) '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-unicode-regex@7.22.5(@babel/core@7.22.17): + /@babel/plugin-transform-unicode-regex@7.22.5(@babel/core@7.22.20): resolution: {integrity: sha512-028laaOKptN5vHJf9/Arr/HiJekMd41hOEZYvNsrsXqJ7YPYuX2bQxh31fkZzGmq3YqHRJzYFFAVYvKfMPKqyg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.17 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.22.17) + '@babel/core': 7.22.20 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.22.20) '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-unicode-sets-regex@7.22.5(@babel/core@7.22.17): + /@babel/plugin-transform-unicode-sets-regex@7.22.5(@babel/core@7.22.20): resolution: {integrity: sha512-lhMfi4FC15j13eKrh3DnYHjpGj6UKQHtNKTbtc1igvAhRy4+kLhV07OpLcsN0VgDEw/MjAvJO4BdMJsHwMhzCg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.22.17 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.22.17) + '@babel/core': 7.22.20 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.22.20) '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/preset-env@7.22.15(@babel/core@7.22.17): - resolution: {integrity: sha512-tZFHr54GBkHk6hQuVA8w4Fmq+MSPsfvMG0vPnOYyTnJpyfMqybL8/MbNCPRT9zc2KBO2pe4tq15g6Uno4Jpoag==} + /@babel/preset-env@7.22.20(@babel/core@7.22.20): + resolution: {integrity: sha512-11MY04gGC4kSzlPHRfvVkNAZhUxOvm7DCJ37hPDnUENwe06npjIRAfInEMTGSb4LZK5ZgDFkv5hw0lGebHeTyg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/compat-data': 7.22.9 - '@babel/core': 7.22.17 + '@babel/compat-data': 7.22.20 + '@babel/core': 7.22.20 '@babel/helper-compilation-targets': 7.22.15 '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-validator-option': 7.22.15 - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.22.15(@babel/core@7.22.17) - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.22.15(@babel/core@7.22.17) - '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.22.17) - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.22.17) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.22.17) - '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.22.17) - '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.22.17) - '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.22.17) - '@babel/plugin-syntax-import-assertions': 7.22.5(@babel/core@7.22.17) - '@babel/plugin-syntax-import-attributes': 7.22.5(@babel/core@7.22.17) - '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.22.17) - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.22.17) - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.22.17) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.22.17) - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.22.17) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.22.17) - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.22.17) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.22.17) - '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.22.17) - '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.22.17) - '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.22.17) - '@babel/plugin-transform-arrow-functions': 7.22.5(@babel/core@7.22.17) - '@babel/plugin-transform-async-generator-functions': 7.22.15(@babel/core@7.22.17) - '@babel/plugin-transform-async-to-generator': 7.22.5(@babel/core@7.22.17) - '@babel/plugin-transform-block-scoped-functions': 7.22.5(@babel/core@7.22.17) - '@babel/plugin-transform-block-scoping': 7.22.15(@babel/core@7.22.17) - '@babel/plugin-transform-class-properties': 7.22.5(@babel/core@7.22.17) - '@babel/plugin-transform-class-static-block': 7.22.11(@babel/core@7.22.17) - '@babel/plugin-transform-classes': 7.22.15(@babel/core@7.22.17) - '@babel/plugin-transform-computed-properties': 7.22.5(@babel/core@7.22.17) - '@babel/plugin-transform-destructuring': 7.22.15(@babel/core@7.22.17) - '@babel/plugin-transform-dotall-regex': 7.22.5(@babel/core@7.22.17) - '@babel/plugin-transform-duplicate-keys': 7.22.5(@babel/core@7.22.17) - '@babel/plugin-transform-dynamic-import': 7.22.11(@babel/core@7.22.17) - '@babel/plugin-transform-exponentiation-operator': 7.22.5(@babel/core@7.22.17) - '@babel/plugin-transform-export-namespace-from': 7.22.11(@babel/core@7.22.17) - '@babel/plugin-transform-for-of': 7.22.15(@babel/core@7.22.17) - '@babel/plugin-transform-function-name': 7.22.5(@babel/core@7.22.17) - '@babel/plugin-transform-json-strings': 7.22.11(@babel/core@7.22.17) - '@babel/plugin-transform-literals': 7.22.5(@babel/core@7.22.17) - '@babel/plugin-transform-logical-assignment-operators': 7.22.11(@babel/core@7.22.17) - '@babel/plugin-transform-member-expression-literals': 7.22.5(@babel/core@7.22.17) - '@babel/plugin-transform-modules-amd': 7.22.5(@babel/core@7.22.17) - '@babel/plugin-transform-modules-commonjs': 7.22.15(@babel/core@7.22.17) - '@babel/plugin-transform-modules-systemjs': 7.22.11(@babel/core@7.22.17) - '@babel/plugin-transform-modules-umd': 7.22.5(@babel/core@7.22.17) - '@babel/plugin-transform-named-capturing-groups-regex': 7.22.5(@babel/core@7.22.17) - '@babel/plugin-transform-new-target': 7.22.5(@babel/core@7.22.17) - '@babel/plugin-transform-nullish-coalescing-operator': 7.22.11(@babel/core@7.22.17) - '@babel/plugin-transform-numeric-separator': 7.22.11(@babel/core@7.22.17) - '@babel/plugin-transform-object-rest-spread': 7.22.15(@babel/core@7.22.17) - '@babel/plugin-transform-object-super': 7.22.5(@babel/core@7.22.17) - '@babel/plugin-transform-optional-catch-binding': 7.22.11(@babel/core@7.22.17) - '@babel/plugin-transform-optional-chaining': 7.22.15(@babel/core@7.22.17) - '@babel/plugin-transform-parameters': 7.22.15(@babel/core@7.22.17) - '@babel/plugin-transform-private-methods': 7.22.5(@babel/core@7.22.17) - '@babel/plugin-transform-private-property-in-object': 7.22.11(@babel/core@7.22.17) - '@babel/plugin-transform-property-literals': 7.22.5(@babel/core@7.22.17) - '@babel/plugin-transform-regenerator': 7.22.10(@babel/core@7.22.17) - '@babel/plugin-transform-reserved-words': 7.22.5(@babel/core@7.22.17) - '@babel/plugin-transform-shorthand-properties': 7.22.5(@babel/core@7.22.17) - '@babel/plugin-transform-spread': 7.22.5(@babel/core@7.22.17) - '@babel/plugin-transform-sticky-regex': 7.22.5(@babel/core@7.22.17) - '@babel/plugin-transform-template-literals': 7.22.5(@babel/core@7.22.17) - '@babel/plugin-transform-typeof-symbol': 7.22.5(@babel/core@7.22.17) - '@babel/plugin-transform-unicode-escapes': 7.22.10(@babel/core@7.22.17) - '@babel/plugin-transform-unicode-property-regex': 7.22.5(@babel/core@7.22.17) - '@babel/plugin-transform-unicode-regex': 7.22.5(@babel/core@7.22.17) - '@babel/plugin-transform-unicode-sets-regex': 7.22.5(@babel/core@7.22.17) - '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.22.17) - '@babel/types': 7.22.17 - babel-plugin-polyfill-corejs2: 0.4.5(@babel/core@7.22.17) - babel-plugin-polyfill-corejs3: 0.8.3(@babel/core@7.22.17) - babel-plugin-polyfill-regenerator: 0.5.2(@babel/core@7.22.17) + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.22.15(@babel/core@7.22.20) + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.22.15(@babel/core@7.22.20) + '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.22.20) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.22.20) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.22.20) + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.22.20) + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.22.20) + '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.22.20) + '@babel/plugin-syntax-import-assertions': 7.22.5(@babel/core@7.22.20) + '@babel/plugin-syntax-import-attributes': 7.22.5(@babel/core@7.22.20) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.22.20) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.22.20) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.22.20) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.22.20) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.22.20) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.22.20) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.22.20) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.22.20) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.22.20) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.22.20) + '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.22.20) + '@babel/plugin-transform-arrow-functions': 7.22.5(@babel/core@7.22.20) + '@babel/plugin-transform-async-generator-functions': 7.22.15(@babel/core@7.22.20) + '@babel/plugin-transform-async-to-generator': 7.22.5(@babel/core@7.22.20) + '@babel/plugin-transform-block-scoped-functions': 7.22.5(@babel/core@7.22.20) + '@babel/plugin-transform-block-scoping': 7.22.15(@babel/core@7.22.20) + '@babel/plugin-transform-class-properties': 7.22.5(@babel/core@7.22.20) + '@babel/plugin-transform-class-static-block': 7.22.11(@babel/core@7.22.20) + '@babel/plugin-transform-classes': 7.22.15(@babel/core@7.22.20) + '@babel/plugin-transform-computed-properties': 7.22.5(@babel/core@7.22.20) + '@babel/plugin-transform-destructuring': 7.22.15(@babel/core@7.22.20) + '@babel/plugin-transform-dotall-regex': 7.22.5(@babel/core@7.22.20) + '@babel/plugin-transform-duplicate-keys': 7.22.5(@babel/core@7.22.20) + '@babel/plugin-transform-dynamic-import': 7.22.11(@babel/core@7.22.20) + '@babel/plugin-transform-exponentiation-operator': 7.22.5(@babel/core@7.22.20) + '@babel/plugin-transform-export-namespace-from': 7.22.11(@babel/core@7.22.20) + '@babel/plugin-transform-for-of': 7.22.15(@babel/core@7.22.20) + '@babel/plugin-transform-function-name': 7.22.5(@babel/core@7.22.20) + '@babel/plugin-transform-json-strings': 7.22.11(@babel/core@7.22.20) + '@babel/plugin-transform-literals': 7.22.5(@babel/core@7.22.20) + '@babel/plugin-transform-logical-assignment-operators': 7.22.11(@babel/core@7.22.20) + '@babel/plugin-transform-member-expression-literals': 7.22.5(@babel/core@7.22.20) + '@babel/plugin-transform-modules-amd': 7.22.5(@babel/core@7.22.20) + '@babel/plugin-transform-modules-commonjs': 7.22.15(@babel/core@7.22.20) + '@babel/plugin-transform-modules-systemjs': 7.22.11(@babel/core@7.22.20) + '@babel/plugin-transform-modules-umd': 7.22.5(@babel/core@7.22.20) + '@babel/plugin-transform-named-capturing-groups-regex': 7.22.5(@babel/core@7.22.20) + '@babel/plugin-transform-new-target': 7.22.5(@babel/core@7.22.20) + '@babel/plugin-transform-nullish-coalescing-operator': 7.22.11(@babel/core@7.22.20) + '@babel/plugin-transform-numeric-separator': 7.22.11(@babel/core@7.22.20) + '@babel/plugin-transform-object-rest-spread': 7.22.15(@babel/core@7.22.20) + '@babel/plugin-transform-object-super': 7.22.5(@babel/core@7.22.20) + '@babel/plugin-transform-optional-catch-binding': 7.22.11(@babel/core@7.22.20) + '@babel/plugin-transform-optional-chaining': 7.22.15(@babel/core@7.22.20) + '@babel/plugin-transform-parameters': 7.22.15(@babel/core@7.22.20) + '@babel/plugin-transform-private-methods': 7.22.5(@babel/core@7.22.20) + '@babel/plugin-transform-private-property-in-object': 7.22.11(@babel/core@7.22.20) + '@babel/plugin-transform-property-literals': 7.22.5(@babel/core@7.22.20) + '@babel/plugin-transform-regenerator': 7.22.10(@babel/core@7.22.20) + '@babel/plugin-transform-reserved-words': 7.22.5(@babel/core@7.22.20) + '@babel/plugin-transform-shorthand-properties': 7.22.5(@babel/core@7.22.20) + '@babel/plugin-transform-spread': 7.22.5(@babel/core@7.22.20) + '@babel/plugin-transform-sticky-regex': 7.22.5(@babel/core@7.22.20) + '@babel/plugin-transform-template-literals': 7.22.5(@babel/core@7.22.20) + '@babel/plugin-transform-typeof-symbol': 7.22.5(@babel/core@7.22.20) + '@babel/plugin-transform-unicode-escapes': 7.22.10(@babel/core@7.22.20) + '@babel/plugin-transform-unicode-property-regex': 7.22.5(@babel/core@7.22.20) + '@babel/plugin-transform-unicode-regex': 7.22.5(@babel/core@7.22.20) + '@babel/plugin-transform-unicode-sets-regex': 7.22.5(@babel/core@7.22.20) + '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.22.20) + '@babel/types': 7.22.19 + babel-plugin-polyfill-corejs2: 0.4.5(@babel/core@7.22.20) + babel-plugin-polyfill-corejs3: 0.8.3(@babel/core@7.22.20) + babel-plugin-polyfill-regenerator: 0.5.2(@babel/core@7.22.20) core-js-compat: 3.32.2 semver: 6.3.1 transitivePeerDependencies: - supports-color dev: true - /@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.22.17): + /@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.22.20): resolution: {integrity: sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==} peerDependencies: '@babel/core': ^7.0.0-0 || ^8.0.0-0 <8.0.0 dependencies: - '@babel/core': 7.22.17 + '@babel/core': 7.22.20 '@babel/helper-plugin-utils': 7.22.5 - '@babel/types': 7.22.17 + '@babel/types': 7.22.19 esutils: 2.0.3 dev: true @@ -1181,33 +1188,33 @@ packages: dependencies: '@babel/code-frame': 7.22.13 '@babel/parser': 7.22.16 - '@babel/types': 7.22.17 + '@babel/types': 7.22.19 dev: true - /@babel/traverse@7.22.17: - resolution: {integrity: sha512-xK4Uwm0JnAMvxYZxOVecss85WxTEIbTa7bnGyf/+EgCL5Zt3U7htUpEOWv9detPlamGKuRzCqw74xVglDWpPdg==} + /@babel/traverse@7.22.20: + resolution: {integrity: sha512-eU260mPZbU7mZ0N+X10pxXhQFMGTeLb9eFS0mxehS8HZp9o1uSnFeWQuG1UPrlxgA7QoUzFhOnilHDp0AXCyHw==} engines: {node: '>=6.9.0'} dependencies: '@babel/code-frame': 7.22.13 '@babel/generator': 7.22.15 - '@babel/helper-environment-visitor': 7.22.5 + '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-function-name': 7.22.5 '@babel/helper-hoist-variables': 7.22.5 '@babel/helper-split-export-declaration': 7.22.6 '@babel/parser': 7.22.16 - '@babel/types': 7.22.17 + '@babel/types': 7.22.19 debug: 4.3.4(supports-color@8.1.1) globals: 11.12.0 transitivePeerDependencies: - supports-color dev: true - /@babel/types@7.22.17: - resolution: {integrity: sha512-YSQPHLFtQNE5xN9tHuZnzu8vPr61wVTBZdfv1meex1NBosa4iT05k/Jw06ddJugi4bk7The/oSwQGFcksmEJQg==} + /@babel/types@7.22.19: + resolution: {integrity: sha512-P7LAw/LbojPzkgp5oznjE6tQEIWbp4PkkfrZDINTro9zgBRtI324/EYsiSI7lhPbpIQ+DCeR2NNmMWANGGfZsg==} engines: {node: '>=6.9.0'} dependencies: '@babel/helper-string-parser': 7.22.5 - '@babel/helper-validator-identifier': 7.22.15 + '@babel/helper-validator-identifier': 7.22.20 to-fast-properties: 2.0.0 dev: true @@ -1218,7 +1225,7 @@ packages: dev: true optional: true - /@cypress/code-coverage@3.12.0(@babel/core@7.22.17)(@babel/preset-env@7.22.15)(babel-loader@9.1.3)(cypress@12.17.4)(webpack@5.88.2): + /@cypress/code-coverage@3.12.0(@babel/core@7.22.20)(@babel/preset-env@7.22.20)(babel-loader@9.1.3)(cypress@12.17.3)(webpack@5.88.2): resolution: {integrity: sha512-Z4Lk/ckBc9Mv11vXMp1ike5MtIYsHCCu7Wtp4uWTcFEshi9uSbBNS6v2cwhf0beUThph0EXsVtKMi7EFAdM1Mw==} peerDependencies: '@babel/core': ^7.0.1 @@ -1227,12 +1234,12 @@ packages: cypress: '*' webpack: ^4 || ^5 dependencies: - '@babel/core': 7.22.17 - '@babel/preset-env': 7.22.15(@babel/core@7.22.17) - '@cypress/webpack-preprocessor': 5.17.1(@babel/core@7.22.17)(@babel/preset-env@7.22.15)(babel-loader@9.1.3)(webpack@5.88.2) - babel-loader: 9.1.3(@babel/core@7.22.17)(webpack@5.88.2) + '@babel/core': 7.22.20 + '@babel/preset-env': 7.22.20(@babel/core@7.22.20) + '@cypress/webpack-preprocessor': 5.17.1(@babel/core@7.22.20)(@babel/preset-env@7.22.20)(babel-loader@9.1.3)(webpack@5.88.2) + babel-loader: 9.1.3(@babel/core@7.22.20)(webpack@5.88.2) chalk: 4.1.2 - cypress: 12.17.4 + cypress: 12.17.3 dayjs: 1.11.9 debug: 4.3.4(supports-color@8.1.1) execa: 4.1.0 @@ -1291,7 +1298,7 @@ packages: - webpack-cli dev: true - /@cypress/webpack-preprocessor@5.17.1(@babel/core@7.22.17)(@babel/preset-env@7.22.15)(babel-loader@9.1.3)(webpack@5.88.2): + /@cypress/webpack-preprocessor@5.17.1(@babel/core@7.22.20)(@babel/preset-env@7.22.20)(babel-loader@9.1.3)(webpack@5.88.2): resolution: {integrity: sha512-FE/e8ikPc8z4EVopJCaior3RGy0jd2q9Xcp5NtiwNG4XnLfEnUFTZlAGwXe75sEh4fNMPrBJW1KIz77PX5vGAw==} peerDependencies: '@babel/core': ^7.0.1 @@ -1299,9 +1306,9 @@ packages: babel-loader: ^8.0.2 || ^9 webpack: ^4 || ^5 dependencies: - '@babel/core': 7.22.17 - '@babel/preset-env': 7.22.15(@babel/core@7.22.17) - babel-loader: 9.1.3(@babel/core@7.22.17)(webpack@5.88.2) + '@babel/core': 7.22.20 + '@babel/preset-env': 7.22.20(@babel/core@7.22.20) + babel-loader: 9.1.3(@babel/core@7.22.20)(webpack@5.88.2) bluebird: 3.7.1 debug: 4.3.4(supports-color@8.1.1) lodash: 4.17.21 @@ -1365,7 +1372,7 @@ packages: dependencies: '@types/istanbul-lib-coverage': 2.0.4 '@types/istanbul-reports': 3.0.1 - '@types/node': 20.6.0 + '@types/node': 20.6.3 '@types/yargs': 15.0.15 chalk: 4.1.2 dev: true @@ -1505,17 +1512,17 @@ packages: engines: {node: '>=4'} dev: true - /@synthetixio/synpress@3.7.2-beta.5(@babel/core@7.22.17)(@babel/preset-env@7.22.15)(babel-loader@9.1.3)(react-dom@18.2.0)(react@18.2.0)(typescript@5.1.6)(webpack@5.88.2): - resolution: {integrity: sha512-t0bTNsep7Pz/KYWzbdUrzPG6YFpR3bZ7O5AVMC2oiTxPC99fFob9HIiQWMNQq9oWMskJiyCm+7b4d5tGCEIh2g==} + /@synthetixio/synpress@3.7.2-beta.7(@babel/core@7.22.20)(@babel/preset-env@7.22.20)(babel-loader@9.1.3)(react-dom@18.2.0)(react@18.2.0)(typescript@5.1.6)(webpack@5.88.2)(zod@3.22.2): + resolution: {integrity: sha512-V5Z59fbzMIv3BVjzfMElD+eR+3C1q3mKPR6RJh9C0GpAnsBLtH2c2cPgBV2QgHBdmaJLFxEQBBud6Sb05w2jcw==} engines: {node: '>=14'} hasBin: true dependencies: - '@cypress/code-coverage': 3.12.0(@babel/core@7.22.17)(@babel/preset-env@7.22.15)(babel-loader@9.1.3)(cypress@12.17.4)(webpack@5.88.2) + '@cypress/code-coverage': 3.12.0(@babel/core@7.22.20)(@babel/preset-env@7.22.20)(babel-loader@9.1.3)(cypress@12.17.3)(webpack@5.88.2) '@cypress/webpack-dev-server': 3.6.1(debug@4.3.4)(webpack@5.88.2) '@drptbl/gremlins.js': 2.2.1 '@foundry-rs/easy-foundryup': 0.1.3 '@playwright/test': 1.37.1 - '@testing-library/cypress': 9.0.0(cypress@12.17.4) + '@testing-library/cypress': 9.0.0(cypress@12.17.3) '@testing-library/react': 14.0.0(react-dom@18.2.0)(react@18.2.0) '@types/testing-library__cypress': 5.0.9 '@viem/anvil': 0.0.6(debug@4.3.4) @@ -1528,7 +1535,7 @@ packages: babel-plugin-transform-react-styled-components-qa: 2.1.0 bytes32: 0.0.3 commander: 11.0.0 - cypress: 12.17.4 + cypress: 12.17.3 cypress-wait-until: 2.0.1 debug: 4.3.4(supports-color@8.1.1) dotenv: 16.3.1 @@ -1540,7 +1547,7 @@ packages: get-port: 7.0.0 node-fetch: 2.7.0 underscore: 1.13.6 - viem: 1.10.8(typescript@5.1.6) + viem: 1.10.8(typescript@5.1.6)(zod@3.22.2) wait-on: 7.0.1(debug@4.3.4) transitivePeerDependencies: - '@babel/core' @@ -1558,7 +1565,7 @@ packages: - zod dev: true - /@testing-library/cypress@9.0.0(cypress@12.17.4): + /@testing-library/cypress@9.0.0(cypress@12.17.3): resolution: {integrity: sha512-c1XiCGeHGGTWn0LAU12sFUfoX3qfId5gcSE2yHode+vsyHDWraxDPALjVnHd4/Fa3j4KBcc5k++Ccy6A9qnkMA==} engines: {node: '>=12', npm: '>=6'} peerDependencies: @@ -1566,7 +1573,7 @@ packages: dependencies: '@babel/runtime': 7.22.15 '@testing-library/dom': 8.20.1 - cypress: 12.17.4 + cypress: 12.17.3 dev: true /@testing-library/dom@7.31.2: @@ -1637,26 +1644,26 @@ packages: resolution: {integrity: sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==} dependencies: '@types/connect': 3.4.36 - '@types/node': 20.6.0 + '@types/node': 20.6.3 dev: true /@types/bonjour@3.5.10: resolution: {integrity: sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw==} dependencies: - '@types/node': 20.6.0 + '@types/node': 20.6.3 dev: true /@types/connect-history-api-fallback@1.5.1: resolution: {integrity: sha512-iaQslNbARe8fctL5Lk+DsmgWOM83lM+7FzP0eQUJs1jd3kBE8NWqBTIT2S8SqQOJjxvt2eyIjpOuYeRXq2AdMw==} dependencies: '@types/express-serve-static-core': 4.17.36 - '@types/node': 20.6.0 + '@types/node': 20.6.3 dev: true /@types/connect@3.4.36: resolution: {integrity: sha512-P63Zd/JUGq+PdrM1lv0Wv5SBYeA2+CORvbrXbngriYY0jzLUWfQMQQxOhjONEz/wlHOAxOdY7CY65rgQdTjq2w==} dependencies: - '@types/node': 20.6.0 + '@types/node': 20.6.3 dev: true /@types/eslint-scope@3.7.4: @@ -1670,7 +1677,7 @@ packages: resolution: {integrity: sha512-sdPRb9K6iL5XZOmBubg8yiFp5yS/JdUDQsq5e6h95km91MCYMuvp7mh1fjPEYUhvHepKpZOjnEaMBR4PxjWDzg==} dependencies: '@types/estree': 1.0.1 - '@types/json-schema': 7.0.12 + '@types/json-schema': 7.0.13 dev: true /@types/estree@1.0.1: @@ -1680,7 +1687,7 @@ packages: /@types/express-serve-static-core@4.17.36: resolution: {integrity: sha512-zbivROJ0ZqLAtMzgzIUC4oNqDG9iF0lSsAqpOD9kbs5xcIM3dTiyuHvBc7R8MtWBp3AAWGaovJa+wzWPjLYW7Q==} dependencies: - '@types/node': 20.6.0 + '@types/node': 20.6.3 '@types/qs': 6.9.8 '@types/range-parser': 1.2.4 '@types/send': 0.17.1 @@ -1710,7 +1717,7 @@ packages: /@types/http-proxy@1.17.11: resolution: {integrity: sha512-HC8G7c1WmaF2ekqpnFq626xd3Zz0uvaqFmBJNRZCGEZCXkvSdJoNFn/8Ygbd9fKNQj8UzLdCETaI0UWPAjK7IA==} dependencies: - '@types/node': 20.6.0 + '@types/node': 20.6.3 dev: true /@types/istanbul-lib-coverage@2.0.4: @@ -1729,14 +1736,14 @@ packages: '@types/istanbul-lib-report': 3.0.0 dev: true - /@types/json-schema@7.0.12: - resolution: {integrity: sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==} + /@types/json-schema@7.0.13: + resolution: {integrity: sha512-RbSSoHliUbnXj3ny0CNFOoxrIDV6SUGyStHsvDqosw6CkdPV8TtWGlfecuK4ToyMEAql6pzNxgCFKanovUzlgQ==} dev: true /@types/keyv@3.1.4: resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} dependencies: - '@types/node': 20.6.0 + '@types/node': 20.6.3 dev: true /@types/mime@1.3.2: @@ -1759,6 +1766,10 @@ packages: resolution: {integrity: sha512-najjVq5KN2vsH2U/xyh2opaSEz6cZMR2SetLIlxlj08nOcmPOemJmUK2o4kUzfLqfrWE0PIrNeE16XhYDd3nqg==} dev: true + /@types/node@20.6.3: + resolution: {integrity: sha512-HksnYH4Ljr4VQgEy2lTStbCKv/P590tmPe5HqOnv9Gprffgv5WXAY+Y5Gqniu0GGqeTCUdBnzC3QSrzPkBkAMA==} + dev: true + /@types/prop-types@15.7.5: resolution: {integrity: sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==} dev: true @@ -1788,7 +1799,7 @@ packages: /@types/responselike@1.0.0: resolution: {integrity: sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==} dependencies: - '@types/node': 20.6.0 + '@types/node': 20.6.3 dev: true /@types/retry@0.12.0: @@ -1803,7 +1814,7 @@ packages: resolution: {integrity: sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q==} dependencies: '@types/mime': 1.3.2 - '@types/node': 20.6.0 + '@types/node': 20.6.3 dev: true /@types/serve-index@1.9.1: @@ -1817,7 +1828,7 @@ packages: dependencies: '@types/http-errors': 2.0.1 '@types/mime': 3.0.1 - '@types/node': 20.6.0 + '@types/node': 20.6.3 dev: true /@types/sinonjs__fake-timers@8.1.1: @@ -1831,15 +1842,15 @@ packages: /@types/sockjs@0.3.33: resolution: {integrity: sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw==} dependencies: - '@types/node': 20.6.0 + '@types/node': 20.6.3 dev: true /@types/source-list-map@0.1.2: resolution: {integrity: sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA==} dev: true - /@types/tapable@1.0.8: - resolution: {integrity: sha512-ipixuVrh2OdNmauvtT51o3d8z12p6LtFW9in7U79der/kwejjdNchQC5UMn5u/KxNoM7VHHOs/l8KS8uHxhODQ==} + /@types/tapable@1.0.9: + resolution: {integrity: sha512-fOHIwZua0sRltqWzODGUM6b4ffZrf/vzGUmNXdR+4DzuJP42PMbM5dLKcdzlYvv8bMJ3GALOzkk1q7cDm2zPyA==} dev: true /@types/testing-library__cypress@5.0.9: @@ -1858,7 +1869,7 @@ packages: /@types/webpack-sources@3.2.0: resolution: {integrity: sha512-Ft7YH3lEVRQ6ls8k4Ff1oB4jN6oy/XmU6tQISKdhfh+1mR+viZFphS6WL0IrtDOzvefmJg5a0s7ZQoRXwqTEFg==} dependencies: - '@types/node': 20.6.0 + '@types/node': 20.6.3 '@types/source-list-map': 0.1.2 source-map: 0.7.4 dev: true @@ -1866,8 +1877,8 @@ packages: /@types/webpack@4.41.33: resolution: {integrity: sha512-PPajH64Ft2vWevkerISMtnZ8rTs4YmRbs+23c402J0INmxDKCrhZNvwZYtzx96gY2wAtXdrK1BS2fiC8MlLr3g==} dependencies: - '@types/node': 20.6.0 - '@types/tapable': 1.0.8 + '@types/node': 20.6.3 + '@types/tapable': 1.0.9 '@types/uglify-js': 3.17.2 '@types/webpack-sources': 3.2.0 anymatch: 3.1.3 @@ -1894,7 +1905,7 @@ packages: resolution: {integrity: sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw==} requiresBuild: true dependencies: - '@types/node': 16.18.50 + '@types/node': 20.6.3 dev: true optional: true @@ -2025,7 +2036,7 @@ packages: resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} dev: true - /abitype@0.9.8(typescript@5.1.6): + /abitype@0.9.8(typescript@5.1.6)(zod@3.22.2): resolution: {integrity: sha512-puLifILdm+8sjyss4S+fsUN09obiT1g2YW6CtcQF+QDzxR0euzgEB29MZujC6zMk2a6SVmtttq1fc6+YFA7WYQ==} peerDependencies: typescript: '>=5.0.4' @@ -2037,6 +2048,7 @@ packages: optional: true dependencies: typescript: 5.1.6 + zod: 3.22.2 dev: true /accepts@1.3.8: @@ -2272,8 +2284,8 @@ packages: engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.22.1 + define-properties: 1.2.1 + es-abstract: 1.22.2 es-array-method-boxes-properly: 1.0.0 is-string: 1.0.7 dev: true @@ -2284,8 +2296,8 @@ packages: dependencies: array-buffer-byte-length: 1.0.0 call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.22.1 + define-properties: 1.2.1 + es-abstract: 1.22.2 get-intrinsic: 1.2.1 is-array-buffer: 3.0.2 is-shared-array-buffer: 1.0.2 @@ -2368,14 +2380,14 @@ packages: - debug dev: true - /babel-loader@9.1.3(@babel/core@7.22.17)(webpack@5.88.2): + /babel-loader@9.1.3(@babel/core@7.22.20)(webpack@5.88.2): resolution: {integrity: sha512-xG3ST4DglodGf8qSwv0MdeWLhrDsw/32QMdTO5T1ZIp9gQur0HkCyFs7Awskr10JKXFXwpAhiCuYX5oGXnRGbw==} engines: {node: '>= 14.15.0'} peerDependencies: '@babel/core': ^7.12.0 webpack: '>=5' dependencies: - '@babel/core': 7.22.17 + '@babel/core': 7.22.20 find-cache-dir: 4.0.0 schema-utils: 4.2.0 webpack: 5.88.2 @@ -2394,38 +2406,38 @@ packages: - supports-color dev: true - /babel-plugin-polyfill-corejs2@0.4.5(@babel/core@7.22.17): + /babel-plugin-polyfill-corejs2@0.4.5(@babel/core@7.22.20): resolution: {integrity: sha512-19hwUH5FKl49JEsvyTcoHakh6BE0wgXLLptIyKZ3PijHc/Ci521wygORCUCCred+E/twuqRyAkE02BAWPmsHOg==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 dependencies: - '@babel/compat-data': 7.22.9 - '@babel/core': 7.22.17 - '@babel/helper-define-polyfill-provider': 0.4.2(@babel/core@7.22.17) + '@babel/compat-data': 7.22.20 + '@babel/core': 7.22.20 + '@babel/helper-define-polyfill-provider': 0.4.2(@babel/core@7.22.20) semver: 6.3.1 transitivePeerDependencies: - supports-color dev: true - /babel-plugin-polyfill-corejs3@0.8.3(@babel/core@7.22.17): + /babel-plugin-polyfill-corejs3@0.8.3(@babel/core@7.22.20): resolution: {integrity: sha512-z41XaniZL26WLrvjy7soabMXrfPWARN25PZoriDEiLMxAp50AUW3t35BGQUMg5xK3UrpVTtagIDklxYa+MhiNA==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 dependencies: - '@babel/core': 7.22.17 - '@babel/helper-define-polyfill-provider': 0.4.2(@babel/core@7.22.17) + '@babel/core': 7.22.20 + '@babel/helper-define-polyfill-provider': 0.4.2(@babel/core@7.22.20) core-js-compat: 3.32.2 transitivePeerDependencies: - supports-color dev: true - /babel-plugin-polyfill-regenerator@0.5.2(@babel/core@7.22.17): + /babel-plugin-polyfill-regenerator@0.5.2(@babel/core@7.22.20): resolution: {integrity: sha512-tAlOptU0Xj34V1Y2PNTL4Y0FOJMDB6bZmoW39FeCQIhigGLkqu3Fj6uiXpxIf6Ij274ENdYx64y6Au+ZKlb1IA==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 dependencies: - '@babel/core': 7.22.17 - '@babel/helper-define-polyfill-provider': 0.4.2(@babel/core@7.22.17) + '@babel/core': 7.22.20 + '@babel/helper-define-polyfill-provider': 0.4.2(@babel/core@7.22.20) transitivePeerDependencies: - supports-color dev: true @@ -2502,6 +2514,10 @@ packages: engines: {node: '>=8'} dev: true + /bintrees@1.0.2: + resolution: {integrity: sha512-VOMgTMwjAaUG580SXn3LacVgjurrbMme7ZZNYGSSV7mmtY6QQRh0Eg3pwIcntQ77DErK1L0NxkbetjcoXzVwKw==} + dev: false + /bl@1.2.3: resolution: {integrity: sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww==} dependencies: @@ -2997,6 +3013,56 @@ packages: resolution: {integrity: sha512-+IyVnYNiaX1+C+V/LazrJWAi/CqiwfNoRSrFviECQEyolW1gDRy765PZosL2alSSGK8V10Y7BGfOQyZUDgmnjQ==} dev: true + /cypress@12.17.3: + resolution: {integrity: sha512-/R4+xdIDjUSLYkiQfwJd630S81KIgicmQOLXotFxVXkl+eTeVO+3bHXxdi5KBh/OgC33HWN33kHX+0tQR/ZWpg==} + engines: {node: ^14.0.0 || ^16.0.0 || >=18.0.0} + hasBin: true + requiresBuild: true + dependencies: + '@cypress/request': 2.88.12 + '@cypress/xvfb': 1.2.4(supports-color@8.1.1) + '@types/node': 16.18.50 + '@types/sinonjs__fake-timers': 8.1.1 + '@types/sizzle': 2.3.3 + arch: 2.2.0 + blob-util: 2.0.2 + bluebird: 3.7.2 + buffer: 5.7.1 + cachedir: 2.4.0 + chalk: 4.1.2 + check-more-types: 2.24.0 + cli-cursor: 3.1.0 + cli-table3: 0.6.3 + commander: 6.2.1 + common-tags: 1.8.2 + dayjs: 1.11.9 + debug: 4.3.4(supports-color@8.1.1) + enquirer: 2.4.1 + eventemitter2: 6.4.7 + execa: 4.1.0 + executable: 4.1.1 + extract-zip: 2.0.1(supports-color@8.1.1) + figures: 3.2.0 + fs-extra: 9.1.0 + getos: 3.2.1 + is-ci: 3.0.1 + is-installed-globally: 0.4.0 + lazy-ass: 1.6.0 + listr2: 3.14.0(enquirer@2.4.1) + lodash: 4.17.21 + log-symbols: 4.1.0 + minimist: 1.2.8 + ospath: 1.2.2 + pretty-bytes: 5.6.0 + proxy-from-env: 1.0.0 + request-progress: 3.0.0 + semver: 7.5.4 + supports-color: 8.1.1 + tmp: 0.2.1 + untildify: 4.0.0 + yauzl: 2.10.0 + dev: true + /cypress@12.17.4: resolution: {integrity: sha512-gAN8Pmns9MA5eCDFSDJXWKUpaL3IDd89N9TtIupjYnzLSmlpVr+ZR+vb4U/qaMp+lB6tBvAmt7504c3Z4RU5KQ==} engines: {node: ^14.0.0 || ^16.0.0 || >=18.0.0} @@ -3181,7 +3247,7 @@ packages: object-is: 1.1.5 object-keys: 1.1.1 object.assign: 4.1.4 - regexp.prototype.flags: 1.5.0 + regexp.prototype.flags: 1.5.1 side-channel: 1.0.4 which-boxed-primitive: 1.0.2 which-collection: 1.0.1 @@ -3202,15 +3268,25 @@ packages: strip-bom: 4.0.0 dev: true + /define-data-property@1.1.0: + resolution: {integrity: sha512-UzGwzcjyv3OtAvolTj1GoyNYzfFR+iqbGjcnBEENZVCpM4/Ng1yhGNvS3lR/xDS74Tb2wGG9WzNSNIOS9UVb2g==} + engines: {node: '>= 0.4'} + dependencies: + get-intrinsic: 1.2.1 + gopd: 1.0.1 + has-property-descriptors: 1.0.0 + dev: true + /define-lazy-prop@2.0.0: resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} engines: {node: '>=8'} dev: true - /define-properties@1.2.0: - resolution: {integrity: sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==} + /define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} engines: {node: '>= 0.4'} dependencies: + define-data-property: 1.1.0 has-property-descriptors: 1.0.0 object-keys: 1.1.1 dev: true @@ -3396,8 +3472,8 @@ packages: resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==} dev: true - /es-abstract@1.22.1: - resolution: {integrity: sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw==} + /es-abstract@1.22.2: + resolution: {integrity: sha512-YoxfFcDmhjOgWPWsV13+2RNjq1F6UQnfs+8TftwNqtzlmFzEXvlUwdrNrYeaizfjQzRMxkZ6ElWMOJIFKdVqwA==} engines: {node: '>= 0.4'} dependencies: array-buffer-byte-length: 1.0.0 @@ -3427,7 +3503,7 @@ packages: object-inspect: 1.12.3 object-keys: 1.1.1 object.assign: 4.1.4 - regexp.prototype.flags: 1.5.0 + regexp.prototype.flags: 1.5.1 safe-array-concat: 1.0.1 safe-regex-test: 1.0.0 string.prototype.trim: 1.2.8 @@ -3459,8 +3535,8 @@ packages: stop-iteration-iterator: 1.0.0 dev: true - /es-module-lexer@1.3.0: - resolution: {integrity: sha512-vZK7T0N2CBmBOixhmjdqx2gWVbFZ4DXZ/NyRMZVlJXPa7CyFS+/a4QQsDGDQy9ZfEzxFuNEsMLeQJnKP2p5/JA==} + /es-module-lexer@1.3.1: + resolution: {integrity: sha512-JUFAyicQV9mXc3YRxPnDlrfBKpqt6hUYzz9/boprUJHs4e4KVr3XwOF70doO6gwXUor6EWZJAyWAfKki84t20Q==} dev: true /es-set-tostringtag@2.0.1: @@ -3992,8 +4068,8 @@ packages: engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.22.1 + define-properties: 1.2.1 + es-abstract: 1.22.2 functions-have-names: 1.2.3 dev: true @@ -4139,7 +4215,7 @@ packages: resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} engines: {node: '>= 0.4'} dependencies: - define-properties: 1.2.0 + define-properties: 1.2.1 dev: true /globby@11.0.4: @@ -4321,7 +4397,7 @@ packages: he: 1.2.0 param-case: 3.0.4 relateurl: 0.2.7 - terser: 5.19.4 + terser: 5.20.0 dev: true /html-webpack-plugin@4.5.2(webpack@5.88.2): @@ -4331,7 +4407,7 @@ packages: webpack: ^4.0.0 || ^5.0.0 dependencies: '@types/html-minifier-terser': 5.1.2 - '@types/tapable': 1.0.8 + '@types/tapable': 1.0.9 '@types/webpack': 4.41.33 html-minifier-terser: 5.1.1 loader-utils: 1.4.2 @@ -4832,9 +4908,9 @@ packages: resolution: {integrity: sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==} engines: {node: '>=8'} dependencies: - '@babel/core': 7.22.17 + '@babel/core': 7.22.20 '@istanbuljs/schema': 0.1.3 - istanbul-lib-coverage: 3.0.0 + istanbul-lib-coverage: 3.2.0 semver: 6.3.1 transitivePeerDependencies: - supports-color @@ -4844,7 +4920,7 @@ packages: resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} engines: {node: '>=8'} dependencies: - '@babel/core': 7.22.17 + '@babel/core': 7.22.20 '@babel/parser': 7.22.16 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.0 @@ -4869,7 +4945,7 @@ packages: resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} engines: {node: '>=10'} dependencies: - istanbul-lib-coverage: 3.0.0 + istanbul-lib-coverage: 3.2.0 make-dir: 4.0.0 supports-color: 7.2.0 dev: true @@ -4879,7 +4955,7 @@ packages: engines: {node: '>=10'} dependencies: debug: 4.3.4(supports-color@8.1.1) - istanbul-lib-coverage: 3.0.0 + istanbul-lib-coverage: 3.2.0 source-map: 0.6.1 transitivePeerDependencies: - supports-color @@ -4905,7 +4981,7 @@ packages: resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} engines: {node: '>= 10.13.0'} dependencies: - '@types/node': 20.6.0 + '@types/node': 20.6.3 merge-stream: 2.0.0 supports-color: 8.1.1 dev: true @@ -5413,7 +5489,7 @@ packages: foreground-child: 2.0.0 get-package-type: 0.1.0 glob: 7.2.3 - istanbul-lib-coverage: 3.0.0 + istanbul-lib-coverage: 3.2.0 istanbul-lib-hook: 3.0.0 istanbul-lib-instrument: 4.0.3 istanbul-lib-processinfo: 2.0.3 @@ -5448,7 +5524,7 @@ packages: engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 - define-properties: 1.2.0 + define-properties: 1.2.1 dev: true /object-keys@1.1.1: @@ -5461,7 +5537,7 @@ packages: engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 - define-properties: 1.2.0 + define-properties: 1.2.1 has-symbols: 1.0.3 object-keys: 1.1.1 dev: true @@ -5472,8 +5548,8 @@ packages: dependencies: array.prototype.reduce: 1.0.6 call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.22.1 + define-properties: 1.2.1 + es-abstract: 1.22.2 safe-array-concat: 1.0.1 dev: true @@ -5817,6 +5893,13 @@ packages: engines: {node: '>= 0.6.0'} dev: true + /prom-client@14.2.0: + resolution: {integrity: sha512-sF308EhTenb/pDRPakm+WgiN+VdM/T1RaHj1x+MvAuT8UiQP8JmOEbxVqtkbfR4LrvOg5n7ic01kRBDGXjYikA==} + engines: {node: '>=10'} + dependencies: + tdigest: 0.1.2 + dev: false + /proxy-addr@2.0.7: resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} engines: {node: '>= 0.10'} @@ -5956,8 +6039,8 @@ packages: picomatch: 2.3.1 dev: true - /regenerate-unicode-properties@10.1.0: - resolution: {integrity: sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==} + /regenerate-unicode-properties@10.1.1: + resolution: {integrity: sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==} engines: {node: '>=4'} dependencies: regenerate: 1.4.2 @@ -5981,13 +6064,13 @@ packages: '@babel/runtime': 7.22.15 dev: true - /regexp.prototype.flags@1.5.0: - resolution: {integrity: sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==} + /regexp.prototype.flags@1.5.1: + resolution: {integrity: sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 - define-properties: 1.2.0 - functions-have-names: 1.2.3 + define-properties: 1.2.1 + set-function-name: 2.0.1 dev: true /regexpu-core@5.3.2: @@ -5996,7 +6079,7 @@ packages: dependencies: '@babel/regjsgen': 0.8.0 regenerate: 1.4.2 - regenerate-unicode-properties: 10.1.0 + regenerate-unicode-properties: 10.1.1 regjsparser: 0.9.1 unicode-match-property-ecmascript: 2.0.0 unicode-match-property-value-ecmascript: 2.1.0 @@ -6070,8 +6153,8 @@ packages: engines: {node: '>=8'} dev: true - /resolve@1.22.4: - resolution: {integrity: sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==} + /resolve@1.22.6: + resolution: {integrity: sha512-njhxM7mV12JfufShqGy3Rz8j11RPdLy4xi15UurGJeoHLfJpVXKdh3ueuOqbYUcDZnffr6X739JBo5LzyahEsw==} hasBin: true dependencies: is-core-module: 2.13.0 @@ -6166,7 +6249,7 @@ packages: resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==} engines: {node: '>= 10.13.0'} dependencies: - '@types/json-schema': 7.0.12 + '@types/json-schema': 7.0.13 ajv: 6.12.6 ajv-keywords: 3.5.2(ajv@6.12.6) dev: true @@ -6175,7 +6258,7 @@ packages: resolution: {integrity: sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==} engines: {node: '>= 12.13.0'} dependencies: - '@types/json-schema': 7.0.12 + '@types/json-schema': 7.0.13 ajv: 8.12.0 ajv-formats: 2.1.1(ajv@8.12.0) ajv-keywords: 5.1.0(ajv@8.12.0) @@ -6275,6 +6358,15 @@ packages: resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} dev: true + /set-function-name@2.0.1: + resolution: {integrity: sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==} + engines: {node: '>= 0.4'} + dependencies: + define-data-property: 1.1.0 + functions-have-names: 1.2.3 + has-property-descriptors: 1.0.0 + dev: true + /setprototypeof@1.1.0: resolution: {integrity: sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==} dev: true @@ -6503,24 +6595,24 @@ packages: engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.22.1 + define-properties: 1.2.1 + es-abstract: 1.22.2 dev: true /string.prototype.trimend@1.0.7: resolution: {integrity: sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==} dependencies: call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.22.1 + define-properties: 1.2.1 + es-abstract: 1.22.2 dev: true /string.prototype.trimstart@1.0.7: resolution: {integrity: sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==} dependencies: call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.22.1 + define-properties: 1.2.1 + es-abstract: 1.22.2 dev: true /string_decoder@1.1.1: @@ -6640,6 +6732,12 @@ packages: xtend: 4.0.2 dev: true + /tdigest@0.1.2: + resolution: {integrity: sha512-+G0LLgjjo9BZX2MfdvPfH+MKLCrxlXSYec5DaPYP1fe6Iyhf0/fSmJ0bFiZ1F8BT6cGXl2LpltQptzjXKWEkKA==} + dependencies: + bintrees: 1.0.2 + dev: false + /terser-webpack-plugin@5.3.9(webpack@5.88.2): resolution: {integrity: sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==} engines: {node: '>= 10.13.0'} @@ -6660,7 +6758,7 @@ packages: jest-worker: 27.5.1 schema-utils: 3.3.0 serialize-javascript: 6.0.1 - terser: 5.19.4 + terser: 5.20.0 webpack: 5.88.2 dev: true @@ -6675,8 +6773,8 @@ packages: source-map-support: 0.5.21 dev: true - /terser@5.19.4: - resolution: {integrity: sha512-6p1DjHeuluwxDXcuT9VR8p64klWJKo1ILiy19s6C9+0Bh2+NWTX6nD9EPppiER4ICkHDVB1RkVpin/YW2nQn/g==} + /terser@5.20.0: + resolution: {integrity: sha512-e56ETryaQDyebBwJIWYB2TT6f2EZ0fL0sW/JRXNMN26zZdKi2u/E/5my5lG6jNxym6qsrVXfFRmOdV42zlAgLQ==} engines: {node: '>=10'} hasBin: true dependencies: @@ -6974,7 +7072,7 @@ packages: /util.promisify@1.0.0: resolution: {integrity: sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==} dependencies: - define-properties: 1.2.0 + define-properties: 1.2.1 object.getownpropertydescriptors: 2.1.7 dev: true @@ -7006,7 +7104,7 @@ packages: extsprintf: 1.3.0 dev: true - /viem@1.10.8(typescript@5.1.6): + /viem@1.10.8(typescript@5.1.6)(zod@3.22.2): resolution: {integrity: sha512-/kVDjc9j1OVoDsxV0E1iw1ehPuWPXv5x/9Yc1H0wKky6ACWRoKsURDeLi0Xwtli7vmFcJne+MMPhA96zVu5iIg==} peerDependencies: typescript: '>=5.0.4' @@ -7020,7 +7118,7 @@ packages: '@scure/bip32': 1.3.2 '@scure/bip39': 1.2.1 '@types/ws': 8.5.5 - abitype: 0.9.8(typescript@5.1.6) + abitype: 0.9.8(typescript@5.1.6)(zod@3.22.2) isomorphic-ws: 5.0.0(ws@8.13.0) typescript: 5.1.6 ws: 8.13.0 @@ -7160,7 +7258,7 @@ packages: browserslist: 4.21.10 chrome-trace-event: 1.0.3 enhanced-resolve: 5.15.0 - es-module-lexer: 1.3.0 + es-module-lexer: 1.3.1 eslint-scope: 5.1.1 events: 3.3.0 glob-to-regexp: 0.4.1 @@ -7370,3 +7468,6 @@ packages: resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} engines: {node: '>=12.20'} dev: true + + /zod@3.22.2: + resolution: {integrity: sha512-wvWkphh5WQsJbVk1tbx1l1Ly4yg+XecD+Mq280uBGt9wa5BKSWf4Mhp6GmrkPixhMxmabYY7RbzlwVP32pbGCg==} diff --git a/ufm-test-services/metamask/tests/metamask.spec.ts b/ufm-test-services/metamask/tests/metamask.spec.ts index e5df307ff946..c3581f56ecde 100644 --- a/ufm-test-services/metamask/tests/metamask.spec.ts +++ b/ufm-test-services/metamask/tests/metamask.spec.ts @@ -1,17 +1,29 @@ import 'dotenv/config' +import { z } from 'zod' import metamask from '@synthetixio/synpress/commands/metamask.js' import { expect, test, type Page } from '@playwright/test' import { mnemonicToAccount, privateKeyToAccount } from 'viem/accounts' import { testWithSynpress } from './testWithSynpressUtil' +import { + getMetamaskTxCounterValue, + incrementMetamaskTxCounter, + setMetamaskTxCounter, +} from './prometheusUtils' + +const env = z.object({ + METAMASK_SECRET_WORDS_OR_PRIVATEKEY: z.string(), + OP_GOERLI_RPC_URL: z.string().url(), + METAMASK_DAPP_URL: z.string().url() +}).parse(process.env) const expectedSender = - process.env.METAMASK_SECRET_WORDS_OR_PRIVATEKEY?.startsWith('0x') + env.METAMASK_SECRET_WORDS_OR_PRIVATEKEY?.startsWith('0x') ? privateKeyToAccount( - process.env.METAMASK_SECRET_WORDS_OR_PRIVATEKEY as `0x${string}` + env.METAMASK_SECRET_WORDS_OR_PRIVATEKEY as `0x${string}` ).address.toLowerCase() : mnemonicToAccount( - process.env.METAMASK_SECRET_WORDS_OR_PRIVATEKEY as string + env.METAMASK_SECRET_WORDS_OR_PRIVATEKEY as string ).address.toLowerCase() const expectedRecipient = '0x8fcfbe8953433fd1f2e8375ee99057833e4e1e9e' @@ -35,7 +47,7 @@ testWithSynpress('Add OP Goerli network', async () => { name: 'op-goerli', rpcUrls: { default: { - http: [process.env.OP_GOERLI_RPC_URL], + http: [env.OP_GOERLI_RPC_URL], }, }, id: '420', @@ -49,13 +61,26 @@ testWithSynpress('Add OP Goerli network', async () => { }, }) - await expect(sharedPage.locator('#chainId')).toHaveText(expectedChainId) + try { + await expect(sharedPage.locator('#chainId')).toHaveText(expectedChainId) + } catch (error) { + await setMetamaskTxCounter(true, 0) + await incrementMetamaskTxCounter(false) + throw error + } }) test(`Connect wallet with ${expectedSender}`, async () => { await sharedPage.click('#connectButton') await metamask.acceptAccess() - await expect(sharedPage.locator('#accounts')).toHaveText(expectedSender) + + try { + await expect(sharedPage.locator('#accounts')).toHaveText(expectedSender) + } catch (error) { + await setMetamaskTxCounter(true, 0) + await incrementMetamaskTxCounter(false) + throw error + } }) test('Send an EIP-1559 transaciton and verfiy success', async () => { @@ -76,17 +101,14 @@ test('Send an EIP-1559 transaciton and verfiy success', async () => { }) }) - await metamask.confirmTransaction() + await metamask.confirmTransactionAndWaitForMining() const txHash = await txHashPromise - // Waiting for Infura (Metamask given provider) to index our transaction - await sharedPage.waitForTimeout(10_000) - // Metamask test dApp allows us access to the Metamask RPC provider via loading this URL. // The RPC reponse will be populated onto the page that's loaded. // More info here: https://github.com/MetaMask/test-dapp/tree/main#usage await sharedPage.goto( - `${process.env.METAMASK_DAPP_URL}/request.html?method=eth_getTransactionReceipt¶ms=["${txHash}"]` + `${env.METAMASK_DAPP_URL}/request.html?method=eth_getTransactionReceipt¶ms=["${txHash}"]` ) // Waiting for RPC response to be populated on the page @@ -98,5 +120,14 @@ test('Send an EIP-1559 transaciton and verfiy success', async () => { '' ) ) - expect(transaction.status).toBe('0x1') + + try { + expect(transaction.status).toBe('0x1') + await setMetamaskTxCounter(false, 0) + await incrementMetamaskTxCounter(true) + } catch (error) { + await setMetamaskTxCounter(true, 0) + await incrementMetamaskTxCounter(false) + throw error + } }) diff --git a/ufm-test-services/metamask/tests/prometheusUtils.ts b/ufm-test-services/metamask/tests/prometheusUtils.ts new file mode 100644 index 000000000000..94dfe47647f9 --- /dev/null +++ b/ufm-test-services/metamask/tests/prometheusUtils.ts @@ -0,0 +1,101 @@ +import 'dotenv/config' +import { z } from 'zod' +import { Counter, Pushgateway } from 'prom-client' + +const env = z + .object({ + PROMETHEUS_SERVER_URL: z.string().url(), + PROMETHEUS_PUSHGATEWAY_URL: z.string().url(), + }) + .parse(process.env) + +const txSuccessMetricName = 'metamask_tx_success' +const txFailureMetricName = 'metamask_tx_failuree' + +const txSuccessCounter = new Counter({ + name: txSuccessMetricName, + help: 'A counter signifying the number of successful transactions sent with Metamask since last failure', +}) +const txFailureCounter = new Counter({ + name: txFailureMetricName, + help: 'A counter signifying the number of failed transactions sent with Metamask since last successful transaction', +}) + +export const getMetamaskTxCounterValue = async (isSuccess: boolean) => { + const metricName = isSuccess ? txSuccessMetricName : txFailureMetricName + const prometheusMetricQuery = `${env.PROMETHEUS_SERVER_URL}/api/v1/query?query=${metricName}` + + const response = await fetch(prometheusMetricQuery) + if (!response.ok) { + console.error(response.status) + console.error(response.statusText) + throw new Error(`Failed to fetch metric from: ${prometheusMetricQuery}`) + } + + // The following is an example of the expect response from prometheusMetricQuery + // for response.json().data.result[0]: + // [ + // { + // metric: { + // __name__: 'metamask_tx_success', + // exported_job: 'metamask_tx_count', + // instance: 'pushgateway:9091', + // job: 'pushgateway' + // }, + // value: [ 1695250414.474, '0' ] + // } + // ] + try { + const responseJson = z + .object({ + data: z.object({ + result: z.array( + z.object({ + value: z.tuple([ + z.number(), + z.number().or(z.string().transform((value) => parseInt(value))), + ]), + }) + ), + }), + }) + .parse(await response.json()) + + return responseJson.data.result[0].value[1] + } catch (error) { + if ( + error.message === "Cannot read properties of undefined (reading 'value')" + ) { + console.warn(`No data found for metric ${metricName} in Prometheus`) + return undefined + } + + throw error + } +} + +export const setMetamaskTxCounter = async ( + isSuccess: boolean, + valueToSetTo: number +) => { + const metricName = isSuccess ? txSuccessMetricName : txFailureMetricName + const txCounter = isSuccess ? txSuccessCounter : txFailureCounter + + txCounter.reset() + console.log(`Setting ${metricName} to ${valueToSetTo}`) + txCounter.inc(valueToSetTo) + + const pushGateway = new Pushgateway(env.PROMETHEUS_PUSHGATEWAY_URL) + await pushGateway.pushAdd({ jobName: 'metamask_tx_count' }) +} + +export const incrementMetamaskTxCounter = async (isSuccess: boolean) => { + const metricName = isSuccess ? txSuccessMetricName : txFailureMetricName + const currentMetricValue = (await getMetamaskTxCounterValue(true)) ?? 0 + console.log( + `Current value of ${metricName} is ${currentMetricValue}, incrementing to ${ + currentMetricValue + 1 + }` + ) + await setMetamaskTxCounter(isSuccess, currentMetricValue + 1) +} diff --git a/ufm-test-services/prometheus.yml b/ufm-test-services/prometheus.yml index fdd91aed32ea..daa885eee676 100644 --- a/ufm-test-services/prometheus.yml +++ b/ufm-test-services/prometheus.yml @@ -1,5 +1,5 @@ global: - scrape_interval: 5s + scrape_interval: 2s scrape_configs: - job_name: 'pushgateway' From 875b54963de9ac674865dc22c38e8a0d58ae0a4c Mon Sep 17 00:00:00 2001 From: Will Cory Date: Wed, 20 Sep 2023 20:12:33 -0700 Subject: [PATCH 76/87] lint --- indexer/config/devnet.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/indexer/config/devnet.go b/indexer/config/devnet.go index 7254104b509a..eb903ddefa9f 100644 --- a/indexer/config/devnet.go +++ b/indexer/config/devnet.go @@ -33,8 +33,8 @@ func GetDevnetPreset() (*Preset, error) { return &Preset{ Name: "devnet", ChainConfig: ChainConfig{ - Preset: DEVNET_L2_CHAIN_ID, - L1Contracts: l1Contracts, + Preset: DEVNET_L2_CHAIN_ID, + L1Contracts: l1Contracts, }, }, nil } From 3a83da39ec9c0dfcaebe7c92475167bbbb4544d5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 21 Sep 2023 05:12:56 +0000 Subject: [PATCH 77/87] build(deps-dev): bump @types/node from 20.5.0 to 20.6.3 Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 20.5.0 to 20.6.3. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node) --- updated-dependencies: - dependency-name: "@types/node" dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- pnpm-lock.yaml | 48 ++++++++++++++++++++++++++---------------------- 1 file changed, 26 insertions(+), 22 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 7ed0fedc91ab..a38181a9342f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -184,7 +184,7 @@ importers: version: 2.17.2(ts-node@10.9.1)(typescript@5.2.2) ts-node: specifier: ^10.9.1 - version: 10.9.1(@types/node@20.6.2)(typescript@5.2.2) + version: 10.9.1(@types/node@20.6.3)(typescript@5.2.2) tsx: specifier: ^3.12.7 version: 3.12.7 @@ -3711,20 +3711,20 @@ packages: /@types/bn.js@4.11.6: resolution: {integrity: sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==} dependencies: - '@types/node': 20.6.2 + '@types/node': 20.6.3 dev: true /@types/bn.js@5.1.0: resolution: {integrity: sha512-QSSVYj7pYFN49kW77o2s9xTCwZ8F2xLbjLLSEVh8D2F4JUhZtPAGOFLTD+ffqksBx/u4cE/KImFjyhqCjn/LIA==} dependencies: - '@types/node': 20.6.2 + '@types/node': 20.6.3 dev: true /@types/body-parser@1.19.1: resolution: {integrity: sha512-a6bTJ21vFOGIkwM0kzh9Yr89ziVxq4vYH2fQ6N8AeipEzai/cFK6aGMArIkUeIdRIgpwQa+2bXiLuUJCpSf2Cg==} dependencies: '@types/connect': 3.4.35 - '@types/node': 20.6.2 + '@types/node': 20.6.3 dev: true /@types/chai-as-promised@7.1.5: @@ -3750,7 +3750,7 @@ packages: /@types/connect@3.4.35: resolution: {integrity: sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==} dependencies: - '@types/node': 20.6.2 + '@types/node': 20.6.3 /@types/dateformat@5.0.0: resolution: {integrity: sha512-SZg4JdHIWHQGEokbYGZSDvo5wA4TLYPXaqhigs/wH+REDOejcJzgH+qyY+HtEUtWOZxEUkbhbdYPqQDiEgrXeA==} @@ -3764,7 +3764,7 @@ packages: /@types/express-serve-static-core@4.17.35: resolution: {integrity: sha512-wALWQwrgiB2AWTT91CB62b6Yt0sNHpznUXeZEcnPU3DRdlDIz74x8Qg1UUYKSVFi+va5vKOLYRBI1bRKiLLKIg==} dependencies: - '@types/node': 20.6.2 + '@types/node': 20.6.3 '@types/qs': 6.9.7 '@types/range-parser': 1.2.4 '@types/send': 0.17.1 @@ -3810,7 +3810,7 @@ packages: dependencies: '@types/abstract-leveldown': 5.0.2 '@types/level-errors': 3.0.0 - '@types/node': 20.6.2 + '@types/node': 20.6.3 dev: true /@types/lru-cache@5.1.1: @@ -3842,7 +3842,7 @@ packages: /@types/mkdirp@0.5.2: resolution: {integrity: sha512-U5icWpv7YnZYGsN4/cmh3WD2onMY0aJIiTE6+51TwJCttdHvtCYmkBNOobHlXwrJRL0nkH9jH4kD+1FAdMN4Tg==} dependencies: - '@types/node': 20.6.2 + '@types/node': 20.6.3 dev: true /@types/mocha@10.0.1: @@ -3861,7 +3861,7 @@ packages: /@types/node-fetch@2.6.4: resolution: {integrity: sha512-1ZX9fcN4Rvkvgv4E6PAY5WXUFWFcRWxZa3EW83UjycOB9ljJCedb2CupIP4RZMEwF/M3eTcCihbBRgwtGbg5Rg==} dependencies: - '@types/node': 20.6.2 + '@types/node': 20.6.3 form-data: 3.0.1 dev: true @@ -3878,6 +3878,10 @@ packages: /@types/node@20.6.2: resolution: {integrity: sha512-Y+/1vGBHV/cYk6OI1Na/LHzwnlNCAfU3ZNGrc1LdRe/LAIbdDPTTv/HU3M7yXN448aTVDq3eKRm2cg7iKLb8gw==} + dev: true + + /@types/node@20.6.3: + resolution: {integrity: sha512-HksnYH4Ljr4VQgEy2lTStbCKv/P590tmPe5HqOnv9Gprffgv5WXAY+Y5Gqniu0GGqeTCUdBnzC3QSrzPkBkAMA==} /@types/normalize-package-data@2.4.1: resolution: {integrity: sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==} @@ -3889,7 +3893,7 @@ packages: /@types/pbkdf2@3.1.0: resolution: {integrity: sha512-Cf63Rv7jCQ0LaL8tNXmEyqTHuIJxRdlS5vMh1mj5voN4+QFhVZnlZruezqpWYDiJ8UTzhP0VmeLXCmBk66YrMQ==} dependencies: - '@types/node': 20.6.2 + '@types/node': 20.6.3 dev: true /@types/pino-multi-stream@5.1.3: @@ -3907,13 +3911,13 @@ packages: /@types/pino-std-serializers@2.4.1: resolution: {integrity: sha512-17XcksO47M24IVTVKPeAByWUd3Oez7EbIjXpSbzMPhXVzgjGtrOa49gKBwxH9hb8dKv58OelsWQ+A1G1l9S3wQ==} dependencies: - '@types/node': 20.6.2 + '@types/node': 20.6.3 dev: true /@types/pino@6.3.11: resolution: {integrity: sha512-S7+fLONqSpHeW9d7TApUqO6VN47KYgOXhCNKwGBVLHObq8HhaAYlVqUNdfnvoXjCMiwE5xcPm/5R2ZUh8bgaXQ==} dependencies: - '@types/node': 20.6.2 + '@types/node': 20.6.3 '@types/pino-pretty': 4.7.1 '@types/pino-std-serializers': 2.4.1 sonic-boom: 2.8.0 @@ -3959,7 +3963,7 @@ packages: /@types/readable-stream@2.3.15: resolution: {integrity: sha512-oM5JSKQCcICF1wvGgmecmHldZ48OZamtMxcGGVICOJA8o8cahXC1zEVAif8iwoc5j8etxFaRFnf095+CDsuoFQ==} dependencies: - '@types/node': 20.6.2 + '@types/node': 20.6.3 safe-buffer: 5.1.2 dev: true @@ -3970,7 +3974,7 @@ packages: /@types/secp256k1@4.0.3: resolution: {integrity: sha512-Da66lEIFeIz9ltsdMZcpQvmrmmoqrfju8pm1BH8WbYjZSwUgCwXLb9C+9XYogwBITnbsSaMdVPb2ekf7TV+03w==} dependencies: - '@types/node': 20.6.2 + '@types/node': 20.6.3 dev: true /@types/seedrandom@3.0.1: @@ -3989,14 +3993,14 @@ packages: resolution: {integrity: sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q==} dependencies: '@types/mime': 1.3.2 - '@types/node': 20.6.2 + '@types/node': 20.6.3 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.6.2 + '@types/node': 20.6.3 dev: true /@types/sinon-chai@3.2.5: @@ -4033,18 +4037,18 @@ packages: /@types/ws@7.4.7: resolution: {integrity: sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==} dependencies: - '@types/node': 20.6.2 + '@types/node': 20.6.3 /@types/ws@8.5.3: resolution: {integrity: sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w==} dependencies: - '@types/node': 20.6.2 + '@types/node': 20.6.3 dev: false /@types/ws@8.5.5: resolution: {integrity: sha512-lwhs8hktwxSjf9UaZ9tG5M03PGogvFaH8gUgLNbN9HKIg0dvv6q+gkSuJ8HN4/VbyxkuLzCjlN7GquQ0gUJfIg==} dependencies: - '@types/node': 20.6.2 + '@types/node': 20.6.3 dev: true /@typescript-eslint/eslint-plugin@6.7.0(@typescript-eslint/parser@6.4.0)(eslint@8.49.0)(typescript@5.1.6): @@ -9201,7 +9205,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.6.2)(typescript@5.2.2) + ts-node: 10.9.1(@types/node@20.6.3)(typescript@5.2.2) tsort: 0.0.1 typescript: 5.2.2 undici: 5.24.0 @@ -13976,7 +13980,7 @@ packages: yn: 3.1.1 dev: true - /ts-node@10.9.1(@types/node@20.6.2)(typescript@5.2.2): + /ts-node@10.9.1(@types/node@20.6.3)(typescript@5.2.2): resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} hasBin: true peerDependencies: @@ -13995,7 +13999,7 @@ packages: '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 20.6.2 + '@types/node': 20.6.3 acorn: 8.10.0 acorn-walk: 8.2.0 arg: 4.1.3 From 313fbafd2fef8c68c1551064469019bedfa4d916 Mon Sep 17 00:00:00 2001 From: Will Cory Date: Thu, 14 Sep 2023 08:34:24 -0700 Subject: [PATCH 78/87] chore(indexer): remove indexer all command --- indexer/Dockerfile | 2 +- indexer/cmd/indexer/cli.go | 37 ------------------------------------- 2 files changed, 1 insertion(+), 38 deletions(-) diff --git a/indexer/Dockerfile b/indexer/Dockerfile index 2380ae160c2c..99798dd4540f 100644 --- a/indexer/Dockerfile +++ b/indexer/Dockerfile @@ -23,4 +23,4 @@ FROM alpine:3.18 COPY --from=builder /app/indexer/indexer /usr/local/bin -CMD ["indexer", "all", "--config", "/app/indexer/indexer.toml"] +CMD ["indexer", "index", "--config", "/app/indexer/indexer.toml"] diff --git a/indexer/cmd/indexer/cli.go b/indexer/cmd/indexer/cli.go index e21b84b57db7..7e14dee90aa5 100644 --- a/indexer/cmd/indexer/cli.go +++ b/indexer/cmd/indexer/cli.go @@ -1,8 +1,6 @@ package main import ( - "sync" - "github.com/ethereum-optimism/optimism/indexer" "github.com/ethereum-optimism/optimism/indexer/api" "github.com/ethereum-optimism/optimism/indexer/config" @@ -66,35 +64,6 @@ func runApi(ctx *cli.Context) error { return api.Start(ctx.Context) } -func runAll(ctx *cli.Context) error { - log := log.NewLogger(log.ReadCLIConfig(ctx)) - - // Ensure both processes complete before returning. - var wg sync.WaitGroup - wg.Add(2) - - go func() { - defer wg.Done() - err := runApi(ctx) - if err != nil { - log.Error("api process non-zero exit", "err", err) - } - }() - go func() { - defer wg.Done() - err := runIndexer(ctx) - if err != nil { - log.Error("indexer process non-zero exit", "err", err) - } - }() - - // We purposefully return no error since the indexer and api - // have no inter-dependencies. We simply rely on the logs to - // report a non-zero exit for either process. - wg.Wait() - return nil -} - func newCli(GitCommit string, GitDate string) *cli.App { flags := []cli.Flag{ConfigFlag} flags = append(flags, log.CLIFlags("INDEXER")...) @@ -115,12 +84,6 @@ func newCli(GitCommit string, GitDate string) *cli.App { Description: "Runs the indexing service", Action: runIndexer, }, - { - Name: "all", - Flags: flags, - Description: "Runs both the api service and the indexing service", - Action: runAll, - }, { Name: "version", Description: "print version", From fe1ad8717864aef2634bcbdf5bd64439d3af7c01 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 21 Sep 2023 09:11:31 +0000 Subject: [PATCH 79/87] build(deps-dev): bump vitest from 0.34.1 to 0.34.4 Bumps [vitest](https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest) from 0.34.1 to 0.34.4. - [Release notes](https://github.com/vitest-dev/vitest/releases) - [Commits](https://github.com/vitest-dev/vitest/commits/v0.34.4/packages/vitest) --- updated-dependencies: - dependency-name: vitest dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pnpm-lock.yaml | 46 +++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 41 insertions(+), 5 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a38181a9342f..1349eb017d1e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -14735,7 +14735,7 @@ packages: - terser dev: true - /vite-node@0.34.4(@types/node@20.6.2): + /vite-node@0.34.4(@types/node@20.6.3): resolution: {integrity: sha512-ho8HtiLc+nsmbwZMw8SlghESEE3KxJNp04F/jPUCLVvaURwt0d+r9LxEqCX5hvrrOQ0GSyxbYr5ZfRYhQ0yVKQ==} engines: {node: '>=v14.18.0'} hasBin: true @@ -14745,7 +14745,7 @@ packages: mlly: 1.4.0 pathe: 1.1.1 picocolors: 1.0.0 - vite: 4.4.9(@types/node@20.6.2) + vite: 4.4.9(@types/node@20.6.3) transitivePeerDependencies: - '@types/node' - less @@ -14829,6 +14829,42 @@ packages: fsevents: 2.3.2 dev: true + /vite@4.4.9(@types/node@20.6.3): + resolution: {integrity: sha512-2mbUn2LlUmNASWwSCNSJ/EG2HuSRTnVNaydp6vMCm5VIqJsjMfbIWtbH2kDuwUVW5mMUKKZvGPX/rqeqVvv1XA==} + engines: {node: ^14.18.0 || >=16.0.0} + hasBin: true + peerDependencies: + '@types/node': '>= 14' + less: '*' + lightningcss: ^1.21.0 + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + dependencies: + '@types/node': 20.6.3 + esbuild: 0.18.15 + postcss: 8.4.27 + rollup: 3.28.0 + optionalDependencies: + fsevents: 2.3.2 + dev: true + /vitest@0.34.1: resolution: {integrity: sha512-G1PzuBEq9A75XSU88yO5G4vPT20UovbC/2osB2KEuV/FisSIIsw7m5y2xMdB7RsAGHAfg2lPmp2qKr3KWliVlQ==} engines: {node: '>=v14.18.0'} @@ -14993,7 +15029,7 @@ packages: dependencies: '@types/chai': 4.3.6 '@types/chai-subset': 1.3.3 - '@types/node': 20.6.2 + '@types/node': 20.6.3 '@vitest/expect': 0.34.4 '@vitest/runner': 0.34.4 '@vitest/snapshot': 0.34.4 @@ -15012,8 +15048,8 @@ packages: strip-literal: 1.0.1 tinybench: 2.5.0 tinypool: 0.7.0 - vite: 4.4.9(@types/node@20.6.2) - vite-node: 0.34.4(@types/node@20.6.2) + vite: 4.4.9(@types/node@20.6.3) + vite-node: 0.34.4(@types/node@20.6.3) why-is-node-running: 2.2.2 transitivePeerDependencies: - less From 5351d10d6fe0bcbcb8f7f61e1d42cfa27aa00ec4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 21 Sep 2023 09:23:09 +0000 Subject: [PATCH 80/87] build(deps-dev): bump glob from 10.3.3 to 10.3.5 Bumps [glob](https://github.com/isaacs/node-glob) from 10.3.3 to 10.3.5. - [Changelog](https://github.com/isaacs/node-glob/blob/main/changelog.md) - [Commits](https://github.com/isaacs/node-glob/compare/v10.3.3...v10.3.5) --- updated-dependencies: - dependency-name: glob dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pnpm-lock.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a38181a9342f..853b82d07d05 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -8888,8 +8888,8 @@ packages: path-scurry: 1.10.1 dev: true - /glob@10.3.4: - resolution: {integrity: sha512-6LFElP3A+i/Q8XQKEvZjkEWEOTgAIALR9AO2rwT8bgPhDd1anmqDJDZ6lLddI4ehxxxR1S5RIqKe1uapMQfYaQ==} + /glob@10.3.5: + resolution: {integrity: sha512-bYUpUD7XDEHI4Q2O5a7PXGvyw4deKR70kHiDxzQbe925wbZknhOzUt2xBgTkYL6RBcVeXYuD9iNYeqoWbBZQnA==} engines: {node: '>=16 || 14 >=14.17'} hasBin: true dependencies: @@ -12904,7 +12904,7 @@ packages: engines: {node: '>=14'} hasBin: true dependencies: - glob: 10.3.4 + glob: 10.3.5 dev: true /ripemd160@2.0.2: From 2bc83f94006ee496e830eef7653732d21d789d23 Mon Sep 17 00:00:00 2001 From: protolambda Date: Thu, 21 Sep 2023 14:43:32 +0200 Subject: [PATCH 81/87] contracts-bedrock: internal devnet ProtocolVersions deployment --- .../deploy-config/internal-devnet.json | 14 +- .../internal-devnet/ProtocolVersions.json | 496 ++++++++++++++++++ .../ProtocolVersionsProxy.json | 256 +++++++++ 3 files changed, 755 insertions(+), 11 deletions(-) create mode 100644 packages/contracts-bedrock/deployments/internal-devnet/ProtocolVersions.json create mode 100644 packages/contracts-bedrock/deployments/internal-devnet/ProtocolVersionsProxy.json diff --git a/packages/contracts-bedrock/deploy-config/internal-devnet.json b/packages/contracts-bedrock/deploy-config/internal-devnet.json index 703dc98e8c34..37b17b9fd72a 100644 --- a/packages/contracts-bedrock/deploy-config/internal-devnet.json +++ b/packages/contracts-bedrock/deploy-config/internal-devnet.json @@ -1,17 +1,14 @@ { "finalSystemOwner": "0x858F0751ef8B4067f0d2668C076BDB50a8549fbF", "portalGuardian": "0x858F0751ef8B4067f0d2668C076BDB50a8549fbF", - "l1StartingBlockTag": "0x19c7e6b18fe156e45f4cfef707294fd8f079fa9c30a7b7cd6ec1ce3682ec6a2e", "l1ChainID": 5, "l2ChainID": 998, "l2BlockTime": 2, "l1BlockTime": 12, - "maxSequencerDrift": 1200, "sequencerWindowSize": 3600, "channelTimeout": 120, - "p2pSequencerAddress": "0xf1a4a22a65Ff01EBB23A580146a3ED49D70c8932", "batchInboxAddress": "0xff00000000000000000000000000000000000998", "batchSenderAddress": "0xE0Fa1Cc7a0FD5bD82b9A06b08FD6C4563E6635C2", @@ -21,32 +18,27 @@ "l2OutputOracleProposer": "0xE06d39D4B8DC05E562353F060DED346AC4acC077", "l2OutputOracleChallenger": "0xE06d39D4B8DC05E562353F060DED346AC4acC077", "finalizationPeriodSeconds": 12, - "proxyAdminOwner": "0x858F0751ef8B4067f0d2668C076BDB50a8549fbF", "baseFeeVaultRecipient": "0x858F0751ef8B4067f0d2668C076BDB50a8549fbF", "l1FeeVaultRecipient": "0x858F0751ef8B4067f0d2668C076BDB50a8549fbF", "sequencerFeeVaultRecipient": "0x858F0751ef8B4067f0d2668C076BDB50a8549fbF", - "baseFeeVaultMinimumWithdrawalAmount": "0x8ac7230489e80000", "l1FeeVaultMinimumWithdrawalAmount": "0x8ac7230489e80000", "sequencerFeeVaultMinimumWithdrawalAmount": "0x8ac7230489e80000", "baseFeeVaultWithdrawalNetwork": 0, "l1FeeVaultWithdrawalNetwork": 0, "sequencerFeeVaultWithdrawalNetwork": 0, - "enableGovernance": true, "governanceTokenName": "Optimism", "governanceTokenSymbol": "OP", "governanceTokenOwner": "0x858F0751ef8B4067f0d2668C076BDB50a8549fbF", - "l2GenesisBlockGasLimit": "0x17D7840", "l2GenesisBlockBaseFeePerGas": "0x3b9aca00", - - "gasPriceOracleOverhead": 2100, "gasPriceOracleScalar": 1000000, "eip1559Denominator": 50, "eip1559Elasticity": 10, - - "systemConfigStartBlock": 8364212 + "systemConfigStartBlock": 8364212, + "requiredProtocolVersion": "0x0000000000000000000000000000000000000000000000000000000000000000", + "recommendedProtocolVersion": "0x0000000000000000000000000000000000000000000000000000000000000000" } diff --git a/packages/contracts-bedrock/deployments/internal-devnet/ProtocolVersions.json b/packages/contracts-bedrock/deployments/internal-devnet/ProtocolVersions.json new file mode 100644 index 000000000000..803cf16c9345 --- /dev/null +++ b/packages/contracts-bedrock/deployments/internal-devnet/ProtocolVersions.json @@ -0,0 +1,496 @@ +{ + "abi": [ + { + "inputs": [], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "version", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "enum ProtocolVersions.UpdateType", + "name": "updateType", + "type": "uint8" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "ConfigUpdate", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint8", + "name": "version", + "type": "uint8" + } + ], + "name": "Initialized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "inputs": [], + "name": "RECOMMENDED_SLOT", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "REQUIRED_SLOT", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "VERSION", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "internalType": "ProtocolVersion", + "name": "_required", + "type": "uint256" + }, + { + "internalType": "ProtocolVersion", + "name": "_recommended", + "type": "uint256" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "recommended", + "outputs": [ + { + "internalType": "ProtocolVersion", + "name": "out_", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "required", + "outputs": [ + { + "internalType": "ProtocolVersion", + "name": "out_", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "ProtocolVersion", + "name": "_recommended", + "type": "uint256" + } + ], + "name": "setRecommended", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "ProtocolVersion", + "name": "_required", + "type": "uint256" + } + ], + "name": "setRequired", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "version", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "address": "0x4D5B53080E8b6bf74e61d86690Cc0A0a604ec294", + "args": [], + "bytecode": "0x60806040523480156200001157600080fd5b506200002261dead60008062000028565b620004b5565b600054600290610100900460ff161580156200004b575060005460ff8083169116105b620000b45760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805461ffff191660ff831617610100179055620000d26200013a565b620000dd84620001a2565b620000e88362000221565b620000f382620002c0565b6000805461ff001916905560405160ff821681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050565b600054610100900460ff16620001965760405162461bcd60e51b815260206004820152602b602482015260008051602062000e7e83398151915260448201526a6e697469616c697a696e6760a81b6064820152608401620000ab565b620001a062000322565b565b620001ac62000389565b6001600160a01b038116620002135760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401620000ab565b6200021e81620003e5565b50565b62000256816200025360017f4aaefe95bd84fd3f32700cf3b7566bc944b73138e41958b5785826df2aecace162000437565b55565b6000816040516020016200026c91815260200190565b60408051601f19818403018152919052905060005b60007f1d2b0bda21d56b8bd12d4f94ebacffdfb35f5e226f84b461103bb8beab6353be83604051620002b491906200045d565b60405180910390a35050565b620002f2816200025360017fe314dfc40f0025322aacc0ba8ef420b62fb3b702cf01e0cdf3d829117ac2ff1b62000437565b6000816040516020016200030891815260200190565b60408051601f198184030181529190529050600162000281565b600054610100900460ff166200037e5760405162461bcd60e51b815260206004820152602b602482015260008051602062000e7e83398151915260448201526a6e697469616c697a696e6760a81b6064820152608401620000ab565b620001a033620003e5565b6033546001600160a01b03163314620001a05760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401620000ab565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000828210156200045857634e487b7160e01b600052601160045260246000fd5b500390565b600060208083528351808285015260005b818110156200048c578581018301518582016040015282016200046e565b818111156200049f576000604083870101525b50601f01601f1916929092016040019392505050565b6109b980620004c56000396000f3fe608060405234801561001057600080fd5b50600436106100d45760003560e01c80638da5cb5b11610081578063f2fde38b1161005b578063f2fde38b146101b8578063f7d12760146101cb578063ffa1ad74146101d357600080fd5b80638da5cb5b14610180578063d798b1ac146101a8578063dc8452cd146101b057600080fd5b80635fd579af116100b25780635fd579af14610152578063715018a6146101655780637a1ac61e1461016d57600080fd5b80630457d6f2146100d9578063206a8300146100ee57806354fd4d5014610109575b600080fd5b6100ec6100e7366004610859565b6101db565b005b6100f66101ef565b6040519081526020015b60405180910390f35b6101456040518060400160405280600581526020017f302e312e3000000000000000000000000000000000000000000000000000000081525081565b60405161010091906108dd565b6100ec610160366004610859565b61021d565b6100ec61022e565b6100ec61017b366004610920565b610242565b60335460405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610100565b6100f66103ad565b6100f66103e6565b6100ec6101c6366004610953565b610416565b6100f66104ca565b6100f6600081565b6101e36104f5565b6101ec81610576565b50565b61021a60017f4aaefe95bd84fd3f32700cf3b7566bc944b73138e41958b5785826df2aecace161096e565b81565b6102256104f5565b6101ec8161062d565b6102366104f5565b61024060006106a8565b565b600054600290610100900460ff16158015610264575060005460ff8083169116105b6102f5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001660ff83161761010017905561032e61071f565b61033784610416565b61034083610576565b6103498261062d565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16905560405160ff821681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050565b60006103e16103dd60017fe314dfc40f0025322aacc0ba8ef420b62fb3b702cf01e0cdf3d829117ac2ff1b61096e565b5490565b905090565b60006103e16103dd60017f4aaefe95bd84fd3f32700cf3b7566bc944b73138e41958b5785826df2aecace161096e565b61041e6104f5565b73ffffffffffffffffffffffffffffffffffffffff81166104c1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016102ec565b6101ec816106a8565b61021a60017fe314dfc40f0025322aacc0ba8ef420b62fb3b702cf01e0cdf3d829117ac2ff1b61096e565b60335473ffffffffffffffffffffffffffffffffffffffff163314610240576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016102ec565b6105a8816105a560017f4aaefe95bd84fd3f32700cf3b7566bc944b73138e41958b5785826df2aecace161096e565b55565b6000816040516020016105bd91815260200190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052905060005b60007f1d2b0bda21d56b8bd12d4f94ebacffdfb35f5e226f84b461103bb8beab6353be8360405161062191906108dd565b60405180910390a35050565b61065c816105a560017fe314dfc40f0025322aacc0ba8ef420b62fb3b702cf01e0cdf3d829117ac2ff1b61096e565b60008160405160200161067191815260200190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052905060016105f0565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600054610100900460ff166107b6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016102ec565b610240600054610100900460ff16610850576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016102ec565b610240336106a8565b60006020828403121561086b57600080fd5b5035919050565b6000815180845260005b818110156108985760208185018101518683018201520161087c565b818111156108aa576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006108f06020830184610872565b9392505050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461091b57600080fd5b919050565b60008060006060848603121561093557600080fd5b61093e846108f7565b95602085013595506040909401359392505050565b60006020828403121561096557600080fd5b6108f0826108f7565b6000828210156109a7577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b50039056fea164736f6c634300080f000a496e697469616c697a61626c653a20636f6e7472616374206973206e6f742069", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100d45760003560e01c80638da5cb5b11610081578063f2fde38b1161005b578063f2fde38b146101b8578063f7d12760146101cb578063ffa1ad74146101d357600080fd5b80638da5cb5b14610180578063d798b1ac146101a8578063dc8452cd146101b057600080fd5b80635fd579af116100b25780635fd579af14610152578063715018a6146101655780637a1ac61e1461016d57600080fd5b80630457d6f2146100d9578063206a8300146100ee57806354fd4d5014610109575b600080fd5b6100ec6100e7366004610859565b6101db565b005b6100f66101ef565b6040519081526020015b60405180910390f35b6101456040518060400160405280600581526020017f302e312e3000000000000000000000000000000000000000000000000000000081525081565b60405161010091906108dd565b6100ec610160366004610859565b61021d565b6100ec61022e565b6100ec61017b366004610920565b610242565b60335460405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610100565b6100f66103ad565b6100f66103e6565b6100ec6101c6366004610953565b610416565b6100f66104ca565b6100f6600081565b6101e36104f5565b6101ec81610576565b50565b61021a60017f4aaefe95bd84fd3f32700cf3b7566bc944b73138e41958b5785826df2aecace161096e565b81565b6102256104f5565b6101ec8161062d565b6102366104f5565b61024060006106a8565b565b600054600290610100900460ff16158015610264575060005460ff8083169116105b6102f5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001660ff83161761010017905561032e61071f565b61033784610416565b61034083610576565b6103498261062d565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16905560405160ff821681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050565b60006103e16103dd60017fe314dfc40f0025322aacc0ba8ef420b62fb3b702cf01e0cdf3d829117ac2ff1b61096e565b5490565b905090565b60006103e16103dd60017f4aaefe95bd84fd3f32700cf3b7566bc944b73138e41958b5785826df2aecace161096e565b61041e6104f5565b73ffffffffffffffffffffffffffffffffffffffff81166104c1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016102ec565b6101ec816106a8565b61021a60017fe314dfc40f0025322aacc0ba8ef420b62fb3b702cf01e0cdf3d829117ac2ff1b61096e565b60335473ffffffffffffffffffffffffffffffffffffffff163314610240576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016102ec565b6105a8816105a560017f4aaefe95bd84fd3f32700cf3b7566bc944b73138e41958b5785826df2aecace161096e565b55565b6000816040516020016105bd91815260200190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052905060005b60007f1d2b0bda21d56b8bd12d4f94ebacffdfb35f5e226f84b461103bb8beab6353be8360405161062191906108dd565b60405180910390a35050565b61065c816105a560017fe314dfc40f0025322aacc0ba8ef420b62fb3b702cf01e0cdf3d829117ac2ff1b61096e565b60008160405160200161067191815260200190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052905060016105f0565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600054610100900460ff166107b6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016102ec565b610240600054610100900460ff16610850576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016102ec565b610240336106a8565b60006020828403121561086b57600080fd5b5035919050565b6000815180845260005b818110156108985760208185018101518683018201520161087c565b818111156108aa576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006108f06020830184610872565b9392505050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461091b57600080fd5b919050565b60008060006060848603121561093557600080fd5b61093e846108f7565b95602085013595506040909401359392505050565b60006020828403121561096557600080fd5b6108f0826108f7565b6000828210156109a7577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b50039056fea164736f6c634300080f000a", + "devdoc": { + "version": 1, + "kind": "dev", + "methods": { + "initialize(address,uint256,uint256)": { + "params": { + "_owner": "Initial owner of the contract.", + "_recommended": "Recommended protocol version to operate on thi chain.", + "_required": "Required protocol version to operate on this chain." + } + }, + "owner()": { + "details": "Returns the address of the current owner." + }, + "recommended()": { + "returns": { + "out_": "Recommended protocol version to sync to the head of the chain." + } + }, + "renounceOwnership()": { + "details": "Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner." + }, + "required()": { + "returns": { + "out_": "Required protocol version to sync to the head of the chain." + } + }, + "setRecommended(uint256)": { + "params": { + "_recommended": "New recommended protocol version." + } + }, + "setRequired(uint256)": { + "params": { + "_required": "New required protocol version." + } + }, + "transferOwnership(address)": { + "details": "Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner." + } + }, + "events": { + "ConfigUpdate(uint256,uint8,bytes)": { + "params": { + "data": "Encoded update data.", + "updateType": "Type of update.", + "version": "ProtocolVersion version." + } + } + }, + "title": "ProtocolVersions" + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"version\",\"type\":\"uint256\",\"indexed\":true},{\"internalType\":\"enum ProtocolVersions.UpdateType\",\"name\":\"updateType\",\"type\":\"uint8\",\"indexed\":true},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\",\"indexed\":false}],\"type\":\"event\",\"name\":\"ConfigUpdate\",\"anonymous\":false},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false}],\"type\":\"event\",\"name\":\"Initialized\",\"anonymous\":false},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true},{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true}],\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"anonymous\":false},{\"inputs\":[],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"RECOMMENDED_SLOT\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}]},{\"inputs\":[],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"REQUIRED_SLOT\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}]},{\"inputs\":[],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"VERSION\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}]},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"},{\"internalType\":\"ProtocolVersion\",\"name\":\"_required\",\"type\":\"uint256\"},{\"internalType\":\"ProtocolVersion\",\"name\":\"_recommended\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\",\"name\":\"initialize\"},{\"inputs\":[],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}]},{\"inputs\":[],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"recommended\",\"outputs\":[{\"internalType\":\"ProtocolVersion\",\"name\":\"out_\",\"type\":\"uint256\"}]},{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\",\"name\":\"renounceOwnership\"},{\"inputs\":[],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"required\",\"outputs\":[{\"internalType\":\"ProtocolVersion\",\"name\":\"out_\",\"type\":\"uint256\"}]},{\"inputs\":[{\"internalType\":\"ProtocolVersion\",\"name\":\"_recommended\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\",\"name\":\"setRecommended\"},{\"inputs\":[{\"internalType\":\"ProtocolVersion\",\"name\":\"_required\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\",\"name\":\"setRequired\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\",\"name\":\"transferOwnership\"},{\"inputs\":[],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"version\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}]}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"initialize(address,uint256,uint256)\":{\"params\":{\"_owner\":\"Initial owner of the contract.\",\"_recommended\":\"Recommended protocol version to operate on thi chain.\",\"_required\":\"Required protocol version to operate on this chain.\"}},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"recommended()\":{\"returns\":{\"out_\":\"Recommended protocol version to sync to the head of the chain.\"}},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner.\"},\"required()\":{\"returns\":{\"out_\":\"Required protocol version to sync to the head of the chain.\"}},\"setRecommended(uint256)\":{\"params\":{\"_recommended\":\"New recommended protocol version.\"}},\"setRequired(uint256)\":{\"params\":{\"_required\":\"New required protocol version.\"}},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"RECOMMENDED_SLOT()\":{\"notice\":\"Storage slot that the recommended protocol version is stored at.\"},\"REQUIRED_SLOT()\":{\"notice\":\"Storage slot that the required protocol version is stored at.\"},\"VERSION()\":{\"notice\":\"Version identifier, used for upgrades.\"},\"constructor\":{\"notice\":\"Constructs the ProtocolVersion contract. Cannot set the owner to `address(0)` due to the Ownable contract's implementation, so set it to `address(0xdEaD)` A zero version is considered empty and is ignored by nodes.\"},\"initialize(address,uint256,uint256)\":{\"notice\":\"Initializer.\"},\"recommended()\":{\"notice\":\"High level getter for the recommended protocol version.\"},\"required()\":{\"notice\":\"High level getter for the required protocol version.\"},\"setRecommended(uint256)\":{\"notice\":\"Updates the recommended protocol version. Can only be called by the owner.\"},\"setRequired(uint256)\":{\"notice\":\"Updates the required protocol version. Can only be called by the owner.\"},\"version()\":{\"notice\":\"Semantic version.\"}},\"version\":1}},\"settings\":{\"remappings\":[\"@cwia/=lib/clones-with-immutable-args/src/\",\"@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/\",\"@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/\",\"@rari-capital/solmate/=lib/solmate/\",\"clones-with-immutable-args/=lib/clones-with-immutable-args/src/\",\"ds-test/=lib/forge-std/lib/ds-test/src/\",\"forge-std/=lib/forge-std/src/\",\"openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/\",\"openzeppelin-contracts/=lib/openzeppelin-contracts/\",\"safe-contracts/=lib/safe-contracts/contracts/\",\"solmate/=lib/solmate/src/\"],\"optimizer\":{\"enabled\":true,\"runs\":999999},\"metadata\":{\"bytecodeHash\":\"none\"},\"compilationTarget\":{\"src/L1/ProtocolVersions.sol\":\"ProtocolVersions\"},\"libraries\":{}},\"sources\":{\"lib/openzeppelin-contracts-upgradeable/contracts/access/OwnableUpgradeable.sol\":{\"keccak256\":\"0x247c62047745915c0af6b955470a72d1696ebad4352d7d3011aef1a2463cd888\",\"urls\":[\"bzz-raw://d7fc8396619de513c96b6e00301b88dd790e83542aab918425633a5f7297a15a\",\"dweb:/ipfs/QmXbP4kiZyp7guuS7xe8KaybnwkRPGrBc2Kbi3vhcTfpxb\"],\"license\":\"MIT\"},\"lib/openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol\":{\"keccak256\":\"0x0203dcadc5737d9ef2c211d6fa15d18ebc3b30dfa51903b64870b01a062b0b4e\",\"urls\":[\"bzz-raw://6eb2fd1e9894dbe778f4b8131adecebe570689e63cf892f4e21257bfe1252497\",\"dweb:/ipfs/QmXgUGNfZvrn6N2miv3nooSs7Jm34A41qz94fu2GtDFcx8\"],\"license\":\"MIT\"},\"lib/openzeppelin-contracts-upgradeable/contracts/utils/AddressUpgradeable.sol\":{\"keccak256\":\"0x611aa3f23e59cfdd1863c536776407b3e33d695152a266fa7cfb34440a29a8a3\",\"urls\":[\"bzz-raw://9b4b2110b7f2b3eb32951bc08046fa90feccffa594e1176cb91cdfb0e94726b4\",\"dweb:/ipfs/QmSxLwYjicf9zWFuieRc8WQwE4FisA1Um5jp1iSa731TGt\"],\"license\":\"MIT\"},\"lib/openzeppelin-contracts-upgradeable/contracts/utils/ContextUpgradeable.sol\":{\"keccak256\":\"0x963ea7f0b48b032eef72fe3a7582edf78408d6f834115b9feadd673a4d5bd149\",\"urls\":[\"bzz-raw://d6520943ea55fdf5f0bafb39ed909f64de17051bc954ff3e88c9e5621412c79c\",\"dweb:/ipfs/QmWZ4rAKTQbNG2HxGs46AcTXShsVytKeLs7CUCdCSv5N7a\"],\"license\":\"MIT\"},\"src/L1/ProtocolVersions.sol\":{\"keccak256\":\"0x004007b30d1621fd78cdf81a760809d925f0bf3b6d841b6f7ceaf716b0abf3b9\",\"urls\":[\"bzz-raw://75c3858b3c4bd906cbfd8df1c06aa0e4b7349f1ddbfeb9c0fa70ac09b74180a3\",\"dweb:/ipfs/QmQrWrdix2oPBFjPoUP9cjvL8b2kXW2LqPBinoh7dQ74h5\"],\"license\":\"MIT\"},\"src/universal/ISemver.sol\":{\"keccak256\":\"0xba34562a8026f59886d2e07d1d58d90b9691d00e0788c6263cef6c22740cab44\",\"urls\":[\"bzz-raw://0826f998632f83c103c3085bf2e872db79a69022b6d2e0444c83a64ca5283c2a\",\"dweb:/ipfs/QmcJ7PNqkAfKqbjFGRordtAg1v9DvcBSKvdTkVvciLyvQR\"],\"license\":\"MIT\"}},\"version\":1}", + "numDeployments": 1, + "receipt": { + "transactionHash": "0x5e29b8604ba6b0e734c14cbe6fa436131cf5197d4c3b9ba1043d9c0a267f9b6f", + "transactionIndex": "0x0", + "blockHash": "0x97596f00f015e320a2f68837a3ac6cefd72d27ac17f27a72f2b6944dff69aa86", + "blockNumber": "0x948667", + "from": "0x0a08E04c73f22C65D6dBFF20f87171240df6E519", + "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "cumulativeGasUsed": "0xa304a", + "gasUsed": "0xa304a", + "contractAddress": "0x4D5B53080E8b6bf74e61d86690Cc0A0a604ec294", + "logs": [ + { + "address": "0x4D5B53080E8b6bf74e61d86690Cc0A0a604ec294", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000004e59b44847b379578588920ca78fbf26c0b4956c" + ], + "data": "0x", + "blockHash": "0x97596f00f015e320a2f68837a3ac6cefd72d27ac17f27a72f2b6944dff69aa86", + "blockNumber": "0x948667", + "transactionHash": "0x5e29b8604ba6b0e734c14cbe6fa436131cf5197d4c3b9ba1043d9c0a267f9b6f", + "transactionIndex": "0x0", + "logIndex": "0x0", + "removed": false + }, + { + "address": "0x4D5B53080E8b6bf74e61d86690Cc0A0a604ec294", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000004e59b44847b379578588920ca78fbf26c0b4956c", + "0x000000000000000000000000000000000000000000000000000000000000dead" + ], + "data": "0x", + "blockHash": "0x97596f00f015e320a2f68837a3ac6cefd72d27ac17f27a72f2b6944dff69aa86", + "blockNumber": "0x948667", + "transactionHash": "0x5e29b8604ba6b0e734c14cbe6fa436131cf5197d4c3b9ba1043d9c0a267f9b6f", + "transactionIndex": "0x0", + "logIndex": "0x1", + "removed": false + }, + { + "address": "0x4D5B53080E8b6bf74e61d86690Cc0A0a604ec294", + "topics": [ + "0x1d2b0bda21d56b8bd12d4f94ebacffdfb35f5e226f84b461103bb8beab6353be", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" + ], + "data": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0x97596f00f015e320a2f68837a3ac6cefd72d27ac17f27a72f2b6944dff69aa86", + "blockNumber": "0x948667", + "transactionHash": "0x5e29b8604ba6b0e734c14cbe6fa436131cf5197d4c3b9ba1043d9c0a267f9b6f", + "transactionIndex": "0x0", + "logIndex": "0x2", + "removed": false + }, + { + "address": "0x4D5B53080E8b6bf74e61d86690Cc0A0a604ec294", + "topics": [ + "0x1d2b0bda21d56b8bd12d4f94ebacffdfb35f5e226f84b461103bb8beab6353be", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000001" + ], + "data": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0x97596f00f015e320a2f68837a3ac6cefd72d27ac17f27a72f2b6944dff69aa86", + "blockNumber": "0x948667", + "transactionHash": "0x5e29b8604ba6b0e734c14cbe6fa436131cf5197d4c3b9ba1043d9c0a267f9b6f", + "transactionIndex": "0x0", + "logIndex": "0x3", + "removed": false + }, + { + "address": "0x4D5B53080E8b6bf74e61d86690Cc0A0a604ec294", + "topics": [ + "0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498" + ], + "data": "0x0000000000000000000000000000000000000000000000000000000000000002", + "blockHash": "0x97596f00f015e320a2f68837a3ac6cefd72d27ac17f27a72f2b6944dff69aa86", + "blockNumber": "0x948667", + "transactionHash": "0x5e29b8604ba6b0e734c14cbe6fa436131cf5197d4c3b9ba1043d9c0a267f9b6f", + "transactionIndex": "0x0", + "logIndex": "0x4", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000000000010000000000000000000000000000000000000800000000000000000000000000020000000000000000000000000000008000000000000040000000000000000000000000000000000000001002000040000000000000000000000000000020000000000000000000800000000000000000000000000000000400000000000000000000004040000000000000000001080000000000000000000000000000001000000000000000400000000000000000000000000000000000000000400100000000000000000040000000000000000000000000000000060000000000000000000000000000000000080000000000000000000008000000000", + "type": "0x2", + "effectiveGasPrice": "0xb2d05e0a" + }, + "solcInputHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "storageLayout": { + "storage": [ + { + "astId": 29536, + "contract": "src/L1/ProtocolVersions.sol:ProtocolVersions", + "label": "_initialized", + "offset": 0, + "slot": "0", + "type": "t_uint8" + }, + { + "astId": 29539, + "contract": "src/L1/ProtocolVersions.sol:ProtocolVersions", + "label": "_initializing", + "offset": 1, + "slot": "0", + "type": "t_bool" + }, + { + "astId": 29964, + "contract": "src/L1/ProtocolVersions.sol:ProtocolVersions", + "label": "__gap", + "offset": 0, + "slot": "1", + "type": "t_array(t_uint256)50_storage" + }, + { + "astId": 29408, + "contract": "src/L1/ProtocolVersions.sol:ProtocolVersions", + "label": "_owner", + "offset": 0, + "slot": "51", + "type": "t_address" + }, + { + "astId": 29528, + "contract": "src/L1/ProtocolVersions.sol:ProtocolVersions", + "label": "__gap", + "offset": 0, + "slot": "52", + "type": "t_array(t_uint256)49_storage" + } + ], + "types": { + "t_address": { + "encoding": "inplace", + "label": "address", + "numberOfBytes": "20" + }, + "t_array(t_uint256)49_storage": { + "encoding": "inplace", + "label": "uint256[49]", + "numberOfBytes": "1568", + "base": "t_uint256" + }, + "t_array(t_uint256)50_storage": { + "encoding": "inplace", + "label": "uint256[50]", + "numberOfBytes": "1600", + "base": "t_uint256" + }, + "t_bool": { + "encoding": "inplace", + "label": "bool", + "numberOfBytes": "1" + }, + "t_uint256": { + "encoding": "inplace", + "label": "uint256", + "numberOfBytes": "32" + }, + "t_uint8": { + "encoding": "inplace", + "label": "uint8", + "numberOfBytes": "1" + } + } + }, + "transactionHash": "0x5e29b8604ba6b0e734c14cbe6fa436131cf5197d4c3b9ba1043d9c0a267f9b6f", + "userdoc": { + "version": 1, + "kind": "user", + "methods": { + "RECOMMENDED_SLOT()": { + "notice": "Storage slot that the recommended protocol version is stored at." + }, + "REQUIRED_SLOT()": { + "notice": "Storage slot that the required protocol version is stored at." + }, + "VERSION()": { + "notice": "Version identifier, used for upgrades." + }, + "constructor": { + "notice": "Constructs the ProtocolVersion contract. Cannot set the owner to `address(0)` due to the Ownable contract's implementation, so set it to `address(0xdEaD)` A zero version is considered empty and is ignored by nodes." + }, + "initialize(address,uint256,uint256)": { + "notice": "Initializer." + }, + "recommended()": { + "notice": "High level getter for the recommended protocol version." + }, + "required()": { + "notice": "High level getter for the required protocol version." + }, + "setRecommended(uint256)": { + "notice": "Updates the recommended protocol version. Can only be called by the owner." + }, + "setRequired(uint256)": { + "notice": "Updates the required protocol version. Can only be called by the owner." + }, + "version()": { + "notice": "Semantic version." + } + }, + "events": { + "ConfigUpdate(uint256,uint8,bytes)": { + "notice": "Emitted when configuration is updated." + } + }, + "notice": "The ProtocolVersions contract is used to manage superchain protocol version information." + } +} \ No newline at end of file diff --git a/packages/contracts-bedrock/deployments/internal-devnet/ProtocolVersionsProxy.json b/packages/contracts-bedrock/deployments/internal-devnet/ProtocolVersionsProxy.json new file mode 100644 index 000000000000..1b94b1d1fe51 --- /dev/null +++ b/packages/contracts-bedrock/deployments/internal-devnet/ProtocolVersionsProxy.json @@ -0,0 +1,256 @@ +{ + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_admin", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "previousAdmin", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "newAdmin", + "type": "address" + } + ], + "name": "AdminChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "implementation", + "type": "address" + } + ], + "name": "Upgraded", + "type": "event" + }, + { + "stateMutability": "payable", + "type": "fallback" + }, + { + "inputs": [], + "name": "admin", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_admin", + "type": "address" + } + ], + "name": "changeAdmin", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "implementation", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_implementation", + "type": "address" + } + ], + "name": "upgradeTo", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_implementation", + "type": "address" + }, + { + "internalType": "bytes", + "name": "_data", + "type": "bytes" + } + ], + "name": "upgradeToAndCall", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "stateMutability": "payable", + "type": "receive" + } + ], + "address": "0x79ADD5713B383DAa0a138d3C4780C7A1804a8090", + "args": [ + "0x0a08E04c73f22C65D6dBFF20f87171240df6E519" + ], + "bytecode": "0x608060405234801561001057600080fd5b5060405161091f38038061091f83398101604081905261002f916100b5565b6100388161003e565b506100e5565b60006100566000805160206108ff8339815191525490565b6000805160206108ff833981519152838155604080516001600160a01b0380851682528616602082015292935090917f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a1505050565b6000602082840312156100c757600080fd5b81516001600160a01b03811681146100de57600080fd5b9392505050565b61080b806100f46000396000f3fe60806040526004361061005e5760003560e01c80635c60da1b116100435780635c60da1b146100be5780638f283970146100f8578063f851a440146101185761006d565b80633659cfe6146100755780634f1ef286146100955761006d565b3661006d5761006b61012d565b005b61006b61012d565b34801561008157600080fd5b5061006b6100903660046106dd565b610224565b6100a86100a33660046106f8565b610296565b6040516100b5919061077b565b60405180910390f35b3480156100ca57600080fd5b506100d3610419565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100b5565b34801561010457600080fd5b5061006b6101133660046106dd565b6104b0565b34801561012457600080fd5b506100d3610517565b60006101577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff8116610201576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f50726f78793a20696d706c656d656e746174696f6e206e6f7420696e6974696160448201527f6c697a656400000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b3660008037600080366000845af43d6000803e8061021e573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061027d575033155b1561028e5761028b816105a3565b50565b61028b61012d565b60606102c07fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102f7575033155b1561040a57610305846105a3565b6000808573ffffffffffffffffffffffffffffffffffffffff16858560405161032f9291906107ee565b600060405180830381855af49150503d806000811461036a576040519150601f19603f3d011682016040523d82523d6000602084013e61036f565b606091505b509150915081610401576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f50726f78793a2064656c656761746563616c6c20746f206e657720696d706c6560448201527f6d656e746174696f6e20636f6e7472616374206661696c65640000000000000060648201526084016101f8565b91506104129050565b61041261012d565b9392505050565b60006104437fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061047a575033155b156104a557507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6104ad61012d565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610509575033155b1561028e5761028b8161060c565b60006105417fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610578575033155b156104a557507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560405173ffffffffffffffffffffffffffffffffffffffff8316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b60006106367fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61038381556040805173ffffffffffffffffffffffffffffffffffffffff80851682528616602082015292935090917f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a1505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146106d857600080fd5b919050565b6000602082840312156106ef57600080fd5b610412826106b4565b60008060006040848603121561070d57600080fd5b610716846106b4565b9250602084013567ffffffffffffffff8082111561073357600080fd5b818601915086601f83011261074757600080fd5b81358181111561075657600080fd5b87602082850101111561076857600080fd5b6020830194508093505050509250925092565b600060208083528351808285015260005b818110156107a85785810183015185820160400152820161078c565b818111156107ba576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b818382376000910190815291905056fea164736f6c634300080f000ab53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103", + "deployedBytecode": "0x60806040526004361061005e5760003560e01c80635c60da1b116100435780635c60da1b146100be5780638f283970146100f8578063f851a440146101185761006d565b80633659cfe6146100755780634f1ef286146100955761006d565b3661006d5761006b61012d565b005b61006b61012d565b34801561008157600080fd5b5061006b6100903660046106dd565b610224565b6100a86100a33660046106f8565b610296565b6040516100b5919061077b565b60405180910390f35b3480156100ca57600080fd5b506100d3610419565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100b5565b34801561010457600080fd5b5061006b6101133660046106dd565b6104b0565b34801561012457600080fd5b506100d3610517565b60006101577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff8116610201576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f50726f78793a20696d706c656d656e746174696f6e206e6f7420696e6974696160448201527f6c697a656400000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b3660008037600080366000845af43d6000803e8061021e573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061027d575033155b1561028e5761028b816105a3565b50565b61028b61012d565b60606102c07fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102f7575033155b1561040a57610305846105a3565b6000808573ffffffffffffffffffffffffffffffffffffffff16858560405161032f9291906107ee565b600060405180830381855af49150503d806000811461036a576040519150601f19603f3d011682016040523d82523d6000602084013e61036f565b606091505b509150915081610401576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f50726f78793a2064656c656761746563616c6c20746f206e657720696d706c6560448201527f6d656e746174696f6e20636f6e7472616374206661696c65640000000000000060648201526084016101f8565b91506104129050565b61041261012d565b9392505050565b60006104437fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061047a575033155b156104a557507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6104ad61012d565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610509575033155b1561028e5761028b8161060c565b60006105417fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610578575033155b156104a557507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560405173ffffffffffffffffffffffffffffffffffffffff8316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b60006106367fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61038381556040805173ffffffffffffffffffffffffffffffffffffffff80851682528616602082015292935090917f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a1505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146106d857600080fd5b919050565b6000602082840312156106ef57600080fd5b610412826106b4565b60008060006040848603121561070d57600080fd5b610716846106b4565b9250602084013567ffffffffffffffff8082111561073357600080fd5b818601915086601f83011261074757600080fd5b81358181111561075657600080fd5b87602082850101111561076857600080fd5b6020830194508093505050509250925092565b600060208083528351808285015260005b818110156107a85785810183015185820160400152820161078c565b818111156107ba576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b818382376000910190815291905056fea164736f6c634300080f000a", + "devdoc": { + "version": 1, + "kind": "dev", + "methods": { + "admin()": { + "returns": { + "_0": "Owner address." + } + }, + "changeAdmin(address)": { + "params": { + "_admin": "New owner of the proxy contract." + } + }, + "constructor": { + "params": { + "_admin": "Address of the initial contract admin. Admin as the ability to access the transparent proxy interface." + } + }, + "implementation()": { + "returns": { + "_0": "Implementation address." + } + }, + "upgradeTo(address)": { + "params": { + "_implementation": "Address of the implementation contract." + } + }, + "upgradeToAndCall(address,bytes)": { + "params": { + "_data": "Calldata to delegatecall the new implementation with.", + "_implementation": "Address of the implementation contract." + } + } + }, + "events": { + "AdminChanged(address,address)": { + "params": { + "newAdmin": "The new owner of the contract", + "previousAdmin": "The previous owner of the contract" + } + }, + "Upgraded(address)": { + "params": { + "implementation": "The address of the implementation contract" + } + } + }, + "title": "Proxy" + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_admin\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"previousAdmin\",\"type\":\"address\",\"indexed\":false},{\"internalType\":\"address\",\"name\":\"newAdmin\",\"type\":\"address\",\"indexed\":false}],\"type\":\"event\",\"name\":\"AdminChanged\",\"anonymous\":false},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"implementation\",\"type\":\"address\",\"indexed\":true}],\"type\":\"event\",\"name\":\"Upgraded\",\"anonymous\":false},{\"inputs\":[],\"stateMutability\":\"payable\",\"type\":\"fallback\"},{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\",\"name\":\"admin\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}]},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_admin\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\",\"name\":\"changeAdmin\"},{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\",\"name\":\"implementation\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}]},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_implementation\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\",\"name\":\"upgradeTo\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_implementation\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"stateMutability\":\"payable\",\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}]},{\"inputs\":[],\"stateMutability\":\"payable\",\"type\":\"receive\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"admin()\":{\"returns\":{\"_0\":\"Owner address.\"}},\"changeAdmin(address)\":{\"params\":{\"_admin\":\"New owner of the proxy contract.\"}},\"constructor\":{\"params\":{\"_admin\":\"Address of the initial contract admin. Admin as the ability to access the transparent proxy interface.\"}},\"implementation()\":{\"returns\":{\"_0\":\"Implementation address.\"}},\"upgradeTo(address)\":{\"params\":{\"_implementation\":\"Address of the implementation contract.\"}},\"upgradeToAndCall(address,bytes)\":{\"params\":{\"_data\":\"Calldata to delegatecall the new implementation with.\",\"_implementation\":\"Address of the implementation contract.\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"admin()\":{\"notice\":\"Gets the owner of the proxy contract.\"},\"changeAdmin(address)\":{\"notice\":\"Changes the owner of the proxy contract. Only callable by the owner.\"},\"constructor\":{\"notice\":\"Sets the initial admin during contract deployment. Admin address is stored at the EIP-1967 admin storage slot so that accidental storage collision with the implementation is not possible.\"},\"upgradeTo(address)\":{\"notice\":\"Set the implementation contract address. The code at the given address will execute when this contract is called.\"},\"upgradeToAndCall(address,bytes)\":{\"notice\":\"Set the implementation and call a function in a single transaction. Useful to ensure atomic execution of initialization-based upgrades.\"}},\"version\":1}},\"settings\":{\"remappings\":[\"@cwia/=lib/clones-with-immutable-args/src/\",\"@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/\",\"@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/\",\"@rari-capital/solmate/=lib/solmate/\",\"clones-with-immutable-args/=lib/clones-with-immutable-args/src/\",\"ds-test/=lib/forge-std/lib/ds-test/src/\",\"forge-std/=lib/forge-std/src/\",\"openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/\",\"openzeppelin-contracts/=lib/openzeppelin-contracts/\",\"safe-contracts/=lib/safe-contracts/contracts/\",\"solmate/=lib/solmate/src/\"],\"optimizer\":{\"enabled\":true,\"runs\":999999},\"metadata\":{\"bytecodeHash\":\"none\"},\"compilationTarget\":{\"src/universal/Proxy.sol\":\"Proxy\"},\"libraries\":{}},\"sources\":{\"lib/openzeppelin-contracts/contracts/proxy/utils/Initializable.sol\":{\"keccak256\":\"0x2a21b14ff90012878752f230d3ffd5c3405e5938d06c97a7d89c0a64561d0d66\",\"urls\":[\"bzz-raw://3313a8f9bb1f9476857c9050067b31982bf2140b83d84f3bc0cec1f62bbe947f\",\"dweb:/ipfs/Qma17Pk8NRe7aB4UD3jjVxk7nSFaov3eQyv86hcyqkwJRV\"],\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/Address.sol\":{\"keccak256\":\"0xd6153ce99bcdcce22b124f755e72553295be6abcd63804cfdffceb188b8bef10\",\"urls\":[\"bzz-raw://35c47bece3c03caaa07fab37dd2bb3413bfbca20db7bd9895024390e0a469487\",\"dweb:/ipfs/QmPGWT2x3QHcKxqe6gRmAkdakhbaRgx3DLzcakHz5M4eXG\"],\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/math/Math.sol\":{\"keccak256\":\"0xd15c3e400531f00203839159b2b8e7209c5158b35618f570c695b7e47f12e9f0\",\"urls\":[\"bzz-raw://b600b852e0597aa69989cc263111f02097e2827edc1bdc70306303e3af5e9929\",\"dweb:/ipfs/QmU4WfM28A1nDqghuuGeFmN3CnVrk6opWtiF65K4vhFPeC\"],\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/math/SignedMath.sol\":{\"keccak256\":\"0xb3ebde1c8d27576db912d87c3560dab14adfb9cd001be95890ec4ba035e652e7\",\"urls\":[\"bzz-raw://a709421c4f5d4677db8216055d2d4dac96a613efdb08178a9f7041f0c5cef689\",\"dweb:/ipfs/QmYs2rStvVLDnSJs8HgaMD1ABwoKKWdiVbQyNfLfFWTjTy\"],\"license\":\"MIT\"},\"lib/solmate/src/utils/FixedPointMathLib.sol\":{\"keccak256\":\"0x622fcd8a49e132df5ec7651cc6ae3aaf0cf59bdcd67a9a804a1b9e2485113b7d\",\"urls\":[\"bzz-raw://af77088eb606427d4c55e578984a615779c86bc30646a20f7bb27299ba390f7c\",\"dweb:/ipfs/QmZGQdhdQDtHc7gZXWrKXgA3govc74X8U63BiWhPQK3mK8\"],\"license\":\"MIT\"},\"src/L1/ResourceMetering.sol\":{\"keccak256\":\"0xcbdb44713cb15af4c542ef51f2be9e32da0bb4ffc72a03953b38870955023fc3\",\"urls\":[\"bzz-raw://0d7663f5fac06c6344f68aa531d7e9a4e0ba9d2d3a6a3ad8d5bbec4b9b9ca202\",\"dweb:/ipfs/QmbMAZcVwf7syjhKyj3LjwsNMVZiQUPaV5D1zEr4r57v6H\"],\"license\":\"MIT\"},\"src/libraries/Arithmetic.sol\":{\"keccak256\":\"0x06a5a8b00527843f0cfc1bb3c0661316966a6cc432f88be31f23cde78cd07560\",\"urls\":[\"bzz-raw://d5209e78e5415c0bf8b350362a825cc56152811abd6fcf2df3d4fa47766d3dee\",\"dweb:/ipfs/Qmf43xyc4Um32NmccayDfhm8kSnS2mhHXpPZnwABJS7cWm\"],\"license\":\"MIT\"},\"src/libraries/Burn.sol\":{\"keccak256\":\"0x90a795bcea3ef06d6d5011256c4bd63d1a4271f519246dbf1ee3e8f1c0e21010\",\"urls\":[\"bzz-raw://9f60c3aa77cf0c484ddda4754157cff4dc0e2eace4bea67990daff4c0612ab5f\",\"dweb:/ipfs/QmSYGanMFve9uBC17X7hFneSFnwnJxz86Jgh6MX9BRMweb\"],\"license\":\"MIT\"},\"src/libraries/Constants.sol\":{\"keccak256\":\"0x8fcbc468fa4924f81538d4a6674031e12b62b61a88e869fdf099158a0d0c6a19\",\"urls\":[\"bzz-raw://fc7b9bca6c12fdd38e556650ec1eda3cccb0de4d474d2e97904cbd483b147359\",\"dweb:/ipfs/QmW4oKjDtHJj4cNfMhMLDteQEHSUuZtwrrFUJRnZCbQTJd\"],\"license\":\"MIT\"},\"src/universal/Proxy.sol\":{\"keccak256\":\"0xc56de5e39cd44eaeb93f0f8705dd07f4a89f66d5c186522532cf899a104cdbca\",\"urls\":[\"bzz-raw://cd1b595148fa62a798343a23e3330e79fef7d747f039d664482044be9ec0ccf3\",\"dweb:/ipfs/QmeAft6H9wbc9zZZ3prtRaBGGzcPy9yExKAhZHjp1iZ8UF\"],\"license\":\"MIT\"}},\"version\":1}", + "numDeployments": 1, + "receipt": { + "transactionHash": "0x7783ed1ab289f5997f3e171e7e9b7ccf2453fd065bb9779fcd04adaba7c43c25", + "transactionIndex": "0x1", + "blockHash": "0xc763cb8aa0b1ade52d373e5abf43472f4e8bfafa90d2751a3fc6a072c2297c32", + "blockNumber": "0x948619", + "from": "0x0a08E04c73f22C65D6dBFF20f87171240df6E519", + "to": null, + "cumulativeGasUsed": "0x85458", + "gasUsed": "0x80250", + "contractAddress": "0x79ADD5713B383DAa0a138d3C4780C7A1804a8090", + "logs": [ + { + "address": "0x79ADD5713B383DAa0a138d3C4780C7A1804a8090", + "topics": [ + "0x7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a08e04c73f22c65d6dbff20f87171240df6e519", + "blockHash": "0xc763cb8aa0b1ade52d373e5abf43472f4e8bfafa90d2751a3fc6a072c2297c32", + "blockNumber": "0x948619", + "transactionHash": "0x7783ed1ab289f5997f3e171e7e9b7ccf2453fd065bb9779fcd04adaba7c43c25", + "transactionIndex": "0x1", + "logIndex": "0x0", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000800000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0xb2d05e0c" + }, + "solcInputHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "storageLayout": { + "storage": [], + "types": {} + }, + "transactionHash": "0x7783ed1ab289f5997f3e171e7e9b7ccf2453fd065bb9779fcd04adaba7c43c25", + "userdoc": { + "version": 1, + "kind": "user", + "methods": { + "admin()": { + "notice": "Gets the owner of the proxy contract." + }, + "changeAdmin(address)": { + "notice": "Changes the owner of the proxy contract. Only callable by the owner." + }, + "constructor": { + "notice": "Sets the initial admin during contract deployment. Admin address is stored at the EIP-1967 admin storage slot so that accidental storage collision with the implementation is not possible." + }, + "upgradeTo(address)": { + "notice": "Set the implementation contract address. The code at the given address will execute when this contract is called." + }, + "upgradeToAndCall(address,bytes)": { + "notice": "Set the implementation and call a function in a single transaction. Useful to ensure atomic execution of initialization-based upgrades." + } + }, + "events": { + "AdminChanged(address,address)": { + "notice": "An event that is emitted each time the owner is upgraded. This event is part of the EIP-1967 specification." + }, + "Upgraded(address)": { + "notice": "An event that is emitted each time the implementation is changed. This event is part of the EIP-1967 specification." + } + }, + "notice": "Proxy is a transparent proxy that passes through the call if the caller is the owner or if the caller is address(0), meaning that the call originated from an off-chain simulation." + } +} \ No newline at end of file From ebe48e44dfc4a0936f110625925afc3dc033255a Mon Sep 17 00:00:00 2001 From: protolambda Date: Thu, 21 Sep 2023 15:35:28 +0200 Subject: [PATCH 82/87] go: update libp2p to fix Go 1.21 build --- go.mod | 65 ++++++----- go.sum | 171 +++++++++++----------------- op-e2e/system_test.go | 2 +- op-node/p2p/host.go | 6 +- op-node/p2p/peer_scores_test.go | 4 +- op-node/p2p/store/scorebook_test.go | 4 +- 6 files changed, 110 insertions(+), 142 deletions(-) diff --git a/go.mod b/go.mod index 59d6368974b3..a3931f1a08ca 100644 --- a/go.mod +++ b/go.mod @@ -6,7 +6,7 @@ require ( github.com/BurntSushi/toml v1.3.2 github.com/btcsuite/btcd v0.23.3 github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 - github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 + 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-20230817174831-5d3ca1966435 github.com/ethereum/go-ethereum v1.12.0 @@ -18,18 +18,19 @@ require ( github.com/google/gofuzz v1.2.1-0.20220503160820-4a35382e8fc8 github.com/google/uuid v1.3.1 github.com/hashicorp/go-multierror v1.1.1 - github.com/hashicorp/golang-lru/v2 v2.0.2 + github.com/hashicorp/golang-lru/v2 v2.0.5 github.com/holiman/uint256 v1.2.3 github.com/ipfs/go-datastore v0.6.0 github.com/ipfs/go-ds-leveldb v0.5.0 github.com/jackc/pgtype v1.14.0 github.com/jackc/pgx/v5 v5.4.3 - github.com/libp2p/go-libp2p v0.27.8 + github.com/libp2p/go-libp2p v0.31.0 + github.com/libp2p/go-libp2p-mplex v0.9.0 github.com/libp2p/go-libp2p-pubsub v0.9.3 github.com/libp2p/go-libp2p-testing v0.12.0 github.com/mattn/go-isatty v0.0.19 github.com/multiformats/go-base32 v0.1.0 - github.com/multiformats/go-multiaddr v0.10.1 + github.com/multiformats/go-multiaddr v0.11.0 github.com/multiformats/go-multiaddr-dns v0.3.1 github.com/olekukonko/tablewriter v0.0.5 github.com/onsi/gomega v1.27.10 @@ -39,7 +40,7 @@ require ( github.com/stretchr/testify v1.8.4 github.com/urfave/cli/v2 v2.25.7 golang.org/x/crypto v0.13.0 - golang.org/x/exp v0.0.0-20230626212559-97b1e661b5df + golang.org/x/exp v0.0.0-20230817173708-d852ddb80c63 golang.org/x/sync v0.3.0 golang.org/x/term v0.12.0 golang.org/x/time v0.3.0 @@ -51,7 +52,7 @@ require ( github.com/DataDog/zstd v1.5.2 // indirect github.com/VictoriaMetrics/fastcache v1.10.0 // indirect github.com/allegro/bigcache v1.2.1 // indirect - github.com/benbjohnson/clock v1.3.0 // indirect + github.com/benbjohnson/clock v1.3.5 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/bits-and-blooms/bitset v1.7.0 // indirect github.com/btcsuite/btcd/btcec/v2 v2.2.0 // indirect @@ -72,7 +73,7 @@ require ( github.com/davecgh/go-spew v1.1.1 // indirect github.com/davidlazar/go-crypto v0.0.0-20200604182044-b73af7476f6c // indirect github.com/deckarep/golang-set/v2 v2.1.0 // indirect - github.com/decred/dcrd/crypto/blake256 v1.0.0 // indirect + github.com/decred/dcrd/crypto/blake256 v1.0.1 // indirect github.com/deepmap/oapi-codegen v1.8.2 // indirect github.com/dlclark/regexp2 v1.7.0 // indirect github.com/docker/docker v20.10.24+incompatible // indirect @@ -99,13 +100,14 @@ require ( github.com/golang/mock v1.6.0 // indirect github.com/golang/protobuf v1.5.3 // indirect github.com/google/gopacket v1.1.19 // indirect - github.com/google/pprof v0.0.0-20230405160723-4a4c7d95572b // indirect + github.com/google/pprof v0.0.0-20230817174616-7a8ec2ada47b // indirect github.com/gorilla/websocket v1.5.0 // indirect github.com/graph-gophers/graphql-go v1.3.0 // indirect github.com/hashicorp/errwrap v1.1.0 // indirect github.com/hashicorp/go-bexpr v0.1.11 // indirect + github.com/hashicorp/golang-lru/arc/v2 v2.0.5 // indirect github.com/holiman/bloomfilter/v2 v2.0.3 // indirect - github.com/huin/goupnp v1.1.0 // indirect + github.com/huin/goupnp v1.2.0 // indirect github.com/influxdata/influxdb-client-go/v2 v2.4.0 // indirect github.com/influxdata/influxdb1-client v0.0.0-20220302092344-a9ab5670611c // indirect github.com/influxdata/line-protocol v0.0.0-20210311194329-9aa0e372d097 // indirect @@ -121,8 +123,8 @@ require ( github.com/jinzhu/inflection v1.0.0 // indirect github.com/jinzhu/now v1.1.5 // indirect github.com/karalabe/usb v0.0.2 // indirect - github.com/klauspost/compress v1.16.4 // indirect - github.com/klauspost/cpuid/v2 v2.2.4 // indirect + github.com/klauspost/compress v1.16.7 // indirect + github.com/klauspost/cpuid/v2 v2.2.5 // indirect github.com/koron/go-ssdp v0.0.4 // indirect github.com/kr/pretty v0.3.1 // indirect github.com/kr/text v0.2.0 // indirect @@ -133,18 +135,18 @@ require ( github.com/libp2p/go-libp2p-asn-util v0.3.0 // indirect github.com/libp2p/go-mplex v0.7.0 // indirect github.com/libp2p/go-msgio v0.3.0 // indirect - github.com/libp2p/go-nat v0.1.0 // indirect + github.com/libp2p/go-nat v0.2.0 // indirect github.com/libp2p/go-netroute v0.2.1 // indirect - github.com/libp2p/go-reuseport v0.2.0 // indirect - github.com/libp2p/go-yamux/v4 v4.0.0 // indirect + github.com/libp2p/go-reuseport v0.4.0 // indirect + github.com/libp2p/go-yamux/v4 v4.0.1 // indirect github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd // indirect github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-runewidth v0.0.14 // indirect github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect - github.com/miekg/dns v1.1.53 // indirect + github.com/miekg/dns v1.1.55 // indirect github.com/mikioh/tcpinfo v0.0.0-20190314235526-30a79bb1804b // indirect github.com/mikioh/tcpopt v0.0.0-20190314235656-172688c1accc // indirect - github.com/minio/sha256-simd v1.0.0 // indirect + github.com/minio/sha256-simd v1.0.1 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect github.com/mitchellh/pointerstructure v1.2.1 // indirect github.com/mmcloughlin/addchain v0.4.0 // indirect @@ -152,26 +154,25 @@ require ( github.com/multiformats/go-base36 v0.2.0 // indirect github.com/multiformats/go-multiaddr-fmt v0.1.0 // indirect github.com/multiformats/go-multibase v0.2.0 // indirect - github.com/multiformats/go-multicodec v0.8.1 // indirect - github.com/multiformats/go-multihash v0.2.1 // indirect + github.com/multiformats/go-multicodec v0.9.0 // indirect + github.com/multiformats/go-multihash v0.2.3 // indirect github.com/multiformats/go-multistream v0.4.1 // indirect github.com/multiformats/go-varint v0.0.7 // indirect github.com/naoina/go-stringutil v0.1.0 // indirect github.com/naoina/toml v0.1.2-0.20170918210437-9fafd6967416 // indirect github.com/onsi/ginkgo/v2 v2.11.0 // indirect - github.com/opencontainers/runtime-spec v1.0.2 // indirect + github.com/opencontainers/runtime-spec v1.1.0 // indirect github.com/opentracing/opentracing-go v1.2.0 // indirect github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58 // indirect github.com/peterh/liner v1.1.1-0.20190123174540-a2c9a5303de7 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/prometheus/client_model v0.3.0 // indirect + github.com/prometheus/client_model v0.4.0 // indirect github.com/prometheus/common v0.42.0 // indirect github.com/prometheus/procfs v0.9.0 // indirect github.com/quic-go/qpack v0.4.0 // indirect - github.com/quic-go/qtls-go1-19 v0.3.3 // indirect - github.com/quic-go/qtls-go1-20 v0.2.3 // indirect - github.com/quic-go/quic-go v0.33.0 // indirect - github.com/quic-go/webtransport-go v0.5.2 // indirect + github.com/quic-go/qtls-go1-20 v0.3.3 // indirect + github.com/quic-go/quic-go v0.38.1 // indirect + github.com/quic-go/webtransport-go v0.5.3 // indirect github.com/raulk/go-watchdog v1.3.0 // indirect github.com/rivo/uniseg v0.4.3 // indirect github.com/rogpeppe/go-internal v1.9.0 // indirect @@ -188,23 +189,21 @@ require ( github.com/tyler-smith/go-bip39 v1.1.0 // indirect github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 // indirect github.com/yusufpapurcu/wmi v1.2.2 // indirect - go.uber.org/atomic v1.10.0 // indirect - go.uber.org/dig v1.16.1 // indirect - go.uber.org/fx v1.19.2 // indirect + go.uber.org/dig v1.17.0 // indirect + go.uber.org/fx v1.20.0 // indirect go.uber.org/multierr v1.11.0 // indirect - go.uber.org/zap v1.24.0 // indirect - golang.org/x/mod v0.11.0 // indirect - golang.org/x/net v0.12.0 // indirect + go.uber.org/zap v1.25.0 // indirect + golang.org/x/mod v0.12.0 // indirect + golang.org/x/net v0.14.0 // indirect golang.org/x/sys v0.12.0 // indirect golang.org/x/text v0.13.0 // indirect - golang.org/x/tools v0.9.3 // indirect + golang.org/x/tools v0.12.1-0.20230815132531-74c255bcf846 // indirect google.golang.org/protobuf v1.30.0 // indirect gopkg.in/natefinch/lumberjack.v2 v2.0.0 // indirect gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect - lukechampine.com/blake3 v1.1.7 // indirect - nhooyr.io/websocket v1.8.7 // indirect + lukechampine.com/blake3 v1.2.1 // indirect rsc.io/tmplfunc v0.0.3 // indirect ) diff --git a/go.sum b/go.sum index 4cf869d0475d..8f5f4a39ad02 100644 --- a/go.sum +++ b/go.sum @@ -30,8 +30,9 @@ github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYU github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= github.com/aymerick/raymond v2.0.3-0.20180322193309-b565731e1464+incompatible/go.mod h1:osfaiScAUVup+UC9Nfq76eWqDhXlp+4UYaA8uhTBO6g= github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= -github.com/benbjohnson/clock v1.3.0 h1:ip6w0uFQkncKQ979AypyG0ER7mqUSBdKLOgAle/AT8A= github.com/benbjohnson/clock v1.3.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= +github.com/benbjohnson/clock v1.3.5 h1:VvXlSJBzZpA/zum6Sj74hxwYI2DIxRWuNIoXAzHZz5o= +github.com/benbjohnson/clock v1.3.5/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= @@ -122,11 +123,12 @@ github.com/davidlazar/go-crypto v0.0.0-20200604182044-b73af7476f6c h1:pFUpOrbxDR github.com/davidlazar/go-crypto v0.0.0-20200604182044-b73af7476f6c/go.mod h1:6UhI8N9EjYm1c2odKpFpAYeR8dsBeM7PtzQhRgxRr9U= github.com/deckarep/golang-set/v2 v2.1.0 h1:g47V4Or+DUdzbs8FxCCmgb6VYd+ptPAngjM6dtGktsI= github.com/deckarep/golang-set/v2 v2.1.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= -github.com/decred/dcrd/crypto/blake256 v1.0.0 h1:/8DMNYp9SGi5f0w7uCm6d6M4OU2rGFK09Y2A4Xv7EE0= github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc= +github.com/decred/dcrd/crypto/blake256 v1.0.1 h1:7PltbUIQB7u/FfZ39+DGa/ShuMyJ5ilcvdfma9wOH6Y= +github.com/decred/dcrd/crypto/blake256 v1.0.1/go.mod h1:2OfgNZ5wDpcsFmHmCK5gZTPcCXqlm2ArzUIkw9czNJo= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1/go.mod h1:hyedUtir6IdtD/7lIxGeCxkaw7y45JueMRL4DIyJDKs= -github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 h1:HbphB4TFFXpv7MNrT52FGrrgVXF1owhMVTHFZIlnvd4= -github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0/go.mod h1:DZGJHZMqrU4JJqFAWUS2UO1+lbSKsdiOoYi9Zzey7Fc= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 h1:8UrgZ3GkP4i/CLijOJx79Yu+etlyjdBU4sfcs2WYQMs= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0/go.mod h1:v57UDF4pDQJcEfFUCRop3lJL149eHGSe9Jvczhzjo/0= github.com/decred/dcrd/lru v1.0.0/go.mod h1:mxKOwFd7lFjN2GZYsiz/ecgqR6kkYAl+0pz0tEMk218= github.com/deepmap/oapi-codegen v1.6.0/go.mod h1:ryDa9AgbELGeB+YEXE1dR53yAjHwFvE9iAUlWl9Al3M= github.com/deepmap/oapi-codegen v1.8.2 h1:SegyeYGcdi0jLLrpbCMoJxnUUn8GBXHsvr4rbzjuhfU= @@ -198,11 +200,7 @@ github.com/getsentry/sentry-go v0.18.0 h1:MtBW5H9QgdcJabtZcuJG80BMOwaBpkRDZkxRkN github.com/getsentry/sentry-go v0.18.0/go.mod h1:Kgon4Mby+FJ7ZWHFUAZgVaIa8sxHtnRJRLTXZr51aKQ= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/gin-contrib/sse v0.0.0-20190301062529-5545eab6dad3/go.mod h1:VJ0WA2NBN22VlZ2dKZQPAPnyWw5XTlK1KymzLKsr59s= -github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= -github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= github.com/gin-gonic/gin v1.4.0/go.mod h1:OW2EZn3DO8Ln9oIKOvM++LBO+5UPHJJDH72/q/3rZdM= -github.com/gin-gonic/gin v1.6.3/go.mod h1:75u5sXoLsGZoRN5Sgbi1eraJ4GU3++wFwWzhwvtwp4M= -github.com/gin-gonic/gin v1.8.1 h1:4+fr/el88TOO3ewCmQr8cx/CtZ/umlIRIs5M4NTNjf8= github.com/gliderlabs/ssh v0.1.1/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= github.com/go-check/check v0.0.0-20180628173108-788fd7840127/go.mod h1:9ES+weclKsC9YodN5RgxqK/VD9HM9JsCSh7rNhMZE98= github.com/go-chi/chi/v5 v5.0.0/go.mod h1:BBug9lr0cqtdAhsu6R4AAdvufI0/XBzAQSsUqJpoZOs= @@ -222,13 +220,6 @@ github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= -github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= -github.com/go-playground/locales v0.14.0 h1:u50s323jtVGugKlcYeyzC0etD1HifMjqmJqb8WugfUU= -github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= -github.com/go-playground/universal-translator v0.18.0 h1:82dyy6p4OuJq4/CByFNOn/jYrnRPArHwAcmLoJZxyho= -github.com/go-playground/validator/v10 v10.2.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI= -github.com/go-playground/validator/v10 v10.11.1 h1:prmOlTVv+YjZjmRmNSF3VmspqJIxJWXmqUsHwfTRRkQ= github.com/go-sourcemap/sourcemap v2.1.3+incompatible h1:W1iEw64niKVGogNgBN3ePyLFfuisuzeidWPMPWmECqU= github.com/go-sourcemap/sourcemap v2.1.3+incompatible/go.mod h1:F8jJfvm2KbVjc5NqelyYJmf/v5J0dwNLS2mL4sNA1Jg= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= @@ -237,13 +228,9 @@ github.com/go-stack/stack v1.8.1/go.mod h1:dcoOX6HbPZSZptuspn9bctJ+N/CnF5gGygcUP github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls= -github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee h1:s+21KNqlpePfkah2I+gwHF8xmJWRjooY+5248k6m4A0= github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo= -github.com/gobwas/pool v0.2.0 h1:QEmUOlnSjWtnpRGHF3SauEiOsy82Cup83Vf2LcMlnc8= github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= -github.com/gobwas/ws v1.0.2 h1:CoAavW/wd/kulfZmSIBt6p24n4j7tHgNVCjsfHVNUbo= github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM= -github.com/goccy/go-json v0.9.11 h1:/pAaQDLHEoCq/5FFmSKBswWmK6H0e8g4159Kc/X/nqk= github.com/godbus/dbus/v5 v5.0.3/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/godbus/dbus/v5 v5.1.0 h1:4KLkAxT3aOY8Li4FRJe/KvhoNFFxo0m6fNuFUO8QJUk= @@ -271,8 +258,6 @@ github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+Licev github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= @@ -305,15 +290,14 @@ github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.2.1-0.20220503160820-4a35382e8fc8 h1:Ep/joEub9YwcjRY6ND3+Y/w0ncE540RtGatVhtZL0/Q= github.com/google/gofuzz v1.2.1-0.20220503160820-4a35382e8fc8/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/gopacket v1.1.17/go.mod h1:UdDNZ1OO62aGYVnPhxT1U6aI7ukYtA/kB8vaU0diBUM= github.com/google/gopacket v1.1.19 h1:ves8RnFZPGiFnTS0uPQStjwru6uO6h+nlr9j6fL7kF8= github.com/google/gopacket v1.1.19/go.mod h1:iJ8V8n6KS+z2U1A8pUwu8bW5SyEMkXJB8Yo/Vo+TKTo= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20211214055906-6f57359322fd/go.mod h1:KgnwoLYCZ8IQu3XUZ8Nc/bM9CCZFOyjUNOSygVozoDg= -github.com/google/pprof v0.0.0-20230405160723-4a4c7d95572b h1:Qcx5LM0fSiks9uCyFZwDBUasd3lxd1RM0GYpL+Li5o4= -github.com/google/pprof v0.0.0-20230405160723-4a4c7d95572b/go.mod h1:79YE0hCXdHag9sBkw2o+N/YnZtTkXi0UT9Nnixa5eYk= +github.com/google/pprof v0.0.0-20230817174616-7a8ec2ada47b h1:h9U78+dx9a4BKdQkBBos92HalKpaGKHrp+3Uo6yTodo= +github.com/google/pprof v0.0.0-20230817174616-7a8ec2ada47b/go.mod h1:czg5+yv1E0ZGTi6S6vVK1mke0fV+FaUhNGcd6VRS9Ik= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/subcommands v1.2.0/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= @@ -339,18 +323,18 @@ github.com/hashicorp/go-bexpr v0.1.11/go.mod h1:f03lAo0duBlDIUMGCuad8oLcgejw4m7U github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= -github.com/hashicorp/golang-lru/v2 v2.0.2 h1:Dwmkdr5Nc/oBiXgJS3CDHNhJtIHkuZ3DZF5twqnfBdU= -github.com/hashicorp/golang-lru/v2 v2.0.2/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= +github.com/hashicorp/golang-lru/arc/v2 v2.0.5 h1:l2zaLDubNhW4XO3LnliVj0GXO3+/CGNJAg1dcN2Fpfw= +github.com/hashicorp/golang-lru/arc/v2 v2.0.5/go.mod h1:ny6zBSQZi2JxIeYcv7kt2sH2PXJtirBN7RDhRpxPkxU= +github.com/hashicorp/golang-lru/v2 v2.0.5 h1:wW7h1TG88eUIJ2i69gaE3uNVtEPIagzhGvHgwfx2Vm4= +github.com/hashicorp/golang-lru/v2 v2.0.5/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/holiman/bloomfilter/v2 v2.0.3 h1:73e0e/V0tCydx14a0SCYS/EWCxgwLZ18CZcZKVu0fao= github.com/holiman/bloomfilter/v2 v2.0.3/go.mod h1:zpoh+gs7qcpqrHr3dB55AMiJwo0iURXE7ZOP9L9hSkA= github.com/holiman/uint256 v1.2.3 h1:K8UWO1HUJpRMXBxbmaY1Y8IAMZC/RsKB+ArEnnK4l5o= github.com/holiman/uint256 v1.2.3/go.mod h1:SC8Ryt4n+UBbPbIBKaG9zbbDlp4jOru9xFZmPzLUTxw= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/huin/goupnp v1.0.0/go.mod h1:n9v9KO1tAxYH82qOn+UTIFQDmx5n1Zxd/ClZDMX7Bnc= -github.com/huin/goupnp v1.1.0 h1:gEe0Dp/lZmPZiDFzJJaOfUpOvv2MKUkoBX8lDrn9vKU= -github.com/huin/goupnp v1.1.0/go.mod h1:gnGPsThkYa7bFi/KWmEysQRf48l2dvR5bxr2OFckNX8= -github.com/huin/goutil v0.0.0-20170803182201-1ca381bf3150/go.mod h1:PpLOETDnJ0o3iZrZfqZzyLl6l7F3c6L1oWn7OICBi6o= +github.com/huin/goupnp v1.2.0 h1:uOKW26NG1hsSSbXIZ1IR7XP9Gjd1U8pnLaCMgntmkmY= +github.com/huin/goupnp v1.2.0/go.mod h1:gnGPsThkYa7bFi/KWmEysQRf48l2dvR5bxr2OFckNX8= github.com/hydrogen18/memlistener v0.0.0-20200120041712-dcc25e7acd91/go.mod h1:qEIFzExnS6016fRpRfxrExeVn2gbClQA99gQhnIcdhE= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20210905161508-09a460cdf81d/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w= @@ -447,7 +431,6 @@ github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/ github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/julienschmidt/httprouter v1.3.0 h1:U0609e9tgbseu3rBINet9P48AI/D3oJs4dN7jwJOQ1U= @@ -465,17 +448,13 @@ github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+o github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4= github.com/klauspost/compress v1.8.2/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= github.com/klauspost/compress v1.9.7/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= -github.com/klauspost/compress v1.10.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= -github.com/klauspost/compress v1.16.4 h1:91KN02FnsOYhuunwU4ssRe8lc2JosWmizWa91B5v1PU= -github.com/klauspost/compress v1.16.4/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= +github.com/klauspost/compress v1.16.7 h1:2mk3MPGNzKyxErAw8YaohYh69+pa4sIQSC0fPGCFR9I= +github.com/klauspost/compress v1.16.7/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= github.com/klauspost/cpuid v1.2.1/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= -github.com/klauspost/cpuid/v2 v2.0.4/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= -github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= -github.com/klauspost/cpuid/v2 v2.2.4 h1:acbojRNwl3o09bUq+yDCtZFc1aiwaAAxtcn8YkZXnvk= -github.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= +github.com/klauspost/cpuid/v2 v2.2.5 h1:0E5MSMDEoAulmXNFquVs//DdoomxaoTY1kUhbc/qbZg= +github.com/klauspost/cpuid/v2 v2.2.5/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/koron/go-ssdp v0.0.0-20191105050749-2e1c40ed0b5d/go.mod h1:5Ky9EC2xfoUKUor0Hjgi2BJhCSXJfMOFlmyYrVKGQMk= github.com/koron/go-ssdp v0.0.4 h1:1IDwrghSKYM7yLf7XCzbByg2sJ/JcNOZRXS2jczTwz0= github.com/koron/go-ssdp v0.0.4/go.mod h1:oDXq+E5IL5q0U8uSBcoAXzTzInwy5lEgC91HoKtbmZk= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= @@ -496,8 +475,6 @@ github.com/labstack/echo/v4 v4.5.0/go.mod h1:czIriw4a0C1dFun+ObrXp7ok03xON0N1awS github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= github.com/leanovate/gopter v0.2.9 h1:fQjYxZaynp97ozCzfOyOuAGOU4aU/z37zf/tOujFk7c= github.com/leanovate/gopter v0.2.9/go.mod h1:U2L/78B+KVFIx2VmW6onHJQzXtFb+p5y3y2Sh+Jxxv8= -github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= -github.com/leodido/go-urn v1.2.1 h1:BqpAaACuzVSgi/VLzGZIobT2z4v53pjosyNd9Yv6n/w= github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.1.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= @@ -510,10 +487,12 @@ github.com/libp2p/go-cidranger v1.1.0 h1:ewPN8EZ0dd1LSnrtuwd4709PXVcITVeuwbag38y github.com/libp2p/go-cidranger v1.1.0/go.mod h1:KWZTfSr+r9qEo9OkI9/SIEeAtw+NNoU0dXIXt15Okic= github.com/libp2p/go-flow-metrics v0.1.0 h1:0iPhMI8PskQwzh57jB9WxIuIOQ0r+15PChFGkx3Q3WM= github.com/libp2p/go-flow-metrics v0.1.0/go.mod h1:4Xi8MX8wj5aWNDAZttg6UPmc0ZrnFNsMtpsYUClFtro= -github.com/libp2p/go-libp2p v0.27.8 h1:IX5x/4yKwyPQeVS2AXHZ3J4YATM9oHBGH1gBc23jBAI= -github.com/libp2p/go-libp2p v0.27.8/go.mod h1:eCFFtd0s5i/EVKR7+5Ki8bM7qwkNW3TPTTSSW9sz8NE= +github.com/libp2p/go-libp2p v0.31.0 h1:LFShhP8F6xthWiBBq3euxbKjZsoRajVEyBS9snfHxYg= +github.com/libp2p/go-libp2p v0.31.0/go.mod h1:W/FEK1c/t04PbRH3fA9i5oucu5YcgrG0JVoBWT1B7Eg= github.com/libp2p/go-libp2p-asn-util v0.3.0 h1:gMDcMyYiZKkocGXDQ5nsUQyquC9+H+iLEQHwOCZ7s8s= github.com/libp2p/go-libp2p-asn-util v0.3.0/go.mod h1:B1mcOrKUE35Xq/ASTmQ4tN3LNzVVaMNmq2NACuqyB9w= +github.com/libp2p/go-libp2p-mplex v0.9.0 h1:R58pDRAmuBXkYugbSSXR9wrTX3+1pFM1xP2bLuodIq8= +github.com/libp2p/go-libp2p-mplex v0.9.0/go.mod h1:ro1i4kuwiFT+uMPbIDIFkcLs1KRbNp0QwnUXM+P64Og= github.com/libp2p/go-libp2p-pubsub v0.9.3 h1:ihcz9oIBMaCK9kcx+yHWm3mLAFBMAUsM4ux42aikDxo= github.com/libp2p/go-libp2p-pubsub v0.9.3/go.mod h1:RYA7aM9jIic5VV47WXu4GkcRxRhrdElWf8xtyli+Dzc= github.com/libp2p/go-libp2p-testing v0.12.0 h1:EPvBb4kKMWO29qP4mZGyhVzUyR25dvfUIK5WDu6iPUA= @@ -522,16 +501,14 @@ github.com/libp2p/go-mplex v0.7.0 h1:BDhFZdlk5tbr0oyFq/xv/NPGfjbnrsDam1EvutpBDbY github.com/libp2p/go-mplex v0.7.0/go.mod h1:rW8ThnRcYWft/Jb2jeORBmPd6xuG3dGxWN/W168L9EU= github.com/libp2p/go-msgio v0.3.0 h1:mf3Z8B1xcFN314sWX+2vOTShIE0Mmn2TXn3YCUQGNj0= github.com/libp2p/go-msgio v0.3.0/go.mod h1:nyRM819GmVaF9LX3l03RMh10QdOroF++NBbxAb0mmDM= -github.com/libp2p/go-nat v0.1.0 h1:MfVsH6DLcpa04Xr+p8hmVRG4juse0s3J8HyNWYHffXg= -github.com/libp2p/go-nat v0.1.0/go.mod h1:X7teVkwRHNInVNWQiO/tAiAVRwSr5zoRz4YSTC3uRBM= -github.com/libp2p/go-netroute v0.1.2/go.mod h1:jZLDV+1PE8y5XxBySEBgbuVAXbhtuHSdmLPL2n9MKbk= +github.com/libp2p/go-nat v0.2.0 h1:Tyz+bUFAYqGyJ/ppPPymMGbIgNRH+WqC5QrT5fKrrGk= +github.com/libp2p/go-nat v0.2.0/go.mod h1:3MJr+GRpRkyT65EpVPBstXLvOlAPzUVlG6Pwg9ohLJk= github.com/libp2p/go-netroute v0.2.1 h1:V8kVrpD8GK0Riv15/7VN6RbUQ3URNZVosw7H2v9tksU= github.com/libp2p/go-netroute v0.2.1/go.mod h1:hraioZr0fhBjG0ZRXJJ6Zj2IVEVNx6tDTFQfSmcq7mQ= -github.com/libp2p/go-reuseport v0.2.0 h1:18PRvIMlpY6ZK85nIAicSBuXXvrYoSw3dsBAR7zc560= -github.com/libp2p/go-reuseport v0.2.0/go.mod h1:bvVho6eLMm6Bz5hmU0LYN3ixd3nPPvtIlaURZZgOY4k= -github.com/libp2p/go-sockaddr v0.0.2/go.mod h1:syPvOmNs24S3dFVGJA1/mrqdeijPxLV2Le3BRLKd68k= -github.com/libp2p/go-yamux/v4 v4.0.0 h1:+Y80dV2Yx/kv7Y7JKu0LECyVdMXm1VUoko+VQ9rBfZQ= -github.com/libp2p/go-yamux/v4 v4.0.0/go.mod h1:NWjl8ZTLOGlozrXSOZ/HlfG++39iKNnM5wwmtQP1YB4= +github.com/libp2p/go-reuseport v0.4.0 h1:nR5KU7hD0WxXCJbmw7r2rhRYruNRl2koHw8fQscQm2s= +github.com/libp2p/go-reuseport v0.4.0/go.mod h1:ZtI03j/wO5hZVDFo2jKywN6bYKWLOy8Se6DrI2E1cLU= +github.com/libp2p/go-yamux/v4 v4.0.1 h1:FfDR4S1wj6Bw2Pqbc8Uz7pCxeRBPbwsBbEdfwiCypkQ= +github.com/libp2p/go-yamux/v4 v4.0.1/go.mod h1:NWjl8ZTLOGlozrXSOZ/HlfG++39iKNnM5wwmtQP1YB4= github.com/lunixbochs/vtclean v1.0.0/go.mod h1:pHhQNgMf3btfWnGBVipUOjRYhoOsdGqdm/+2c2E2WMI= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/mailru/easyjson v0.0.0-20190312143242-1de009706dbe/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= @@ -569,8 +546,8 @@ github.com/mediocregopher/radix/v3 v3.4.2/go.mod h1:8FL3F6UQRXHXIBSPUs5h0RybMF8i github.com/microcosm-cc/bluemonday v1.0.1/go.mod h1:hsXNsILzKxV+sX77C5b8FSuKF00vh2OMYv+xgHpAMF4= github.com/microcosm-cc/bluemonday v1.0.2/go.mod h1:iVP4YcDBq+n/5fb23BhYFvIMq/leAFZyRl6bYmGDlGc= github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI= -github.com/miekg/dns v1.1.53 h1:ZBkuHr5dxHtB1caEOlZTLPo7D3L3TWckgUUs/RHfDxw= -github.com/miekg/dns v1.1.53/go.mod h1:uInx36IzPl7FYnDcMeVWxj9byh7DutNykX4G9Sj60FY= +github.com/miekg/dns v1.1.55 h1:GoQ4hpsj0nFLYe+bWiCToyrBEJXkQfOOIvFGFy0lEgo= +github.com/miekg/dns v1.1.55/go.mod h1:uInx36IzPl7FYnDcMeVWxj9byh7DutNykX4G9Sj60FY= github.com/mikioh/tcp v0.0.0-20190314235350-803a9b46060c h1:bzE/A84HN25pxAuk9Eej1Kz9OUelF97nAc82bDquQI8= github.com/mikioh/tcp v0.0.0-20190314235350-803a9b46060c/go.mod h1:0SQS9kMwD2VsyFEB++InYyBJroV/FRmBgcydeSUcJms= github.com/mikioh/tcpinfo v0.0.0-20190314235526-30a79bb1804b h1:z78hV3sbSMAUoyUMM0I83AUIT6Hu17AWfgjzIbtrYFc= @@ -579,8 +556,8 @@ github.com/mikioh/tcpopt v0.0.0-20190314235656-172688c1accc h1:PTfri+PuQmWDqERdn github.com/mikioh/tcpopt v0.0.0-20190314235656-172688c1accc/go.mod h1:cGKTAVKx4SxOuR/czcZ/E2RSJ3sfHs8FpHhQ5CWMf9s= github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1/go.mod h1:pD8RvIylQ358TN4wwqatJ8rNavkEINozVn9DtGI3dfQ= github.com/minio/sha256-simd v0.1.1-0.20190913151208-6de447530771/go.mod h1:B5e1o+1/KgNmWrSQK08Y6Z1Vb5pwIktudl0J58iy0KM= -github.com/minio/sha256-simd v1.0.0 h1:v1ta+49hkWZyvaKwrQB8elexRqm6Y0aMLjCNsrYxo6g= -github.com/minio/sha256-simd v1.0.0/go.mod h1:OuYzVNI5vcoYIAmbIvHPl3N3jUzVedXbKy5RFepssQM= +github.com/minio/sha256-simd v1.0.1 h1:6kaan5IFmwTNynnKKpDHe6FWHohJOHhCPchzK49dzMM= +github.com/minio/sha256-simd v1.0.1/go.mod h1:Pz6AKMiUdngCLpeTL/RJY1M9rUuPMYujV5xJjtbRSN8= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= @@ -592,11 +569,9 @@ github.com/mmcloughlin/addchain v0.4.0 h1:SobOdjm2xLj1KkXN5/n0xTIWyZA2+s99UCY1iP github.com/mmcloughlin/addchain v0.4.0/go.mod h1:A86O+tHqZLMNO4w6ZZ4FlVQEadcoqkyU72HC5wJ4RlU= github.com/mmcloughlin/profile v0.1.1/go.mod h1:IhHD7q1ooxgwTgjxQYkACGA77oFTDdFVejUS1/tS/qU= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/moul/http2curl v1.0.0/go.mod h1:8UbvGypXm98wA/IqH45anm5Y2Z6ep6O31QGOAZ3H0fQ= github.com/mr-tron/base58 v1.1.2/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= github.com/mr-tron/base58 v1.2.0 h1:T/HDJBh4ZCPbU39/+c3rRvE0uKBQlU27+QI8LJ4t64o= @@ -607,19 +582,19 @@ github.com/multiformats/go-base36 v0.2.0 h1:lFsAbNOGeKtuKozrtBsAkSVhv1p9D0/qedU9 github.com/multiformats/go-base36 v0.2.0/go.mod h1:qvnKE++v+2MWCfePClUEjE78Z7P2a1UV0xHgWc0hkp4= github.com/multiformats/go-multiaddr v0.1.1/go.mod h1:aMKBKNEYmzmDmxfX88/vz+J5IU55txyt0p4aiWVohjo= github.com/multiformats/go-multiaddr v0.2.0/go.mod h1:0nO36NvPpyV4QzvTLi/lafl2y95ncPj0vFwVF6k6wJ4= -github.com/multiformats/go-multiaddr v0.10.1 h1:HghtFrWyZEPrpTvgAMFJi6gFdgHfs2cb0pyfDsk+lqU= -github.com/multiformats/go-multiaddr v0.10.1/go.mod h1:jLEZsA61rwWNZQTHHnqq2HNa+4os/Hz54eqiRnsRqYQ= +github.com/multiformats/go-multiaddr v0.11.0 h1:XqGyJ8ufbCE0HmTDwx2kPdsrQ36AGPZNZX6s6xfJH10= +github.com/multiformats/go-multiaddr v0.11.0/go.mod h1:gWUm0QLR4thQ6+ZF6SXUw8YjtwQSPapICM+NmCkxHSM= github.com/multiformats/go-multiaddr-dns v0.3.1 h1:QgQgR+LQVt3NPTjbrLLpsaT2ufAA2y0Mkk+QRVJbW3A= github.com/multiformats/go-multiaddr-dns v0.3.1/go.mod h1:G/245BRQ6FJGmryJCrOuTdB37AMA5AMOVuO6NY3JwTk= github.com/multiformats/go-multiaddr-fmt v0.1.0 h1:WLEFClPycPkp4fnIzoFoV9FVd49/eQsuaL3/CWe167E= github.com/multiformats/go-multiaddr-fmt v0.1.0/go.mod h1:hGtDIW4PU4BqJ50gW2quDuPVjyWNZxToGUh/HwTZYJo= github.com/multiformats/go-multibase v0.2.0 h1:isdYCVLvksgWlMW9OZRYJEa9pZETFivncJHmHnnd87g= github.com/multiformats/go-multibase v0.2.0/go.mod h1:bFBZX4lKCA/2lyOFSAoKH5SS6oPyjtnzK/XTFDPkNuk= -github.com/multiformats/go-multicodec v0.8.1 h1:ycepHwavHafh3grIbR1jIXnKCsFm0fqsfEOsJ8NtKE8= -github.com/multiformats/go-multicodec v0.8.1/go.mod h1:L3QTQvMIaVBkXOXXtVmYE+LI16i14xuaojr/H7Ai54k= +github.com/multiformats/go-multicodec v0.9.0 h1:pb/dlPnzee/Sxv/j4PmkDRxCOi3hXTz3IbPKOXWJkmg= +github.com/multiformats/go-multicodec v0.9.0/go.mod h1:L3QTQvMIaVBkXOXXtVmYE+LI16i14xuaojr/H7Ai54k= github.com/multiformats/go-multihash v0.0.8/go.mod h1:YSLudS+Pi8NHE7o6tb3D8vrpKa63epEDmG8nTduyAew= -github.com/multiformats/go-multihash v0.2.1 h1:aem8ZT0VA2nCHHk7bPJ1BjUbHNciqZC/d16Vve9l108= -github.com/multiformats/go-multihash v0.2.1/go.mod h1:WxoMcYG85AZVQUyRyo9s4wULvW5qrI9vb2Lt6evduFc= +github.com/multiformats/go-multihash v0.2.3 h1:7Lyc8XfX/IY2jWb/gI7JP+o7JEq9hOa7BFvVU9RSh+U= +github.com/multiformats/go-multihash v0.2.3/go.mod h1:dXgKXCXjBzdscBLk9JkjINiEsCKRVch90MdaGiKsvSM= github.com/multiformats/go-multistream v0.4.1 h1:rFy0Iiyn3YT0asivDUIR05leAdwZq3de4741sbiSdfo= github.com/multiformats/go-multistream v0.4.1/go.mod h1:Mz5eykRVAjJWckE2U78c6xqdtyNUEhKSM0Lwar2p77Q= github.com/multiformats/go-varint v0.0.1/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE= @@ -659,17 +634,16 @@ github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAl github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro= github.com/onsi/gomega v1.27.10 h1:naR28SdDFlqrG6kScpT8VWpu1xWY5nJRCF3XaYyBjhI= github.com/onsi/gomega v1.27.10/go.mod h1:RsS8tutOdbdgzbPtzzATp12yT7kM5I5aElG3evPbQ0M= -github.com/opencontainers/runtime-spec v1.0.2 h1:UfAcuLBJB9Coz72x1hgl8O5RVzTdNiaglX6v2DM6FI0= github.com/opencontainers/runtime-spec v1.0.2/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/runtime-spec v1.1.0 h1:HHUyrt9mwHUjtasSbXSMvs4cyFxh+Bll4AjJ9odEGpg= +github.com/opencontainers/runtime-spec v1.1.0/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/opentracing/opentracing-go v1.2.0 h1:uEJPy/1a5RIPAJ0Ov+OIO8OxWu77jEv+1B0VhjKrZUs= github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= github.com/openzipkin/zipkin-go v0.1.1/go.mod h1:NtoC/o8u3JlF1lSlyPNswIbeQH9bJTmOf0Erfk+hxe8= github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58 h1:onHthvaw9LFnH4t2DcNVpwGmV9E1BkGknEliJkfwQj0= github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58/go.mod h1:DXv8WO4yhMYhSNPKjeNKa5WY9YCIEBRbNzFFPJbWO6Y= -github.com/pelletier/go-toml v1.2.0 h1:T5zMGML61Wp+FlcbWjRDT7yAxhJNAiPPLOFECq181zc= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= -github.com/pelletier/go-toml/v2 v2.0.5 h1:ipoSadvV8oGUjnUbMub59IDPPwfxF694nG/jwbMiyQg= github.com/peterh/liner v1.1.1-0.20190123174540-a2c9a5303de7 h1:oYW+YCJ1pachXTQmzR3rNLYGGz4g/UgFcjb28p/viDM= github.com/peterh/liner v1.1.1-0.20190123174540-a2c9a5303de7/go.mod h1:CRroGNssyjTd/qIG2FyxByd2S8JEAZXBl4qUrZf8GS0= github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4= @@ -687,8 +661,8 @@ github.com/prometheus/client_golang v1.14.0 h1:nJdhIvne2eSX/XRAFV9PcvFFRbrjbcTUj github.com/prometheus/client_golang v1.14.0/go.mod h1:8vpkKitgIVNcqrRBWh1C4TIUQgYNtG/XQE4E/Zae36Y= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.3.0 h1:UBgGFHqYdG/TPFD1B1ogZywDqEkwp3fBMvqdiQ7Xew4= -github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w= +github.com/prometheus/client_model v0.4.0 h1:5lQXD3cAg1OXBf4Wq03gTrXHeaV0TQvGfUooCfx1yqY= +github.com/prometheus/client_model v0.4.0/go.mod h1:oMQmHW1/JoDwqLtg57MGgP/Fb1CJEYF2imWWhWtMkYU= github.com/prometheus/common v0.0.0-20180801064454-c7de2306084e/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/common v0.42.0 h1:EKsfXEYo4JpWMHH5cg+KOUWeuJSov1Id8zGR8eeI1YM= github.com/prometheus/common v0.42.0/go.mod h1:xBwqVerjNdUDjgODMpudtOMwlOwf2SaTr1yjz4b7Zbc= @@ -697,14 +671,12 @@ github.com/prometheus/procfs v0.9.0 h1:wzCHvIvM5SxWqYvwgVL7yJY8Lz3PKn49KQtpgMYJf github.com/prometheus/procfs v0.9.0/go.mod h1:+pB4zwohETzFnmlpe6yd2lSc+0/46IYZRB/chUwxUZY= github.com/quic-go/qpack v0.4.0 h1:Cr9BXA1sQS2SmDUWjSofMPNKmvF6IiIfDRmgU0w1ZCo= github.com/quic-go/qpack v0.4.0/go.mod h1:UZVnYIfi5GRk+zI9UMaCPsmZ2xKJP7XBUvVyT1Knj9A= -github.com/quic-go/qtls-go1-19 v0.3.3 h1:wznEHvJwd+2X3PqftRha0SUKmGsnb6dfArMhy9PeJVE= -github.com/quic-go/qtls-go1-19 v0.3.3/go.mod h1:ySOI96ew8lnoKPtSqx2BlI5wCpUVPT05RMAlajtnyOI= -github.com/quic-go/qtls-go1-20 v0.2.3 h1:m575dovXn1y2ATOb1XrRFcrv0F+EQmlowTkoraNkDPI= -github.com/quic-go/qtls-go1-20 v0.2.3/go.mod h1:JKtK6mjbAVcUTN/9jZpvLbGxvdWIKS8uT7EiStoU1SM= -github.com/quic-go/quic-go v0.33.0 h1:ItNoTDN/Fm/zBlq769lLJc8ECe9gYaW40veHCCco7y0= -github.com/quic-go/quic-go v0.33.0/go.mod h1:YMuhaAV9/jIu0XclDXwZPAsP/2Kgr5yMYhe9oxhhOFA= -github.com/quic-go/webtransport-go v0.5.2 h1:GA6Bl6oZY+g/flt00Pnu0XtivSD8vukOu3lYhJjnGEk= -github.com/quic-go/webtransport-go v0.5.2/go.mod h1:OhmmgJIzTTqXK5xvtuX0oBpLV2GkLWNDA+UeTGJXErU= +github.com/quic-go/qtls-go1-20 v0.3.3 h1:17/glZSLI9P9fDAeyCHBFSWSqJcwx1byhLwP5eUIDCM= +github.com/quic-go/qtls-go1-20 v0.3.3/go.mod h1:X9Nh97ZL80Z+bX/gUXMbipO6OxdiDi58b/fMC9mAL+k= +github.com/quic-go/quic-go v0.38.1 h1:M36YWA5dEhEeT+slOu/SwMEucbYd0YFidxG3KlGPZaE= +github.com/quic-go/quic-go v0.38.1/go.mod h1:ijnZM7JsFIkp4cRyjxJNIzdSfCLmUMg9wdyhGmg+SN4= +github.com/quic-go/webtransport-go v0.5.3 h1:5XMlzemqB4qmOlgIus5zB45AcZ2kCgCy2EptUrfOPWU= +github.com/quic-go/webtransport-go v0.5.3/go.mod h1:OhmmgJIzTTqXK5xvtuX0oBpLV2GkLWNDA+UeTGJXErU= github.com/raulk/go-watchdog v1.3.0 h1:oUmdlHxdkXRJlwfG0O9omj8ukerm8MEQavSiDTEtBsk= github.com/raulk/go-watchdog v1.3.0/go.mod h1:fIvOnLbF0b0ZwkB9YU4mOW9Did//4vPZtDqv66NfsMU= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= @@ -803,11 +775,9 @@ github.com/tklauser/numcpus v0.5.0/go.mod h1:OGzpTxpcIMNGYQdit2BYL1pvk/dSOaJWjKo github.com/tyler-smith/go-bip39 v1.1.0 h1:5eUemwrMargf3BSLRRCalXT93Ns6pQJIjYQN2nyfOP8= github.com/tyler-smith/go-bip39 v1.1.0/go.mod h1:gUYDtqQw1JS3ZJ8UWVcGTGqqr6YIN3CWg+kkNaLt55U= github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= -github.com/ugorji/go v1.1.7 h1:/68gy2h+1mWMrwZFeD1kQialdSzAb432dtpeJ42ovdo= github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= -github.com/ugorji/go/codec v1.2.7 h1:YPXUKf7fYbp/y8xloBqZOw2qaVggbfwMlI8WM3wZUJ0= github.com/urfave/cli v1.22.2/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/urfave/cli/v2 v2.25.7 h1:VAzn5oq403l5pHjc4OhD54+XGO9cdKVL/7lDjF+iKUs= github.com/urfave/cli/v2 v2.25.7/go.mod h1:8qnjx1vcq5s2/wpsqoZFndg2CE5tNFyrTvS6SinrnYQ= @@ -841,14 +811,13 @@ go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/atomic v1.10.0 h1:9qC72Qh0+3MqyJbAn8YU5xVq1frD8bn3JtD2oXtafVQ= -go.uber.org/atomic v1.10.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= -go.uber.org/dig v1.16.1 h1:+alNIBsl0qfY0j6epRubp/9obgtrObRAc5aD+6jbWY8= -go.uber.org/dig v1.16.1/go.mod h1:557JTAUZT5bUK0SvCwikmLPPtdQhfvLYtO5tJgQSbnk= -go.uber.org/fx v1.19.2 h1:SyFgYQFr1Wl0AYstE8vyYIzP4bFz2URrScjwC4cwUvY= -go.uber.org/fx v1.19.2/go.mod h1:43G1VcqSzbIv77y00p1DRAsyZS8WdzuYdhZXmEUkMyQ= +go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= +go.uber.org/dig v1.17.0 h1:5Chju+tUvcC+N7N6EV08BJz41UZuO3BmHcN4A287ZLI= +go.uber.org/dig v1.17.0/go.mod h1:rTxpf7l5I0eBTlE6/9RL+lDybC7WFwY2QH55ZSjy1mU= +go.uber.org/fx v1.20.0 h1:ZMC/pnRvhsthOZh9MZjMq5U8Or3mA9zBSPaLnzs3ihQ= +go.uber.org/fx v1.20.0/go.mod h1:qCUj0btiR3/JnanEr1TYEePfSw6o/4qYJscgvzQ5Ub0= go.uber.org/goleak v1.1.11-0.20210813005559-691160354723/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= -go.uber.org/goleak v1.1.12 h1:gZAh5/EyT/HQwlpkCy6wTpqfH9H8Lz8zbm3dZh+OyzA= +go.uber.org/goleak v1.2.0 h1:xqgm/S+aQvhWFTtR0XK3Jvg7z8kGV8P4X14IzwN3Eqk= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= @@ -860,8 +829,8 @@ go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= go.uber.org/zap v1.19.1/go.mod h1:j3DNczoxDZroyBnOT1L/Q79cfUMGZxlv/9dzN7SM1rI= -go.uber.org/zap v1.24.0 h1:FiJd5l1UOLj0wCgbSE0rwwXHzEdAZS6hiiSnxJN/D60= -go.uber.org/zap v1.24.0/go.mod h1:2kMP+WWQ8aoFoedH3T2sq6iJ2yDWpHbP0f6MQbS9Gkg= +go.uber.org/zap v1.25.0 h1:4Hvk6GtkucQ790dqmj7l1eEnRdKm3k3ZUrUMS2d5+5c= +go.uber.org/zap v1.25.0/go.mod h1:JIAUzQIH94IC4fOJQm7gMmBJP5k7wQfdcnYdPoEXJYk= go4.org v0.0.0-20180809161055-417644f6feb5/go.mod h1:MkTOUMDaeVYJUOUsaDXIhWPZYa1yOyC1qaOBpL57BhE= golang.org/x/build v0.0.0-20190111050920-041ab4dc3f9d/go.mod h1:OWs+y06UdEOHN4y+MfF/py+xQ/tYqIWW03b70/CG9Rw= golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= @@ -889,8 +858,8 @@ golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5y golang.org/x/crypto v0.13.0 h1:mvySKfSWJ+UKUii46M40LOvyWfN0s2U+46/jDd0e6Ck= golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20230626212559-97b1e661b5df h1:UA2aFVmmsIlefxMk29Dp2juaUSth8Pyn3Tq5Y5mJGME= -golang.org/x/exp v0.0.0-20230626212559-97b1e661b5df/go.mod h1:FXUEEKJgO7OQYeo8N01OfiKP8RXMtf6e8aTskBGqWdc= +golang.org/x/exp v0.0.0-20230817173708-d852ddb80c63 h1:m64FZMko/V45gv0bNmrNYoDEq8U5YUhetc9cBWKS1TQ= +golang.org/x/exp v0.0.0-20230817173708-d852ddb80c63/go.mod h1:0v4NqG35kSWCMzLaMeX+IQrlSnVE/bqGSyC2cz/9Le8= golang.org/x/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= @@ -903,13 +872,12 @@ golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzB golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.11.0 h1:bUO06HqtnRcc/7l71XBe4WcqTZ+3AH1J59zWDDwLKgU= -golang.org/x/mod v0.11.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.12.0 h1:rmsUpXtvNzj340zd98LZ4KntptpfRHwpFOHG188oHXc= +golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20180719180050-a680a1efc54d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181011144130-49bb7cea24b1/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181029044818-c44066c5c816/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181106065722-10aee1819953/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -936,8 +904,8 @@ golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT golang.org/x/net v0.0.0-20211008194852-3b03d305991f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.12.0 h1:cfawfvKITfUsFCeJIHJrbSxpeu/E81khclypR0GVT50= -golang.org/x/net v0.12.0/go.mod h1:zEVYFnQC7m/vmpQFELhcD1EWkZlX69l4oqgmer6hfKA= +golang.org/x/net v0.14.0 h1:BONx9s002vGdD9umnlX1Po8vOZmrgH34qlHcD1MfK14= +golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181017192945-9dcd33a902f4/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181203162652-d668ce993890/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= @@ -961,10 +929,8 @@ golang.org/x/sys v0.0.0-20181029174526-d69651ed3497/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190228124157-a34e9553db1e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190316082340-a2f829d7f35f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190405154228-4b34438f7a67/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1004,9 +970,9 @@ golang.org/x/sys v0.0.0-20220405052023-b1e9470b6e64/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.12.0 h1:CM0HF96J0hcLAwsHPJZjfdNzs0gftsLfgKt57wWHJ0o= golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -1027,7 +993,6 @@ golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= @@ -1058,8 +1023,8 @@ golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4f golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.9.3 h1:Gn1I8+64MsuTb/HpH+LmQtNas23LhUVr3rYZ0eKuaMM= -golang.org/x/tools v0.9.3/go.mod h1:owI94Op576fPu3cIGQeHs3joujW/2Oc6MtlxbF5dfNc= +golang.org/x/tools v0.12.1-0.20230815132531-74c255bcf846 h1:Vve/L0v7CXXuxUmaMGIEK/dEeq7uiqb5qBgQrZzIE7E= +golang.org/x/tools v0.12.1-0.20230815132531-74c255bcf846/go.mod h1:Sc0INKfu04TlqNoRA1hgpFZbhYXHPr4V5DzpSBTPqQM= golang.org/x/xerrors v0.0.0-20190410155217-1f06c39b4373/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20190513163551-3ee3066db522/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -1146,10 +1111,8 @@ honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWh honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= -lukechampine.com/blake3 v1.1.7 h1:GgRMhmdsuK8+ii6UZFDL8Nb+VyMwadAgcJyfYHxG6n0= -lukechampine.com/blake3 v1.1.7/go.mod h1:tkKEOtDkNtklkXtLNEOGNq5tcV90tJiA1vAA12R78LA= -nhooyr.io/websocket v1.8.7 h1:usjR2uOr/zjjkVMy0lW+PPohFok7PCow5sDjLgX4P4g= -nhooyr.io/websocket v1.8.7/go.mod h1:B70DZP8IakI65RVQ51MsWP/8jndNma26DVA/nFSCgW0= +lukechampine.com/blake3 v1.2.1 h1:YuqqRuaqsGV71BV/nm9xlI0MKUv4QC54jQnBChWbGnI= +lukechampine.com/blake3 v1.2.1/go.mod h1:0OFRp7fBtAylGVCO40o87sbupkyIGgbpv1+M1k1LM6k= rsc.io/tmplfunc v0.0.3 h1:53XFQh69AfOa8Tw0Jm7t+GV7KZhOi6jzsCzTtKbMvzU= rsc.io/tmplfunc v0.0.3/go.mod h1:AG3sTPzElb1Io3Yg4voV9AGZJuleGAwaVRxL9M49PhA= sourcegraph.com/sourcegraph/go-diff v0.5.0/go.mod h1:kuch7UrkMzY0X+p9CRK03kfuPQ2zzQcaEFbx8wA8rck= diff --git a/op-e2e/system_test.go b/op-e2e/system_test.go index aca2969a8db7..4b7a3b57ac53 100644 --- a/op-e2e/system_test.go +++ b/op-e2e/system_test.go @@ -492,7 +492,7 @@ func TestSystemMockP2P(t *testing.T) { verifierPeerID := sys.RollupNodes["verifier"].P2P().Host().ID() check := func() bool { sequencerBlocksTopicPeers := sys.RollupNodes["sequencer"].P2P().GossipOut().BlocksTopicPeers() - return slices.Contains[peer.ID](sequencerBlocksTopicPeers, verifierPeerID) + return slices.Contains[[]peer.ID](sequencerBlocksTopicPeers, verifierPeerID) } // poll to see if the verifier node is connected & meshed on gossip. diff --git a/op-node/p2p/host.go b/op-node/p2p/host.go index 46afafb8e35d..5396bed05d9c 100644 --- a/op-node/p2p/host.go +++ b/op-node/p2p/host.go @@ -7,7 +7,11 @@ import ( "sync" "time" + //nolint:all + "github.com/libp2p/go-libp2p/p2p/host/peerstore/pstoreds" + libp2p "github.com/libp2p/go-libp2p" + mplex "github.com/libp2p/go-libp2p-mplex" lconf "github.com/libp2p/go-libp2p/config" "github.com/libp2p/go-libp2p/core/connmgr" "github.com/libp2p/go-libp2p/core/host" @@ -16,8 +20,6 @@ import ( "github.com/libp2p/go-libp2p/core/peer" "github.com/libp2p/go-libp2p/core/sec/insecure" basichost "github.com/libp2p/go-libp2p/p2p/host/basic" - "github.com/libp2p/go-libp2p/p2p/host/peerstore/pstoreds" - "github.com/libp2p/go-libp2p/p2p/muxer/mplex" "github.com/libp2p/go-libp2p/p2p/muxer/yamux" "github.com/libp2p/go-libp2p/p2p/security/noise" tls "github.com/libp2p/go-libp2p/p2p/security/tls" diff --git a/op-node/p2p/peer_scores_test.go b/op-node/p2p/peer_scores_test.go index 37b77b575793..aeb8e4c8c390 100644 --- a/op-node/p2p/peer_scores_test.go +++ b/op-node/p2p/peer_scores_test.go @@ -10,6 +10,9 @@ import ( "github.com/ethereum-optimism/optimism/op-node/rollup" + //nolint:all + "github.com/libp2p/go-libp2p/p2p/host/peerstore/pstoreds" + p2pMocks "github.com/ethereum-optimism/optimism/op-node/p2p/mocks" "github.com/ethereum-optimism/optimism/op-node/p2p/store" testlog "github.com/ethereum-optimism/optimism/op-node/testlog" @@ -23,7 +26,6 @@ import ( peer "github.com/libp2p/go-libp2p/core/peer" "github.com/libp2p/go-libp2p/core/peerstore" bhost "github.com/libp2p/go-libp2p/p2p/host/blank" - "github.com/libp2p/go-libp2p/p2p/host/peerstore/pstoreds" tswarm "github.com/libp2p/go-libp2p/p2p/net/swarm/testing" "github.com/stretchr/testify/mock" diff --git a/op-node/p2p/store/scorebook_test.go b/op-node/p2p/store/scorebook_test.go index 34118567aa52..dc44130c9c15 100644 --- a/op-node/p2p/store/scorebook_test.go +++ b/op-node/p2p/store/scorebook_test.go @@ -6,13 +6,15 @@ import ( "testing" "time" + //nolint:all + "github.com/libp2p/go-libp2p/p2p/host/peerstore/pstoreds" + "github.com/ethereum-optimism/optimism/op-node/testlog" "github.com/ethereum-optimism/optimism/op-service/clock" "github.com/ethereum/go-ethereum/log" ds "github.com/ipfs/go-datastore" "github.com/ipfs/go-datastore/sync" "github.com/libp2p/go-libp2p/core/peer" - "github.com/libp2p/go-libp2p/p2p/host/peerstore/pstoreds" "github.com/stretchr/testify/require" ) From 9f814040b302c051334d97015390c80b984545b3 Mon Sep 17 00:00:00 2001 From: Mark Tyneway Date: Thu, 21 Sep 2023 07:44:02 -0700 Subject: [PATCH 83/87] deps: update superchain registry in go.mod Updates to the following commit: https://github.com/ethereum-optimism/superchain-registry/commit/413695cf79062a4f1306936e3761e0f8eafd6867 This contains the changes required for the safe bundler tooling. --- go.mod | 8 ++++---- go.sum | 6 ++++++ 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/go.mod b/go.mod index a3931f1a08ca..e445d9621658 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-20230817174831-5d3ca1966435 + github.com/ethereum-optimism/superchain-registry/superchain v0.0.0-20230920213331-413695cf7906 github.com/ethereum/go-ethereum v1.12.0 github.com/fsnotify/fsnotify v1.6.0 github.com/go-chi/chi/v5 v5.0.10 @@ -40,7 +40,7 @@ require ( github.com/stretchr/testify v1.8.4 github.com/urfave/cli/v2 v2.25.7 golang.org/x/crypto v0.13.0 - golang.org/x/exp v0.0.0-20230817173708-d852ddb80c63 + golang.org/x/exp v0.0.0-20230905200255-921286631fa9 golang.org/x/sync v0.3.0 golang.org/x/term v0.12.0 golang.org/x/time v0.3.0 @@ -194,10 +194,10 @@ require ( go.uber.org/multierr v1.11.0 // indirect go.uber.org/zap v1.25.0 // indirect golang.org/x/mod v0.12.0 // indirect - golang.org/x/net v0.14.0 // indirect + golang.org/x/net v0.15.0 // indirect golang.org/x/sys v0.12.0 // indirect golang.org/x/text v0.13.0 // indirect - golang.org/x/tools v0.12.1-0.20230815132531-74c255bcf846 // indirect + golang.org/x/tools v0.13.0 // indirect google.golang.org/protobuf v1.30.0 // indirect gopkg.in/natefinch/lumberjack.v2 v2.0.0 // indirect gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce // indirect diff --git a/go.sum b/go.sum index 8f5f4a39ad02..d0947b2db2b0 100644 --- a/go.sum +++ b/go.sum @@ -168,6 +168,8 @@ github.com/ethereum-optimism/op-geth v1.101200.2-rc.1.0.20230914224024-b84ba1191 github.com/ethereum-optimism/op-geth v1.101200.2-rc.1.0.20230914224024-b84ba11915a0/go.mod h1:gRnPb21PoKcHm3kHqj9BQlQkwmhOGUvQoGEbC7z852Q= github.com/ethereum-optimism/superchain-registry/superchain v0.0.0-20230817174831-5d3ca1966435 h1:2CzkJkkTLuVyoVFkoW5w6vDB2Q7eJzxXw/ybA17xjqM= github.com/ethereum-optimism/superchain-registry/superchain v0.0.0-20230817174831-5d3ca1966435/go.mod h1:v2YpePbdGBF0Gr6VWq49MFFmcTW0kRYZ2ingBJYWEwg= +github.com/ethereum-optimism/superchain-registry/superchain v0.0.0-20230920213331-413695cf7906 h1:dATqgMywOwG/aN6UlEn+nCHnxcK6DlOn9xElNGBO/kY= +github.com/ethereum-optimism/superchain-registry/superchain v0.0.0-20230920213331-413695cf7906/go.mod h1:q0u2UbyOr1q/y94AgMOj/V8b1KO05ZwILTR/qKt7Auo= github.com/ethereum/c-kzg-4844 v0.2.0 h1:+cUvymlnoDDQgMInp25Bo3OmLajmmY8mLJ/tLjqd77Q= github.com/ethereum/c-kzg-4844 v0.2.0/go.mod h1:WI2Nd82DMZAAZI1wV2neKGost9EKjvbpQR9OqE5Qqa8= github.com/fasthttp-contrib/websocket v0.0.0-20160511215533-1f3b11f56072/go.mod h1:duJ4Jxv5lDcvg4QuQr0oowTf7dz4/CR8NtyCooz9HL8= @@ -860,6 +862,8 @@ golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliY golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20230817173708-d852ddb80c63 h1:m64FZMko/V45gv0bNmrNYoDEq8U5YUhetc9cBWKS1TQ= golang.org/x/exp v0.0.0-20230817173708-d852ddb80c63/go.mod h1:0v4NqG35kSWCMzLaMeX+IQrlSnVE/bqGSyC2cz/9Le8= +golang.org/x/exp v0.0.0-20230905200255-921286631fa9 h1:GoHiUyI/Tp2nVkLI2mCxVkOjsbSXD66ic0XW0js0R9g= +golang.org/x/exp v0.0.0-20230905200255-921286631fa9/go.mod h1:S2oDrQGGwySpoQPVqRShND87VCbxmc6bL1Yd2oYrm6k= golang.org/x/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= @@ -906,6 +910,7 @@ golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.14.0 h1:BONx9s002vGdD9umnlX1Po8vOZmrgH34qlHcD1MfK14= golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI= +golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181017192945-9dcd33a902f4/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181203162652-d668ce993890/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= @@ -1025,6 +1030,7 @@ golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.12.1-0.20230815132531-74c255bcf846 h1:Vve/L0v7CXXuxUmaMGIEK/dEeq7uiqb5qBgQrZzIE7E= golang.org/x/tools v0.12.1-0.20230815132531-74c255bcf846/go.mod h1:Sc0INKfu04TlqNoRA1hgpFZbhYXHPr4V5DzpSBTPqQM= +golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= golang.org/x/xerrors v0.0.0-20190410155217-1f06c39b4373/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20190513163551-3ee3066db522/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= From 5128ceebe583b519e7b20821c9e6fb9782e757f3 Mon Sep 17 00:00:00 2001 From: Mark Tyneway Date: Thu, 21 Sep 2023 07:48:07 -0700 Subject: [PATCH 84/87] deps: make mod-tidy --- go.sum | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/go.sum b/go.sum index d0947b2db2b0..8c17ba50a4c0 100644 --- a/go.sum +++ b/go.sum @@ -166,8 +166,6 @@ github.com/ethereum-optimism/go-ethereum-hdwallet v0.1.3 h1:RWHKLhCrQThMfch+QJ1Z github.com/ethereum-optimism/go-ethereum-hdwallet v0.1.3/go.mod h1:QziizLAiF0KqyLdNJYD7O5cpDlaFMNZzlxYNcWsJUxs= github.com/ethereum-optimism/op-geth v1.101200.2-rc.1.0.20230914224024-b84ba11915a0 h1:Qcu7OVMbKvbu7aaDC31OY0JCqFIr2N+/SGdBTnxukCs= github.com/ethereum-optimism/op-geth v1.101200.2-rc.1.0.20230914224024-b84ba11915a0/go.mod h1:gRnPb21PoKcHm3kHqj9BQlQkwmhOGUvQoGEbC7z852Q= -github.com/ethereum-optimism/superchain-registry/superchain v0.0.0-20230817174831-5d3ca1966435 h1:2CzkJkkTLuVyoVFkoW5w6vDB2Q7eJzxXw/ybA17xjqM= -github.com/ethereum-optimism/superchain-registry/superchain v0.0.0-20230817174831-5d3ca1966435/go.mod h1:v2YpePbdGBF0Gr6VWq49MFFmcTW0kRYZ2ingBJYWEwg= github.com/ethereum-optimism/superchain-registry/superchain v0.0.0-20230920213331-413695cf7906 h1:dATqgMywOwG/aN6UlEn+nCHnxcK6DlOn9xElNGBO/kY= github.com/ethereum-optimism/superchain-registry/superchain v0.0.0-20230920213331-413695cf7906/go.mod h1:q0u2UbyOr1q/y94AgMOj/V8b1KO05ZwILTR/qKt7Auo= github.com/ethereum/c-kzg-4844 v0.2.0 h1:+cUvymlnoDDQgMInp25Bo3OmLajmmY8mLJ/tLjqd77Q= @@ -860,8 +858,6 @@ golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5y golang.org/x/crypto v0.13.0 h1:mvySKfSWJ+UKUii46M40LOvyWfN0s2U+46/jDd0e6Ck= golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20230817173708-d852ddb80c63 h1:m64FZMko/V45gv0bNmrNYoDEq8U5YUhetc9cBWKS1TQ= -golang.org/x/exp v0.0.0-20230817173708-d852ddb80c63/go.mod h1:0v4NqG35kSWCMzLaMeX+IQrlSnVE/bqGSyC2cz/9Le8= golang.org/x/exp v0.0.0-20230905200255-921286631fa9 h1:GoHiUyI/Tp2nVkLI2mCxVkOjsbSXD66ic0XW0js0R9g= golang.org/x/exp v0.0.0-20230905200255-921286631fa9/go.mod h1:S2oDrQGGwySpoQPVqRShND87VCbxmc6bL1Yd2oYrm6k= golang.org/x/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -908,8 +904,7 @@ golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT golang.org/x/net v0.0.0-20211008194852-3b03d305991f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.14.0 h1:BONx9s002vGdD9umnlX1Po8vOZmrgH34qlHcD1MfK14= -golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI= +golang.org/x/net v0.15.0 h1:ugBLEUaxABaB5AJqW9enI0ACdci2RUd4eP51NTBvuJ8= golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181017192945-9dcd33a902f4/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= @@ -1028,8 +1023,7 @@ golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4f golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.12.1-0.20230815132531-74c255bcf846 h1:Vve/L0v7CXXuxUmaMGIEK/dEeq7uiqb5qBgQrZzIE7E= -golang.org/x/tools v0.12.1-0.20230815132531-74c255bcf846/go.mod h1:Sc0INKfu04TlqNoRA1hgpFZbhYXHPr4V5DzpSBTPqQM= +golang.org/x/tools v0.13.0 h1:Iey4qkscZuv0VvIt8E0neZjtPVQFSc870HQ448QgEmQ= golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= golang.org/x/xerrors v0.0.0-20190410155217-1f06c39b4373/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20190513163551-3ee3066db522/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= From 210b2c81dd383bad93480aa876b283d9a0c991c2 Mon Sep 17 00:00:00 2001 From: Mark Tyneway Date: Thu, 21 Sep 2023 07:59:44 -0700 Subject: [PATCH 85/87] core-utils: delete unmaintained geth types These geth types are legacy code and not being updated along with the definitions of the geth types. They were used in old regenesis events. They are not used elsewhere in the monorepo, keeping them around only adds tech debt. --- .changeset/beige-poems-switch.md | 5 ++ .../src/external/geth/geth-types.ts | 82 ------------------- .../core-utils/src/external/geth/index.ts | 5 -- packages/core-utils/src/external/index.ts | 1 - 4 files changed, 5 insertions(+), 88 deletions(-) create mode 100644 .changeset/beige-poems-switch.md delete mode 100644 packages/core-utils/src/external/geth/geth-types.ts delete mode 100644 packages/core-utils/src/external/geth/index.ts diff --git a/.changeset/beige-poems-switch.md b/.changeset/beige-poems-switch.md new file mode 100644 index 000000000000..ec282b3f5bf3 --- /dev/null +++ b/.changeset/beige-poems-switch.md @@ -0,0 +1,5 @@ +--- +'@eth-optimism/core-utils': minor +--- + +Delete unmaintained geth types diff --git a/packages/core-utils/src/external/geth/geth-types.ts b/packages/core-utils/src/external/geth/geth-types.ts deleted file mode 100644 index a70de0a75236..000000000000 --- a/packages/core-utils/src/external/geth/geth-types.ts +++ /dev/null @@ -1,82 +0,0 @@ -// Types explicitly related to dealing with Geth. - -/** - * Represents the Ethereum state, in the format that Geth expects it. - */ -export interface State { - [address: string]: { - nonce?: string - balance?: string - codeHash?: string - root?: string - code?: string - storage?: { - [key: string]: string - } - secretKey?: string - } -} - -/** - * Represents Geth's ChainConfig - */ -export interface ChainConfig { - chainId: number - homesteadBlock: number - eip150Block: number - eip150Hash?: string - eip155Block: number - eip158Block: number - byzantiumBlock: number - constantinopleBlock: number - petersburgBlock: number - istanbulBlock: number - muirGlacierBlock: number - berlinBlock: number - londonBlock?: number - arrowGlacierBlock?: number - grayGlacierBlock?: number - mergeNetsplitBlock?: number - terminalTotalDifficulty?: number - clique?: { - period: number - epoch: number - } - ethash?: {} -} - -/** - * Represents Geth's genesis file format. - */ -export interface Genesis { - config: ChainConfig - nonce?: string - timestamp?: string - difficulty: string - mixHash?: string - coinbase?: string - number?: string - gasLimit: string - gasUsed?: string - parentHash?: string - extraData: string - baseFeePerGas?: string - alloc: State -} - -/** - * Represents the chain config for an Optimism chain - */ -export interface OptimismChainConfig extends ChainConfig { - optimism: { - baseFeeRecipient: string - l1FeeRecipient: string - } -} - -/** - * Represents the Genesis file format for an Optimism chain - */ -export interface OptimismGenesis extends Genesis { - config: OptimismChainConfig -} diff --git a/packages/core-utils/src/external/geth/index.ts b/packages/core-utils/src/external/geth/index.ts deleted file mode 100644 index dd595c63c9b5..000000000000 --- a/packages/core-utils/src/external/geth/index.ts +++ /dev/null @@ -1,5 +0,0 @@ -/** - * Utilities related to go-ethereum (Geth) - */ - -export * from './geth-types' diff --git a/packages/core-utils/src/external/index.ts b/packages/core-utils/src/external/index.ts index 3cd8d7e225be..272bb5ff560d 100644 --- a/packages/core-utils/src/external/index.ts +++ b/packages/core-utils/src/external/index.ts @@ -4,4 +4,3 @@ export * from './bcfg' export * from './ethers' -export * from './geth' From c99becf00afa1d5b46fb8c53ccdf48f6f9c19034 Mon Sep 17 00:00:00 2001 From: Mark Tyneway Date: Thu, 21 Sep 2023 09:02:43 -0700 Subject: [PATCH 86/87] ci-builder: bump go version to 1.21 --- ops/docker/ci-builder/Dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ops/docker/ci-builder/Dockerfile b/ops/docker/ci-builder/Dockerfile index 3dfd25edf515..f0d80c254bb6 100644 --- a/ops/docker/ci-builder/Dockerfile +++ b/ops/docker/ci-builder/Dockerfile @@ -45,8 +45,8 @@ COPY --from=echidna-test /usr/local/bin/echidna-test /usr/local/bin/echidna-test RUN apt-get update && \ apt-get install -y bash curl openssh-client git build-essential ca-certificates jq musl gnupg coreutils && \ curl -sL https://deb.nodesource.com/setup_16.x -o nodesource_setup.sh && \ - curl -sL https://go.dev/dl/go1.20.linux-amd64.tar.gz -o go1.20.linux-amd64.tar.gz && \ - tar -C /usr/local/ -xzvf go1.20.linux-amd64.tar.gz && \ + curl -sL https://go.dev/dl/go1.21.1.linux-amd64.tar.gz -o go1.21.1.linux-amd64.tar.gz && \ + tar -C /usr/local/ -xzvf go1.21.1.linux-amd64.tar.gz && \ ln -s /usr/local/go/bin/gofmt /usr/local/bin/gofmt && \ bash nodesource_setup.sh && \ apt-get install -y nodejs && \ From b356e97bc817cd121fbb5b2ab58cede7bb43577f Mon Sep 17 00:00:00 2001 From: Mark Tyneway Date: Thu, 21 Sep 2023 09:39:37 -0700 Subject: [PATCH 87/87] ci-builder: better caching --- ops/docker/ci-builder/Dockerfile | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/ops/docker/ci-builder/Dockerfile b/ops/docker/ci-builder/Dockerfile index f0d80c254bb6..2abece5f9544 100644 --- a/ops/docker/ci-builder/Dockerfile +++ b/ops/docker/ci-builder/Dockerfile @@ -11,8 +11,6 @@ RUN apt-get update && \ chmod +x ./rustup.sh && \ ./rustup.sh -y -COPY ./.abigenrc ./.abigenrc - # Only diff from upstream docker image is this clone instead # of COPY. We select a specific commit to use. COPY ./.foundryrc ./.foundryrc @@ -27,8 +25,6 @@ RUN source $HOME/.profile && \ strip /opt/foundry/target/release/cast && \ strip /opt/foundry/target/release/anvil -FROM ethereum/client-go:alltools-v1.10.25 as geth - FROM ghcr.io/crytic/echidna/echidna:v2.0.4 as echidna-test FROM python:3.11.4-slim-bullseye @@ -56,6 +52,8 @@ RUN apt-get update && \ curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b $(go env GOPATH)/bin v1.53.3 && \ curl -fLSs https://raw.githubusercontent.com/CircleCI-Public/circleci-cli/master/install.sh | bash +COPY ./.abigenrc ./.abigenrc + # Install the specific version of abigen from .abigenrc RUN go install github.com/ethereum/go-ethereum/cmd/abigen@$(cat .abigenrc)