Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
N
nebula
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
exchain
nebula
Commits
a382b9e2
Unverified
Commit
a382b9e2
authored
Aug 23, 2023
by
mergify[bot]
Committed by
GitHub
Aug 23, 2023
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'develop' into indexer.sql.constraints
parents
a9ef72e1
d7ac3e97
Changes
60
Hide whitespace changes
Inline
Side-by-side
Showing
60 changed files
with
1098 additions
and
723 deletions
+1098
-723
CONTRIBUTING.md
CONTRIBUTING.md
+9
-9
Makefile
Makefile
+3
-3
__init__.py
bedrock-devnet/devnet/__init__.py
+4
-4
Dockerfile
endpoint-monitor/Dockerfile
+2
-2
go.mod
go.mod
+1
-1
Dockerfile
indexer/Dockerfile
+2
-2
README.md
indexer/README.md
+1
-1
README.md
indexer/ui/README.md
+1
-1
Dockerfile
op-batcher/Dockerfile
+2
-2
shadow_compressor_test.go
op-batcher/compressor/shadow_compressor_test.go
+1
-1
memory_db_test.go
op-chain-ops/state/memory_db_test.go
+3
-1
Dockerfile
op-challenger/Dockerfile
+2
-2
main_test.go
op-challenger/cmd/main_test.go
+29
-11
config.go
op-challenger/config/config.go
+19
-6
config_test.go
op-challenger/config/config_test.go
+6
-7
abi_test.go
op-challenger/fault/abi_test.go
+3
-3
agent.go
op-challenger/fault/agent.go
+19
-2
agent_test.go
op-challenger/fault/agent_test.go
+31
-0
caller.go
op-challenger/fault/caller.go
+1
-2
executor_test.go
op-challenger/fault/cannon/executor_test.go
+1
-2
provider.go
op-challenger/fault/cannon/provider.go
+3
-4
provider_test.go
op-challenger/fault/cannon/provider_test.go
+0
-16
disk.go
op-challenger/fault/disk.go
+57
-0
disk_test.go
op-challenger/fault/disk_test.go
+57
-0
factory.go
op-challenger/fault/factory.go
+11
-6
factory_test.go
op-challenger/fault/factory_test.go
+11
-8
monitor.go
op-challenger/fault/monitor.go
+57
-6
monitor_test.go
op-challenger/fault/monitor_test.go
+139
-11
player.go
op-challenger/fault/player.go
+14
-4
player_test.go
op-challenger/fault/player_test.go
+42
-28
responder.go
op-challenger/fault/responder.go
+13
-6
responder_test.go
op-challenger/fault/responder_test.go
+135
-137
service.go
op-challenger/fault/service.go
+12
-3
types.go
op-challenger/fault/types/types.go
+9
-0
types_test.go
op-challenger/fault/types/types_test.go
+23
-0
flags.go
op-challenger/flags/flags.go
+15
-10
charlie.sh
op-challenger/scripts/alphabet/charlie.sh
+8
-1
mallory.sh
op-challenger/scripts/alphabet/mallory.sh
+8
-1
helper.go
op-e2e/e2eutils/challenger/helper.go
+35
-9
cannon_helper.go
op-e2e/e2eutils/disputegame/cannon_helper.go
+3
-1
game_helper.go
op-e2e/e2eutils/disputegame/game_helper.go
+4
-0
helper.go
op-e2e/e2eutils/disputegame/helper.go
+1
-1
faultproof_test.go
op-e2e/faultproof_test.go
+7
-3
Dockerfile
op-exporter/Dockerfile
+2
-2
go.mod
op-exporter/go.mod
+1
-1
Dockerfile
op-heartbeat/Dockerfile
+2
-2
Dockerfile
op-node/Dockerfile
+2
-2
l1_block_info_test.go
op-node/rollup/derive/l1_block_info_test.go
+2
-1
eth_client_test.go
op-node/sources/eth_client_test.go
+2
-2
Dockerfile
op-program/Dockerfile
+2
-2
Dockerfile
op-proposer/Dockerfile
+2
-2
Dockerfile
op-wheel/Dockerfile
+2
-2
package.json
package.json
+3
-3
package.json
packages/contracts-bedrock/package.json
+1
-1
go.mod
packages/contracts-bedrock/test-case-generator/go.mod
+1
-1
package.json
packages/contracts-ts/package.json
+1
-1
package.json
packages/fee-estimation/package.json
+1
-1
pnpm-lock.yaml
pnpm-lock.yaml
+267
-380
go.mod
proxyd/go.mod
+1
-1
devnet.md
specs/meta/devnet.md
+2
-2
No files found.
CONTRIBUTING.md
View file @
a382b9e2
...
@@ -119,7 +119,7 @@ Note that these environment variables significantly speed up build time.
...
@@ -119,7 +119,7 @@ Note that these environment variables significantly speed up build time.
cd
ops-bedrock
cd
ops-bedrock
export
COMPOSE_DOCKER_CLI_BUILD
=
1
export
COMPOSE_DOCKER_CLI_BUILD
=
1
export
DOCKER_BUILDKIT
=
1
export
DOCKER_BUILDKIT
=
1
docker
-
compose build
docker
compose build
```
```
Source code changes can have an impact on more than one container.
Source code changes can have an impact on more than one container.
...
@@ -127,9 +127,9 @@ Source code changes can have an impact on more than one container.
...
@@ -127,9 +127,9 @@ Source code changes can have an impact on more than one container.
```
bash
```
bash
cd
ops-bedrock
cd
ops-bedrock
docker
-
compose down
docker
compose down
docker
-
compose build
docker
compose build
docker
-
compose up
docker
compose up
```
```
**If a node process exits with exit code: 137**
you may need to increase the default memory limit of docker containers
**If a node process exits with exit code: 137**
you may need to increase the default memory limit of docker containers
...
@@ -141,18 +141,18 @@ cd optimism
...
@@ -141,18 +141,18 @@ cd optimism
pnpm clean
pnpm clean
pnpm build
pnpm build
cd
ops
cd
ops
docker
-
compose down
-v
docker
compose down
-v
docker
-
compose build
docker
compose build
docker
-
compose up
docker
compose up
```
```
#### Viewing docker container logs
#### Viewing docker container logs
By default, the
`docker
-
compose up`
command will show logs from all services, and that
By default, the
`docker
compose up`
command will show logs from all services, and that
can be hard to filter through. In order to view the logs from a specific service, you can run:
can be hard to filter through. In order to view the logs from a specific service, you can run:
```
bash
```
bash
docker
-
compose logs
--follow
<service name>
docker
compose logs
--follow
<service name>
```
```
### Running tests
### Running tests
...
...
Makefile
View file @
a382b9e2
...
@@ -101,13 +101,13 @@ devnet-test:
...
@@ -101,13 +101,13 @@ devnet-test:
.PHONY
:
devnet-test
.PHONY
:
devnet-test
devnet-down
:
devnet-down
:
@
(
cd
./ops-bedrock
&&
GENESIS_TIMESTAMP
=
$(
shell
date
+%s
)
docker
-
compose stop
)
@
(
cd
./ops-bedrock
&&
GENESIS_TIMESTAMP
=
$(
shell
date
+%s
)
docker
compose stop
)
.PHONY
:
devnet-down
.PHONY
:
devnet-down
devnet-clean
:
devnet-clean
:
rm
-rf
./packages/contracts-bedrock/deployments/devnetL1
rm
-rf
./packages/contracts-bedrock/deployments/devnetL1
rm
-rf
./.devnet
rm
-rf
./.devnet
cd
./ops-bedrock
&&
docker
-
compose down
cd
./ops-bedrock
&&
docker
compose down
docker image
ls
'ops-bedrock*'
--format
=
'{{.Repository}}'
| xargs
-r
docker rmi
docker image
ls
'ops-bedrock*'
--format
=
'{{.Repository}}'
| xargs
-r
docker rmi
docker volume
ls
--filter
name
=
ops-bedrock
--format
=
'{{.Name}}'
| xargs
-r
docker volume
rm
docker volume
ls
--filter
name
=
ops-bedrock
--format
=
'{{.Name}}'
| xargs
-r
docker volume
rm
.PHONY
:
devnet-clean
.PHONY
:
devnet-clean
...
@@ -116,7 +116,7 @@ devnet-allocs:
...
@@ -116,7 +116,7 @@ devnet-allocs:
PYTHONPATH
=
./bedrock-devnet python3 ./bedrock-devnet/main.py
--monorepo-dir
=
.
--allocs
PYTHONPATH
=
./bedrock-devnet python3 ./bedrock-devnet/main.py
--monorepo-dir
=
.
--allocs
devnet-logs
:
devnet-logs
:
@
(
cd
./ops-bedrock
&&
docker
-
compose logs
-f
)
@
(
cd
./ops-bedrock
&&
docker
compose logs
-f
)
.PHONY: devnet-logs
.PHONY: devnet-logs
test-unit
:
test-unit
:
...
...
bedrock-devnet/devnet/__init__.py
View file @
a382b9e2
...
@@ -93,7 +93,7 @@ def main():
...
@@ -93,7 +93,7 @@ def main():
return
return
log
.
info
(
'Building docker images'
)
log
.
info
(
'Building docker images'
)
run_command
([
'docker
-
compose'
,
'build'
,
'--progress'
,
'plain'
],
cwd
=
paths
.
ops_bedrock_dir
,
env
=
{
run_command
([
'docker
'
,
'
compose'
,
'build'
,
'--progress'
,
'plain'
],
cwd
=
paths
.
ops_bedrock_dir
,
env
=
{
'PWD'
:
paths
.
ops_bedrock_dir
'PWD'
:
paths
.
ops_bedrock_dir
})
})
...
@@ -173,7 +173,7 @@ def devnet_deploy(paths):
...
@@ -173,7 +173,7 @@ def devnet_deploy(paths):
],
cwd
=
paths
.
op_node_dir
)
],
cwd
=
paths
.
op_node_dir
)
log
.
info
(
'Starting L1.'
)
log
.
info
(
'Starting L1.'
)
run_command
([
'docker
-
compose'
,
'up'
,
'-d'
,
'l1'
],
cwd
=
paths
.
ops_bedrock_dir
,
env
=
{
run_command
([
'docker
'
,
'
compose'
,
'up'
,
'-d'
,
'l1'
],
cwd
=
paths
.
ops_bedrock_dir
,
env
=
{
'PWD'
:
paths
.
ops_bedrock_dir
'PWD'
:
paths
.
ops_bedrock_dir
})
})
wait_up
(
8545
)
wait_up
(
8545
)
...
@@ -196,7 +196,7 @@ def devnet_deploy(paths):
...
@@ -196,7 +196,7 @@ def devnet_deploy(paths):
addresses
=
read_json
(
paths
.
addresses_json_path
)
addresses
=
read_json
(
paths
.
addresses_json_path
)
log
.
info
(
'Bringing up L2.'
)
log
.
info
(
'Bringing up L2.'
)
run_command
([
'docker
-
compose'
,
'up'
,
'-d'
,
'l2'
],
cwd
=
paths
.
ops_bedrock_dir
,
env
=
{
run_command
([
'docker
'
,
'
compose'
,
'up'
,
'-d'
,
'l2'
],
cwd
=
paths
.
ops_bedrock_dir
,
env
=
{
'PWD'
:
paths
.
ops_bedrock_dir
'PWD'
:
paths
.
ops_bedrock_dir
})
})
wait_up
(
9545
)
wait_up
(
9545
)
...
@@ -208,7 +208,7 @@ def devnet_deploy(paths):
...
@@ -208,7 +208,7 @@ def devnet_deploy(paths):
log
.
info
(
f
'Using batch inbox {batch_inbox_address}'
)
log
.
info
(
f
'Using batch inbox {batch_inbox_address}'
)
log
.
info
(
'Bringing up everything else.'
)
log
.
info
(
'Bringing up everything else.'
)
run_command
([
'docker
-
compose'
,
'up'
,
'-d'
,
'op-node'
,
'op-proposer'
,
'op-batcher'
],
cwd
=
paths
.
ops_bedrock_dir
,
env
=
{
run_command
([
'docker
'
,
'
compose'
,
'up'
,
'-d'
,
'op-node'
,
'op-proposer'
,
'op-batcher'
],
cwd
=
paths
.
ops_bedrock_dir
,
env
=
{
'PWD'
:
paths
.
ops_bedrock_dir
,
'PWD'
:
paths
.
ops_bedrock_dir
,
'L2OO_ADDRESS'
:
l2_output_oracle
,
'L2OO_ADDRESS'
:
l2_output_oracle
,
'SEQUENCER_BATCH_INBOX_ADDRESS'
:
batch_inbox_address
'SEQUENCER_BATCH_INBOX_ADDRESS'
:
batch_inbox_address
...
...
endpoint-monitor/Dockerfile
View file @
a382b9e2
FROM
golang:1.
19.9-alpine3.16
as builder
FROM
golang:1.
20.7-alpine3.18
as builder
RUN
apk
--no-cache
add make jq bash git alpine-sdk
RUN
apk
--no-cache
add make jq bash git alpine-sdk
...
@@ -16,7 +16,7 @@ RUN go mod download
...
@@ -16,7 +16,7 @@ RUN go mod download
RUN
make build
RUN
make build
FROM
alpine:3.1
6
FROM
alpine:3.1
8
RUN
apk
--no-cache
add ca-certificates
RUN
apk
--no-cache
add ca-certificates
RUN
addgroup
-S
app
&&
adduser
-S
app
-G
app
RUN
addgroup
-S
app
&&
adduser
-S
app
-G
app
...
...
go.mod
View file @
a382b9e2
module github.com/ethereum-optimism/optimism
module github.com/ethereum-optimism/optimism
go 1.
19
go 1.
20
require (
require (
github.com/BurntSushi/toml v1.3.2
github.com/BurntSushi/toml v1.3.2
...
...
indexer/Dockerfile
View file @
a382b9e2
FROM
--platform=$BUILDPLATFORM golang:1.
19.9-alpine3.16
as builder
FROM
--platform=$BUILDPLATFORM golang:1.
20.7-alpine3.18
as builder
RUN
apk add
--no-cache
make gcc musl-dev linux-headers git jq bash
RUN
apk add
--no-cache
make gcc musl-dev linux-headers git jq bash
...
@@ -18,7 +18,7 @@ RUN go mod download
...
@@ -18,7 +18,7 @@ RUN go mod download
RUN
make indexer
RUN
make indexer
FROM
alpine:3.1
6
FROM
alpine:3.1
8
COPY
--from=builder /app/indexer/indexer /usr/local/bin
COPY
--from=builder /app/indexer/indexer /usr/local/bin
...
...
indexer/README.md
View file @
a382b9e2
...
@@ -16,7 +16,7 @@ All tests can be ran by running `make test` from the `/indexer` directory. This
...
@@ -16,7 +16,7 @@ All tests can be ran by running `make test` from the `/indexer` directory. This
-
install docker
-
install docker
-
`cp example.env .env`
-
`cp example.env .env`
-
fill in .env
-
fill in .env
-
run
`docker
-
compose up`
to start the indexer vs optimism goerli network
-
run
`docker
compose up`
to start the indexer vs optimism goerli network
### Run indexer with go
### Run indexer with go
...
...
indexer/ui/README.md
View file @
a382b9e2
...
@@ -7,7 +7,7 @@ A simple UI for exploring the indexer DB using [Prisma studio](https://www.prism
...
@@ -7,7 +7,7 @@ A simple UI for exploring the indexer DB using [Prisma studio](https://www.prism
Included in the docker-compose file as
`ui`
service
Included in the docker-compose file as
`ui`
service
```
bash
```
bash
docker
-
compose up
docker
compose up
```
```
Prisma can be viewed at
[
localhost:5555
](
http://localhost:5555
)
Prisma can be viewed at
[
localhost:5555
](
http://localhost:5555
)
...
...
op-batcher/Dockerfile
View file @
a382b9e2
FROM
--platform=$BUILDPLATFORM golang:1.
19.9-alpine3.16
as builder
FROM
--platform=$BUILDPLATFORM golang:1.
20.7-alpine3.18
as builder
ARG
VERSION=v0.0.0
ARG
VERSION=v0.0.0
...
@@ -23,7 +23,7 @@ ARG TARGETOS TARGETARCH
...
@@ -23,7 +23,7 @@ ARG TARGETOS TARGETARCH
RUN
make op-batcher
VERSION
=
"
$VERSION
"
GOOS
=
$TARGETOS
GOARCH
=
$TARGETARCH
RUN
make op-batcher
VERSION
=
"
$VERSION
"
GOOS
=
$TARGETOS
GOARCH
=
$TARGETARCH
FROM
alpine:3.1
6
FROM
alpine:3.1
8
COPY
--from=builder /app/op-batcher/bin/op-batcher /usr/local/bin
COPY
--from=builder /app/op-batcher/bin/op-batcher /usr/local/bin
...
...
op-batcher/compressor/shadow_compressor_test.go
View file @
a382b9e2
...
@@ -3,8 +3,8 @@ package compressor_test
...
@@ -3,8 +3,8 @@ package compressor_test
import
(
import
(
"bytes"
"bytes"
"compress/zlib"
"compress/zlib"
"crypto/rand"
"io"
"io"
"math/rand"
"testing"
"testing"
"github.com/ethereum-optimism/optimism/op-batcher/compressor"
"github.com/ethereum-optimism/optimism/op-batcher/compressor"
...
...
op-chain-ops/state/memory_db_test.go
View file @
a382b9e2
package
state_test
package
state_test
import
(
import
(
crand
"crypto/rand"
"math/big"
"math/big"
"math/rand"
"math/rand"
"testing"
"testing"
...
@@ -47,7 +48,8 @@ func TestCode(t *testing.T) {
...
@@ -47,7 +48,8 @@ func TestCode(t *testing.T) {
require
.
Nil
(
t
,
pre
)
require
.
Nil
(
t
,
pre
)
code
:=
make
([]
byte
,
rand
.
Intn
(
1024
))
code
:=
make
([]
byte
,
rand
.
Intn
(
1024
))
rand
.
Read
(
code
)
_
,
err
:=
crand
.
Read
(
code
)
require
.
NoError
(
t
,
err
)
db
.
SetCode
(
addr
,
code
)
db
.
SetCode
(
addr
,
code
)
...
...
op-challenger/Dockerfile
View file @
a382b9e2
FROM
--platform=$BUILDPLATFORM golang:1.
19.0-alpine3.15
as builder
FROM
--platform=$BUILDPLATFORM golang:1.
20.7-alpine3.18
as builder
ARG
VERSION=v0.0.0
ARG
VERSION=v0.0.0
...
@@ -27,7 +27,7 @@ ARG TARGETOS TARGETARCH
...
@@ -27,7 +27,7 @@ ARG TARGETOS TARGETARCH
RUN
make op-challenger
VERSION
=
"
$VERSION
"
GOOS
=
$TARGETOS
GOARCH
=
$TARGETARCH
RUN
make op-challenger
VERSION
=
"
$VERSION
"
GOOS
=
$TARGETOS
GOARCH
=
$TARGETARCH
FROM
alpine:3.1
5
FROM
alpine:3.1
8
COPY
--from=builder /app/op-challenger/bin/op-challenger /usr/local/bin
COPY
--from=builder /app/op-challenger/bin/op-challenger /usr/local/bin
...
...
op-challenger/cmd/main_test.go
View file @
a382b9e2
...
@@ -4,6 +4,7 @@ import (
...
@@ -4,6 +4,7 @@ import (
"context"
"context"
"fmt"
"fmt"
"testing"
"testing"
"time"
"github.com/ethereum-optimism/optimism/op-challenger/config"
"github.com/ethereum-optimism/optimism/op-challenger/config"
"github.com/ethereum-optimism/optimism/op-node/chaincfg"
"github.com/ethereum-optimism/optimism/op-node/chaincfg"
...
@@ -21,7 +22,7 @@ var (
...
@@ -21,7 +22,7 @@ var (
cannonBin
=
"./bin/cannon"
cannonBin
=
"./bin/cannon"
cannonServer
=
"./bin/op-program"
cannonServer
=
"./bin/op-program"
cannonPreState
=
"./pre.json"
cannonPreState
=
"./pre.json"
cannonDatadir
=
"./test_data"
datadir
=
"./test_data"
cannonL2
=
"http://example.com:9545"
cannonL2
=
"http://example.com:9545"
alphabetTrace
=
"abcdefghijz"
alphabetTrace
=
"abcdefghijz"
agreeWithProposedOutput
=
"true"
agreeWithProposedOutput
=
"true"
...
@@ -44,14 +45,14 @@ func TestLogLevel(t *testing.T) {
...
@@ -44,14 +45,14 @@ func TestLogLevel(t *testing.T) {
func
TestDefaultCLIOptionsMatchDefaultConfig
(
t
*
testing
.
T
)
{
func
TestDefaultCLIOptionsMatchDefaultConfig
(
t
*
testing
.
T
)
{
cfg
:=
configForArgs
(
t
,
addRequiredArgs
(
config
.
TraceTypeAlphabet
))
cfg
:=
configForArgs
(
t
,
addRequiredArgs
(
config
.
TraceTypeAlphabet
))
defaultCfg
:=
config
.
NewConfig
(
common
.
HexToAddress
(
gameFactoryAddressValue
),
l1EthRpc
,
config
.
TraceTypeAlphabet
,
true
)
defaultCfg
:=
config
.
NewConfig
(
common
.
HexToAddress
(
gameFactoryAddressValue
),
l1EthRpc
,
config
.
TraceTypeAlphabet
,
true
,
datadir
)
// Add in the extra CLI options required when using alphabet trace type
// Add in the extra CLI options required when using alphabet trace type
defaultCfg
.
AlphabetTrace
=
alphabetTrace
defaultCfg
.
AlphabetTrace
=
alphabetTrace
require
.
Equal
(
t
,
defaultCfg
,
cfg
)
require
.
Equal
(
t
,
defaultCfg
,
cfg
)
}
}
func
TestDefaultConfigIsValid
(
t
*
testing
.
T
)
{
func
TestDefaultConfigIsValid
(
t
*
testing
.
T
)
{
cfg
:=
config
.
NewConfig
(
common
.
HexToAddress
(
gameFactoryAddressValue
),
l1EthRpc
,
config
.
TraceTypeAlphabet
,
true
)
cfg
:=
config
.
NewConfig
(
common
.
HexToAddress
(
gameFactoryAddressValue
),
l1EthRpc
,
config
.
TraceTypeAlphabet
,
true
,
datadir
)
// Add in options that are required based on the specific trace type
// Add in options that are required based on the specific trace type
// To avoid needing to specify unused options, these aren't included in the params for NewConfig
// To avoid needing to specify unused options, these aren't included in the params for NewConfig
cfg
.
AlphabetTrace
=
alphabetTrace
cfg
.
AlphabetTrace
=
alphabetTrace
...
@@ -191,18 +192,18 @@ func TestCannonAbsolutePrestate(t *testing.T) {
...
@@ -191,18 +192,18 @@ func TestCannonAbsolutePrestate(t *testing.T) {
})
})
}
}
func
Test
Cannon
DataDir
(
t
*
testing
.
T
)
{
func
TestDataDir
(
t
*
testing
.
T
)
{
t
.
Run
(
"
Not
RequiredForAlphabetTrace"
,
func
(
t
*
testing
.
T
)
{
t
.
Run
(
"RequiredForAlphabetTrace"
,
func
(
t
*
testing
.
T
)
{
configForArgs
(
t
,
addRequiredArgsExcept
(
config
.
TraceTypeAlphabet
,
"--cannon
-datadir"
))
verifyArgsInvalid
(
t
,
"flag datadir is required"
,
addRequiredArgsExcept
(
config
.
TraceTypeAlphabet
,
"-
-datadir"
))
})
})
t
.
Run
(
"Required"
,
func
(
t
*
testing
.
T
)
{
t
.
Run
(
"Required
ForCannonTrace
"
,
func
(
t
*
testing
.
T
)
{
verifyArgsInvalid
(
t
,
"flag
cannon-datadir is required"
,
addRequiredArgsExcept
(
config
.
TraceTypeCannon
,
"--cannon
-datadir"
))
verifyArgsInvalid
(
t
,
"flag
datadir is required"
,
addRequiredArgsExcept
(
config
.
TraceTypeCannon
,
"-
-datadir"
))
})
})
t
.
Run
(
"Valid"
,
func
(
t
*
testing
.
T
)
{
t
.
Run
(
"Valid"
,
func
(
t
*
testing
.
T
)
{
cfg
:=
configForArgs
(
t
,
addRequiredArgsExcept
(
config
.
TraceTypeCannon
,
"--
cannon-datadir"
,
"--cannon
-datadir=/foo/bar/cannon"
))
cfg
:=
configForArgs
(
t
,
addRequiredArgsExcept
(
config
.
TraceTypeCannon
,
"--
datadir"
,
"-
-datadir=/foo/bar/cannon"
))
require
.
Equal
(
t
,
"/foo/bar/cannon"
,
cfg
.
Cannon
Datadir
)
require
.
Equal
(
t
,
"/foo/bar/cannon"
,
cfg
.
Datadir
)
})
})
}
}
...
@@ -233,6 +234,23 @@ func TestCannonSnapshotFreq(t *testing.T) {
...
@@ -233,6 +234,23 @@ func TestCannonSnapshotFreq(t *testing.T) {
})
})
}
}
func
TestGameWindow
(
t
*
testing
.
T
)
{
t
.
Run
(
"UsesDefault"
,
func
(
t
*
testing
.
T
)
{
cfg
:=
configForArgs
(
t
,
addRequiredArgs
(
config
.
TraceTypeAlphabet
))
require
.
Equal
(
t
,
config
.
DefaultGameWindow
,
cfg
.
GameWindow
)
})
t
.
Run
(
"Valid"
,
func
(
t
*
testing
.
T
)
{
cfg
:=
configForArgs
(
t
,
addRequiredArgs
(
config
.
TraceTypeAlphabet
,
"--game-window=1m"
))
require
.
Equal
(
t
,
time
.
Duration
(
time
.
Minute
),
cfg
.
GameWindow
)
})
t
.
Run
(
"ParsesDefault"
,
func
(
t
*
testing
.
T
)
{
cfg
:=
configForArgs
(
t
,
addRequiredArgs
(
config
.
TraceTypeAlphabet
,
"--game-window=264h"
))
require
.
Equal
(
t
,
config
.
DefaultGameWindow
,
cfg
.
GameWindow
)
})
}
func
TestRequireEitherCannonNetworkOrRollupAndGenesis
(
t
*
testing
.
T
)
{
func
TestRequireEitherCannonNetworkOrRollupAndGenesis
(
t
*
testing
.
T
)
{
verifyArgsInvalid
(
verifyArgsInvalid
(
t
,
t
,
...
@@ -335,6 +353,7 @@ func requiredArgs(traceType config.TraceType) map[string]string {
...
@@ -335,6 +353,7 @@ func requiredArgs(traceType config.TraceType) map[string]string {
"--l1-eth-rpc"
:
l1EthRpc
,
"--l1-eth-rpc"
:
l1EthRpc
,
"--game-factory-address"
:
gameFactoryAddressValue
,
"--game-factory-address"
:
gameFactoryAddressValue
,
"--trace-type"
:
traceType
.
String
(),
"--trace-type"
:
traceType
.
String
(),
"--datadir"
:
datadir
,
}
}
switch
traceType
{
switch
traceType
{
case
config
.
TraceTypeAlphabet
:
case
config
.
TraceTypeAlphabet
:
...
@@ -344,7 +363,6 @@ func requiredArgs(traceType config.TraceType) map[string]string {
...
@@ -344,7 +363,6 @@ func requiredArgs(traceType config.TraceType) map[string]string {
args
[
"--cannon-bin"
]
=
cannonBin
args
[
"--cannon-bin"
]
=
cannonBin
args
[
"--cannon-server"
]
=
cannonServer
args
[
"--cannon-server"
]
=
cannonServer
args
[
"--cannon-prestate"
]
=
cannonPreState
args
[
"--cannon-prestate"
]
=
cannonPreState
args
[
"--cannon-datadir"
]
=
cannonDatadir
args
[
"--cannon-l2"
]
=
cannonL2
args
[
"--cannon-l2"
]
=
cannonL2
}
}
return
args
return
args
...
...
op-challenger/config/config.go
View file @
a382b9e2
...
@@ -3,6 +3,7 @@ package config
...
@@ -3,6 +3,7 @@ package config
import
(
import
(
"errors"
"errors"
"fmt"
"fmt"
"time"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/common"
...
@@ -14,7 +15,7 @@ import (
...
@@ -14,7 +15,7 @@ import (
var
(
var
(
ErrMissingTraceType
=
errors
.
New
(
"missing trace type"
)
ErrMissingTraceType
=
errors
.
New
(
"missing trace type"
)
ErrMissing
CannonDatadir
=
errors
.
New
(
"missing cannon
datadir"
)
ErrMissing
Datadir
=
errors
.
New
(
"missing
datadir"
)
ErrMissingCannonL2
=
errors
.
New
(
"missing cannon L2"
)
ErrMissingCannonL2
=
errors
.
New
(
"missing cannon L2"
)
ErrMissingCannonBin
=
errors
.
New
(
"missing cannon bin"
)
ErrMissingCannonBin
=
errors
.
New
(
"missing cannon bin"
)
ErrMissingCannonServer
=
errors
.
New
(
"missing cannon server"
)
ErrMissingCannonServer
=
errors
.
New
(
"missing cannon server"
)
...
@@ -73,7 +74,14 @@ func ValidTraceType(value TraceType) bool {
...
@@ -73,7 +74,14 @@ func ValidTraceType(value TraceType) bool {
return
false
return
false
}
}
const
DefaultCannonSnapshotFreq
=
uint
(
1
_000_000_000
)
const
(
DefaultCannonSnapshotFreq
=
uint
(
1
_000_000_000
)
// DefaultGameWindow is the default maximum time duration in the past
// that the challenger will look for games to progress.
// The default value is 11 days, which is a 4 day resolution buffer
// plus the 7 day game finalization window.
DefaultGameWindow
=
time
.
Duration
(
11
*
24
*
time
.
Hour
)
)
// Config is a well typed config that is parsed from the CLI params.
// Config is a well typed config that is parsed from the CLI params.
// This also contains config options for auxiliary services.
// This also contains config options for auxiliary services.
...
@@ -82,7 +90,9 @@ type Config struct {
...
@@ -82,7 +90,9 @@ type Config struct {
L1EthRpc
string
// L1 RPC Url
L1EthRpc
string
// L1 RPC Url
GameFactoryAddress
common
.
Address
// Address of the dispute game factory
GameFactoryAddress
common
.
Address
// Address of the dispute game factory
GameAllowlist
[]
common
.
Address
// Allowlist of fault game addresses
GameAllowlist
[]
common
.
Address
// Allowlist of fault game addresses
GameWindow
time
.
Duration
// Maximum time duration to look for games to progress
AgreeWithProposedOutput
bool
// Temporary config if we agree or disagree with the posted output
AgreeWithProposedOutput
bool
// Temporary config if we agree or disagree with the posted output
Datadir
string
// Data Directory
TraceType
TraceType
// Type of trace
TraceType
TraceType
// Type of trace
...
@@ -96,7 +106,6 @@ type Config struct {
...
@@ -96,7 +106,6 @@ type Config struct {
CannonNetwork
string
CannonNetwork
string
CannonRollupConfigPath
string
CannonRollupConfigPath
string
CannonL2GenesisPath
string
CannonL2GenesisPath
string
CannonDatadir
string
// Cannon Data Directory
CannonL2
string
// L2 RPC Url
CannonL2
string
// L2 RPC Url
CannonSnapshotFreq
uint
// Frequency of snapshots to create when executing cannon (in VM instructions)
CannonSnapshotFreq
uint
// Frequency of snapshots to create when executing cannon (in VM instructions)
...
@@ -110,6 +119,7 @@ func NewConfig(
...
@@ -110,6 +119,7 @@ func NewConfig(
l1EthRpc
string
,
l1EthRpc
string
,
traceType
TraceType
,
traceType
TraceType
,
agreeWithProposedOutput
bool
,
agreeWithProposedOutput
bool
,
datadir
string
,
)
Config
{
)
Config
{
return
Config
{
return
Config
{
L1EthRpc
:
l1EthRpc
,
L1EthRpc
:
l1EthRpc
,
...
@@ -123,7 +133,10 @@ func NewConfig(
...
@@ -123,7 +133,10 @@ func NewConfig(
MetricsConfig
:
opmetrics
.
DefaultCLIConfig
(),
MetricsConfig
:
opmetrics
.
DefaultCLIConfig
(),
PprofConfig
:
oppprof
.
DefaultCLIConfig
(),
PprofConfig
:
oppprof
.
DefaultCLIConfig
(),
Datadir
:
datadir
,
CannonSnapshotFreq
:
DefaultCannonSnapshotFreq
,
CannonSnapshotFreq
:
DefaultCannonSnapshotFreq
,
GameWindow
:
DefaultGameWindow
,
}
}
}
}
...
@@ -137,6 +150,9 @@ func (c Config) Check() error {
...
@@ -137,6 +150,9 @@ func (c Config) Check() error {
if
c
.
TraceType
==
""
{
if
c
.
TraceType
==
""
{
return
ErrMissingTraceType
return
ErrMissingTraceType
}
}
if
c
.
Datadir
==
""
{
return
ErrMissingDatadir
}
if
c
.
TraceType
==
TraceTypeCannon
{
if
c
.
TraceType
==
TraceTypeCannon
{
if
c
.
CannonBin
==
""
{
if
c
.
CannonBin
==
""
{
return
ErrMissingCannonBin
return
ErrMissingCannonBin
...
@@ -165,9 +181,6 @@ func (c Config) Check() error {
...
@@ -165,9 +181,6 @@ func (c Config) Check() error {
if
c
.
CannonAbsolutePreState
==
""
{
if
c
.
CannonAbsolutePreState
==
""
{
return
ErrMissingCannonAbsolutePreState
return
ErrMissingCannonAbsolutePreState
}
}
if
c
.
CannonDatadir
==
""
{
return
ErrMissingCannonDatadir
}
if
c
.
CannonL2
==
""
{
if
c
.
CannonL2
==
""
{
return
ErrMissingCannonL2
return
ErrMissingCannonL2
}
}
...
...
op-challenger/config/config_test.go
View file @
a382b9e2
...
@@ -17,13 +17,13 @@ var (
...
@@ -17,13 +17,13 @@ var (
validCannonOpProgramBin
=
"./bin/op-program"
validCannonOpProgramBin
=
"./bin/op-program"
validCannonNetwork
=
"mainnet"
validCannonNetwork
=
"mainnet"
validCannonAbsolutPreState
=
"pre.json"
validCannonAbsolutPreState
=
"pre.json"
valid
CannonDatadir
=
"/tmp/cannon
"
valid
Datadir
=
"/tmp/data
"
validCannonL2
=
"http://localhost:9545"
validCannonL2
=
"http://localhost:9545"
agreeWithProposedOutput
=
true
agreeWithProposedOutput
=
true
)
)
func
validConfig
(
traceType
TraceType
)
Config
{
func
validConfig
(
traceType
TraceType
)
Config
{
cfg
:=
NewConfig
(
validGameFactoryAddress
,
validL1EthRpc
,
traceType
,
agreeWithProposedOutput
)
cfg
:=
NewConfig
(
validGameFactoryAddress
,
validL1EthRpc
,
traceType
,
agreeWithProposedOutput
,
validDatadir
)
switch
traceType
{
switch
traceType
{
case
TraceTypeAlphabet
:
case
TraceTypeAlphabet
:
cfg
.
AlphabetTrace
=
validAlphabetTrace
cfg
.
AlphabetTrace
=
validAlphabetTrace
...
@@ -31,7 +31,6 @@ func validConfig(traceType TraceType) Config {
...
@@ -31,7 +31,6 @@ func validConfig(traceType TraceType) Config {
cfg
.
CannonBin
=
validCannonBin
cfg
.
CannonBin
=
validCannonBin
cfg
.
CannonServer
=
validCannonOpProgramBin
cfg
.
CannonServer
=
validCannonOpProgramBin
cfg
.
CannonAbsolutePreState
=
validCannonAbsolutPreState
cfg
.
CannonAbsolutePreState
=
validCannonAbsolutPreState
cfg
.
CannonDatadir
=
validCannonDatadir
cfg
.
CannonL2
=
validCannonL2
cfg
.
CannonL2
=
validCannonL2
cfg
.
CannonNetwork
=
validCannonNetwork
cfg
.
CannonNetwork
=
validCannonNetwork
}
}
...
@@ -99,10 +98,10 @@ func TestCannonAbsolutePreStateRequired(t *testing.T) {
...
@@ -99,10 +98,10 @@ func TestCannonAbsolutePreStateRequired(t *testing.T) {
require
.
ErrorIs
(
t
,
config
.
Check
(),
ErrMissingCannonAbsolutePreState
)
require
.
ErrorIs
(
t
,
config
.
Check
(),
ErrMissingCannonAbsolutePreState
)
}
}
func
Test
Cannon
DatadirRequired
(
t
*
testing
.
T
)
{
func
TestDatadirRequired
(
t
*
testing
.
T
)
{
config
:=
validConfig
(
TraceType
Cannon
)
config
:=
validConfig
(
TraceType
Alphabet
)
config
.
Cannon
Datadir
=
""
config
.
Datadir
=
""
require
.
ErrorIs
(
t
,
config
.
Check
(),
ErrMissing
Cannon
Datadir
)
require
.
ErrorIs
(
t
,
config
.
Check
(),
ErrMissingDatadir
)
}
}
func
TestCannonL2Required
(
t
*
testing
.
T
)
{
func
TestCannonL2Required
(
t
*
testing
.
T
)
{
...
...
op-challenger/fault/abi_test.go
View file @
a382b9e2
...
@@ -55,7 +55,7 @@ func TestBuildFaultDefendData(t *testing.T) {
...
@@ -55,7 +55,7 @@ func TestBuildFaultDefendData(t *testing.T) {
_
,
opts
,
_
,
contract
,
err
:=
setupFaultDisputeGame
()
_
,
opts
,
_
,
contract
,
err
:=
setupFaultDisputeGame
()
require
.
NoError
(
t
,
err
)
require
.
NoError
(
t
,
err
)
responder
,
_
:=
newTestFaultResponder
(
t
,
false
)
responder
,
_
:=
newTestFaultResponder
(
t
)
data
,
err
:=
responder
.
buildFaultDefendData
(
1
,
[
32
]
byte
{
0x02
,
0x03
})
data
,
err
:=
responder
.
buildFaultDefendData
(
1
,
[
32
]
byte
{
0x02
,
0x03
})
require
.
NoError
(
t
,
err
)
require
.
NoError
(
t
,
err
)
...
@@ -72,7 +72,7 @@ func TestBuildFaultAttackData(t *testing.T) {
...
@@ -72,7 +72,7 @@ func TestBuildFaultAttackData(t *testing.T) {
_
,
opts
,
_
,
contract
,
err
:=
setupFaultDisputeGame
()
_
,
opts
,
_
,
contract
,
err
:=
setupFaultDisputeGame
()
require
.
NoError
(
t
,
err
)
require
.
NoError
(
t
,
err
)
responder
,
_
:=
newTestFaultResponder
(
t
,
false
)
responder
,
_
:=
newTestFaultResponder
(
t
)
data
,
err
:=
responder
.
buildFaultAttackData
(
1
,
[
32
]
byte
{
0x02
,
0x03
})
data
,
err
:=
responder
.
buildFaultAttackData
(
1
,
[
32
]
byte
{
0x02
,
0x03
})
require
.
NoError
(
t
,
err
)
require
.
NoError
(
t
,
err
)
...
@@ -89,7 +89,7 @@ func TestBuildFaultStepData(t *testing.T) {
...
@@ -89,7 +89,7 @@ func TestBuildFaultStepData(t *testing.T) {
_
,
opts
,
_
,
contract
,
err
:=
setupFaultDisputeGame
()
_
,
opts
,
_
,
contract
,
err
:=
setupFaultDisputeGame
()
require
.
NoError
(
t
,
err
)
require
.
NoError
(
t
,
err
)
responder
,
_
:=
newTestFaultResponder
(
t
,
false
)
responder
,
_
:=
newTestFaultResponder
(
t
)
data
,
err
:=
responder
.
buildStepTxData
(
types
.
StepCallData
{
data
,
err
:=
responder
.
buildStepTxData
(
types
.
StepCallData
{
ClaimIndex
:
2
,
ClaimIndex
:
2
,
...
...
op-challenger/fault/agent.go
View file @
a382b9e2
...
@@ -13,7 +13,7 @@ import (
...
@@ -13,7 +13,7 @@ import (
// Responder takes a response action & executes.
// Responder takes a response action & executes.
// For full op-challenger this means executing the transaction on chain.
// For full op-challenger this means executing the transaction on chain.
type
Responder
interface
{
type
Responder
interface
{
Ca
nResolve
(
ctx
context
.
Context
)
bool
Ca
llResolve
(
ctx
context
.
Context
)
(
types
.
GameStatus
,
error
)
Resolve
(
ctx
context
.
Context
)
error
Resolve
(
ctx
context
.
Context
)
error
Respond
(
ctx
context
.
Context
,
response
types
.
Claim
)
error
Respond
(
ctx
context
.
Context
,
response
types
.
Claim
)
error
Step
(
ctx
context
.
Context
,
stepData
types
.
StepCallData
)
error
Step
(
ctx
context
.
Context
,
stepData
types
.
StepCallData
)
error
...
@@ -65,10 +65,27 @@ func (a *Agent) Act(ctx context.Context) error {
...
@@ -65,10 +65,27 @@ func (a *Agent) Act(ctx context.Context) error {
return
nil
return
nil
}
}
// shouldResolve returns true if the agent should resolve the game.
// This method will return false if the game is still in progress.
func
(
a
*
Agent
)
shouldResolve
(
ctx
context
.
Context
,
status
types
.
GameStatus
)
bool
{
expected
:=
types
.
GameStatusDefenderWon
if
a
.
agreeWithProposedOutput
{
expected
=
types
.
GameStatusChallengerWon
}
if
expected
!=
status
{
a
.
log
.
Warn
(
"Game will be lost"
,
"expected"
,
expected
,
"actual"
,
status
)
}
return
expected
==
status
}
// tryResolve resolves the game if it is in a terminal state
// tryResolve resolves the game if it is in a terminal state
// and returns true if the game resolves successfully.
// and returns true if the game resolves successfully.
func
(
a
*
Agent
)
tryResolve
(
ctx
context
.
Context
)
bool
{
func
(
a
*
Agent
)
tryResolve
(
ctx
context
.
Context
)
bool
{
if
!
a
.
responder
.
CanResolve
(
ctx
)
{
status
,
err
:=
a
.
responder
.
CallResolve
(
ctx
)
if
err
!=
nil
{
return
false
}
if
!
a
.
shouldResolve
(
ctx
,
status
)
{
return
false
return
false
}
}
a
.
log
.
Info
(
"Resolving game"
)
a
.
log
.
Info
(
"Resolving game"
)
...
...
op-challenger/fault/agent_test.go
0 → 100644
View file @
a382b9e2
package
fault
import
(
"context"
"testing"
"github.com/ethereum/go-ethereum/log"
"github.com/stretchr/testify/require"
"github.com/ethereum-optimism/optimism/op-challenger/fault/types"
"github.com/ethereum-optimism/optimism/op-node/testlog"
)
// TestShouldResolve tests the resolution logic.
func
TestShouldResolve
(
t
*
testing
.
T
)
{
log
:=
testlog
.
Logger
(
t
,
log
.
LvlCrit
)
t
.
Run
(
"AgreeWithProposedOutput"
,
func
(
t
*
testing
.
T
)
{
agent
:=
NewAgent
(
nil
,
0
,
nil
,
nil
,
nil
,
true
,
log
)
require
.
False
(
t
,
agent
.
shouldResolve
(
context
.
Background
(),
types
.
GameStatusDefenderWon
))
require
.
True
(
t
,
agent
.
shouldResolve
(
context
.
Background
(),
types
.
GameStatusChallengerWon
))
require
.
False
(
t
,
agent
.
shouldResolve
(
context
.
Background
(),
types
.
GameStatusInProgress
))
})
t
.
Run
(
"DisagreeWithProposedOutput"
,
func
(
t
*
testing
.
T
)
{
agent
:=
NewAgent
(
nil
,
0
,
nil
,
nil
,
nil
,
false
,
log
)
require
.
True
(
t
,
agent
.
shouldResolve
(
context
.
Background
(),
types
.
GameStatusDefenderWon
))
require
.
False
(
t
,
agent
.
shouldResolve
(
context
.
Background
(),
types
.
GameStatusChallengerWon
))
require
.
False
(
t
,
agent
.
shouldResolve
(
context
.
Background
(),
types
.
GameStatusInProgress
))
})
}
op-challenger/fault/caller.go
View file @
a382b9e2
...
@@ -8,7 +8,6 @@ import (
...
@@ -8,7 +8,6 @@ import (
"github.com/ethereum-optimism/optimism/op-challenger/fault/types"
"github.com/ethereum-optimism/optimism/op-challenger/fault/types"
"github.com/ethereum/go-ethereum/accounts/abi/bind"
"github.com/ethereum/go-ethereum/accounts/abi/bind"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/ethclient"
)
)
type
FaultDisputeGameCaller
interface
{
type
FaultDisputeGameCaller
interface
{
...
@@ -26,7 +25,7 @@ func NewFaultCaller(caller FaultDisputeGameCaller) *FaultCaller {
...
@@ -26,7 +25,7 @@ func NewFaultCaller(caller FaultDisputeGameCaller) *FaultCaller {
}
}
}
}
func
NewFaultCallerFromBindings
(
fdgAddr
common
.
Address
,
client
*
ethclient
.
Client
)
(
*
FaultCaller
,
error
)
{
func
NewFaultCallerFromBindings
(
fdgAddr
common
.
Address
,
client
bind
.
ContractCaller
)
(
*
FaultCaller
,
error
)
{
caller
,
err
:=
bindings
.
NewFaultDisputeGameCaller
(
fdgAddr
,
client
)
caller
,
err
:=
bindings
.
NewFaultDisputeGameCaller
(
fdgAddr
,
client
)
if
err
!=
nil
{
if
err
!=
nil
{
return
nil
,
err
return
nil
,
err
...
...
op-challenger/fault/cannon/executor_test.go
View file @
a382b9e2
...
@@ -21,10 +21,9 @@ const execTestCannonPrestate = "/foo/pre.json"
...
@@ -21,10 +21,9 @@ const execTestCannonPrestate = "/foo/pre.json"
func
TestGenerateProof
(
t
*
testing
.
T
)
{
func
TestGenerateProof
(
t
*
testing
.
T
)
{
input
:=
"starting.json"
input
:=
"starting.json"
cfg
:=
config
.
NewConfig
(
common
.
Address
{
0xbb
},
"http://localhost:8888"
,
config
.
TraceTypeCannon
,
true
)
tempDir
:=
t
.
TempDir
()
tempDir
:=
t
.
TempDir
()
dir
:=
filepath
.
Join
(
tempDir
,
"gameDir"
)
dir
:=
filepath
.
Join
(
tempDir
,
"gameDir"
)
cfg
.
CannonDatadir
=
tempDir
cfg
:=
config
.
NewConfig
(
common
.
Address
{
0xbb
},
"http://localhost:8888"
,
config
.
TraceTypeCannon
,
true
,
tempDir
)
cfg
.
CannonAbsolutePreState
=
"pre.json"
cfg
.
CannonAbsolutePreState
=
"pre.json"
cfg
.
CannonBin
=
"./bin/cannon"
cfg
.
CannonBin
=
"./bin/cannon"
cfg
.
CannonServer
=
"./bin/op-program"
cfg
.
CannonServer
=
"./bin/op-program"
...
...
op-challenger/fault/cannon/provider.go
View file @
a382b9e2
...
@@ -50,7 +50,7 @@ type CannonTraceProvider struct {
...
@@ -50,7 +50,7 @@ type CannonTraceProvider struct {
lastProof
*
proofData
lastProof
*
proofData
}
}
func
NewTraceProvider
(
ctx
context
.
Context
,
logger
log
.
Logger
,
cfg
*
config
.
Config
,
l1Client
bind
.
ContractCaller
,
gameAddr
common
.
Address
)
(
*
CannonTraceProvider
,
error
)
{
func
NewTraceProvider
(
ctx
context
.
Context
,
logger
log
.
Logger
,
cfg
*
config
.
Config
,
l1Client
bind
.
ContractCaller
,
dir
string
,
gameAddr
common
.
Address
)
(
*
CannonTraceProvider
,
error
)
{
l2Client
,
err
:=
ethclient
.
DialContext
(
ctx
,
cfg
.
CannonL2
)
l2Client
,
err
:=
ethclient
.
DialContext
(
ctx
,
cfg
.
CannonL2
)
if
err
!=
nil
{
if
err
!=
nil
{
return
nil
,
fmt
.
Errorf
(
"dial l2 client %v: %w"
,
cfg
.
CannonL2
,
err
)
return
nil
,
fmt
.
Errorf
(
"dial l2 client %v: %w"
,
cfg
.
CannonL2
,
err
)
...
@@ -64,11 +64,10 @@ func NewTraceProvider(ctx context.Context, logger log.Logger, cfg *config.Config
...
@@ -64,11 +64,10 @@ func NewTraceProvider(ctx context.Context, logger log.Logger, cfg *config.Config
if
err
!=
nil
{
if
err
!=
nil
{
return
nil
,
fmt
.
Errorf
(
"fetch local game inputs: %w"
,
err
)
return
nil
,
fmt
.
Errorf
(
"fetch local game inputs: %w"
,
err
)
}
}
return
NewTraceProviderFromInputs
(
logger
,
cfg
,
gameAddr
.
Hex
(),
localInputs
),
nil
return
NewTraceProviderFromInputs
(
logger
,
cfg
,
localInputs
,
dir
),
nil
}
}
func
NewTraceProviderFromInputs
(
logger
log
.
Logger
,
cfg
*
config
.
Config
,
gameDirName
string
,
localInputs
LocalGameInputs
)
*
CannonTraceProvider
{
func
NewTraceProviderFromInputs
(
logger
log
.
Logger
,
cfg
*
config
.
Config
,
localInputs
LocalGameInputs
,
dir
string
)
*
CannonTraceProvider
{
dir
:=
filepath
.
Join
(
cfg
.
CannonDatadir
,
gameDirName
)
return
&
CannonTraceProvider
{
return
&
CannonTraceProvider
{
logger
:
logger
,
logger
:
logger
,
dir
:
dir
,
dir
:
dir
,
...
...
op-challenger/fault/cannon/provider_test.go
View file @
a382b9e2
...
@@ -11,7 +11,6 @@ import (
...
@@ -11,7 +11,6 @@ import (
"testing"
"testing"
"github.com/ethereum-optimism/optimism/cannon/mipsevm"
"github.com/ethereum-optimism/optimism/cannon/mipsevm"
"github.com/ethereum-optimism/optimism/op-challenger/config"
"github.com/ethereum-optimism/optimism/op-challenger/fault/types"
"github.com/ethereum-optimism/optimism/op-challenger/fault/types"
"github.com/ethereum-optimism/optimism/op-node/testlog"
"github.com/ethereum-optimism/optimism/op-node/testlog"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/common"
...
@@ -189,21 +188,6 @@ func TestAbsolutePreState(t *testing.T) {
...
@@ -189,21 +188,6 @@ func TestAbsolutePreState(t *testing.T) {
})
})
}
}
func
TestUseGameSpecificSubdir
(
t
*
testing
.
T
)
{
tempDir
:=
t
.
TempDir
()
dataDir
:=
filepath
.
Join
(
tempDir
,
"data"
)
setupPreState
(
t
,
tempDir
,
"state.json"
)
logger
:=
testlog
.
Logger
(
t
,
log
.
LvlInfo
)
cfg
:=
&
config
.
Config
{
CannonAbsolutePreState
:
filepath
.
Join
(
tempDir
,
"state.json"
),
CannonDatadir
:
dataDir
,
}
gameDirName
:=
"gameSubdir"
localInputs
:=
LocalGameInputs
{}
provider
:=
NewTraceProviderFromInputs
(
logger
,
cfg
,
gameDirName
,
localInputs
)
require
.
Equal
(
t
,
filepath
.
Join
(
dataDir
,
gameDirName
),
provider
.
dir
,
"should use game specific subdir"
)
}
func
setupPreState
(
t
*
testing
.
T
,
dataDir
string
,
filename
string
)
{
func
setupPreState
(
t
*
testing
.
T
,
dataDir
string
,
filename
string
)
{
srcDir
:=
filepath
.
Join
(
"test_data"
)
srcDir
:=
filepath
.
Join
(
"test_data"
)
path
:=
filepath
.
Join
(
srcDir
,
filename
)
path
:=
filepath
.
Join
(
srcDir
,
filename
)
...
...
op-challenger/fault/disk.go
0 → 100644
View file @
a382b9e2
package
fault
import
(
"fmt"
"os"
"path/filepath"
"strings"
"github.com/ethereum/go-ethereum/common"
"github.com/hashicorp/go-multierror"
"golang.org/x/exp/slices"
)
const
gameDirPrefix
=
"game-"
// diskManager coordinates
type
diskManager
struct
{
datadir
string
}
func
newDiskManager
(
dir
string
)
*
diskManager
{
return
&
diskManager
{
datadir
:
dir
}
}
func
(
d
*
diskManager
)
DirForGame
(
addr
common
.
Address
)
string
{
return
filepath
.
Join
(
d
.
datadir
,
gameDirPrefix
+
addr
.
Hex
())
}
func
(
d
*
diskManager
)
RemoveAllExcept
(
keep
[]
common
.
Address
)
error
{
entries
,
err
:=
os
.
ReadDir
(
d
.
datadir
)
if
err
!=
nil
{
return
fmt
.
Errorf
(
"failed to list directory: %w"
,
err
)
}
var
result
error
for
_
,
entry
:=
range
entries
{
if
!
entry
.
IsDir
()
||
!
strings
.
HasPrefix
(
entry
.
Name
(),
gameDirPrefix
)
{
// Skip files and directories that don't have the game directory prefix.
// While random content shouldn't be in our datadir, we want to avoid
// deleting things like OS generated files.
continue
}
name
:=
entry
.
Name
()[
len
(
gameDirPrefix
)
:
]
addr
:=
common
.
HexToAddress
(
name
)
if
addr
==
(
common
.
Address
{})
{
// Couldn't parse the directory name to an address so mustn't be a game directory
continue
}
if
slices
.
Contains
(
keep
,
addr
)
{
// We need to preserve this data
continue
}
if
err
:=
os
.
RemoveAll
(
filepath
.
Join
(
d
.
datadir
,
entry
.
Name
()));
err
!=
nil
{
result
=
multierror
.
Append
(
result
,
err
)
}
}
return
result
}
op-challenger/fault/disk_test.go
0 → 100644
View file @
a382b9e2
package
fault
import
(
"os"
"path/filepath"
"testing"
"github.com/ethereum/go-ethereum/common"
"github.com/stretchr/testify/require"
)
func
TestDiskManager_DirForGame
(
t
*
testing
.
T
)
{
baseDir
:=
t
.
TempDir
()
addr
:=
common
.
Address
{
0x53
}
disk
:=
newDiskManager
(
baseDir
)
result
:=
disk
.
DirForGame
(
addr
)
require
.
Equal
(
t
,
filepath
.
Join
(
baseDir
,
gameDirPrefix
+
addr
.
Hex
()),
result
)
}
func
TestDiskManager_RemoveAllExcept
(
t
*
testing
.
T
)
{
baseDir
:=
t
.
TempDir
()
keep
:=
common
.
Address
{
0x53
}
delete
:=
common
.
Address
{
0xaa
}
disk
:=
newDiskManager
(
baseDir
)
keepDir
:=
disk
.
DirForGame
(
keep
)
deleteDir
:=
disk
.
DirForGame
(
delete
)
unexpectedFile
:=
filepath
.
Join
(
baseDir
,
"file.txt"
)
require
.
NoError
(
t
,
os
.
WriteFile
(
unexpectedFile
,
[]
byte
(
"test"
),
0644
))
unexpectedDir
:=
filepath
.
Join
(
baseDir
,
"notagame"
)
require
.
NoError
(
t
,
os
.
MkdirAll
(
unexpectedDir
,
0777
))
invalidHexDir
:=
filepath
.
Join
(
baseDir
,
gameDirPrefix
+
"0xNOPE"
)
require
.
NoError
(
t
,
os
.
MkdirAll
(
invalidHexDir
,
0777
))
populateDir
:=
func
(
dir
string
)
[]
string
{
require
.
NoError
(
t
,
os
.
MkdirAll
(
dir
,
0777
))
file1
:=
filepath
.
Join
(
dir
,
"test.txt"
)
require
.
NoError
(
t
,
os
.
WriteFile
(
file1
,
[]
byte
(
"foo"
),
0644
))
nestedDirs
:=
filepath
.
Join
(
dir
,
"subdir"
,
"deep"
)
require
.
NoError
(
t
,
os
.
MkdirAll
(
nestedDirs
,
0777
))
file2
:=
filepath
.
Join
(
nestedDirs
,
".foo.txt"
)
require
.
NoError
(
t
,
os
.
WriteFile
(
file2
,
[]
byte
(
"foo"
),
0644
))
return
[]
string
{
file1
,
file2
}
}
keepFiles
:=
populateDir
(
keepDir
)
populateDir
(
deleteDir
)
require
.
NoError
(
t
,
disk
.
RemoveAllExcept
([]
common
.
Address
{
keep
}))
require
.
NoDirExists
(
t
,
deleteDir
,
"should have deleted directory"
)
for
_
,
file
:=
range
keepFiles
{
require
.
FileExists
(
t
,
file
,
"should have kept file for active game"
)
}
require
.
FileExists
(
t
,
unexpectedFile
,
"should not delete unexpected file"
)
require
.
DirExists
(
t
,
unexpectedDir
,
"should not delete unexpected dir"
)
require
.
DirExists
(
t
,
invalidHexDir
,
"should not delete dir with invalid address"
)
}
op-challenger/fault/factory.go
View file @
a382b9e2
...
@@ -43,7 +43,7 @@ func NewGameLoader(caller MinimalDisputeGameFactoryCaller) *gameLoader {
...
@@ -43,7 +43,7 @@ func NewGameLoader(caller MinimalDisputeGameFactoryCaller) *gameLoader {
}
}
// FetchAllGamesAtBlock fetches all dispute games from the factory at a given block number.
// FetchAllGamesAtBlock fetches all dispute games from the factory at a given block number.
func
(
l
*
gameLoader
)
FetchAllGamesAtBlock
(
ctx
context
.
Context
,
blockNumber
*
big
.
Int
)
([]
FaultDisputeGame
,
error
)
{
func
(
l
*
gameLoader
)
FetchAllGamesAtBlock
(
ctx
context
.
Context
,
earliestTimestamp
uint64
,
blockNumber
*
big
.
Int
)
([]
FaultDisputeGame
,
error
)
{
if
blockNumber
==
nil
{
if
blockNumber
==
nil
{
return
nil
,
ErrMissingBlockNumber
return
nil
,
ErrMissingBlockNumber
}
}
...
@@ -56,14 +56,19 @@ func (l *gameLoader) FetchAllGamesAtBlock(ctx context.Context, blockNumber *big.
...
@@ -56,14 +56,19 @@ func (l *gameLoader) FetchAllGamesAtBlock(ctx context.Context, blockNumber *big.
return
nil
,
fmt
.
Errorf
(
"failed to fetch game count: %w"
,
err
)
return
nil
,
fmt
.
Errorf
(
"failed to fetch game count: %w"
,
err
)
}
}
games
:=
make
([]
FaultDisputeGame
,
gameCount
.
Uint64
())
games
:=
make
([]
FaultDisputeGame
,
0
)
for
i
:=
uint64
(
0
);
i
<
gameCount
.
Uint64
();
i
++
{
if
gameCount
.
Uint64
()
==
0
{
game
,
err
:=
l
.
caller
.
GameAtIndex
(
callOpts
,
big
.
NewInt
(
int64
(
i
)))
return
games
,
nil
}
for
i
:=
gameCount
.
Uint64
();
i
>
0
;
i
--
{
game
,
err
:=
l
.
caller
.
GameAtIndex
(
callOpts
,
big
.
NewInt
(
int64
(
i
-
1
)))
if
err
!=
nil
{
if
err
!=
nil
{
return
nil
,
fmt
.
Errorf
(
"failed to fetch game at index %d: %w"
,
i
,
err
)
return
nil
,
fmt
.
Errorf
(
"failed to fetch game at index %d: %w"
,
i
,
err
)
}
}
if
game
.
Timestamp
<
earliestTimestamp
{
games
[
i
]
=
game
break
}
games
=
append
(
games
,
game
)
}
}
return
games
,
nil
return
games
,
nil
...
...
op-challenger/fault/factory_test.go
View file @
a382b9e2
...
@@ -25,6 +25,7 @@ func TestGameLoader_FetchAllGames(t *testing.T) {
...
@@ -25,6 +25,7 @@ func TestGameLoader_FetchAllGames(t *testing.T) {
tests
:=
[]
struct
{
tests
:=
[]
struct
{
name
string
name
string
caller
*
mockMinimalDisputeGameFactoryCaller
caller
*
mockMinimalDisputeGameFactoryCaller
earliest
uint64
blockNumber
*
big
.
Int
blockNumber
*
big
.
Int
expectedErr
error
expectedErr
error
expectedLen
int
expectedLen
int
...
@@ -33,35 +34,36 @@ func TestGameLoader_FetchAllGames(t *testing.T) {
...
@@ -33,35 +34,36 @@ func TestGameLoader_FetchAllGames(t *testing.T) {
name
:
"success"
,
name
:
"success"
,
caller
:
newMockMinimalDisputeGameFactoryCaller
(
10
,
false
,
false
),
caller
:
newMockMinimalDisputeGameFactoryCaller
(
10
,
false
,
false
),
blockNumber
:
big
.
NewInt
(
1
),
blockNumber
:
big
.
NewInt
(
1
),
expectedErr
:
nil
,
expectedLen
:
10
,
expectedLen
:
10
,
},
},
{
name
:
"expired game ignored"
,
caller
:
newMockMinimalDisputeGameFactoryCaller
(
10
,
false
,
false
),
earliest
:
500
,
blockNumber
:
big
.
NewInt
(
1
),
expectedLen
:
5
,
},
{
{
name
:
"game count error"
,
name
:
"game count error"
,
caller
:
newMockMinimalDisputeGameFactoryCaller
(
10
,
true
,
false
),
caller
:
newMockMinimalDisputeGameFactoryCaller
(
10
,
true
,
false
),
blockNumber
:
big
.
NewInt
(
1
),
blockNumber
:
big
.
NewInt
(
1
),
expectedErr
:
gameCountErr
,
expectedErr
:
gameCountErr
,
expectedLen
:
0
,
},
},
{
{
name
:
"game index error"
,
name
:
"game index error"
,
caller
:
newMockMinimalDisputeGameFactoryCaller
(
10
,
false
,
true
),
caller
:
newMockMinimalDisputeGameFactoryCaller
(
10
,
false
,
true
),
blockNumber
:
big
.
NewInt
(
1
),
blockNumber
:
big
.
NewInt
(
1
),
expectedErr
:
gameIndexErr
,
expectedErr
:
gameIndexErr
,
expectedLen
:
0
,
},
},
{
{
name
:
"no games"
,
name
:
"no games"
,
caller
:
newMockMinimalDisputeGameFactoryCaller
(
0
,
false
,
false
),
caller
:
newMockMinimalDisputeGameFactoryCaller
(
0
,
false
,
false
),
blockNumber
:
big
.
NewInt
(
1
),
blockNumber
:
big
.
NewInt
(
1
),
expectedErr
:
nil
,
expectedLen
:
0
,
},
},
{
{
name
:
"missing block number"
,
name
:
"missing block number"
,
caller
:
newMockMinimalDisputeGameFactoryCaller
(
0
,
false
,
false
),
caller
:
newMockMinimalDisputeGameFactoryCaller
(
0
,
false
,
false
),
expectedErr
:
ErrMissingBlockNumber
,
expectedErr
:
ErrMissingBlockNumber
,
expectedLen
:
0
,
},
},
}
}
...
@@ -72,10 +74,11 @@ func TestGameLoader_FetchAllGames(t *testing.T) {
...
@@ -72,10 +74,11 @@ func TestGameLoader_FetchAllGames(t *testing.T) {
t
.
Parallel
()
t
.
Parallel
()
loader
:=
NewGameLoader
(
test
.
caller
)
loader
:=
NewGameLoader
(
test
.
caller
)
games
,
err
:=
loader
.
FetchAllGamesAtBlock
(
context
.
Background
(),
test
.
blockNumber
)
games
,
err
:=
loader
.
FetchAllGamesAtBlock
(
context
.
Background
(),
test
.
earliest
,
test
.
blockNumber
)
require
.
ErrorIs
(
t
,
err
,
test
.
expectedErr
)
require
.
ErrorIs
(
t
,
err
,
test
.
expectedErr
)
require
.
Len
(
t
,
games
,
test
.
expectedLen
)
require
.
Len
(
t
,
games
,
test
.
expectedLen
)
expectedGames
:=
test
.
caller
.
games
expectedGames
:=
test
.
caller
.
games
expectedGames
=
expectedGames
[
len
(
expectedGames
)
-
test
.
expectedLen
:
]
if
test
.
expectedErr
!=
nil
{
if
test
.
expectedErr
!=
nil
{
expectedGames
=
make
([]
FaultDisputeGame
,
0
)
expectedGames
=
make
([]
FaultDisputeGame
,
0
)
}
}
...
@@ -90,7 +93,7 @@ func generateMockGames(count uint64) []FaultDisputeGame {
...
@@ -90,7 +93,7 @@ func generateMockGames(count uint64) []FaultDisputeGame {
for
i
:=
uint64
(
0
);
i
<
count
;
i
++
{
for
i
:=
uint64
(
0
);
i
<
count
;
i
++
{
games
[
i
]
=
FaultDisputeGame
{
games
[
i
]
=
FaultDisputeGame
{
Proxy
:
common
.
BigToAddress
(
big
.
NewInt
(
int64
(
i
))),
Proxy
:
common
.
BigToAddress
(
big
.
NewInt
(
int64
(
i
))),
Timestamp
:
i
,
Timestamp
:
i
*
100
,
}
}
}
}
...
...
op-challenger/fault/monitor.go
View file @
a382b9e2
...
@@ -15,29 +15,47 @@ type gamePlayer interface {
...
@@ -15,29 +15,47 @@ type gamePlayer interface {
ProgressGame
(
ctx
context
.
Context
)
bool
ProgressGame
(
ctx
context
.
Context
)
bool
}
}
type
playerCreator
func
(
address
common
.
Address
)
(
gamePlayer
,
error
)
type
playerCreator
func
(
address
common
.
Address
,
dir
string
)
(
gamePlayer
,
error
)
type
blockNumberFetcher
func
(
ctx
context
.
Context
)
(
uint64
,
error
)
type
blockNumberFetcher
func
(
ctx
context
.
Context
)
(
uint64
,
error
)
// gameSource loads information about the games available to play
// gameSource loads information about the games available to play
type
gameSource
interface
{
type
gameSource
interface
{
FetchAllGamesAtBlock
(
ctx
context
.
Context
,
blockNumber
*
big
.
Int
)
([]
FaultDisputeGame
,
error
)
FetchAllGamesAtBlock
(
ctx
context
.
Context
,
earliest
uint64
,
blockNumber
*
big
.
Int
)
([]
FaultDisputeGame
,
error
)
}
type
gameDiskAllocator
interface
{
DirForGame
(
common
.
Address
)
string
RemoveAllExcept
([]
common
.
Address
)
error
}
}
type
gameMonitor
struct
{
type
gameMonitor
struct
{
logger
log
.
Logger
logger
log
.
Logger
clock
clock
.
Clock
clock
clock
.
Clock
diskManager
gameDiskAllocator
source
gameSource
source
gameSource
gameWindow
time
.
Duration
createPlayer
playerCreator
createPlayer
playerCreator
fetchBlockNumber
blockNumberFetcher
fetchBlockNumber
blockNumberFetcher
allowedGames
[]
common
.
Address
allowedGames
[]
common
.
Address
players
map
[
common
.
Address
]
gamePlayer
players
map
[
common
.
Address
]
gamePlayer
}
}
func
newGameMonitor
(
logger
log
.
Logger
,
cl
clock
.
Clock
,
fetchBlockNumber
blockNumberFetcher
,
allowedGames
[]
common
.
Address
,
source
gameSource
,
createGame
playerCreator
)
*
gameMonitor
{
func
newGameMonitor
(
logger
log
.
Logger
,
gameWindow
time
.
Duration
,
cl
clock
.
Clock
,
disk
gameDiskAllocator
,
fetchBlockNumber
blockNumberFetcher
,
allowedGames
[]
common
.
Address
,
source
gameSource
,
createGame
playerCreator
,
)
*
gameMonitor
{
return
&
gameMonitor
{
return
&
gameMonitor
{
logger
:
logger
,
logger
:
logger
,
clock
:
cl
,
clock
:
cl
,
diskManager
:
disk
,
source
:
source
,
source
:
source
,
gameWindow
:
gameWindow
,
createPlayer
:
createGame
,
createPlayer
:
createGame
,
fetchBlockNumber
:
fetchBlockNumber
,
fetchBlockNumber
:
fetchBlockNumber
,
allowedGames
:
allowedGames
,
allowedGames
:
allowedGames
,
...
@@ -57,26 +75,59 @@ func (m *gameMonitor) allowedGame(game common.Address) bool {
...
@@ -57,26 +75,59 @@ func (m *gameMonitor) allowedGame(game common.Address) bool {
return
false
return
false
}
}
func
(
m
*
gameMonitor
)
minGameTimestamp
()
uint64
{
if
m
.
gameWindow
.
Seconds
()
==
0
{
return
0
}
// time: "To compute t-d for a duration d, use t.Add(-d)."
// https://pkg.go.dev/time#Time.Sub
if
m
.
clock
.
Now
()
.
Unix
()
>
int64
(
m
.
gameWindow
.
Seconds
())
{
return
uint64
(
m
.
clock
.
Now
()
.
Add
(
-
m
.
gameWindow
)
.
Unix
())
}
return
0
}
func
(
m
*
gameMonitor
)
progressGames
(
ctx
context
.
Context
)
error
{
func
(
m
*
gameMonitor
)
progressGames
(
ctx
context
.
Context
)
error
{
blockNum
,
err
:=
m
.
fetchBlockNumber
(
ctx
)
blockNum
,
err
:=
m
.
fetchBlockNumber
(
ctx
)
if
err
!=
nil
{
if
err
!=
nil
{
return
fmt
.
Errorf
(
"failed to load current block number: %w"
,
err
)
return
fmt
.
Errorf
(
"failed to load current block number: %w"
,
err
)
}
}
games
,
err
:=
m
.
source
.
FetchAllGamesAtBlock
(
ctx
,
new
(
big
.
Int
)
.
SetUint64
(
blockNum
))
games
,
err
:=
m
.
source
.
FetchAllGamesAtBlock
(
ctx
,
m
.
minGameTimestamp
(),
new
(
big
.
Int
)
.
SetUint64
(
blockNum
))
if
err
!=
nil
{
if
err
!=
nil
{
return
fmt
.
Errorf
(
"failed to load games: %w"
,
err
)
return
fmt
.
Errorf
(
"failed to load games: %w"
,
err
)
}
}
requiredGames
:=
make
(
map
[
common
.
Address
]
bool
)
var
keepGameData
[]
common
.
Address
for
_
,
game
:=
range
games
{
for
_
,
game
:=
range
games
{
if
!
m
.
allowedGame
(
game
.
Proxy
)
{
if
!
m
.
allowedGame
(
game
.
Proxy
)
{
m
.
logger
.
Debug
(
"Skipping game not on allow list"
,
"game"
,
game
.
Proxy
)
m
.
logger
.
Debug
(
"Skipping game not on allow list"
,
"game"
,
game
.
Proxy
)
continue
continue
}
}
requiredGames
[
game
.
Proxy
]
=
true
player
,
err
:=
m
.
fetchOrCreateGamePlayer
(
game
)
player
,
err
:=
m
.
fetchOrCreateGamePlayer
(
game
)
if
err
!=
nil
{
if
err
!=
nil
{
m
.
logger
.
Error
(
"Error while progressing game"
,
"game"
,
game
.
Proxy
,
"err"
,
err
)
m
.
logger
.
Error
(
"Error while progressing game"
,
"game"
,
game
.
Proxy
,
"err"
,
err
)
continue
continue
}
}
player
.
ProgressGame
(
ctx
)
done
:=
player
.
ProgressGame
(
ctx
)
if
!
done
{
// We only keep resources on disk for games that are incomplete.
// Games that are complete have their data removed as soon as possible to save disk space.
// We keep the player in memory to avoid recreating it on every update but will no longer
// need the resources on disk because there are no further actions required on the game.
keepGameData
=
append
(
keepGameData
,
game
.
Proxy
)
}
}
if
err
:=
m
.
diskManager
.
RemoveAllExcept
(
keepGameData
);
err
!=
nil
{
m
.
logger
.
Error
(
"Unable to cleanup game data"
,
"err"
,
err
)
}
// Remove the player for any game that's no longer being returned from the list of active games
for
addr
:=
range
m
.
players
{
if
_
,
ok
:=
requiredGames
[
addr
];
ok
{
// Game still required
continue
}
delete
(
m
.
players
,
addr
)
}
}
return
nil
return
nil
}
}
...
@@ -85,7 +136,7 @@ func (m *gameMonitor) fetchOrCreateGamePlayer(gameData FaultDisputeGame) (gamePl
...
@@ -85,7 +136,7 @@ func (m *gameMonitor) fetchOrCreateGamePlayer(gameData FaultDisputeGame) (gamePl
if
player
,
ok
:=
m
.
players
[
gameData
.
Proxy
];
ok
{
if
player
,
ok
:=
m
.
players
[
gameData
.
Proxy
];
ok
{
return
player
,
nil
return
player
,
nil
}
}
player
,
err
:=
m
.
createPlayer
(
gameData
.
Proxy
)
player
,
err
:=
m
.
createPlayer
(
gameData
.
Proxy
,
m
.
diskManager
.
DirForGame
(
gameData
.
Proxy
)
)
if
err
!=
nil
{
if
err
!=
nil
{
return
nil
,
fmt
.
Errorf
(
"failed to create game player %v: %w"
,
gameData
.
Proxy
,
err
)
return
nil
,
fmt
.
Errorf
(
"failed to create game player %v: %w"
,
gameData
.
Proxy
,
err
)
}
}
...
...
op-challenger/fault/monitor_test.go
View file @
a382b9e2
...
@@ -4,17 +4,45 @@ import (
...
@@ -4,17 +4,45 @@ import (
"context"
"context"
"math/big"
"math/big"
"testing"
"testing"
"time"
"github.com/ethereum-optimism/optimism/op-service/clock"
"github.com/ethereum-optimism/optimism/op-service/clock"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/log"
"github.com/ethereum/go-ethereum/log"
"github.com/stretchr/testify/require"
"github.com/stretchr/testify/require"
"golang.org/x/exp/slices"
"github.com/ethereum-optimism/optimism/op-node/testlog"
"github.com/ethereum-optimism/optimism/op-node/testlog"
)
)
func
TestMonitorMinGameTimestamp
(
t
*
testing
.
T
)
{
t
.
Parallel
()
t
.
Run
(
"zero game window returns zero"
,
func
(
t
*
testing
.
T
)
{
monitor
,
_
,
_
,
_
:=
setupMonitorTest
(
t
,
[]
common
.
Address
{})
monitor
.
gameWindow
=
time
.
Duration
(
0
)
require
.
Equal
(
t
,
monitor
.
minGameTimestamp
(),
uint64
(
0
))
})
t
.
Run
(
"non-zero game window with zero clock"
,
func
(
t
*
testing
.
T
)
{
monitor
,
_
,
_
,
_
:=
setupMonitorTest
(
t
,
[]
common
.
Address
{})
monitor
.
gameWindow
=
time
.
Minute
monitor
.
clock
=
clock
.
NewDeterministicClock
(
time
.
Unix
(
0
,
0
))
require
.
Equal
(
t
,
monitor
.
minGameTimestamp
(),
uint64
(
0
))
})
t
.
Run
(
"minimum computed correctly"
,
func
(
t
*
testing
.
T
)
{
monitor
,
_
,
_
,
_
:=
setupMonitorTest
(
t
,
[]
common
.
Address
{})
monitor
.
gameWindow
=
time
.
Minute
frozen
:=
time
.
Unix
(
int64
(
time
.
Hour
.
Seconds
()),
0
)
monitor
.
clock
=
clock
.
NewDeterministicClock
(
frozen
)
expected
:=
uint64
(
frozen
.
Add
(
-
time
.
Minute
)
.
Unix
())
require
.
Equal
(
t
,
monitor
.
minGameTimestamp
(),
expected
)
})
}
func
TestMonitorExitsWhenContextDone
(
t
*
testing
.
T
)
{
func
TestMonitorExitsWhenContextDone
(
t
*
testing
.
T
)
{
monitor
,
_
,
_
:=
setupMonitorTest
(
t
,
[]
common
.
Address
{
common
.
Address
{}})
monitor
,
_
,
_
,
_
:=
setupMonitorTest
(
t
,
[]
common
.
Address
{
{}})
ctx
,
cancel
:=
context
.
WithCancel
(
context
.
Background
())
ctx
,
cancel
:=
context
.
WithCancel
(
context
.
Background
())
cancel
()
cancel
()
err
:=
monitor
.
MonitorGames
(
ctx
)
err
:=
monitor
.
MonitorGames
(
ctx
)
...
@@ -22,7 +50,7 @@ func TestMonitorExitsWhenContextDone(t *testing.T) {
...
@@ -22,7 +50,7 @@ func TestMonitorExitsWhenContextDone(t *testing.T) {
}
}
func
TestMonitorCreateAndProgressGameAgents
(
t
*
testing
.
T
)
{
func
TestMonitorCreateAndProgressGameAgents
(
t
*
testing
.
T
)
{
monitor
,
source
,
games
:=
setupMonitorTest
(
t
,
[]
common
.
Address
{})
monitor
,
source
,
games
,
_
:=
setupMonitorTest
(
t
,
[]
common
.
Address
{})
addr1
:=
common
.
Address
{
0xaa
}
addr1
:=
common
.
Address
{
0xaa
}
addr2
:=
common
.
Address
{
0xbb
}
addr2
:=
common
.
Address
{
0xbb
}
...
@@ -55,7 +83,7 @@ func TestMonitorCreateAndProgressGameAgents(t *testing.T) {
...
@@ -55,7 +83,7 @@ func TestMonitorCreateAndProgressGameAgents(t *testing.T) {
func
TestMonitorOnlyCreateSpecifiedGame
(
t
*
testing
.
T
)
{
func
TestMonitorOnlyCreateSpecifiedGame
(
t
*
testing
.
T
)
{
addr1
:=
common
.
Address
{
0xaa
}
addr1
:=
common
.
Address
{
0xaa
}
addr2
:=
common
.
Address
{
0xbb
}
addr2
:=
common
.
Address
{
0xbb
}
monitor
,
source
,
games
:=
setupMonitorTest
(
t
,
[]
common
.
Address
{
addr2
})
monitor
,
source
,
games
,
_
:=
setupMonitorTest
(
t
,
[]
common
.
Address
{
addr2
})
source
.
games
=
[]
FaultDisputeGame
{
source
.
games
=
[]
FaultDisputeGame
{
{
{
...
@@ -77,7 +105,82 @@ func TestMonitorOnlyCreateSpecifiedGame(t *testing.T) {
...
@@ -77,7 +105,82 @@ func TestMonitorOnlyCreateSpecifiedGame(t *testing.T) {
require
.
Equal
(
t
,
1
,
games
.
created
[
addr2
]
.
progressCount
)
require
.
Equal
(
t
,
1
,
games
.
created
[
addr2
]
.
progressCount
)
}
}
func
setupMonitorTest
(
t
*
testing
.
T
,
allowedGames
[]
common
.
Address
)
(
*
gameMonitor
,
*
stubGameSource
,
*
createdGames
)
{
func
TestDeletePlayersWhenNoLongerInListOfGames
(
t
*
testing
.
T
)
{
addr1
:=
common
.
Address
{
0xaa
}
addr2
:=
common
.
Address
{
0xbb
}
monitor
,
source
,
games
,
_
:=
setupMonitorTest
(
t
,
nil
)
allGames
:=
[]
FaultDisputeGame
{
{
Proxy
:
addr1
,
Timestamp
:
9999
,
},
{
Proxy
:
addr2
,
Timestamp
:
9999
,
},
}
source
.
games
=
allGames
require
.
NoError
(
t
,
monitor
.
progressGames
(
context
.
Background
()))
require
.
Len
(
t
,
games
.
created
,
2
)
require
.
Contains
(
t
,
games
.
created
,
addr1
)
require
.
Contains
(
t
,
games
.
created
,
addr2
)
// First game is now old enough it's not returned in the list of active games
source
.
games
=
source
.
games
[
1
:
]
require
.
NoError
(
t
,
monitor
.
progressGames
(
context
.
Background
()))
require
.
Len
(
t
,
games
.
created
,
2
)
require
.
Contains
(
t
,
games
.
created
,
addr1
)
require
.
Contains
(
t
,
games
.
created
,
addr2
)
// Forget that we created the first game so it can be recreated if needed
delete
(
games
.
created
,
addr1
)
// First game now reappears (inexplicably but usefully for our testing)
source
.
games
=
allGames
require
.
NoError
(
t
,
monitor
.
progressGames
(
context
.
Background
()))
// A new player is created for it because the original was deleted
require
.
Len
(
t
,
games
.
created
,
2
)
require
.
Contains
(
t
,
games
.
created
,
addr1
)
require
.
Contains
(
t
,
games
.
created
,
addr2
)
require
.
Equal
(
t
,
1
,
games
.
created
[
addr1
]
.
progressCount
)
}
func
TestCleanupResourcesOfCompletedGames
(
t
*
testing
.
T
)
{
addr1
:=
common
.
Address
{
0xaa
}
addr2
:=
common
.
Address
{
0xbb
}
monitor
,
source
,
games
,
disk
:=
setupMonitorTest
(
t
,
[]
common
.
Address
{})
games
.
createCompleted
=
addr1
source
.
games
=
[]
FaultDisputeGame
{
{
Proxy
:
addr1
,
Timestamp
:
1999
,
},
{
Proxy
:
addr2
,
Timestamp
:
9999
,
},
}
err
:=
monitor
.
progressGames
(
context
.
Background
())
require
.
NoError
(
t
,
err
)
require
.
Len
(
t
,
games
.
created
,
2
,
"should create game agents"
)
require
.
Contains
(
t
,
games
.
created
,
addr1
)
require
.
Contains
(
t
,
games
.
created
,
addr2
)
require
.
Equal
(
t
,
1
,
games
.
created
[
addr1
]
.
progressCount
)
require
.
Equal
(
t
,
1
,
games
.
created
[
addr2
]
.
progressCount
)
require
.
Contains
(
t
,
disk
.
gameDirExists
,
addr1
,
"should have allocated a game dir for game 1"
)
require
.
False
(
t
,
disk
.
gameDirExists
[
addr1
],
"should have then deleted the game 1 dir"
)
require
.
Contains
(
t
,
disk
.
gameDirExists
,
addr2
,
"should have allocated a game dir for game 2"
)
require
.
True
(
t
,
disk
.
gameDirExists
[
addr2
],
"should not have deleted the game 2 dir"
)
}
func
setupMonitorTest
(
t
*
testing
.
T
,
allowedGames
[]
common
.
Address
)
(
*
gameMonitor
,
*
stubGameSource
,
*
createdGames
,
*
stubDiskManager
)
{
logger
:=
testlog
.
Logger
(
t
,
log
.
LvlDebug
)
logger
:=
testlog
.
Logger
(
t
,
log
.
LvlDebug
)
source
:=
&
stubGameSource
{}
source
:=
&
stubGameSource
{}
games
:=
&
createdGames
{
games
:=
&
createdGames
{
...
@@ -87,15 +190,18 @@ func setupMonitorTest(t *testing.T, allowedGames []common.Address) (*gameMonitor
...
@@ -87,15 +190,18 @@ func setupMonitorTest(t *testing.T, allowedGames []common.Address) (*gameMonitor
fetchBlockNum
:=
func
(
ctx
context
.
Context
)
(
uint64
,
error
)
{
fetchBlockNum
:=
func
(
ctx
context
.
Context
)
(
uint64
,
error
)
{
return
1234
,
nil
return
1234
,
nil
}
}
monitor
:=
newGameMonitor
(
logger
,
clock
.
SystemClock
,
fetchBlockNum
,
allowedGames
,
source
,
games
.
CreateGame
)
disk
:=
&
stubDiskManager
{
return
monitor
,
source
,
games
gameDirExists
:
make
(
map
[
common
.
Address
]
bool
),
}
monitor
:=
newGameMonitor
(
logger
,
time
.
Duration
(
0
),
clock
.
SystemClock
,
disk
,
fetchBlockNum
,
allowedGames
,
source
,
games
.
CreateGame
)
return
monitor
,
source
,
games
,
disk
}
}
type
stubGameSource
struct
{
type
stubGameSource
struct
{
games
[]
FaultDisputeGame
games
[]
FaultDisputeGame
}
}
func
(
s
*
stubGameSource
)
FetchAllGamesAtBlock
(
ctx
context
.
Context
,
blockNumber
*
big
.
Int
)
([]
FaultDisputeGame
,
error
)
{
func
(
s
*
stubGameSource
)
FetchAllGamesAtBlock
(
ctx
context
.
Context
,
earliest
uint64
,
blockNumber
*
big
.
Int
)
([]
FaultDisputeGame
,
error
)
{
return
s
.
games
,
nil
return
s
.
games
,
nil
}
}
...
@@ -103,6 +209,7 @@ type stubGame struct {
...
@@ -103,6 +209,7 @@ type stubGame struct {
addr
common
.
Address
addr
common
.
Address
progressCount
int
progressCount
int
done
bool
done
bool
dir
string
}
}
func
(
g
*
stubGame
)
ProgressGame
(
ctx
context
.
Context
)
bool
{
func
(
g
*
stubGame
)
ProgressGame
(
ctx
context
.
Context
)
bool
{
...
@@ -111,15 +218,36 @@ func (g *stubGame) ProgressGame(ctx context.Context) bool {
...
@@ -111,15 +218,36 @@ func (g *stubGame) ProgressGame(ctx context.Context) bool {
}
}
type
createdGames
struct
{
type
createdGames
struct
{
t
*
testing
.
T
t
*
testing
.
T
created
map
[
common
.
Address
]
*
stubGame
createCompleted
common
.
Address
created
map
[
common
.
Address
]
*
stubGame
}
}
func
(
c
*
createdGames
)
CreateGame
(
addr
common
.
Address
)
(
gamePlayer
,
error
)
{
func
(
c
*
createdGames
)
CreateGame
(
addr
common
.
Address
,
dir
string
)
(
gamePlayer
,
error
)
{
if
_
,
exists
:=
c
.
created
[
addr
];
exists
{
if
_
,
exists
:=
c
.
created
[
addr
];
exists
{
c
.
t
.
Fatalf
(
"game %v already exists"
,
addr
)
c
.
t
.
Fatalf
(
"game %v already exists"
,
addr
)
}
}
game
:=
&
stubGame
{
addr
:
addr
}
game
:=
&
stubGame
{
addr
:
addr
,
done
:
addr
==
c
.
createCompleted
,
dir
:
dir
,
}
c
.
created
[
addr
]
=
game
c
.
created
[
addr
]
=
game
return
game
,
nil
return
game
,
nil
}
}
type
stubDiskManager
struct
{
gameDirExists
map
[
common
.
Address
]
bool
}
func
(
s
*
stubDiskManager
)
DirForGame
(
addr
common
.
Address
)
string
{
s
.
gameDirExists
[
addr
]
=
true
return
addr
.
Hex
()
}
func
(
s
*
stubDiskManager
)
RemoveAllExcept
(
addrs
[]
common
.
Address
)
error
{
for
address
:=
range
s
.
gameDirExists
{
s
.
gameDirExists
[
address
]
=
slices
.
Contains
(
addrs
,
address
)
}
return
nil
}
op-challenger/fault/player.go
View file @
a382b9e2
...
@@ -10,8 +10,8 @@ import (
...
@@ -10,8 +10,8 @@ import (
"github.com/ethereum-optimism/optimism/op-challenger/fault/cannon"
"github.com/ethereum-optimism/optimism/op-challenger/fault/cannon"
"github.com/ethereum-optimism/optimism/op-challenger/fault/types"
"github.com/ethereum-optimism/optimism/op-challenger/fault/types"
"github.com/ethereum-optimism/optimism/op-service/txmgr"
"github.com/ethereum-optimism/optimism/op-service/txmgr"
"github.com/ethereum/go-ethereum/accounts/abi/bind"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/ethclient"
"github.com/ethereum/go-ethereum/log"
"github.com/ethereum/go-ethereum/log"
)
)
...
@@ -29,15 +29,18 @@ type GamePlayer struct {
...
@@ -29,15 +29,18 @@ type GamePlayer struct {
agreeWithProposedOutput
bool
agreeWithProposedOutput
bool
caller
GameInfo
caller
GameInfo
logger
log
.
Logger
logger
log
.
Logger
completed
bool
}
}
func
NewGamePlayer
(
func
NewGamePlayer
(
ctx
context
.
Context
,
ctx
context
.
Context
,
logger
log
.
Logger
,
logger
log
.
Logger
,
cfg
*
config
.
Config
,
cfg
*
config
.
Config
,
dir
string
,
addr
common
.
Address
,
addr
common
.
Address
,
txMgr
txmgr
.
TxManager
,
txMgr
txmgr
.
TxManager
,
client
*
ethclient
.
Client
,
client
bind
.
ContractCaller
,
)
(
*
GamePlayer
,
error
)
{
)
(
*
GamePlayer
,
error
)
{
logger
=
logger
.
New
(
"game"
,
addr
)
logger
=
logger
.
New
(
"game"
,
addr
)
contract
,
err
:=
bindings
.
NewFaultDisputeGameCaller
(
addr
,
client
)
contract
,
err
:=
bindings
.
NewFaultDisputeGameCaller
(
addr
,
client
)
...
@@ -56,10 +59,11 @@ func NewGamePlayer(
...
@@ -56,10 +59,11 @@ func NewGamePlayer(
var
updater
types
.
OracleUpdater
var
updater
types
.
OracleUpdater
switch
cfg
.
TraceType
{
switch
cfg
.
TraceType
{
case
config
.
TraceTypeCannon
:
case
config
.
TraceTypeCannon
:
provider
,
err
=
cannon
.
NewTraceProvider
(
ctx
,
logger
,
cfg
,
client
,
addr
)
cannonProvider
,
err
:=
cannon
.
NewTraceProvider
(
ctx
,
logger
,
cfg
,
client
,
dir
,
addr
)
if
err
!=
nil
{
if
err
!=
nil
{
return
nil
,
fmt
.
Errorf
(
"create cannon trace provider: %w"
,
err
)
return
nil
,
fmt
.
Errorf
(
"create cannon trace provider: %w"
,
err
)
}
}
provider
=
cannonProvider
updater
,
err
=
cannon
.
NewOracleUpdater
(
ctx
,
logger
,
txMgr
,
addr
,
client
)
updater
,
err
=
cannon
.
NewOracleUpdater
(
ctx
,
logger
,
txMgr
,
addr
,
client
)
if
err
!=
nil
{
if
err
!=
nil
{
return
nil
,
fmt
.
Errorf
(
"failed to create the cannon updater: %w"
,
err
)
return
nil
,
fmt
.
Errorf
(
"failed to create the cannon updater: %w"
,
err
)
...
@@ -94,6 +98,11 @@ func NewGamePlayer(
...
@@ -94,6 +98,11 @@ func NewGamePlayer(
}
}
func
(
g
*
GamePlayer
)
ProgressGame
(
ctx
context
.
Context
)
bool
{
func
(
g
*
GamePlayer
)
ProgressGame
(
ctx
context
.
Context
)
bool
{
if
g
.
completed
{
// Game is already complete so don't try to perform further actions.
g
.
logger
.
Trace
(
"Skipping completed game"
)
return
true
}
g
.
logger
.
Trace
(
"Checking if actions are required"
)
g
.
logger
.
Trace
(
"Checking if actions are required"
)
if
err
:=
g
.
agent
.
Act
(
ctx
);
err
!=
nil
{
if
err
:=
g
.
agent
.
Act
(
ctx
);
err
!=
nil
{
g
.
logger
.
Error
(
"Error when acting on game"
,
"err"
,
err
)
g
.
logger
.
Error
(
"Error when acting on game"
,
"err"
,
err
)
...
@@ -102,7 +111,8 @@ func (g *GamePlayer) ProgressGame(ctx context.Context) bool {
...
@@ -102,7 +111,8 @@ func (g *GamePlayer) ProgressGame(ctx context.Context) bool {
g
.
logger
.
Warn
(
"Unable to retrieve game status"
,
"err"
,
err
)
g
.
logger
.
Warn
(
"Unable to retrieve game status"
,
"err"
,
err
)
}
else
{
}
else
{
g
.
logGameStatus
(
ctx
,
status
)
g
.
logGameStatus
(
ctx
,
status
)
return
status
!=
types
.
GameStatusInProgress
g
.
completed
=
status
!=
types
.
GameStatusInProgress
return
g
.
completed
}
}
return
false
return
false
}
}
...
...
op-challenger/fault/player_test.go
View file @
a382b9e2
...
@@ -12,14 +12,14 @@ import (
...
@@ -12,14 +12,14 @@ import (
)
)
func
TestProgressGame_LogErrorFromAct
(
t
*
testing
.
T
)
{
func
TestProgressGame_LogErrorFromAct
(
t
*
testing
.
T
)
{
handler
,
game
,
actor
,
_
:=
setupProgressGameTest
(
t
,
true
)
handler
,
game
,
actor
:=
setupProgressGameTest
(
t
,
true
)
actor
.
e
rr
=
errors
.
New
(
"boom"
)
actor
.
actE
rr
=
errors
.
New
(
"boom"
)
done
:=
game
.
ProgressGame
(
context
.
Background
())
done
:=
game
.
ProgressGame
(
context
.
Background
())
require
.
False
(
t
,
done
,
"should not be done"
)
require
.
False
(
t
,
done
,
"should not be done"
)
require
.
Equal
(
t
,
1
,
actor
.
callCount
,
"should perform next actions"
)
require
.
Equal
(
t
,
1
,
actor
.
callCount
,
"should perform next actions"
)
errLog
:=
handler
.
FindLog
(
log
.
LvlError
,
"Error when acting on game"
)
errLog
:=
handler
.
FindLog
(
log
.
LvlError
,
"Error when acting on game"
)
require
.
NotNil
(
t
,
errLog
,
"should log error"
)
require
.
NotNil
(
t
,
errLog
,
"should log error"
)
require
.
Equal
(
t
,
actor
.
e
rr
,
errLog
.
GetContextValue
(
"err"
))
require
.
Equal
(
t
,
actor
.
actE
rr
,
errLog
.
GetContextValue
(
"err"
))
// Should still log game status
// Should still log game status
msg
:=
handler
.
FindLog
(
log
.
LvlInfo
,
"Game info"
)
msg
:=
handler
.
FindLog
(
log
.
LvlInfo
,
"Game info"
)
...
@@ -74,11 +74,11 @@ func TestProgressGame_LogGameStatus(t *testing.T) {
...
@@ -74,11 +74,11 @@ func TestProgressGame_LogGameStatus(t *testing.T) {
for
_
,
test
:=
range
tests
{
for
_
,
test
:=
range
tests
{
test
:=
test
test
:=
test
t
.
Run
(
test
.
name
,
func
(
t
*
testing
.
T
)
{
t
.
Run
(
test
.
name
,
func
(
t
*
testing
.
T
)
{
handler
,
game
,
actor
,
gameInfo
:=
setupProgressGameTest
(
t
,
test
.
agreeWithOutput
)
handler
,
game
,
gameState
:=
setupProgressGameTest
(
t
,
test
.
agreeWithOutput
)
game
Info
.
status
=
test
.
status
game
State
.
status
=
test
.
status
done
:=
game
.
ProgressGame
(
context
.
Background
())
done
:=
game
.
ProgressGame
(
context
.
Background
())
require
.
Equal
(
t
,
1
,
actor
.
callCount
,
"should perform next actions"
)
require
.
Equal
(
t
,
1
,
gameState
.
callCount
,
"should perform next actions"
)
require
.
Equal
(
t
,
test
.
status
!=
types
.
GameStatusInProgress
,
done
,
"should be done when not in progress"
)
require
.
Equal
(
t
,
test
.
status
!=
types
.
GameStatusInProgress
,
done
,
"should be done when not in progress"
)
errLog
:=
handler
.
FindLog
(
test
.
logLevel
,
test
.
logMsg
)
errLog
:=
handler
.
FindLog
(
test
.
logLevel
,
test
.
logMsg
)
require
.
NotNil
(
t
,
errLog
,
"should log game result"
)
require
.
NotNil
(
t
,
errLog
,
"should log game result"
)
...
@@ -87,43 +87,57 @@ func TestProgressGame_LogGameStatus(t *testing.T) {
...
@@ -87,43 +87,57 @@ func TestProgressGame_LogGameStatus(t *testing.T) {
}
}
}
}
func
setupProgressGameTest
(
t
*
testing
.
T
,
agreeWithProposedRoot
bool
)
(
*
testlog
.
CapturingHandler
,
*
GamePlayer
,
*
stubActor
,
*
stubGameInfo
)
{
func
TestDoNotActOnCompleteGame
(
t
*
testing
.
T
)
{
for
_
,
status
:=
range
[]
types
.
GameStatus
{
types
.
GameStatusChallengerWon
,
types
.
GameStatusDefenderWon
}
{
t
.
Run
(
status
.
String
(),
func
(
t
*
testing
.
T
)
{
_
,
game
,
gameState
:=
setupProgressGameTest
(
t
,
true
)
gameState
.
status
=
status
done
:=
game
.
ProgressGame
(
context
.
Background
())
require
.
Equal
(
t
,
1
,
gameState
.
callCount
,
"acts the first time"
)
require
.
True
(
t
,
done
,
"should be done"
)
// Should not act when it knows the game is already complete
done
=
game
.
ProgressGame
(
context
.
Background
())
require
.
Equal
(
t
,
1
,
gameState
.
callCount
,
"does not act after game is complete"
)
require
.
True
(
t
,
done
,
"should still be done"
)
})
}
}
func
setupProgressGameTest
(
t
*
testing
.
T
,
agreeWithProposedRoot
bool
)
(
*
testlog
.
CapturingHandler
,
*
GamePlayer
,
*
stubGameState
)
{
logger
:=
testlog
.
Logger
(
t
,
log
.
LvlDebug
)
logger
:=
testlog
.
Logger
(
t
,
log
.
LvlDebug
)
handler
:=
&
testlog
.
CapturingHandler
{
handler
:=
&
testlog
.
CapturingHandler
{
Delegate
:
logger
.
GetHandler
(),
Delegate
:
logger
.
GetHandler
(),
}
}
logger
.
SetHandler
(
handler
)
logger
.
SetHandler
(
handler
)
actor
:=
&
stubActor
{}
gameState
:=
&
stubGameState
{
claimCount
:
1
}
gameInfo
:=
&
stubGameInfo
{
claimCount
:
1
}
game
:=
&
GamePlayer
{
game
:=
&
GamePlayer
{
agent
:
actor
,
agent
:
gameState
,
agreeWithProposedOutput
:
agreeWithProposedRoot
,
agreeWithProposedOutput
:
agreeWithProposedRoot
,
caller
:
game
Info
,
caller
:
game
State
,
logger
:
logger
,
logger
:
logger
,
}
}
return
handler
,
game
,
actor
,
gameInfo
return
handler
,
game
,
gameState
}
}
type
stubActor
struct
{
type
stubGameState
struct
{
callCount
int
err
error
}
func
(
a
*
stubActor
)
Act
(
ctx
context
.
Context
)
error
{
a
.
callCount
++
return
a
.
err
}
type
stubGameInfo
struct
{
status
types
.
GameStatus
status
types
.
GameStatus
claimCount
uint64
claimCount
uint64
err
error
callCount
int
actErr
error
Err
error
}
func
(
s
*
stubGameState
)
Act
(
ctx
context
.
Context
)
error
{
s
.
callCount
++
return
s
.
actErr
}
}
func
(
s
*
stubGame
Info
)
GetGameStatus
(
ctx
context
.
Context
)
(
types
.
GameStatus
,
error
)
{
func
(
s
*
stubGame
State
)
GetGameStatus
(
ctx
context
.
Context
)
(
types
.
GameStatus
,
error
)
{
return
s
.
status
,
s
.
err
return
s
.
status
,
nil
}
}
func
(
s
*
stubGame
Info
)
GetClaimCount
(
ctx
context
.
Context
)
(
uint64
,
error
)
{
func
(
s
*
stubGame
State
)
GetClaimCount
(
ctx
context
.
Context
)
(
uint64
,
error
)
{
return
s
.
claimCount
,
s
.
err
return
s
.
claimCount
,
nil
}
}
op-challenger/fault/responder.go
View file @
a382b9e2
...
@@ -79,18 +79,25 @@ func (r *faultResponder) BuildTx(ctx context.Context, response types.Claim) ([]b
...
@@ -79,18 +79,25 @@ func (r *faultResponder) BuildTx(ctx context.Context, response types.Claim) ([]b
}
}
}
}
// Ca
n
Resolve determines if the resolve function on the fault dispute game contract
// Ca
ll
Resolve determines if the resolve function on the fault dispute game contract
// would succeed. Returns t
rue if the game can be resolved, otherwise fal
se.
// would succeed. Returns t
he game status if the call would succeed, errors otherwi
se.
func
(
r
*
faultResponder
)
Ca
nResolve
(
ctx
context
.
Context
)
bool
{
func
(
r
*
faultResponder
)
Ca
llResolve
(
ctx
context
.
Context
)
(
types
.
GameStatus
,
error
)
{
txData
,
err
:=
r
.
buildResolveData
()
txData
,
err
:=
r
.
buildResolveData
()
if
err
!=
nil
{
if
err
!=
nil
{
return
false
return
types
.
GameStatusInProgress
,
err
}
}
_
,
err
=
r
.
txMgr
.
Call
(
ctx
,
ethereum
.
CallMsg
{
res
,
err
:
=
r
.
txMgr
.
Call
(
ctx
,
ethereum
.
CallMsg
{
To
:
&
r
.
fdgAddr
,
To
:
&
r
.
fdgAddr
,
Data
:
txData
,
Data
:
txData
,
},
nil
)
},
nil
)
return
err
==
nil
if
err
!=
nil
{
return
types
.
GameStatusInProgress
,
err
}
var
status
uint8
if
err
=
r
.
fdgAbi
.
UnpackIntoInterface
(
&
status
,
"resolve"
,
res
);
err
!=
nil
{
return
types
.
GameStatusInProgress
,
err
}
return
types
.
GameStatusFromUint8
(
status
)
}
}
// Resolve executes a resolve transaction to resolve a fault dispute game.
// Resolve executes a resolve transaction to resolve a fault dispute game.
...
...
op-challenger/fault/responder_test.go
View file @
a382b9e2
...
@@ -22,13 +22,138 @@ import (
...
@@ -22,13 +22,138 @@ import (
var
(
var
(
mockFdgAddress
=
common
.
HexToAddress
(
"0x1234"
)
mockFdgAddress
=
common
.
HexToAddress
(
"0x1234"
)
mockSendError
=
errors
.
New
(
"mock send error"
)
mockSendError
=
errors
.
New
(
"mock send error"
)
mockCallError
=
errors
.
New
(
"mock call error"
)
)
)
// TestCallResolve tests the [Responder.CallResolve].
func
TestCallResolve
(
t
*
testing
.
T
)
{
t
.
Run
(
"SendFails"
,
func
(
t
*
testing
.
T
)
{
responder
,
mockTxMgr
:=
newTestFaultResponder
(
t
)
mockTxMgr
.
callFails
=
true
status
,
err
:=
responder
.
CallResolve
(
context
.
Background
())
require
.
ErrorIs
(
t
,
err
,
mockCallError
)
require
.
Equal
(
t
,
types
.
GameStatusInProgress
,
status
)
require
.
Equal
(
t
,
0
,
mockTxMgr
.
calls
)
})
t
.
Run
(
"UnpackFails"
,
func
(
t
*
testing
.
T
)
{
responder
,
mockTxMgr
:=
newTestFaultResponder
(
t
)
mockTxMgr
.
callBytes
=
[]
byte
{
0x00
,
0x01
}
status
,
err
:=
responder
.
CallResolve
(
context
.
Background
())
require
.
Error
(
t
,
err
)
require
.
Equal
(
t
,
types
.
GameStatusInProgress
,
status
)
require
.
Equal
(
t
,
1
,
mockTxMgr
.
calls
)
})
t
.
Run
(
"Success"
,
func
(
t
*
testing
.
T
)
{
responder
,
mockTxMgr
:=
newTestFaultResponder
(
t
)
status
,
err
:=
responder
.
CallResolve
(
context
.
Background
())
require
.
NoError
(
t
,
err
)
require
.
Equal
(
t
,
types
.
GameStatusInProgress
,
status
)
require
.
Equal
(
t
,
1
,
mockTxMgr
.
calls
)
})
}
// TestResolve tests the [Responder.Resolve] method.
func
TestResolve
(
t
*
testing
.
T
)
{
t
.
Run
(
"SendFails"
,
func
(
t
*
testing
.
T
)
{
responder
,
mockTxMgr
:=
newTestFaultResponder
(
t
)
mockTxMgr
.
sendFails
=
true
err
:=
responder
.
Resolve
(
context
.
Background
())
require
.
ErrorIs
(
t
,
err
,
mockSendError
)
require
.
Equal
(
t
,
0
,
mockTxMgr
.
sends
)
})
t
.
Run
(
"Success"
,
func
(
t
*
testing
.
T
)
{
responder
,
mockTxMgr
:=
newTestFaultResponder
(
t
)
err
:=
responder
.
Resolve
(
context
.
Background
())
require
.
NoError
(
t
,
err
)
require
.
Equal
(
t
,
1
,
mockTxMgr
.
sends
)
})
}
// TestRespond tests the [Responder.Respond] method.
func
TestRespond
(
t
*
testing
.
T
)
{
t
.
Run
(
"send fails"
,
func
(
t
*
testing
.
T
)
{
responder
,
mockTxMgr
:=
newTestFaultResponder
(
t
)
mockTxMgr
.
sendFails
=
true
err
:=
responder
.
Respond
(
context
.
Background
(),
generateMockResponseClaim
())
require
.
ErrorIs
(
t
,
err
,
mockSendError
)
require
.
Equal
(
t
,
0
,
mockTxMgr
.
sends
)
})
t
.
Run
(
"sends response"
,
func
(
t
*
testing
.
T
)
{
responder
,
mockTxMgr
:=
newTestFaultResponder
(
t
)
err
:=
responder
.
Respond
(
context
.
Background
(),
generateMockResponseClaim
())
require
.
NoError
(
t
,
err
)
require
.
Equal
(
t
,
1
,
mockTxMgr
.
sends
)
})
}
// TestBuildTx tests the [Responder.BuildTx] method.
func
TestBuildTx
(
t
*
testing
.
T
)
{
t
.
Run
(
"attack"
,
func
(
t
*
testing
.
T
)
{
responder
,
_
:=
newTestFaultResponder
(
t
)
responseClaim
:=
generateMockResponseClaim
()
responseClaim
.
ParentContractIndex
=
7
tx
,
err
:=
responder
.
BuildTx
(
context
.
Background
(),
responseClaim
)
require
.
NoError
(
t
,
err
)
// Pack the tx data manually.
fdgAbi
,
err
:=
bindings
.
FaultDisputeGameMetaData
.
GetAbi
()
require
.
NoError
(
t
,
err
)
parent
:=
big
.
NewInt
(
int64
(
7
))
claim
:=
responseClaim
.
ValueBytes
()
expected
,
err
:=
fdgAbi
.
Pack
(
"attack"
,
parent
,
claim
)
require
.
NoError
(
t
,
err
)
require
.
Equal
(
t
,
expected
,
tx
)
})
t
.
Run
(
"defend"
,
func
(
t
*
testing
.
T
)
{
responder
,
_
:=
newTestFaultResponder
(
t
)
responseClaim
:=
types
.
Claim
{
ClaimData
:
types
.
ClaimData
{
Value
:
common
.
Hash
{
0x01
},
Position
:
types
.
NewPositionFromGIndex
(
3
),
},
Parent
:
types
.
ClaimData
{
Value
:
common
.
Hash
{
0x02
},
Position
:
types
.
NewPositionFromGIndex
(
6
),
},
ContractIndex
:
0
,
ParentContractIndex
:
7
,
}
tx
,
err
:=
responder
.
BuildTx
(
context
.
Background
(),
responseClaim
)
require
.
NoError
(
t
,
err
)
// Pack the tx data manually.
fdgAbi
,
err
:=
bindings
.
FaultDisputeGameMetaData
.
GetAbi
()
require
.
NoError
(
t
,
err
)
parent
:=
big
.
NewInt
(
int64
(
7
))
claim
:=
responseClaim
.
ValueBytes
()
expected
,
err
:=
fdgAbi
.
Pack
(
"defend"
,
parent
,
claim
)
require
.
NoError
(
t
,
err
)
require
.
Equal
(
t
,
expected
,
tx
)
})
}
func
newTestFaultResponder
(
t
*
testing
.
T
)
(
*
faultResponder
,
*
mockTxManager
)
{
log
:=
testlog
.
Logger
(
t
,
log
.
LvlError
)
mockTxMgr
:=
&
mockTxManager
{}
responder
,
err
:=
NewFaultResponder
(
log
,
mockTxMgr
,
mockFdgAddress
)
require
.
NoError
(
t
,
err
)
return
responder
,
mockTxMgr
}
type
mockTxManager
struct
{
type
mockTxManager
struct
{
from
common
.
Address
from
common
.
Address
sends
int
sends
int
calls
int
calls
int
sendFails
bool
sendFails
bool
callFails
bool
callBytes
[]
byte
}
}
func
(
m
*
mockTxManager
)
Send
(
ctx
context
.
Context
,
candidate
txmgr
.
TxCandidate
)
(
*
ethtypes
.
Receipt
,
error
)
{
func
(
m
*
mockTxManager
)
Send
(
ctx
context
.
Context
,
candidate
txmgr
.
TxCandidate
)
(
*
ethtypes
.
Receipt
,
error
)
{
...
@@ -44,11 +169,16 @@ func (m *mockTxManager) Send(ctx context.Context, candidate txmgr.TxCandidate) (
...
@@ -44,11 +169,16 @@ func (m *mockTxManager) Send(ctx context.Context, candidate txmgr.TxCandidate) (
}
}
func
(
m
*
mockTxManager
)
Call
(
_
context
.
Context
,
_
ethereum
.
CallMsg
,
_
*
big
.
Int
)
([]
byte
,
error
)
{
func
(
m
*
mockTxManager
)
Call
(
_
context
.
Context
,
_
ethereum
.
CallMsg
,
_
*
big
.
Int
)
([]
byte
,
error
)
{
if
m
.
send
Fails
{
if
m
.
call
Fails
{
return
nil
,
mock
Send
Error
return
nil
,
mock
Call
Error
}
}
m
.
calls
++
m
.
calls
++
return
[]
byte
{},
nil
if
m
.
callBytes
!=
nil
{
return
m
.
callBytes
,
nil
}
return
common
.
Hex2Bytes
(
"0000000000000000000000000000000000000000000000000000000000000000"
,
),
nil
}
}
func
(
m
*
mockTxManager
)
BlockNumber
(
ctx
context
.
Context
)
(
uint64
,
error
)
{
func
(
m
*
mockTxManager
)
BlockNumber
(
ctx
context
.
Context
)
(
uint64
,
error
)
{
...
@@ -59,56 +189,8 @@ func (m *mockTxManager) From() common.Address {
...
@@ -59,56 +189,8 @@ func (m *mockTxManager) From() common.Address {
return
m
.
from
return
m
.
from
}
}
func
newTestFaultResponder
(
t
*
testing
.
T
,
sendFails
bool
)
(
*
faultResponder
,
*
mockTxManager
)
{
func
generateMockResponseClaim
()
types
.
Claim
{
log
:=
testlog
.
Logger
(
t
,
log
.
LvlError
)
return
types
.
Claim
{
mockTxMgr
:=
&
mockTxManager
{}
mockTxMgr
.
sendFails
=
sendFails
responder
,
err
:=
NewFaultResponder
(
log
,
mockTxMgr
,
mockFdgAddress
)
require
.
NoError
(
t
,
err
)
return
responder
,
mockTxMgr
}
// TestResponder_CanResolve_CallFails tests the [Responder.CanResolve] method
// bubbles up the error returned by the [txmgr.Call] method.
func
TestResponder_CanResolve_CallFails
(
t
*
testing
.
T
)
{
responder
,
mockTxMgr
:=
newTestFaultResponder
(
t
,
true
)
resolved
:=
responder
.
CanResolve
(
context
.
Background
())
require
.
False
(
t
,
resolved
)
require
.
Equal
(
t
,
0
,
mockTxMgr
.
sends
)
}
// TestResponder_CanResolve_Success tests the [Responder.CanResolve] method
// succeeds when the call message is successfully sent through the txmgr.
func
TestResponder_CanResolve_Success
(
t
*
testing
.
T
)
{
responder
,
mockTxMgr
:=
newTestFaultResponder
(
t
,
false
)
resolved
:=
responder
.
CanResolve
(
context
.
Background
())
require
.
True
(
t
,
resolved
)
require
.
Equal
(
t
,
1
,
mockTxMgr
.
calls
)
}
// TestResponder_Resolve_SendFails tests the [Responder.Resolve] method
// bubbles up the error returned by the [txmgr.Send] method.
func
TestResponder_Resolve_SendFails
(
t
*
testing
.
T
)
{
responder
,
mockTxMgr
:=
newTestFaultResponder
(
t
,
true
)
err
:=
responder
.
Resolve
(
context
.
Background
())
require
.
ErrorIs
(
t
,
err
,
mockSendError
)
require
.
Equal
(
t
,
0
,
mockTxMgr
.
sends
)
}
// TestResponder_Resolve_Success tests the [Responder.Resolve] method
// succeeds when the tx candidate is successfully sent through the txmgr.
func
TestResponder_Resolve_Success
(
t
*
testing
.
T
)
{
responder
,
mockTxMgr
:=
newTestFaultResponder
(
t
,
false
)
err
:=
responder
.
Resolve
(
context
.
Background
())
require
.
NoError
(
t
,
err
)
require
.
Equal
(
t
,
1
,
mockTxMgr
.
sends
)
}
// TestResponder_Respond_SendFails tests the [Responder.Respond] method
// bubbles up the error returned by the [txmgr.Send] method.
func
TestResponder_Respond_SendFails
(
t
*
testing
.
T
)
{
responder
,
mockTxMgr
:=
newTestFaultResponder
(
t
,
true
)
err
:=
responder
.
Respond
(
context
.
Background
(),
types
.
Claim
{
ClaimData
:
types
.
ClaimData
{
ClaimData
:
types
.
ClaimData
{
Value
:
common
.
Hash
{
0x01
},
Value
:
common
.
Hash
{
0x01
},
Position
:
types
.
NewPositionFromGIndex
(
2
),
Position
:
types
.
NewPositionFromGIndex
(
2
),
...
@@ -119,89 +201,5 @@ func TestResponder_Respond_SendFails(t *testing.T) {
...
@@ -119,89 +201,5 @@ func TestResponder_Respond_SendFails(t *testing.T) {
},
},
ContractIndex
:
0
,
ContractIndex
:
0
,
ParentContractIndex
:
0
,
ParentContractIndex
:
0
,
})
require
.
ErrorIs
(
t
,
err
,
mockSendError
)
require
.
Equal
(
t
,
0
,
mockTxMgr
.
sends
)
}
// TestResponder_Respond_Success tests the [Responder.Respond] method
// succeeds when the tx candidate is successfully sent through the txmgr.
func
TestResponder_Respond_Success
(
t
*
testing
.
T
)
{
responder
,
mockTxMgr
:=
newTestFaultResponder
(
t
,
false
)
err
:=
responder
.
Respond
(
context
.
Background
(),
types
.
Claim
{
ClaimData
:
types
.
ClaimData
{
Value
:
common
.
Hash
{
0x01
},
Position
:
types
.
NewPositionFromGIndex
(
2
),
},
Parent
:
types
.
ClaimData
{
Value
:
common
.
Hash
{
0x02
},
Position
:
types
.
NewPositionFromGIndex
(
1
),
},
ContractIndex
:
0
,
ParentContractIndex
:
0
,
})
require
.
NoError
(
t
,
err
)
require
.
Equal
(
t
,
1
,
mockTxMgr
.
sends
)
}
// TestResponder_BuildTx_Attack tests the [Responder.BuildTx] method
// returns a tx candidate with the correct data for an attack tx.
func
TestResponder_BuildTx_Attack
(
t
*
testing
.
T
)
{
responder
,
_
:=
newTestFaultResponder
(
t
,
false
)
responseClaim
:=
types
.
Claim
{
ClaimData
:
types
.
ClaimData
{
Value
:
common
.
Hash
{
0x01
},
Position
:
types
.
NewPositionFromGIndex
(
2
),
},
Parent
:
types
.
ClaimData
{
Value
:
common
.
Hash
{
0x02
},
Position
:
types
.
NewPositionFromGIndex
(
1
),
},
ContractIndex
:
0
,
ParentContractIndex
:
7
,
}
}
tx
,
err
:=
responder
.
BuildTx
(
context
.
Background
(),
responseClaim
)
require
.
NoError
(
t
,
err
)
// Pack the tx data manually.
fdgAbi
,
err
:=
bindings
.
FaultDisputeGameMetaData
.
GetAbi
()
require
.
NoError
(
t
,
err
)
expected
,
err
:=
fdgAbi
.
Pack
(
"attack"
,
big
.
NewInt
(
int64
(
7
)),
responseClaim
.
ValueBytes
(),
)
require
.
NoError
(
t
,
err
)
require
.
Equal
(
t
,
expected
,
tx
)
}
// TestResponder_BuildTx_Defend tests the [Responder.BuildTx] method
// returns a tx candidate with the correct data for a defend tx.
func
TestResponder_BuildTx_Defend
(
t
*
testing
.
T
)
{
responder
,
_
:=
newTestFaultResponder
(
t
,
false
)
responseClaim
:=
types
.
Claim
{
ClaimData
:
types
.
ClaimData
{
Value
:
common
.
Hash
{
0x01
},
Position
:
types
.
NewPositionFromGIndex
(
3
),
},
Parent
:
types
.
ClaimData
{
Value
:
common
.
Hash
{
0x02
},
Position
:
types
.
NewPositionFromGIndex
(
6
),
},
ContractIndex
:
0
,
ParentContractIndex
:
7
,
}
tx
,
err
:=
responder
.
BuildTx
(
context
.
Background
(),
responseClaim
)
require
.
NoError
(
t
,
err
)
// Pack the tx data manually.
fdgAbi
,
err
:=
bindings
.
FaultDisputeGameMetaData
.
GetAbi
()
require
.
NoError
(
t
,
err
)
expected
,
err
:=
fdgAbi
.
Pack
(
"defend"
,
big
.
NewInt
(
int64
(
7
)),
responseClaim
.
ValueBytes
(),
)
require
.
NoError
(
t
,
err
)
require
.
Equal
(
t
,
expected
,
tx
)
}
}
op-challenger/fault/service.go
View file @
a382b9e2
...
@@ -73,9 +73,18 @@ func NewService(ctx context.Context, logger log.Logger, cfg *config.Config) (*se
...
@@ -73,9 +73,18 @@ func NewService(ctx context.Context, logger log.Logger, cfg *config.Config) (*se
}
}
loader
:=
NewGameLoader
(
factory
)
loader
:=
NewGameLoader
(
factory
)
monitor
:=
newGameMonitor
(
logger
,
cl
,
client
.
BlockNumber
,
cfg
.
GameAllowlist
,
loader
,
func
(
addr
common
.
Address
)
(
gamePlayer
,
error
)
{
disk
:=
newDiskManager
(
cfg
.
Datadir
)
return
NewGamePlayer
(
ctx
,
logger
,
cfg
,
addr
,
txMgr
,
client
)
monitor
:=
newGameMonitor
(
})
logger
,
cfg
.
GameWindow
,
cl
,
disk
,
client
.
BlockNumber
,
cfg
.
GameAllowlist
,
loader
,
func
(
addr
common
.
Address
,
dir
string
)
(
gamePlayer
,
error
)
{
return
NewGamePlayer
(
ctx
,
logger
,
cfg
,
dir
,
addr
,
txMgr
,
client
)
})
m
.
RecordInfo
(
version
.
SimpleWithMeta
)
m
.
RecordInfo
(
version
.
SimpleWithMeta
)
m
.
RecordUp
()
m
.
RecordUp
()
...
...
op-challenger/fault/types/types.go
View file @
a382b9e2
...
@@ -3,6 +3,7 @@ package types
...
@@ -3,6 +3,7 @@ package types
import
(
import
(
"context"
"context"
"errors"
"errors"
"fmt"
"math/big"
"math/big"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/common"
...
@@ -34,6 +35,14 @@ func (s GameStatus) String() string {
...
@@ -34,6 +35,14 @@ func (s GameStatus) String() string {
}
}
}
}
// GameStatusFromUint8 returns a game status from the uint8 representation.
func
GameStatusFromUint8
(
i
uint8
)
(
GameStatus
,
error
)
{
if
i
>
2
{
return
GameStatus
(
i
),
fmt
.
Errorf
(
"invalid game status: %d"
,
i
)
}
return
GameStatus
(
i
),
nil
}
// PreimageOracleData encapsulates the preimage oracle data
// PreimageOracleData encapsulates the preimage oracle data
// to load into the onchain oracle.
// to load into the onchain oracle.
type
PreimageOracleData
struct
{
type
PreimageOracleData
struct
{
...
...
op-challenger/fault/types/types_test.go
View file @
a382b9e2
package
types
package
types
import
(
import
(
"fmt"
"testing"
"testing"
"github.com/stretchr/testify/require"
"github.com/stretchr/testify/require"
)
)
var
validGameStatuses
=
[]
GameStatus
{
GameStatusInProgress
,
GameStatusChallengerWon
,
GameStatusDefenderWon
,
}
func
TestGameStatusFromUint8
(
t
*
testing
.
T
)
{
for
_
,
status
:=
range
validGameStatuses
{
t
.
Run
(
fmt
.
Sprintf
(
"Valid Game Status %v"
,
status
),
func
(
t
*
testing
.
T
)
{
parsed
,
err
:=
GameStatusFromUint8
(
uint8
(
status
))
require
.
NoError
(
t
,
err
)
require
.
Equal
(
t
,
status
,
parsed
)
})
}
t
.
Run
(
"Invalid"
,
func
(
t
*
testing
.
T
)
{
status
,
err
:=
GameStatusFromUint8
(
3
)
require
.
Error
(
t
,
err
)
require
.
Equal
(
t
,
GameStatus
(
3
),
status
)
})
}
func
TestNewPreimageOracleData
(
t
*
testing
.
T
)
{
func
TestNewPreimageOracleData
(
t
*
testing
.
T
)
{
t
.
Run
(
"LocalData"
,
func
(
t
*
testing
.
T
)
{
t
.
Run
(
"LocalData"
,
func
(
t
*
testing
.
T
)
{
data
:=
NewPreimageOracleData
([]
byte
{
1
,
2
,
3
},
[]
byte
{
4
,
5
,
6
},
7
)
data
:=
NewPreimageOracleData
([]
byte
{
1
,
2
,
3
},
[]
byte
{
4
,
5
,
6
},
7
)
...
...
op-challenger/flags/flags.go
View file @
a382b9e2
...
@@ -57,6 +57,11 @@ var (
...
@@ -57,6 +57,11 @@ var (
Usage
:
"Temporary hardcoded flag if we agree or disagree with the proposed output."
,
Usage
:
"Temporary hardcoded flag if we agree or disagree with the proposed output."
,
EnvVars
:
prefixEnvVars
(
"AGREE_WITH_PROPOSED_OUTPUT"
),
EnvVars
:
prefixEnvVars
(
"AGREE_WITH_PROPOSED_OUTPUT"
),
}
}
DatadirFlag
=
&
cli
.
StringFlag
{
Name
:
"datadir"
,
Usage
:
"Directory to store data generated as part of responding to games"
,
EnvVars
:
prefixEnvVars
(
"DATADIR"
),
}
// Optional Flags
// Optional Flags
AlphabetFlag
=
&
cli
.
StringFlag
{
AlphabetFlag
=
&
cli
.
StringFlag
{
Name
:
"alphabet"
,
Name
:
"alphabet"
,
...
@@ -93,11 +98,6 @@ var (
...
@@ -93,11 +98,6 @@ var (
Usage
:
"Path to absolute prestate to use when generating trace data (cannon trace type only)"
,
Usage
:
"Path to absolute prestate to use when generating trace data (cannon trace type only)"
,
EnvVars
:
prefixEnvVars
(
"CANNON_PRESTATE"
),
EnvVars
:
prefixEnvVars
(
"CANNON_PRESTATE"
),
}
}
CannonDatadirFlag
=
&
cli
.
StringFlag
{
Name
:
"cannon-datadir"
,
Usage
:
"Directory to store data generated by cannon (cannon trace type only)"
,
EnvVars
:
prefixEnvVars
(
"CANNON_DATADIR"
),
}
CannonL2Flag
=
&
cli
.
StringFlag
{
CannonL2Flag
=
&
cli
.
StringFlag
{
Name
:
"cannon-l2"
,
Name
:
"cannon-l2"
,
Usage
:
"L2 Address of L2 JSON-RPC endpoint to use (eth and debug namespace required) (cannon trace type only)"
,
Usage
:
"L2 Address of L2 JSON-RPC endpoint to use (eth and debug namespace required) (cannon trace type only)"
,
...
@@ -109,6 +109,12 @@ var (
...
@@ -109,6 +109,12 @@ var (
EnvVars
:
prefixEnvVars
(
"CANNON_SNAPSHOT_FREQ"
),
EnvVars
:
prefixEnvVars
(
"CANNON_SNAPSHOT_FREQ"
),
Value
:
config
.
DefaultCannonSnapshotFreq
,
Value
:
config
.
DefaultCannonSnapshotFreq
,
}
}
GameWindowFlag
=
&
cli
.
DurationFlag
{
Name
:
"game-window"
,
Usage
:
"The time window which the challenger will look for games to progress."
,
EnvVars
:
prefixEnvVars
(
"GAME_WINDOW"
),
Value
:
config
.
DefaultGameWindow
,
}
)
)
// requiredFlags are checked by [CheckRequired]
// requiredFlags are checked by [CheckRequired]
...
@@ -117,6 +123,7 @@ var requiredFlags = []cli.Flag{
...
@@ -117,6 +123,7 @@ var requiredFlags = []cli.Flag{
FactoryAddressFlag
,
FactoryAddressFlag
,
TraceTypeFlag
,
TraceTypeFlag
,
AgreeWithProposedOutputFlag
,
AgreeWithProposedOutputFlag
,
DatadirFlag
,
}
}
// optionalFlags is a list of unchecked cli flags
// optionalFlags is a list of unchecked cli flags
...
@@ -129,9 +136,9 @@ var optionalFlags = []cli.Flag{
...
@@ -129,9 +136,9 @@ var optionalFlags = []cli.Flag{
CannonBinFlag
,
CannonBinFlag
,
CannonServerFlag
,
CannonServerFlag
,
CannonPreStateFlag
,
CannonPreStateFlag
,
CannonDatadirFlag
,
CannonL2Flag
,
CannonL2Flag
,
CannonSnapshotFreqFlag
,
CannonSnapshotFreqFlag
,
GameWindowFlag
,
}
}
func
init
()
{
func
init
()
{
...
@@ -174,9 +181,6 @@ func CheckRequired(ctx *cli.Context) error {
...
@@ -174,9 +181,6 @@ func CheckRequired(ctx *cli.Context) error {
if
!
ctx
.
IsSet
(
CannonPreStateFlag
.
Name
)
{
if
!
ctx
.
IsSet
(
CannonPreStateFlag
.
Name
)
{
return
fmt
.
Errorf
(
"flag %s is required"
,
CannonPreStateFlag
.
Name
)
return
fmt
.
Errorf
(
"flag %s is required"
,
CannonPreStateFlag
.
Name
)
}
}
if
!
ctx
.
IsSet
(
CannonDatadirFlag
.
Name
)
{
return
fmt
.
Errorf
(
"flag %s is required"
,
CannonDatadirFlag
.
Name
)
}
if
!
ctx
.
IsSet
(
CannonL2Flag
.
Name
)
{
if
!
ctx
.
IsSet
(
CannonL2Flag
.
Name
)
{
return
fmt
.
Errorf
(
"flag %s is required"
,
CannonL2Flag
.
Name
)
return
fmt
.
Errorf
(
"flag %s is required"
,
CannonL2Flag
.
Name
)
}
}
...
@@ -222,6 +226,7 @@ func NewConfigFromCLI(ctx *cli.Context) (*config.Config, error) {
...
@@ -222,6 +226,7 @@ func NewConfigFromCLI(ctx *cli.Context) (*config.Config, error) {
TraceType
:
traceTypeFlag
,
TraceType
:
traceTypeFlag
,
GameFactoryAddress
:
gameFactoryAddress
,
GameFactoryAddress
:
gameFactoryAddress
,
GameAllowlist
:
allowedGames
,
GameAllowlist
:
allowedGames
,
GameWindow
:
ctx
.
Duration
(
GameWindowFlag
.
Name
),
AlphabetTrace
:
ctx
.
String
(
AlphabetFlag
.
Name
),
AlphabetTrace
:
ctx
.
String
(
AlphabetFlag
.
Name
),
CannonNetwork
:
ctx
.
String
(
CannonNetworkFlag
.
Name
),
CannonNetwork
:
ctx
.
String
(
CannonNetworkFlag
.
Name
),
CannonRollupConfigPath
:
ctx
.
String
(
CannonRollupConfigFlag
.
Name
),
CannonRollupConfigPath
:
ctx
.
String
(
CannonRollupConfigFlag
.
Name
),
...
@@ -229,7 +234,7 @@ func NewConfigFromCLI(ctx *cli.Context) (*config.Config, error) {
...
@@ -229,7 +234,7 @@ func NewConfigFromCLI(ctx *cli.Context) (*config.Config, error) {
CannonBin
:
ctx
.
String
(
CannonBinFlag
.
Name
),
CannonBin
:
ctx
.
String
(
CannonBinFlag
.
Name
),
CannonServer
:
ctx
.
String
(
CannonServerFlag
.
Name
),
CannonServer
:
ctx
.
String
(
CannonServerFlag
.
Name
),
CannonAbsolutePreState
:
ctx
.
String
(
CannonPreStateFlag
.
Name
),
CannonAbsolutePreState
:
ctx
.
String
(
CannonPreStateFlag
.
Name
),
CannonDatadir
:
ctx
.
String
(
Cannon
DatadirFlag
.
Name
),
Datadir
:
ctx
.
String
(
DatadirFlag
.
Name
),
CannonL2
:
ctx
.
String
(
CannonL2Flag
.
Name
),
CannonL2
:
ctx
.
String
(
CannonL2Flag
.
Name
),
CannonSnapshotFreq
:
ctx
.
Uint
(
CannonSnapshotFreqFlag
.
Name
),
CannonSnapshotFreq
:
ctx
.
Uint
(
CannonSnapshotFreqFlag
.
Name
),
AgreeWithProposedOutput
:
ctx
.
Bool
(
AgreeWithProposedOutputFlag
.
Name
),
AgreeWithProposedOutput
:
ctx
.
Bool
(
AgreeWithProposedOutputFlag
.
Name
),
...
...
op-challenger/scripts/alphabet/charlie.sh
View file @
a382b9e2
...
@@ -19,12 +19,19 @@ DISPUTE_GAME_PROXY=$(jq -r .DisputeGameFactoryProxy $MONOREPO_DIR/.devnet/addres
...
@@ -19,12 +19,19 @@ DISPUTE_GAME_PROXY=$(jq -r .DisputeGameFactoryProxy $MONOREPO_DIR/.devnet/addres
FAULT_GAME_ADDRESS
=
$(
cat
$FAULT_GAME_ADDR_FILE
)
FAULT_GAME_ADDRESS
=
$(
cat
$FAULT_GAME_ADDR_FILE
)
echo
"Fault dispute game address:
$FAULT_GAME_ADDRESS
"
echo
"Fault dispute game address:
$FAULT_GAME_ADDRESS
"
DATADIR
=
`
mktemp
-d
`
trap
cleanup SIGINT
cleanup
(){
rm
-rf
"
${
DATADIR
}
"
}
$CHALLENGER_DIR
/bin/op-challenger
\
$CHALLENGER_DIR
/bin/op-challenger
\
--l1-eth-rpc
http://localhost:8545
\
--l1-eth-rpc
http://localhost:8545
\
--trace-type
=
"alphabet"
\
--trace-type
=
"alphabet"
\
--alphabet
"abcdefgh"
\
--alphabet
"abcdefgh"
\
--datadir
"
${
DATADIR
}
"
\
--game-factory-address
$DISPUTE_GAME_PROXY
\
--game-factory-address
$DISPUTE_GAME_PROXY
\
--game-a
ddress
$FAULT_GAME_ADDRESS
\
--game-a
llowlist
$FAULT_GAME_ADDRESS
\
--private-key
$CHARLIE_KEY
\
--private-key
$CHARLIE_KEY
\
--num-confirmations
1
\
--num-confirmations
1
\
--metrics
.enabled
--metrics
.port
=
7304
\
--metrics
.enabled
--metrics
.port
=
7304
\
...
...
op-challenger/scripts/alphabet/mallory.sh
View file @
a382b9e2
...
@@ -19,12 +19,19 @@ DISPUTE_GAME_PROXY=$(jq -r .DisputeGameFactoryProxy $MONOREPO_DIR/.devnet/addres
...
@@ -19,12 +19,19 @@ DISPUTE_GAME_PROXY=$(jq -r .DisputeGameFactoryProxy $MONOREPO_DIR/.devnet/addres
FAULT_GAME_ADDRESS
=
$(
cat
$FAULT_GAME_ADDR_FILE
)
FAULT_GAME_ADDRESS
=
$(
cat
$FAULT_GAME_ADDR_FILE
)
echo
"Fault dispute game address:
$FAULT_GAME_ADDRESS
"
echo
"Fault dispute game address:
$FAULT_GAME_ADDRESS
"
DATADIR
=
`
mktemp
-d
`
trap
cleanup SIGINT
cleanup
(){
rm
-rf
"
${
DATADIR
}
"
}
$CHALLENGER_DIR
/bin/op-challenger
\
$CHALLENGER_DIR
/bin/op-challenger
\
--l1-eth-rpc
http://localhost:8545
\
--l1-eth-rpc
http://localhost:8545
\
--trace-type
=
"alphabet"
\
--trace-type
=
"alphabet"
\
--alphabet
"abcdexyz"
\
--alphabet
"abcdexyz"
\
--datadir
"
${
DATADIR
}
"
\
--game-factory-address
$DISPUTE_GAME_PROXY
\
--game-factory-address
$DISPUTE_GAME_PROXY
\
--game-a
ddress
$FAULT_GAME_ADDRESS
\
--game-a
llowlist
$FAULT_GAME_ADDRESS
\
--private-key
$MALLORY_KEY
\
--private-key
$MALLORY_KEY
\
--num-confirmations
1
\
--num-confirmations
1
\
--metrics
.enabled
--metrics
.port
=
7305
\
--metrics
.enabled
--metrics
.port
=
7305
\
...
...
op-e2e/e2eutils/challenger/helper.go
View file @
a382b9e2
...
@@ -23,9 +23,11 @@ import (
...
@@ -23,9 +23,11 @@ import (
)
)
type
Helper
struct
{
type
Helper
struct
{
log
log
.
Logger
log
log
.
Logger
cancel
func
()
require
*
require
.
Assertions
errors
chan
error
dir
string
cancel
func
()
errors
chan
error
}
}
type
Option
func
(
config2
*
config
.
Config
)
type
Option
func
(
config2
*
config
.
Config
)
...
@@ -74,7 +76,6 @@ func WithCannon(
...
@@ -74,7 +76,6 @@ func WithCannon(
require
:=
require
.
New
(
t
)
require
:=
require
.
New
(
t
)
c
.
TraceType
=
config
.
TraceTypeCannon
c
.
TraceType
=
config
.
TraceTypeCannon
c
.
CannonL2
=
l2Endpoint
c
.
CannonL2
=
l2Endpoint
c
.
CannonDatadir
=
t
.
TempDir
()
c
.
CannonBin
=
"../cannon/bin/cannon"
c
.
CannonBin
=
"../cannon/bin/cannon"
c
.
CannonServer
=
"../op-program/bin/op-program"
c
.
CannonServer
=
"../op-program/bin/op-program"
c
.
CannonAbsolutePreState
=
"../op-program/bin/prestate.json"
c
.
CannonAbsolutePreState
=
"../op-program/bin/prestate.json"
...
@@ -82,13 +83,13 @@ func WithCannon(
...
@@ -82,13 +83,13 @@ func WithCannon(
genesisBytes
,
err
:=
json
.
Marshal
(
l2Genesis
)
genesisBytes
,
err
:=
json
.
Marshal
(
l2Genesis
)
require
.
NoError
(
err
,
"marshall l2 genesis config"
)
require
.
NoError
(
err
,
"marshall l2 genesis config"
)
genesisFile
:=
filepath
.
Join
(
c
.
Cannon
Datadir
,
"l2-genesis.json"
)
genesisFile
:=
filepath
.
Join
(
c
.
Datadir
,
"l2-genesis.json"
)
require
.
NoError
(
os
.
WriteFile
(
genesisFile
,
genesisBytes
,
0644
))
require
.
NoError
(
os
.
WriteFile
(
genesisFile
,
genesisBytes
,
0644
))
c
.
CannonL2GenesisPath
=
genesisFile
c
.
CannonL2GenesisPath
=
genesisFile
rollupBytes
,
err
:=
json
.
Marshal
(
rollupCfg
)
rollupBytes
,
err
:=
json
.
Marshal
(
rollupCfg
)
require
.
NoError
(
err
,
"marshall rollup config"
)
require
.
NoError
(
err
,
"marshall rollup config"
)
rollupFile
:=
filepath
.
Join
(
c
.
Cannon
Datadir
,
"rollup.json"
)
rollupFile
:=
filepath
.
Join
(
c
.
Datadir
,
"rollup.json"
)
require
.
NoError
(
os
.
WriteFile
(
rollupFile
,
rollupBytes
,
0644
))
require
.
NoError
(
os
.
WriteFile
(
rollupFile
,
rollupBytes
,
0644
))
c
.
CannonRollupConfigPath
=
rollupFile
c
.
CannonRollupConfigPath
=
rollupFile
}
}
...
@@ -106,9 +107,11 @@ func NewChallenger(t *testing.T, ctx context.Context, l1Endpoint string, name st
...
@@ -106,9 +107,11 @@ func NewChallenger(t *testing.T, ctx context.Context, l1Endpoint string, name st
errCh
<-
op_challenger
.
Main
(
ctx
,
log
,
cfg
)
errCh
<-
op_challenger
.
Main
(
ctx
,
log
,
cfg
)
}()
}()
return
&
Helper
{
return
&
Helper
{
log
:
log
,
log
:
log
,
cancel
:
cancel
,
require
:
require
.
New
(
t
),
errors
:
errCh
,
dir
:
cfg
.
Datadir
,
cancel
:
cancel
,
errors
:
errCh
,
}
}
}
}
...
@@ -121,6 +124,7 @@ func NewChallengerConfig(t *testing.T, l1Endpoint string, options ...Option) *co
...
@@ -121,6 +124,7 @@ func NewChallengerConfig(t *testing.T, l1Endpoint string, options ...Option) *co
AlphabetTrace
:
""
,
AlphabetTrace
:
""
,
AgreeWithProposedOutput
:
true
,
AgreeWithProposedOutput
:
true
,
TxMgrConfig
:
txmgrCfg
,
TxMgrConfig
:
txmgrCfg
,
Datadir
:
t
.
TempDir
(),
}
}
for
_
,
option
:=
range
options
{
for
_
,
option
:=
range
options
{
option
(
cfg
)
option
(
cfg
)
...
@@ -155,3 +159,25 @@ func (h *Helper) Close() error {
...
@@ -155,3 +159,25 @@ func (h *Helper) Close() error {
return
nil
return
nil
}
}
}
}
type
GameAddr
interface
{
Addr
()
common
.
Address
}
func
(
h
*
Helper
)
VerifyGameDataExists
(
games
...
GameAddr
)
{
for
_
,
game
:=
range
games
{
addr
:=
game
.
Addr
()
h
.
require
.
DirExistsf
(
h
.
gameDataDir
(
addr
),
"should have data for game %v"
,
addr
)
}
}
func
(
h
*
Helper
)
VerifyNoGameDataExists
(
games
...
GameAddr
)
{
for
_
,
game
:=
range
games
{
addr
:=
game
.
Addr
()
h
.
require
.
NoDirExistsf
(
h
.
gameDataDir
(
addr
),
"should have data for game %v"
,
addr
)
}
}
func
(
h
*
Helper
)
gameDataDir
(
addr
common
.
Address
)
string
{
return
filepath
.
Join
(
h
.
dir
,
addr
.
Hex
())
}
op-e2e/e2eutils/disputegame/cannon_helper.go
View file @
a382b9e2
...
@@ -2,6 +2,7 @@ package disputegame
...
@@ -2,6 +2,7 @@ package disputegame
import
(
import
(
"context"
"context"
"path/filepath"
"github.com/ethereum-optimism/optimism/op-challenger/fault/cannon"
"github.com/ethereum-optimism/optimism/op-challenger/fault/cannon"
"github.com/ethereum-optimism/optimism/op-e2e/e2eutils/challenger"
"github.com/ethereum-optimism/optimism/op-e2e/e2eutils/challenger"
...
@@ -38,7 +39,8 @@ func (g *CannonGameHelper) CreateHonestActor(ctx context.Context, rollupCfg *rol
...
@@ -38,7 +39,8 @@ func (g *CannonGameHelper) CreateHonestActor(ctx context.Context, rollupCfg *rol
}
}
opts
=
append
(
opts
,
options
...
)
opts
=
append
(
opts
,
options
...
)
cfg
:=
challenger
.
NewChallengerConfig
(
g
.
t
,
l1Endpoint
,
opts
...
)
cfg
:=
challenger
.
NewChallengerConfig
(
g
.
t
,
l1Endpoint
,
opts
...
)
provider
,
err
:=
cannon
.
NewTraceProvider
(
ctx
,
testlog
.
Logger
(
g
.
t
,
log
.
LvlInfo
)
.
New
(
"role"
,
"CorrectTrace"
),
cfg
,
l1Client
,
g
.
addr
)
logger
:=
testlog
.
Logger
(
g
.
t
,
log
.
LvlInfo
)
.
New
(
"role"
,
"CorrectTrace"
)
provider
,
err
:=
cannon
.
NewTraceProvider
(
ctx
,
logger
,
cfg
,
l1Client
,
filepath
.
Join
(
cfg
.
Datadir
,
"honest"
),
g
.
addr
)
g
.
require
.
NoError
(
err
,
"create cannon trace provider"
)
g
.
require
.
NoError
(
err
,
"create cannon trace provider"
)
return
&
HonestHelper
{
return
&
HonestHelper
{
...
...
op-e2e/e2eutils/disputegame/game_helper.go
View file @
a382b9e2
...
@@ -26,6 +26,10 @@ type FaultGameHelper struct {
...
@@ -26,6 +26,10 @@ type FaultGameHelper struct {
addr
common
.
Address
addr
common
.
Address
}
}
func
(
g
*
FaultGameHelper
)
Addr
()
common
.
Address
{
return
g
.
addr
}
func
(
g
*
FaultGameHelper
)
GameDuration
(
ctx
context
.
Context
)
time
.
Duration
{
func
(
g
*
FaultGameHelper
)
GameDuration
(
ctx
context
.
Context
)
time
.
Duration
{
duration
,
err
:=
g
.
game
.
GAMEDURATION
(
&
bind
.
CallOpts
{
Context
:
ctx
})
duration
,
err
:=
g
.
game
.
GAMEDURATION
(
&
bind
.
CallOpts
{
Context
:
ctx
})
g
.
require
.
NoError
(
err
,
"failed to get game duration"
)
g
.
require
.
NoError
(
err
,
"failed to get game duration"
)
...
...
op-e2e/e2eutils/disputegame/helper.go
View file @
a382b9e2
...
@@ -175,7 +175,7 @@ func (h *FactoryHelper) StartCannonGameWithCorrectRoot(ctx context.Context, roll
...
@@ -175,7 +175,7 @@ func (h *FactoryHelper) StartCannonGameWithCorrectRoot(ctx context.Context, roll
L2Claim
:
challengedOutput
.
OutputRoot
,
L2Claim
:
challengedOutput
.
OutputRoot
,
L2BlockNumber
:
challengedOutput
.
L2BlockNumber
,
L2BlockNumber
:
challengedOutput
.
L2BlockNumber
,
}
}
provider
:=
cannon
.
NewTraceProviderFromInputs
(
testlog
.
Logger
(
h
.
t
,
log
.
LvlInfo
)
.
New
(
"role"
,
"CorrectTrace"
),
cfg
,
"correct"
,
inputs
)
provider
:=
cannon
.
NewTraceProviderFromInputs
(
testlog
.
Logger
(
h
.
t
,
log
.
LvlInfo
)
.
New
(
"role"
,
"CorrectTrace"
),
cfg
,
inputs
,
cfg
.
Datadir
)
rootClaim
,
err
:=
provider
.
Get
(
ctx
,
math
.
MaxUint64
)
rootClaim
,
err
:=
provider
.
Get
(
ctx
,
math
.
MaxUint64
)
h
.
require
.
NoError
(
err
,
"Compute correct root hash"
)
h
.
require
.
NoError
(
err
,
"Compute correct root hash"
)
...
...
op-e2e/faultproof_test.go
View file @
a382b9e2
...
@@ -58,7 +58,7 @@ func TestMultipleCannonGames(t *testing.T) {
...
@@ -58,7 +58,7 @@ func TestMultipleCannonGames(t *testing.T) {
gameFactory
:=
disputegame
.
NewFactoryHelper
(
t
,
ctx
,
sys
.
cfg
.
L1Deployments
,
l1Client
)
gameFactory
:=
disputegame
.
NewFactoryHelper
(
t
,
ctx
,
sys
.
cfg
.
L1Deployments
,
l1Client
)
// Start a challenger with the correct alphabet trace
// Start a challenger with the correct alphabet trace
gameFactory
.
StartChallenger
(
ctx
,
sys
.
NodeEndpoint
(
"l1"
),
"TowerDefense"
,
challenger
:=
gameFactory
.
StartChallenger
(
ctx
,
sys
.
NodeEndpoint
(
"l1"
),
"TowerDefense"
,
challenger
.
WithCannon
(
t
,
sys
.
RollupConfig
,
sys
.
L2GenesisCfg
,
sys
.
NodeEndpoint
(
"sequencer"
)),
challenger
.
WithCannon
(
t
,
sys
.
RollupConfig
,
sys
.
L2GenesisCfg
,
sys
.
NodeEndpoint
(
"sequencer"
)),
challenger
.
WithPrivKey
(
sys
.
cfg
.
Secrets
.
Alice
),
challenger
.
WithPrivKey
(
sys
.
cfg
.
Secrets
.
Alice
),
challenger
.
WithAgreeProposedOutput
(
true
),
challenger
.
WithAgreeProposedOutput
(
true
),
...
@@ -74,6 +74,9 @@ func TestMultipleCannonGames(t *testing.T) {
...
@@ -74,6 +74,9 @@ func TestMultipleCannonGames(t *testing.T) {
game2Claim
:=
game2
.
GetClaimValue
(
ctx
,
1
)
game2Claim
:=
game2
.
GetClaimValue
(
ctx
,
1
)
require
.
NotEqual
(
t
,
game1Claim
,
game2Claim
,
"games should have different cannon traces"
)
require
.
NotEqual
(
t
,
game1Claim
,
game2Claim
,
"games should have different cannon traces"
)
// Check that the helper finds the game directories correctly
challenger
.
VerifyGameDataExists
(
game1
,
game2
)
// Push both games down to the step function
// Push both games down to the step function
maxDepth
:=
game1
.
MaxDepth
(
ctx
)
maxDepth
:=
game1
.
MaxDepth
(
ctx
)
for
claimCount
:=
int64
(
1
);
claimCount
<=
maxDepth
;
{
for
claimCount
:=
int64
(
1
);
claimCount
<=
maxDepth
;
{
...
@@ -97,8 +100,9 @@ func TestMultipleCannonGames(t *testing.T) {
...
@@ -97,8 +100,9 @@ func TestMultipleCannonGames(t *testing.T) {
game1
.
WaitForGameStatus
(
ctx
,
disputegame
.
StatusChallengerWins
)
game1
.
WaitForGameStatus
(
ctx
,
disputegame
.
StatusChallengerWins
)
game2
.
WaitForGameStatus
(
ctx
,
disputegame
.
StatusChallengerWins
)
game2
.
WaitForGameStatus
(
ctx
,
disputegame
.
StatusChallengerWins
)
game1
.
LogGameData
(
ctx
)
game2
.
LogGameData
(
ctx
)
// Check that the game directories are removed
challenger
.
VerifyNoGameDataExists
(
game1
,
game2
)
}
}
func
TestResolveDisputeGame
(
t
*
testing
.
T
)
{
func
TestResolveDisputeGame
(
t
*
testing
.
T
)
{
...
...
op-exporter/Dockerfile
View file @
a382b9e2
FROM
golang:1.
19.9-alpine3.16
as builder
FROM
golang:1.
20.7-alpine3.18
as builder
# build from root of repo
# build from root of repo
COPY
./op-exporter /app
COPY
./op-exporter /app
...
@@ -7,7 +7,7 @@ WORKDIR /app/
...
@@ -7,7 +7,7 @@ WORKDIR /app/
RUN
apk
--no-cache
add make bash jq git
RUN
apk
--no-cache
add make bash jq git
RUN
make build
RUN
make build
FROM
alpine:3.1
6
FROM
alpine:3.1
8
RUN
apk
--no-cache
add ca-certificates
RUN
apk
--no-cache
add ca-certificates
WORKDIR
/root/
WORKDIR
/root/
COPY
--from=builder /app/op-exporter /usr/local/bin/
COPY
--from=builder /app/op-exporter /usr/local/bin/
...
...
op-exporter/go.mod
View file @
a382b9e2
module github.com/ethereum-optimism/optimism/op-exporter
module github.com/ethereum-optimism/optimism/op-exporter
go 1.
18
go 1.
20
require (
require (
github.com/ethereum/go-ethereum v1.10.17
github.com/ethereum/go-ethereum v1.10.17
...
...
op-heartbeat/Dockerfile
View file @
a382b9e2
FROM
golang:1.
19.9-alpine3.16
as builder
FROM
golang:1.
20.7-alpine3.18
as builder
RUN
apk add
--no-cache
make gcc musl-dev linux-headers git jq bash
RUN
apk add
--no-cache
make gcc musl-dev linux-headers git jq bash
...
@@ -15,7 +15,7 @@ WORKDIR /app/op-heartbeat
...
@@ -15,7 +15,7 @@ WORKDIR /app/op-heartbeat
RUN
make op-heartbeat
RUN
make op-heartbeat
FROM
alpine:3.1
6
FROM
alpine:3.1
8
COPY
--from=builder /app/op-heartbeat/bin/op-heartbeat /usr/local/bin
COPY
--from=builder /app/op-heartbeat/bin/op-heartbeat /usr/local/bin
...
...
op-node/Dockerfile
View file @
a382b9e2
FROM
--platform=$BUILDPLATFORM golang:1.
19.9-alpine3.16
as builder
FROM
--platform=$BUILDPLATFORM golang:1.
20.7-alpine3.18
as builder
ARG
VERSION=v0.0.0
ARG
VERSION=v0.0.0
...
@@ -21,7 +21,7 @@ ARG TARGETOS TARGETARCH
...
@@ -21,7 +21,7 @@ ARG TARGETOS TARGETARCH
RUN
make op-node
VERSION
=
"
$VERSION
"
GOOS
=
$TARGETOS
GOARCH
=
$TARGETARCH
RUN
make op-node
VERSION
=
"
$VERSION
"
GOOS
=
$TARGETOS
GOARCH
=
$TARGETARCH
FROM
alpine:3.1
6
FROM
alpine:3.1
8
COPY
--from=builder /app/op-node/bin/op-node /usr/local/bin
COPY
--from=builder /app/op-node/bin/op-node /usr/local/bin
...
...
op-node/rollup/derive/l1_block_info_test.go
View file @
a382b9e2
package
derive
package
derive
import
(
import
(
crand
"crypto/rand"
"math/big"
"math/big"
"math/rand"
"math/rand"
"testing"
"testing"
...
@@ -97,7 +98,7 @@ func TestParseL1InfoDepositTxData(t *testing.T) {
...
@@ -97,7 +98,7 @@ func TestParseL1InfoDepositTxData(t *testing.T) {
info
:=
testutils
.
MakeBlockInfo
(
nil
)(
rng
)
info
:=
testutils
.
MakeBlockInfo
(
nil
)(
rng
)
depTx
,
err
:=
L1InfoDeposit
(
randomSeqNr
(
rng
),
info
,
randomL1Cfg
(
rng
,
info
),
false
)
depTx
,
err
:=
L1InfoDeposit
(
randomSeqNr
(
rng
),
info
,
randomL1Cfg
(
rng
,
info
),
false
)
require
.
NoError
(
t
,
err
)
require
.
NoError
(
t
,
err
)
_
,
err
=
rand
.
Read
(
depTx
.
Data
[
0
:
4
])
_
,
err
=
c
rand
.
Read
(
depTx
.
Data
[
0
:
4
])
require
.
NoError
(
t
,
err
)
require
.
NoError
(
t
,
err
)
_
,
err
=
L1InfoDepositTxData
(
depTx
.
Data
)
_
,
err
=
L1InfoDepositTxData
(
depTx
.
Data
)
require
.
ErrorContains
(
t
,
err
,
"function signature"
)
require
.
ErrorContains
(
t
,
err
,
"function signature"
)
...
...
op-node/sources/eth_client_test.go
View file @
a382b9e2
...
@@ -2,8 +2,8 @@ package sources
...
@@ -2,8 +2,8 @@ package sources
import
(
import
(
"context"
"context"
crand
"crypto/rand"
"math/big"
"math/big"
"math/rand"
"testing"
"testing"
"github.com/stretchr/testify/mock"
"github.com/stretchr/testify/mock"
...
@@ -56,7 +56,7 @@ var testEthClientConfig = &EthClientConfig{
...
@@ -56,7 +56,7 @@ var testEthClientConfig = &EthClientConfig{
}
}
func
randHash
()
(
out
common
.
Hash
)
{
func
randHash
()
(
out
common
.
Hash
)
{
rand
.
Read
(
out
[
:
])
_
,
_
=
c
rand
.
Read
(
out
[
:
])
return
out
return
out
}
}
...
...
op-program/Dockerfile
View file @
a382b9e2
FROM
--platform=$BUILDPLATFORM golang:1.
19.9-alpine3.16
as builder
FROM
--platform=$BUILDPLATFORM golang:1.
20.7-alpine3.18
as builder
ARG
VERSION=v0.0.0
ARG
VERSION=v0.0.0
...
@@ -23,7 +23,7 @@ ARG TARGETOS TARGETARCH
...
@@ -23,7 +23,7 @@ ARG TARGETOS TARGETARCH
RUN
make op-program
VERSION
=
"
$VERSION
"
GOOS
=
$TARGETOS
GOARCH
=
$TARGETARCH
RUN
make op-program
VERSION
=
"
$VERSION
"
GOOS
=
$TARGETOS
GOARCH
=
$TARGETARCH
FROM
alpine:3.1
6
FROM
alpine:3.1
8
COPY
--from=builder /app/op-program/bin/op-program /usr/local/bin
COPY
--from=builder /app/op-program/bin/op-program /usr/local/bin
...
...
op-proposer/Dockerfile
View file @
a382b9e2
FROM
--platform=$BUILDPLATFORM golang:1.
19.9-alpine3.16
as builder
FROM
--platform=$BUILDPLATFORM golang:1.
20.7-alpine3.18
as builder
ARG
VERSION=v0.0.0
ARG
VERSION=v0.0.0
...
@@ -22,7 +22,7 @@ ARG TARGETOS TARGETARCH
...
@@ -22,7 +22,7 @@ ARG TARGETOS TARGETARCH
RUN
make op-proposer
VERSION
=
"
$VERSION
"
GOOS
=
$TARGETOS
GOARCH
=
$TARGETARCH
RUN
make op-proposer
VERSION
=
"
$VERSION
"
GOOS
=
$TARGETOS
GOARCH
=
$TARGETARCH
FROM
alpine:3.1
6
FROM
alpine:3.1
8
COPY
--from=builder /app/op-proposer/bin/op-proposer /usr/local/bin
COPY
--from=builder /app/op-proposer/bin/op-proposer /usr/local/bin
...
...
op-wheel/Dockerfile
View file @
a382b9e2
FROM
golang:1.
19.9-alpine3.16
as builder
FROM
golang:1.
20.7-alpine3.18
as builder
RUN
apk add
--no-cache
make gcc musl-dev linux-headers
RUN
apk add
--no-cache
make gcc musl-dev linux-headers
...
@@ -14,7 +14,7 @@ WORKDIR /app/op-wheel
...
@@ -14,7 +14,7 @@ WORKDIR /app/op-wheel
RUN
go build
-o
op-wheel ./cmd/main.go
RUN
go build
-o
op-wheel ./cmd/main.go
FROM
alpine:3.1
6
FROM
alpine:3.1
8
COPY
--from=builder /app/op-wheel/op-wheel /usr/local/bin
COPY
--from=builder /app/op-wheel/op-wheel /usr/local/bin
...
...
package.json
View file @
a382b9e2
...
@@ -43,7 +43,7 @@
...
@@ -43,7 +43,7 @@
"
@types/chai
"
:
"
^4.2.18
"
,
"
@types/chai
"
:
"
^4.2.18
"
,
"
@types/chai-as-promised
"
:
"
^7.1.4
"
,
"
@types/chai-as-promised
"
:
"
^7.1.4
"
,
"
@types/mocha
"
:
"
^10.0.1
"
,
"
@types/mocha
"
:
"
^10.0.1
"
,
"
@types/node
"
:
"
^
12.0.0
"
,
"
@types/node
"
:
"
^
20.5.3
"
,
"
@typescript-eslint/eslint-plugin
"
:
"
^5.60.1
"
,
"
@typescript-eslint/eslint-plugin
"
:
"
^5.60.1
"
,
"
@typescript-eslint/parser
"
:
"
^5.60.1
"
,
"
@typescript-eslint/parser
"
:
"
^5.60.1
"
,
"
chai
"
:
"
^4.2.0
"
,
"
chai
"
:
"
^4.2.0
"
,
...
@@ -63,12 +63,12 @@
...
@@ -63,12 +63,12 @@
"
eslint-plugin-unicorn
"
:
"
^42.0.0
"
,
"
eslint-plugin-unicorn
"
:
"
^42.0.0
"
,
"
husky
"
:
"
^8.0.3
"
,
"
husky
"
:
"
^8.0.3
"
,
"
lerna
"
:
"
^7.1.5
"
,
"
lerna
"
:
"
^7.1.5
"
,
"
lint-staged
"
:
"
1
1.0.0
"
,
"
lint-staged
"
:
"
1
4.0.1
"
,
"
markdownlint
"
:
"
^0.24.0
"
,
"
markdownlint
"
:
"
^0.24.0
"
,
"
markdownlint-cli2
"
:
"
0.4.0
"
,
"
markdownlint-cli2
"
:
"
0.4.0
"
,
"
mkdirp
"
:
"
^1.0.4
"
,
"
mkdirp
"
:
"
^1.0.4
"
,
"
mocha
"
:
"
^10.2.0
"
,
"
mocha
"
:
"
^10.2.0
"
,
"
nx
"
:
"
16.7.
2
"
,
"
nx
"
:
"
16.7.
3
"
,
"
nyc
"
:
"
^15.1.0
"
,
"
nyc
"
:
"
^15.1.0
"
,
"
patch-package
"
:
"
^8.0.0
"
,
"
patch-package
"
:
"
^8.0.0
"
,
"
prettier
"
:
"
^2.8.0
"
,
"
prettier
"
:
"
^2.8.0
"
,
...
...
packages/contracts-bedrock/package.json
View file @
a382b9e2
...
@@ -41,7 +41,7 @@
...
@@ -41,7 +41,7 @@
"lint"
:
"pnpm lint:fix && pnpm lint:check"
"lint"
:
"pnpm lint:fix && pnpm lint:check"
},
},
"devDependencies"
:
{
"devDependencies"
:
{
"@typescript-eslint/eslint-plugin"
:
"^
6.4
.0"
,
"@typescript-eslint/eslint-plugin"
:
"^
5.62
.0"
,
"@typescript-eslint/parser"
:
"^6.4.0"
,
"@typescript-eslint/parser"
:
"^6.4.0"
,
"tsx"
:
"^3.12.7"
,
"tsx"
:
"^3.12.7"
,
"typescript"
:
"^5.1.6"
"typescript"
:
"^5.1.6"
...
...
packages/contracts-bedrock/test-case-generator/go.mod
View file @
a382b9e2
module github.com/ethereum-optimism/optimism/packages/contracts-bedrock/ctb-test-case-generator
module github.com/ethereum-optimism/optimism/packages/contracts-bedrock/ctb-test-case-generator
go 1.
19
go 1.
20
require github.com/ethereum/go-ethereum v1.10.26
require github.com/ethereum/go-ethereum v1.10.26
...
...
packages/contracts-ts/package.json
View file @
a382b9e2
...
@@ -48,7 +48,7 @@
...
@@ -48,7 +48,7 @@
},
},
"devDependencies"
:
{
"devDependencies"
:
{
"@eth-optimism/contracts-bedrock"
:
"workspace:*"
,
"@eth-optimism/contracts-bedrock"
:
"workspace:*"
,
"@testing-library/jest-dom"
:
"^
5.17.0
"
,
"@testing-library/jest-dom"
:
"^
6.0.1
"
,
"@testing-library/react-hooks"
:
"^8.0.1"
,
"@testing-library/react-hooks"
:
"^8.0.1"
,
"@types/glob"
:
"^8.1.0"
,
"@types/glob"
:
"^8.1.0"
,
"@vitest/coverage-istanbul"
:
"^0.34.1"
,
"@vitest/coverage-istanbul"
:
"^0.34.1"
,
...
...
packages/fee-estimation/package.json
View file @
a382b9e2
...
@@ -35,7 +35,7 @@
...
@@ -35,7 +35,7 @@
},
},
"devDependencies"
:
{
"devDependencies"
:
{
"@eth-optimism/contracts-ts"
:
"workspace:^"
,
"@eth-optimism/contracts-ts"
:
"workspace:^"
,
"@testing-library/jest-dom"
:
"^
5.17.0
"
,
"@testing-library/jest-dom"
:
"^
6.0.1
"
,
"@testing-library/react-hooks"
:
"^8.0.1"
,
"@testing-library/react-hooks"
:
"^8.0.1"
,
"@vitest/coverage-istanbul"
:
"^0.34.1"
,
"@vitest/coverage-istanbul"
:
"^0.34.1"
,
"abitype"
:
"^0.9.3"
,
"abitype"
:
"^0.9.3"
,
...
...
pnpm-lock.yaml
View file @
a382b9e2
...
@@ -34,11 +34,11 @@ importers:
...
@@ -34,11 +34,11 @@ importers:
specifier
:
^10.0.1
specifier
:
^10.0.1
version
:
10.0.1
version
:
10.0.1
'
@types/node'
:
'
@types/node'
:
specifier
:
^
12.0.0
specifier
:
^
20.5.3
version
:
12.20.20
version
:
20.5.3
'
@typescript-eslint/eslint-plugin'
:
'
@typescript-eslint/eslint-plugin'
:
specifier
:
^5.60.1
specifier
:
^5.60.1
version
:
5.6
0.1
(@typescript-eslint/parser@5.60.1)(eslint@8.47.0)(typescript@5.1.6)
version
:
5.6
2.0
(@typescript-eslint/parser@5.60.1)(eslint@8.47.0)(typescript@5.1.6)
'
@typescript-eslint/parser'
:
'
@typescript-eslint/parser'
:
specifier
:
^5.60.1
specifier
:
^5.60.1
version
:
5.60.1(eslint@8.47.0)(typescript@5.1.6)
version
:
5.60.1(eslint@8.47.0)(typescript@5.1.6)
...
@@ -77,7 +77,7 @@ importers:
...
@@ -77,7 +77,7 @@ importers:
version
:
1.2.3(eslint@8.47.0)
version
:
1.2.3(eslint@8.47.0)
eslint-plugin-prettier
:
eslint-plugin-prettier
:
specifier
:
^4.0.0
specifier
:
^4.0.0
version
:
4.
0.0
(eslint-config-prettier@8.3.0)(eslint@8.47.0)(prettier@2.8.8)
version
:
4.
2.1
(eslint-config-prettier@8.3.0)(eslint@8.47.0)(prettier@2.8.8)
eslint-plugin-promise
:
eslint-plugin-promise
:
specifier
:
^5.1.0
specifier
:
^5.1.0
version
:
5.2.0(eslint@8.47.0)
version
:
5.2.0(eslint@8.47.0)
...
@@ -94,8 +94,8 @@ importers:
...
@@ -94,8 +94,8 @@ importers:
specifier
:
^7.1.5
specifier
:
^7.1.5
version
:
7.1.5
version
:
7.1.5
lint-staged
:
lint-staged
:
specifier
:
1
1.0.0
specifier
:
1
4.0.1
version
:
1
1.0.0
version
:
1
4.0.1
markdownlint
:
markdownlint
:
specifier
:
^0.24.0
specifier
:
^0.24.0
version
:
0.24.0
version
:
0.24.0
...
@@ -109,8 +109,8 @@ importers:
...
@@ -109,8 +109,8 @@ importers:
specifier
:
^10.2.0
specifier
:
^10.2.0
version
:
10.2.0
version
:
10.2.0
nx
:
nx
:
specifier
:
16.7.
2
specifier
:
16.7.
3
version
:
16.7.
2
version
:
16.7.
3
nyc
:
nyc
:
specifier
:
^15.1.0
specifier
:
^15.1.0
version
:
15.1.0
version
:
15.1.0
...
@@ -268,8 +268,8 @@ importers:
...
@@ -268,8 +268,8 @@ importers:
packages/contracts-bedrock
:
packages/contracts-bedrock
:
devDependencies
:
devDependencies
:
'
@typescript-eslint/eslint-plugin'
:
'
@typescript-eslint/eslint-plugin'
:
specifier
:
^
6.4
.0
specifier
:
^
5.62
.0
version
:
6.4
.0(@typescript-eslint/parser@6.4.0)(eslint@8.47.0)(typescript@5.1.6)
version
:
5.62
.0(@typescript-eslint/parser@6.4.0)(eslint@8.47.0)(typescript@5.1.6)
'
@typescript-eslint/parser'
:
'
@typescript-eslint/parser'
:
specifier
:
^6.4.0
specifier
:
^6.4.0
version
:
6.4.0(eslint@8.47.0)(typescript@5.1.6)
version
:
6.4.0(eslint@8.47.0)(typescript@5.1.6)
...
@@ -302,8 +302,8 @@ importers:
...
@@ -302,8 +302,8 @@ importers:
specifier
:
workspace:*
specifier
:
workspace:*
version
:
link:../contracts-bedrock
version
:
link:../contracts-bedrock
'
@testing-library/jest-dom'
:
'
@testing-library/jest-dom'
:
specifier
:
^
5.17.0
specifier
:
^
6.0.1
version
:
5.17.0
version
:
6.0.1(vitest@0.34.2)
'
@testing-library/react-hooks'
:
'
@testing-library/react-hooks'
:
specifier
:
^8.0.1
specifier
:
^8.0.1
version
:
8.0.1(react-dom@18.2.0)(react@18.2.0)
version
:
8.0.1(react-dom@18.2.0)(react@18.2.0)
...
@@ -342,7 +342,7 @@ importers:
...
@@ -342,7 +342,7 @@ importers:
version
:
5.1.6
version
:
5.1.6
vite
:
vite
:
specifier
:
^4.4.6
specifier
:
^4.4.6
version
:
4.4.6(@types/node@
12.20.20
)
version
:
4.4.6(@types/node@
20.5.3
)
vitest
:
vitest
:
specifier
:
^0.34.2
specifier
:
^0.34.2
version
:
0.34.2(jsdom@22.1.0)
version
:
0.34.2(jsdom@22.1.0)
...
@@ -405,8 +405,8 @@ importers:
...
@@ -405,8 +405,8 @@ importers:
specifier
:
workspace:^
specifier
:
workspace:^
version
:
link:../contracts-ts
version
:
link:../contracts-ts
'
@testing-library/jest-dom'
:
'
@testing-library/jest-dom'
:
specifier
:
^
5.17.0
specifier
:
^
6.0.1
version
:
5.17.0
version
:
6.0.1(vitest@0.34.2)
'
@testing-library/react-hooks'
:
'
@testing-library/react-hooks'
:
specifier
:
^8.0.1
specifier
:
^8.0.1
version
:
8.0.1(react@17.0.2)
version
:
8.0.1(react@17.0.2)
...
@@ -436,7 +436,7 @@ importers:
...
@@ -436,7 +436,7 @@ importers:
version
:
1.3.1(typescript@5.1.6)
version
:
1.3.1(typescript@5.1.6)
vite
:
vite
:
specifier
:
^4.4.6
specifier
:
^4.4.6
version
:
4.4.6(@types/node@
12.20.20
)
version
:
4.4.6(@types/node@
20.5.3
)
vitest
:
vitest
:
specifier
:
^0.34.2
specifier
:
^0.34.2
version
:
0.34.2(jsdom@22.1.0)
version
:
0.34.2(jsdom@22.1.0)
...
@@ -567,7 +567,7 @@ importers:
...
@@ -567,7 +567,7 @@ importers:
version
:
1.6.0(typescript@5.1.6)(zod@3.22.0)
version
:
1.6.0(typescript@5.1.6)(zod@3.22.0)
vite
:
vite
:
specifier
:
^4.4.9
specifier
:
^4.4.9
version
:
4.4.9(@types/node@
12.20.20
)
version
:
4.4.9(@types/node@
20.5.3
)
vitest
:
vitest
:
specifier
:
^0.34.1
specifier
:
^0.34.1
version
:
0.34.1
version
:
0.34.1
...
@@ -1005,7 +1005,7 @@ packages:
...
@@ -1005,7 +1005,7 @@ packages:
/@changesets/apply-release-plan@6.1.3
:
/@changesets/apply-release-plan@6.1.3
:
resolution
:
{
integrity
:
sha512-ECDNeoc3nfeAe1jqJb5aFQX7CqzQhD2klXRez2JDb/aVpGUbX673HgKrnrgJRuQR/9f2TtLoYIzrGB9qwD77mg==
}
resolution
:
{
integrity
:
sha512-ECDNeoc3nfeAe1jqJb5aFQX7CqzQhD2klXRez2JDb/aVpGUbX673HgKrnrgJRuQR/9f2TtLoYIzrGB9qwD77mg==
}
dependencies
:
dependencies
:
'
@babel/runtime'
:
7.2
0.7
'
@babel/runtime'
:
7.2
2.6
'
@changesets/config'
:
2.3.0
'
@changesets/config'
:
2.3.0
'
@changesets/get-version-range-type'
:
0.3.2
'
@changesets/get-version-range-type'
:
0.3.2
'
@changesets/git'
:
2.0.0
'
@changesets/git'
:
2.0.0
...
@@ -1023,7 +1023,7 @@ packages:
...
@@ -1023,7 +1023,7 @@ packages:
/@changesets/assemble-release-plan@5.2.3
:
/@changesets/assemble-release-plan@5.2.3
:
resolution
:
{
integrity
:
sha512-g7EVZCmnWz3zMBAdrcKhid4hkHT+Ft1n0mLussFMcB1dE2zCuwcvGoy9ec3yOgPGF4hoMtgHaMIk3T3TBdvU9g==
}
resolution
:
{
integrity
:
sha512-g7EVZCmnWz3zMBAdrcKhid4hkHT+Ft1n0mLussFMcB1dE2zCuwcvGoy9ec3yOgPGF4hoMtgHaMIk3T3TBdvU9g==
}
dependencies
:
dependencies
:
'
@babel/runtime'
:
7.2
0.7
'
@babel/runtime'
:
7.2
2.6
'
@changesets/errors'
:
0.1.4
'
@changesets/errors'
:
0.1.4
'
@changesets/get-dependents-graph'
:
1.3.5
'
@changesets/get-dependents-graph'
:
1.3.5
'
@changesets/types'
:
5.2.1
'
@changesets/types'
:
5.2.1
...
@@ -1126,7 +1126,7 @@ packages:
...
@@ -1126,7 +1126,7 @@ packages:
/@changesets/get-release-plan@3.0.16
:
/@changesets/get-release-plan@3.0.16
:
resolution
:
{
integrity
:
sha512-OpP9QILpBp1bY2YNIKFzwigKh7Qe9KizRsZomzLe6pK8IUo8onkAAVUD8+JRKSr8R7d4+JRuQrfSSNlEwKyPYg==
}
resolution
:
{
integrity
:
sha512-OpP9QILpBp1bY2YNIKFzwigKh7Qe9KizRsZomzLe6pK8IUo8onkAAVUD8+JRKSr8R7d4+JRuQrfSSNlEwKyPYg==
}
dependencies
:
dependencies
:
'
@babel/runtime'
:
7.2
0.7
'
@babel/runtime'
:
7.2
2.6
'
@changesets/assemble-release-plan'
:
5.2.3
'
@changesets/assemble-release-plan'
:
5.2.3
'
@changesets/config'
:
2.3.0
'
@changesets/config'
:
2.3.0
'
@changesets/pre'
:
1.0.14
'
@changesets/pre'
:
1.0.14
...
@@ -1142,7 +1142,7 @@ packages:
...
@@ -1142,7 +1142,7 @@ packages:
/@changesets/git@2.0.0
:
/@changesets/git@2.0.0
:
resolution
:
{
integrity
:
sha512-enUVEWbiqUTxqSnmesyJGWfzd51PY4H7mH9yUw0hPVpZBJ6tQZFMU3F3mT/t9OJ/GjyiM4770i+sehAn6ymx6A==
}
resolution
:
{
integrity
:
sha512-enUVEWbiqUTxqSnmesyJGWfzd51PY4H7mH9yUw0hPVpZBJ6tQZFMU3F3mT/t9OJ/GjyiM4770i+sehAn6ymx6A==
}
dependencies
:
dependencies
:
'
@babel/runtime'
:
7.2
0.7
'
@babel/runtime'
:
7.2
2.6
'
@changesets/errors'
:
0.1.4
'
@changesets/errors'
:
0.1.4
'
@changesets/types'
:
5.2.1
'
@changesets/types'
:
5.2.1
'
@manypkg/get-packages'
:
1.1.3
'
@manypkg/get-packages'
:
1.1.3
...
@@ -1167,7 +1167,7 @@ packages:
...
@@ -1167,7 +1167,7 @@ packages:
/@changesets/pre@1.0.14
:
/@changesets/pre@1.0.14
:
resolution
:
{
integrity
:
sha512-dTsHmxQWEQekHYHbg+M1mDVYFvegDh9j/kySNuDKdylwfMEevTeDouR7IfHNyVodxZXu17sXoJuf2D0vi55FHQ==
}
resolution
:
{
integrity
:
sha512-dTsHmxQWEQekHYHbg+M1mDVYFvegDh9j/kySNuDKdylwfMEevTeDouR7IfHNyVodxZXu17sXoJuf2D0vi55FHQ==
}
dependencies
:
dependencies
:
'
@babel/runtime'
:
7.2
0.7
'
@babel/runtime'
:
7.2
2.6
'
@changesets/errors'
:
0.1.4
'
@changesets/errors'
:
0.1.4
'
@changesets/types'
:
5.2.1
'
@changesets/types'
:
5.2.1
'
@manypkg/get-packages'
:
1.1.3
'
@manypkg/get-packages'
:
1.1.3
...
@@ -1177,7 +1177,7 @@ packages:
...
@@ -1177,7 +1177,7 @@ packages:
/@changesets/read@0.5.9
:
/@changesets/read@0.5.9
:
resolution
:
{
integrity
:
sha512-T8BJ6JS6j1gfO1HFq50kU3qawYxa4NTbI/ASNVVCBTsKquy2HYwM9r7ZnzkiMe8IEObAJtUVGSrePCOxAK2haQ==
}
resolution
:
{
integrity
:
sha512-T8BJ6JS6j1gfO1HFq50kU3qawYxa4NTbI/ASNVVCBTsKquy2HYwM9r7ZnzkiMe8IEObAJtUVGSrePCOxAK2haQ==
}
dependencies
:
dependencies
:
'
@babel/runtime'
:
7.2
0.7
'
@babel/runtime'
:
7.2
2.6
'
@changesets/git'
:
2.0.0
'
@changesets/git'
:
2.0.0
'
@changesets/logger'
:
0.0.5
'
@changesets/logger'
:
0.0.5
'
@changesets/parse'
:
0.3.16
'
@changesets/parse'
:
0.3.16
...
@@ -1197,7 +1197,7 @@ packages:
...
@@ -1197,7 +1197,7 @@ packages:
/@changesets/write@0.2.3
:
/@changesets/write@0.2.3
:
resolution
:
{
integrity
:
sha512-Dbamr7AIMvslKnNYsLFafaVORx4H0pvCA2MHqgtNCySMe1blImEyAEOzDmcgKAkgz4+uwoLz7demIrX+JBr/Xw==
}
resolution
:
{
integrity
:
sha512-Dbamr7AIMvslKnNYsLFafaVORx4H0pvCA2MHqgtNCySMe1blImEyAEOzDmcgKAkgz4+uwoLz7demIrX+JBr/Xw==
}
dependencies
:
dependencies
:
'
@babel/runtime'
:
7.2
0.7
'
@babel/runtime'
:
7.2
2.6
'
@changesets/types'
:
5.2.1
'
@changesets/types'
:
5.2.1
fs-extra
:
7.0.1
fs-extra
:
7.0.1
human-id
:
1.0.2
human-id
:
1.0.2
...
@@ -1738,11 +1738,6 @@ packages:
...
@@ -1738,11 +1738,6 @@ packages:
eslint-visitor-keys
:
3.4.3
eslint-visitor-keys
:
3.4.3
dev
:
true
dev
:
true
/@eslint-community/regexpp@4.5.1
:
resolution
:
{
integrity
:
sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ==
}
engines
:
{
node
:
^12.0.0 || ^14.0.0 || >=16.0.0
}
dev
:
true
/@eslint-community/regexpp@4.6.2
:
/@eslint-community/regexpp@4.6.2
:
resolution
:
{
integrity
:
sha512-pPTNuaAG3QMH+buKyBIGJs3g/S5y0caxw0ygM3YyE6yJFySwiGGSzA+mM3KJ8QQvzeLh3blwgSonkFjgQdxzMw==
}
resolution
:
{
integrity
:
sha512-pPTNuaAG3QMH+buKyBIGJs3g/S5y0caxw0ygM3YyE6yJFySwiGGSzA+mM3KJ8QQvzeLh3blwgSonkFjgQdxzMw==
}
engines
:
{
node
:
^12.0.0 || ^14.0.0 || >=16.0.0
}
engines
:
{
node
:
^12.0.0 || ^14.0.0 || >=16.0.0
}
...
@@ -2410,13 +2405,6 @@ packages:
...
@@ -2410,13 +2405,6 @@ packages:
engines
:
{
node
:
'
>=8'
}
engines
:
{
node
:
'
>=8'
}
dev
:
true
dev
:
true
/@jest/expect-utils@29.6.1
:
resolution
:
{
integrity
:
sha512-o319vIf5pEMx0LmzSxxkYYxo4wrRLKHq9dP1yJU7FoPTB0LfAKSz8SWD6D/6U3v/O52t9cF5t+MeJiRsfk7zMw==
}
engines
:
{
node
:
^14.15.0 || ^16.10.0 || >=18.0.0
}
dependencies
:
jest-get-type
:
29.4.3
dev
:
true
/@jest/schemas@29.6.0
:
/@jest/schemas@29.6.0
:
resolution
:
{
integrity
:
sha512-rxLjXyJBTL4LQeJW3aKo0M/+GkCOXsO+8i9Iu7eDb6KwtP65ayoDsitrdPBtujxQ88k4wI2FNYfa6TOGwSn6cQ==
}
resolution
:
{
integrity
:
sha512-rxLjXyJBTL4LQeJW3aKo0M/+GkCOXsO+8i9Iu7eDb6KwtP65ayoDsitrdPBtujxQ88k4wI2FNYfa6TOGwSn6cQ==
}
engines
:
{
node
:
^14.15.0 || ^16.10.0 || >=18.0.0
}
engines
:
{
node
:
^14.15.0 || ^16.10.0 || >=18.0.0
}
...
@@ -2424,18 +2412,6 @@ packages:
...
@@ -2424,18 +2412,6 @@ packages:
'
@sinclair/typebox'
:
0.27.8
'
@sinclair/typebox'
:
0.27.8
dev
:
true
dev
:
true
/@jest/types@29.6.1
:
resolution
:
{
integrity
:
sha512-tPKQNMPuXgvdOn2/Lg9HNfUvjYVGolt04Hp03f5hAk878uwOLikN+JzeLY0HcVgKgFl9Hs3EIqpu3WX27XNhnw==
}
engines
:
{
node
:
^14.15.0 || ^16.10.0 || >=18.0.0
}
dependencies
:
'
@jest/schemas'
:
29.6.0
'
@types/istanbul-lib-coverage'
:
2.0.4
'
@types/istanbul-reports'
:
3.0.1
'
@types/node'
:
20.5.0
'
@types/yargs'
:
17.0.24
chalk
:
4.1.2
dev
:
true
/@jridgewell/gen-mapping@0.3.3
:
/@jridgewell/gen-mapping@0.3.3
:
resolution
:
{
integrity
:
sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==
}
resolution
:
{
integrity
:
sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==
}
engines
:
{
node
:
'
>=6.0.0'
}
engines
:
{
node
:
'
>=6.0.0'
}
...
@@ -2517,7 +2493,7 @@ packages:
...
@@ -2517,7 +2493,7 @@ packages:
dependencies
:
dependencies
:
'
@lerna/child-process'
:
7.1.5
'
@lerna/child-process'
:
7.1.5
'
@npmcli/run-script'
:
6.0.2
'
@npmcli/run-script'
:
6.0.2
'
@nx/devkit'
:
16.7.1(nx@16.7.
2
)
'
@nx/devkit'
:
16.7.1(nx@16.7.
3
)
'
@octokit/plugin-enterprise-rest'
:
6.0.1
'
@octokit/plugin-enterprise-rest'
:
6.0.1
'
@octokit/rest'
:
19.0.11
'
@octokit/rest'
:
19.0.11
byte-size
:
8.1.1
byte-size
:
8.1.1
...
@@ -2553,7 +2529,7 @@ packages:
...
@@ -2553,7 +2529,7 @@ packages:
npm-packlist
:
5.1.1
npm-packlist
:
5.1.1
npm-registry-fetch
:
14.0.5
npm-registry-fetch
:
14.0.5
npmlog
:
6.0.2
npmlog
:
6.0.2
nx
:
16.7.
2
nx
:
16.7.
3
p-map
:
4.0.0
p-map
:
4.0.0
p-map-series
:
2.1.0
p-map-series
:
2.1.0
p-queue
:
6.6.2
p-queue
:
6.6.2
...
@@ -2608,7 +2584,7 @@ packages:
...
@@ -2608,7 +2584,7 @@ packages:
/@manypkg/get-packages@1.1.3
:
/@manypkg/get-packages@1.1.3
:
resolution
:
{
integrity
:
sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==
}
resolution
:
{
integrity
:
sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==
}
dependencies
:
dependencies
:
'
@babel/runtime'
:
7.2
0.7
'
@babel/runtime'
:
7.2
2.6
'
@changesets/types'
:
4.1.0
'
@changesets/types'
:
4.1.0
'
@manypkg/find-root'
:
1.1.0
'
@manypkg/find-root'
:
1.1.0
fs-extra
:
8.1.0
fs-extra
:
8.1.0
...
@@ -2838,10 +2814,10 @@ packages:
...
@@ -2838,10 +2814,10 @@ packages:
-
supports-color
-
supports-color
dev
:
true
dev
:
true
/@nrwl/devkit@16.7.1(nx@16.7.
2
)
:
/@nrwl/devkit@16.7.1(nx@16.7.
3
)
:
resolution
:
{
integrity
:
sha512-ysAgNju6o7QjG/ZHW0wIRJ8yWxjhErjqQ8GZ2Smqsb1myrr6UbYsuxaXjoOHI56fMmGyNPK04zzyNXXWQw/UAA==
}
resolution
:
{
integrity
:
sha512-ysAgNju6o7QjG/ZHW0wIRJ8yWxjhErjqQ8GZ2Smqsb1myrr6UbYsuxaXjoOHI56fMmGyNPK04zzyNXXWQw/UAA==
}
dependencies
:
dependencies
:
'
@nx/devkit'
:
16.7.1(nx@16.7.
2
)
'
@nx/devkit'
:
16.7.1(nx@16.7.
3
)
transitivePeerDependencies
:
transitivePeerDependencies
:
-
nx
-
nx
dev
:
true
dev
:
true
...
@@ -2854,11 +2830,11 @@ packages:
...
@@ -2854,11 +2830,11 @@ packages:
-
debug
-
debug
dev
:
true
dev
:
true
/@nrwl/tao@16.7.
2
:
/@nrwl/tao@16.7.
3
:
resolution
:
{
integrity
:
sha512-
4Wc3ic5VtZL3t4qqCMJlEad/wWuFxNUX78U5ohEStN3UFFJIjwJJpKZYZDtxhaOLWUdXbk6CI3KfSIpWgwPdbQ
==
}
resolution
:
{
integrity
:
sha512-
kaH0i7ZuncSW8hGXg6DVlUBG319lUG/ene6aJUeV1spOxEsEqlckCm9HfJPfcVntvh9m1LauW+yk64cw/biVwg
==
}
hasBin
:
true
hasBin
:
true
dependencies
:
dependencies
:
nx
:
16.7.
2
nx
:
16.7.
3
tslib
:
2.6.0
tslib
:
2.6.0
transitivePeerDependencies
:
transitivePeerDependencies
:
-
'
@swc-node/register'
-
'
@swc-node/register'
...
@@ -2866,23 +2842,23 @@ packages:
...
@@ -2866,23 +2842,23 @@ packages:
-
debug
-
debug
dev
:
true
dev
:
true
/@nx/devkit@16.7.1(nx@16.7.
2
)
:
/@nx/devkit@16.7.1(nx@16.7.
3
)
:
resolution
:
{
integrity
:
sha512-PASQGd1YhcAA/hpupCsSakP71Qh1pYle4dtF+wh3KDe2kdeM6BgccClapiGcXAI46JKLUGAbNYJ8pg7GEPY5Nw==
}
resolution
:
{
integrity
:
sha512-PASQGd1YhcAA/hpupCsSakP71Qh1pYle4dtF+wh3KDe2kdeM6BgccClapiGcXAI46JKLUGAbNYJ8pg7GEPY5Nw==
}
peerDependencies
:
peerDependencies
:
nx
:
'
>=
15
<=
17'
nx
:
'
>=
15
<=
17'
dependencies
:
dependencies
:
'
@nrwl/devkit'
:
16.7.1(nx@16.7.
2
)
'
@nrwl/devkit'
:
16.7.1(nx@16.7.
3
)
ejs
:
3.1.9
ejs
:
3.1.9
enquirer
:
2.3.6
enquirer
:
2.3.6
ignore
:
5.2.4
ignore
:
5.2.4
nx
:
16.7.
2
nx
:
16.7.
3
semver
:
7.5.3
semver
:
7.5.3
tmp
:
0.2.1
tmp
:
0.2.1
tslib
:
2.6.0
tslib
:
2.6.0
dev
:
true
dev
:
true
/@nx/nx-darwin-arm64@16.7.
2
:
/@nx/nx-darwin-arm64@16.7.
3
:
resolution
:
{
integrity
:
sha512-
dkTHAzOTbqRHUQtnw7knEJq4ll6hew11u+9B0fThs9gC/X0iPK0eDXD4TqbIKEbcWAsxpuGiWPzGoNPo7Gwl9
A==
}
resolution
:
{
integrity
:
sha512-
s1woGSGbNEzDSzNoSIIpaYkVwJmM0D89/1QmccVZIv7jvGGcqx4ONQPsBylWpDco3IeTDhNsOMzMhF3fvqhtg
A==
}
engines
:
{
node
:
'
>=
10'
}
engines
:
{
node
:
'
>=
10'
}
cpu
:
[
arm64
]
cpu
:
[
arm64
]
os
:
[
darwin
]
os
:
[
darwin
]
...
@@ -2890,8 +2866,8 @@ packages:
...
@@ -2890,8 +2866,8 @@ packages:
dev
:
true
dev
:
true
optional
:
true
optional
:
true
/@nx/nx-darwin-x64@16.7.
2
:
/@nx/nx-darwin-x64@16.7.
3
:
resolution
:
{
integrity
:
sha512-
EKhjX7DCRIA5U8yAxIgGXeIFaq1dhgLJy8OAG4n1Ud8c21px+bBSrcZvv0ww5VoEulhggQ+c6fW1cjKtGgLkn
Q==
}
resolution
:
{
integrity
:
sha512-
J9lE+T7Hm3hD+s33xidxa6Jkq2CCKZwwTrLO+Ff1/A2d4T13d16O/Rf3Y/nuveUjCVEYwwYkk4G5v2FPJ4i3S
Q==
}
engines
:
{
node
:
'
>=
10'
}
engines
:
{
node
:
'
>=
10'
}
cpu
:
[
x64
]
cpu
:
[
x64
]
os
:
[
darwin
]
os
:
[
darwin
]
...
@@ -2899,8 +2875,8 @@ packages:
...
@@ -2899,8 +2875,8 @@ packages:
dev
:
true
dev
:
true
optional
:
true
optional
:
true
/@nx/nx-freebsd-x64@16.7.
2
:
/@nx/nx-freebsd-x64@16.7.
3
:
resolution
:
{
integrity
:
sha512-
3QhXZq0wxvi4lg1MJqwq72F7PE/d0Hcl3uwheenYQtwUvAFAmijC/Z4AVPSqbKJ+QaoqASnXRim9z3EIfeD+DQ
==
}
resolution
:
{
integrity
:
sha512-
/1WrplEyxTkoARsCUcI2FjMVy2AFuaH2oS1vFuGtBchWoKbgFZd3Aek8+oYt0wiQ7cfBxs2y92UqvTOhLygxOw
==
}
engines
:
{
node
:
'
>=
10'
}
engines
:
{
node
:
'
>=
10'
}
cpu
:
[
x64
]
cpu
:
[
x64
]
os
:
[
freebsd
]
os
:
[
freebsd
]
...
@@ -2908,8 +2884,8 @@ packages:
...
@@ -2908,8 +2884,8 @@ packages:
dev
:
true
dev
:
true
optional
:
true
optional
:
true
/@nx/nx-linux-arm-gnueabihf@16.7.
2
:
/@nx/nx-linux-arm-gnueabihf@16.7.
3
:
resolution
:
{
integrity
:
sha512-
7bny8NvE9iyfwRfq9/mOZjzMNWthT70Ce1N9suB2zdbgbLUEDPQQhBNbg969yT6/LbWMWuWZXeIbz/Fwndf9z
A==
}
resolution
:
{
integrity
:
sha512-
Z3CLZcxBnpra8nlizK97eyohI9x+JPh4wp+87x9WvIiLGd+k3hO42nth/q0xXJs2G5emQN8cSLPscGzbZodVp
A==
}
engines
:
{
node
:
'
>=
10'
}
engines
:
{
node
:
'
>=
10'
}
cpu
:
[
arm
]
cpu
:
[
arm
]
os
:
[
linux
]
os
:
[
linux
]
...
@@ -2917,8 +2893,8 @@ packages:
...
@@ -2917,8 +2893,8 @@ packages:
dev
:
true
dev
:
true
optional
:
true
optional
:
true
/@nx/nx-linux-arm64-gnu@16.7.
2
:
/@nx/nx-linux-arm64-gnu@16.7.
3
:
resolution
:
{
integrity
:
sha512-
+UdeFB1HY/3GU2+mflydFWpztghFRQiVzJV6MTcjtOzE3jfgXzz9TP580pDxozTvNSRPlblH07X+iB8DhVcB9w
==
}
resolution
:
{
integrity
:
sha512-
a4E4psBgU0b7ZT99630mylxcrlLObgy4bA6JrT+4XIFAcaHkfCmWLupPyXgBCmSqQN01jsuXSYm/t7EWjKL98Q
==
}
engines
:
{
node
:
'
>=
10'
}
engines
:
{
node
:
'
>=
10'
}
cpu
:
[
arm64
]
cpu
:
[
arm64
]
os
:
[
linux
]
os
:
[
linux
]
...
@@ -2926,8 +2902,8 @@ packages:
...
@@ -2926,8 +2902,8 @@ packages:
dev
:
true
dev
:
true
optional
:
true
optional
:
true
/@nx/nx-linux-arm64-musl@16.7.
2
:
/@nx/nx-linux-arm64-musl@16.7.
3
:
resolution
:
{
integrity
:
sha512-
YfkWu+4GKXageuYiH5a77gIDAXnit5SIyfI+RWe/j04uFy171KnUt167DC417fv/fTGxeXY1tzOu112Y+x5ix
w==
}
resolution
:
{
integrity
:
sha512-
vl+WONX6uOS8uGwtcAlb4yiAh2ws/gZSLaIURJaDnf509FrYTb/RsBca5BskOQUYkKSI//6oQu653TRDKYxyW
w==
}
engines
:
{
node
:
'
>=
10'
}
engines
:
{
node
:
'
>=
10'
}
cpu
:
[
arm64
]
cpu
:
[
arm64
]
os
:
[
linux
]
os
:
[
linux
]
...
@@ -2935,8 +2911,8 @@ packages:
...
@@ -2935,8 +2911,8 @@ packages:
dev
:
true
dev
:
true
optional
:
true
optional
:
true
/@nx/nx-linux-x64-gnu@16.7.
2
:
/@nx/nx-linux-x64-gnu@16.7.
3
:
resolution
:
{
integrity
:
sha512-
/TtSa2rHR+1gNuALR1yafl4fzBK2/GAhosf+skn00OgwsJ0c8ie9tuuftlMo+2n3LcXY/IaPDaD7t6fln4qsQg
==
}
resolution
:
{
integrity
:
sha512-
udZ+6IOYv0Ra0MRpbAW8TSFdcUxtfuIryRsGVF2767HeWqHzOhLynmJyJPatJ7gXMVFaL7+zfcAoV6fm7My1FQ
==
}
engines
:
{
node
:
'
>=
10'
}
engines
:
{
node
:
'
>=
10'
}
cpu
:
[
x64
]
cpu
:
[
x64
]
os
:
[
linux
]
os
:
[
linux
]
...
@@ -2944,8 +2920,8 @@ packages:
...
@@ -2944,8 +2920,8 @@ packages:
dev
:
true
dev
:
true
optional
:
true
optional
:
true
/@nx/nx-linux-x64-musl@16.7.
2
:
/@nx/nx-linux-x64-musl@16.7.
3
:
resolution
:
{
integrity
:
sha512-
VC638hxdWSA8VTDU9rAXjr60mmMP3ZyCUbSkJ+8ydEe83StMDY3PAXS5Hw3n/ouxDfCF9r1kWIGFe4g+emvfB
w==
}
resolution
:
{
integrity
:
sha512-
LQW1ttQWNekHoJTrzXMumaMxfYRcjsuGQP8Ki2pWuw43TFTQyI6Cfgk8/wjKv8ATc772cF9Tadyz4+JEIQlcN
w==
}
engines
:
{
node
:
'
>=
10'
}
engines
:
{
node
:
'
>=
10'
}
cpu
:
[
x64
]
cpu
:
[
x64
]
os
:
[
linux
]
os
:
[
linux
]
...
@@ -2953,8 +2929,8 @@ packages:
...
@@ -2953,8 +2929,8 @@ packages:
dev
:
true
dev
:
true
optional
:
true
optional
:
true
/@nx/nx-win32-arm64-msvc@16.7.
2
:
/@nx/nx-win32-arm64-msvc@16.7.
3
:
resolution
:
{
integrity
:
sha512-
sSUqgANLgQFFzKTvyMczh5D6xiqTQnB8daJTLX+QUCv5vO5+ZSwuVDyNfr6g/HV2+ak0M9/wVQUae11TgUIPYw
==
}
resolution
:
{
integrity
:
sha512-
wCrpGqh5fPrlkhHZXVSPBDs9E3L5vIJHtdPrc1QP1uCQiV41mpauey31p6rjvQUWYCC0BGTWJGF+hAY7wYUHdg
==
}
engines
:
{
node
:
'
>=
10'
}
engines
:
{
node
:
'
>=
10'
}
cpu
:
[
arm64
]
cpu
:
[
arm64
]
os
:
[
win32
]
os
:
[
win32
]
...
@@ -2962,8 +2938,8 @@ packages:
...
@@ -2962,8 +2938,8 @@ packages:
dev
:
true
dev
:
true
optional
:
true
optional
:
true
/@nx/nx-win32-x64-msvc@16.7.
2
:
/@nx/nx-win32-x64-msvc@16.7.
3
:
resolution
:
{
integrity
:
sha512-
+n01cT9/P3o95x+FlRWYf9sFZ29ooxYD/WLcmxACeXN0V1bdbnZxKVSuJqrXZhmpHe7P+/+IRmniv9cdpkxz7g
==
}
resolution
:
{
integrity
:
sha512-
Ja2+VhMFWiVsZt3mkdsU1MCotQlAxG94zFiJYbXufsERJItWuN4i0mZjeZITiRBosEmkn4SeAUkg+xuiH+q4GA
==
}
engines
:
{
node
:
'
>=
10'
}
engines
:
{
node
:
'
>=
10'
}
cpu
:
[
x64
]
cpu
:
[
x64
]
os
:
[
win32
]
os
:
[
win32
]
...
@@ -3705,19 +3681,33 @@ packages:
...
@@ -3705,19 +3681,33 @@ packages:
pretty-format
:
27.5.1
pretty-format
:
27.5.1
dev
:
false
dev
:
false
/@testing-library/jest-dom@5.17.0
:
/@testing-library/jest-dom@6.0.1(vitest@0.34.2)
:
resolution
:
{
integrity
:
sha512-ynmNeT7asXyH3aSVv4vvX4Rb+0qjOhdNHnO/3vuZNqPmhDpV/+rCSGwQ7bLcmU2cJ4dvoheIO85LQj0IbJHEtg==
}
resolution
:
{
integrity
:
sha512-0hx/AWrJp8EKr8LmC5jrV3Lx8TZySH7McU1Ix2czBPQnLd458CefSEGjZy7w8kaBRA6LhoPkGjoZ3yqSs338IQ==
}
engines
:
{
node
:
'
>=8'
,
npm
:
'
>=6'
,
yarn
:
'
>=1'
}
engines
:
{
node
:
'
>=14'
,
npm
:
'
>=6'
,
yarn
:
'
>=1'
}
peerDependencies
:
'
@jest/globals'
:
'
>=
28'
'
@types/jest'
:
'
>=
28'
jest
:
'
>=
28'
vitest
:
'
>=
0.32'
peerDependenciesMeta
:
'
@jest/globals'
:
optional
:
true
'
@types/jest'
:
optional
:
true
jest
:
optional
:
true
vitest
:
optional
:
true
dependencies
:
dependencies
:
'
@adobe/css-tools'
:
4.2.0
'
@adobe/css-tools'
:
4.2.0
'
@babel/runtime'
:
7.22.6
'
@babel/runtime'
:
7.22.6
'
@types/testing-library__jest-dom'
:
5.14.8
aria-query
:
5.3.0
aria-query
:
5.3.0
chalk
:
3.0.0
chalk
:
3.0.0
css.escape
:
1.5.1
css.escape
:
1.5.1
dom-accessibility-api
:
0.5.16
dom-accessibility-api
:
0.5.16
lodash
:
4.17.21
lodash
:
4.17.21
redent
:
3.0.0
redent
:
3.0.0
vitest
:
0.34.2(jsdom@22.1.0)
dev
:
true
dev
:
true
/@testing-library/react-hooks@8.0.1(react-dom@18.2.0)(react@18.2.0)
:
/@testing-library/react-hooks@8.0.1(react-dom@18.2.0)(react@18.2.0)
:
...
@@ -3957,33 +3947,6 @@ packages:
...
@@ -3957,33 +3947,6 @@ packages:
ci-info
:
3.8.0
ci-info
:
3.8.0
dev
:
false
dev
:
false
/@types/istanbul-lib-coverage@2.0.4
:
resolution
:
{
integrity
:
sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==
}
dev
:
true
/@types/istanbul-lib-report@3.0.0
:
resolution
:
{
integrity
:
sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==
}
dependencies
:
'
@types/istanbul-lib-coverage'
:
2.0.4
dev
:
true
/@types/istanbul-reports@3.0.1
:
resolution
:
{
integrity
:
sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==
}
dependencies
:
'
@types/istanbul-lib-report'
:
3.0.0
dev
:
true
/@types/jest@29.5.3
:
resolution
:
{
integrity
:
sha512-1Nq7YrO/vJE/FYnqYyw0FS8LdrjExSgIiHyKg7xPpn+yi8Q4huZryKnkJatN1ZRH89Kw2v33/8ZMB7DuZeSLlA==
}
dependencies
:
expect
:
29.6.1
pretty-format
:
29.6.1
dev
:
true
/@types/json-schema@7.0.11
:
resolution
:
{
integrity
:
sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==
}
dev
:
true
/@types/json-schema@7.0.12
:
/@types/json-schema@7.0.12
:
resolution
:
{
integrity
:
sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==
}
resolution
:
{
integrity
:
sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==
}
dev
:
true
dev
:
true
...
@@ -4060,16 +4023,16 @@ packages:
...
@@ -4060,16 +4023,16 @@ packages:
resolution
:
{
integrity
:
sha512-Exw4yUWMBXM3X+8oqzJNRqZSwUAaS4+7NdvHqQuFi/d+synz++xmX3QIf+BFqneW8N31R8Ky+sikfZUXq07ggQ==
}
resolution
:
{
integrity
:
sha512-Exw4yUWMBXM3X+8oqzJNRqZSwUAaS4+7NdvHqQuFi/d+synz++xmX3QIf+BFqneW8N31R8Ky+sikfZUXq07ggQ==
}
dev
:
true
dev
:
true
/@types/node@12.20.20
:
resolution
:
{
integrity
:
sha512-kqmxiJg4AT7rsSPIhO6eoBIx9mNwwpeH42yjtgQh6X2ANSpLpvToMXv+LMFdfxpwG1FZXZ41OGZMiUAtbBLEvg==
}
dev
:
true
/@types/node@12.20.55
:
/@types/node@12.20.55
:
resolution
:
{
integrity
:
sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==
}
resolution
:
{
integrity
:
sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==
}
/@types/node@20.5.0
:
/@types/node@20.5.0
:
resolution
:
{
integrity
:
sha512-Mgq7eCtoTjT89FqNoTzzXg2XvCi5VMhRV6+I2aYanc6kQCBImeNaAYRs/DyoVqk1YEUJK5gN9VO7HRIdz4Wo3Q==
}
resolution
:
{
integrity
:
sha512-Mgq7eCtoTjT89FqNoTzzXg2XvCi5VMhRV6+I2aYanc6kQCBImeNaAYRs/DyoVqk1YEUJK5gN9VO7HRIdz4Wo3Q==
}
/@types/node@20.5.3
:
resolution
:
{
integrity
:
sha512-ITI7rbWczR8a/S6qjAW7DMqxqFMjjTo61qZVWJ1ubPvbIQsL5D/TvwjYEalM8Kthpe3hTzOGrF2TGbAu2uyqeA==
}
dev
:
true
/@types/normalize-package-data@2.4.1
:
/@types/normalize-package-data@2.4.1
:
resolution
:
{
integrity
:
sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==
}
resolution
:
{
integrity
:
sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==
}
...
@@ -4165,10 +4128,6 @@ packages:
...
@@ -4165,10 +4128,6 @@ packages:
resolution
:
{
integrity
:
sha512-KQf+QAMWKMrtBMsB8/24w53tEsxllMj6TuA80TT/5igJalLI/zm0L3oXRbIAl4Ohfc85gyHX/jhMwsVkmhLU4A==
}
resolution
:
{
integrity
:
sha512-KQf+QAMWKMrtBMsB8/24w53tEsxllMj6TuA80TT/5igJalLI/zm0L3oXRbIAl4Ohfc85gyHX/jhMwsVkmhLU4A==
}
dev
:
false
dev
:
false
/@types/semver@7.3.13
:
resolution
:
{
integrity
:
sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==
}
dev
:
true
/@types/semver@7.5.0
:
/@types/semver@7.5.0
:
resolution
:
{
integrity
:
sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==
}
resolution
:
{
integrity
:
sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==
}
dev
:
true
dev
:
true
...
@@ -4200,16 +4159,6 @@ packages:
...
@@ -4200,16 +4159,6 @@ packages:
'
@sinonjs/fake-timers'
:
7.1.2
'
@sinonjs/fake-timers'
:
7.1.2
dev
:
true
dev
:
true
/@types/stack-utils@2.0.1
:
resolution
:
{
integrity
:
sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==
}
dev
:
true
/@types/testing-library__jest-dom@5.14.8
:
resolution
:
{
integrity
:
sha512-NRfJE9Cgpmu4fx716q9SYmU4jxxhYRU1BQo239Txt/9N3EC745XZX1Yl7h/SBIDlo1ANVOCRB4YDXjaQdoKCHQ==
}
dependencies
:
'
@types/jest'
:
29.5.3
dev
:
true
/@types/trusted-types@2.0.3
:
/@types/trusted-types@2.0.3
:
resolution
:
{
integrity
:
sha512-NfQ4gyz38SL8sDNrSixxU2Os1a5xcdFxipAFxYEuLUlvU2uDwS4NUpsImcf1//SlWItCVMMLiylsxbmNMToV/g==
}
resolution
:
{
integrity
:
sha512-NfQ4gyz38SL8sDNrSixxU2Os1a5xcdFxipAFxYEuLUlvU2uDwS4NUpsImcf1//SlWItCVMMLiylsxbmNMToV/g==
}
...
@@ -4245,18 +4194,8 @@ packages:
...
@@ -4245,18 +4194,8 @@ packages:
'
@types/node'
:
20.5.0
'
@types/node'
:
20.5.0
dev
:
true
dev
:
true
/@types/yargs-parser@21.0.0
:
/@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.60.1)(eslint@8.47.0)(typescript@5.1.6)
:
resolution
:
{
integrity
:
sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==
}
resolution
:
{
integrity
:
sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==
}
dev
:
true
/@types/yargs@17.0.24
:
resolution
:
{
integrity
:
sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==
}
dependencies
:
'
@types/yargs-parser'
:
21.0.0
dev
:
true
/@typescript-eslint/eslint-plugin@5.60.1(@typescript-eslint/parser@5.60.1)(eslint@8.47.0)(typescript@5.1.6)
:
resolution
:
{
integrity
:
sha512-KSWsVvsJsLJv3c4e73y/Bzt7OpqMCADUO846bHcuWYSYM19bldbAeDv7dYyV0jwkbMfJ2XdlzwjhXtuD7OY6bw==
}
engines
:
{
node
:
^12.22.0 || ^14.17.0 || >=16.0.0
}
engines
:
{
node
:
^12.22.0 || ^14.17.0 || >=16.0.0
}
peerDependencies
:
peerDependencies
:
'
@typescript-eslint/parser'
:
^5.0.0
'
@typescript-eslint/parser'
:
^5.0.0
...
@@ -4266,29 +4205,29 @@ packages:
...
@@ -4266,29 +4205,29 @@ packages:
typescript
:
typescript
:
optional
:
true
optional
:
true
dependencies
:
dependencies
:
'
@eslint-community/regexpp'
:
4.
5.1
'
@eslint-community/regexpp'
:
4.
6.2
'
@typescript-eslint/parser'
:
5.60.1(eslint@8.47.0)(typescript@5.1.6)
'
@typescript-eslint/parser'
:
5.60.1(eslint@8.47.0)(typescript@5.1.6)
'
@typescript-eslint/scope-manager'
:
5.6
0.1
'
@typescript-eslint/scope-manager'
:
5.6
2.0
'
@typescript-eslint/type-utils'
:
5.6
0.1
(eslint@8.47.0)(typescript@5.1.6)
'
@typescript-eslint/type-utils'
:
5.6
2.0
(eslint@8.47.0)(typescript@5.1.6)
'
@typescript-eslint/utils'
:
5.6
0.1
(eslint@8.47.0)(typescript@5.1.6)
'
@typescript-eslint/utils'
:
5.6
2.0
(eslint@8.47.0)(typescript@5.1.6)
debug
:
4.3.4(supports-color@8.1.1)
debug
:
4.3.4(supports-color@8.1.1)
eslint
:
8.47.0
eslint
:
8.47.0
grapheme
-splitter
:
1.0.4
grapheme
r
:
1.4.0
ignore
:
5.2.4
ignore
:
5.2.4
natural-compare-lite
:
1.4.0
natural-compare-lite
:
1.4.0
semver
:
7.5.
3
semver
:
7.5.
4
tsutils
:
3.21.0(typescript@5.1.6)
tsutils
:
3.21.0(typescript@5.1.6)
typescript
:
5.1.6
typescript
:
5.1.6
transitivePeerDependencies
:
transitivePeerDependencies
:
-
supports-color
-
supports-color
dev
:
true
dev
:
true
/@typescript-eslint/eslint-plugin@
6.4
.0(@typescript-eslint/parser@6.4.0)(eslint@8.47.0)(typescript@5.1.6)
:
/@typescript-eslint/eslint-plugin@
5.62
.0(@typescript-eslint/parser@6.4.0)(eslint@8.47.0)(typescript@5.1.6)
:
resolution
:
{
integrity
:
sha512-
62o2Hmc7Gs3p8SLfbXcipjWAa6qk2wZGChXG2JbBtYpwSRmti/9KHLqfbLs9uDigOexG+3PaQ9G2g3201FWLK
g==
}
resolution
:
{
integrity
:
sha512-
TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXa
g==
}
engines
:
{
node
:
^1
6.0.0 || >=18
.0.0
}
engines
:
{
node
:
^1
2.22.0 || ^14.17.0 || >=16
.0.0
}
peerDependencies
:
peerDependencies
:
'
@typescript-eslint/parser'
:
^
6.0.0 || ^6.0.0-alpha
'
@typescript-eslint/parser'
:
^
5.0.0
eslint
:
^7.0.0 || ^8.0.0
eslint
:
^
6.0.0 || ^
7.0.0 || ^8.0.0
typescript
:
'
*'
typescript
:
'
*'
peerDependenciesMeta
:
peerDependenciesMeta
:
typescript
:
typescript
:
...
@@ -4296,17 +4235,16 @@ packages:
...
@@ -4296,17 +4235,16 @@ packages:
dependencies
:
dependencies
:
'
@eslint-community/regexpp'
:
4.6.2
'
@eslint-community/regexpp'
:
4.6.2
'
@typescript-eslint/parser'
:
6.4.0(eslint@8.47.0)(typescript@5.1.6)
'
@typescript-eslint/parser'
:
6.4.0(eslint@8.47.0)(typescript@5.1.6)
'
@typescript-eslint/scope-manager'
:
6.4.0
'
@typescript-eslint/scope-manager'
:
5.62.0
'
@typescript-eslint/type-utils'
:
6.4.0(eslint@8.47.0)(typescript@5.1.6)
'
@typescript-eslint/type-utils'
:
5.62.0(eslint@8.47.0)(typescript@5.1.6)
'
@typescript-eslint/utils'
:
6.4.0(eslint@8.47.0)(typescript@5.1.6)
'
@typescript-eslint/utils'
:
5.62.0(eslint@8.47.0)(typescript@5.1.6)
'
@typescript-eslint/visitor-keys'
:
6.4.0
debug
:
4.3.4(supports-color@8.1.1)
debug
:
4.3.4(supports-color@8.1.1)
eslint
:
8.47.0
eslint
:
8.47.0
graphemer
:
1.4.0
graphemer
:
1.4.0
ignore
:
5.2.4
ignore
:
5.2.4
natural-compare
:
1.4.0
natural-compare
-lite
:
1.4.0
semver
:
7.5.4
semver
:
7.5.4
ts
-api-utils
:
1.0.1
(typescript@5.1.6)
ts
utils
:
3.21.0
(typescript@5.1.6)
typescript
:
5.1.6
typescript
:
5.1.6
transitivePeerDependencies
:
transitivePeerDependencies
:
-
supports-color
-
supports-color
...
@@ -4361,6 +4299,14 @@ packages:
...
@@ -4361,6 +4299,14 @@ packages:
'
@typescript-eslint/visitor-keys'
:
5.60.1
'
@typescript-eslint/visitor-keys'
:
5.60.1
dev
:
true
dev
:
true
/@typescript-eslint/scope-manager@5.62.0
:
resolution
:
{
integrity
:
sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==
}
engines
:
{
node
:
^12.22.0 || ^14.17.0 || >=16.0.0
}
dependencies
:
'
@typescript-eslint/types'
:
5.62.0
'
@typescript-eslint/visitor-keys'
:
5.62.0
dev
:
true
/@typescript-eslint/scope-manager@6.4.0
:
/@typescript-eslint/scope-manager@6.4.0
:
resolution
:
{
integrity
:
sha512-TUS7vaKkPWDVvl7GDNHFQMsMruD+zhkd3SdVW0d7b+7Zo+bd/hXJQ8nsiUZMi1jloWo6c9qt3B7Sqo+flC1nig==
}
resolution
:
{
integrity
:
sha512-TUS7vaKkPWDVvl7GDNHFQMsMruD+zhkd3SdVW0d7b+7Zo+bd/hXJQ8nsiUZMi1jloWo6c9qt3B7Sqo+flC1nig==
}
engines
:
{
node
:
^16.0.0 || >=18.0.0
}
engines
:
{
node
:
^16.0.0 || >=18.0.0
}
...
@@ -4369,8 +4315,8 @@ packages:
...
@@ -4369,8 +4315,8 @@ packages:
'
@typescript-eslint/visitor-keys'
:
6.4.0
'
@typescript-eslint/visitor-keys'
:
6.4.0
dev
:
true
dev
:
true
/@typescript-eslint/type-utils@5.6
0.1
(eslint@8.47.0)(typescript@5.1.6)
:
/@typescript-eslint/type-utils@5.6
2.0
(eslint@8.47.0)(typescript@5.1.6)
:
resolution
:
{
integrity
:
sha512-
vN6UztYqIu05nu7JqwQGzQKUJctzs3/Hg7E2Yx8rz9J+4LgtIDFWjjl1gm3pycH0P3mHAcEUBd23LVgfrsTR8A
==
}
resolution
:
{
integrity
:
sha512-
xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew
==
}
engines
:
{
node
:
^12.22.0 || ^14.17.0 || >=16.0.0
}
engines
:
{
node
:
^12.22.0 || ^14.17.0 || >=16.0.0
}
peerDependencies
:
peerDependencies
:
eslint
:
'
*'
eslint
:
'
*'
...
@@ -4379,8 +4325,8 @@ packages:
...
@@ -4379,8 +4325,8 @@ packages:
typescript
:
typescript
:
optional
:
true
optional
:
true
dependencies
:
dependencies
:
'
@typescript-eslint/typescript-estree'
:
5.6
0.1
(typescript@5.1.6)
'
@typescript-eslint/typescript-estree'
:
5.6
2.0
(typescript@5.1.6)
'
@typescript-eslint/utils'
:
5.6
0.1
(eslint@8.47.0)(typescript@5.1.6)
'
@typescript-eslint/utils'
:
5.6
2.0
(eslint@8.47.0)(typescript@5.1.6)
debug
:
4.3.4(supports-color@8.1.1)
debug
:
4.3.4(supports-color@8.1.1)
eslint
:
8.47.0
eslint
:
8.47.0
tsutils
:
3.21.0(typescript@5.1.6)
tsutils
:
3.21.0(typescript@5.1.6)
...
@@ -4389,31 +4335,16 @@ packages:
...
@@ -4389,31 +4335,16 @@ packages:
-
supports-color
-
supports-color
dev
:
true
dev
:
true
/@typescript-eslint/type-utils@6.4.0(eslint@8.47.0)(typescript@5.1.6)
:
resolution
:
{
integrity
:
sha512-TvqrUFFyGY0cX3WgDHcdl2/mMCWCDv/0thTtx/ODMY1QhEiyFtv/OlLaNIiYLwRpAxAtOLOY9SUf1H3Q3dlwAg==
}
engines
:
{
node
:
^16.0.0 || >=18.0.0
}
peerDependencies
:
eslint
:
^7.0.0 || ^8.0.0
typescript
:
'
*'
peerDependenciesMeta
:
typescript
:
optional
:
true
dependencies
:
'
@typescript-eslint/typescript-estree'
:
6.4.0(typescript@5.1.6)
'
@typescript-eslint/utils'
:
6.4.0(eslint@8.47.0)(typescript@5.1.6)
debug
:
4.3.4(supports-color@8.1.1)
eslint
:
8.47.0
ts-api-utils
:
1.0.1(typescript@5.1.6)
typescript
:
5.1.6
transitivePeerDependencies
:
-
supports-color
dev
:
true
/@typescript-eslint/types@5.60.1
:
/@typescript-eslint/types@5.60.1
:
resolution
:
{
integrity
:
sha512-zDcDx5fccU8BA0IDZc71bAtYIcG9PowaOwaD8rjYbqwK7dpe/UMQl3inJ4UtUK42nOCT41jTSCwg76E62JpMcg==
}
resolution
:
{
integrity
:
sha512-zDcDx5fccU8BA0IDZc71bAtYIcG9PowaOwaD8rjYbqwK7dpe/UMQl3inJ4UtUK42nOCT41jTSCwg76E62JpMcg==
}
engines
:
{
node
:
^12.22.0 || ^14.17.0 || >=16.0.0
}
engines
:
{
node
:
^12.22.0 || ^14.17.0 || >=16.0.0
}
dev
:
true
dev
:
true
/@typescript-eslint/types@5.62.0
:
resolution
:
{
integrity
:
sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==
}
engines
:
{
node
:
^12.22.0 || ^14.17.0 || >=16.0.0
}
dev
:
true
/@typescript-eslint/types@6.4.0
:
/@typescript-eslint/types@6.4.0
:
resolution
:
{
integrity
:
sha512-+FV9kVFrS7w78YtzkIsNSoYsnOtrYVnKWSTVXoL1761CsCRv5wpDOINgsXpxD67YCLZtVQekDDyaxfjVWUJmmg==
}
resolution
:
{
integrity
:
sha512-+FV9kVFrS7w78YtzkIsNSoYsnOtrYVnKWSTVXoL1761CsCRv5wpDOINgsXpxD67YCLZtVQekDDyaxfjVWUJmmg==
}
engines
:
{
node
:
^16.0.0 || >=18.0.0
}
engines
:
{
node
:
^16.0.0 || >=18.0.0
}
...
@@ -4440,6 +4371,27 @@ packages:
...
@@ -4440,6 +4371,27 @@ packages:
-
supports-color
-
supports-color
dev
:
true
dev
:
true
/@typescript-eslint/typescript-estree@5.62.0(typescript@5.1.6)
:
resolution
:
{
integrity
:
sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==
}
engines
:
{
node
:
^12.22.0 || ^14.17.0 || >=16.0.0
}
peerDependencies
:
typescript
:
'
*'
peerDependenciesMeta
:
typescript
:
optional
:
true
dependencies
:
'
@typescript-eslint/types'
:
5.62.0
'
@typescript-eslint/visitor-keys'
:
5.62.0
debug
:
4.3.4(supports-color@8.1.1)
globby
:
11.1.0
is-glob
:
4.0.3
semver
:
7.5.4
tsutils
:
3.21.0(typescript@5.1.6)
typescript
:
5.1.6
transitivePeerDependencies
:
-
supports-color
dev
:
true
/@typescript-eslint/typescript-estree@6.4.0(typescript@5.1.6)
:
/@typescript-eslint/typescript-estree@6.4.0(typescript@5.1.6)
:
resolution
:
{
integrity
:
sha512-iDPJArf/K2sxvjOR6skeUCNgHR/tCQXBsa+ee1/clRKr3olZjZ/dSkXPZjG6YkPtnW6p5D1egeEPMCW6Gn4yLA==
}
resolution
:
{
integrity
:
sha512-iDPJArf/K2sxvjOR6skeUCNgHR/tCQXBsa+ee1/clRKr3olZjZ/dSkXPZjG6YkPtnW6p5D1egeEPMCW6Gn4yLA==
}
engines
:
{
node
:
^16.0.0 || >=18.0.0
}
engines
:
{
node
:
^16.0.0 || >=18.0.0
}
...
@@ -4461,39 +4413,20 @@ packages:
...
@@ -4461,39 +4413,20 @@ packages:
-
supports-color
-
supports-color
dev
:
true
dev
:
true
/@typescript-eslint/utils@5.6
0.1
(eslint@8.47.0)(typescript@5.1.6)
:
/@typescript-eslint/utils@5.6
2.0
(eslint@8.47.0)(typescript@5.1.6)
:
resolution
:
{
integrity
:
sha512-
tiJ7FFdFQOWssFa3gqb94Ilexyw0JVxj6vBzaSpfN/8IhoKkDuSAenUKvsSHw2A/TMpJb26izIszTXaqygkvp
Q==
}
resolution
:
{
integrity
:
sha512-
n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWA
Q==
}
engines
:
{
node
:
^12.22.0 || ^14.17.0 || >=16.0.0
}
engines
:
{
node
:
^12.22.0 || ^14.17.0 || >=16.0.0
}
peerDependencies
:
peerDependencies
:
eslint
:
^6.0.0 || ^7.0.0 || ^8.0.0
eslint
:
^6.0.0 || ^7.0.0 || ^8.0.0
dependencies
:
'
@eslint-community/eslint-utils'
:
4.4.0(eslint@8.47.0)
'
@types/json-schema'
:
7.0.11
'
@types/semver'
:
7.3.13
'
@typescript-eslint/scope-manager'
:
5.60.1
'
@typescript-eslint/types'
:
5.60.1
'
@typescript-eslint/typescript-estree'
:
5.60.1(typescript@5.1.6)
eslint
:
8.47.0
eslint-scope
:
5.1.1
semver
:
7.5.4
transitivePeerDependencies
:
-
supports-color
-
typescript
dev
:
true
/@typescript-eslint/utils@6.4.0(eslint@8.47.0)(typescript@5.1.6)
:
resolution
:
{
integrity
:
sha512-BvvwryBQpECPGo8PwF/y/q+yacg8Hn/2XS+DqL/oRsOPK+RPt29h5Ui5dqOKHDlbXrAeHUTnyG3wZA0KTDxRZw==
}
engines
:
{
node
:
^16.0.0 || >=18.0.0
}
peerDependencies
:
eslint
:
^7.0.0 || ^8.0.0
dependencies
:
dependencies
:
'
@eslint-community/eslint-utils'
:
4.4.0(eslint@8.47.0)
'
@eslint-community/eslint-utils'
:
4.4.0(eslint@8.47.0)
'
@types/json-schema'
:
7.0.12
'
@types/json-schema'
:
7.0.12
'
@types/semver'
:
7.5.0
'
@types/semver'
:
7.5.0
'
@typescript-eslint/scope-manager'
:
6.4
.0
'
@typescript-eslint/scope-manager'
:
5.62
.0
'
@typescript-eslint/types'
:
6.4
.0
'
@typescript-eslint/types'
:
5.62
.0
'
@typescript-eslint/typescript-estree'
:
6.4
.0(typescript@5.1.6)
'
@typescript-eslint/typescript-estree'
:
5.62
.0(typescript@5.1.6)
eslint
:
8.47.0
eslint
:
8.47.0
eslint-scope
:
5.1.1
semver
:
7.5.4
semver
:
7.5.4
transitivePeerDependencies
:
transitivePeerDependencies
:
-
supports-color
-
supports-color
...
@@ -4508,6 +4441,14 @@ packages:
...
@@ -4508,6 +4441,14 @@ packages:
eslint-visitor-keys
:
3.4.3
eslint-visitor-keys
:
3.4.3
dev
:
true
dev
:
true
/@typescript-eslint/visitor-keys@5.62.0
:
resolution
:
{
integrity
:
sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==
}
engines
:
{
node
:
^12.22.0 || ^14.17.0 || >=16.0.0
}
dependencies
:
'
@typescript-eslint/types'
:
5.62.0
eslint-visitor-keys
:
3.4.3
dev
:
true
/@typescript-eslint/visitor-keys@6.4.0
:
/@typescript-eslint/visitor-keys@6.4.0
:
resolution
:
{
integrity
:
sha512-yJSfyT+uJm+JRDWYRYdCm2i+pmvXJSMtPR9Cq5/XQs4QIgNoLcoRtDdzsLbLsFM/c6um6ohQkg/MLxWvoIndJA==
}
resolution
:
{
integrity
:
sha512-yJSfyT+uJm+JRDWYRYdCm2i+pmvXJSMtPR9Cq5/XQs4QIgNoLcoRtDdzsLbLsFM/c6um6ohQkg/MLxWvoIndJA==
}
engines
:
{
node
:
^16.0.0 || >=18.0.0
}
engines
:
{
node
:
^16.0.0 || >=18.0.0
}
...
@@ -5629,6 +5570,13 @@ packages:
...
@@ -5629,6 +5570,13 @@ packages:
type-fest
:
0.21.3
type-fest
:
0.21.3
dev
:
true
dev
:
true
/ansi-escapes@5.0.0
:
resolution
:
{
integrity
:
sha512-5GFMVX8HqE/TB+FuBJGuO5XG0WrsA6ptUqoODaT/n9mmUaZFkqnBueB4leqGBCmrUHnCnC4PCZTCd0E7QQ83bA==
}
engines
:
{
node
:
'
>=12'
}
dependencies
:
type-fest
:
1.4.0
dev
:
true
/ansi-regex@2.1.1
:
/ansi-regex@2.1.1
:
resolution
:
{
integrity
:
sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==
}
resolution
:
{
integrity
:
sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==
}
engines
:
{
node
:
'
>=0.10.0'
}
engines
:
{
node
:
'
>=0.10.0'
}
...
@@ -5859,11 +5807,6 @@ packages:
...
@@ -5859,11 +5807,6 @@ packages:
/assertion-error@1.1.0
:
/assertion-error@1.1.0
:
resolution
:
{
integrity
:
sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==
}
resolution
:
{
integrity
:
sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==
}
/astral-regex@2.0.0
:
resolution
:
{
integrity
:
sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==
}
engines
:
{
node
:
'
>=8'
}
dev
:
true
/async-eventemitter@0.2.4
:
/async-eventemitter@0.2.4
:
resolution
:
{
integrity
:
sha512-pd20BwL7Yt1zwDFy+8MX8F1+WCT8aQeKj0kQnTrH9WaeRETlRamVhD0JtRPmrV4GfOJ2F9CvdQkZeZhnh2TuHw==
}
resolution
:
{
integrity
:
sha512-pd20BwL7Yt1zwDFy+8MX8F1+WCT8aQeKj0kQnTrH9WaeRETlRamVhD0JtRPmrV4GfOJ2F9CvdQkZeZhnh2TuHw==
}
dependencies
:
dependencies
:
...
@@ -6564,12 +6507,12 @@ packages:
...
@@ -6564,12 +6507,12 @@ packages:
colors
:
1.0.3
colors
:
1.0.3
dev
:
false
dev
:
false
/cli-truncate@
2
.1.0
:
/cli-truncate@
3
.1.0
:
resolution
:
{
integrity
:
sha512-
n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg
==
}
resolution
:
{
integrity
:
sha512-
wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA
==
}
engines
:
{
node
:
'
>=8'
}
engines
:
{
node
:
^12.20.0 || ^14.13.1 || >=16.0.0
}
dependencies
:
dependencies
:
slice-ansi
:
3
.0.0
slice-ansi
:
5
.0.0
string-width
:
4.2.3
string-width
:
5.1.2
dev
:
true
dev
:
true
/cli-width@3.0.0
:
/cli-width@3.0.0
:
...
@@ -6657,8 +6600,8 @@ packages:
...
@@ -6657,8 +6600,8 @@ packages:
hasBin
:
true
hasBin
:
true
dev
:
true
dev
:
true
/colorette@
1.3.
0
:
/colorette@
2.0.2
0
:
resolution
:
{
integrity
:
sha512-
ecORCqbSFP7Wm8Y6lyqMJjexBQqXSF7SSeaTyGGphogUjBlFP9m9o08wy86HL2uB7fMTxtOUzLMk7ogKcxMg1
w==
}
resolution
:
{
integrity
:
sha512-
IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2
w==
}
dev
:
true
dev
:
true
/colors@1.0.3
:
/colors@1.0.3
:
...
@@ -6707,7 +6650,6 @@ packages:
...
@@ -6707,7 +6650,6 @@ packages:
/commander@11.0.0
:
/commander@11.0.0
:
resolution
:
{
integrity
:
sha512-9HMlXtt/BNoYr8ooyjjNRdIilOTkVJXB+GhxMTtOKwk0R4j4lS4NpjuqmRxroBfnfTSHQIHQB7wryHhXarNjmQ==
}
resolution
:
{
integrity
:
sha512-9HMlXtt/BNoYr8ooyjjNRdIilOTkVJXB+GhxMTtOKwk0R4j4lS4NpjuqmRxroBfnfTSHQIHQB7wryHhXarNjmQ==
}
engines
:
{
node
:
'
>=16'
}
engines
:
{
node
:
'
>=16'
}
dev
:
false
/commander@2.20.3
:
/commander@2.20.3
:
resolution
:
{
integrity
:
sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==
}
resolution
:
{
integrity
:
sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==
}
...
@@ -6721,11 +6663,6 @@ packages:
...
@@ -6721,11 +6663,6 @@ packages:
engines
:
{
node
:
'
>=
6'
}
engines
:
{
node
:
'
>=
6'
}
dev
:
true
dev
:
true
/commander@7.2.0
:
resolution
:
{
integrity
:
sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==
}
engines
:
{
node
:
'
>=
10'
}
dev
:
true
/commander@8.3.0
:
/commander@8.3.0
:
resolution
:
{
integrity
:
sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==
}
resolution
:
{
integrity
:
sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==
}
engines
:
{
node
:
'
>=
12'
}
engines
:
{
node
:
'
>=
12'
}
...
@@ -7998,11 +7935,6 @@ packages:
...
@@ -7998,11 +7935,6 @@ packages:
resolution
:
{
integrity
:
sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==
}
resolution
:
{
integrity
:
sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==
}
engines
:
{
node
:
'
>=0.8.0'
}
engines
:
{
node
:
'
>=0.8.0'
}
/escape-string-regexp@2.0.0
:
resolution
:
{
integrity
:
sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==
}
engines
:
{
node
:
'
>=8'
}
dev
:
true
/escape-string-regexp@4.0.0
:
/escape-string-regexp@4.0.0
:
resolution
:
{
integrity
:
sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==
}
resolution
:
{
integrity
:
sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==
}
engines
:
{
node
:
'
>=10'
}
engines
:
{
node
:
'
>=10'
}
...
@@ -8159,9 +8091,9 @@ packages:
...
@@ -8159,9 +8091,9 @@ packages:
eslint
:
8.47.0
eslint
:
8.47.0
dev
:
true
dev
:
true
/eslint-plugin-prettier@4.
0.0
(eslint-config-prettier@8.3.0)(eslint@8.47.0)(prettier@2.8.8)
:
/eslint-plugin-prettier@4.
2.1
(eslint-config-prettier@8.3.0)(eslint@8.47.0)(prettier@2.8.8)
:
resolution
:
{
integrity
:
sha512-
98MqmCJ7vJodoQK359bqQWaxOE0CS8paAz/GgjaZLyex4TTk3g9HugoO89EqWCrFiOqn9EVvcoo7gZzONCWVw
Q==
}
resolution
:
{
integrity
:
sha512-
f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7Qy
Q==
}
engines
:
{
node
:
'
>=
6
.0.0'
}
engines
:
{
node
:
'
>=
12
.0.0'
}
peerDependencies
:
peerDependencies
:
eslint
:
'
>=7.28.0'
eslint
:
'
>=7.28.0'
eslint-config-prettier
:
'
*'
eslint-config-prettier
:
'
*'
...
@@ -8579,6 +8511,10 @@ packages:
...
@@ -8579,6 +8511,10 @@ packages:
/eventemitter3@4.0.7
:
/eventemitter3@4.0.7
:
resolution
:
{
integrity
:
sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==
}
resolution
:
{
integrity
:
sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==
}
/eventemitter3@5.0.1
:
resolution
:
{
integrity
:
sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==
}
dev
:
true
/events@3.3.0
:
/events@3.3.0
:
resolution
:
{
integrity
:
sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==
}
resolution
:
{
integrity
:
sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==
}
engines
:
{
node
:
'
>=0.8.x'
}
engines
:
{
node
:
'
>=0.8.x'
}
...
@@ -8648,16 +8584,19 @@ packages:
...
@@ -8648,16 +8584,19 @@ packages:
strip-final-newline
:
3.0.0
strip-final-newline
:
3.0.0
dev
:
true
dev
:
true
/ex
pect@29.6.1
:
/ex
eca@7.2.0
:
resolution
:
{
integrity
:
sha512-
XEdDLonERCU1n9uR56/Stx9OqojaLAQtZf9PrCHH9Hl8YXiEIka3H4NXJ3NOIBmQJTg7+j7buh34PMHfJujc8g
==
}
resolution
:
{
integrity
:
sha512-
UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA
==
}
engines
:
{
node
:
^14.1
5.0 || ^16.10
.0 || >=18.0.0
}
engines
:
{
node
:
^14.1
8.0 || ^16.14
.0 || >=18.0.0
}
dependencies
:
dependencies
:
'
@jest/expect-utils'
:
29.6.1
cross-spawn
:
7.0.3
'
@types/node'
:
20.5.0
get-stream
:
6.0.1
jest-get-type
:
29.4.3
human-signals
:
4.3.1
jest-matcher-utils
:
29.6.1
is-stream
:
3.0.0
jest-message-util
:
29.6.1
merge-stream
:
2.0.0
jest-util
:
29.6.1
npm-run-path
:
5.1.0
onetime
:
6.0.0
signal-exit
:
3.0.7
strip-final-newline
:
3.0.0
dev
:
true
dev
:
true
/exponential-backoff@3.1.1
:
/exponential-backoff@3.1.1
:
...
@@ -9225,10 +9164,6 @@ packages:
...
@@ -9225,10 +9164,6 @@ packages:
has-proto
:
1.0.1
has-proto
:
1.0.1
has-symbols
:
1.0.3
has-symbols
:
1.0.3
/get-own-enumerable-property-symbols@3.0.2
:
resolution
:
{
integrity
:
sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==
}
dev
:
true
/get-package-type@0.1.0
:
/get-package-type@0.1.0
:
resolution
:
{
integrity
:
sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==
}
resolution
:
{
integrity
:
sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==
}
engines
:
{
node
:
'
>=8.0.0'
}
engines
:
{
node
:
'
>=8.0.0'
}
...
@@ -9493,6 +9428,7 @@ packages:
...
@@ -9493,6 +9428,7 @@ packages:
/grapheme-splitter@1.0.4
:
/grapheme-splitter@1.0.4
:
resolution
:
{
integrity
:
sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==
}
resolution
:
{
integrity
:
sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==
}
dev
:
false
/graphemer@1.4.0
:
/graphemer@1.4.0
:
resolution
:
{
integrity
:
sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==
}
resolution
:
{
integrity
:
sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==
}
...
@@ -9811,6 +9747,11 @@ packages:
...
@@ -9811,6 +9747,11 @@ packages:
engines
:
{
node
:
'
>=12.20.0'
}
engines
:
{
node
:
'
>=12.20.0'
}
dev
:
true
dev
:
true
/human-signals@4.3.1
:
resolution
:
{
integrity
:
sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==
}
engines
:
{
node
:
'
>=14.18.0'
}
dev
:
true
/humanize-ms@1.2.1
:
/humanize-ms@1.2.1
:
resolution
:
{
integrity
:
sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==
}
resolution
:
{
integrity
:
sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==
}
dependencies
:
dependencies
:
...
@@ -10098,6 +10039,11 @@ packages:
...
@@ -10098,6 +10039,11 @@ packages:
resolution
:
{
integrity
:
sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==
}
resolution
:
{
integrity
:
sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==
}
engines
:
{
node
:
'
>=8'
}
engines
:
{
node
:
'
>=8'
}
/is-fullwidth-code-point@4.0.0
:
resolution
:
{
integrity
:
sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==
}
engines
:
{
node
:
'
>=12'
}
dev
:
true
/is-generator-function@1.0.10
:
/is-generator-function@1.0.10
:
resolution
:
{
integrity
:
sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==
}
resolution
:
{
integrity
:
sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==
}
engines
:
{
node
:
'
>=
0.4'
}
engines
:
{
node
:
'
>=
0.4'
}
...
@@ -10164,11 +10110,6 @@ packages:
...
@@ -10164,11 +10110,6 @@ packages:
resolution
:
{
integrity
:
sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==
}
resolution
:
{
integrity
:
sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==
}
engines
:
{
node
:
'
>=0.12.0'
}
engines
:
{
node
:
'
>=0.12.0'
}
/is-obj@1.0.1
:
resolution
:
{
integrity
:
sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==
}
engines
:
{
node
:
'
>=0.10.0'
}
dev
:
true
/is-obj@2.0.0
:
/is-obj@2.0.0
:
resolution
:
{
integrity
:
sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==
}
resolution
:
{
integrity
:
sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==
}
engines
:
{
node
:
'
>=8'
}
engines
:
{
node
:
'
>=8'
}
...
@@ -10215,11 +10156,6 @@ packages:
...
@@ -10215,11 +10156,6 @@ packages:
call-bind
:
1.0.2
call-bind
:
1.0.2
has-tostringtag
:
1.0.0
has-tostringtag
:
1.0.0
/is-regexp@1.0.0
:
resolution
:
{
integrity
:
sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==
}
engines
:
{
node
:
'
>=0.10.0'
}
dev
:
true
/is-set@2.0.2
:
/is-set@2.0.2
:
resolution
:
{
integrity
:
sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==
}
resolution
:
{
integrity
:
sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==
}
dev
:
false
dev
:
false
...
@@ -10556,43 +10492,6 @@ packages:
...
@@ -10556,43 +10492,6 @@ packages:
engines
:
{
node
:
^14.15.0 || ^16.10.0 || >=18.0.0
}
engines
:
{
node
:
^14.15.0 || ^16.10.0 || >=18.0.0
}
dev
:
true
dev
:
true
/jest-matcher-utils@29.6.1
:
resolution
:
{
integrity
:
sha512-SLaztw9d2mfQQKHmJXKM0HCbl2PPVld/t9Xa6P9sgiExijviSp7TnZZpw2Fpt+OI3nwUO/slJbOfzfUMKKC5QA==
}
engines
:
{
node
:
^14.15.0 || ^16.10.0 || >=18.0.0
}
dependencies
:
chalk
:
4.1.2
jest-diff
:
29.6.1
jest-get-type
:
29.4.3
pretty-format
:
29.6.1
dev
:
true
/jest-message-util@29.6.1
:
resolution
:
{
integrity
:
sha512-KoAW2zAmNSd3Gk88uJ56qXUWbFk787QKmjjJVOjtGFmmGSZgDBrlIL4AfQw1xyMYPNVD7dNInfIbur9B2rd/wQ==
}
engines
:
{
node
:
^14.15.0 || ^16.10.0 || >=18.0.0
}
dependencies
:
'
@babel/code-frame'
:
7.22.10
'
@jest/types'
:
29.6.1
'
@types/stack-utils'
:
2.0.1
chalk
:
4.1.2
graceful-fs
:
4.2.11
micromatch
:
4.0.5
pretty-format
:
29.6.1
slash
:
3.0.0
stack-utils
:
2.0.6
dev
:
true
/jest-util@29.6.1
:
resolution
:
{
integrity
:
sha512-NRFCcjc+/uO3ijUVyNOQJluf8PtGCe/W6cix36+M3cTFgiYqFOOW5MgN4JOOcvbUhcKTYVd1CvHz/LWi8d16Mg==
}
engines
:
{
node
:
^14.15.0 || ^16.10.0 || >=18.0.0
}
dependencies
:
'
@jest/types'
:
29.6.1
'
@types/node'
:
20.5.0
chalk
:
4.1.2
ci-info
:
3.8.0
graceful-fs
:
4.2.11
picomatch
:
2.3.1
dev
:
true
/joycon@3.1.1
:
/joycon@3.1.1
:
resolution
:
{
integrity
:
sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==
}
resolution
:
{
integrity
:
sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==
}
engines
:
{
node
:
'
>=10'
}
engines
:
{
node
:
'
>=10'
}
...
@@ -10859,7 +10758,7 @@ packages:
...
@@ -10859,7 +10758,7 @@ packages:
'
@lerna/child-process'
:
7.1.5
'
@lerna/child-process'
:
7.1.5
'
@lerna/create'
:
7.1.5
'
@lerna/create'
:
7.1.5
'
@npmcli/run-script'
:
6.0.2
'
@npmcli/run-script'
:
6.0.2
'
@nx/devkit'
:
16.7.1(nx@16.7.
2
)
'
@nx/devkit'
:
16.7.1(nx@16.7.
3
)
'
@octokit/plugin-enterprise-rest'
:
6.0.1
'
@octokit/plugin-enterprise-rest'
:
6.0.1
'
@octokit/rest'
:
19.0.11
'
@octokit/rest'
:
19.0.11
byte-size
:
8.1.1
byte-size
:
8.1.1
...
@@ -10902,7 +10801,7 @@ packages:
...
@@ -10902,7 +10801,7 @@ packages:
npm-packlist
:
5.1.1
npm-packlist
:
5.1.1
npm-registry-fetch
:
14.0.5
npm-registry-fetch
:
14.0.5
npmlog
:
6.0.2
npmlog
:
6.0.2
nx
:
16.7.
2
nx
:
16.7.
3
p-map
:
4.0.0
p-map
:
4.0.0
p-map-series
:
2.1.0
p-map-series
:
2.1.0
p-pipe
:
3.1.0
p-pipe
:
3.1.0
...
@@ -11086,43 +10985,41 @@ packages:
...
@@ -11086,43 +10985,41 @@ packages:
uc.micro
:
1.0.6
uc.micro
:
1.0.6
dev
:
true
dev
:
true
/lint-staged@11.0.0
:
/lint-staged@14.0.1
:
resolution
:
{
integrity
:
sha512-3rsRIoyaE8IphSUtO1RVTFl1e0SLBtxxUOPBtHxQgBHS5/i6nqvjcUfNioMa4BU9yGnPzbO+xkfLtXtxBpCzjw==
}
resolution
:
{
integrity
:
sha512-Mw0cL6HXnHN1ag0mN/Dg4g6sr8uf8sn98w2Oc1ECtFto9tvRF7nkXGJRbx8gPlHyoR0pLyBr2lQHbWwmUHe1Sw==
}
engines
:
{
node
:
^16.14.0 || >=18.0.0
}
hasBin
:
true
hasBin
:
true
dependencies
:
dependencies
:
chalk
:
4.1.2
chalk
:
5.3.0
cli-truncate
:
2.1.0
commander
:
11.0.0
commander
:
7.2.0
cosmiconfig
:
7.0.1
debug
:
4.3.4(supports-color@8.1.1)
debug
:
4.3.4(supports-color@8.1.1)
dedent
:
0.7.0
execa
:
7.2.0
enquirer
:
2.3.6
lilconfig
:
2.1.0
execa
:
5.1.1
listr2
:
6.6.1
listr2
:
3.11.0(enquirer@2.3.6)
micromatch
:
4.0.5
log-symbols
:
4.1.0
pidtree
:
0.6.0
micromatch
:
4.0.4
string-argv
:
0.3.2
normalize-path
:
3.0.0
yaml
:
2.3.1
please-upgrade-node
:
3.2.0
string-argv
:
0.3.1
stringify-object
:
3.3.0
transitivePeerDependencies
:
transitivePeerDependencies
:
-
enquirer
-
supports-color
-
supports-color
dev
:
true
dev
:
true
/listr2@
3.11.0(enquirer@2.3.6)
:
/listr2@
6.6.1
:
resolution
:
{
integrity
:
sha512-
XLJVe2JgXCyQTa3FbSv11lkKExYmEyA4jltVo8z4FX10Vt1Yj8IMekBfwim0BSOM9uj1QMTJvDQQpHyuPbB/dQ
==
}
resolution
:
{
integrity
:
sha512-
+rAXGHh0fkEWdXBmX+L6mmfmXmXvDGEKzkjxO+8mP3+nI/r/CWznVBvsibXdxda9Zz0OW2e2ikphN3OwCT/jSg
==
}
engines
:
{
node
:
'
>=1
0
.0.0'
}
engines
:
{
node
:
'
>=1
6
.0.0'
}
peerDependencies
:
peerDependencies
:
enquirer
:
'
>=
2.3.0
<
3'
enquirer
:
'
>=
2.3.0
<
3'
peerDependenciesMeta
:
enquirer
:
optional
:
true
dependencies
:
dependencies
:
cli-truncate
:
2.1.0
cli-truncate
:
3.1.0
colorette
:
1.3.0
colorette
:
2.0.20
enquirer
:
2.3.6
eventemitter3
:
5.0.1
log-update
:
4.0.0
log-update
:
5.0.1
p-map
:
4.0.0
rfdc
:
1.3.0
rxjs
:
6.6.7
wrap-ansi
:
8.1.0
through
:
2.3.8
wrap-ansi
:
7.0.0
dev
:
true
dev
:
true
/lit-element@3.3.2
:
/lit-element@3.3.2
:
...
@@ -11272,14 +11169,15 @@ packages:
...
@@ -11272,14 +11169,15 @@ packages:
is-unicode-supported
:
1.3.0
is-unicode-supported
:
1.3.0
dev
:
true
dev
:
true
/log-update@
4.0.0
:
/log-update@
5.0.1
:
resolution
:
{
integrity
:
sha512-
9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg
==
}
resolution
:
{
integrity
:
sha512-
5UtUDQ/6edw4ofyljDNcOVJQ4c7OjDro4h3y8e1GQL5iYElYclVHJ3zeWchylvMaKnDbDilC8irOVyexnA/Slw
==
}
engines
:
{
node
:
'
>=10'
}
engines
:
{
node
:
^12.20.0 || ^14.13.1 || >=16.0.0
}
dependencies
:
dependencies
:
ansi-escapes
:
4.3.2
ansi-escapes
:
5.0.0
cli-cursor
:
3.1.0
cli-cursor
:
4.0.0
slice-ansi
:
4.0.0
slice-ansi
:
5.0.0
wrap-ansi
:
6.2.0
strip-ansi
:
7.1.0
wrap-ansi
:
8.1.0
dev
:
true
dev
:
true
/longest-streak@2.0.4
:
/longest-streak@2.0.4
:
...
@@ -12529,8 +12427,8 @@ packages:
...
@@ -12529,8 +12427,8 @@ packages:
-
debug
-
debug
dev
:
true
dev
:
true
/nx@16.7.
2
:
/nx@16.7.
3
:
resolution
:
{
integrity
:
sha512-
T7cRC97qJ4H9fg498ZGwFQaTzJdLQaRp6DFUwzFo1B9qzR56A2tA3HBvT/huo85THaDX+/pcgLyeixJKEE5RPg
==
}
resolution
:
{
integrity
:
sha512-
aam+1ZesbCfV9xv5FktsAqHVBObcazrf1MG56SdBTYNuILBVgAztPj8NyIZ87ZHw8IE/JxWDDUtZo7lwaSOFzA
==
}
hasBin
:
true
hasBin
:
true
requiresBuild
:
true
requiresBuild
:
true
peerDependencies
:
peerDependencies
:
...
@@ -12542,7 +12440,7 @@ packages:
...
@@ -12542,7 +12440,7 @@ packages:
'
@swc/core'
:
'
@swc/core'
:
optional
:
true
optional
:
true
dependencies
:
dependencies
:
'
@nrwl/tao'
:
16.7.
2
'
@nrwl/tao'
:
16.7.
3
'
@parcel/watcher'
:
2.0.4
'
@parcel/watcher'
:
2.0.4
'
@yarnpkg/lockfile'
:
1.1.0
'
@yarnpkg/lockfile'
:
1.1.0
'
@yarnpkg/parsers'
:
3.0.0-rc.46
'
@yarnpkg/parsers'
:
3.0.0-rc.46
...
@@ -12578,16 +12476,16 @@ packages:
...
@@ -12578,16 +12476,16 @@ packages:
yargs
:
17.7.2
yargs
:
17.7.2
yargs-parser
:
21.1.1
yargs-parser
:
21.1.1
optionalDependencies
:
optionalDependencies
:
'
@nx/nx-darwin-arm64'
:
16.7.
2
'
@nx/nx-darwin-arm64'
:
16.7.
3
'
@nx/nx-darwin-x64'
:
16.7.
2
'
@nx/nx-darwin-x64'
:
16.7.
3
'
@nx/nx-freebsd-x64'
:
16.7.
2
'
@nx/nx-freebsd-x64'
:
16.7.
3
'
@nx/nx-linux-arm-gnueabihf'
:
16.7.
2
'
@nx/nx-linux-arm-gnueabihf'
:
16.7.
3
'
@nx/nx-linux-arm64-gnu'
:
16.7.
2
'
@nx/nx-linux-arm64-gnu'
:
16.7.
3
'
@nx/nx-linux-arm64-musl'
:
16.7.
2
'
@nx/nx-linux-arm64-musl'
:
16.7.
3
'
@nx/nx-linux-x64-gnu'
:
16.7.
2
'
@nx/nx-linux-x64-gnu'
:
16.7.
3
'
@nx/nx-linux-x64-musl'
:
16.7.
2
'
@nx/nx-linux-x64-musl'
:
16.7.
3
'
@nx/nx-win32-arm64-msvc'
:
16.7.
2
'
@nx/nx-win32-arm64-msvc'
:
16.7.
3
'
@nx/nx-win32-x64-msvc'
:
16.7.
2
'
@nx/nx-win32-x64-msvc'
:
16.7.
3
transitivePeerDependencies
:
transitivePeerDependencies
:
-
debug
-
debug
dev
:
true
dev
:
true
...
@@ -13219,6 +13117,12 @@ packages:
...
@@ -13219,6 +13117,12 @@ packages:
resolution
:
{
integrity
:
sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==
}
resolution
:
{
integrity
:
sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==
}
engines
:
{
node
:
'
>=8.6'
}
engines
:
{
node
:
'
>=8.6'
}
/pidtree@0.6.0
:
resolution
:
{
integrity
:
sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==
}
engines
:
{
node
:
'
>=0.10'
}
hasBin
:
true
dev
:
true
/pify@2.3.0
:
/pify@2.3.0
:
resolution
:
{
integrity
:
sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==
}
resolution
:
{
integrity
:
sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==
}
engines
:
{
node
:
'
>=0.10.0'
}
engines
:
{
node
:
'
>=0.10.0'
}
...
@@ -14108,6 +14012,10 @@ packages:
...
@@ -14108,6 +14012,10 @@ packages:
resolution
:
{
integrity
:
sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==
}
resolution
:
{
integrity
:
sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==
}
engines
:
{
iojs
:
'
>=1.0.0'
,
node
:
'
>=0.10.0'
}
engines
:
{
iojs
:
'
>=1.0.0'
,
node
:
'
>=0.10.0'
}
/rfdc@1.3.0
:
resolution
:
{
integrity
:
sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==
}
dev
:
true
/rimraf@2.7.1
:
/rimraf@2.7.1
:
resolution
:
{
integrity
:
sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==
}
resolution
:
{
integrity
:
sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==
}
hasBin
:
true
hasBin
:
true
...
@@ -14483,22 +14391,12 @@ packages:
...
@@ -14483,22 +14391,12 @@ packages:
engines
:
{
node
:
'
>=12'
}
engines
:
{
node
:
'
>=12'
}
dev
:
true
dev
:
true
/slice-ansi@3.0.0
:
/slice-ansi@5.0.0
:
resolution
:
{
integrity
:
sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==
}
resolution
:
{
integrity
:
sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==
}
engines
:
{
node
:
'
>=8'
}
engines
:
{
node
:
'
>=12'
}
dependencies
:
ansi-styles
:
4.3.0
astral-regex
:
2.0.0
is-fullwidth-code-point
:
3.0.0
dev
:
true
/slice-ansi@4.0.0
:
resolution
:
{
integrity
:
sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==
}
engines
:
{
node
:
'
>=10'
}
dependencies
:
dependencies
:
ansi-styles
:
4.3.0
ansi-styles
:
6.2.1
astral-regex
:
2.0.0
is-fullwidth-code-point
:
4.0.0
is-fullwidth-code-point
:
3.0.0
dev
:
true
dev
:
true
/smart-buffer@4.2.0
:
/smart-buffer@4.2.0
:
...
@@ -14726,13 +14624,6 @@ packages:
...
@@ -14726,13 +14624,6 @@ packages:
minipass
:
3.3.6
minipass
:
3.3.6
dev
:
true
dev
:
true
/stack-utils@2.0.6
:
resolution
:
{
integrity
:
sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==
}
engines
:
{
node
:
'
>=10'
}
dependencies
:
escape-string-regexp
:
2.0.0
dev
:
true
/stackback@0.0.2
:
/stackback@0.0.2
:
resolution
:
{
integrity
:
sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==
}
resolution
:
{
integrity
:
sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==
}
dev
:
true
dev
:
true
...
@@ -14790,8 +14681,8 @@ packages:
...
@@ -14790,8 +14681,8 @@ packages:
resolution
:
{
integrity
:
sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ==
}
resolution
:
{
integrity
:
sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ==
}
engines
:
{
node
:
'
>=4'
}
engines
:
{
node
:
'
>=4'
}
/string-argv@0.3.
1
:
/string-argv@0.3.
2
:
resolution
:
{
integrity
:
sha512-a
1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg
==
}
resolution
:
{
integrity
:
sha512-a
qD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q
==
}
engines
:
{
node
:
'
>=0.6.19'
}
engines
:
{
node
:
'
>=0.6.19'
}
dev
:
true
dev
:
true
...
@@ -14875,15 +14766,6 @@ packages:
...
@@ -14875,15 +14766,6 @@ packages:
dependencies
:
dependencies
:
safe-buffer
:
5.2.1
safe-buffer
:
5.2.1
/stringify-object@3.3.0
:
resolution
:
{
integrity
:
sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==
}
engines
:
{
node
:
'
>=4'
}
dependencies
:
get-own-enumerable-property-symbols
:
3.0.2
is-obj
:
1.0.1
is-regexp
:
1.0.0
dev
:
true
/strip-ansi@3.0.1
:
/strip-ansi@3.0.1
:
resolution
:
{
integrity
:
sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==
}
resolution
:
{
integrity
:
sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==
}
engines
:
{
node
:
'
>=0.10.0'
}
engines
:
{
node
:
'
>=0.10.0'
}
...
@@ -15601,6 +15483,11 @@ packages:
...
@@ -15601,6 +15483,11 @@ packages:
resolution
:
{
integrity
:
sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==
}
resolution
:
{
integrity
:
sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==
}
engines
:
{
node
:
'
>=8'
}
engines
:
{
node
:
'
>=8'
}
/type-fest@1.4.0
:
resolution
:
{
integrity
:
sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==
}
engines
:
{
node
:
'
>=10'
}
dev
:
true
/type-is@1.6.18
:
/type-is@1.6.18
:
resolution
:
{
integrity
:
sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==
}
resolution
:
{
integrity
:
sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==
}
engines
:
{
node
:
'
>=
0.6'
}
engines
:
{
node
:
'
>=
0.6'
}
...
@@ -16117,7 +16004,7 @@ packages:
...
@@ -16117,7 +16004,7 @@ packages:
-
terser
-
terser
dev
:
true
dev
:
true
/vite@4.4.6(@types/node@
12.20.20
)
:
/vite@4.4.6(@types/node@
20.5.3
)
:
resolution
:
{
integrity
:
sha512-EY6Mm8vJ++S3D4tNAckaZfw3JwG3wa794Vt70M6cNJ6NxT87yhq7EC8Rcap3ahyHdo8AhCmV9PTk+vG1HiYn1A==
}
resolution
:
{
integrity
:
sha512-EY6Mm8vJ++S3D4tNAckaZfw3JwG3wa794Vt70M6cNJ6NxT87yhq7EC8Rcap3ahyHdo8AhCmV9PTk+vG1HiYn1A==
}
engines
:
{
node
:
^14.18.0 || >=16.0.0
}
engines
:
{
node
:
^14.18.0 || >=16.0.0
}
hasBin
:
true
hasBin
:
true
...
@@ -16145,7 +16032,7 @@ packages:
...
@@ -16145,7 +16032,7 @@ packages:
terser
:
terser
:
optional
:
true
optional
:
true
dependencies
:
dependencies
:
'
@types/node'
:
12.20.20
'
@types/node'
:
20.5.3
esbuild
:
0.18.15
esbuild
:
0.18.15
postcss
:
8.4.27
postcss
:
8.4.27
rollup
:
3.26.3
rollup
:
3.26.3
...
@@ -16153,7 +16040,7 @@ packages:
...
@@ -16153,7 +16040,7 @@ packages:
fsevents
:
2.3.2
fsevents
:
2.3.2
dev
:
true
dev
:
true
/vite@4.4.9(@types/node@
12.20.2
0)
:
/vite@4.4.9(@types/node@
20.5.
0)
:
resolution
:
{
integrity
:
sha512-2mbUn2LlUmNASWwSCNSJ/EG2HuSRTnVNaydp6vMCm5VIqJsjMfbIWtbH2kDuwUVW5mMUKKZvGPX/rqeqVvv1XA==
}
resolution
:
{
integrity
:
sha512-2mbUn2LlUmNASWwSCNSJ/EG2HuSRTnVNaydp6vMCm5VIqJsjMfbIWtbH2kDuwUVW5mMUKKZvGPX/rqeqVvv1XA==
}
engines
:
{
node
:
^14.18.0 || >=16.0.0
}
engines
:
{
node
:
^14.18.0 || >=16.0.0
}
hasBin
:
true
hasBin
:
true
...
@@ -16181,7 +16068,7 @@ packages:
...
@@ -16181,7 +16068,7 @@ packages:
terser
:
terser
:
optional
:
true
optional
:
true
dependencies
:
dependencies
:
'
@types/node'
:
12.20.2
0
'
@types/node'
:
20.5.
0
esbuild
:
0.18.15
esbuild
:
0.18.15
postcss
:
8.4.27
postcss
:
8.4.27
rollup
:
3.28.0
rollup
:
3.28.0
...
@@ -16189,7 +16076,7 @@ packages:
...
@@ -16189,7 +16076,7 @@ packages:
fsevents
:
2.3.2
fsevents
:
2.3.2
dev
:
true
dev
:
true
/vite@4.4.9(@types/node@20.5.
0
)
:
/vite@4.4.9(@types/node@20.5.
3
)
:
resolution
:
{
integrity
:
sha512-2mbUn2LlUmNASWwSCNSJ/EG2HuSRTnVNaydp6vMCm5VIqJsjMfbIWtbH2kDuwUVW5mMUKKZvGPX/rqeqVvv1XA==
}
resolution
:
{
integrity
:
sha512-2mbUn2LlUmNASWwSCNSJ/EG2HuSRTnVNaydp6vMCm5VIqJsjMfbIWtbH2kDuwUVW5mMUKKZvGPX/rqeqVvv1XA==
}
engines
:
{
node
:
^14.18.0 || >=16.0.0
}
engines
:
{
node
:
^14.18.0 || >=16.0.0
}
hasBin
:
true
hasBin
:
true
...
@@ -16217,7 +16104,7 @@ packages:
...
@@ -16217,7 +16104,7 @@ packages:
terser
:
terser
:
optional
:
true
optional
:
true
dependencies
:
dependencies
:
'
@types/node'
:
20.5.
0
'
@types/node'
:
20.5.
3
esbuild
:
0.18.15
esbuild
:
0.18.15
postcss
:
8.4.27
postcss
:
8.4.27
rollup
:
3.28.0
rollup
:
3.28.0
...
...
proxyd/go.mod
View file @
a382b9e2
module github.com/ethereum-optimism/optimism/proxyd
module github.com/ethereum-optimism/optimism/proxyd
go 1.
18
go 1.
20
require (
require (
github.com/BurntSushi/toml v1.2.0
github.com/BurntSushi/toml v1.2.0
...
...
specs/meta/devnet.md
View file @
a382b9e2
...
@@ -9,9 +9,9 @@
...
@@ -9,9 +9,9 @@
<!-- END doctoc generated TOC please keep comment here to allow auto update -->
<!-- END doctoc generated TOC please keep comment here to allow auto update -->
You can spin up a local devnet via
`docker
-
compose`
.
You can spin up a local devnet via
`docker
compose`
.
For convenience, we have defined
`make`
targets to start and stop the devnet with a single command.
For convenience, we have defined
`make`
targets to start and stop the devnet with a single command.
To run the devnet, you will need
`docker`
and
`docker-compose`
installed.
To run the devnet, you will need
`docker`
installed.
Then, as a precondition, make sure that you have compiled the contracts by
`cd`
ing into
`packages/contracts`
Then, as a precondition, make sure that you have compiled the contracts by
`cd`
ing into
`packages/contracts`
and running
`pnpm i`
followed by
`pnpm build`
. You'll only need to do this if you change the contracts in the future.
and running
`pnpm i`
followed by
`pnpm build`
. You'll only need to do this if you change the contracts in the future.
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment