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
37b2b0f0
Unverified
Commit
37b2b0f0
authored
Nov 09, 2023
by
Adrian Sutton
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'develop' into aj/responder-contract-call
parents
99e1b2a1
6c4a9ac4
Changes
56
Hide whitespace changes
Inline
Side-by-side
Showing
56 changed files
with
1269 additions
and
975 deletions
+1269
-975
.envrc.example
.envrc.example
+55
-0
.gitignore
.gitignore
+1
-0
go.mod
cannon/example/claim/go.mod
+1
-1
go.sum
cannon/example/claim/go.sum
+2
-2
go.mod
go.mod
+2
-2
go.sum
go.sum
+4
-4
generated.ts
indexer/api-ts/generated.ts
+4
-0
api.go
indexer/api/api.go
+3
-2
api_test.go
indexer/api/api_test.go
+8
-0
models.go
indexer/api/models/models.go
+5
-0
supply.go
indexer/api/routes/supply.go
+35
-0
client.go
indexer/client/client.go
+20
-0
bridge_transfers.go
indexer/database/bridge_transfers.go
+23
-0
bridge_transfers_e2e_test.go
indexer/e2e_tests/bridge_transfers_e2e_test.go
+25
-1
20230523_create_schema.sql
indexer/migrations/20230523_create_schema.sql
+2
-2
eas.go
op-bindings/bindings/eas.go
+1
-1
eas_more.go
op-bindings/bindings/eas_more.go
+1
-1
main.go
op-chain-ops/cmd/check-canyon/main.go
+19
-27
faultdisputegame.go
op-challenger/game/fault/contracts/faultdisputegame.go
+29
-0
faultdisputegame_test.go
op-challenger/game/fault/contracts/faultdisputegame_test.go
+34
-0
player.go
op-challenger/game/fault/player.go
+2
-2
register.go
op-challenger/game/fault/register.go
+4
-3
access.go
op-challenger/game/fault/trace/access.go
+0
-0
access_test.go
op-challenger/game/fault/trace/access_test.go
+0
-0
local.go
op-challenger/game/fault/trace/cannon/local.go
+7
-14
local_test.go
op-challenger/game/fault/trace/cannon/local_test.go
+15
-26
provider.go
op-challenger/game/fault/trace/cannon/provider.go
+3
-8
types.go
op-challenger/game/fault/types/types.go
+7
-0
dencun_fork_test.go
op-e2e/actions/dencun_fork_test.go
+53
-0
l1_miner.go
op-e2e/actions/l1_miner.go
+7
-0
cannon_helper.go
op-e2e/e2eutils/disputegame/cannon_helper.go
+7
-3
.gitignore
op-node/.gitignore
+5
-0
load_signer.go
op-node/p2p/cli/load_signer.go
+2
-1
call.go
op-service/sources/batching/call.go
+4
-0
call_test.go
op-service/sources/batching/call_test.go
+18
-0
receipts_test.go
op-service/sources/receipts_test.go
+232
-0
types.go
op-service/sources/types.go
+15
-2
.envrc.example
packages/contracts-bedrock/.envrc.example
+0
-18
.gas-snapshot
packages/contracts-bedrock/.gas-snapshot
+329
-329
.gitignore
packages/contracts-bedrock/.gitignore
+3
-0
SystemConfig.md
packages/contracts-bedrock/invariant-docs/SystemConfig.md
+1
-1
forge-std
packages/contracts-bedrock/lib/forge-std
+1
-1
Deployer.sol
packages/contracts-bedrock/scripts/Deployer.sol
+1
-1
config.sh
packages/contracts-bedrock/scripts/getting-started/config.sh
+94
-0
versions.sh
...ges/contracts-bedrock/scripts/getting-started/versions.sh
+36
-0
wallets.sh
...ages/contracts-bedrock/scripts/getting-started/wallets.sh
+43
-0
Multichain.s.sol
packages/contracts-bedrock/scripts/upgrades/Multichain.s.sol
+0
-491
semver-lock.json
packages/contracts-bedrock/semver-lock.json
+1
-1
EAS.sol
packages/contracts-bedrock/src/EAS/EAS.sol
+3
-3
EIP1271Verifier.sol
...ges/contracts-bedrock/src/EAS/eip1271/EIP1271Verifier.sol
+13
-6
SafeCall.t.sol
packages/contracts-bedrock/test/SafeCall.t.sol
+3
-3
SystemConfig.t.sol
...ages/contracts-bedrock/test/invariants/SystemConfig.t.sol
+5
-15
deposits.md
specs/deposits.md
+3
-2
derivation.md
specs/derivation.md
+1
-1
predeploys.md
specs/predeploys.md
+54
-1
superchain-upgrades.md
specs/superchain-upgrades.md
+23
-0
No files found.
.envrc.example
0 → 100644
View file @
37b2b0f0
##################################################
# Getting Started #
##################################################
# Admin account
export GS_ADMIN_ADDRESS=
export GS_ADMIN_PRIVATE_KEY=
# Batcher account
export GS_BATCHER_ADDRESS=
export GS_BATCHER_PRIVATE_KEY=
# Proposer account
export GS_PROPOSER_ADDRESS=
export GS_PROPOSER_PRIVATE_KEY=
# Sequencer account
export GS_SEQUENCER_ADDRESS=
export GS_SEQUENCER_PRIVATE_KEY=
##################################################
# op-node Configuration #
##################################################
# The kind of RPC provider, used to inform optimal transactions receipts
# fetching. Valid options: alchemy, quicknode, infura, parity, nethermind,
# debug_geth, erigon, basic, any.
export L1_RPC_KIND=
##################################################
# Contract Deployment #
##################################################
# RPC URL for the L1 network to interact with
export L1_RPC_URL=
# Salt used via CREATE2 to determine implementation addresses
# NOTE: If you want to deploy contracts from scratch you MUST reload this
# variable to ensure the salt is regenerated and the contracts are
# deployed to new addresses (otherwise deployment will fail)
export IMPL_SALT=$(openssl rand -hex 32)
# Name for the deployed network
export DEPLOYMENT_CONTEXT=getting-started
# Optional Tenderly details for simulation link during deployment
export TENDERLY_PROJECT=
export TENDERLY_USERNAME=
# Optional Etherscan API key for contract verification
export ETHERSCAN_API_KEY=
# Private key to use for contract deployments, you don't need to worry about
# this for the Getting Started guide.
export PRIVATE_KEY=
.gitignore
View file @
37b2b0f0
...
@@ -30,6 +30,7 @@ packages/contracts-bedrock/deployments/anvil
...
@@ -30,6 +30,7 @@ packages/contracts-bedrock/deployments/anvil
.env
.env
.env*
.env*
!.env.example
!.env.example
!.envrc.example
*.log
*.log
.devnet
.devnet
...
...
cannon/example/claim/go.mod
View file @
37b2b0f0
...
@@ -8,7 +8,7 @@ require github.com/ethereum-optimism/optimism v0.0.0
...
@@ -8,7 +8,7 @@ require github.com/ethereum-optimism/optimism v0.0.0
require (
require (
golang.org/x/crypto v0.14.0 // indirect
golang.org/x/crypto v0.14.0 // indirect
golang.org/x/sys v0.1
3
.0 // indirect
golang.org/x/sys v0.1
4
.0 // indirect
)
)
replace github.com/ethereum-optimism/optimism v0.0.0 => ../../..
replace github.com/ethereum-optimism/optimism v0.0.0 => ../../..
cannon/example/claim/go.sum
View file @
37b2b0f0
...
@@ -6,7 +6,7 @@ github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcU
...
@@ -6,7 +6,7 @@ github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcU
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc=
golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc=
golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4=
golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4=
golang.org/x/sys v0.1
3.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE
=
golang.org/x/sys v0.1
4.0 h1:Vz7Qs629MkJkGyHxUlRHizWJRG2j8fbQKjELVSNhy7Q
=
golang.org/x/sys v0.1
3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg
=
golang.org/x/sys v0.1
4.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA
=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
go.mod
View file @
37b2b0f0
...
@@ -42,7 +42,7 @@ require (
...
@@ -42,7 +42,7 @@ require (
golang.org/x/crypto v0.14.0
golang.org/x/crypto v0.14.0
golang.org/x/exp v0.0.0-20231006140011-7918f672742d
golang.org/x/exp v0.0.0-20231006140011-7918f672742d
golang.org/x/sync v0.5.0
golang.org/x/sync v0.5.0
golang.org/x/term v0.1
3
.0
golang.org/x/term v0.1
4
.0
golang.org/x/time v0.4.0
golang.org/x/time v0.4.0
gorm.io/driver/postgres v1.5.4
gorm.io/driver/postgres v1.5.4
gorm.io/gorm v1.25.5
gorm.io/gorm v1.25.5
...
@@ -199,7 +199,7 @@ require (
...
@@ -199,7 +199,7 @@ require (
go.uber.org/zap v1.26.0 // indirect
go.uber.org/zap v1.26.0 // indirect
golang.org/x/mod v0.13.0 // indirect
golang.org/x/mod v0.13.0 // indirect
golang.org/x/net v0.17.0 // indirect
golang.org/x/net v0.17.0 // indirect
golang.org/x/sys v0.1
3
.0 // indirect
golang.org/x/sys v0.1
4
.0 // indirect
golang.org/x/text v0.13.0 // indirect
golang.org/x/text v0.13.0 // indirect
golang.org/x/tools v0.14.0 // indirect
golang.org/x/tools v0.14.0 // indirect
google.golang.org/protobuf v1.31.0 // indirect
google.golang.org/protobuf v1.31.0 // indirect
...
...
go.sum
View file @
37b2b0f0
...
@@ -879,13 +879,13 @@ golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
...
@@ -879,13 +879,13 @@ golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.1
3.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE
=
golang.org/x/sys v0.1
4.0 h1:Vz7Qs629MkJkGyHxUlRHizWJRG2j8fbQKjELVSNhy7Q
=
golang.org/x/sys v0.1
3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg
=
golang.org/x/sys v0.1
4.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA
=
golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
golang.org/x/term v0.1
3.0 h1:bb+I9cTfFazGW51MZqBVmZy7+JEJMouUHTUSKVQLBek
=
golang.org/x/term v0.1
4.0 h1:LGK9IlZ8T9jvdy6cTdfKUCltatMFOehAQo9SRC46UQ8
=
golang.org/x/term v0.1
3.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U
=
golang.org/x/term v0.1
4.0/go.mod h1:TySc+nGkYR6qt8km8wUhuFRTVSMIX3XPR58y2lC8vww
=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
...
...
indexer/api-ts/generated.ts
View file @
37b2b0f0
...
@@ -51,3 +51,7 @@ export interface WithdrawalResponse {
...
@@ -51,3 +51,7 @@ export interface WithdrawalResponse {
hasNextPage
:
boolean
;
hasNextPage
:
boolean
;
items
:
WithdrawalItem
[];
items
:
WithdrawalItem
[];
}
}
export
interface
BridgeSupplyView
{
l1DepositSum
:
number
/* float64 */
;
l2WithdrawalSum
:
number
/* float64 */
;
}
indexer/api/api.go
View file @
37b2b0f0
...
@@ -35,6 +35,8 @@ const (
...
@@ -35,6 +35,8 @@ const (
HealthPath
=
"/healthz"
HealthPath
=
"/healthz"
DepositsPath
=
"/api/v0/deposits/"
DepositsPath
=
"/api/v0/deposits/"
WithdrawalsPath
=
"/api/v0/withdrawals/"
WithdrawalsPath
=
"/api/v0/withdrawals/"
SupplyPath
=
"/api/v0/supply"
)
)
// Api ... Indexer API struct
// Api ... Indexer API struct
...
@@ -140,15 +142,14 @@ func (a *APIService) initRouter(apiConfig config.ServerConfig) {
...
@@ -140,15 +142,14 @@ func (a *APIService) initRouter(apiConfig config.ServerConfig) {
promRecorder
:=
metrics
.
NewPromHTTPRecorder
(
a
.
metricsRegistry
,
MetricsNamespace
)
promRecorder
:=
metrics
.
NewPromHTTPRecorder
(
a
.
metricsRegistry
,
MetricsNamespace
)
// (2) Inject routing middleware
apiRouter
.
Use
(
chiMetricsMiddleware
(
promRecorder
))
apiRouter
.
Use
(
chiMetricsMiddleware
(
promRecorder
))
apiRouter
.
Use
(
middleware
.
Timeout
(
time
.
Duration
(
apiConfig
.
WriteTimeout
)
*
time
.
Second
))
apiRouter
.
Use
(
middleware
.
Timeout
(
time
.
Duration
(
apiConfig
.
WriteTimeout
)
*
time
.
Second
))
apiRouter
.
Use
(
middleware
.
Recoverer
)
apiRouter
.
Use
(
middleware
.
Recoverer
)
apiRouter
.
Use
(
middleware
.
Heartbeat
(
HealthPath
))
apiRouter
.
Use
(
middleware
.
Heartbeat
(
HealthPath
))
// (3) Set GET routes
apiRouter
.
Get
(
fmt
.
Sprintf
(
DepositsPath
+
addressParam
,
ethereumAddressRegex
),
h
.
L1DepositsHandler
)
apiRouter
.
Get
(
fmt
.
Sprintf
(
DepositsPath
+
addressParam
,
ethereumAddressRegex
),
h
.
L1DepositsHandler
)
apiRouter
.
Get
(
fmt
.
Sprintf
(
WithdrawalsPath
+
addressParam
,
ethereumAddressRegex
),
h
.
L2WithdrawalsHandler
)
apiRouter
.
Get
(
fmt
.
Sprintf
(
WithdrawalsPath
+
addressParam
,
ethereumAddressRegex
),
h
.
L2WithdrawalsHandler
)
apiRouter
.
Get
(
SupplyPath
,
h
.
SupplyView
)
a
.
router
=
apiRouter
a
.
router
=
apiRouter
}
}
...
...
indexer/api/api_test.go
View file @
37b2b0f0
...
@@ -95,6 +95,14 @@ func (mbv *MockBridgeTransfersView) L2BridgeWithdrawalsByAddress(address common.
...
@@ -95,6 +95,14 @@ func (mbv *MockBridgeTransfersView) L2BridgeWithdrawalsByAddress(address common.
},
},
},
nil
},
nil
}
}
func
(
mbv
*
MockBridgeTransfersView
)
L1BridgeDepositSum
()
(
float64
,
error
)
{
return
69
,
nil
}
func
(
mbv
*
MockBridgeTransfersView
)
L2BridgeWithdrawalSum
()
(
float64
,
error
)
{
return
420
,
nil
}
func
TestHealthz
(
t
*
testing
.
T
)
{
func
TestHealthz
(
t
*
testing
.
T
)
{
logger
:=
testlog
.
Logger
(
t
,
log
.
LvlInfo
)
logger
:=
testlog
.
Logger
(
t
,
log
.
LvlInfo
)
cfg
:=
&
Config
{
cfg
:=
&
Config
{
...
...
indexer/api/models/models.go
View file @
37b2b0f0
...
@@ -49,6 +49,11 @@ type WithdrawalResponse struct {
...
@@ -49,6 +49,11 @@ type WithdrawalResponse struct {
Items
[]
WithdrawalItem
`json:"items"`
Items
[]
WithdrawalItem
`json:"items"`
}
}
type
BridgeSupplyView
struct
{
L1DepositSum
float64
`json:"l1DepositSum"`
L2WithdrawalSum
float64
`json:"l2WithdrawalSum"`
}
// FIXME make a pure function that returns a struct instead of newWithdrawalResponse
// FIXME make a pure function that returns a struct instead of newWithdrawalResponse
// newWithdrawalResponse ... Converts a database.L2BridgeWithdrawalsResponse to an api.WithdrawalResponse
// newWithdrawalResponse ... Converts a database.L2BridgeWithdrawalsResponse to an api.WithdrawalResponse
func
CreateWithdrawalResponse
(
withdrawals
*
database
.
L2BridgeWithdrawalsResponse
)
WithdrawalResponse
{
func
CreateWithdrawalResponse
(
withdrawals
*
database
.
L2BridgeWithdrawalsResponse
)
WithdrawalResponse
{
...
...
indexer/api/routes/supply.go
0 → 100644
View file @
37b2b0f0
package
routes
import
(
"net/http"
"github.com/ethereum-optimism/optimism/indexer/api/models"
)
// SupplyView ... Handles /api/v0/supply GET requests
func
(
h
Routes
)
SupplyView
(
w
http
.
ResponseWriter
,
r
*
http
.
Request
)
{
depositSum
,
err
:=
h
.
view
.
L1BridgeDepositSum
()
if
err
!=
nil
{
http
.
Error
(
w
,
"internal server error reading deposits"
,
http
.
StatusInternalServerError
)
h
.
logger
.
Error
(
"unable to read deposits from DB"
,
"err"
,
err
.
Error
())
return
}
withdrawalSum
,
err
:=
h
.
view
.
L2BridgeWithdrawalSum
()
if
err
!=
nil
{
http
.
Error
(
w
,
"internal server error reading withdrawals"
,
http
.
StatusInternalServerError
)
h
.
logger
.
Error
(
"unable to read withdrawals from DB"
,
"err"
,
err
.
Error
())
return
}
view
:=
models
.
BridgeSupplyView
{
L1DepositSum
:
depositSum
,
L2WithdrawalSum
:
withdrawalSum
,
}
err
=
jsonResponse
(
w
,
view
,
http
.
StatusOK
)
if
err
!=
nil
{
h
.
logger
.
Error
(
"error writing response"
,
"err"
,
err
)
}
}
indexer/client/client.go
View file @
37b2b0f0
...
@@ -23,6 +23,7 @@ const (
...
@@ -23,6 +23,7 @@ const (
healthz
=
"get_health"
healthz
=
"get_health"
deposits
=
"get_deposits"
deposits
=
"get_deposits"
withdrawals
=
"get_withdrawals"
withdrawals
=
"get_withdrawals"
sum
=
"get_sum"
)
)
// Option ... Provides configuration through callback injection
// Option ... Provides configuration through callback injection
...
@@ -164,6 +165,25 @@ func (c *Client) GetAllDepositsByAddress(l1Address common.Address) ([]models.Dep
...
@@ -164,6 +165,25 @@ func (c *Client) GetAllDepositsByAddress(l1Address common.Address) ([]models.Dep
}
}
// GetSupplyAssessment ... Returns an assessment of the current supply
// on both L1 and L2. This includes the individual sums of
// (L1/L2) deposits and withdrawals
func
(
c
*
Client
)
GetSupplyAssessment
()
(
*
models
.
BridgeSupplyView
,
error
)
{
url
:=
c
.
cfg
.
BaseURL
+
api
.
SupplyPath
resp
,
err
:=
c
.
doRecordRequest
(
sum
,
url
)
if
err
!=
nil
{
return
nil
,
err
}
var
bsv
*
models
.
BridgeSupplyView
if
err
:=
json
.
Unmarshal
(
resp
,
&
bsv
);
err
!=
nil
{
return
nil
,
err
}
return
bsv
,
nil
}
// GetAllWithdrawalsByAddress ... Gets all withdrawals provided a L2 address
// GetAllWithdrawalsByAddress ... Gets all withdrawals provided a L2 address
func
(
c
*
Client
)
GetAllWithdrawalsByAddress
(
l2Address
common
.
Address
)
([]
models
.
WithdrawalItem
,
error
)
{
func
(
c
*
Client
)
GetAllWithdrawalsByAddress
(
l2Address
common
.
Address
)
([]
models
.
WithdrawalItem
,
error
)
{
var
withdrawals
[]
models
.
WithdrawalItem
var
withdrawals
[]
models
.
WithdrawalItem
...
...
indexer/database/bridge_transfers.go
View file @
37b2b0f0
...
@@ -61,10 +61,12 @@ type L2BridgeWithdrawalWithTransactionHashes struct {
...
@@ -61,10 +61,12 @@ type L2BridgeWithdrawalWithTransactionHashes struct {
type
BridgeTransfersView
interface
{
type
BridgeTransfersView
interface
{
L1BridgeDeposit
(
common
.
Hash
)
(
*
L1BridgeDeposit
,
error
)
L1BridgeDeposit
(
common
.
Hash
)
(
*
L1BridgeDeposit
,
error
)
L1BridgeDepositSum
()
(
float64
,
error
)
L1BridgeDepositWithFilter
(
BridgeTransfer
)
(
*
L1BridgeDeposit
,
error
)
L1BridgeDepositWithFilter
(
BridgeTransfer
)
(
*
L1BridgeDeposit
,
error
)
L1BridgeDepositsByAddress
(
common
.
Address
,
string
,
int
)
(
*
L1BridgeDepositsResponse
,
error
)
L1BridgeDepositsByAddress
(
common
.
Address
,
string
,
int
)
(
*
L1BridgeDepositsResponse
,
error
)
L2BridgeWithdrawal
(
common
.
Hash
)
(
*
L2BridgeWithdrawal
,
error
)
L2BridgeWithdrawal
(
common
.
Hash
)
(
*
L2BridgeWithdrawal
,
error
)
L2BridgeWithdrawalSum
()
(
float64
,
error
)
L2BridgeWithdrawalWithFilter
(
BridgeTransfer
)
(
*
L2BridgeWithdrawal
,
error
)
L2BridgeWithdrawalWithFilter
(
BridgeTransfer
)
(
*
L2BridgeWithdrawal
,
error
)
L2BridgeWithdrawalsByAddress
(
common
.
Address
,
string
,
int
)
(
*
L2BridgeWithdrawalsResponse
,
error
)
L2BridgeWithdrawalsByAddress
(
common
.
Address
,
string
,
int
)
(
*
L2BridgeWithdrawalsResponse
,
error
)
}
}
...
@@ -136,6 +138,17 @@ type L1BridgeDepositsResponse struct {
...
@@ -136,6 +138,17 @@ type L1BridgeDepositsResponse struct {
HasNextPage
bool
HasNextPage
bool
}
}
// L1BridgeDepositSum ... returns the sum of all l1 bridge deposit mints in gwei
func
(
db
*
bridgeTransfersDB
)
L1BridgeDepositSum
()
(
float64
,
error
)
{
var
sum
float64
result
:=
db
.
gorm
.
Model
(
&
L1TransactionDeposit
{})
.
Select
(
"sum(amount)"
)
.
Scan
(
&
sum
)
if
result
.
Error
!=
nil
{
return
0
,
result
.
Error
}
return
sum
,
nil
}
// L1BridgeDepositsByAddress retrieves a list of deposits initiated by the specified address,
// L1BridgeDepositsByAddress retrieves a list of deposits initiated by the specified address,
// coupled with the L1/L2 transaction hashes that complete the bridge transaction.
// coupled with the L1/L2 transaction hashes that complete the bridge transaction.
func
(
db
*
bridgeTransfersDB
)
L1BridgeDepositsByAddress
(
address
common
.
Address
,
cursor
string
,
limit
int
)
(
*
L1BridgeDepositsResponse
,
error
)
{
func
(
db
*
bridgeTransfersDB
)
L1BridgeDepositsByAddress
(
address
common
.
Address
,
cursor
string
,
limit
int
)
(
*
L1BridgeDepositsResponse
,
error
)
{
...
@@ -233,6 +246,16 @@ func (db *bridgeTransfersDB) L2BridgeWithdrawal(txWithdrawalHash common.Hash) (*
...
@@ -233,6 +246,16 @@ func (db *bridgeTransfersDB) L2BridgeWithdrawal(txWithdrawalHash common.Hash) (*
return
&
withdrawal
,
nil
return
&
withdrawal
,
nil
}
}
func
(
db
*
bridgeTransfersDB
)
L2BridgeWithdrawalSum
()
(
float64
,
error
)
{
var
sum
float64
result
:=
db
.
gorm
.
Model
(
&
L2TransactionWithdrawal
{})
.
Select
(
"sum(amount)"
)
.
Scan
(
&
sum
)
if
result
.
Error
!=
nil
{
return
0
,
result
.
Error
}
return
sum
,
nil
}
// L2BridgeWithdrawalWithFilter queries for a bridge withdrawal with set fields in the `BridgeTransfer` filter
// L2BridgeWithdrawalWithFilter queries for a bridge withdrawal with set fields in the `BridgeTransfer` filter
func
(
db
*
bridgeTransfersDB
)
L2BridgeWithdrawalWithFilter
(
filter
BridgeTransfer
)
(
*
L2BridgeWithdrawal
,
error
)
{
func
(
db
*
bridgeTransfersDB
)
L2BridgeWithdrawalWithFilter
(
filter
BridgeTransfer
)
(
*
L2BridgeWithdrawal
,
error
)
{
var
withdrawal
L2BridgeWithdrawal
var
withdrawal
L2BridgeWithdrawal
...
...
indexer/e2e_tests/bridge_transfers_e2e_test.go
View file @
37b2b0f0
...
@@ -8,6 +8,7 @@ import (
...
@@ -8,6 +8,7 @@ import (
"testing"
"testing"
"time"
"time"
"github.com/ethereum-optimism/optimism/indexer/bigint"
e2etest_utils
"github.com/ethereum-optimism/optimism/indexer/e2e_tests/utils"
e2etest_utils
"github.com/ethereum-optimism/optimism/indexer/e2e_tests/utils"
op_e2e
"github.com/ethereum-optimism/optimism/op-e2e"
op_e2e
"github.com/ethereum-optimism/optimism/op-e2e"
"github.com/ethereum-optimism/optimism/op-e2e/e2eutils/transactions"
"github.com/ethereum-optimism/optimism/op-e2e/e2eutils/transactions"
...
@@ -447,7 +448,7 @@ func TestE2EBridgeTransfersCursoredWithdrawals(t *testing.T) {
...
@@ -447,7 +448,7 @@ func TestE2EBridgeTransfersCursoredWithdrawals(t *testing.T) {
}
}
}
}
func
TestClient
GetWithdrawal
s
(
t
*
testing
.
T
)
{
func
TestClient
BridgeFunction
s
(
t
*
testing
.
T
)
{
testSuite
:=
createE2ETestSuite
(
t
)
testSuite
:=
createE2ETestSuite
(
t
)
// (1) Generate contract bindings for the L1 and L2 standard bridges
// (1) Generate contract bindings for the L1 and L2 standard bridges
...
@@ -459,12 +460,16 @@ func TestClientGetWithdrawals(t *testing.T) {
...
@@ -459,12 +460,16 @@ func TestClientGetWithdrawals(t *testing.T) {
// (2) Create test actors that will deposit and withdraw using the standard bridge
// (2) Create test actors that will deposit and withdraw using the standard bridge
aliceAddr
:=
testSuite
.
OpCfg
.
Secrets
.
Addresses
()
.
Alice
aliceAddr
:=
testSuite
.
OpCfg
.
Secrets
.
Addresses
()
.
Alice
bobAddr
:=
testSuite
.
OpCfg
.
Secrets
.
Addresses
()
.
Bob
bobAddr
:=
testSuite
.
OpCfg
.
Secrets
.
Addresses
()
.
Bob
malAddr
:=
testSuite
.
OpCfg
.
Secrets
.
Addresses
()
.
Mallory
type
actor
struct
{
type
actor
struct
{
addr
common
.
Address
addr
common
.
Address
priv
*
ecdsa
.
PrivateKey
priv
*
ecdsa
.
PrivateKey
}
}
mintSum
:=
bigint
.
Zero
withdrawSum
:=
bigint
.
Zero
actors
:=
[]
actor
{
actors
:=
[]
actor
{
{
{
addr
:
aliceAddr
,
addr
:
aliceAddr
,
...
@@ -474,6 +479,10 @@ func TestClientGetWithdrawals(t *testing.T) {
...
@@ -474,6 +479,10 @@ func TestClientGetWithdrawals(t *testing.T) {
addr
:
bobAddr
,
addr
:
bobAddr
,
priv
:
testSuite
.
OpCfg
.
Secrets
.
Bob
,
priv
:
testSuite
.
OpCfg
.
Secrets
.
Bob
,
},
},
{
addr
:
malAddr
,
priv
:
testSuite
.
OpCfg
.
Secrets
.
Mallory
,
},
}
}
// (3) Iterate over each actor and deposit / withdraw
// (3) Iterate over each actor and deposit / withdraw
...
@@ -491,6 +500,8 @@ func TestClientGetWithdrawals(t *testing.T) {
...
@@ -491,6 +500,8 @@ func TestClientGetWithdrawals(t *testing.T) {
_
,
err
=
wait
.
ForReceiptOK
(
context
.
Background
(),
testSuite
.
L1Client
,
depositTx
.
Hash
())
_
,
err
=
wait
.
ForReceiptOK
(
context
.
Background
(),
testSuite
.
L1Client
,
depositTx
.
Hash
())
require
.
NoError
(
t
,
err
)
require
.
NoError
(
t
,
err
)
mintSum
=
new
(
big
.
Int
)
.
Add
(
mintSum
,
depositTx
.
Value
())
// (3.b) Initiate withdrawal transaction via L2ToL1MessagePasser contract
// (3.b) Initiate withdrawal transaction via L2ToL1MessagePasser contract
l2ToL1MessagePasserWithdrawTx
,
err
:=
l2ToL1MessagePasser
.
Receive
(
l2Opts
)
l2ToL1MessagePasserWithdrawTx
,
err
:=
l2ToL1MessagePasser
.
Receive
(
l2Opts
)
require
.
NoError
(
t
,
err
)
require
.
NoError
(
t
,
err
)
...
@@ -503,6 +514,8 @@ func TestClientGetWithdrawals(t *testing.T) {
...
@@ -503,6 +514,8 @@ func TestClientGetWithdrawals(t *testing.T) {
return
l2Header
!=
nil
&&
l2Header
.
Number
.
Uint64
()
>=
l2ToL1WithdrawReceipt
.
BlockNumber
.
Uint64
(),
nil
return
l2Header
!=
nil
&&
l2Header
.
Number
.
Uint64
()
>=
l2ToL1WithdrawReceipt
.
BlockNumber
.
Uint64
(),
nil
}))
}))
withdrawSum
=
new
(
big
.
Int
)
.
Add
(
withdrawSum
,
l2ToL1MessagePasserWithdrawTx
.
Value
())
// (3.d) Ensure that withdrawal and deposit txs are retrievable via API
// (3.d) Ensure that withdrawal and deposit txs are retrievable via API
deposits
,
err
:=
testSuite
.
Client
.
GetAllDepositsByAddress
(
actor
.
addr
)
deposits
,
err
:=
testSuite
.
Client
.
GetAllDepositsByAddress
(
actor
.
addr
)
require
.
NoError
(
t
,
err
)
require
.
NoError
(
t
,
err
)
...
@@ -513,6 +526,17 @@ func TestClientGetWithdrawals(t *testing.T) {
...
@@ -513,6 +526,17 @@ func TestClientGetWithdrawals(t *testing.T) {
require
.
NoError
(
t
,
err
)
require
.
NoError
(
t
,
err
)
require
.
Len
(
t
,
withdrawals
,
1
)
require
.
Len
(
t
,
withdrawals
,
1
)
require
.
Equal
(
t
,
l2ToL1MessagePasserWithdrawTx
.
Hash
()
.
String
(),
withdrawals
[
0
]
.
TransactionHash
)
require
.
Equal
(
t
,
l2ToL1MessagePasserWithdrawTx
.
Hash
()
.
String
(),
withdrawals
[
0
]
.
TransactionHash
)
}
}
// (4) Ensure that supply assessment is correct
assessment
,
err
:=
testSuite
.
Client
.
GetSupplyAssessment
()
require
.
NoError
(
t
,
err
)
mintFloat
,
_
:=
mintSum
.
Float64
()
require
.
Equal
(
t
,
mintFloat
,
assessment
.
L1DepositSum
)
withdrawFloat
,
_
:=
withdrawSum
.
Float64
()
require
.
Equal
(
t
,
withdrawFloat
,
assessment
.
L2WithdrawalSum
)
}
}
indexer/migrations/20230523_create_schema.sql
View file @
37b2b0f0
...
@@ -96,8 +96,8 @@ CREATE TABLE IF NOT EXISTS l1_transaction_deposits (
...
@@ -96,8 +96,8 @@ CREATE TABLE IF NOT EXISTS l1_transaction_deposits (
-- transaction data. NOTE: `to_address` is the recipient of funds transferred in value field of the
-- transaction data. NOTE: `to_address` is the recipient of funds transferred in value field of the
-- L2 deposit transaction and not the amount minted on L1 from the source address. Hence the `amount`
-- L2 deposit transaction and not the amount minted on L1 from the source address. Hence the `amount`
-- column in this table does NOT indic
i
ate the amount transferred to the recipient but instead funds
-- column in this table does NOT indicate the amount transferred to the recipient but instead funds
-- bridged from L1
into
`from_address`.
-- bridged from L1
by the
`from_address`.
from_address
VARCHAR
NOT
NULL
,
from_address
VARCHAR
NOT
NULL
,
to_address
VARCHAR
NOT
NULL
,
to_address
VARCHAR
NOT
NULL
,
...
...
op-bindings/bindings/eas.go
View file @
37b2b0f0
...
@@ -128,7 +128,7 @@ type Signature struct {
...
@@ -128,7 +128,7 @@ type Signature struct {
// EASMetaData contains all meta data concerning the EAS contract.
// EASMetaData contains all meta data concerning the EAS contract.
var
EASMetaData
=
&
bind
.
MetaData
{
var
EASMetaData
=
&
bind
.
MetaData
{
ABI
:
"[{
\"
inputs
\"
:[],
\"
stateMutability
\"
:
\"
nonpayable
\"
,
\"
type
\"
:
\"
constructor
\"
},{
\"
inputs
\"
:[],
\"
name
\"
:
\"
AccessDenied
\"
,
\"
type
\"
:
\"
error
\"
},{
\"
inputs
\"
:[],
\"
name
\"
:
\"
AlreadyRevoked
\"
,
\"
type
\"
:
\"
error
\"
},{
\"
inputs
\"
:[],
\"
name
\"
:
\"
AlreadyRevokedOffchain
\"
,
\"
type
\"
:
\"
error
\"
},{
\"
inputs
\"
:[],
\"
name
\"
:
\"
AlreadyTimestamped
\"
,
\"
type
\"
:
\"
error
\"
},{
\"
inputs
\"
:[],
\"
name
\"
:
\"
DeadlineExpired
\"
,
\"
type
\"
:
\"
error
\"
},{
\"
inputs
\"
:[],
\"
name
\"
:
\"
InsufficientValue
\"
,
\"
type
\"
:
\"
error
\"
},{
\"
inputs
\"
:[],
\"
name
\"
:
\"
InvalidAttestation
\"
,
\"
type
\"
:
\"
error
\"
},{
\"
inputs
\"
:[],
\"
name
\"
:
\"
InvalidAttestations
\"
,
\"
type
\"
:
\"
error
\"
},{
\"
inputs
\"
:[],
\"
name
\"
:
\"
InvalidExpirationTime
\"
,
\"
type
\"
:
\"
error
\"
},{
\"
inputs
\"
:[],
\"
name
\"
:
\"
InvalidLength
\"
,
\"
type
\"
:
\"
error
\"
},{
\"
inputs
\"
:[],
\"
name
\"
:
\"
InvalidNonce
\"
,
\"
type
\"
:
\"
error
\"
},{
\"
inputs
\"
:[],
\"
name
\"
:
\"
InvalidOffset
\"
,
\"
type
\"
:
\"
error
\"
},{
\"
inputs
\"
:[],
\"
name
\"
:
\"
InvalidRegistry
\"
,
\"
type
\"
:
\"
error
\"
},{
\"
inputs
\"
:[],
\"
name
\"
:
\"
InvalidRevocation
\"
,
\"
type
\"
:
\"
error
\"
},{
\"
inputs
\"
:[],
\"
name
\"
:
\"
InvalidRevocations
\"
,
\"
type
\"
:
\"
error
\"
},{
\"
inputs
\"
:[],
\"
name
\"
:
\"
InvalidSchema
\"
,
\"
type
\"
:
\"
error
\"
},{
\"
inputs
\"
:[],
\"
name
\"
:
\"
InvalidSignature
\"
,
\"
type
\"
:
\"
error
\"
},{
\"
inputs
\"
:[],
\"
name
\"
:
\"
InvalidVerifier
\"
,
\"
type
\"
:
\"
error
\"
},{
\"
inputs
\"
:[],
\"
name
\"
:
\"
Irrevocable
\"
,
\"
type
\"
:
\"
error
\"
},{
\"
inputs
\"
:[],
\"
name
\"
:
\"
NotFound
\"
,
\"
type
\"
:
\"
error
\"
},{
\"
inputs
\"
:[],
\"
name
\"
:
\"
NotPayable
\"
,
\"
type
\"
:
\"
error
\"
},{
\"
inputs
\"
:[],
\"
name
\"
:
\"
WrongSchema
\"
,
\"
type
\"
:
\"
error
\"
},{
\"
anonymous
\"
:false,
\"
inputs
\"
:[{
\"
indexed
\"
:true,
\"
internalType
\"
:
\"
address
\"
,
\"
name
\"
:
\"
recipient
\"
,
\"
type
\"
:
\"
address
\"
},{
\"
indexed
\"
:true,
\"
internalType
\"
:
\"
address
\"
,
\"
name
\"
:
\"
attester
\"
,
\"
type
\"
:
\"
address
\"
},{
\"
indexed
\"
:false,
\"
internalType
\"
:
\"
bytes32
\"
,
\"
name
\"
:
\"
uid
\"
,
\"
type
\"
:
\"
bytes32
\"
},{
\"
indexed
\"
:true,
\"
internalType
\"
:
\"
bytes32
\"
,
\"
name
\"
:
\"
schemaUID
\"
,
\"
type
\"
:
\"
bytes32
\"
}],
\"
name
\"
:
\"
Attested
\"
,
\"
type
\"
:
\"
event
\"
},{
\"
anonymous
\"
:false,
\"
inputs
\"
:[{
\"
indexed
\"
:false,
\"
internalType
\"
:
\"
uint256
\"
,
\"
name
\"
:
\"
oldNonce
\"
,
\"
type
\"
:
\"
uint256
\"
},{
\"
indexed
\"
:false,
\"
internalType
\"
:
\"
uint256
\"
,
\"
name
\"
:
\"
newNonce
\"
,
\"
type
\"
:
\"
uint256
\"
}],
\"
name
\"
:
\"
NonceIncreased
\"
,
\"
type
\"
:
\"
event
\"
},{
\"
anonymous
\"
:false,
\"
inputs
\"
:[{
\"
indexed
\"
:true,
\"
internalType
\"
:
\"
address
\"
,
\"
name
\"
:
\"
recipient
\"
,
\"
type
\"
:
\"
address
\"
},{
\"
indexed
\"
:true,
\"
internalType
\"
:
\"
address
\"
,
\"
name
\"
:
\"
attester
\"
,
\"
type
\"
:
\"
address
\"
},{
\"
indexed
\"
:false,
\"
internalType
\"
:
\"
bytes32
\"
,
\"
name
\"
:
\"
uid
\"
,
\"
type
\"
:
\"
bytes32
\"
},{
\"
indexed
\"
:true,
\"
internalType
\"
:
\"
bytes32
\"
,
\"
name
\"
:
\"
schemaUID
\"
,
\"
type
\"
:
\"
bytes32
\"
}],
\"
name
\"
:
\"
Revoked
\"
,
\"
type
\"
:
\"
event
\"
},{
\"
anonymous
\"
:false,
\"
inputs
\"
:[{
\"
indexed
\"
:true,
\"
internalType
\"
:
\"
address
\"
,
\"
name
\"
:
\"
revoker
\"
,
\"
type
\"
:
\"
address
\"
},{
\"
indexed
\"
:true,
\"
internalType
\"
:
\"
bytes32
\"
,
\"
name
\"
:
\"
data
\"
,
\"
type
\"
:
\"
bytes32
\"
},{
\"
indexed
\"
:true,
\"
internalType
\"
:
\"
uint64
\"
,
\"
name
\"
:
\"
timestamp
\"
,
\"
type
\"
:
\"
uint64
\"
}],
\"
name
\"
:
\"
RevokedOffchain
\"
,
\"
type
\"
:
\"
event
\"
},{
\"
anonymous
\"
:false,
\"
inputs
\"
:[{
\"
indexed
\"
:true,
\"
internalType
\"
:
\"
bytes32
\"
,
\"
name
\"
:
\"
data
\"
,
\"
type
\"
:
\"
bytes32
\"
},{
\"
indexed
\"
:true,
\"
internalType
\"
:
\"
uint64
\"
,
\"
name
\"
:
\"
timestamp
\"
,
\"
type
\"
:
\"
uint64
\"
}],
\"
name
\"
:
\"
Timestamped
\"
,
\"
type
\"
:
\"
event
\"
},{
\"
inputs
\"
:[{
\"
components
\"
:[{
\"
internalType
\"
:
\"
bytes32
\"
,
\"
name
\"
:
\"
schema
\"
,
\"
type
\"
:
\"
bytes32
\"
},{
\"
components
\"
:[{
\"
internalType
\"
:
\"
address
\"
,
\"
name
\"
:
\"
recipient
\"
,
\"
type
\"
:
\"
address
\"
},{
\"
internalType
\"
:
\"
uint64
\"
,
\"
name
\"
:
\"
expirationTime
\"
,
\"
type
\"
:
\"
uint64
\"
},{
\"
internalType
\"
:
\"
bool
\"
,
\"
name
\"
:
\"
revocable
\"
,
\"
type
\"
:
\"
bool
\"
},{
\"
internalType
\"
:
\"
bytes32
\"
,
\"
name
\"
:
\"
refUID
\"
,
\"
type
\"
:
\"
bytes32
\"
},{
\"
internalType
\"
:
\"
bytes
\"
,
\"
name
\"
:
\"
data
\"
,
\"
type
\"
:
\"
bytes
\"
},{
\"
internalType
\"
:
\"
uint256
\"
,
\"
name
\"
:
\"
value
\"
,
\"
type
\"
:
\"
uint256
\"
}],
\"
internalType
\"
:
\"
structAttestationRequestData
\"
,
\"
name
\"
:
\"
data
\"
,
\"
type
\"
:
\"
tuple
\"
}],
\"
internalType
\"
:
\"
structAttestationRequest
\"
,
\"
name
\"
:
\"
request
\"
,
\"
type
\"
:
\"
tuple
\"
}],
\"
name
\"
:
\"
attest
\"
,
\"
outputs
\"
:[{
\"
internalType
\"
:
\"
bytes32
\"
,
\"
name
\"
:
\"\"
,
\"
type
\"
:
\"
bytes32
\"
}],
\"
stateMutability
\"
:
\"
payable
\"
,
\"
type
\"
:
\"
function
\"
},{
\"
inputs
\"
:[{
\"
components
\"
:[{
\"
internalType
\"
:
\"
bytes32
\"
,
\"
name
\"
:
\"
schema
\"
,
\"
type
\"
:
\"
bytes32
\"
},{
\"
components
\"
:[{
\"
internalType
\"
:
\"
address
\"
,
\"
name
\"
:
\"
recipient
\"
,
\"
type
\"
:
\"
address
\"
},{
\"
internalType
\"
:
\"
uint64
\"
,
\"
name
\"
:
\"
expirationTime
\"
,
\"
type
\"
:
\"
uint64
\"
},{
\"
internalType
\"
:
\"
bool
\"
,
\"
name
\"
:
\"
revocable
\"
,
\"
type
\"
:
\"
bool
\"
},{
\"
internalType
\"
:
\"
bytes32
\"
,
\"
name
\"
:
\"
refUID
\"
,
\"
type
\"
:
\"
bytes32
\"
},{
\"
internalType
\"
:
\"
bytes
\"
,
\"
name
\"
:
\"
data
\"
,
\"
type
\"
:
\"
bytes
\"
},{
\"
internalType
\"
:
\"
uint256
\"
,
\"
name
\"
:
\"
value
\"
,
\"
type
\"
:
\"
uint256
\"
}],
\"
internalType
\"
:
\"
structAttestationRequestData
\"
,
\"
name
\"
:
\"
data
\"
,
\"
type
\"
:
\"
tuple
\"
},{
\"
components
\"
:[{
\"
internalType
\"
:
\"
uint8
\"
,
\"
name
\"
:
\"
v
\"
,
\"
type
\"
:
\"
uint8
\"
},{
\"
internalType
\"
:
\"
bytes32
\"
,
\"
name
\"
:
\"
r
\"
,
\"
type
\"
:
\"
bytes32
\"
},{
\"
internalType
\"
:
\"
bytes32
\"
,
\"
name
\"
:
\"
s
\"
,
\"
type
\"
:
\"
bytes32
\"
}],
\"
internalType
\"
:
\"
structSignature
\"
,
\"
name
\"
:
\"
signature
\"
,
\"
type
\"
:
\"
tuple
\"
},{
\"
internalType
\"
:
\"
address
\"
,
\"
name
\"
:
\"
attester
\"
,
\"
type
\"
:
\"
address
\"
},{
\"
internalType
\"
:
\"
uint64
\"
,
\"
name
\"
:
\"
deadline
\"
,
\"
type
\"
:
\"
uint64
\"
}],
\"
internalType
\"
:
\"
structDelegatedAttestationRequest
\"
,
\"
name
\"
:
\"
delegatedRequest
\"
,
\"
type
\"
:
\"
tuple
\"
}],
\"
name
\"
:
\"
attestByDelegation
\"
,
\"
outputs
\"
:[{
\"
internalType
\"
:
\"
bytes32
\"
,
\"
name
\"
:
\"\"
,
\"
type
\"
:
\"
bytes32
\"
}],
\"
stateMutability
\"
:
\"
payable
\"
,
\"
type
\"
:
\"
function
\"
},{
\"
inputs
\"
:[],
\"
name
\"
:
\"
getAttestTypeHash
\"
,
\"
outputs
\"
:[{
\"
internalType
\"
:
\"
bytes32
\"
,
\"
name
\"
:
\"\"
,
\"
type
\"
:
\"
bytes32
\"
}],
\"
stateMutability
\"
:
\"
pure
\"
,
\"
type
\"
:
\"
function
\"
},{
\"
inputs
\"
:[{
\"
internalType
\"
:
\"
bytes32
\"
,
\"
name
\"
:
\"
uid
\"
,
\"
type
\"
:
\"
bytes32
\"
}],
\"
name
\"
:
\"
getAttestation
\"
,
\"
outputs
\"
:[{
\"
components
\"
:[{
\"
internalType
\"
:
\"
bytes32
\"
,
\"
name
\"
:
\"
uid
\"
,
\"
type
\"
:
\"
bytes32
\"
},{
\"
internalType
\"
:
\"
bytes32
\"
,
\"
name
\"
:
\"
schema
\"
,
\"
type
\"
:
\"
bytes32
\"
},{
\"
internalType
\"
:
\"
uint64
\"
,
\"
name
\"
:
\"
time
\"
,
\"
type
\"
:
\"
uint64
\"
},{
\"
internalType
\"
:
\"
uint64
\"
,
\"
name
\"
:
\"
expirationTime
\"
,
\"
type
\"
:
\"
uint64
\"
},{
\"
internalType
\"
:
\"
uint64
\"
,
\"
name
\"
:
\"
revocationTime
\"
,
\"
type
\"
:
\"
uint64
\"
},{
\"
internalType
\"
:
\"
bytes32
\"
,
\"
name
\"
:
\"
refUID
\"
,
\"
type
\"
:
\"
bytes32
\"
},{
\"
internalType
\"
:
\"
address
\"
,
\"
name
\"
:
\"
recipient
\"
,
\"
type
\"
:
\"
address
\"
},{
\"
internalType
\"
:
\"
address
\"
,
\"
name
\"
:
\"
attester
\"
,
\"
type
\"
:
\"
address
\"
},{
\"
internalType
\"
:
\"
bool
\"
,
\"
name
\"
:
\"
revocable
\"
,
\"
type
\"
:
\"
bool
\"
},{
\"
internalType
\"
:
\"
bytes
\"
,
\"
name
\"
:
\"
data
\"
,
\"
type
\"
:
\"
bytes
\"
}],
\"
internalType
\"
:
\"
structAttestation
\"
,
\"
name
\"
:
\"\"
,
\"
type
\"
:
\"
tuple
\"
}],
\"
stateMutability
\"
:
\"
view
\"
,
\"
type
\"
:
\"
function
\"
},{
\"
inputs
\"
:[],
\"
name
\"
:
\"
getDomainSeparator
\"
,
\"
outputs
\"
:[{
\"
internalType
\"
:
\"
bytes32
\"
,
\"
name
\"
:
\"\"
,
\"
type
\"
:
\"
bytes32
\"
}],
\"
stateMutability
\"
:
\"
view
\"
,
\"
type
\"
:
\"
function
\"
},{
\"
inputs
\"
:[],
\"
name
\"
:
\"
getName
\"
,
\"
outputs
\"
:[{
\"
internalType
\"
:
\"
string
\"
,
\"
name
\"
:
\"\"
,
\"
type
\"
:
\"
string
\"
}],
\"
stateMutability
\"
:
\"
view
\"
,
\"
type
\"
:
\"
function
\"
},{
\"
inputs
\"
:[{
\"
internalType
\"
:
\"
address
\"
,
\"
name
\"
:
\"
account
\"
,
\"
type
\"
:
\"
address
\"
}],
\"
name
\"
:
\"
getNonce
\"
,
\"
outputs
\"
:[{
\"
internalType
\"
:
\"
uint256
\"
,
\"
name
\"
:
\"\"
,
\"
type
\"
:
\"
uint256
\"
}],
\"
stateMutability
\"
:
\"
view
\"
,
\"
type
\"
:
\"
function
\"
},{
\"
inputs
\"
:[{
\"
internalType
\"
:
\"
address
\"
,
\"
name
\"
:
\"
revoker
\"
,
\"
type
\"
:
\"
address
\"
},{
\"
internalType
\"
:
\"
bytes32
\"
,
\"
name
\"
:
\"
data
\"
,
\"
type
\"
:
\"
bytes32
\"
}],
\"
name
\"
:
\"
getRevokeOffchain
\"
,
\"
outputs
\"
:[{
\"
internalType
\"
:
\"
uint64
\"
,
\"
name
\"
:
\"\"
,
\"
type
\"
:
\"
uint64
\"
}],
\"
stateMutability
\"
:
\"
view
\"
,
\"
type
\"
:
\"
function
\"
},{
\"
inputs
\"
:[],
\"
name
\"
:
\"
getRevokeTypeHash
\"
,
\"
outputs
\"
:[{
\"
internalType
\"
:
\"
bytes32
\"
,
\"
name
\"
:
\"\"
,
\"
type
\"
:
\"
bytes32
\"
}],
\"
stateMutability
\"
:
\"
pure
\"
,
\"
type
\"
:
\"
function
\"
},{
\"
inputs
\"
:[],
\"
name
\"
:
\"
getSchemaRegistry
\"
,
\"
outputs
\"
:[{
\"
internalType
\"
:
\"
contractISchemaRegistry
\"
,
\"
name
\"
:
\"\"
,
\"
type
\"
:
\"
address
\"
}],
\"
stateMutability
\"
:
\"
pure
\"
,
\"
type
\"
:
\"
function
\"
},{
\"
inputs
\"
:[{
\"
internalType
\"
:
\"
bytes32
\"
,
\"
name
\"
:
\"
data
\"
,
\"
type
\"
:
\"
bytes32
\"
}],
\"
name
\"
:
\"
getTimestamp
\"
,
\"
outputs
\"
:[{
\"
internalType
\"
:
\"
uint64
\"
,
\"
name
\"
:
\"\"
,
\"
type
\"
:
\"
uint64
\"
}],
\"
stateMutability
\"
:
\"
view
\"
,
\"
type
\"
:
\"
function
\"
},{
\"
inputs
\"
:[{
\"
internalType
\"
:
\"
uint256
\"
,
\"
name
\"
:
\"
newNonce
\"
,
\"
type
\"
:
\"
uint256
\"
}],
\"
name
\"
:
\"
increaseNonce
\"
,
\"
outputs
\"
:[],
\"
stateMutability
\"
:
\"
nonpayable
\"
,
\"
type
\"
:
\"
function
\"
},{
\"
inputs
\"
:[{
\"
internalType
\"
:
\"
bytes32
\"
,
\"
name
\"
:
\"
uid
\"
,
\"
type
\"
:
\"
bytes32
\"
}],
\"
name
\"
:
\"
isAttestationValid
\"
,
\"
outputs
\"
:[{
\"
internalType
\"
:
\"
bool
\"
,
\"
name
\"
:
\"\"
,
\"
type
\"
:
\"
bool
\"
}],
\"
stateMutability
\"
:
\"
view
\"
,
\"
type
\"
:
\"
function
\"
},{
\"
inputs
\"
:[{
\"
components
\"
:[{
\"
internalType
\"
:
\"
bytes32
\"
,
\"
name
\"
:
\"
schema
\"
,
\"
type
\"
:
\"
bytes32
\"
},{
\"
components
\"
:[{
\"
internalType
\"
:
\"
address
\"
,
\"
name
\"
:
\"
recipient
\"
,
\"
type
\"
:
\"
address
\"
},{
\"
internalType
\"
:
\"
uint64
\"
,
\"
name
\"
:
\"
expirationTime
\"
,
\"
type
\"
:
\"
uint64
\"
},{
\"
internalType
\"
:
\"
bool
\"
,
\"
name
\"
:
\"
revocable
\"
,
\"
type
\"
:
\"
bool
\"
},{
\"
internalType
\"
:
\"
bytes32
\"
,
\"
name
\"
:
\"
refUID
\"
,
\"
type
\"
:
\"
bytes32
\"
},{
\"
internalType
\"
:
\"
bytes
\"
,
\"
name
\"
:
\"
data
\"
,
\"
type
\"
:
\"
bytes
\"
},{
\"
internalType
\"
:
\"
uint256
\"
,
\"
name
\"
:
\"
value
\"
,
\"
type
\"
:
\"
uint256
\"
}],
\"
internalType
\"
:
\"
structAttestationRequestData[]
\"
,
\"
name
\"
:
\"
data
\"
,
\"
type
\"
:
\"
tuple[]
\"
}],
\"
internalType
\"
:
\"
structMultiAttestationRequest[]
\"
,
\"
name
\"
:
\"
multiRequests
\"
,
\"
type
\"
:
\"
tuple[]
\"
}],
\"
name
\"
:
\"
multiAttest
\"
,
\"
outputs
\"
:[{
\"
internalType
\"
:
\"
bytes32[]
\"
,
\"
name
\"
:
\"\"
,
\"
type
\"
:
\"
bytes32[]
\"
}],
\"
stateMutability
\"
:
\"
payable
\"
,
\"
type
\"
:
\"
function
\"
},{
\"
inputs
\"
:[{
\"
components
\"
:[{
\"
internalType
\"
:
\"
bytes32
\"
,
\"
name
\"
:
\"
schema
\"
,
\"
type
\"
:
\"
bytes32
\"
},{
\"
components
\"
:[{
\"
internalType
\"
:
\"
address
\"
,
\"
name
\"
:
\"
recipient
\"
,
\"
type
\"
:
\"
address
\"
},{
\"
internalType
\"
:
\"
uint64
\"
,
\"
name
\"
:
\"
expirationTime
\"
,
\"
type
\"
:
\"
uint64
\"
},{
\"
internalType
\"
:
\"
bool
\"
,
\"
name
\"
:
\"
revocable
\"
,
\"
type
\"
:
\"
bool
\"
},{
\"
internalType
\"
:
\"
bytes32
\"
,
\"
name
\"
:
\"
refUID
\"
,
\"
type
\"
:
\"
bytes32
\"
},{
\"
internalType
\"
:
\"
bytes
\"
,
\"
name
\"
:
\"
data
\"
,
\"
type
\"
:
\"
bytes
\"
},{
\"
internalType
\"
:
\"
uint256
\"
,
\"
name
\"
:
\"
value
\"
,
\"
type
\"
:
\"
uint256
\"
}],
\"
internalType
\"
:
\"
structAttestationRequestData[]
\"
,
\"
name
\"
:
\"
data
\"
,
\"
type
\"
:
\"
tuple[]
\"
},{
\"
components
\"
:[{
\"
internalType
\"
:
\"
uint8
\"
,
\"
name
\"
:
\"
v
\"
,
\"
type
\"
:
\"
uint8
\"
},{
\"
internalType
\"
:
\"
bytes32
\"
,
\"
name
\"
:
\"
r
\"
,
\"
type
\"
:
\"
bytes32
\"
},{
\"
internalType
\"
:
\"
bytes32
\"
,
\"
name
\"
:
\"
s
\"
,
\"
type
\"
:
\"
bytes32
\"
}],
\"
internalType
\"
:
\"
structSignature[]
\"
,
\"
name
\"
:
\"
signatures
\"
,
\"
type
\"
:
\"
tuple[]
\"
},{
\"
internalType
\"
:
\"
address
\"
,
\"
name
\"
:
\"
attester
\"
,
\"
type
\"
:
\"
address
\"
},{
\"
internalType
\"
:
\"
uint64
\"
,
\"
name
\"
:
\"
deadline
\"
,
\"
type
\"
:
\"
uint64
\"
}],
\"
internalType
\"
:
\"
structMultiDelegatedAttestationRequest[]
\"
,
\"
name
\"
:
\"
multiDelegatedRequests
\"
,
\"
type
\"
:
\"
tuple[]
\"
}],
\"
name
\"
:
\"
multiAttestByDelegation
\"
,
\"
outputs
\"
:[{
\"
internalType
\"
:
\"
bytes32[]
\"
,
\"
name
\"
:
\"\"
,
\"
type
\"
:
\"
bytes32[]
\"
}],
\"
stateMutability
\"
:
\"
payable
\"
,
\"
type
\"
:
\"
function
\"
},{
\"
inputs
\"
:[{
\"
components
\"
:[{
\"
internalType
\"
:
\"
bytes32
\"
,
\"
name
\"
:
\"
schema
\"
,
\"
type
\"
:
\"
bytes32
\"
},{
\"
components
\"
:[{
\"
internalType
\"
:
\"
bytes32
\"
,
\"
name
\"
:
\"
uid
\"
,
\"
type
\"
:
\"
bytes32
\"
},{
\"
internalType
\"
:
\"
uint256
\"
,
\"
name
\"
:
\"
value
\"
,
\"
type
\"
:
\"
uint256
\"
}],
\"
internalType
\"
:
\"
structRevocationRequestData[]
\"
,
\"
name
\"
:
\"
data
\"
,
\"
type
\"
:
\"
tuple[]
\"
}],
\"
internalType
\"
:
\"
structMultiRevocationRequest[]
\"
,
\"
name
\"
:
\"
multiRequests
\"
,
\"
type
\"
:
\"
tuple[]
\"
}],
\"
name
\"
:
\"
multiRevoke
\"
,
\"
outputs
\"
:[],
\"
stateMutability
\"
:
\"
payable
\"
,
\"
type
\"
:
\"
function
\"
},{
\"
inputs
\"
:[{
\"
components
\"
:[{
\"
internalType
\"
:
\"
bytes32
\"
,
\"
name
\"
:
\"
schema
\"
,
\"
type
\"
:
\"
bytes32
\"
},{
\"
components
\"
:[{
\"
internalType
\"
:
\"
bytes32
\"
,
\"
name
\"
:
\"
uid
\"
,
\"
type
\"
:
\"
bytes32
\"
},{
\"
internalType
\"
:
\"
uint256
\"
,
\"
name
\"
:
\"
value
\"
,
\"
type
\"
:
\"
uint256
\"
}],
\"
internalType
\"
:
\"
structRevocationRequestData[]
\"
,
\"
name
\"
:
\"
data
\"
,
\"
type
\"
:
\"
tuple[]
\"
},{
\"
components
\"
:[{
\"
internalType
\"
:
\"
uint8
\"
,
\"
name
\"
:
\"
v
\"
,
\"
type
\"
:
\"
uint8
\"
},{
\"
internalType
\"
:
\"
bytes32
\"
,
\"
name
\"
:
\"
r
\"
,
\"
type
\"
:
\"
bytes32
\"
},{
\"
internalType
\"
:
\"
bytes32
\"
,
\"
name
\"
:
\"
s
\"
,
\"
type
\"
:
\"
bytes32
\"
}],
\"
internalType
\"
:
\"
structSignature[]
\"
,
\"
name
\"
:
\"
signatures
\"
,
\"
type
\"
:
\"
tuple[]
\"
},{
\"
internalType
\"
:
\"
address
\"
,
\"
name
\"
:
\"
revoker
\"
,
\"
type
\"
:
\"
address
\"
},{
\"
internalType
\"
:
\"
uint64
\"
,
\"
name
\"
:
\"
deadline
\"
,
\"
type
\"
:
\"
uint64
\"
}],
\"
internalType
\"
:
\"
structMultiDelegatedRevocationRequest[]
\"
,
\"
name
\"
:
\"
multiDelegatedRequests
\"
,
\"
type
\"
:
\"
tuple[]
\"
}],
\"
name
\"
:
\"
multiRevokeByDelegation
\"
,
\"
outputs
\"
:[],
\"
stateMutability
\"
:
\"
payable
\"
,
\"
type
\"
:
\"
function
\"
},{
\"
inputs
\"
:[{
\"
internalType
\"
:
\"
bytes32[]
\"
,
\"
name
\"
:
\"
data
\"
,
\"
type
\"
:
\"
bytes32[]
\"
}],
\"
name
\"
:
\"
multiRevokeOffchain
\"
,
\"
outputs
\"
:[{
\"
internalType
\"
:
\"
uint64
\"
,
\"
name
\"
:
\"\"
,
\"
type
\"
:
\"
uint64
\"
}],
\"
stateMutability
\"
:
\"
nonpayable
\"
,
\"
type
\"
:
\"
function
\"
},{
\"
inputs
\"
:[{
\"
internalType
\"
:
\"
bytes32[]
\"
,
\"
name
\"
:
\"
data
\"
,
\"
type
\"
:
\"
bytes32[]
\"
}],
\"
name
\"
:
\"
multiTimestamp
\"
,
\"
outputs
\"
:[{
\"
internalType
\"
:
\"
uint64
\"
,
\"
name
\"
:
\"\"
,
\"
type
\"
:
\"
uint64
\"
}],
\"
stateMutability
\"
:
\"
nonpayable
\"
,
\"
type
\"
:
\"
function
\"
},{
\"
inputs
\"
:[{
\"
components
\"
:[{
\"
internalType
\"
:
\"
bytes32
\"
,
\"
name
\"
:
\"
schema
\"
,
\"
type
\"
:
\"
bytes32
\"
},{
\"
components
\"
:[{
\"
internalType
\"
:
\"
bytes32
\"
,
\"
name
\"
:
\"
uid
\"
,
\"
type
\"
:
\"
bytes32
\"
},{
\"
internalType
\"
:
\"
uint256
\"
,
\"
name
\"
:
\"
value
\"
,
\"
type
\"
:
\"
uint256
\"
}],
\"
internalType
\"
:
\"
structRevocationRequestData
\"
,
\"
name
\"
:
\"
data
\"
,
\"
type
\"
:
\"
tuple
\"
}],
\"
internalType
\"
:
\"
structRevocationRequest
\"
,
\"
name
\"
:
\"
request
\"
,
\"
type
\"
:
\"
tuple
\"
}],
\"
name
\"
:
\"
revoke
\"
,
\"
outputs
\"
:[],
\"
stateMutability
\"
:
\"
payable
\"
,
\"
type
\"
:
\"
function
\"
},{
\"
inputs
\"
:[{
\"
components
\"
:[{
\"
internalType
\"
:
\"
bytes32
\"
,
\"
name
\"
:
\"
schema
\"
,
\"
type
\"
:
\"
bytes32
\"
},{
\"
components
\"
:[{
\"
internalType
\"
:
\"
bytes32
\"
,
\"
name
\"
:
\"
uid
\"
,
\"
type
\"
:
\"
bytes32
\"
},{
\"
internalType
\"
:
\"
uint256
\"
,
\"
name
\"
:
\"
value
\"
,
\"
type
\"
:
\"
uint256
\"
}],
\"
internalType
\"
:
\"
structRevocationRequestData
\"
,
\"
name
\"
:
\"
data
\"
,
\"
type
\"
:
\"
tuple
\"
},{
\"
components
\"
:[{
\"
internalType
\"
:
\"
uint8
\"
,
\"
name
\"
:
\"
v
\"
,
\"
type
\"
:
\"
uint8
\"
},{
\"
internalType
\"
:
\"
bytes32
\"
,
\"
name
\"
:
\"
r
\"
,
\"
type
\"
:
\"
bytes32
\"
},{
\"
internalType
\"
:
\"
bytes32
\"
,
\"
name
\"
:
\"
s
\"
,
\"
type
\"
:
\"
bytes32
\"
}],
\"
internalType
\"
:
\"
structSignature
\"
,
\"
name
\"
:
\"
signature
\"
,
\"
type
\"
:
\"
tuple
\"
},{
\"
internalType
\"
:
\"
address
\"
,
\"
name
\"
:
\"
revoker
\"
,
\"
type
\"
:
\"
address
\"
},{
\"
internalType
\"
:
\"
uint64
\"
,
\"
name
\"
:
\"
deadline
\"
,
\"
type
\"
:
\"
uint64
\"
}],
\"
internalType
\"
:
\"
structDelegatedRevocationRequest
\"
,
\"
name
\"
:
\"
delegatedRequest
\"
,
\"
type
\"
:
\"
tuple
\"
}],
\"
name
\"
:
\"
revokeByDelegation
\"
,
\"
outputs
\"
:[],
\"
stateMutability
\"
:
\"
payable
\"
,
\"
type
\"
:
\"
function
\"
},{
\"
inputs
\"
:[{
\"
internalType
\"
:
\"
bytes32
\"
,
\"
name
\"
:
\"
data
\"
,
\"
type
\"
:
\"
bytes32
\"
}],
\"
name
\"
:
\"
revokeOffchain
\"
,
\"
outputs
\"
:[{
\"
internalType
\"
:
\"
uint64
\"
,
\"
name
\"
:
\"\"
,
\"
type
\"
:
\"
uint64
\"
}],
\"
stateMutability
\"
:
\"
nonpayable
\"
,
\"
type
\"
:
\"
function
\"
},{
\"
inputs
\"
:[{
\"
internalType
\"
:
\"
bytes32
\"
,
\"
name
\"
:
\"
data
\"
,
\"
type
\"
:
\"
bytes32
\"
}],
\"
name
\"
:
\"
timestamp
\"
,
\"
outputs
\"
:[{
\"
internalType
\"
:
\"
uint64
\"
,
\"
name
\"
:
\"\"
,
\"
type
\"
:
\"
uint64
\"
}],
\"
stateMutability
\"
:
\"
nonpayable
\"
,
\"
type
\"
:
\"
function
\"
},{
\"
inputs
\"
:[],
\"
name
\"
:
\"
version
\"
,
\"
outputs
\"
:[{
\"
internalType
\"
:
\"
string
\"
,
\"
name
\"
:
\"\"
,
\"
type
\"
:
\"
string
\"
}],
\"
stateMutability
\"
:
\"
view
\"
,
\"
type
\"
:
\"
function
\"
}]"
,
ABI
:
"[{
\"
inputs
\"
:[],
\"
stateMutability
\"
:
\"
nonpayable
\"
,
\"
type
\"
:
\"
constructor
\"
},{
\"
inputs
\"
:[],
\"
name
\"
:
\"
AccessDenied
\"
,
\"
type
\"
:
\"
error
\"
},{
\"
inputs
\"
:[],
\"
name
\"
:
\"
AlreadyRevoked
\"
,
\"
type
\"
:
\"
error
\"
},{
\"
inputs
\"
:[],
\"
name
\"
:
\"
AlreadyRevokedOffchain
\"
,
\"
type
\"
:
\"
error
\"
},{
\"
inputs
\"
:[],
\"
name
\"
:
\"
AlreadyTimestamped
\"
,
\"
type
\"
:
\"
error
\"
},{
\"
inputs
\"
:[],
\"
name
\"
:
\"
DeadlineExpired
\"
,
\"
type
\"
:
\"
error
\"
},{
\"
inputs
\"
:[],
\"
name
\"
:
\"
InsufficientValue
\"
,
\"
type
\"
:
\"
error
\"
},{
\"
inputs
\"
:[],
\"
name
\"
:
\"
InvalidAttestation
\"
,
\"
type
\"
:
\"
error
\"
},{
\"
inputs
\"
:[],
\"
name
\"
:
\"
InvalidAttestations
\"
,
\"
type
\"
:
\"
error
\"
},{
\"
inputs
\"
:[],
\"
name
\"
:
\"
InvalidExpirationTime
\"
,
\"
type
\"
:
\"
error
\"
},{
\"
inputs
\"
:[],
\"
name
\"
:
\"
InvalidLength
\"
,
\"
type
\"
:
\"
error
\"
},{
\"
inputs
\"
:[],
\"
name
\"
:
\"
InvalidNonce
\"
,
\"
type
\"
:
\"
error
\"
},{
\"
inputs
\"
:[],
\"
name
\"
:
\"
InvalidOffset
\"
,
\"
type
\"
:
\"
error
\"
},{
\"
inputs
\"
:[],
\"
name
\"
:
\"
InvalidRegistry
\"
,
\"
type
\"
:
\"
error
\"
},{
\"
inputs
\"
:[],
\"
name
\"
:
\"
InvalidRevocation
\"
,
\"
type
\"
:
\"
error
\"
},{
\"
inputs
\"
:[],
\"
name
\"
:
\"
InvalidRevocations
\"
,
\"
type
\"
:
\"
error
\"
},{
\"
inputs
\"
:[],
\"
name
\"
:
\"
InvalidSchema
\"
,
\"
type
\"
:
\"
error
\"
},{
\"
inputs
\"
:[],
\"
name
\"
:
\"
InvalidSignature
\"
,
\"
type
\"
:
\"
error
\"
},{
\"
inputs
\"
:[],
\"
name
\"
:
\"
InvalidVerifier
\"
,
\"
type
\"
:
\"
error
\"
},{
\"
inputs
\"
:[],
\"
name
\"
:
\"
Irrevocable
\"
,
\"
type
\"
:
\"
error
\"
},{
\"
inputs
\"
:[],
\"
name
\"
:
\"
NotFound
\"
,
\"
type
\"
:
\"
error
\"
},{
\"
inputs
\"
:[],
\"
name
\"
:
\"
NotPayable
\"
,
\"
type
\"
:
\"
error
\"
},{
\"
inputs
\"
:[],
\"
name
\"
:
\"
WrongSchema
\"
,
\"
type
\"
:
\"
error
\"
},{
\"
anonymous
\"
:false,
\"
inputs
\"
:[{
\"
indexed
\"
:true,
\"
internalType
\"
:
\"
address
\"
,
\"
name
\"
:
\"
recipient
\"
,
\"
type
\"
:
\"
address
\"
},{
\"
indexed
\"
:true,
\"
internalType
\"
:
\"
address
\"
,
\"
name
\"
:
\"
attester
\"
,
\"
type
\"
:
\"
address
\"
},{
\"
indexed
\"
:false,
\"
internalType
\"
:
\"
bytes32
\"
,
\"
name
\"
:
\"
uid
\"
,
\"
type
\"
:
\"
bytes32
\"
},{
\"
indexed
\"
:true,
\"
internalType
\"
:
\"
bytes32
\"
,
\"
name
\"
:
\"
schemaUID
\"
,
\"
type
\"
:
\"
bytes32
\"
}],
\"
name
\"
:
\"
Attested
\"
,
\"
type
\"
:
\"
event
\"
},{
\"
anonymous
\"
:false,
\"
inputs
\"
:[{
\"
indexed
\"
:false,
\"
internalType
\"
:
\"
uint256
\"
,
\"
name
\"
:
\"
oldNonce
\"
,
\"
type
\"
:
\"
uint256
\"
},{
\"
indexed
\"
:false,
\"
internalType
\"
:
\"
uint256
\"
,
\"
name
\"
:
\"
newNonce
\"
,
\"
type
\"
:
\"
uint256
\"
}],
\"
name
\"
:
\"
NonceIncreased
\"
,
\"
type
\"
:
\"
event
\"
},{
\"
anonymous
\"
:false,
\"
inputs
\"
:[{
\"
indexed
\"
:true,
\"
internalType
\"
:
\"
address
\"
,
\"
name
\"
:
\"
recipient
\"
,
\"
type
\"
:
\"
address
\"
},{
\"
indexed
\"
:true,
\"
internalType
\"
:
\"
address
\"
,
\"
name
\"
:
\"
attester
\"
,
\"
type
\"
:
\"
address
\"
},{
\"
indexed
\"
:false,
\"
internalType
\"
:
\"
bytes32
\"
,
\"
name
\"
:
\"
uid
\"
,
\"
type
\"
:
\"
bytes32
\"
},{
\"
indexed
\"
:true,
\"
internalType
\"
:
\"
bytes32
\"
,
\"
name
\"
:
\"
schemaUID
\"
,
\"
type
\"
:
\"
bytes32
\"
}],
\"
name
\"
:
\"
Revoked
\"
,
\"
type
\"
:
\"
event
\"
},{
\"
anonymous
\"
:false,
\"
inputs
\"
:[{
\"
indexed
\"
:true,
\"
internalType
\"
:
\"
address
\"
,
\"
name
\"
:
\"
revoker
\"
,
\"
type
\"
:
\"
address
\"
},{
\"
indexed
\"
:true,
\"
internalType
\"
:
\"
bytes32
\"
,
\"
name
\"
:
\"
data
\"
,
\"
type
\"
:
\"
bytes32
\"
},{
\"
indexed
\"
:true,
\"
internalType
\"
:
\"
uint64
\"
,
\"
name
\"
:
\"
timestamp
\"
,
\"
type
\"
:
\"
uint64
\"
}],
\"
name
\"
:
\"
RevokedOffchain
\"
,
\"
type
\"
:
\"
event
\"
},{
\"
anonymous
\"
:false,
\"
inputs
\"
:[{
\"
indexed
\"
:true,
\"
internalType
\"
:
\"
bytes32
\"
,
\"
name
\"
:
\"
data
\"
,
\"
type
\"
:
\"
bytes32
\"
},{
\"
indexed
\"
:true,
\"
internalType
\"
:
\"
uint64
\"
,
\"
name
\"
:
\"
timestamp
\"
,
\"
type
\"
:
\"
uint64
\"
}],
\"
name
\"
:
\"
Timestamped
\"
,
\"
type
\"
:
\"
event
\"
},{
\"
inputs
\"
:[{
\"
components
\"
:[{
\"
internalType
\"
:
\"
bytes32
\"
,
\"
name
\"
:
\"
schema
\"
,
\"
type
\"
:
\"
bytes32
\"
},{
\"
components
\"
:[{
\"
internalType
\"
:
\"
address
\"
,
\"
name
\"
:
\"
recipient
\"
,
\"
type
\"
:
\"
address
\"
},{
\"
internalType
\"
:
\"
uint64
\"
,
\"
name
\"
:
\"
expirationTime
\"
,
\"
type
\"
:
\"
uint64
\"
},{
\"
internalType
\"
:
\"
bool
\"
,
\"
name
\"
:
\"
revocable
\"
,
\"
type
\"
:
\"
bool
\"
},{
\"
internalType
\"
:
\"
bytes32
\"
,
\"
name
\"
:
\"
refUID
\"
,
\"
type
\"
:
\"
bytes32
\"
},{
\"
internalType
\"
:
\"
bytes
\"
,
\"
name
\"
:
\"
data
\"
,
\"
type
\"
:
\"
bytes
\"
},{
\"
internalType
\"
:
\"
uint256
\"
,
\"
name
\"
:
\"
value
\"
,
\"
type
\"
:
\"
uint256
\"
}],
\"
internalType
\"
:
\"
structAttestationRequestData
\"
,
\"
name
\"
:
\"
data
\"
,
\"
type
\"
:
\"
tuple
\"
}],
\"
internalType
\"
:
\"
structAttestationRequest
\"
,
\"
name
\"
:
\"
request
\"
,
\"
type
\"
:
\"
tuple
\"
}],
\"
name
\"
:
\"
attest
\"
,
\"
outputs
\"
:[{
\"
internalType
\"
:
\"
bytes32
\"
,
\"
name
\"
:
\"\"
,
\"
type
\"
:
\"
bytes32
\"
}],
\"
stateMutability
\"
:
\"
payable
\"
,
\"
type
\"
:
\"
function
\"
},{
\"
inputs
\"
:[{
\"
components
\"
:[{
\"
internalType
\"
:
\"
bytes32
\"
,
\"
name
\"
:
\"
schema
\"
,
\"
type
\"
:
\"
bytes32
\"
},{
\"
components
\"
:[{
\"
internalType
\"
:
\"
address
\"
,
\"
name
\"
:
\"
recipient
\"
,
\"
type
\"
:
\"
address
\"
},{
\"
internalType
\"
:
\"
uint64
\"
,
\"
name
\"
:
\"
expirationTime
\"
,
\"
type
\"
:
\"
uint64
\"
},{
\"
internalType
\"
:
\"
bool
\"
,
\"
name
\"
:
\"
revocable
\"
,
\"
type
\"
:
\"
bool
\"
},{
\"
internalType
\"
:
\"
bytes32
\"
,
\"
name
\"
:
\"
refUID
\"
,
\"
type
\"
:
\"
bytes32
\"
},{
\"
internalType
\"
:
\"
bytes
\"
,
\"
name
\"
:
\"
data
\"
,
\"
type
\"
:
\"
bytes
\"
},{
\"
internalType
\"
:
\"
uint256
\"
,
\"
name
\"
:
\"
value
\"
,
\"
type
\"
:
\"
uint256
\"
}],
\"
internalType
\"
:
\"
structAttestationRequestData
\"
,
\"
name
\"
:
\"
data
\"
,
\"
type
\"
:
\"
tuple
\"
},{
\"
components
\"
:[{
\"
internalType
\"
:
\"
uint8
\"
,
\"
name
\"
:
\"
v
\"
,
\"
type
\"
:
\"
uint8
\"
},{
\"
internalType
\"
:
\"
bytes32
\"
,
\"
name
\"
:
\"
r
\"
,
\"
type
\"
:
\"
bytes32
\"
},{
\"
internalType
\"
:
\"
bytes32
\"
,
\"
name
\"
:
\"
s
\"
,
\"
type
\"
:
\"
bytes32
\"
}],
\"
internalType
\"
:
\"
structSignature
\"
,
\"
name
\"
:
\"
signature
\"
,
\"
type
\"
:
\"
tuple
\"
},{
\"
internalType
\"
:
\"
address
\"
,
\"
name
\"
:
\"
attester
\"
,
\"
type
\"
:
\"
address
\"
},{
\"
internalType
\"
:
\"
uint64
\"
,
\"
name
\"
:
\"
deadline
\"
,
\"
type
\"
:
\"
uint64
\"
}],
\"
internalType
\"
:
\"
structDelegatedAttestationRequest
\"
,
\"
name
\"
:
\"
delegatedRequest
\"
,
\"
type
\"
:
\"
tuple
\"
}],
\"
name
\"
:
\"
attestByDelegation
\"
,
\"
outputs
\"
:[{
\"
internalType
\"
:
\"
bytes32
\"
,
\"
name
\"
:
\"\"
,
\"
type
\"
:
\"
bytes32
\"
}],
\"
stateMutability
\"
:
\"
payable
\"
,
\"
type
\"
:
\"
function
\"
},{
\"
inputs
\"
:[],
\"
name
\"
:
\"
getAttestTypeHash
\"
,
\"
outputs
\"
:[{
\"
internalType
\"
:
\"
bytes32
\"
,
\"
name
\"
:
\"\"
,
\"
type
\"
:
\"
bytes32
\"
}],
\"
stateMutability
\"
:
\"
pure
\"
,
\"
type
\"
:
\"
function
\"
},{
\"
inputs
\"
:[{
\"
internalType
\"
:
\"
bytes32
\"
,
\"
name
\"
:
\"
uid
\"
,
\"
type
\"
:
\"
bytes32
\"
}],
\"
name
\"
:
\"
getAttestation
\"
,
\"
outputs
\"
:[{
\"
components
\"
:[{
\"
internalType
\"
:
\"
bytes32
\"
,
\"
name
\"
:
\"
uid
\"
,
\"
type
\"
:
\"
bytes32
\"
},{
\"
internalType
\"
:
\"
bytes32
\"
,
\"
name
\"
:
\"
schema
\"
,
\"
type
\"
:
\"
bytes32
\"
},{
\"
internalType
\"
:
\"
uint64
\"
,
\"
name
\"
:
\"
time
\"
,
\"
type
\"
:
\"
uint64
\"
},{
\"
internalType
\"
:
\"
uint64
\"
,
\"
name
\"
:
\"
expirationTime
\"
,
\"
type
\"
:
\"
uint64
\"
},{
\"
internalType
\"
:
\"
uint64
\"
,
\"
name
\"
:
\"
revocationTime
\"
,
\"
type
\"
:
\"
uint64
\"
},{
\"
internalType
\"
:
\"
bytes32
\"
,
\"
name
\"
:
\"
refUID
\"
,
\"
type
\"
:
\"
bytes32
\"
},{
\"
internalType
\"
:
\"
address
\"
,
\"
name
\"
:
\"
recipient
\"
,
\"
type
\"
:
\"
address
\"
},{
\"
internalType
\"
:
\"
address
\"
,
\"
name
\"
:
\"
attester
\"
,
\"
type
\"
:
\"
address
\"
},{
\"
internalType
\"
:
\"
bool
\"
,
\"
name
\"
:
\"
revocable
\"
,
\"
type
\"
:
\"
bool
\"
},{
\"
internalType
\"
:
\"
bytes
\"
,
\"
name
\"
:
\"
data
\"
,
\"
type
\"
:
\"
bytes
\"
}],
\"
internalType
\"
:
\"
structAttestation
\"
,
\"
name
\"
:
\"\"
,
\"
type
\"
:
\"
tuple
\"
}],
\"
stateMutability
\"
:
\"
view
\"
,
\"
type
\"
:
\"
function
\"
},{
\"
inputs
\"
:[],
\"
name
\"
:
\"
getDomainSeparator
\"
,
\"
outputs
\"
:[{
\"
internalType
\"
:
\"
bytes32
\"
,
\"
name
\"
:
\"\"
,
\"
type
\"
:
\"
bytes32
\"
}],
\"
stateMutability
\"
:
\"
view
\"
,
\"
type
\"
:
\"
function
\"
},{
\"
inputs
\"
:[],
\"
name
\"
:
\"
getName
\"
,
\"
outputs
\"
:[{
\"
internalType
\"
:
\"
string
\"
,
\"
name
\"
:
\"\"
,
\"
type
\"
:
\"
string
\"
}],
\"
stateMutability
\"
:
\"
view
\"
,
\"
type
\"
:
\"
function
\"
},{
\"
inputs
\"
:[{
\"
internalType
\"
:
\"
address
\"
,
\"
name
\"
:
\"
account
\"
,
\"
type
\"
:
\"
address
\"
}],
\"
name
\"
:
\"
getNonce
\"
,
\"
outputs
\"
:[{
\"
internalType
\"
:
\"
uint256
\"
,
\"
name
\"
:
\"\"
,
\"
type
\"
:
\"
uint256
\"
}],
\"
stateMutability
\"
:
\"
view
\"
,
\"
type
\"
:
\"
function
\"
},{
\"
inputs
\"
:[{
\"
internalType
\"
:
\"
address
\"
,
\"
name
\"
:
\"
revoker
\"
,
\"
type
\"
:
\"
address
\"
},{
\"
internalType
\"
:
\"
bytes32
\"
,
\"
name
\"
:
\"
data
\"
,
\"
type
\"
:
\"
bytes32
\"
}],
\"
name
\"
:
\"
getRevokeOffchain
\"
,
\"
outputs
\"
:[{
\"
internalType
\"
:
\"
uint64
\"
,
\"
name
\"
:
\"\"
,
\"
type
\"
:
\"
uint64
\"
}],
\"
stateMutability
\"
:
\"
view
\"
,
\"
type
\"
:
\"
function
\"
},{
\"
inputs
\"
:[],
\"
name
\"
:
\"
getRevokeTypeHash
\"
,
\"
outputs
\"
:[{
\"
internalType
\"
:
\"
bytes32
\"
,
\"
name
\"
:
\"\"
,
\"
type
\"
:
\"
bytes32
\"
}],
\"
stateMutability
\"
:
\"
pure
\"
,
\"
type
\"
:
\"
function
\"
},{
\"
inputs
\"
:[],
\"
name
\"
:
\"
getSchemaRegistry
\"
,
\"
outputs
\"
:[{
\"
internalType
\"
:
\"
contractISchemaRegistry
\"
,
\"
name
\"
:
\"\"
,
\"
type
\"
:
\"
address
\"
}],
\"
stateMutability
\"
:
\"
pure
\"
,
\"
type
\"
:
\"
function
\"
},{
\"
inputs
\"
:[{
\"
internalType
\"
:
\"
bytes32
\"
,
\"
name
\"
:
\"
data
\"
,
\"
type
\"
:
\"
bytes32
\"
}],
\"
name
\"
:
\"
getTimestamp
\"
,
\"
outputs
\"
:[{
\"
internalType
\"
:
\"
uint64
\"
,
\"
name
\"
:
\"\"
,
\"
type
\"
:
\"
uint64
\"
}],
\"
stateMutability
\"
:
\"
view
\"
,
\"
type
\"
:
\"
function
\"
},{
\"
inputs
\"
:[{
\"
internalType
\"
:
\"
uint256
\"
,
\"
name
\"
:
\"
newNonce
\"
,
\"
type
\"
:
\"
uint256
\"
}],
\"
name
\"
:
\"
increaseNonce
\"
,
\"
outputs
\"
:[],
\"
stateMutability
\"
:
\"
nonpayable
\"
,
\"
type
\"
:
\"
function
\"
},{
\"
inputs
\"
:[{
\"
internalType
\"
:
\"
bytes32
\"
,
\"
name
\"
:
\"
uid
\"
,
\"
type
\"
:
\"
bytes32
\"
}],
\"
name
\"
:
\"
isAttestationValid
\"
,
\"
outputs
\"
:[{
\"
internalType
\"
:
\"
bool
\"
,
\"
name
\"
:
\"\"
,
\"
type
\"
:
\"
bool
\"
}],
\"
stateMutability
\"
:
\"
view
\"
,
\"
type
\"
:
\"
function
\"
},{
\"
inputs
\"
:[{
\"
components
\"
:[{
\"
internalType
\"
:
\"
bytes32
\"
,
\"
name
\"
:
\"
schema
\"
,
\"
type
\"
:
\"
bytes32
\"
},{
\"
components
\"
:[{
\"
internalType
\"
:
\"
address
\"
,
\"
name
\"
:
\"
recipient
\"
,
\"
type
\"
:
\"
address
\"
},{
\"
internalType
\"
:
\"
uint64
\"
,
\"
name
\"
:
\"
expirationTime
\"
,
\"
type
\"
:
\"
uint64
\"
},{
\"
internalType
\"
:
\"
bool
\"
,
\"
name
\"
:
\"
revocable
\"
,
\"
type
\"
:
\"
bool
\"
},{
\"
internalType
\"
:
\"
bytes32
\"
,
\"
name
\"
:
\"
refUID
\"
,
\"
type
\"
:
\"
bytes32
\"
},{
\"
internalType
\"
:
\"
bytes
\"
,
\"
name
\"
:
\"
data
\"
,
\"
type
\"
:
\"
bytes
\"
},{
\"
internalType
\"
:
\"
uint256
\"
,
\"
name
\"
:
\"
value
\"
,
\"
type
\"
:
\"
uint256
\"
}],
\"
internalType
\"
:
\"
structAttestationRequestData[]
\"
,
\"
name
\"
:
\"
data
\"
,
\"
type
\"
:
\"
tuple[]
\"
}],
\"
internalType
\"
:
\"
structMultiAttestationRequest[]
\"
,
\"
name
\"
:
\"
multiRequests
\"
,
\"
type
\"
:
\"
tuple[]
\"
}],
\"
name
\"
:
\"
multiAttest
\"
,
\"
outputs
\"
:[{
\"
internalType
\"
:
\"
bytes32[]
\"
,
\"
name
\"
:
\"\"
,
\"
type
\"
:
\"
bytes32[]
\"
}],
\"
stateMutability
\"
:
\"
payable
\"
,
\"
type
\"
:
\"
function
\"
},{
\"
inputs
\"
:[{
\"
components
\"
:[{
\"
internalType
\"
:
\"
bytes32
\"
,
\"
name
\"
:
\"
schema
\"
,
\"
type
\"
:
\"
bytes32
\"
},{
\"
components
\"
:[{
\"
internalType
\"
:
\"
address
\"
,
\"
name
\"
:
\"
recipient
\"
,
\"
type
\"
:
\"
address
\"
},{
\"
internalType
\"
:
\"
uint64
\"
,
\"
name
\"
:
\"
expirationTime
\"
,
\"
type
\"
:
\"
uint64
\"
},{
\"
internalType
\"
:
\"
bool
\"
,
\"
name
\"
:
\"
revocable
\"
,
\"
type
\"
:
\"
bool
\"
},{
\"
internalType
\"
:
\"
bytes32
\"
,
\"
name
\"
:
\"
refUID
\"
,
\"
type
\"
:
\"
bytes32
\"
},{
\"
internalType
\"
:
\"
bytes
\"
,
\"
name
\"
:
\"
data
\"
,
\"
type
\"
:
\"
bytes
\"
},{
\"
internalType
\"
:
\"
uint256
\"
,
\"
name
\"
:
\"
value
\"
,
\"
type
\"
:
\"
uint256
\"
}],
\"
internalType
\"
:
\"
structAttestationRequestData[]
\"
,
\"
name
\"
:
\"
data
\"
,
\"
type
\"
:
\"
tuple[]
\"
},{
\"
components
\"
:[{
\"
internalType
\"
:
\"
uint8
\"
,
\"
name
\"
:
\"
v
\"
,
\"
type
\"
:
\"
uint8
\"
},{
\"
internalType
\"
:
\"
bytes32
\"
,
\"
name
\"
:
\"
r
\"
,
\"
type
\"
:
\"
bytes32
\"
},{
\"
internalType
\"
:
\"
bytes32
\"
,
\"
name
\"
:
\"
s
\"
,
\"
type
\"
:
\"
bytes32
\"
}],
\"
internalType
\"
:
\"
structSignature[]
\"
,
\"
name
\"
:
\"
signatures
\"
,
\"
type
\"
:
\"
tuple[]
\"
},{
\"
internalType
\"
:
\"
address
\"
,
\"
name
\"
:
\"
attester
\"
,
\"
type
\"
:
\"
address
\"
},{
\"
internalType
\"
:
\"
uint64
\"
,
\"
name
\"
:
\"
deadline
\"
,
\"
type
\"
:
\"
uint64
\"
}],
\"
internalType
\"
:
\"
structMultiDelegatedAttestationRequest[]
\"
,
\"
name
\"
:
\"
multiDelegatedRequests
\"
,
\"
type
\"
:
\"
tuple[]
\"
}],
\"
name
\"
:
\"
multiAttestByDelegation
\"
,
\"
outputs
\"
:[{
\"
internalType
\"
:
\"
bytes32[]
\"
,
\"
name
\"
:
\"\"
,
\"
type
\"
:
\"
bytes32[]
\"
}],
\"
stateMutability
\"
:
\"
payable
\"
,
\"
type
\"
:
\"
function
\"
},{
\"
inputs
\"
:[{
\"
components
\"
:[{
\"
internalType
\"
:
\"
bytes32
\"
,
\"
name
\"
:
\"
schema
\"
,
\"
type
\"
:
\"
bytes32
\"
},{
\"
components
\"
:[{
\"
internalType
\"
:
\"
bytes32
\"
,
\"
name
\"
:
\"
uid
\"
,
\"
type
\"
:
\"
bytes32
\"
},{
\"
internalType
\"
:
\"
uint256
\"
,
\"
name
\"
:
\"
value
\"
,
\"
type
\"
:
\"
uint256
\"
}],
\"
internalType
\"
:
\"
structRevocationRequestData[]
\"
,
\"
name
\"
:
\"
data
\"
,
\"
type
\"
:
\"
tuple[]
\"
}],
\"
internalType
\"
:
\"
structMultiRevocationRequest[]
\"
,
\"
name
\"
:
\"
multiRequests
\"
,
\"
type
\"
:
\"
tuple[]
\"
}],
\"
name
\"
:
\"
multiRevoke
\"
,
\"
outputs
\"
:[],
\"
stateMutability
\"
:
\"
payable
\"
,
\"
type
\"
:
\"
function
\"
},{
\"
inputs
\"
:[{
\"
components
\"
:[{
\"
internalType
\"
:
\"
bytes32
\"
,
\"
name
\"
:
\"
schema
\"
,
\"
type
\"
:
\"
bytes32
\"
},{
\"
components
\"
:[{
\"
internalType
\"
:
\"
bytes32
\"
,
\"
name
\"
:
\"
uid
\"
,
\"
type
\"
:
\"
bytes32
\"
},{
\"
internalType
\"
:
\"
uint256
\"
,
\"
name
\"
:
\"
value
\"
,
\"
type
\"
:
\"
uint256
\"
}],
\"
internalType
\"
:
\"
structRevocationRequestData[]
\"
,
\"
name
\"
:
\"
data
\"
,
\"
type
\"
:
\"
tuple[]
\"
},{
\"
components
\"
:[{
\"
internalType
\"
:
\"
uint8
\"
,
\"
name
\"
:
\"
v
\"
,
\"
type
\"
:
\"
uint8
\"
},{
\"
internalType
\"
:
\"
bytes32
\"
,
\"
name
\"
:
\"
r
\"
,
\"
type
\"
:
\"
bytes32
\"
},{
\"
internalType
\"
:
\"
bytes32
\"
,
\"
name
\"
:
\"
s
\"
,
\"
type
\"
:
\"
bytes32
\"
}],
\"
internalType
\"
:
\"
structSignature[]
\"
,
\"
name
\"
:
\"
signatures
\"
,
\"
type
\"
:
\"
tuple[]
\"
},{
\"
internalType
\"
:
\"
address
\"
,
\"
name
\"
:
\"
revoker
\"
,
\"
type
\"
:
\"
address
\"
},{
\"
internalType
\"
:
\"
uint64
\"
,
\"
name
\"
:
\"
deadline
\"
,
\"
type
\"
:
\"
uint64
\"
}],
\"
internalType
\"
:
\"
structMultiDelegatedRevocationRequest[]
\"
,
\"
name
\"
:
\"
multiDelegatedRequests
\"
,
\"
type
\"
:
\"
tuple[]
\"
}],
\"
name
\"
:
\"
multiRevokeByDelegation
\"
,
\"
outputs
\"
:[],
\"
stateMutability
\"
:
\"
payable
\"
,
\"
type
\"
:
\"
function
\"
},{
\"
inputs
\"
:[{
\"
internalType
\"
:
\"
bytes32[]
\"
,
\"
name
\"
:
\"
data
\"
,
\"
type
\"
:
\"
bytes32[]
\"
}],
\"
name
\"
:
\"
multiRevokeOffchain
\"
,
\"
outputs
\"
:[{
\"
internalType
\"
:
\"
uint64
\"
,
\"
name
\"
:
\"\"
,
\"
type
\"
:
\"
uint64
\"
}],
\"
stateMutability
\"
:
\"
nonpayable
\"
,
\"
type
\"
:
\"
function
\"
},{
\"
inputs
\"
:[{
\"
internalType
\"
:
\"
bytes32[]
\"
,
\"
name
\"
:
\"
data
\"
,
\"
type
\"
:
\"
bytes32[]
\"
}],
\"
name
\"
:
\"
multiTimestamp
\"
,
\"
outputs
\"
:[{
\"
internalType
\"
:
\"
uint64
\"
,
\"
name
\"
:
\"\"
,
\"
type
\"
:
\"
uint64
\"
}],
\"
stateMutability
\"
:
\"
nonpayable
\"
,
\"
type
\"
:
\"
function
\"
},{
\"
inputs
\"
:[{
\"
components
\"
:[{
\"
internalType
\"
:
\"
bytes32
\"
,
\"
name
\"
:
\"
schema
\"
,
\"
type
\"
:
\"
bytes32
\"
},{
\"
components
\"
:[{
\"
internalType
\"
:
\"
bytes32
\"
,
\"
name
\"
:
\"
uid
\"
,
\"
type
\"
:
\"
bytes32
\"
},{
\"
internalType
\"
:
\"
uint256
\"
,
\"
name
\"
:
\"
value
\"
,
\"
type
\"
:
\"
uint256
\"
}],
\"
internalType
\"
:
\"
structRevocationRequestData
\"
,
\"
name
\"
:
\"
data
\"
,
\"
type
\"
:
\"
tuple
\"
}],
\"
internalType
\"
:
\"
structRevocationRequest
\"
,
\"
name
\"
:
\"
request
\"
,
\"
type
\"
:
\"
tuple
\"
}],
\"
name
\"
:
\"
revoke
\"
,
\"
outputs
\"
:[],
\"
stateMutability
\"
:
\"
payable
\"
,
\"
type
\"
:
\"
function
\"
},{
\"
inputs
\"
:[{
\"
components
\"
:[{
\"
internalType
\"
:
\"
bytes32
\"
,
\"
name
\"
:
\"
schema
\"
,
\"
type
\"
:
\"
bytes32
\"
},{
\"
components
\"
:[{
\"
internalType
\"
:
\"
bytes32
\"
,
\"
name
\"
:
\"
uid
\"
,
\"
type
\"
:
\"
bytes32
\"
},{
\"
internalType
\"
:
\"
uint256
\"
,
\"
name
\"
:
\"
value
\"
,
\"
type
\"
:
\"
uint256
\"
}],
\"
internalType
\"
:
\"
structRevocationRequestData
\"
,
\"
name
\"
:
\"
data
\"
,
\"
type
\"
:
\"
tuple
\"
},{
\"
components
\"
:[{
\"
internalType
\"
:
\"
uint8
\"
,
\"
name
\"
:
\"
v
\"
,
\"
type
\"
:
\"
uint8
\"
},{
\"
internalType
\"
:
\"
bytes32
\"
,
\"
name
\"
:
\"
r
\"
,
\"
type
\"
:
\"
bytes32
\"
},{
\"
internalType
\"
:
\"
bytes32
\"
,
\"
name
\"
:
\"
s
\"
,
\"
type
\"
:
\"
bytes32
\"
}],
\"
internalType
\"
:
\"
structSignature
\"
,
\"
name
\"
:
\"
signature
\"
,
\"
type
\"
:
\"
tuple
\"
},{
\"
internalType
\"
:
\"
address
\"
,
\"
name
\"
:
\"
revoker
\"
,
\"
type
\"
:
\"
address
\"
},{
\"
internalType
\"
:
\"
uint64
\"
,
\"
name
\"
:
\"
deadline
\"
,
\"
type
\"
:
\"
uint64
\"
}],
\"
internalType
\"
:
\"
structDelegatedRevocationRequest
\"
,
\"
name
\"
:
\"
delegatedRequest
\"
,
\"
type
\"
:
\"
tuple
\"
}],
\"
name
\"
:
\"
revokeByDelegation
\"
,
\"
outputs
\"
:[],
\"
stateMutability
\"
:
\"
payable
\"
,
\"
type
\"
:
\"
function
\"
},{
\"
inputs
\"
:[{
\"
internalType
\"
:
\"
bytes32
\"
,
\"
name
\"
:
\"
data
\"
,
\"
type
\"
:
\"
bytes32
\"
}],
\"
name
\"
:
\"
revokeOffchain
\"
,
\"
outputs
\"
:[{
\"
internalType
\"
:
\"
uint64
\"
,
\"
name
\"
:
\"\"
,
\"
type
\"
:
\"
uint64
\"
}],
\"
stateMutability
\"
:
\"
nonpayable
\"
,
\"
type
\"
:
\"
function
\"
},{
\"
inputs
\"
:[{
\"
internalType
\"
:
\"
bytes32
\"
,
\"
name
\"
:
\"
data
\"
,
\"
type
\"
:
\"
bytes32
\"
}],
\"
name
\"
:
\"
timestamp
\"
,
\"
outputs
\"
:[{
\"
internalType
\"
:
\"
uint64
\"
,
\"
name
\"
:
\"\"
,
\"
type
\"
:
\"
uint64
\"
}],
\"
stateMutability
\"
:
\"
nonpayable
\"
,
\"
type
\"
:
\"
function
\"
},{
\"
inputs
\"
:[],
\"
name
\"
:
\"
version
\"
,
\"
outputs
\"
:[{
\"
internalType
\"
:
\"
string
\"
,
\"
name
\"
:
\"\"
,
\"
type
\"
:
\"
string
\"
}],
\"
stateMutability
\"
:
\"
view
\"
,
\"
type
\"
:
\"
function
\"
}]"
,
Bin
:
"0x61016060405234801561001157600080fd5b50604080518082018252600381526245415360e81b60208083019182528351808501855260058152640312e3
22e360dc1b908201529151812060e08190527fe374587661e69268352d25204d81b23ce801573f4b09f3545e69536dc085a37a6101008190524660a081815286517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818801819052818901959095526060810193909352608080840192909252308382018190528751808503909201825260c093840190975280519501949094209093529290915261012091909152516101405260805160a05160c05160e05161010051610120516101405161454d61014b600039600061073701526000612753015260006127a20152600061277d015260006126d6015260006127000152600061272a015261454d6000f3fe60806040526004361061018b5760003560e01c806395411525116100d6578063d45c44351161007f578063ed24911d11610059578063ed24911d146104fd578063f10b5cc814610512578063f17325e71461054157600080fd5b8063d45c443514610467578063e30bb5631461049e578063e71ff365146104dd57600080fd5b8063b469318d116100b0578063b469318d146103ba578063b83010d314610414578063cf190f341461044757600080fd5b80639541152514610367578063a3112a641461037a578063a6d4dbc7146103a757600080fd5b806344adc90e116101385780634d003070116101125780634d003070146102de57806354fd4d50146102fe57806379f7573a1461034757600080fd5b806344adc90e1461029857806346926267146102b85780634cb7e9e5146102cb57600080fd5b806317d7de7c1161016957806317d7de7c146102205780632d0335ab146102425780633c0427151461028557600080fd5b80630eabf6601461019057806312b11a17146101a557806313893f61146101e7575b600080fd5b6101a361019e366004613497565b610554565b005b3480156101b157600080fd5b507ff83bb2b0ede93a840239f7e701a54d9bc35f03701f51ae153d601c6947ff3d3f5b6040519081526020015b60405180910390f35b3480156101f357600080fd5b50610207610202366004613497565b6106eb565b60405167ffffffffffffffff90911681526020016101de565b34801561022c57600080fd5b50610235610730565b6040516101de9190613547565b34801561024e57600080fd5b506101d461025d36600461358c565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b6101d46102933660046135a9565b610760565b6102ab6102a6366004613497565b610863565b6040516101de91906135e4565b6101a36102c6366004613628565b6109e4565b6101a36102d9366004613497565b610a68565b3480156102ea57600080fd5b506102076102f9366004613640565b610b4b565b34801561030a57600080fd5b506102356040518060400160405280600581526020017f312e332e3000000000000000000000000000000000000000000000000000000081525081565b34801561035357600080fd5b506101a3610362366004613640565b610b58565b6102ab610375366004613497565b610bef565b34801561038657600080fd5b5061039a610395366004613640565b610e62565b6040516101de9190613740565b6101a36103b5366004613753565b611025565b3480156103c657600080fd5b506102076103d5366004613766565b73ffffffffffffffffffffffffffffffffffffffff919091166000908152603460209081526040808320938352929052205467ffffffffffffffff1690565b34801561042057600080fd5b507f2d4116d8c9824e4c316453e5c2843a1885580374159ce8768603c49085ef424c6101d4565b34801561045357600080fd5b50610207610462366004613640565b6110ca565b34801561047357600080fd5b50610207610482366004613640565b60009081526033602052604090205467ffffffffffffffff1690565b3480156104aa57600080fd5b506104cd6104b9366004613640565b600090815260326020526040902054151590565b60405190151581526020016101de565b3480156104e957600080fd5b506102076104f8366004613497565b6110d8565b34801561050957600080fd5b506101d4611110565b34801561051e57600080fd5b5060405173420000000000000000000000000000000000002081526020016101de565b6101d461054f366004613792565b61111a565b348160005b818110156106e4577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82018114600086868481811061059a5761059a6137cd565b90506020028101906105ac91906137fc565b6105b590613a92565b60208101518051919250908015806105d257508260400151518114155b15610609576040517f947d5a8400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b818110156106ad576106a56040518060a001604052808660000151815260200185848151811061063e5761063e6137cd565b6020026020010151815260200186604001518481518110610661576106616137cd565b60200260200101518152602001866060015173ffffffffffffffffffffffffffffffffffffffff168152602001866080015167ffffffffffffffff168152506111d8565b60010161060c565b506106c383600001518385606001518a886113c5565b6106cd9088613bbc565b9650505050506106dd8160010190565b9050610559565b5050505050565b60004282825b818110156107245761071c3387878481811061070f5761070f6137cd565b90506020020135856119f4565b6001016106f1565b50909150505b92915050565b606061075b7f0000000000000000000000000000000000000000000000000000000000000000611af3565b905090565b600061077361076e83613cf1565b611c81565b604080516001808252818301909252600091816020015b6040805160c081018252600080825260208083018290529282018190526060808301829052608083015260a082015282527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90920191018161078a5790505090506107f86020840184613d6c565b61080190613da0565b81600081518110610814576108146137cd565b602090810291909101015261083d83358261083560c0870160a0880161358c565b346001611dfe565b60200151600081518110610853576108536137cd565b6020026020010151915050919050565b60608160008167ffffffffffffffff8111156108815761088161383a565b6040519080825280602002602001820160405280156108b457816020015b606081526020019060019003908161089f5790505b509050600034815b848110156109ce577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff85018114368989848181106108fc576108fc6137cd565b905060200281019061090e9190613dac565b905061091d6020820182613de0565b9050600003610958576040517f947d5a8400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061097d823561096c6020850185613de0565b61097591613e48565b338887611dfe565b805190915061098c9086613bbc565b945080602001518785815181106109a5576109a56137cd565b6020026020010181905250806020015151860195505050506109c78160010190565b90506108bc565b506109d98383612510565b979650505050505050565b604080516001808252818301909252600091816020015b60408051808201909152600080825260208201528152602001906001900390816109fb579050509050610a3636839003830160208401613ebc565b81600081518110610a4957610a496137cd565b6020908102919091010152610a63823582333460016113c5565b505050565b348160005b818110156106e4577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8201811436868684818110610aad57610aad6137cd565b9050602002810190610abf9190613dac565b9050610b2c8135610ad36020840184613ed8565b808060200260200160405190810160405280939291908181526020016000905b82821015610b1f57610b1060408302860136819003810190613ebc565b81526020019060010190610af3565b50505050503388866113c5565b610b369086613bbc565b94505050610b448160010190565b9050610a6d565b60004261072a83826125fa565b33600090815260208190526040902054808211610ba1576040517f756688fe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b336000908152602081815260409182902084905581518381529081018490527f57b09af877df9068fd60a69d7b21f5576b8b38955812d6ae4ac52942f1e38fb7910160405180910390a15050565b60608160008167ffffffffffffffff811115610c0d57610c0d61383a565b604051908082528060200260200182016040528015610c4057816020015b6060815260200190600190039081610c2b5790505b509050600034815b848110156109ce577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8501811436898984818110610c8857610c886137cd565b9050602002810190610c9a91906137fc565b9050366000610cac6020840184613de0565b909250905080801580610ccd5750610cc76040850185613f40565b90508114155b15610d04576040517f947d5a8400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b81811015610de557610ddd6040518060a0016040528087600001358152602001868685818110610d3957610d396137cd565b9050602002810190610d4b9190613d6c565b610d5490613da0565b8152602001610d666040890189613f40565b85818110610d7657610d766137cd565b905060600201803603810190610d8c9190613fa7565b8152602001610da16080890160608a0161358c565b73ffffffffffffffffffffffffffffffffffffffff168152602001610dcc60a0890160808a01613fc3565b67ffffffffffffffff169052611c81565b600101610d07565b506000610e0e8535610df78587613e48565b610e076080890160608a0161358c565b8b8a611dfe565b8051909150610e1d9089613bbc565b975080602001518a8881518110610e3657610e366137cd565b602002602001018190525080602001515189019850505050505050610e5b8160010190565b9050610c48565b604080516101408101825260008082526020820181905291810182905260608082018390526080820183905260a0820183905260c0820183905260e0820183905261010082019290925261012081019190915260008281526032602090815260409182902082516101408101845281548152600182015492810192909252600281015467ffffffffffffffff808216948401949094526801000000000000000081048416606084015270010000000000000000000000000000000090049092166080820152600382015460a0820152600482015473ffffffffffffffffffffffffffffffffffffffff90811660c0830152600583015490811660e083015274010000000000000000000000000000000000000000900460ff16151561010082015260068201805491929161012084019190610f9c90613fde565b80601f0160208091040260200160405190810160405280929190818152602001828054610fc890613fde565b80156110155780601f10610fea57610100808354040283529160200191611015565b820191906000526020600020905b815481529060010190602001808311610ff857829003601f168201915b5050505050815250509050919050565b61103c6110373683900383018361402b565b6111d8565b604080516001808252818301909252600091816020015b604080518082019091526000808252602082015281526020019060019003908161105357905050905061108e36839003830160208401613ebc565b816000815181106110a1576110a16137cd565b6020908102919091010152610a638235826110c260e0860160c0870161358c565b3460016113c5565b60004261072a3384836119f4565b60004282825b81811015610724576111088686838181106110fb576110fb6137cd565b90506020020135846125fa565b6001016110de565b600061075b6126bc565b604080516001808252818301909252600091829190816020015b6040805160c081018252600080825260208083018290529282018190526060808301829052608083015260a082015282527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9092019101816111345790505090506111a26020840184613d6c565b6111ab90613da0565b816000815181106111be576111be6137cd565b602090810291909101015261083d83358233346001611dfe565b608081015167ffffffffffffffff161580159061120c57504267ffffffffffffffff16816080015167ffffffffffffffff16105b15611243576040517f1ab7da6b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020808201516040808401518451835184860151606088015173ffffffffffffffffffffffffffffffffffffffff166000908152968790529386208054959693959394611313947f2d4116d8c9824e4c316453e5c2843a1885580374159ce8768603c49085ef424c949392876112b883614099565b909155506080808b015160408051602081019890985287019590955260608601939093529184015260a083015267ffffffffffffffff1660c082015260e0015b604051602081830303815290604052805190602001206127f0565b905061138984606001518284602001518560400151866000015160405160200161137593929190928352602083019190915260f81b7fff0000000000000000000000000000000000000000000000000000000000000016604082015260410190565b604051602081830303815290604052612803565b6113bf576040517f8baa579f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b6040517fa2ea7c6e0000000000000000000000000000000000000000000000000000000081526004810186905260009081907342000000000000000000000000000000000000209063a2ea7c6e90602401600060405180830381865afa158015611433573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261147991908101906140d1565b80519091506114b4576040517fbf37b20e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b855160008167ffffffffffffffff8111156114d1576114d161383a565b60405190808252806020026020018201604052801561157057816020015b60408051610140810182526000808252602080830182905292820181905260608083018290526080830182905260a0830182905260c0830182905260e0830182905261010083019190915261012082015282527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9092019101816114ef5790505b50905060008267ffffffffffffffff81111561158e5761158e61383a565b6040519080825280602002602001820160405280156115b7578160200160208202803683370190505b50905060005b838110156119d65760008a82815181106115d9576115d96137cd565b6020908102919091018101518051600090815260329092526040909120805491925090611632576040517fc5723b5100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8c81600101541461166f576040517fbf37b20e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600581015473ffffffffffffffffffffffffffffffffffffffff8c81169116146116c5576040517f4ca8886700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600581015474010000000000000000000000000000000000000000900460ff1661171b576040517f157bd4c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002810154700100000000000000000000000000000000900467ffffffffffffffff1615611775576040517f905e710700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b426002820180547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff811670010000000000000000000000000000000067ffffffffffffffff948516810291821793849055604080516101408101825287548152600188015460208201529386169286169290921791830191909152680100000000000000008304841660608301529091049091166080820152600382015460a0820152600482015473ffffffffffffffffffffffffffffffffffffffff90811660c0830152600583015490811660e083015274010000000000000000000000000000000000000000900460ff161515610100820152600682018054839161012084019161188190613fde565b80601f01602080910402602001604051908101604052809291908181526020018280546118ad90613fde565b80156118fa5780601f106118cf576101008083540402835291602001916118fa565b820191906000526020600020905b8154815290600101906020018083116118dd57829003601f168201915b505050505081525050858481518110611915576119156137cd565b60200260200101819052508160200151848481518110611937576119376137cd565b6020026020010181815250508c8b73ffffffffffffffffffffffffffffffffffffffff1686858151811061196d5761196d6137cd565b602002602001015160c0015173ffffffffffffffffffffffffffffffffffffffff167ff930a6e2523c9cc298691873087a740550b8fc85a0680830414c148ed927f61585600001516040516119c491815260200190565b60405180910390a450506001016115bd565b506119e684838360018b8b6129d2565b9a9950505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff83166000908152603460209081526040808320858452918290529091205467ffffffffffffffff1615611a68576040517fec9d6eeb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008381526020829052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff861690811790915590519091859173ffffffffffffffffffffffffffffffffffffffff8816917f92a1f7a41a7c585a8b09e25b195e225b1d43248daca46b0faf9e0792777a222991a450505050565b604080516020808252818301909252606091600091906020820181803683370190505090506000805b6020811015611bbe576000858260208110611b3957611b396137cd565b1a60f81b90507fff000000000000000000000000000000000000000000000000000000000000008116600003611b6f5750611bbe565b80848481518110611b8257611b826137cd565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505060019182019101611b1c565b5060008167ffffffffffffffff811115611bda57611bda61383a565b6040519080825280601f01601f191660200182016040528015611c04576020820181803683370190505b50905060005b82811015611c7857838181518110611c2457611c246137cd565b602001015160f81c60f81b828281518110611c4157611c416137cd565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600101611c0a565b50949350505050565b608081015167ffffffffffffffff1615801590611cb557504267ffffffffffffffff16816080015167ffffffffffffffff16105b15611cec576040517f1ab7da6b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60208082015160408084015184518351848601518486015160608088015160808901518051908b012060a08a0151928c015173ffffffffffffffffffffffffffffffffffffffff1660009081529a8b9052978a208054999a97999798611313987ff83bb2b0ede93a840239f7e701a54d9bc35f03701f51ae153d601c6947ff3d3f989796959491928b611d7e83614099565b909155506080808f015160408051602081019c909c528b019990995273ffffffffffffffffffffffffffffffffffffffff90971660608a015267ffffffffffffffff9586169689019690965292151560a088015260c087019190915260e086015261010085015261012084019190915216610140820152610160016112f8565b60408051808201909152600081526060602082015284516040805180820190915260008152606060208201528167ffffffffffffffff811115611e4357611e4361383a565b604051908082528060200260200182016040528015611e6c578160200160208202803683370190505b5060208201526040517fa2ea7c6e000000000000000000000000000000000000000000000000000000008152600481018990526000907342000000000000000000000000000000000000209063a2ea7c6e90602401600060405180830381865afa158015611ede573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052611f2491908101906140d1565b8051909150611f5f576040517fbf37b20e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008367ffffffffffffffff811115611f7a57611f7a61383a565b60405190808252806020026020018201604052801561201957816020015b60408051610140810182526000808252602080830182905292820181905260608083018290526080830182905260a0830182905260c0830182905260e0830182905261010083019190915261012082015282527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff909201910181611f985790505b50905060008467ffffffffffffffff8111156120375761203761383a565b604051908082528060200260200182016040528015612060578160200160208202803683370190505b50905060005b858110156124ef5760008b8281518110612082576120826137cd565b60200260200101519050600067ffffffffffffffff16816020015167ffffffffffffffff16141580156120cd57504267ffffffffffffffff16816020015167ffffffffffffffff1611155b15612104576040517f08e8b93700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8460400151158015612117575080604001515b1561214e576040517f157bd4c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006040518061014001604052806000801b81526020018f81526020016121724290565b67ffffffffffffffff168152602001836020015167ffffffffffffffff168152602001600067ffffffffffffffff16815260200183606001518152602001836000015173ffffffffffffffffffffffffffffffffffffffff1681526020018d73ffffffffffffffffffffffffffffffffffffffff16815260200183604001511515815260200183608001518152509050600080600090505b6122148382612dc3565b600081815260326020526040902054909250156122335760010161220a565b81835260008281526032602090815260409182902085518155908501516001820155908401516002820180546060870151608088015167ffffffffffffffff908116700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff92821668010000000000000000027fffffffffffffffffffffffffffffffff000000000000000000000000000000009094169190951617919091171691909117905560a0840151600382015560c084015160048201805473ffffffffffffffffffffffffffffffffffffffff9283167fffffffffffffffffffffffff000000000000000000000000000000000000000090911617905560e0850151600583018054610100880151151574010000000000000000000000000000000000000000027fffffffffffffffffffffff000000000000000000000000000000000000000000909116929093169190911791909117905561012084015184919060068201906123b390826141f7565b50505060608401511561240a57606084015160009081526032602052604090205461240a576040517fc5723b5100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8287868151811061241d5761241d6137cd565b60200260200101819052508360a0015186868151811061243f5761243f6137cd565b6020026020010181815250508189602001518681518110612462576124626137cd565b6020026020010181815250508f8e73ffffffffffffffffffffffffffffffffffffffff16856000015173ffffffffffffffffffffffffffffffffffffffff167f8bf46bf4cfd674fa735a3d63ec1c9ad4153f033c290341f3a588b75685141b35856040516124d291815260200190565b60405180910390a4505050506124e88160010190565b9050612066565b506124ff83838360008c8c6129d2565b845250919998505050505050505050565b606060008267ffffffffffffffff81111561252d5761252d61383a565b604051908082528060200260200182016040528015612556578160200160208202803683370190505b508451909150600090815b818110156125ef57600087828151811061257d5761257d6137cd565b6020026020010151905060008151905060005b818110156125db578281815181106125aa576125aa6137cd565b60200260200101518787815181106125c4576125c46137cd565b602090810291909101015260019586019501612590565b5050506125e88160010190565b9050612561565b509195945050505050565b60008281526033602052604090205467ffffffffffffffff161561264a576040517f2e26794600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008281526033602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff85169081179091559051909184917f5aafceeb1c7ad58e4a84898bdee37c02c0fc46e7d24e6b60e8209449f183459f9190a35050565b60003073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614801561272257507f000000000000000000000000000000000000000000000000000000000000000046145b1561274c57507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b600061072a6127fd6126bc565b83612e22565b60008060006128128585612e64565b9092509050600081600481111561282b5761282b614311565b14801561286357508573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b15612873576001925050506129cb565b6000808773ffffffffffffffffffffffffffffffffffffffff16631626ba7e60e01b88886040516024016128a8929190614340565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009094169390931790925290516129319190614361565b600060405180830381855afa9150503d806000811461296c576040519150601f19603f3d011682016040523d82523d6000602084013e612971565b606091505b5091509150818015612984575080516020145b80156129c4575080517f1626ba7e00000000000000000000000000000000000000000000000000000000906129c29083016020908101908401614373565b145b9450505050505b9392505050565b84516000906001819003612a2a57612a2288886000815181106129f7576129f76137cd565b602002602001015188600081518110612a1257612a126137cd565b6020026020010151888888612ea9565b915050612db9565b602088015173ffffffffffffffffffffffffffffffffffffffff8116612acb5760005b82811015612ab057878181518110612a6757612a676137cd565b6020026020010151600014612aa8576040517f1574f9f300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600101612a4d565b508315612ac057612ac0856131c8565b600092505050612db9565b6000808273ffffffffffffffffffffffffffffffffffffffff1663ce46e0466040518163ffffffff1660e01b8152600401602060405180830381865afa158015612b19573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b3d919061438c565b905060005b84811015612bfa5760008a8281518110612b5e57612b5e6137cd565b6020026020010151905080600003612b765750612bf2565b82612bad576040517f1574f9f300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b88811115612be7576040517f1101129400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b978890039792909201915b600101612b42565b508715612cd5576040517f88e5b2d900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8416906388e5b2d9908490612c57908e908e906004016143a9565b60206040518083038185885af1158015612c75573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612c9a919061438c565b612cd0576040517fbf2f3a8b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612da4565b6040517f91db0b7e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8416906391db0b7e908490612d2b908e908e906004016143a9565b60206040518083038185885af1158015612d49573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612d6e919061438c565b612da4576040517fe8bee83900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8515612db357612db3876131c8565b50925050505b9695505050505050565b60208083015160c084015160e0850151604080870151606088015161010089015160a08a01516101208b01519451600099612e0499989796918c9101614462565b60405160208183030381529060405280519060200120905092915050565b6040517f190100000000000000000000000000000000000000000000000000000000000060208201526022810183905260428101829052600090606201612e04565b6000808251604103612e9a5760208301516040840151606085015160001a612e8e878285856131db565b94509450505050612ea2565b506000905060025b9250929050565b602086015160009073ffffffffffffffffffffffffffffffffffffffff8116612f1d578515612f04576040517f1574f9f300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8215612f1357612f13846131c8565b6000915050612db9565b8515613008578073ffffffffffffffffffffffffffffffffffffffff1663ce46e0466040518163ffffffff1660e01b8152600401602060405180830381865afa158015612f6e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f92919061438c565b612fc8576040517f1574f9f300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b83861115613002576040517f1101129400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b85840393505b84156130e0576040517fe49617e100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82169063e49617e1908890613062908b90600401613740565b60206040518083038185885af1158015613080573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906130a5919061438c565b6130db576040517fccf3bb2700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6131ad565b6040517fe60c350500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82169063e60c3505908890613134908b90600401613740565b60206040518083038185885af1158015613152573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190613177919061438c565b6131ad576040517fbd8ba84d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b82156131bc576131bc846131c8565b50939695505050505050565b80156131d8576131d833826132f3565b50565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561321257506000905060036132ea565b8460ff16601b1415801561322a57508460ff16601c14155b1561323b57506000905060046132ea565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa15801561328f573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff81166132e3576000600192509250506132ea565b9150600090505b94509492505050565b80471015613362576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e636500000060448201526064015b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d80600081146133bc576040519150601f19603f3d011682016040523d82523d6000602084013e6133c1565b606091505b5050905080610a63576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401613359565b60008083601f84011261346457600080fd5b50813567ffffffffffffffff81111561347c57600080fd5b6020830191508360208260051b8501011115612ea257600080fd5b600080602083850312156134aa57600080fd5b823567ffffffffffffffff8111156134c157600080fd5b6134cd85828601613452565b90969095509350505050565b60005b838110156134f45781810151838201526020016134dc565b50506000910152565b600081518084526135158160208601602086016134d9565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006129cb60208301846134fd565b73ffffffffffffffffffffffffffffffffffffffff811681146131d857600080fd5b80356135878161355a565b919050565b60006020828403121561359e57600080fd5b81356129cb8161355a565b6000602082840312156135bb57600080fd5b813567ffffffffffffffff8111156135d257600080fd5b820160e081850312156129cb57600080fd5b6020808252825182820181905260009190848201906040850190845b8181101561361c57835183529284019291840191600101613600565b50909695505050505050565b60006060828403121561363a57600080fd5b50919050565b60006020828403121561365257600080fd5b5035919050565b600061014082518452602083015160208501526040830151613687604086018267ffffffffffffffff169052565b5060608301516136a3606086018267ffffffffffffffff169052565b5060808301516136bf608086018267ffffffffffffffff169052565b5060a083015160a085015260c08301516136f160c086018273ffffffffffffffffffffffffffffffffffffffff169052565b5060e083015161371960e086018273ffffffffffffffffffffffffffffffffffffffff169052565b506101008381015115159085015261012080840151818601839052612db9838701826134fd565b6020815260006129cb6020830184613659565b6000610100828403121561363a57600080fd5b6000806040838503121561377957600080fd5b82356137848161355a565b946020939093013593505050565b6000602082840312156137a457600080fd5b813567ffffffffffffffff8111156137bb57600080fd5b8201604081850312156129cb57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6183360301811261383057600080fd5b9190910192915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405160a0810167ffffffffffffffff8111828210171561388c5761388c61383a565b60405290565b60405160c0810167ffffffffffffffff8111828210171561388c5761388c61383a565b6040516080810167ffffffffffffffff8111828210171561388c5761388c61383a565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561391f5761391f61383a565b604052919050565b600067ffffffffffffffff8211156139415761394161383a565b5060051b60200190565b60006040828403121561395d57600080fd5b6040516040810181811067ffffffffffffffff821117156139805761398061383a565b604052823581526020928301359281019290925250919050565b6000606082840312156139ac57600080fd5b6040516060810181811067ffffffffffffffff821117156139cf576139cf61383a565b604052905080823560ff811681146139e657600080fd5b8082525060208301356020820152604083013560408201525092915050565b600082601f830112613a1657600080fd5b81356020613a2b613a2683613927565b6138d8565b82815260609283028501820192828201919087851115613a4a57600080fd5b8387015b85811015613a6d57613a60898261399a565b8452928401928101613a4e565b5090979650505050505050565b803567ffffffffffffffff8116811461358757600080fd5b600060a08236031215613aa457600080fd5b613aac613869565b8235815260208084013567ffffffffffffffff80821115613acc57600080fd5b9085019036601f830112613adf57600080fd5b8135613aed613a2682613927565b81815260069190911b83018401908481019036831115613b0c57600080fd5b938501935b82851015613b3557613b23368661394b565b82528582019150604085019450613b11565b80868801525050506040860135925080831115613b5157600080fd5b5050613b5f36828601613a05565b604083015250613b716060840161357c565b6060820152613b8260808401613a7a565b608082015292915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8181038181111561072a5761072a613b8d565b80151581146131d857600080fd5b600067ffffffffffffffff821115613bf757613bf761383a565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600060c08284031215613c3557600080fd5b613c3d613892565b90508135613c4a8161355a565b81526020613c59838201613a7a565b818301526040830135613c6b81613bcf565b604083015260608381013590830152608083013567ffffffffffffffff811115613c9457600080fd5b8301601f81018513613ca557600080fd5b8035613cb3613a2682613bdd565b8181528684838501011115613cc757600080fd5b818484018583013760008483830101528060808601525050505060a082013560a082015292915050565b600060e08236031215613d0357600080fd5b613d0b613869565b82358152602083013567ffffffffffffffff811115613d2957600080fd5b613d3536828601613c23565b602083015250613d48366040850161399a565b604082015260a0830135613d5b8161355a565b6060820152613b8260c08401613a7a565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4183360301811261383057600080fd5b600061072a3683613c23565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc183360301811261383057600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112613e1557600080fd5b83018035915067ffffffffffffffff821115613e3057600080fd5b6020019150600581901b3603821315612ea257600080fd5b6000613e56613a2684613927565b80848252602080830192508560051b850136811115613e7457600080fd5b855b81811015613eb057803567ffffffffffffffff811115613e965760008081fd5b613ea236828a01613c23565b865250938201938201613e76565b50919695505050505050565b600060408284031215613ece57600080fd5b6129cb838361394b565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112613f0d57600080fd5b83018035915067ffffffffffffffff821115613f2857600080fd5b6020019150600681901b3603821315612ea257600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112613f7557600080fd5b83018035915067ffffffffffffffff821115613f9057600080fd5b6020019150606081023603821315612ea257600080fd5b600060608284031215613fb957600080fd5b6129cb838361399a565b600060208284031215613fd557600080fd5b6129cb82613a7a565b600181811c90821680613ff257607f821691505b60208210810361363a577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000610100828403121561403e57600080fd5b614046613869565b82358152614057846020850161394b565b6020820152614069846060850161399a565b604082015260c083013561407c8161355a565b606082015261408d60e08401613a7a565b60808201529392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036140ca576140ca613b8d565b5060010190565b600060208083850312156140e457600080fd5b825167ffffffffffffffff808211156140fc57600080fd5b908401906080828703121561411057600080fd5b6141186138b5565b82518152838301516141298161355a565b81850152604083015161413b81613bcf565b604082015260608301518281111561415257600080fd5b80840193505086601f84011261416757600080fd5b82519150614177613a2683613bdd565b828152878584860101111561418b57600080fd5b61419a838683018787016134d9565b60608201529695505050505050565b601f821115610a6357600081815260208120601f850160051c810160208610156141d05750805b601f850160051c820191505b818110156141ef578281556001016141dc565b505050505050565b815167ffffffffffffffff8111156142115761421161383a565b6142258161421f8454613fde565b846141a9565b602080601f83116001811461427857600084156142425750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b1785556141ef565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b828110156142c5578886015182559484019460019091019084016142a6565b508582101561430157878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b82815260406020820152600061435960408301846134fd565b949350505050565b600082516138308184602087016134d9565b60006020828403121561438557600080fd5b5051919050565b60006020828403121561439e57600080fd5b81516129cb81613bcf565b6000604082016040835280855180835260608501915060608160051b8601019250602080880160005b8381101561441e577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa088870301855261440c868351613659565b955093820193908201906001016143d2565b50508584038187015286518085528782019482019350915060005b8281101561445557845184529381019392810192600101614439565b5091979650505050505050565b89815260007fffffffffffffffffffffffffffffffffffffffff000000000000000000000000808b60601b166020840152808a60601b166034840152507fffffffffffffffff000000000000000000000000000000000000000000000000808960c01b166048840152808860c01b1660508401525085151560f81b605883015284605983015283516144fb8160798501602088016134d9
565b80830190507fffffffff000000000000000000000000000000000000000000000000000000008460e01b166079820152607d81019150509a995050505050505050505056fea164736f6c6343000813000a"
,
Bin
:
"0x61016060405234801561001157600080fd5b50604080518082018252600381526245415360e81b60208083019182528351808501855260058152640312e3
32e360dc1b908201529151812060e08190527f6a08c3e203132c561752255a4d52ffae85bb9c5d33cb3291520dea1b843563896101008190524660a081815286517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818801819052818901959095526060810193909352608080840192909252308382018190528751808503909201825260c093840190975280519501949094209093529290915261012091909152516101405260805160a05160c05160e05161010051610120516101405161457e61014b600039600061073701526000612784015260006127d3015260006127ae01526000612707015260006127310152600061275b015261457e6000f3fe60806040526004361061018b5760003560e01c806395411525116100d6578063d45c44351161007f578063ed24911d11610059578063ed24911d146104fd578063f10b5cc814610512578063f17325e71461054157600080fd5b8063d45c443514610467578063e30bb5631461049e578063e71ff365146104dd57600080fd5b8063b469318d116100b0578063b469318d146103ba578063b83010d314610414578063cf190f341461044757600080fd5b80639541152514610367578063a3112a641461037a578063a6d4dbc7146103a757600080fd5b806344adc90e116101385780634d003070116101125780634d003070146102de57806354fd4d50146102fe57806379f7573a1461034757600080fd5b806344adc90e1461029857806346926267146102b85780634cb7e9e5146102cb57600080fd5b806317d7de7c1161016957806317d7de7c146102205780632d0335ab146102425780633c0427151461028557600080fd5b80630eabf6601461019057806312b11a17146101a557806313893f61146101e7575b600080fd5b6101a361019e3660046134c8565b610554565b005b3480156101b157600080fd5b507ffeb2925a02bae3dae48d424a0437a2b6ac939aa9230ddc55a1a76f065d9880765b6040519081526020015b60405180910390f35b3480156101f357600080fd5b506102076102023660046134c8565b6106eb565b60405167ffffffffffffffff90911681526020016101de565b34801561022c57600080fd5b50610235610730565b6040516101de9190613578565b34801561024e57600080fd5b506101d461025d3660046135bd565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b6101d46102933660046135da565b610760565b6102ab6102a63660046134c8565b610863565b6040516101de9190613615565b6101a36102c6366004613659565b6109e4565b6101a36102d93660046134c8565b610a68565b3480156102ea57600080fd5b506102076102f9366004613671565b610b4b565b34801561030a57600080fd5b506102356040518060400160405280600581526020017f312e342e3000000000000000000000000000000000000000000000000000000081525081565b34801561035357600080fd5b506101a3610362366004613671565b610b58565b6102ab6103753660046134c8565b610bef565b34801561038657600080fd5b5061039a610395366004613671565b610e62565b6040516101de9190613771565b6101a36103b5366004613784565b611025565b3480156103c657600080fd5b506102076103d5366004613797565b73ffffffffffffffffffffffffffffffffffffffff919091166000908152603460209081526040808320938352929052205467ffffffffffffffff1690565b34801561042057600080fd5b507fb5d556f07587ec0f08cf386545cc4362c702a001650c2058002615ee5c9d1e756101d4565b34801561045357600080fd5b50610207610462366004613671565b6110ca565b34801561047357600080fd5b50610207610482366004613671565b60009081526033602052604090205467ffffffffffffffff1690565b3480156104aa57600080fd5b506104cd6104b9366004613671565b600090815260326020526040902054151590565b60405190151581526020016101de565b3480156104e957600080fd5b506102076104f83660046134c8565b6110d8565b34801561050957600080fd5b506101d4611110565b34801561051e57600080fd5b5060405173420000000000000000000000000000000000002081526020016101de565b6101d461054f3660046137c3565b61111a565b348160005b818110156106e4577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82018114600086868481811061059a5761059a6137fe565b90506020028101906105ac919061382d565b6105b590613ac3565b60208101518051919250908015806105d257508260400151518114155b15610609576040517f947d5a8400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b818110156106ad576106a56040518060a001604052808660000151815260200185848151811061063e5761063e6137fe565b6020026020010151815260200186604001518481518110610661576106616137fe565b60200260200101518152602001866060015173ffffffffffffffffffffffffffffffffffffffff168152602001866080015167ffffffffffffffff168152506111d8565b60010161060c565b506106c383600001518385606001518a886113e9565b6106cd9088613bed565b9650505050506106dd8160010190565b9050610559565b5050505050565b60004282825b818110156107245761071c3387878481811061070f5761070f6137fe565b9050602002013585611a18565b6001016106f1565b50909150505b92915050565b606061075b7f0000000000000000000000000000000000000000000000000000000000000000611b17565b905090565b600061077361076e83613d22565b611ca5565b604080516001808252818301909252600091816020015b6040805160c081018252600080825260208083018290529282018190526060808301829052608083015260a082015282527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90920191018161078a5790505090506107f86020840184613d9d565b61080190613dd1565b81600081518110610814576108146137fe565b602090810291909101015261083d83358261083560c0870160a088016135bd565b346001611e2f565b60200151600081518110610853576108536137fe565b6020026020010151915050919050565b60608160008167ffffffffffffffff8111156108815761088161386b565b6040519080825280602002602001820160405280156108b457816020015b606081526020019060019003908161089f5790505b509050600034815b848110156109ce577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff85018114368989848181106108fc576108fc6137fe565b905060200281019061090e9190613ddd565b905061091d6020820182613e11565b9050600003610958576040517f947d5a8400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061097d823561096c6020850185613e11565b61097591613e79565b338887611e2f565b805190915061098c9086613bed565b945080602001518785815181106109a5576109a56137fe565b6020026020010181905250806020015151860195505050506109c78160010190565b90506108bc565b506109d98383612541565b979650505050505050565b604080516001808252818301909252600091816020015b60408051808201909152600080825260208201528152602001906001900390816109fb579050509050610a3636839003830160208401613eed565b81600081518110610a4957610a496137fe565b6020908102919091010152610a63823582333460016113e9565b505050565b348160005b818110156106e4577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8201811436868684818110610aad57610aad6137fe565b9050602002810190610abf9190613ddd565b9050610b2c8135610ad36020840184613f09565b808060200260200160405190810160405280939291908181526020016000905b82821015610b1f57610b1060408302860136819003810190613eed565b81526020019060010190610af3565b50505050503388866113e9565b610b369086613bed565b94505050610b448160010190565b9050610a6d565b60004261072a838261262b565b33600090815260208190526040902054808211610ba1576040517f756688fe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b336000908152602081815260409182902084905581518381529081018490527f57b09af877df9068fd60a69d7b21f5576b8b38955812d6ae4ac52942f1e38fb7910160405180910390a15050565b60608160008167ffffffffffffffff811115610c0d57610c0d61386b565b604051908082528060200260200182016040528015610c4057816020015b6060815260200190600190039081610c2b5790505b509050600034815b848110156109ce577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8501811436898984818110610c8857610c886137fe565b9050602002810190610c9a919061382d565b9050366000610cac6020840184613e11565b909250905080801580610ccd5750610cc76040850185613f71565b90508114155b15610d04576040517f947d5a8400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b81811015610de557610ddd6040518060a0016040528087600001358152602001868685818110610d3957610d396137fe565b9050602002810190610d4b9190613d9d565b610d5490613dd1565b8152602001610d666040890189613f71565b85818110610d7657610d766137fe565b905060600201803603810190610d8c9190613fd8565b8152602001610da16080890160608a016135bd565b73ffffffffffffffffffffffffffffffffffffffff168152602001610dcc60a0890160808a01613ff4565b67ffffffffffffffff169052611ca5565b600101610d07565b506000610e0e8535610df78587613e79565b610e076080890160608a016135bd565b8b8a611e2f565b8051909150610e1d9089613bed565b975080602001518a8881518110610e3657610e366137fe565b602002602001018190525080602001515189019850505050505050610e5b8160010190565b9050610c48565b604080516101408101825260008082526020820181905291810182905260608082018390526080820183905260a0820183905260c0820183905260e0820183905261010082019290925261012081019190915260008281526032602090815260409182902082516101408101845281548152600182015492810192909252600281015467ffffffffffffffff808216948401949094526801000000000000000081048416606084015270010000000000000000000000000000000090049092166080820152600382015460a0820152600482015473ffffffffffffffffffffffffffffffffffffffff90811660c0830152600583015490811660e083015274010000000000000000000000000000000000000000900460ff16151561010082015260068201805491929161012084019190610f9c9061400f565b80601f0160208091040260200160405190810160405280929190818152602001828054610fc89061400f565b80156110155780601f10610fea57610100808354040283529160200191611015565b820191906000526020600020905b815481529060010190602001808311610ff857829003601f168201915b5050505050815250509050919050565b61103c6110373683900383018361405c565b6111d8565b604080516001808252818301909252600091816020015b604080518082019091526000808252602082015281526020019060019003908161105357905050905061108e36839003830160208401613eed565b816000815181106110a1576110a16137fe565b6020908102919091010152610a638235826110c260e0860160c087016135bd565b3460016113e9565b60004261072a338483611a18565b60004282825b81811015610724576111088686838181106110fb576110fb6137fe565b905060200201358461262b565b6001016110de565b600061075b6126ed565b604080516001808252818301909252600091829190816020015b6040805160c081018252600080825260208083018290529282018190526060808301829052608083015260a082015282527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9092019101816111345790505090506111a26020840184613d9d565b6111ab90613dd1565b816000815181106111be576111be6137fe565b602090810291909101015261083d83358233346001611e2f565b608081015167ffffffffffffffff161580159061120c57504267ffffffffffffffff16816080015167ffffffffffffffff16105b15611243576040517f1ab7da6b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020808201516040808401516060850151855184518587015173ffffffffffffffffffffffffffffffffffffffff84166000908152978890529487208054969794969495611337957fb5d556f07587ec0f08cf386545cc4362c702a001650c2058002615ee5c9d1e7595949392886112ba836140ca565b909155506080808c015160408051602081019990995273ffffffffffffffffffffffffffffffffffffffff9097169688019690965260608701949094529285019190915260a084015260c083015267ffffffffffffffff1660e0820152610100015b60405160208183030381529060405280519060200120612821565b90506113ad84606001518284602001518560400151866000015160405160200161139993929190928352602083019190915260f81b7fff0000000000000000000000000000000000000000000000000000000000000016604082015260410190565b604051602081830303815290604052612834565b6113e3576040517f8baa579f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b6040517fa2ea7c6e0000000000000000000000000000000000000000000000000000000081526004810186905260009081907342000000000000000000000000000000000000209063a2ea7c6e90602401600060405180830381865afa158015611457573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261149d9190810190614102565b80519091506114d8576040517fbf37b20e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b855160008167ffffffffffffffff8111156114f5576114f561386b565b60405190808252806020026020018201604052801561159457816020015b60408051610140810182526000808252602080830182905292820181905260608083018290526080830182905260a0830182905260c0830182905260e0830182905261010083019190915261012082015282527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9092019101816115135790505b50905060008267ffffffffffffffff8111156115b2576115b261386b565b6040519080825280602002602001820160405280156115db578160200160208202803683370190505b50905060005b838110156119fa5760008a82815181106115fd576115fd6137fe565b6020908102919091018101518051600090815260329092526040909120805491925090611656576040517fc5723b5100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8c816001015414611693576040517fbf37b20e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600581015473ffffffffffffffffffffffffffffffffffffffff8c81169116146116e9576040517f4ca8886700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600581015474010000000000000000000000000000000000000000900460ff1661173f576040517f157bd4c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002810154700100000000000000000000000000000000900467ffffffffffffffff1615611799576040517f905e710700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b426002820180547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff811670010000000000000000000000000000000067ffffffffffffffff948516810291821793849055604080516101408101825287548152600188015460208201529386169286169290921791830191909152680100000000000000008304841660608301529091049091166080820152600382015460a0820152600482015473ffffffffffffffffffffffffffffffffffffffff90811660c0830152600583015490811660e083015274010000000000000000000000000000000000000000900460ff16151561010082015260068201805483916101208401916118a59061400f565b80601f01602080910402602001604051908101604052809291908181526020018280546118d19061400f565b801561191e5780601f106118f35761010080835404028352916020019161191e565b820191906000526020600020905b81548152906001019060200180831161190157829003601f168201915b505050505081525050858481518110611939576119396137fe565b6020026020010181905250816020015184848151811061195b5761195b6137fe565b6020026020010181815250508c8b73ffffffffffffffffffffffffffffffffffffffff16868581518110611991576119916137fe565b602002602001015160c0015173ffffffffffffffffffffffffffffffffffffffff167ff930a6e2523c9cc298691873087a740550b8fc85a0680830414c148ed927f61585600001516040516119e891815260200190565b60405180910390a450506001016115e1565b50611a0a84838360018b8b612a03565b9a9950505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff83166000908152603460209081526040808320858452918290529091205467ffffffffffffffff1615611a8c576040517fec9d6eeb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008381526020829052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff861690811790915590519091859173ffffffffffffffffffffffffffffffffffffffff8816917f92a1f7a41a7c585a8b09e25b195e225b1d43248daca46b0faf9e0792777a222991a450505050565b604080516020808252818301909252606091600091906020820181803683370190505090506000805b6020811015611be2576000858260208110611b5d57611b5d6137fe565b1a60f81b90507fff000000000000000000000000000000000000000000000000000000000000008116600003611b935750611be2565b80848481518110611ba657611ba66137fe565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505060019182019101611b40565b5060008167ffffffffffffffff811115611bfe57611bfe61386b565b6040519080825280601f01601f191660200182016040528015611c28576020820181803683370190505b50905060005b82811015611c9c57838181518110611c4857611c486137fe565b602001015160f81c60f81b828281518110611c6557611c656137fe565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600101611c2e565b50949350505050565b608081015167ffffffffffffffff1615801590611cd957504267ffffffffffffffff16816080015167ffffffffffffffff16105b15611d10576040517f1ab7da6b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020808201516040808401516060808601518651855186880151868801519488015160808901518051908b012060a08a015173ffffffffffffffffffffffffffffffffffffffff871660009081529b8c9052988b2080549a9b989a9899611337997ffeb2925a02bae3dae48d424a0437a2b6ac939aa9230ddc55a1a76f065d988076999493928c611da0836140ca565b919050558e6080015160405160200161131c9b9a999897969594939291909a8b5273ffffffffffffffffffffffffffffffffffffffff998a1660208c015260408b019890985295909716606089015267ffffffffffffffff938416608089015291151560a088015260c087015260e0860152610100850193909352610120840152166101408201526101600190565b60408051808201909152600081526060602082015284516040805180820190915260008152606060208201528167ffffffffffffffff811115611e7457611e7461386b565b604051908082528060200260200182016040528015611e9d578160200160208202803683370190505b5060208201526040517fa2ea7c6e000000000000000000000000000000000000000000000000000000008152600481018990526000907342000000000000000000000000000000000000209063a2ea7c6e90602401600060405180830381865afa158015611f0f573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052611f559190810190614102565b8051909150611f90576040517fbf37b20e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008367ffffffffffffffff811115611fab57611fab61386b565b60405190808252806020026020018201604052801561204a57816020015b60408051610140810182526000808252602080830182905292820181905260608083018290526080830182905260a0830182905260c0830182905260e0830182905261010083019190915261012082015282527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff909201910181611fc95790505b50905060008467ffffffffffffffff8111156120685761206861386b565b604051908082528060200260200182016040528015612091578160200160208202803683370190505b50905060005b858110156125205760008b82815181106120b3576120b36137fe565b60200260200101519050600067ffffffffffffffff16816020015167ffffffffffffffff16141580156120fe57504267ffffffffffffffff16816020015167ffffffffffffffff1611155b15612135576040517f08e8b93700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8460400151158015612148575080604001515b1561217f576040517f157bd4c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006040518061014001604052806000801b81526020018f81526020016121a34290565b67ffffffffffffffff168152602001836020015167ffffffffffffffff168152602001600067ffffffffffffffff16815260200183606001518152602001836000015173ffffffffffffffffffffffffffffffffffffffff1681526020018d73ffffffffffffffffffffffffffffffffffffffff16815260200183604001511515815260200183608001518152509050600080600090505b6122458382612df4565b600081815260326020526040902054909250156122645760010161223b565b81835260008281526032602090815260409182902085518155908501516001820155908401516002820180546060870151608088015167ffffffffffffffff908116700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff92821668010000000000000000027fffffffffffffffffffffffffffffffff000000000000000000000000000000009094169190951617919091171691909117905560a0840151600382015560c084015160048201805473ffffffffffffffffffffffffffffffffffffffff9283167fffffffffffffffffffffffff000000000000000000000000000000000000000090911617905560e0850151600583018054610100880151151574010000000000000000000000000000000000000000027fffffffffffffffffffffff000000000000000000000000000000000000000000909116929093169190911791909117905561012084015184919060068201906123e49082614228565b50505060608401511561243b57606084015160009081526032602052604090205461243b576040517fc5723b5100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8287868151811061244e5761244e6137fe565b60200260200101819052508360a00151868681518110612470576124706137fe565b6020026020010181815250508189602001518681518110612493576124936137fe565b6020026020010181815250508f8e73ffffffffffffffffffffffffffffffffffffffff16856000015173ffffffffffffffffffffffffffffffffffffffff167f8bf46bf4cfd674fa735a3d63ec1c9ad4153f033c290341f3a588b75685141b358560405161250391815260200190565b60405180910390a4505050506125198160010190565b9050612097565b5061253083838360008c8c612a03565b845250919998505050505050505050565b606060008267ffffffffffffffff81111561255e5761255e61386b565b604051908082528060200260200182016040528015612587578160200160208202803683370190505b508451909150600090815b818110156126205760008782815181106125ae576125ae6137fe565b6020026020010151905060008151905060005b8181101561260c578281815181106125db576125db6137fe565b60200260200101518787815181106125f5576125f56137fe565b6020908102919091010152600195860195016125c1565b5050506126198160010190565b9050612592565b509195945050505050565b60008281526033602052604090205467ffffffffffffffff161561267b576040517f2e26794600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008281526033602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff85169081179091559051909184917f5aafceeb1c7ad58e4a84898bdee37c02c0fc46e7d24e6b60e8209449f183459f9190a35050565b60003073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614801561275357507f000000000000000000000000000000000000000000000000000000000000000046145b1561277d57507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b600061072a61282e6126ed565b83612e53565b60008060006128438585612e95565b9092509050600081600481111561285c5761285c614342565b14801561289457508573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b156128a4576001925050506129fc565b6000808773ffffffffffffffffffffffffffffffffffffffff16631626ba7e60e01b88886040516024016128d9929190614371565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009094169390931790925290516129629190614392565b600060405180830381855afa9150503d806000811461299d576040519150601f19603f3d011682016040523d82523d6000602084013e6129a2565b606091505b50915091508180156129b5575080516020145b80156129f5575080517f1626ba7e00000000000000000000000000000000000000000000000000000000906129f390830160209081019084016143a4565b145b9450505050505b9392505050565b84516000906001819003612a5b57612a538888600081518110612a2857612a286137fe565b602002602001015188600081518110612a4357612a436137fe565b6020026020010151888888612eda565b915050612dea565b602088015173ffffffffffffffffffffffffffffffffffffffff8116612afc5760005b82811015612ae157878181518110612a9857612a986137fe565b6020026020010151600014612ad9576040517f1574f9f300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600101612a7e565b508315612af157612af1856131f9565b600092505050612dea565b6000808273ffffffffffffffffffffffffffffffffffffffff1663ce46e0466040518163ffffffff1660e01b8152600401602060405180830381865afa158015612b4a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b6e91906143bd565b905060005b84811015612c2b5760008a8281518110612b8f57612b8f6137fe565b6020026020010151905080600003612ba75750612c23565b82612bde576040517f1574f9f300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b88811115612c18576040517f1101129400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b978890039792909201915b600101612b73565b508715612d06576040517f88e5b2d900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8416906388e5b2d9908490612c88908e908e906004016143da565b60206040518083038185885af1158015612ca6573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612ccb91906143bd565b612d01576040517fbf2f3a8b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612dd5565b6040517f91db0b7e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8416906391db0b7e908490612d5c908e908e906004016143da565b60206040518083038185885af1158015612d7a573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612d9f91906143bd565b612dd5576040517fe8bee83900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8515612de457612de4876131f9565b50925050505b9695505050505050565b60208083015160c084015160e0850151604080870151606088015161010089015160a08a01516101208b01519451600099612e3599989796918c9101614493565b60405160208183030381529060405280519060200120905092915050565b6040517f190100000000000000000000000000000000000000000000000000000000000060208201526022810183905260428101829052600090606201612e35565b6000808251604103612ecb5760208301516040840151606085015160001a612ebf8782858561320c565b94509450505050612ed3565b506000905060025b9250929050565b602086015160009073ffffffffffffffffffffffffffffffffffffffff8116612f4e578515612f35576040517f1574f9f300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8215612f4457612f44846131f9565b6000915050612dea565b8515613039578073ffffffffffffffffffffffffffffffffffffffff1663ce46e0466040518163ffffffff1660e01b8152600401602060405180830381865afa158015612f9f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fc391906143bd565b612ff9576040517f1574f9f300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b83861115613033576040517f1101129400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b85840393505b8415613111576040517fe49617e100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82169063e49617e1908890613093908b90600401613771565b60206040518083038185885af11580156130b1573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906130d691906143bd565b61310c576040517fccf3bb2700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6131de565b6040517fe60c350500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82169063e60c3505908890613165908b90600401613771565b60206040518083038185885af1158015613183573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906131a891906143bd565b6131de576040517fbd8ba84d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b82156131ed576131ed846131f9565b50939695505050505050565b8015613209576132093382613324565b50565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115613243575060009050600361331b565b8460ff16601b1415801561325b57508460ff16601c14155b1561326c575060009050600461331b565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156132c0573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff81166133145760006001925092505061331b565b9150600090505b94509492505050565b80471015613393576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e636500000060448201526064015b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d80600081146133ed576040519150601f19603f3d011682016040523d82523d6000602084013e6133f2565b606091505b5050905080610a63576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d61792068617665207265766572746564000000000000606482015260840161338a565b60008083601f84011261349557600080fd5b50813567ffffffffffffffff8111156134ad57600080fd5b6020830191508360208260051b8501011115612ed357600080fd5b600080602083850312156134db57600080fd5b823567ffffffffffffffff8111156134f257600080fd5b6134fe85828601613483565b90969095509350505050565b60005b8381101561352557818101518382015260200161350d565b50506000910152565b6000815180845261354681602086016020860161350a565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006129fc602083018461352e565b73ffffffffffffffffffffffffffffffffffffffff8116811461320957600080fd5b80356135b88161358b565b919050565b6000602082840312156135cf57600080fd5b81356129fc8161358b565b6000602082840312156135ec57600080fd5b813567ffffffffffffffff81111561360357600080fd5b820160e081850312156129fc57600080fd5b6020808252825182820181905260009190848201906040850190845b8181101561364d57835183529284019291840191600101613631565b50909695505050505050565b60006060828403121561366b57600080fd5b50919050565b60006020828403121561368357600080fd5b5035919050565b6000610140825184526020830151602085015260408301516136b8604086018267ffffffffffffffff169052565b5060608301516136d4606086018267ffffffffffffffff169052565b5060808301516136f0608086018267ffffffffffffffff169052565b5060a083015160a085015260c083015161372260c086018273ffffffffffffffffffffffffffffffffffffffff169052565b5060e083015161374a60e086018273ffffffffffffffffffffffffffffffffffffffff169052565b506101008381015115159085015261012080840151818601839052612dea8387018261352e565b6020815260006129fc602083018461368a565b6000610100828403121561366b57600080fd5b600080604083850312156137aa57600080fd5b82356137b58161358b565b946020939093013593505050565b6000602082840312156137d557600080fd5b813567ffffffffffffffff8111156137ec57600080fd5b8201604081850312156129fc57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6183360301811261386157600080fd5b9190910192915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405160a0810167ffffffffffffffff811182821017156138bd576138bd61386b565b60405290565b60405160c0810167ffffffffffffffff811182821017156138bd576138bd61386b565b6040516080810167ffffffffffffffff811182821017156138bd576138bd61386b565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156139505761395061386b565b604052919050565b600067ffffffffffffffff8211156139725761397261386b565b5060051b60200190565b60006040828403121561398e57600080fd5b6040516040810181811067ffffffffffffffff821117156139b1576139b161386b565b604052823581526020928301359281019290925250919050565b6000606082840312156139dd57600080fd5b6040516060810181811067ffffffffffffffff82111715613a0057613a0061386b565b604052905080823560ff81168114613a1757600080fd5b8082525060208301356020820152604083013560408201525092915050565b600082601f830112613a4757600080fd5b81356020613a5c613a5783613958565b613909565b82815260609283028501820192828201919087851115613a7b57600080fd5b8387015b85811015613a9e57613a9189826139cb565b8452928401928101613a7f565b5090979650505050505050565b803567ffffffffffffffff811681146135b857600080fd5b600060a08236031215613ad557600080fd5b613add61389a565b8235815260208084013567ffffffffffffffff80821115613afd57600080fd5b9085019036601f830112613b1057600080fd5b8135613b1e613a5782613958565b81815260069190911b83018401908481019036831115613b3d57600080fd5b938501935b82851015613b6657613b54368661397c565b82528582019150604085019450613b42565b80868801525050506040860135925080831115613b8257600080fd5b5050613b9036828601613a36565b604083015250613ba2606084016135ad565b6060820152613bb360808401613aab565b608082015292915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8181038181111561072a5761072a613bbe565b801515811461320957600080fd5b600067ffffffffffffffff821115613c2857613c2861386b565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600060c08284031215613c6657600080fd5b613c6e6138c3565b90508135613c7b8161358b565b81526020613c8a838201613aab565b818301526040830135613c9c81613c00565b604083015260608381013590830152608083013567ffffffffffffffff811115613cc557600080fd5b8301601f81018513613cd657600080fd5b8035613ce4613a5782613c0e565b8181528684838501011115613cf857600080fd5b818484018583013760008483830101528060808601525050505060a082013560a082015292915050565b600060e08236031215613d3457600080fd5b613d3c61389a565b82358152602083013567ffffffffffffffff811115613d5a57600080fd5b613d6636828601613c54565b602083015250613d7936604085016139cb565b604082015260a0830135613d8c8161358b565b6060820152613bb360c08401613aab565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4183360301811261386157600080fd5b600061072a3683613c54565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc183360301811261386157600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112613e4657600080fd5b83018035915067ffffffffffffffff821115613e6157600080fd5b6020019150600581901b3603821315612ed357600080fd5b6000613e87613a5784613958565b80848252602080830192508560051b850136811115613ea557600080fd5b855b81811015613ee157803567ffffffffffffffff811115613ec75760008081fd5b613ed336828a01613c54565b865250938201938201613ea7565b50919695505050505050565b600060408284031215613eff57600080fd5b6129fc838361397c565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112613f3e57600080fd5b83018035915067ffffffffffffffff821115613f5957600080fd5b6020019150600681901b3603821315612ed357600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112613fa657600080fd5b83018035915067ffffffffffffffff821115613fc157600080fd5b6020019150606081023603821315612ed357600080fd5b600060608284031215613fea57600080fd5b6129fc83836139cb565b60006020828403121561400657600080fd5b6129fc82613aab565b600181811c9082168061402357607f821691505b60208210810361366b577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000610100828403121561406f57600080fd5b61407761389a565b82358152614088846020850161397c565b602082015261409a84606085016139cb565b604082015260c08301356140ad8161358b565b60608201526140be60e08401613aab565b60808201529392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036140fb576140fb613bbe565b5060010190565b6000602080838503121561411557600080fd5b825167ffffffffffffffff8082111561412d57600080fd5b908401906080828703121561414157600080fd5b6141496138e6565b825181528383015161415a8161358b565b81850152604083015161416c81613c00565b604082015260608301518281111561418357600080fd5b80840193505086601f84011261419857600080fd5b825191506141a8613a5783613c0e565b82815287858486010111156141bc57600080fd5b6141cb8386830187870161350a565b60608201529695505050505050565b601f821115610a6357600081815260208120601f850160051c810160208610156142015750805b601f850160051c820191505b818110156142205782815560010161420d565b505050505050565b815167ffffffffffffffff8111156142425761424261386b565b61425681614250845461400f565b846141da565b602080601f8311600181146142a957600084156142735750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555614220565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b828110156142f6578886015182559484019460019091019084016142d7565b508582101561433257878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b82815260406020820152600061438a604083018461352e565b949350505050565b6000825161386181846020870161350a565b6000602082840312156143b657600080fd5b5051919050565b6000602082840312156143cf57600080fd5b81516129fc81613c00565b6000604082016040835280855180835260608501915060608160051b8601019250602080880160005b8381101561444f577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa088870301855261443d86835161368a565b95509382019390820190600101614403565b50508584038187015286518085528782019482019350915060005b828110156144865784518452938101939281019260010161446a565b5091979650505050505050565b89815260007fffffffffffffffffffffffffffffffffffffffff000000000000000000000000808b60601b166020840152808a60601b166034840152507fffffffffffffffff000000000000000000000000000000000000000000000000808960c01b166048840152808860c01b1660508401525085151560f81b6058830152846059830152835161452c81607985016020880161350a
565b80830190507fffffffff000000000000000000000000000000000000000000000000000000008460e01b166079820152607d81019150509a995050505050505050505056fea164736f6c6343000813000a"
,
}
}
// EASABI is the input ABI used to generate the binding from.
// EASABI is the input ABI used to generate the binding from.
...
...
op-bindings/bindings/eas_more.go
View file @
37b2b0f0
...
@@ -13,7 +13,7 @@ const EASStorageLayoutJSON = "{\"storage\":[{\"astId\":1000,\"contract\":\"src/E
...
@@ -13,7 +13,7 @@ const EASStorageLayoutJSON = "{\"storage\":[{\"astId\":1000,\"contract\":\"src/E
var
EASStorageLayout
=
new
(
solc
.
StorageLayout
)
var
EASStorageLayout
=
new
(
solc
.
StorageLayout
)
var
EASDeployedBin
=
"0x60806040526004361061018b5760003560e01c806395411525116100d6578063d45c44351161007f578063ed24911d11610059578063ed24911d146104fd578063f10b5cc814610512578063f17325e71461054157600080fd5b8063d45c443514610467578063e30bb5631461049e578063e71ff365146104dd57600080fd5b8063b469318d116100b0578063b469318d146103ba578063b83010d314610414578063cf190f341461044757600080fd5b80639541152514610367578063a3112a641461037a578063a6d4dbc7146103a757600080fd5b806344adc90e116101385780634d003070116101125780634d003070146102de57806354fd4d50146102fe57806379f7573a1461034757600080fd5b806344adc90e1461029857806346926267146102b85780634cb7e9e5146102cb57600080fd5b806317d7de7c1161016957806317d7de7c146102205780632d0335ab146102425780633c0427151461028557600080fd5b80630eabf6601461019057806312b11a17146101a557806313893f61146101e7575b600080fd5b6101a361019e3660046134
97565b610554565b005b3480156101b157600080fd5b507ff83bb2b0ede93a840239f7e701a54d9bc35f03701f51ae153d601c6947ff3d3f5b6040519081526020015b60405180910390f35b3480156101f357600080fd5b50610207610202366004613497565b6106eb565b60405167ffffffffffffffff90911681526020016101de565b34801561022c57600080fd5b50610235610730565b6040516101de9190613547565b34801561024e57600080fd5b506101d461025d36600461358c565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b6101d46102933660046135a9565b610760565b6102ab6102a6366004613497565b610863565b6040516101de91906135e4565b6101a36102c6366004613628565b6109e4565b6101a36102d9366004613497565b610a68565b3480156102ea57600080fd5b506102076102f9366004613640565b610b4b565b34801561030a57600080fd5b506102356040518060400160405280600581526020017f312e332e3000000000000000000000000000000000000000000000000000000081525081565b34801561035357600080fd5b506101a3610362366004613640565b610b58565b6102ab610375366004613497565b610bef565b34801561038657600080fd5b5061039a610395366004613640565b610e62565b6040516101de9190613740565b6101a36103b5366004613753565b611025565b3480156103c657600080fd5b506102076103d5366004613766565b73ffffffffffffffffffffffffffffffffffffffff919091166000908152603460209081526040808320938352929052205467ffffffffffffffff1690565b34801561042057600080fd5b507f2d4116d8c9824e4c316453e5c2843a1885580374159ce8768603c49085ef424c6101d4565b34801561045357600080fd5b50610207610462366004613640565b6110ca565b34801561047357600080fd5b50610207610482366004613640565b60009081526033602052604090205467ffffffffffffffff1690565b3480156104aa57600080fd5b506104cd6104b9366004613640565b600090815260326020526040902054151590565b60405190151581526020016101de565b3480156104e957600080fd5b506102076104f8366004613497565b6110d8565b34801561050957600080fd5b506101d4611110565b34801561051e57600080fd5b5060405173420000000000000000000000000000000000002081526020016101de565b6101d461054f366004613792565b61111a565b348160005b818110156106e4577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82018114600086868481811061059a5761059a6137cd565b90506020028101906105ac91906137fc565b6105b590613a92565b60208101518051919250908015806105d257508260400151518114155b15610609576040517f947d5a8400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b818110156106ad576106a56040518060a001604052808660000151815260200185848151811061063e5761063e6137cd565b6020026020010151815260200186604001518481518110610661576106616137cd565b60200260200101518152602001866060015173ffffffffffffffffffffffffffffffffffffffff168152602001866080015167ffffffffffffffff168152506111d8565b60010161060c565b506106c383600001518385606001518a886113c5565b6106cd9088613bbc565b9650505050506106dd8160010190565b9050610559565b5050505050565b60004282825b818110156107245761071c3387878481811061070f5761070f6137cd565b90506020020135856119f4565b6001016106f1565b50909150505b92915050565b606061075b7f0000000000000000000000000000000000000000000000000000000000000000611af3565b905090565b600061077361076e83613cf1565b611c81565b604080516001808252818301909252600091816020015b6040805160c081018252600080825260208083018290529282018190526060808301829052608083015260a082015282527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90920191018161078a5790505090506107f86020840184613d6c565b61080190613da0565b81600081518110610814576108146137cd565b602090810291909101015261083d83358261083560c0870160a0880161358c565b346001611dfe565b60200151600081518110610853576108536137cd565b6020026020010151915050919050565b60608160008167ffffffffffffffff8111156108815761088161383a565b6040519080825280602002602001820160405280156108b457816020015b606081526020019060019003908161089f5790505b509050600034815b848110156109ce577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff85018114368989848181106108fc576108fc6137cd565b905060200281019061090e9190613dac565b905061091d6020820182613de0565b9050600003610958576040517f947d5a8400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061097d823561096c6020850185613de0565b61097591613e48565b338887611dfe565b805190915061098c9086613bbc565b945080602001518785815181106109a5576109a56137cd565b6020026020010181905250806020015151860195505050506109c78160010190565b90506108bc565b506109d98383612510565b979650505050505050565b604080516001808252818301909252600091816020015b60408051808201909152600080825260208201528152602001906001900390816109fb579050509050610a3636839003830160208401613ebc565b81600081518110610a4957610a496137cd565b6020908102919091010152610a63823582333460016113c5565b505050565b348160005b818110156106e4577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8201811436868684818110610aad57610aad6137cd565b9050602002810190610abf9190613dac565b9050610b2c8135610ad36020840184613ed8565b808060200260200160405190810160405280939291908181526020016000905b82821015610b1f57610b1060408302860136819003810190613ebc565b81526020019060010190610af3565b50505050503388866113c5565b610b369086613bbc565b94505050610b448160010190565b9050610a6d565b60004261072a83826125fa565b33600090815260208190526040902054808211610ba1576040517f756688fe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b336000908152602081815260409182902084905581518381529081018490527f57b09af877df9068fd60a69d7b21f5576b8b38955812d6ae4ac52942f1e38fb7910160405180910390a15050565b60608160008167ffffffffffffffff811115610c0d57610c0d61383a565b604051908082528060200260200182016040528015610c4057816020015b6060815260200190600190039081610c2b5790505b509050600034815b848110156109ce577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8501811436898984818110610c8857610c886137cd565b9050602002810190610c9a91906137fc565b9050366000610cac6020840184613de0565b909250905080801580610ccd5750610cc76040850185613f40565b90508114155b15610d04576040517f947d5a8400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b81811015610de557610ddd6040518060a0016040528087600001358152602001868685818110610d3957610d396137cd565b9050602002810190610d4b9190613d6c565b610d5490613da0565b8152602001610d666040890189613f40565b85818110610d7657610d766137cd565b905060600201803603810190610d8c9190613fa7565b8152602001610da16080890160608a0161358c565b73ffffffffffffffffffffffffffffffffffffffff168152602001610dcc60a0890160808a01613fc3565b67ffffffffffffffff169052611c81565b600101610d07565b506000610e0e8535610df78587613e48565b610e076080890160608a0161358c565b8b8a611dfe565b8051909150610e1d9089613bbc565b975080602001518a8881518110610e3657610e366137cd565b602002602001018190525080602001515189019850505050505050610e5b8160010190565b9050610c48565b604080516101408101825260008082526020820181905291810182905260608082018390526080820183905260a0820183905260c0820183905260e0820183905261010082019290925261012081019190915260008281526032602090815260409182902082516101408101845281548152600182015492810192909252600281015467ffffffffffffffff808216948401949094526801000000000000000081048416606084015270010000000000000000000000000000000090049092166080820152600382015460a0820152600482015473ffffffffffffffffffffffffffffffffffffffff90811660c0830152600583015490811660e083015274010000000000000000000000000000000000000000900460ff16151561010082015260068201805491929161012084019190610f9c90613fde565b80601f0160208091040260200160405190810160405280929190818152602001828054610fc890613fde565b80156110155780601f10610fea57610100808354040283529160200191611015565b820191906000526020600020905b815481529060010190602001808311610ff857829003601f168201915b5050505050815250509050919050565b61103c6110373683900383018361402b565b6111d8565b604080516001808252818301909252600091816020015b604080518082019091526000808252602082015281526020019060019003908161105357905050905061108e36839003830160208401613ebc565b816000815181106110a1576110a16137cd565b6020908102919091010152610a638235826110c260e0860160c0870161358c565b3460016113c5565b60004261072a3384836119f4565b60004282825b81811015610724576111088686838181106110fb576110fb6137cd565b90506020020135846125fa565b6001016110de565b600061075b6126bc565b604080516001808252818301909252600091829190816020015b6040805160c081018252600080825260208083018290529282018190526060808301829052608083015260a082015282527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9092019101816111345790505090506111a26020840184613d6c565b6111ab90613da0565b816000815181106111be576111be6137cd565b602090810291909101015261083d83358233346001611dfe565b608081015167ffffffffffffffff161580159061120c57504267ffffffffffffffff16816080015167ffffffffffffffff16105b15611243576040517f1ab7da6b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020808201516040808401518451835184860151606088015173ffffffffffffffffffffffffffffffffffffffff166000908152968790529386208054959693959394611313947f2d4116d8c9824e4c316453e5c2843a1885580374159ce8768603c49085ef424c949392876112b883614099565b909155506080808b015160408051602081019890985287019590955260608601939093529184015260a083015267ffffffffffffffff1660c082015260e0015b604051602081830303815290604052805190602001206127f0565b905061138984606001518284602001518560400151866000015160405160200161137593929190928352602083019190915260f81b7fff0000000000000000000000000000000000000000000000000000000000000016604082015260410190565b604051602081830303815290604052612803565b6113bf576040517f8baa579f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b6040517fa2ea7c6e0000000000000000000000000000000000000000000000000000000081526004810186905260009081907342000000000000000000000000000000000000209063a2ea7c6e90602401600060405180830381865afa158015611433573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261147991908101906140d1565b80519091506114b4576040517fbf37b20e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b855160008167ffffffffffffffff8111156114d1576114d161383a565b60405190808252806020026020018201604052801561157057816020015b60408051610140810182526000808252602080830182905292820181905260608083018290526080830182905260a0830182905260c0830182905260e0830182905261010083019190915261012082015282527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9092019101816114ef5790505b50905060008267ffffffffffffffff81111561158e5761158e61383a565b6040519080825280602002602001820160405280156115b7578160200160208202803683370190505b50905060005b838110156119d65760008a82815181106115d9576115d96137cd565b6020908102919091018101518051600090815260329092526040909120805491925090611632576040517fc5723b5100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8c81600101541461166f576040517fbf37b20e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600581015473ffffffffffffffffffffffffffffffffffffffff8c81169116146116c5576040517f4ca8886700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600581015474010000000000000000000000000000000000000000900460ff1661171b576040517f157bd4c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002810154700100000000000000000000000000000000900467ffffffffffffffff1615611775576040517f905e710700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b426002820180547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff811670010000000000000000000000000000000067ffffffffffffffff948516810291821793849055604080516101408101825287548152600188015460208201529386169286169290921791830191909152680100000000000000008304841660608301529091049091166080820152600382015460a0820152600482015473ffffffffffffffffffffffffffffffffffffffff90811660c0830152600583015490811660e083015274010000000000000000000000000000000000000000900460ff161515610100820152600682018054839161012084019161188190613fde565b80601f01602080910402602001604051908101604052809291908181526020018280546118ad90613fde565b80156118fa5780601f106118cf576101008083540402835291602001916118fa565b820191906000526020600020905b8154815290600101906020018083116118dd57829003601f168201915b505050505081525050858481518110611915576119156137cd565b60200260200101819052508160200151848481518110611937576119376137cd565b6020026020010181815250508c8b73ffffffffffffffffffffffffffffffffffffffff1686858151811061196d5761196d6137cd565b602002602001015160c0015173ffffffffffffffffffffffffffffffffffffffff167ff930a6e2523c9cc298691873087a740550b8fc85a0680830414c148ed927f61585600001516040516119c491815260200190565b60405180910390a450506001016115bd565b506119e684838360018b8b6129d2565b9a9950505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff83166000908152603460209081526040808320858452918290529091205467ffffffffffffffff1615611a68576040517fec9d6eeb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008381526020829052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff861690811790915590519091859173ffffffffffffffffffffffffffffffffffffffff8816917f92a1f7a41a7c585a8b09e25b195e225b1d43248daca46b0faf9e0792777a222991a450505050565b604080516020808252818301909252606091600091906020820181803683370190505090506000805b6020811015611bbe576000858260208110611b3957611b396137cd565b1a60f81b90507fff000000000000000000000000000000000000000000000000000000000000008116600003611b6f5750611bbe565b80848481518110611b8257611b826137cd565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505060019182019101611b1c565b5060008167ffffffffffffffff811115611bda57611bda61383a565b6040519080825280601f01601f191660200182016040528015611c04576020820181803683370190505b50905060005b82811015611c7857838181518110611c2457611c246137cd565b602001015160f81c60f81b828281518110611c4157611c416137cd565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600101611c0a565b50949350505050565b608081015167ffffffffffffffff1615801590611cb557504267ffffffffffffffff16816080015167ffffffffffffffff16105b15611cec576040517f1ab7da6b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60208082015160408084015184518351848601518486015160608088015160808901518051908b012060a08a0151928c015173ffffffffffffffffffffffffffffffffffffffff1660009081529a8b9052978a208054999a97999798611313987ff83bb2b0ede93a840239f7e701a54d9bc35f03701f51ae153d601c6947ff3d3f989796959491928b611d7e83614099565b909155506080808f015160408051602081019c909c528b019990995273ffffffffffffffffffffffffffffffffffffffff90971660608a015267ffffffffffffffff9586169689019690965292151560a088015260c087019190915260e086015261010085015261012084019190915216610140820152610160016112f8565b60408051808201909152600081526060602082015284516040805180820190915260008152606060208201528167ffffffffffffffff811115611e4357611e4361383a565b604051908082528060200260200182016040528015611e6c578160200160208202803683370190505b5060208201526040517fa2ea7c6e000000000000000000000000000000000000000000000000000000008152600481018990526000907342000000000000000000000000000000000000209063a2ea7c6e90602401600060405180830381865afa158015611ede573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052611f2491908101906140d1565b8051909150611f5f576040517fbf37b20e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008367ffffffffffffffff811115611f7a57611f7a61383a565b60405190808252806020026020018201604052801561201957816020015b60408051610140810182526000808252602080830182905292820181905260608083018290526080830182905260a0830182905260c0830182905260e0830182905261010083019190915261012082015282527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff909201910181611f985790505b50905060008467ffffffffffffffff8111156120375761203761383a565b604051908082528060200260200182016040528015612060578160200160208202803683370190505b50905060005b858110156124ef5760008b8281518110612082576120826137cd565b60200260200101519050600067ffffffffffffffff16816020015167ffffffffffffffff16141580156120cd57504267ffffffffffffffff16816020015167ffffffffffffffff1611155b15612104576040517f08e8b93700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8460400151158015612117575080604001515b1561214e576040517f157bd4c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006040518061014001604052806000801b81526020018f81526020016121724290565b67ffffffffffffffff168152602001836020015167ffffffffffffffff168152602001600067ffffffffffffffff16815260200183606001518152602001836000015173ffffffffffffffffffffffffffffffffffffffff1681526020018d73ffffffffffffffffffffffffffffffffffffffff16815260200183604001511515815260200183608001518152509050600080600090505b6122148382612dc3565b600081815260326020526040902054909250156122335760010161220a565b81835260008281526032602090815260409182902085518155908501516001820155908401516002820180546060870151608088015167ffffffffffffffff908116700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff92821668010000000000000000027fffffffffffffffffffffffffffffffff000000000000000000000000000000009094169190951617919091171691909117905560a0840151600382015560c084015160048201805473ffffffffffffffffffffffffffffffffffffffff9283167fffffffffffffffffffffffff000000000000000000000000000000000000000090911617905560e0850151600583018054610100880151151574010000000000000000000000000000000000000000027fffffffffffffffffffffff000000000000000000000000000000000000000000909116929093169190911791909117905561012084015184919060068201906123b390826141f7565b50505060608401511561240a57606084015160009081526032602052604090205461240a576040517fc5723b5100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8287868151811061241d5761241d6137cd565b60200260200101819052508360a0015186868151811061243f5761243f6137cd565b6020026020010181815250508189602001518681518110612462576124626137cd565b6020026020010181815250508f8e73ffffffffffffffffffffffffffffffffffffffff16856000015173ffffffffffffffffffffffffffffffffffffffff167f8bf46bf4cfd674fa735a3d63ec1c9ad4153f033c290341f3a588b75685141b35856040516124d291815260200190565b60405180910390a4505050506124e88160010190565b9050612066565b506124ff83838360008c8c6129d2565b845250919998505050505050505050565b606060008267ffffffffffffffff81111561252d5761252d61383a565b604051908082528060200260200182016040528015612556578160200160208202803683370190505b508451909150600090815b818110156125ef57600087828151811061257d5761257d6137cd565b6020026020010151905060008151905060005b818110156125db578281815181106125aa576125aa6137cd565b60200260200101518787815181106125c4576125c46137cd565b602090810291909101015260019586019501612590565b5050506125e88160010190565b9050612561565b509195945050505050565b60008281526033602052604090205467ffffffffffffffff161561264a576040517f2e26794600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008281526033602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff85169081179091559051909184917f5aafceeb1c7ad58e4a84898bdee37c02c0fc46e7d24e6b60e8209449f183459f9190a35050565b60003073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614801561272257507f000000000000000000000000000000000000000000000000000000000000000046145b1561274c57507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b600061072a6127fd6126bc565b83612e22565b60008060006128128585612e64565b9092509050600081600481111561282b5761282b614311565b14801561286357508573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b15612873576001925050506129cb565b6000808773ffffffffffffffffffffffffffffffffffffffff16631626ba7e60e01b88886040516024016128a8929190614340565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009094169390931790925290516129319190614361565b600060405180830381855afa9150503d806000811461296c576040519150601f19603f3d011682016040523d82523d6000602084013e612971565b606091505b5091509150818015612984575080516020145b80156129c4575080517f1626ba7e00000000000000000000000000000000000000000000000000000000906129c29083016020908101908401614373565b145b9450505050505b9392505050565b84516000906001819003612a2a57612a2288886000815181106129f7576129f76137cd565b602002602001015188600081518110612a1257612a126137cd565b6020026020010151888888612ea9565b915050612db9565b602088015173ffffffffffffffffffffffffffffffffffffffff8116612acb5760005b82811015612ab057878181518110612a6757612a676137cd565b6020026020010151600014612aa8576040517f1574f9f300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600101612a4d565b508315612ac057612ac0856131c8565b600092505050612db9565b6000808273ffffffffffffffffffffffffffffffffffffffff1663ce46e0466040518163ffffffff1660e01b8152600401602060405180830381865afa158015612b19573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b3d919061438c565b905060005b84811015612bfa5760008a8281518110612b5e57612b5e6137cd565b6020026020010151905080600003612b765750612bf2565b82612bad576040517f1574f9f300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b88811115612be7576040517f1101129400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b978890039792909201915b600101612b42565b508715612cd5576040517f88e5b2d900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8416906388e5b2d9908490612c57908e908e906004016143a9565b60206040518083038185885af1158015612c75573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612c9a919061438c565b612cd0576040517fbf2f3a8b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612da4565b6040517f91db0b7e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8416906391db0b7e908490612d2b908e908e906004016143a9565b60206040518083038185885af1158015612d49573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612d6e919061438c565b612da4576040517fe8bee83900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8515612db357612db3876131c8565b50925050505b9695505050505050565b60208083015160c084015160e0850151604080870151606088015161010089015160a08a01516101208b01519451600099612e0499989796918c9101614462565b60405160208183030381529060405280519060200120905092915050565b6040517f190100000000000000000000000000000000000000000000000000000000000060208201526022810183905260428101829052600090606201612e04565b6000808251604103612e9a5760208301516040840151606085015160001a612e8e878285856131db565b94509450505050612ea2565b506000905060025b9250929050565b602086015160009073ffffffffffffffffffffffffffffffffffffffff8116612f1d578515612f04576040517f1574f9f300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8215612f1357612f13846131c8565b6000915050612db9565b8515613008578073ffffffffffffffffffffffffffffffffffffffff1663ce46e0466040518163ffffffff1660e01b8152600401602060405180830381865afa158015612f6e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f92919061438c565b612fc8576040517f1574f9f300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b83861115613002576040517f1101129400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b85840393505b84156130e0576040517fe49617e100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82169063e49617e1908890613062908b90600401613740565b60206040518083038185885af1158015613080573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906130a5919061438c565b6130db576040517fccf3bb2700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6131ad565b6040517fe60c350500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82169063e60c3505908890613134908b90600401613740565b60206040518083038185885af1158015613152573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190613177919061438c565b6131ad576040517fbd8ba84d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b82156131bc576131bc846131c8565b50939695505050505050565b80156131d8576131d833826132f3565b50565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561321257506000905060036132ea565b8460ff16601b1415801561322a57508460ff16601c14155b1561323b57506000905060046132ea565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa15801561328f573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff81166132e3576000600192509250506132ea565b9150600090505b94509492505050565b80471015613362576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e636500000060448201526064015b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d80600081146133bc576040519150601f19603f3d011682016040523d82523d6000602084013e6133c1565b606091505b5050905080610a63576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401613359565b60008083601f84011261346457600080fd5b50813567ffffffffffffffff81111561347c57600080fd5b6020830191508360208260051b8501011115612ea257600080fd5b600080602083850312156134aa57600080fd5b823567ffffffffffffffff8111156134c157600080fd5b6134cd85828601613452565b90969095509350505050565b60005b838110156134f45781810151838201526020016134dc565b50506000910152565b600081518084526135158160208601602086016134d9565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006129cb60208301846134fd565b73ffffffffffffffffffffffffffffffffffffffff811681146131d857600080fd5b80356135878161355a565b919050565b60006020828403121561359e57600080fd5b81356129cb8161355a565b6000602082840312156135bb57600080fd5b813567ffffffffffffffff8111156135d257600080fd5b820160e081850312156129cb57600080fd5b6020808252825182820181905260009190848201906040850190845b8181101561361c57835183529284019291840191600101613600565b50909695505050505050565b60006060828403121561363a57600080fd5b50919050565b60006020828403121561365257600080fd5b5035919050565b600061014082518452602083015160208501526040830151613687604086018267ffffffffffffffff169052565b5060608301516136a3606086018267ffffffffffffffff169052565b5060808301516136bf608086018267ffffffffffffffff169052565b5060a083015160a085015260c08301516136f160c086018273ffffffffffffffffffffffffffffffffffffffff169052565b5060e083015161371960e086018273ffffffffffffffffffffffffffffffffffffffff169052565b506101008381015115159085015261012080840151818601839052612db9838701826134fd565b6020815260006129cb6020830184613659565b6000610100828403121561363a57600080fd5b6000806040838503121561377957600080fd5b82356137848161355a565b946020939093013593505050565b6000602082840312156137a457600080fd5b813567ffffffffffffffff8111156137bb57600080fd5b8201604081850312156129cb57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6183360301811261383057600080fd5b9190910192915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405160a0810167ffffffffffffffff8111828210171561388c5761388c61383a565b60405290565b60405160c0810167ffffffffffffffff8111828210171561388c5761388c61383a565b6040516080810167ffffffffffffffff8111828210171561388c5761388c61383a565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561391f5761391f61383a565b604052919050565b600067ffffffffffffffff8211156139415761394161383a565b5060051b60200190565b60006040828403121561395d57600080fd5b6040516040810181811067ffffffffffffffff821117156139805761398061383a565b604052823581526020928301359281019290925250919050565b6000606082840312156139ac57600080fd5b6040516060810181811067ffffffffffffffff821117156139cf576139cf61383a565b604052905080823560ff811681146139e657600080fd5b8082525060208301356020820152604083013560408201525092915050565b600082601f830112613a1657600080fd5b81356020613a2b613a2683613927565b6138d8565b82815260609283028501820192828201919087851115613a4a57600080fd5b8387015b85811015613a6d57613a60898261399a565b8452928401928101613a4e565b5090979650505050505050565b803567ffffffffffffffff8116811461358757600080fd5b600060a08236031215613aa457600080fd5b613aac613869565b8235815260208084013567ffffffffffffffff80821115613acc57600080fd5b9085019036601f830112613adf57600080fd5b8135613aed613a2682613927565b81815260069190911b83018401908481019036831115613b0c57600080fd5b938501935b82851015613b3557613b23368661394b565b82528582019150604085019450613b11565b80868801525050506040860135925080831115613b5157600080fd5b5050613b5f36828601613a05565b604083015250613b716060840161357c565b6060820152613b8260808401613a7a565b608082015292915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8181038181111561072a5761072a613b8d565b80151581146131d857600080fd5b600067ffffffffffffffff821115613bf757613bf761383a565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600060c08284031215613c3557600080fd5b613c3d613892565b90508135613c4a8161355a565b81526020613c59838201613a7a565b818301526040830135613c6b81613bcf565b604083015260608381013590830152608083013567ffffffffffffffff811115613c9457600080fd5b8301601f81018513613ca557600080fd5b8035613cb3613a2682613bdd565b8181528684838501011115613cc757600080fd5b818484018583013760008483830101528060808601525050505060a082013560a082015292915050565b600060e08236031215613d0357600080fd5b613d0b613869565b82358152602083013567ffffffffffffffff811115613d2957600080fd5b613d3536828601613c23565b602083015250613d48366040850161399a565b604082015260a0830135613d5b8161355a565b6060820152613b8260c08401613a7a565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4183360301811261383057600080fd5b600061072a3683613c23565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc183360301811261383057600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112613e1557600080fd5b83018035915067ffffffffffffffff821115613e3057600080fd5b6020019150600581901b3603821315612ea257600080fd5b6000613e56613a2684613927565b80848252602080830192508560051b850136811115613e7457600080fd5b855b81811015613eb057803567ffffffffffffffff811115613e965760008081fd5b613ea236828a01613c23565b865250938201938201613e76565b50919695505050505050565b600060408284031215613ece57600080fd5b6129cb838361394b565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112613f0d57600080fd5b83018035915067ffffffffffffffff821115613f2857600080fd5b6020019150600681901b3603821315612ea257600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112613f7557600080fd5b83018035915067ffffffffffffffff821115613f9057600080fd5b6020019150606081023603821315612ea257600080fd5b600060608284031215613fb957600080fd5b6129cb838361399a565b600060208284031215613fd557600080fd5b6129cb82613a7a565b600181811c90821680613ff257607f821691505b60208210810361363a577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000610100828403121561403e57600080fd5b614046613869565b82358152614057846020850161394b565b6020820152614069846060850161399a565b604082015260c083013561407c8161355a565b606082015261408d60e08401613a7a565b60808201529392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036140ca576140ca613b8d565b5060010190565b600060208083850312156140e457600080fd5b825167ffffffffffffffff808211156140fc57600080fd5b908401906080828703121561411057600080fd5b6141186138b5565b82518152838301516141298161355a565b81850152604083015161413b81613bcf565b604082015260608301518281111561415257600080fd5b80840193505086601f84011261416757600080fd5b82519150614177613a2683613bdd565b828152878584860101111561418b57600080fd5b61419a838683018787016134d9565b60608201529695505050505050565b601f821115610a6357600081815260208120601f850160051c810160208610156141d05750805b601f850160051c820191505b818110156141ef578281556001016141dc565b505050505050565b815167ffffffffffffffff8111156142115761421161383a565b6142258161421f8454613fde565b846141a9565b602080601f83116001811461427857600084156142425750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b1785556141ef565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b828110156142c5578886015182559484019460019091019084016142a6565b508582101561430157878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b82815260406020820152600061435960408301846134fd565b949350505050565b600082516138308184602087016134d9565b60006020828403121561438557600080fd5b5051919050565b60006020828403121561439e57600080fd5b81516129cb81613bcf565b6000604082016040835280855180835260608501915060608160051b8601019250602080880160005b8381101561441e577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa088870301855261440c868351613659565b955093820193908201906001016143d2565b50508584038187015286518085528782019482019350915060005b8281101561445557845184529381019392810192600101614439565b5091979650505050505050565b89815260007fffffffffffffffffffffffffffffffffffffffff000000000000000000000000808b60601b166020840152808a60601b166034840152507fffffffffffffffff000000000000000000000000000000000000000000000000808960c01b166048840152808860c01b1660508401525085151560f81b605883015284605983015283516144fb8160798501602088016134d9
565b80830190507fffffffff000000000000000000000000000000000000000000000000000000008460e01b166079820152607d81019150509a995050505050505050505056fea164736f6c6343000813000a"
var
EASDeployedBin
=
"0x60806040526004361061018b5760003560e01c806395411525116100d6578063d45c44351161007f578063ed24911d11610059578063ed24911d146104fd578063f10b5cc814610512578063f17325e71461054157600080fd5b8063d45c443514610467578063e30bb5631461049e578063e71ff365146104dd57600080fd5b8063b469318d116100b0578063b469318d146103ba578063b83010d314610414578063cf190f341461044757600080fd5b80639541152514610367578063a3112a641461037a578063a6d4dbc7146103a757600080fd5b806344adc90e116101385780634d003070116101125780634d003070146102de57806354fd4d50146102fe57806379f7573a1461034757600080fd5b806344adc90e1461029857806346926267146102b85780634cb7e9e5146102cb57600080fd5b806317d7de7c1161016957806317d7de7c146102205780632d0335ab146102425780633c0427151461028557600080fd5b80630eabf6601461019057806312b11a17146101a557806313893f61146101e7575b600080fd5b6101a361019e3660046134
c8565b610554565b005b3480156101b157600080fd5b507ffeb2925a02bae3dae48d424a0437a2b6ac939aa9230ddc55a1a76f065d9880765b6040519081526020015b60405180910390f35b3480156101f357600080fd5b506102076102023660046134c8565b6106eb565b60405167ffffffffffffffff90911681526020016101de565b34801561022c57600080fd5b50610235610730565b6040516101de9190613578565b34801561024e57600080fd5b506101d461025d3660046135bd565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b6101d46102933660046135da565b610760565b6102ab6102a63660046134c8565b610863565b6040516101de9190613615565b6101a36102c6366004613659565b6109e4565b6101a36102d93660046134c8565b610a68565b3480156102ea57600080fd5b506102076102f9366004613671565b610b4b565b34801561030a57600080fd5b506102356040518060400160405280600581526020017f312e342e3000000000000000000000000000000000000000000000000000000081525081565b34801561035357600080fd5b506101a3610362366004613671565b610b58565b6102ab6103753660046134c8565b610bef565b34801561038657600080fd5b5061039a610395366004613671565b610e62565b6040516101de9190613771565b6101a36103b5366004613784565b611025565b3480156103c657600080fd5b506102076103d5366004613797565b73ffffffffffffffffffffffffffffffffffffffff919091166000908152603460209081526040808320938352929052205467ffffffffffffffff1690565b34801561042057600080fd5b507fb5d556f07587ec0f08cf386545cc4362c702a001650c2058002615ee5c9d1e756101d4565b34801561045357600080fd5b50610207610462366004613671565b6110ca565b34801561047357600080fd5b50610207610482366004613671565b60009081526033602052604090205467ffffffffffffffff1690565b3480156104aa57600080fd5b506104cd6104b9366004613671565b600090815260326020526040902054151590565b60405190151581526020016101de565b3480156104e957600080fd5b506102076104f83660046134c8565b6110d8565b34801561050957600080fd5b506101d4611110565b34801561051e57600080fd5b5060405173420000000000000000000000000000000000002081526020016101de565b6101d461054f3660046137c3565b61111a565b348160005b818110156106e4577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82018114600086868481811061059a5761059a6137fe565b90506020028101906105ac919061382d565b6105b590613ac3565b60208101518051919250908015806105d257508260400151518114155b15610609576040517f947d5a8400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b818110156106ad576106a56040518060a001604052808660000151815260200185848151811061063e5761063e6137fe565b6020026020010151815260200186604001518481518110610661576106616137fe565b60200260200101518152602001866060015173ffffffffffffffffffffffffffffffffffffffff168152602001866080015167ffffffffffffffff168152506111d8565b60010161060c565b506106c383600001518385606001518a886113e9565b6106cd9088613bed565b9650505050506106dd8160010190565b9050610559565b5050505050565b60004282825b818110156107245761071c3387878481811061070f5761070f6137fe565b9050602002013585611a18565b6001016106f1565b50909150505b92915050565b606061075b7f0000000000000000000000000000000000000000000000000000000000000000611b17565b905090565b600061077361076e83613d22565b611ca5565b604080516001808252818301909252600091816020015b6040805160c081018252600080825260208083018290529282018190526060808301829052608083015260a082015282527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90920191018161078a5790505090506107f86020840184613d9d565b61080190613dd1565b81600081518110610814576108146137fe565b602090810291909101015261083d83358261083560c0870160a088016135bd565b346001611e2f565b60200151600081518110610853576108536137fe565b6020026020010151915050919050565b60608160008167ffffffffffffffff8111156108815761088161386b565b6040519080825280602002602001820160405280156108b457816020015b606081526020019060019003908161089f5790505b509050600034815b848110156109ce577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff85018114368989848181106108fc576108fc6137fe565b905060200281019061090e9190613ddd565b905061091d6020820182613e11565b9050600003610958576040517f947d5a8400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061097d823561096c6020850185613e11565b61097591613e79565b338887611e2f565b805190915061098c9086613bed565b945080602001518785815181106109a5576109a56137fe565b6020026020010181905250806020015151860195505050506109c78160010190565b90506108bc565b506109d98383612541565b979650505050505050565b604080516001808252818301909252600091816020015b60408051808201909152600080825260208201528152602001906001900390816109fb579050509050610a3636839003830160208401613eed565b81600081518110610a4957610a496137fe565b6020908102919091010152610a63823582333460016113e9565b505050565b348160005b818110156106e4577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8201811436868684818110610aad57610aad6137fe565b9050602002810190610abf9190613ddd565b9050610b2c8135610ad36020840184613f09565b808060200260200160405190810160405280939291908181526020016000905b82821015610b1f57610b1060408302860136819003810190613eed565b81526020019060010190610af3565b50505050503388866113e9565b610b369086613bed565b94505050610b448160010190565b9050610a6d565b60004261072a838261262b565b33600090815260208190526040902054808211610ba1576040517f756688fe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b336000908152602081815260409182902084905581518381529081018490527f57b09af877df9068fd60a69d7b21f5576b8b38955812d6ae4ac52942f1e38fb7910160405180910390a15050565b60608160008167ffffffffffffffff811115610c0d57610c0d61386b565b604051908082528060200260200182016040528015610c4057816020015b6060815260200190600190039081610c2b5790505b509050600034815b848110156109ce577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8501811436898984818110610c8857610c886137fe565b9050602002810190610c9a919061382d565b9050366000610cac6020840184613e11565b909250905080801580610ccd5750610cc76040850185613f71565b90508114155b15610d04576040517f947d5a8400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b81811015610de557610ddd6040518060a0016040528087600001358152602001868685818110610d3957610d396137fe565b9050602002810190610d4b9190613d9d565b610d5490613dd1565b8152602001610d666040890189613f71565b85818110610d7657610d766137fe565b905060600201803603810190610d8c9190613fd8565b8152602001610da16080890160608a016135bd565b73ffffffffffffffffffffffffffffffffffffffff168152602001610dcc60a0890160808a01613ff4565b67ffffffffffffffff169052611ca5565b600101610d07565b506000610e0e8535610df78587613e79565b610e076080890160608a016135bd565b8b8a611e2f565b8051909150610e1d9089613bed565b975080602001518a8881518110610e3657610e366137fe565b602002602001018190525080602001515189019850505050505050610e5b8160010190565b9050610c48565b604080516101408101825260008082526020820181905291810182905260608082018390526080820183905260a0820183905260c0820183905260e0820183905261010082019290925261012081019190915260008281526032602090815260409182902082516101408101845281548152600182015492810192909252600281015467ffffffffffffffff808216948401949094526801000000000000000081048416606084015270010000000000000000000000000000000090049092166080820152600382015460a0820152600482015473ffffffffffffffffffffffffffffffffffffffff90811660c0830152600583015490811660e083015274010000000000000000000000000000000000000000900460ff16151561010082015260068201805491929161012084019190610f9c9061400f565b80601f0160208091040260200160405190810160405280929190818152602001828054610fc89061400f565b80156110155780601f10610fea57610100808354040283529160200191611015565b820191906000526020600020905b815481529060010190602001808311610ff857829003601f168201915b5050505050815250509050919050565b61103c6110373683900383018361405c565b6111d8565b604080516001808252818301909252600091816020015b604080518082019091526000808252602082015281526020019060019003908161105357905050905061108e36839003830160208401613eed565b816000815181106110a1576110a16137fe565b6020908102919091010152610a638235826110c260e0860160c087016135bd565b3460016113e9565b60004261072a338483611a18565b60004282825b81811015610724576111088686838181106110fb576110fb6137fe565b905060200201358461262b565b6001016110de565b600061075b6126ed565b604080516001808252818301909252600091829190816020015b6040805160c081018252600080825260208083018290529282018190526060808301829052608083015260a082015282527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9092019101816111345790505090506111a26020840184613d9d565b6111ab90613dd1565b816000815181106111be576111be6137fe565b602090810291909101015261083d83358233346001611e2f565b608081015167ffffffffffffffff161580159061120c57504267ffffffffffffffff16816080015167ffffffffffffffff16105b15611243576040517f1ab7da6b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020808201516040808401516060850151855184518587015173ffffffffffffffffffffffffffffffffffffffff84166000908152978890529487208054969794969495611337957fb5d556f07587ec0f08cf386545cc4362c702a001650c2058002615ee5c9d1e7595949392886112ba836140ca565b909155506080808c015160408051602081019990995273ffffffffffffffffffffffffffffffffffffffff9097169688019690965260608701949094529285019190915260a084015260c083015267ffffffffffffffff1660e0820152610100015b60405160208183030381529060405280519060200120612821565b90506113ad84606001518284602001518560400151866000015160405160200161139993929190928352602083019190915260f81b7fff0000000000000000000000000000000000000000000000000000000000000016604082015260410190565b604051602081830303815290604052612834565b6113e3576040517f8baa579f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b6040517fa2ea7c6e0000000000000000000000000000000000000000000000000000000081526004810186905260009081907342000000000000000000000000000000000000209063a2ea7c6e90602401600060405180830381865afa158015611457573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261149d9190810190614102565b80519091506114d8576040517fbf37b20e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b855160008167ffffffffffffffff8111156114f5576114f561386b565b60405190808252806020026020018201604052801561159457816020015b60408051610140810182526000808252602080830182905292820181905260608083018290526080830182905260a0830182905260c0830182905260e0830182905261010083019190915261012082015282527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9092019101816115135790505b50905060008267ffffffffffffffff8111156115b2576115b261386b565b6040519080825280602002602001820160405280156115db578160200160208202803683370190505b50905060005b838110156119fa5760008a82815181106115fd576115fd6137fe565b6020908102919091018101518051600090815260329092526040909120805491925090611656576040517fc5723b5100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8c816001015414611693576040517fbf37b20e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600581015473ffffffffffffffffffffffffffffffffffffffff8c81169116146116e9576040517f4ca8886700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600581015474010000000000000000000000000000000000000000900460ff1661173f576040517f157bd4c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002810154700100000000000000000000000000000000900467ffffffffffffffff1615611799576040517f905e710700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b426002820180547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff811670010000000000000000000000000000000067ffffffffffffffff948516810291821793849055604080516101408101825287548152600188015460208201529386169286169290921791830191909152680100000000000000008304841660608301529091049091166080820152600382015460a0820152600482015473ffffffffffffffffffffffffffffffffffffffff90811660c0830152600583015490811660e083015274010000000000000000000000000000000000000000900460ff16151561010082015260068201805483916101208401916118a59061400f565b80601f01602080910402602001604051908101604052809291908181526020018280546118d19061400f565b801561191e5780601f106118f35761010080835404028352916020019161191e565b820191906000526020600020905b81548152906001019060200180831161190157829003601f168201915b505050505081525050858481518110611939576119396137fe565b6020026020010181905250816020015184848151811061195b5761195b6137fe565b6020026020010181815250508c8b73ffffffffffffffffffffffffffffffffffffffff16868581518110611991576119916137fe565b602002602001015160c0015173ffffffffffffffffffffffffffffffffffffffff167ff930a6e2523c9cc298691873087a740550b8fc85a0680830414c148ed927f61585600001516040516119e891815260200190565b60405180910390a450506001016115e1565b50611a0a84838360018b8b612a03565b9a9950505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff83166000908152603460209081526040808320858452918290529091205467ffffffffffffffff1615611a8c576040517fec9d6eeb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008381526020829052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff861690811790915590519091859173ffffffffffffffffffffffffffffffffffffffff8816917f92a1f7a41a7c585a8b09e25b195e225b1d43248daca46b0faf9e0792777a222991a450505050565b604080516020808252818301909252606091600091906020820181803683370190505090506000805b6020811015611be2576000858260208110611b5d57611b5d6137fe565b1a60f81b90507fff000000000000000000000000000000000000000000000000000000000000008116600003611b935750611be2565b80848481518110611ba657611ba66137fe565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505060019182019101611b40565b5060008167ffffffffffffffff811115611bfe57611bfe61386b565b6040519080825280601f01601f191660200182016040528015611c28576020820181803683370190505b50905060005b82811015611c9c57838181518110611c4857611c486137fe565b602001015160f81c60f81b828281518110611c6557611c656137fe565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600101611c2e565b50949350505050565b608081015167ffffffffffffffff1615801590611cd957504267ffffffffffffffff16816080015167ffffffffffffffff16105b15611d10576040517f1ab7da6b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020808201516040808401516060808601518651855186880151868801519488015160808901518051908b012060a08a015173ffffffffffffffffffffffffffffffffffffffff871660009081529b8c9052988b2080549a9b989a9899611337997ffeb2925a02bae3dae48d424a0437a2b6ac939aa9230ddc55a1a76f065d988076999493928c611da0836140ca565b919050558e6080015160405160200161131c9b9a999897969594939291909a8b5273ffffffffffffffffffffffffffffffffffffffff998a1660208c015260408b019890985295909716606089015267ffffffffffffffff938416608089015291151560a088015260c087015260e0860152610100850193909352610120840152166101408201526101600190565b60408051808201909152600081526060602082015284516040805180820190915260008152606060208201528167ffffffffffffffff811115611e7457611e7461386b565b604051908082528060200260200182016040528015611e9d578160200160208202803683370190505b5060208201526040517fa2ea7c6e000000000000000000000000000000000000000000000000000000008152600481018990526000907342000000000000000000000000000000000000209063a2ea7c6e90602401600060405180830381865afa158015611f0f573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052611f559190810190614102565b8051909150611f90576040517fbf37b20e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008367ffffffffffffffff811115611fab57611fab61386b565b60405190808252806020026020018201604052801561204a57816020015b60408051610140810182526000808252602080830182905292820181905260608083018290526080830182905260a0830182905260c0830182905260e0830182905261010083019190915261012082015282527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff909201910181611fc95790505b50905060008467ffffffffffffffff8111156120685761206861386b565b604051908082528060200260200182016040528015612091578160200160208202803683370190505b50905060005b858110156125205760008b82815181106120b3576120b36137fe565b60200260200101519050600067ffffffffffffffff16816020015167ffffffffffffffff16141580156120fe57504267ffffffffffffffff16816020015167ffffffffffffffff1611155b15612135576040517f08e8b93700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8460400151158015612148575080604001515b1561217f576040517f157bd4c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006040518061014001604052806000801b81526020018f81526020016121a34290565b67ffffffffffffffff168152602001836020015167ffffffffffffffff168152602001600067ffffffffffffffff16815260200183606001518152602001836000015173ffffffffffffffffffffffffffffffffffffffff1681526020018d73ffffffffffffffffffffffffffffffffffffffff16815260200183604001511515815260200183608001518152509050600080600090505b6122458382612df4565b600081815260326020526040902054909250156122645760010161223b565b81835260008281526032602090815260409182902085518155908501516001820155908401516002820180546060870151608088015167ffffffffffffffff908116700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff92821668010000000000000000027fffffffffffffffffffffffffffffffff000000000000000000000000000000009094169190951617919091171691909117905560a0840151600382015560c084015160048201805473ffffffffffffffffffffffffffffffffffffffff9283167fffffffffffffffffffffffff000000000000000000000000000000000000000090911617905560e0850151600583018054610100880151151574010000000000000000000000000000000000000000027fffffffffffffffffffffff000000000000000000000000000000000000000000909116929093169190911791909117905561012084015184919060068201906123e49082614228565b50505060608401511561243b57606084015160009081526032602052604090205461243b576040517fc5723b5100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8287868151811061244e5761244e6137fe565b60200260200101819052508360a00151868681518110612470576124706137fe565b6020026020010181815250508189602001518681518110612493576124936137fe565b6020026020010181815250508f8e73ffffffffffffffffffffffffffffffffffffffff16856000015173ffffffffffffffffffffffffffffffffffffffff167f8bf46bf4cfd674fa735a3d63ec1c9ad4153f033c290341f3a588b75685141b358560405161250391815260200190565b60405180910390a4505050506125198160010190565b9050612097565b5061253083838360008c8c612a03565b845250919998505050505050505050565b606060008267ffffffffffffffff81111561255e5761255e61386b565b604051908082528060200260200182016040528015612587578160200160208202803683370190505b508451909150600090815b818110156126205760008782815181106125ae576125ae6137fe565b6020026020010151905060008151905060005b8181101561260c578281815181106125db576125db6137fe565b60200260200101518787815181106125f5576125f56137fe565b6020908102919091010152600195860195016125c1565b5050506126198160010190565b9050612592565b509195945050505050565b60008281526033602052604090205467ffffffffffffffff161561267b576040517f2e26794600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008281526033602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff85169081179091559051909184917f5aafceeb1c7ad58e4a84898bdee37c02c0fc46e7d24e6b60e8209449f183459f9190a35050565b60003073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614801561275357507f000000000000000000000000000000000000000000000000000000000000000046145b1561277d57507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b600061072a61282e6126ed565b83612e53565b60008060006128438585612e95565b9092509050600081600481111561285c5761285c614342565b14801561289457508573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b156128a4576001925050506129fc565b6000808773ffffffffffffffffffffffffffffffffffffffff16631626ba7e60e01b88886040516024016128d9929190614371565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009094169390931790925290516129629190614392565b600060405180830381855afa9150503d806000811461299d576040519150601f19603f3d011682016040523d82523d6000602084013e6129a2565b606091505b50915091508180156129b5575080516020145b80156129f5575080517f1626ba7e00000000000000000000000000000000000000000000000000000000906129f390830160209081019084016143a4565b145b9450505050505b9392505050565b84516000906001819003612a5b57612a538888600081518110612a2857612a286137fe565b602002602001015188600081518110612a4357612a436137fe565b6020026020010151888888612eda565b915050612dea565b602088015173ffffffffffffffffffffffffffffffffffffffff8116612afc5760005b82811015612ae157878181518110612a9857612a986137fe565b6020026020010151600014612ad9576040517f1574f9f300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600101612a7e565b508315612af157612af1856131f9565b600092505050612dea565b6000808273ffffffffffffffffffffffffffffffffffffffff1663ce46e0466040518163ffffffff1660e01b8152600401602060405180830381865afa158015612b4a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b6e91906143bd565b905060005b84811015612c2b5760008a8281518110612b8f57612b8f6137fe565b6020026020010151905080600003612ba75750612c23565b82612bde576040517f1574f9f300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b88811115612c18576040517f1101129400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b978890039792909201915b600101612b73565b508715612d06576040517f88e5b2d900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8416906388e5b2d9908490612c88908e908e906004016143da565b60206040518083038185885af1158015612ca6573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612ccb91906143bd565b612d01576040517fbf2f3a8b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612dd5565b6040517f91db0b7e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8416906391db0b7e908490612d5c908e908e906004016143da565b60206040518083038185885af1158015612d7a573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612d9f91906143bd565b612dd5576040517fe8bee83900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8515612de457612de4876131f9565b50925050505b9695505050505050565b60208083015160c084015160e0850151604080870151606088015161010089015160a08a01516101208b01519451600099612e3599989796918c9101614493565b60405160208183030381529060405280519060200120905092915050565b6040517f190100000000000000000000000000000000000000000000000000000000000060208201526022810183905260428101829052600090606201612e35565b6000808251604103612ecb5760208301516040840151606085015160001a612ebf8782858561320c565b94509450505050612ed3565b506000905060025b9250929050565b602086015160009073ffffffffffffffffffffffffffffffffffffffff8116612f4e578515612f35576040517f1574f9f300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8215612f4457612f44846131f9565b6000915050612dea565b8515613039578073ffffffffffffffffffffffffffffffffffffffff1663ce46e0466040518163ffffffff1660e01b8152600401602060405180830381865afa158015612f9f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fc391906143bd565b612ff9576040517f1574f9f300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b83861115613033576040517f1101129400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b85840393505b8415613111576040517fe49617e100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82169063e49617e1908890613093908b90600401613771565b60206040518083038185885af11580156130b1573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906130d691906143bd565b61310c576040517fccf3bb2700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6131de565b6040517fe60c350500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82169063e60c3505908890613165908b90600401613771565b60206040518083038185885af1158015613183573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906131a891906143bd565b6131de576040517fbd8ba84d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b82156131ed576131ed846131f9565b50939695505050505050565b8015613209576132093382613324565b50565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115613243575060009050600361331b565b8460ff16601b1415801561325b57508460ff16601c14155b1561326c575060009050600461331b565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156132c0573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff81166133145760006001925092505061331b565b9150600090505b94509492505050565b80471015613393576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e636500000060448201526064015b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d80600081146133ed576040519150601f19603f3d011682016040523d82523d6000602084013e6133f2565b606091505b5050905080610a63576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d61792068617665207265766572746564000000000000606482015260840161338a565b60008083601f84011261349557600080fd5b50813567ffffffffffffffff8111156134ad57600080fd5b6020830191508360208260051b8501011115612ed357600080fd5b600080602083850312156134db57600080fd5b823567ffffffffffffffff8111156134f257600080fd5b6134fe85828601613483565b90969095509350505050565b60005b8381101561352557818101518382015260200161350d565b50506000910152565b6000815180845261354681602086016020860161350a565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006129fc602083018461352e565b73ffffffffffffffffffffffffffffffffffffffff8116811461320957600080fd5b80356135b88161358b565b919050565b6000602082840312156135cf57600080fd5b81356129fc8161358b565b6000602082840312156135ec57600080fd5b813567ffffffffffffffff81111561360357600080fd5b820160e081850312156129fc57600080fd5b6020808252825182820181905260009190848201906040850190845b8181101561364d57835183529284019291840191600101613631565b50909695505050505050565b60006060828403121561366b57600080fd5b50919050565b60006020828403121561368357600080fd5b5035919050565b6000610140825184526020830151602085015260408301516136b8604086018267ffffffffffffffff169052565b5060608301516136d4606086018267ffffffffffffffff169052565b5060808301516136f0608086018267ffffffffffffffff169052565b5060a083015160a085015260c083015161372260c086018273ffffffffffffffffffffffffffffffffffffffff169052565b5060e083015161374a60e086018273ffffffffffffffffffffffffffffffffffffffff169052565b506101008381015115159085015261012080840151818601839052612dea8387018261352e565b6020815260006129fc602083018461368a565b6000610100828403121561366b57600080fd5b600080604083850312156137aa57600080fd5b82356137b58161358b565b946020939093013593505050565b6000602082840312156137d557600080fd5b813567ffffffffffffffff8111156137ec57600080fd5b8201604081850312156129fc57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6183360301811261386157600080fd5b9190910192915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405160a0810167ffffffffffffffff811182821017156138bd576138bd61386b565b60405290565b60405160c0810167ffffffffffffffff811182821017156138bd576138bd61386b565b6040516080810167ffffffffffffffff811182821017156138bd576138bd61386b565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156139505761395061386b565b604052919050565b600067ffffffffffffffff8211156139725761397261386b565b5060051b60200190565b60006040828403121561398e57600080fd5b6040516040810181811067ffffffffffffffff821117156139b1576139b161386b565b604052823581526020928301359281019290925250919050565b6000606082840312156139dd57600080fd5b6040516060810181811067ffffffffffffffff82111715613a0057613a0061386b565b604052905080823560ff81168114613a1757600080fd5b8082525060208301356020820152604083013560408201525092915050565b600082601f830112613a4757600080fd5b81356020613a5c613a5783613958565b613909565b82815260609283028501820192828201919087851115613a7b57600080fd5b8387015b85811015613a9e57613a9189826139cb565b8452928401928101613a7f565b5090979650505050505050565b803567ffffffffffffffff811681146135b857600080fd5b600060a08236031215613ad557600080fd5b613add61389a565b8235815260208084013567ffffffffffffffff80821115613afd57600080fd5b9085019036601f830112613b1057600080fd5b8135613b1e613a5782613958565b81815260069190911b83018401908481019036831115613b3d57600080fd5b938501935b82851015613b6657613b54368661397c565b82528582019150604085019450613b42565b80868801525050506040860135925080831115613b8257600080fd5b5050613b9036828601613a36565b604083015250613ba2606084016135ad565b6060820152613bb360808401613aab565b608082015292915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8181038181111561072a5761072a613bbe565b801515811461320957600080fd5b600067ffffffffffffffff821115613c2857613c2861386b565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600060c08284031215613c6657600080fd5b613c6e6138c3565b90508135613c7b8161358b565b81526020613c8a838201613aab565b818301526040830135613c9c81613c00565b604083015260608381013590830152608083013567ffffffffffffffff811115613cc557600080fd5b8301601f81018513613cd657600080fd5b8035613ce4613a5782613c0e565b8181528684838501011115613cf857600080fd5b818484018583013760008483830101528060808601525050505060a082013560a082015292915050565b600060e08236031215613d3457600080fd5b613d3c61389a565b82358152602083013567ffffffffffffffff811115613d5a57600080fd5b613d6636828601613c54565b602083015250613d7936604085016139cb565b604082015260a0830135613d8c8161358b565b6060820152613bb360c08401613aab565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4183360301811261386157600080fd5b600061072a3683613c54565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc183360301811261386157600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112613e4657600080fd5b83018035915067ffffffffffffffff821115613e6157600080fd5b6020019150600581901b3603821315612ed357600080fd5b6000613e87613a5784613958565b80848252602080830192508560051b850136811115613ea557600080fd5b855b81811015613ee157803567ffffffffffffffff811115613ec75760008081fd5b613ed336828a01613c54565b865250938201938201613ea7565b50919695505050505050565b600060408284031215613eff57600080fd5b6129fc838361397c565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112613f3e57600080fd5b83018035915067ffffffffffffffff821115613f5957600080fd5b6020019150600681901b3603821315612ed357600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112613fa657600080fd5b83018035915067ffffffffffffffff821115613fc157600080fd5b6020019150606081023603821315612ed357600080fd5b600060608284031215613fea57600080fd5b6129fc83836139cb565b60006020828403121561400657600080fd5b6129fc82613aab565b600181811c9082168061402357607f821691505b60208210810361366b577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000610100828403121561406f57600080fd5b61407761389a565b82358152614088846020850161397c565b602082015261409a84606085016139cb565b604082015260c08301356140ad8161358b565b60608201526140be60e08401613aab565b60808201529392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036140fb576140fb613bbe565b5060010190565b6000602080838503121561411557600080fd5b825167ffffffffffffffff8082111561412d57600080fd5b908401906080828703121561414157600080fd5b6141496138e6565b825181528383015161415a8161358b565b81850152604083015161416c81613c00565b604082015260608301518281111561418357600080fd5b80840193505086601f84011261419857600080fd5b825191506141a8613a5783613c0e565b82815287858486010111156141bc57600080fd5b6141cb8386830187870161350a565b60608201529695505050505050565b601f821115610a6357600081815260208120601f850160051c810160208610156142015750805b601f850160051c820191505b818110156142205782815560010161420d565b505050505050565b815167ffffffffffffffff8111156142425761424261386b565b61425681614250845461400f565b846141da565b602080601f8311600181146142a957600084156142735750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555614220565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b828110156142f6578886015182559484019460019091019084016142d7565b508582101561433257878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b82815260406020820152600061438a604083018461352e565b949350505050565b6000825161386181846020870161350a565b6000602082840312156143b657600080fd5b5051919050565b6000602082840312156143cf57600080fd5b81516129fc81613c00565b6000604082016040835280855180835260608501915060608160051b8601019250602080880160005b8381101561444f577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa088870301855261443d86835161368a565b95509382019390820190600101614403565b50508584038187015286518085528782019482019350915060005b828110156144865784518452938101939281019260010161446a565b5091979650505050505050565b89815260007fffffffffffffffffffffffffffffffffffffffff000000000000000000000000808b60601b166020840152808a60601b166034840152507fffffffffffffffff000000000000000000000000000000000000000000000000808960c01b166048840152808860c01b1660508401525085151560f81b6058830152846059830152835161452c81607985016020880161350a
565b80830190507fffffffff000000000000000000000000000000000000000000000000000000008460e01b166079820152607d81019150509a995050505050505050505056fea164736f6c6343000813000a"
func
init
()
{
func
init
()
{
if
err
:=
json
.
Unmarshal
([]
byte
(
EASStorageLayoutJSON
),
EASStorageLayout
);
err
!=
nil
{
if
err
:=
json
.
Unmarshal
([]
byte
(
EASStorageLayoutJSON
),
EASStorageLayout
);
err
!=
nil
{
...
...
op-chain-ops/cmd/check-canyon/main.go
View file @
37b2b0f0
...
@@ -139,11 +139,6 @@ func Validate1559Params(ctx Args, canyonActive bool) error {
...
@@ -139,11 +139,6 @@ func Validate1559Params(ctx Args, canyonActive bool) error {
return
err
return
err
}
}
if
block
.
BaseFee
()
.
Cmp
(
big
.
NewInt
(
1000
))
<
0
{
log
.
Info
(
"Basefee to low to properly validate"
,
"basefee"
,
block
.
BaseFee
())
return
nil
}
parent
,
err
:=
ctx
.
Client
.
InfoByNumber
(
context
.
Background
(),
ctx
.
Number
-
1
)
parent
,
err
:=
ctx
.
Client
.
InfoByNumber
(
context
.
Background
(),
ctx
.
Number
-
1
)
if
err
!=
nil
{
if
err
!=
nil
{
return
err
return
err
...
@@ -194,29 +189,19 @@ func ValidateCreate2Deployer(ctx Args, canyonActive bool) error {
...
@@ -194,29 +189,19 @@ func ValidateCreate2Deployer(ctx Args, canyonActive bool) error {
}
}
// CheckActivation takes a function f which determines in a specific block follows the rules of a fork.
// CheckActivation takes a function f which determines in a specific block follows the rules of a fork.
// forkActivated tells `f` if the fork is active or not. `f` is called twice: First to validate that
// there is no error when checking the new value and second to validate the it returns an error when
// attempting to validate the block against the opposite of what is is.
// If any error is encountered, valid is set to false.
func
CheckActivation
(
f
func
(
Args
,
bool
)
error
,
ctx
Args
,
forkActivated
bool
,
valid
*
bool
)
{
func
CheckActivation
(
f
func
(
Args
,
bool
)
error
,
ctx
Args
,
forkActivated
bool
,
valid
*
bool
)
{
if
forkActivated
{
if
err
:=
f
(
ctx
,
forkActivated
);
err
!=
nil
{
if
err
:=
f
(
ctx
,
true
);
err
!=
nil
{
log
.
Error
(
"Block did not follow fork rules"
,
"err"
,
err
)
log
.
Error
(
"Pre-state was invalid when it was expected to be valid"
,
"err"
,
err
)
*
valid
=
false
*
valid
=
false
}
}
}
if
err
:=
f
(
ctx
,
false
);
err
==
nil
{
log
.
Error
(
"Post-state was valid when it was expected to be invalid"
)
// CheckInactivation takes a function f which determines in a specific block follows the rules of a fork.
*
valid
=
false
// It passes the oppose value of forkActivated & asserts that an error is returned.
}
func
CheckInactivation
(
f
func
(
Args
,
bool
)
error
,
ctx
Args
,
forkActivated
bool
,
valid
*
bool
)
{
}
else
{
if
err
:=
f
(
ctx
,
!
forkActivated
);
err
==
nil
{
if
err
:=
f
(
ctx
,
true
);
err
==
nil
{
log
.
Error
(
"Block followed the wrong side of the fork rules"
)
log
.
Error
(
"Pre-state was valid when it was expected to be invalid"
)
*
valid
=
false
*
valid
=
false
}
if
err
:=
f
(
ctx
,
false
);
err
!=
nil
{
log
.
Error
(
"Post-state was invalid when it was expected to be valid"
,
"err"
,
err
)
*
valid
=
false
}
}
}
}
}
...
@@ -266,9 +251,16 @@ func main() {
...
@@ -266,9 +251,16 @@ func main() {
}
}
CheckActivation
(
ValidateReceipts
,
ctx
,
canyonActive
,
&
valid
)
CheckActivation
(
ValidateReceipts
,
ctx
,
canyonActive
,
&
valid
)
CheckInactivation
(
ValidateReceipts
,
ctx
,
canyonActive
,
&
valid
)
CheckActivation
(
Validate1559Params
,
ctx
,
canyonActive
,
&
valid
)
CheckActivation
(
Validate1559Params
,
ctx
,
canyonActive
,
&
valid
)
// Don't check in-activation for 1559 b/c at low basefees the two cannot be differentiated
CheckActivation
(
ValidateWithdrawals
,
ctx
,
canyonActive
,
&
valid
)
CheckActivation
(
ValidateWithdrawals
,
ctx
,
canyonActive
,
&
valid
)
CheckInactivation
(
ValidateWithdrawals
,
ctx
,
canyonActive
,
&
valid
)
CheckActivation
(
ValidateCreate2Deployer
,
ctx
,
canyonActive
,
&
valid
)
CheckActivation
(
ValidateCreate2Deployer
,
ctx
,
canyonActive
,
&
valid
)
CheckInactivation
(
ValidateCreate2Deployer
,
ctx
,
canyonActive
,
&
valid
)
if
!
valid
{
if
!
valid
{
os
.
Exit
(
1
)
os
.
Exit
(
1
)
...
...
op-challenger/game/fault/contracts/faultdisputegame.go
View file @
37b2b0f0
...
@@ -20,6 +20,8 @@ const (
...
@@ -20,6 +20,8 @@ const (
methodStatus
=
"status"
methodStatus
=
"status"
methodClaimCount
=
"claimDataLen"
methodClaimCount
=
"claimDataLen"
methodClaim
=
"claimData"
methodClaim
=
"claimData"
methodL1Head
=
"l1Head"
methodProposals
=
"proposals"
methodResolve
=
"resolve"
methodResolve
=
"resolve"
methodResolveClaim
=
"resolveClaim"
methodResolveClaim
=
"resolveClaim"
methodAttack
=
"attack"
methodAttack
=
"attack"
...
@@ -32,6 +34,12 @@ type FaultDisputeGameContract struct {
...
@@ -32,6 +34,12 @@ type FaultDisputeGameContract struct {
contract
*
batching
.
BoundContract
contract
*
batching
.
BoundContract
}
}
type
Proposal
struct
{
Index
*
big
.
Int
L2BlockNumber
*
big
.
Int
OutputRoot
common
.
Hash
}
func
NewFaultDisputeGameContract
(
addr
common
.
Address
,
caller
*
batching
.
MultiCaller
)
(
*
FaultDisputeGameContract
,
error
)
{
func
NewFaultDisputeGameContract
(
addr
common
.
Address
,
caller
*
batching
.
MultiCaller
)
(
*
FaultDisputeGameContract
,
error
)
{
fdgAbi
,
err
:=
bindings
.
FaultDisputeGameMetaData
.
GetAbi
()
fdgAbi
,
err
:=
bindings
.
FaultDisputeGameMetaData
.
GetAbi
()
if
err
!=
nil
{
if
err
!=
nil
{
...
@@ -68,6 +76,27 @@ func (f *FaultDisputeGameContract) GetAbsolutePrestateHash(ctx context.Context)
...
@@ -68,6 +76,27 @@ func (f *FaultDisputeGameContract) GetAbsolutePrestateHash(ctx context.Context)
return
result
.
GetHash
(
0
),
nil
return
result
.
GetHash
(
0
),
nil
}
}
func
(
f
*
FaultDisputeGameContract
)
GetL1Head
(
ctx
context
.
Context
)
(
common
.
Hash
,
error
)
{
result
,
err
:=
f
.
multiCaller
.
SingleCall
(
ctx
,
batching
.
BlockLatest
,
f
.
contract
.
Call
(
methodL1Head
))
if
err
!=
nil
{
return
common
.
Hash
{},
fmt
.
Errorf
(
"failed to fetch L1 head: %w"
,
err
)
}
return
result
.
GetHash
(
0
),
nil
}
// GetProposals returns the agreed and disputed proposals
func
(
f
*
FaultDisputeGameContract
)
GetProposals
(
ctx
context
.
Context
)
(
Proposal
,
Proposal
,
error
)
{
result
,
err
:=
f
.
multiCaller
.
SingleCall
(
ctx
,
batching
.
BlockLatest
,
f
.
contract
.
Call
(
methodProposals
))
if
err
!=
nil
{
return
Proposal
{},
Proposal
{},
fmt
.
Errorf
(
"failed to fetch proposals: %w"
,
err
)
}
var
agreed
,
disputed
Proposal
result
.
GetStruct
(
0
,
&
agreed
)
result
.
GetStruct
(
1
,
&
disputed
)
return
agreed
,
disputed
,
nil
}
func
(
f
*
FaultDisputeGameContract
)
GetStatus
(
ctx
context
.
Context
)
(
gameTypes
.
GameStatus
,
error
)
{
func
(
f
*
FaultDisputeGameContract
)
GetStatus
(
ctx
context
.
Context
)
(
gameTypes
.
GameStatus
,
error
)
{
result
,
err
:=
f
.
multiCaller
.
SingleCall
(
ctx
,
batching
.
BlockLatest
,
f
.
contract
.
Call
(
methodStatus
))
result
,
err
:=
f
.
multiCaller
.
SingleCall
(
ctx
,
batching
.
BlockLatest
,
f
.
contract
.
Call
(
methodStatus
))
if
err
!=
nil
{
if
err
!=
nil
{
...
...
op-challenger/game/fault/contracts/faultdisputegame_test.go
View file @
37b2b0f0
...
@@ -60,6 +60,13 @@ func TestSimpleGetters(t *testing.T) {
...
@@ -60,6 +60,13 @@ func TestSimpleGetters(t *testing.T) {
return
game
.
GetClaimCount
(
context
.
Background
())
return
game
.
GetClaimCount
(
context
.
Background
())
},
},
},
},
{
method
:
methodL1Head
,
result
:
common
.
Hash
{
0xdd
,
0xbb
},
call
:
func
(
game
*
FaultDisputeGameContract
)
(
any
,
error
)
{
return
game
.
GetL1Head
(
context
.
Background
())
},
},
{
{
method
:
methodResolve
,
method
:
methodResolve
,
result
:
types
.
GameStatusInProgress
,
result
:
types
.
GameStatusInProgress
,
...
@@ -84,6 +91,33 @@ func TestSimpleGetters(t *testing.T) {
...
@@ -84,6 +91,33 @@ func TestSimpleGetters(t *testing.T) {
}
}
}
}
func
TestGetProposals
(
t
*
testing
.
T
)
{
stubRpc
,
game
:=
setup
(
t
)
agreedIndex
:=
big
.
NewInt
(
5
)
agreedBlockNum
:=
big
.
NewInt
(
6
)
agreedRoot
:=
common
.
Hash
{
0xaa
}
disputedIndex
:=
big
.
NewInt
(
7
)
disputedBlockNum
:=
big
.
NewInt
(
8
)
disputedRoot
:=
common
.
Hash
{
0xdd
}
agreed
:=
Proposal
{
Index
:
agreedIndex
,
L2BlockNumber
:
agreedBlockNum
,
OutputRoot
:
agreedRoot
,
}
disputed
:=
Proposal
{
Index
:
disputedIndex
,
L2BlockNumber
:
disputedBlockNum
,
OutputRoot
:
disputedRoot
,
}
stubRpc
.
SetResponse
(
methodProposals
,
batching
.
BlockLatest
,
[]
interface
{}{},
[]
interface
{}{
agreed
,
disputed
,
})
actualAgreed
,
actualDisputed
,
err
:=
game
.
GetProposals
(
context
.
Background
())
require
.
NoError
(
t
,
err
)
require
.
Equal
(
t
,
agreed
,
actualAgreed
)
require
.
Equal
(
t
,
disputed
,
actualDisputed
)
}
func
TestGetClaim
(
t
*
testing
.
T
)
{
func
TestGetClaim
(
t
*
testing
.
T
)
{
stubRpc
,
game
:=
setup
(
t
)
stubRpc
,
game
:=
setup
(
t
)
idx
:=
big
.
NewInt
(
2
)
idx
:=
big
.
NewInt
(
2
)
...
...
op-challenger/game/fault/player.go
View file @
37b2b0f0
...
@@ -34,7 +34,7 @@ type GamePlayer struct {
...
@@ -34,7 +34,7 @@ type GamePlayer struct {
status
gameTypes
.
GameStatus
status
gameTypes
.
GameStatus
}
}
type
resourceCreator
func
(
addr
common
.
Address
,
gameDepth
uint64
,
dir
string
)
(
types
.
TraceProvider
,
types
.
OracleUpdater
,
error
)
type
resourceCreator
func
(
addr
common
.
Address
,
contract
*
contracts
.
FaultDisputeGameContract
,
gameDepth
uint64
,
dir
string
)
(
types
.
TraceProvider
,
types
.
OracleUpdater
,
error
)
func
NewGamePlayer
(
func
NewGamePlayer
(
ctx
context
.
Context
,
ctx
context
.
Context
,
...
@@ -77,7 +77,7 @@ func NewGamePlayer(
...
@@ -77,7 +77,7 @@ func NewGamePlayer(
return
nil
,
fmt
.
Errorf
(
"failed to fetch the game depth: %w"
,
err
)
return
nil
,
fmt
.
Errorf
(
"failed to fetch the game depth: %w"
,
err
)
}
}
provider
,
updater
,
err
:=
creator
(
addr
,
gameDepth
,
dir
)
provider
,
updater
,
err
:=
creator
(
addr
,
loader
,
gameDepth
,
dir
)
if
err
!=
nil
{
if
err
!=
nil
{
return
nil
,
fmt
.
Errorf
(
"failed to create trace provider: %w"
,
err
)
return
nil
,
fmt
.
Errorf
(
"failed to create trace provider: %w"
,
err
)
}
}
...
...
op-challenger/game/fault/register.go
View file @
37b2b0f0
...
@@ -5,6 +5,7 @@ import (
...
@@ -5,6 +5,7 @@ import (
"fmt"
"fmt"
"github.com/ethereum-optimism/optimism/op-challenger/config"
"github.com/ethereum-optimism/optimism/op-challenger/config"
"github.com/ethereum-optimism/optimism/op-challenger/game/fault/contracts"
"github.com/ethereum-optimism/optimism/op-challenger/game/fault/trace/alphabet"
"github.com/ethereum-optimism/optimism/op-challenger/game/fault/trace/alphabet"
"github.com/ethereum-optimism/optimism/op-challenger/game/fault/trace/cannon"
"github.com/ethereum-optimism/optimism/op-challenger/game/fault/trace/cannon"
faultTypes
"github.com/ethereum-optimism/optimism/op-challenger/game/fault/types"
faultTypes
"github.com/ethereum-optimism/optimism/op-challenger/game/fault/types"
...
@@ -36,8 +37,8 @@ func RegisterGameTypes(
...
@@ -36,8 +37,8 @@ func RegisterGameTypes(
client
*
ethclient
.
Client
,
client
*
ethclient
.
Client
,
)
{
)
{
if
cfg
.
TraceTypeEnabled
(
config
.
TraceTypeCannon
)
{
if
cfg
.
TraceTypeEnabled
(
config
.
TraceTypeCannon
)
{
resourceCreator
:=
func
(
addr
common
.
Address
,
gameDepth
uint64
,
dir
string
)
(
faultTypes
.
TraceProvider
,
faultTypes
.
OracleUpdater
,
error
)
{
resourceCreator
:=
func
(
addr
common
.
Address
,
contract
*
contracts
.
FaultDisputeGameContract
,
gameDepth
uint64
,
dir
string
)
(
faultTypes
.
TraceProvider
,
faultTypes
.
OracleUpdater
,
error
)
{
provider
,
err
:=
cannon
.
NewTraceProvider
(
ctx
,
logger
,
m
,
cfg
,
c
lient
,
dir
,
add
r
,
gameDepth
)
provider
,
err
:=
cannon
.
NewTraceProvider
(
ctx
,
logger
,
m
,
cfg
,
c
ontract
,
di
r
,
gameDepth
)
if
err
!=
nil
{
if
err
!=
nil
{
return
nil
,
nil
,
fmt
.
Errorf
(
"create cannon trace provider: %w"
,
err
)
return
nil
,
nil
,
fmt
.
Errorf
(
"create cannon trace provider: %w"
,
err
)
}
}
...
@@ -53,7 +54,7 @@ func RegisterGameTypes(
...
@@ -53,7 +54,7 @@ func RegisterGameTypes(
registry
.
RegisterGameType
(
cannonGameType
,
playerCreator
)
registry
.
RegisterGameType
(
cannonGameType
,
playerCreator
)
}
}
if
cfg
.
TraceTypeEnabled
(
config
.
TraceTypeAlphabet
)
{
if
cfg
.
TraceTypeEnabled
(
config
.
TraceTypeAlphabet
)
{
resourceCreator
:=
func
(
addr
common
.
Address
,
gameDepth
uint64
,
dir
string
)
(
faultTypes
.
TraceProvider
,
faultTypes
.
OracleUpdater
,
error
)
{
resourceCreator
:=
func
(
addr
common
.
Address
,
contract
*
contracts
.
FaultDisputeGameContract
,
gameDepth
uint64
,
dir
string
)
(
faultTypes
.
TraceProvider
,
faultTypes
.
OracleUpdater
,
error
)
{
provider
:=
alphabet
.
NewTraceProvider
(
cfg
.
AlphabetTrace
,
gameDepth
)
provider
:=
alphabet
.
NewTraceProvider
(
cfg
.
AlphabetTrace
,
gameDepth
)
updater
:=
alphabet
.
NewOracleUpdater
(
logger
)
updater
:=
alphabet
.
NewOracleUpdater
(
logger
)
return
provider
,
updater
,
nil
return
provider
,
updater
,
nil
...
...
op-challenger/game/fault/trace/
select
.go
→
op-challenger/game/fault/trace/
access
.go
View file @
37b2b0f0
File moved
op-challenger/game/fault/trace/
select
_test.go
→
op-challenger/game/fault/trace/
access
_test.go
View file @
37b2b0f0
File moved
op-challenger/game/fault/trace/cannon/local.go
View file @
37b2b0f0
...
@@ -5,8 +5,7 @@ import (
...
@@ -5,8 +5,7 @@ import (
"fmt"
"fmt"
"math/big"
"math/big"
"github.com/ethereum-optimism/optimism/op-bindings/bindings"
"github.com/ethereum-optimism/optimism/op-challenger/game/fault/contracts"
"github.com/ethereum/go-ethereum/accounts/abi/bind"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/common"
ethtypes
"github.com/ethereum/go-ethereum/core/types"
ethtypes
"github.com/ethereum/go-ethereum/core/types"
)
)
...
@@ -25,26 +24,20 @@ type L2DataSource interface {
...
@@ -25,26 +24,20 @@ type L2DataSource interface {
}
}
type
GameInputsSource
interface
{
type
GameInputsSource
interface
{
L1Head
(
opts
*
bind
.
CallOpts
)
([
32
]
byte
,
error
)
GetL1Head
(
ctx
context
.
Context
)
(
common
.
Hash
,
error
)
Proposals
(
opts
*
bind
.
CallOpts
)
(
struct
{
GetProposals
(
ctx
context
.
Context
)
(
agreed
contracts
.
Proposal
,
disputed
contracts
.
Proposal
,
err
error
)
Starting
bindings
.
IFaultDisputeGameOutputProposal
Disputed
bindings
.
IFaultDisputeGameOutputProposal
},
error
)
}
}
func
fetchLocalInputs
(
ctx
context
.
Context
,
gameAddr
common
.
Address
,
caller
GameInputsSource
,
l2Client
L2DataSource
)
(
LocalGameInputs
,
error
)
{
func
fetchLocalInputs
(
ctx
context
.
Context
,
caller
GameInputsSource
,
l2Client
L2DataSource
)
(
LocalGameInputs
,
error
)
{
opts
:=
&
bind
.
CallOpts
{
Context
:
ctx
}
l1Head
,
err
:=
caller
.
GetL1Head
(
ctx
)
l1Head
,
err
:=
caller
.
L1Head
(
opts
)
if
err
!=
nil
{
if
err
!=
nil
{
return
LocalGameInputs
{},
fmt
.
Errorf
(
"fetch L1 head
for game %v: %w"
,
gameAddr
,
err
)
return
LocalGameInputs
{},
fmt
.
Errorf
(
"fetch L1 head
: %w"
,
err
)
}
}
proposals
,
err
:=
caller
.
Proposals
(
opts
)
agreedOutput
,
claimedOutput
,
err
:=
caller
.
GetProposals
(
ctx
)
if
err
!=
nil
{
if
err
!=
nil
{
return
LocalGameInputs
{},
fmt
.
Errorf
(
"fetch proposals: %w"
,
err
)
return
LocalGameInputs
{},
fmt
.
Errorf
(
"fetch proposals: %w"
,
err
)
}
}
claimedOutput
:=
proposals
.
Disputed
agreedOutput
:=
proposals
.
Starting
agreedHeader
,
err
:=
l2Client
.
HeaderByNumber
(
ctx
,
agreedOutput
.
L2BlockNumber
)
agreedHeader
,
err
:=
l2Client
.
HeaderByNumber
(
ctx
,
agreedOutput
.
L2BlockNumber
)
if
err
!=
nil
{
if
err
!=
nil
{
return
LocalGameInputs
{},
fmt
.
Errorf
(
"fetch L2 block header %v: %w"
,
agreedOutput
.
L2BlockNumber
,
err
)
return
LocalGameInputs
{},
fmt
.
Errorf
(
"fetch L2 block header %v: %w"
,
agreedOutput
.
L2BlockNumber
,
err
)
...
...
op-challenger/game/fault/trace/cannon/local_test.go
View file @
37b2b0f0
...
@@ -5,9 +5,8 @@ import (
...
@@ -5,9 +5,8 @@ import (
"math/big"
"math/big"
"testing"
"testing"
"github.com/ethereum-optimism/optimism/op-
bindings/binding
s"
"github.com/ethereum-optimism/optimism/op-
challenger/game/fault/contract
s"
"github.com/ethereum/go-ethereum"
"github.com/ethereum/go-ethereum"
"github.com/ethereum/go-ethereum/accounts/abi/bind"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/common"
ethtypes
"github.com/ethereum/go-ethereum/core/types"
ethtypes
"github.com/ethereum/go-ethereum/core/types"
"github.com/stretchr/testify/require"
"github.com/stretchr/testify/require"
...
@@ -15,15 +14,14 @@ import (
...
@@ -15,15 +14,14 @@ import (
func
TestFetchLocalInputs
(
t
*
testing
.
T
)
{
func
TestFetchLocalInputs
(
t
*
testing
.
T
)
{
ctx
:=
context
.
Background
()
ctx
:=
context
.
Background
()
gameAddr
:=
common
.
Address
{
0xab
}
contract
:=
&
mockGameInputsSource
{
l1Client
:=
&
mockGameInputsSource
{
l1Head
:
common
.
Hash
{
0xcc
},
l1Head
:
common
.
Hash
{
0xcc
},
starting
:
bindings
.
IFaultDisputeGameOutput
Proposal
{
starting
:
contracts
.
Proposal
{
Index
:
big
.
NewInt
(
6
),
Index
:
big
.
NewInt
(
6
),
L2BlockNumber
:
big
.
NewInt
(
2222
),
L2BlockNumber
:
big
.
NewInt
(
2222
),
OutputRoot
:
common
.
Hash
{
0xdd
},
OutputRoot
:
common
.
Hash
{
0xdd
},
},
},
disputed
:
bindings
.
IFaultDisputeGameOutput
Proposal
{
disputed
:
contracts
.
Proposal
{
Index
:
big
.
NewInt
(
7
),
Index
:
big
.
NewInt
(
7
),
L2BlockNumber
:
big
.
NewInt
(
3333
),
L2BlockNumber
:
big
.
NewInt
(
3333
),
OutputRoot
:
common
.
Hash
{
0xee
},
OutputRoot
:
common
.
Hash
{
0xee
},
...
@@ -32,41 +30,32 @@ func TestFetchLocalInputs(t *testing.T) {
...
@@ -32,41 +30,32 @@ func TestFetchLocalInputs(t *testing.T) {
l2Client
:=
&
mockL2DataSource
{
l2Client
:=
&
mockL2DataSource
{
chainID
:
big
.
NewInt
(
88422
),
chainID
:
big
.
NewInt
(
88422
),
header
:
ethtypes
.
Header
{
header
:
ethtypes
.
Header
{
Number
:
l1Clien
t
.
starting
.
L2BlockNumber
,
Number
:
contrac
t
.
starting
.
L2BlockNumber
,
},
},
}
}
inputs
,
err
:=
fetchLocalInputs
(
ctx
,
gameAddr
,
l1Clien
t
,
l2Client
)
inputs
,
err
:=
fetchLocalInputs
(
ctx
,
contrac
t
,
l2Client
)
require
.
NoError
(
t
,
err
)
require
.
NoError
(
t
,
err
)
require
.
Equal
(
t
,
l1Clien
t
.
l1Head
,
inputs
.
L1Head
)
require
.
Equal
(
t
,
contrac
t
.
l1Head
,
inputs
.
L1Head
)
require
.
Equal
(
t
,
l2Client
.
header
.
Hash
(),
inputs
.
L2Head
)
require
.
Equal
(
t
,
l2Client
.
header
.
Hash
(),
inputs
.
L2Head
)
require
.
EqualValues
(
t
,
l1Clien
t
.
starting
.
OutputRoot
,
inputs
.
L2OutputRoot
)
require
.
EqualValues
(
t
,
contrac
t
.
starting
.
OutputRoot
,
inputs
.
L2OutputRoot
)
require
.
EqualValues
(
t
,
l1Clien
t
.
disputed
.
OutputRoot
,
inputs
.
L2Claim
)
require
.
EqualValues
(
t
,
contrac
t
.
disputed
.
OutputRoot
,
inputs
.
L2Claim
)
require
.
Equal
(
t
,
l1Clien
t
.
disputed
.
L2BlockNumber
,
inputs
.
L2BlockNumber
)
require
.
Equal
(
t
,
contrac
t
.
disputed
.
L2BlockNumber
,
inputs
.
L2BlockNumber
)
}
}
type
mockGameInputsSource
struct
{
type
mockGameInputsSource
struct
{
l1Head
common
.
Hash
l1Head
common
.
Hash
starting
bindings
.
IFaultDisputeGameOutput
Proposal
starting
contracts
.
Proposal
disputed
bindings
.
IFaultDisputeGameOutput
Proposal
disputed
contracts
.
Proposal
}
}
func
(
s
*
mockGameInputsSource
)
L1Head
(
opts
*
bind
.
CallOpts
)
([
32
]
byte
,
error
)
{
func
(
s
*
mockGameInputsSource
)
GetL1Head
(
_
context
.
Context
)
(
common
.
Hash
,
error
)
{
return
s
.
l1Head
,
nil
return
s
.
l1Head
,
nil
}
}
func
(
s
*
mockGameInputsSource
)
Proposals
(
opts
*
bind
.
CallOpts
)
(
struct
{
func
(
s
*
mockGameInputsSource
)
GetProposals
(
_
context
.
Context
)
(
contracts
.
Proposal
,
contracts
.
Proposal
,
error
)
{
Starting
bindings
.
IFaultDisputeGameOutputProposal
return
s
.
starting
,
s
.
disputed
,
nil
Disputed
bindings
.
IFaultDisputeGameOutputProposal
},
error
)
{
return
struct
{
Starting
bindings
.
IFaultDisputeGameOutputProposal
Disputed
bindings
.
IFaultDisputeGameOutputProposal
}{
Starting
:
s
.
starting
,
Disputed
:
s
.
disputed
,
},
nil
}
}
type
mockL2DataSource
struct
{
type
mockL2DataSource
struct
{
...
...
op-challenger/game/fault/trace/cannon/provider.go
View file @
37b2b0f0
...
@@ -8,11 +8,10 @@ import (
...
@@ -8,11 +8,10 @@ import (
"os"
"os"
"path/filepath"
"path/filepath"
"github.com/ethereum-optimism/optimism/op-bindings/bindings"
"github.com/ethereum-optimism/optimism/op-challenger/config"
"github.com/ethereum-optimism/optimism/op-challenger/config"
"github.com/ethereum-optimism/optimism/op-challenger/game/fault/contracts"
"github.com/ethereum-optimism/optimism/op-challenger/game/fault/types"
"github.com/ethereum-optimism/optimism/op-challenger/game/fault/types"
"github.com/ethereum-optimism/optimism/op-service/ioutil"
"github.com/ethereum-optimism/optimism/op-service/ioutil"
"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/common/hexutil"
"github.com/ethereum/go-ethereum/common/hexutil"
"github.com/ethereum/go-ethereum/ethclient"
"github.com/ethereum/go-ethereum/ethclient"
...
@@ -56,17 +55,13 @@ type CannonTraceProvider struct {
...
@@ -56,17 +55,13 @@ type CannonTraceProvider struct {
lastStep
uint64
lastStep
uint64
}
}
func
NewTraceProvider
(
ctx
context
.
Context
,
logger
log
.
Logger
,
m
CannonMetricer
,
cfg
*
config
.
Config
,
l1Client
bind
.
ContractCaller
,
dir
string
,
gameAddr
common
.
Address
,
gameDepth
uint64
)
(
*
CannonTraceProvider
,
error
)
{
func
NewTraceProvider
(
ctx
context
.
Context
,
logger
log
.
Logger
,
m
CannonMetricer
,
cfg
*
config
.
Config
,
gameContract
*
contracts
.
FaultDisputeGameContract
,
dir
string
,
gameDepth
uint64
)
(
*
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
)
}
}
defer
l2Client
.
Close
()
// Not needed after fetching the inputs
defer
l2Client
.
Close
()
// Not needed after fetching the inputs
gameCaller
,
err
:=
bindings
.
NewFaultDisputeGameCaller
(
gameAddr
,
l1Client
)
localInputs
,
err
:=
fetchLocalInputs
(
ctx
,
gameContract
,
l2Client
)
if
err
!=
nil
{
return
nil
,
fmt
.
Errorf
(
"create caller for game %v: %w"
,
gameAddr
,
err
)
}
localInputs
,
err
:=
fetchLocalInputs
(
ctx
,
gameAddr
,
gameCaller
,
l2Client
)
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
)
}
}
...
...
op-challenger/game/fault/types/types.go
View file @
37b2b0f0
...
@@ -57,8 +57,15 @@ type OracleUpdater interface {
...
@@ -57,8 +57,15 @@ type OracleUpdater interface {
UpdateOracle
(
ctx
context
.
Context
,
data
*
PreimageOracleData
)
error
UpdateOracle
(
ctx
context
.
Context
,
data
*
PreimageOracleData
)
error
}
}
// TraceAccessor defines an interface to request data from a TraceProvider with additional context for the game position.
// This can be used to implement split games where lower layers of the game may have different values depending on claims
// at higher levels in the game.
type
TraceAccessor
interface
{
type
TraceAccessor
interface
{
// Get returns the claim value at the requested position, evaluated in the context of the specified claim (ref).
Get
(
ctx
context
.
Context
,
game
Game
,
ref
Claim
,
pos
Position
)
(
common
.
Hash
,
error
)
Get
(
ctx
context
.
Context
,
game
Game
,
ref
Claim
,
pos
Position
)
(
common
.
Hash
,
error
)
// GetStepData returns the data required to execute the step at the specified position,
// evaluated in the context of the specified claim (ref).
GetStepData
(
ctx
context
.
Context
,
game
Game
,
ref
Claim
,
pos
Position
)
(
prestate
[]
byte
,
proofData
[]
byte
,
preimageData
*
PreimageOracleData
,
err
error
)
GetStepData
(
ctx
context
.
Context
,
game
Game
,
ref
Claim
,
pos
Position
)
(
prestate
[]
byte
,
proofData
[]
byte
,
preimageData
*
PreimageOracleData
,
err
error
)
}
}
...
...
op-e2e/actions/dencun_fork_test.go
0 → 100644
View file @
37b2b0f0
package
actions
import
(
"testing"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/log"
"github.com/stretchr/testify/require"
"github.com/ethereum-optimism/optimism/op-e2e/e2eutils"
"github.com/ethereum-optimism/optimism/op-service/testlog"
)
func
TestDencunL1Fork
(
gt
*
testing
.
T
)
{
t
:=
NewDefaultTesting
(
gt
)
dp
:=
e2eutils
.
MakeDeployParams
(
t
,
defaultRollupTestParams
)
sd
:=
e2eutils
.
Setup
(
t
,
dp
,
defaultAlloc
)
activation
:=
sd
.
L1Cfg
.
Timestamp
+
24
sd
.
L1Cfg
.
Config
.
CancunTime
=
&
activation
log
:=
testlog
.
Logger
(
t
,
log
.
LvlDebug
)
_
,
_
,
miner
,
sequencer
,
_
,
verifier
,
_
,
batcher
:=
setupReorgTestActors
(
t
,
dp
,
sd
,
log
)
l1Head
:=
miner
.
l1Chain
.
CurrentBlock
()
require
.
False
(
t
,
sd
.
L1Cfg
.
Config
.
IsCancun
(
l1Head
.
Number
,
l1Head
.
Time
),
"Cancun not active yet"
)
// start op-nodes
sequencer
.
ActL2PipelineFull
(
t
)
verifier
.
ActL2PipelineFull
(
t
)
// build empty L1 blocks, crossing the fork boundary
miner
.
ActL1SetFeeRecipient
(
common
.
Address
{
'A'
,
0
})
miner
.
ActEmptyBlock
(
t
)
miner
.
ActEmptyBlock
(
t
)
// Cancun activates here
miner
.
ActEmptyBlock
(
t
)
// verify Cancun is active
l1Head
=
miner
.
l1Chain
.
CurrentBlock
()
require
.
True
(
t
,
sd
.
L1Cfg
.
Config
.
IsCancun
(
l1Head
.
Number
,
l1Head
.
Time
),
"Cancun active"
)
// build L2 chain up to and including L2 blocks referencing Cancun L1 blocks
sequencer
.
ActL1HeadSignal
(
t
)
sequencer
.
ActBuildToL1Head
(
t
)
miner
.
ActL1StartBlock
(
12
)(
t
)
batcher
.
ActSubmitAll
(
t
)
miner
.
ActL1IncludeTx
(
batcher
.
batcherAddr
)(
t
)
miner
.
ActL1EndBlock
(
t
)
// sync verifier
verifier
.
ActL1HeadSignal
(
t
)
verifier
.
ActL2PipelineFull
(
t
)
// verify verifier accepted Cancun L1 inputs
require
.
Equal
(
t
,
l1Head
.
Hash
(),
verifier
.
SyncStatus
()
.
SafeL2
.
L1Origin
.
Hash
,
"verifier synced L1 chain that includes Cancun headers"
)
require
.
Equal
(
t
,
sequencer
.
SyncStatus
()
.
UnsafeL2
,
verifier
.
SyncStatus
()
.
UnsafeL2
,
"verifier and sequencer agree"
)
}
op-e2e/actions/l1_miner.go
View file @
37b2b0f0
...
@@ -76,6 +76,13 @@ func (s *L1Miner) ActL1StartBlock(timeDelta uint64) Action {
...
@@ -76,6 +76,13 @@ func (s *L1Miner) ActL1StartBlock(timeDelta uint64) Action {
if
s
.
l1Cfg
.
Config
.
IsShanghai
(
header
.
Number
,
header
.
Time
)
{
if
s
.
l1Cfg
.
Config
.
IsShanghai
(
header
.
Number
,
header
.
Time
)
{
header
.
WithdrawalsHash
=
&
types
.
EmptyWithdrawalsHash
header
.
WithdrawalsHash
=
&
types
.
EmptyWithdrawalsHash
}
}
if
s
.
l1Cfg
.
Config
.
IsCancun
(
header
.
Number
,
header
.
Time
)
{
var
root
common
.
Hash
var
zero
uint64
header
.
BlobGasUsed
=
&
zero
header
.
ExcessBlobGas
=
&
zero
header
.
ParentBeaconRoot
=
&
root
}
s
.
l1Building
=
true
s
.
l1Building
=
true
s
.
l1BuildingHeader
=
header
s
.
l1BuildingHeader
=
header
...
...
op-e2e/e2eutils/disputegame/cannon_helper.go
View file @
37b2b0f0
...
@@ -4,13 +4,15 @@ import (
...
@@ -4,13 +4,15 @@ import (
"context"
"context"
"path/filepath"
"path/filepath"
"github.com/ethereum-optimism/optimism/op-challenger/game/fault/contracts"
"github.com/ethereum-optimism/optimism/op-challenger/game/fault/trace/cannon"
"github.com/ethereum-optimism/optimism/op-challenger/game/fault/trace/cannon"
"github.com/ethereum-optimism/optimism/op-challenger/metrics"
"github.com/ethereum-optimism/optimism/op-challenger/metrics"
"github.com/ethereum-optimism/optimism/op-e2e/e2eutils/challenger"
"github.com/ethereum-optimism/optimism/op-e2e/e2eutils/challenger"
"github.com/ethereum-optimism/optimism/op-node/rollup"
"github.com/ethereum-optimism/optimism/op-node/rollup"
"github.com/ethereum-optimism/optimism/op-service/sources/batching"
"github.com/ethereum-optimism/optimism/op-service/testlog"
"github.com/ethereum-optimism/optimism/op-service/testlog"
"github.com/ethereum/go-ethereum/accounts/abi/bind"
"github.com/ethereum/go-ethereum/core"
"github.com/ethereum/go-ethereum/core"
"github.com/ethereum/go-ethereum/ethclient"
"github.com/ethereum/go-ethereum/log"
"github.com/ethereum/go-ethereum/log"
)
)
...
@@ -32,7 +34,7 @@ func (g *CannonGameHelper) StartChallenger(ctx context.Context, rollupCfg *rollu
...
@@ -32,7 +34,7 @@ func (g *CannonGameHelper) StartChallenger(ctx context.Context, rollupCfg *rollu
return
c
return
c
}
}
func
(
g
*
CannonGameHelper
)
CreateHonestActor
(
ctx
context
.
Context
,
rollupCfg
*
rollup
.
Config
,
l2Genesis
*
core
.
Genesis
,
l1Client
bind
.
ContractCaller
,
l1Endpoint
string
,
l2Endpoint
string
,
options
...
challenger
.
Option
)
*
HonestHelper
{
func
(
g
*
CannonGameHelper
)
CreateHonestActor
(
ctx
context
.
Context
,
rollupCfg
*
rollup
.
Config
,
l2Genesis
*
core
.
Genesis
,
l1Client
*
ethclient
.
Client
,
l1Endpoint
string
,
l2Endpoint
string
,
options
...
challenger
.
Option
)
*
HonestHelper
{
opts
:=
[]
challenger
.
Option
{
opts
:=
[]
challenger
.
Option
{
challenger
.
WithCannon
(
g
.
t
,
rollupCfg
,
l2Genesis
,
l2Endpoint
),
challenger
.
WithCannon
(
g
.
t
,
rollupCfg
,
l2Genesis
,
l2Endpoint
),
challenger
.
WithFactoryAddress
(
g
.
factoryAddr
),
challenger
.
WithFactoryAddress
(
g
.
factoryAddr
),
...
@@ -42,7 +44,9 @@ func (g *CannonGameHelper) CreateHonestActor(ctx context.Context, rollupCfg *rol
...
@@ -42,7 +44,9 @@ func (g *CannonGameHelper) CreateHonestActor(ctx context.Context, rollupCfg *rol
cfg
:=
challenger
.
NewChallengerConfig
(
g
.
t
,
l1Endpoint
,
opts
...
)
cfg
:=
challenger
.
NewChallengerConfig
(
g
.
t
,
l1Endpoint
,
opts
...
)
logger
:=
testlog
.
Logger
(
g
.
t
,
log
.
LvlInfo
)
.
New
(
"role"
,
"CorrectTrace"
)
logger
:=
testlog
.
Logger
(
g
.
t
,
log
.
LvlInfo
)
.
New
(
"role"
,
"CorrectTrace"
)
maxDepth
:=
g
.
MaxDepth
(
ctx
)
maxDepth
:=
g
.
MaxDepth
(
ctx
)
provider
,
err
:=
cannon
.
NewTraceProvider
(
ctx
,
logger
,
metrics
.
NoopMetrics
,
cfg
,
l1Client
,
filepath
.
Join
(
cfg
.
Datadir
,
"honest"
),
g
.
addr
,
uint64
(
maxDepth
))
gameContract
,
err
:=
contracts
.
NewFaultDisputeGameContract
(
g
.
addr
,
batching
.
NewMultiCaller
(
l1Client
.
Client
(),
batching
.
DefaultBatchSize
))
g
.
require
.
NoError
(
err
,
"Create game contract bindings"
)
provider
,
err
:=
cannon
.
NewTraceProvider
(
ctx
,
logger
,
metrics
.
NoopMetrics
,
cfg
,
gameContract
,
filepath
.
Join
(
cfg
.
Datadir
,
"honest"
),
uint64
(
maxDepth
))
g
.
require
.
NoError
(
err
,
"create cannon trace provider"
)
g
.
require
.
NoError
(
err
,
"create cannon trace provider"
)
return
&
HonestHelper
{
return
&
HonestHelper
{
...
...
op-node/.gitignore
View file @
37b2b0f0
bin
bin
# config files
genesis.json
jwt.txt
rollup.json
op-node/p2p/cli/load_signer.go
View file @
37b2b0f0
...
@@ -2,6 +2,7 @@ package cli
...
@@ -2,6 +2,7 @@ package cli
import
(
import
(
"fmt"
"fmt"
"strings"
"github.com/ethereum/go-ethereum/crypto"
"github.com/ethereum/go-ethereum/crypto"
"github.com/urfave/cli/v2"
"github.com/urfave/cli/v2"
...
@@ -19,7 +20,7 @@ func LoadSignerSetup(ctx *cli.Context) (p2p.SignerSetup, error) {
...
@@ -19,7 +20,7 @@ func LoadSignerSetup(ctx *cli.Context) (p2p.SignerSetup, error) {
if
key
!=
""
{
if
key
!=
""
{
// Mnemonics are bad because they leak *all* keys when they leak.
// Mnemonics are bad because they leak *all* keys when they leak.
// Unencrypted keys from file are bad because they are easy to leak (and we are not checking file permissions).
// Unencrypted keys from file are bad because they are easy to leak (and we are not checking file permissions).
priv
,
err
:=
crypto
.
HexToECDSA
(
key
)
priv
,
err
:=
crypto
.
HexToECDSA
(
strings
.
TrimPrefix
(
key
,
"0x"
)
)
if
err
!=
nil
{
if
err
!=
nil
{
return
nil
,
fmt
.
Errorf
(
"failed to read batch submitter key: %w"
,
err
)
return
nil
,
fmt
.
Errorf
(
"failed to read batch submitter key: %w"
,
err
)
}
}
...
...
op-service/sources/batching/call.go
View file @
37b2b0f0
...
@@ -129,3 +129,7 @@ func (c *CallResult) GetAddress(i int) common.Address {
...
@@ -129,3 +129,7 @@ func (c *CallResult) GetAddress(i int) common.Address {
func
(
c
*
CallResult
)
GetBigInt
(
i
int
)
*
big
.
Int
{
func
(
c
*
CallResult
)
GetBigInt
(
i
int
)
*
big
.
Int
{
return
*
abi
.
ConvertType
(
c
.
out
[
i
],
new
(
*
big
.
Int
))
.
(
**
big
.
Int
)
return
*
abi
.
ConvertType
(
c
.
out
[
i
],
new
(
*
big
.
Int
))
.
(
**
big
.
Int
)
}
}
func
(
c
*
CallResult
)
GetStruct
(
i
int
,
target
interface
{})
{
abi
.
ConvertType
(
c
.
out
[
i
],
target
)
}
op-service/sources/batching/call_test.go
View file @
37b2b0f0
...
@@ -155,6 +155,24 @@ func TestCallResult_GetValues(t *testing.T) {
...
@@ -155,6 +155,24 @@ func TestCallResult_GetValues(t *testing.T) {
},
},
expected
:
big
.
NewInt
(
2398423
),
expected
:
big
.
NewInt
(
2398423
),
},
},
{
name
:
"GetStruct"
,
getter
:
func
(
result
*
CallResult
,
i
int
)
interface
{}
{
out
:=
struct
{
a
*
big
.
Int
b
common
.
Hash
}{}
result
.
GetStruct
(
i
,
&
out
)
return
out
},
expected
:
struct
{
a
*
big
.
Int
b
common
.
Hash
}{
a
:
big
.
NewInt
(
6
),
b
:
common
.
Hash
{
0xee
},
},
},
}
}
for
_
,
test
:=
range
tests
{
for
_
,
test
:=
range
tests
{
...
...
op-service/sources/receipts_test.go
View file @
37b2b0f0
...
@@ -4,6 +4,7 @@ import (
...
@@ -4,6 +4,7 @@ import (
"context"
"context"
"encoding/json"
"encoding/json"
"fmt"
"fmt"
"math/big"
"math/rand"
"math/rand"
"testing"
"testing"
"time"
"time"
...
@@ -17,6 +18,7 @@ import (
...
@@ -17,6 +18,7 @@ import (
"github.com/ethereum/go-ethereum/core/types"
"github.com/ethereum/go-ethereum/core/types"
"github.com/ethereum/go-ethereum/log"
"github.com/ethereum/go-ethereum/log"
"github.com/ethereum/go-ethereum/rpc"
"github.com/ethereum/go-ethereum/rpc"
"github.com/ethereum/go-ethereum/trie"
"github.com/stretchr/testify/mock"
"github.com/stretchr/testify/mock"
"github.com/stretchr/testify/require"
"github.com/stretchr/testify/require"
)
)
...
@@ -338,3 +340,233 @@ func TestEthClient_FetchReceipts(t *testing.T) {
...
@@ -338,3 +340,233 @@ func TestEthClient_FetchReceipts(t *testing.T) {
t
.
Run
(
tc
.
name
,
tc
.
Run
)
t
.
Run
(
tc
.
name
,
tc
.
Run
)
}
}
}
}
func
TestVerifyReceipts
(
t
*
testing
.
T
)
{
validData
:=
func
()
(
eth
.
BlockID
,
common
.
Hash
,
[]
common
.
Hash
,
[]
*
types
.
Receipt
)
{
block
:=
eth
.
BlockID
{
Hash
:
common
.
HexToHash
(
"0x40fb7cc5fbc1ec594230a60648a442412116d50ae43d517ea458d8ea4e60bd1b"
),
Number
:
9998910
,
}
txHashes
:=
[]
common
.
Hash
{
common
.
HexToHash
(
"0x61e4872004a80843fcbede236527bf24707f4e8f44a2704ed9c4fb91c87b0f29"
),
common
.
HexToHash
(
"0x0ae25ad9ff01fd74fa1b0c11f12fbb623a3f0553a0eed465a6dbf0962898c3b6"
),
common
.
HexToHash
(
"0x2de33b18143039dcdf88cb62c3f3dd8f3f5d9f29807edfd3b0507246c55f9cb8"
),
common
.
HexToHash
(
"0xb6a381d3c31df47da82ac807c3000ae4adf55e981715f56d13a27b220de20198"
),
}
receipts
:=
[]
*
types
.
Receipt
{
{
Type
:
2
,
Status
:
0
,
CumulativeGasUsed
:
0x3035b
,
Bloom
:
types
.
BytesToBloom
(
common
.
Hex2Bytes
(
"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
)),
Logs
:
nil
,
TxHash
:
txHashes
[
0
],
GasUsed
:
0x3035b
,
EffectiveGasPrice
:
big
.
NewInt
(
0x12a05f20a
),
BlockHash
:
block
.
Hash
,
BlockNumber
:
new
(
big
.
Int
)
.
SetUint64
(
block
.
Number
),
TransactionIndex
:
0
,
},
{
Type
:
2
,
Status
:
1
,
CumulativeGasUsed
:
0xa9ae4
,
Bloom
:
types
.
BytesToBloom
(
common
.
Hex2Bytes
(
"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
)),
Logs
:
nil
,
TxHash
:
txHashes
[
1
],
GasUsed
:
0x79789
,
EffectiveGasPrice
:
big
.
NewInt
(
0xb2d05e0a
),
BlockHash
:
block
.
Hash
,
BlockNumber
:
new
(
big
.
Int
)
.
SetUint64
(
block
.
Number
),
TransactionIndex
:
1
,
},
{
Type
:
0
,
Status
:
1
,
CumulativeGasUsed
:
0x101f09
,
Bloom
:
types
.
BytesToBloom
(
common
.
Hex2Bytes
(
"0x00000000000000000000000000000200000400000000000000000000000000800000000000040000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002002000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000800000000000000000000000000000000000000000000000000000400000000000000020000000000000000000000000002000000000000000000000000000000000000000000"
)),
Logs
:
[]
*
types
.
Log
{
{
Address
:
common
.
HexToAddress
(
"0x759c5e44a9e4be8b7e9bd25a790ceb662c924c45"
),
Topics
:
[]
common
.
Hash
{
common
.
HexToHash
(
"0x33830f93f4b524630176cdcbc04070b30ada13c6ad27081289131b77f178ff89"
),
common
.
HexToHash
(
"0x0000000000000000000000000000000000000000000000000000000000426a80"
),
common
.
HexToHash
(
"0x000000000000000000000000a6275ee214f80a532c3abee0a4cbbc2d1dc22a72"
),
},
Data
:
common
.
Hex2Bytes
(
"0x00000000000000000000000000000000000000000000000000000000000005dc"
),
BlockNumber
:
block
.
Number
,
TxHash
:
txHashes
[
2
],
TxIndex
:
2
,
BlockHash
:
block
.
Hash
,
Index
:
0
,
Removed
:
false
,
},
},
TxHash
:
txHashes
[
2
],
GasUsed
:
0x58425
,
EffectiveGasPrice
:
big
.
NewInt
(
0xb2d05e00
),
BlockHash
:
block
.
Hash
,
BlockNumber
:
new
(
big
.
Int
)
.
SetUint64
(
block
.
Number
),
TransactionIndex
:
2
,
},
{
Type
:
0
,
Status
:
1
,
CumulativeGasUsed
:
0x1227ab
,
Bloom
:
types
.
BytesToBloom
(
common
.
Hex2Bytes
(
"0x00000000000000000000000000000200000400000000000000000000000000800000000000040000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002002000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000800000000000000000000000000000000000000000000000000000400000000000000020000000000000000000000000002000000000000000000000000000000000000000000"
)),
Logs
:
[]
*
types
.
Log
{
{
Address
:
common
.
HexToAddress
(
"0x759c5e44a9e4be8b7e9bd25a790ceb662c924c45"
),
Topics
:
[]
common
.
Hash
{
common
.
HexToHash
(
"0x33830f93f4b524630176cdcbc04070b30ada13c6ad27081289131b77f178ff89"
),
common
.
HexToHash
(
"0x0000000000000000000000000000000000000000000000000000000000426a80"
),
common
.
HexToHash
(
"0x000000000000000000000000a6275ee214f80a532c3abee0a4cbbc2d1dc22a72"
),
},
Data
:
common
.
Hex2Bytes
(
"0x00000000000000000000000000000000000000000000000000000000000005dc"
),
BlockNumber
:
block
.
Number
,
TxHash
:
txHashes
[
3
],
TxIndex
:
3
,
BlockHash
:
block
.
Hash
,
Index
:
1
,
Removed
:
false
,
},
},
TxHash
:
txHashes
[
3
],
GasUsed
:
0x208a2
,
EffectiveGasPrice
:
big
.
NewInt
(
0x59682f0a
),
BlockHash
:
block
.
Hash
,
BlockNumber
:
new
(
big
.
Int
)
.
SetUint64
(
block
.
Number
),
TransactionIndex
:
3
,
},
}
receiptsHash
:=
types
.
DeriveSha
(
types
.
Receipts
(
receipts
),
trie
.
NewStackTrie
(
nil
))
return
block
,
receiptsHash
,
txHashes
,
receipts
}
t
.
Run
(
"Valid"
,
func
(
t
*
testing
.
T
)
{
block
,
receiptHash
,
txHashes
,
receipts
:=
validData
()
err
:=
validateReceipts
(
block
,
receiptHash
,
txHashes
,
receipts
)
require
.
NoError
(
t
,
err
)
})
t
.
Run
(
"NotEnoughReceipts"
,
func
(
t
*
testing
.
T
)
{
block
,
receiptHash
,
txHashes
,
receipts
:=
validData
()
err
:=
validateReceipts
(
block
,
receiptHash
,
txHashes
,
receipts
[
1
:
])
require
.
ErrorContains
(
t
,
err
,
fmt
.
Sprintf
(
"got %d receipts but expected %d"
,
len
(
receipts
)
-
1
,
len
(
receipts
)))
})
t
.
Run
(
"TooManyReceipts"
,
func
(
t
*
testing
.
T
)
{
block
,
receiptHash
,
txHashes
,
receipts
:=
validData
()
err
:=
validateReceipts
(
block
,
receiptHash
,
txHashes
,
append
(
receipts
,
receipts
[
0
]))
require
.
ErrorContains
(
t
,
err
,
fmt
.
Sprintf
(
"got %d receipts but expected %d"
,
len
(
receipts
)
+
1
,
len
(
receipts
)))
})
t
.
Run
(
"NoTxButNotEmptyTrieRoot"
,
func
(
t
*
testing
.
T
)
{
block
,
receiptHash
,
_
,
_
:=
validData
()
err
:=
validateReceipts
(
block
,
receiptHash
,
nil
,
nil
)
require
.
ErrorContains
(
t
,
err
,
"no transactions, but got non-empty receipt trie root"
)
})
t
.
Run
(
"NoTxWithEmptyTrieRoot"
,
func
(
t
*
testing
.
T
)
{
block
,
_
,
_
,
_
:=
validData
()
err
:=
validateReceipts
(
block
,
types
.
EmptyRootHash
,
nil
,
nil
)
require
.
NoError
(
t
,
err
)
})
t
.
Run
(
"IncorrectReceiptRoot"
,
func
(
t
*
testing
.
T
)
{
block
,
_
,
txHashes
,
receipts
:=
validData
()
err
:=
validateReceipts
(
block
,
common
.
Hash
{
0x35
},
txHashes
,
receipts
)
require
.
ErrorContains
(
t
,
err
,
"failed to fetch list of receipts: expected receipt root"
)
})
t
.
Run
(
"NilReceipt"
,
func
(
t
*
testing
.
T
)
{
block
,
receiptHash
,
txHashes
,
receipts
:=
validData
()
receipts
[
0
]
=
nil
err
:=
validateReceipts
(
block
,
receiptHash
,
txHashes
,
receipts
)
require
.
ErrorContains
(
t
,
err
,
"returns nil on retrieval"
)
})
t
.
Run
(
"IncorrectTxIndex"
,
func
(
t
*
testing
.
T
)
{
block
,
receiptHash
,
txHashes
,
receipts
:=
validData
()
receipts
[
0
]
.
TransactionIndex
=
2
err
:=
validateReceipts
(
block
,
receiptHash
,
txHashes
,
receipts
)
require
.
ErrorContains
(
t
,
err
,
"has unexpected tx index"
)
})
t
.
Run
(
"Missing block number"
,
func
(
t
*
testing
.
T
)
{
block
,
receiptHash
,
txHashes
,
receipts
:=
validData
()
receipts
[
0
]
.
BlockNumber
=
nil
err
:=
validateReceipts
(
block
,
receiptHash
,
txHashes
,
receipts
)
require
.
ErrorContains
(
t
,
err
,
"has unexpected nil block number"
)
})
t
.
Run
(
"IncorrectBlockNumber"
,
func
(
t
*
testing
.
T
)
{
block
,
receiptHash
,
txHashes
,
receipts
:=
validData
()
receipts
[
0
]
.
BlockNumber
=
big
.
NewInt
(
1234
)
err
:=
validateReceipts
(
block
,
receiptHash
,
txHashes
,
receipts
)
require
.
ErrorContains
(
t
,
err
,
"has unexpected block number"
)
})
t
.
Run
(
"IncorrectBlockHash"
,
func
(
t
*
testing
.
T
)
{
block
,
receiptHash
,
txHashes
,
receipts
:=
validData
()
receipts
[
0
]
.
BlockHash
=
common
.
Hash
{
0x48
}
err
:=
validateReceipts
(
block
,
receiptHash
,
txHashes
,
receipts
)
require
.
ErrorContains
(
t
,
err
,
"has unexpected block hash"
)
})
t
.
Run
(
"IncorrectCumulativeUsed"
,
func
(
t
*
testing
.
T
)
{
block
,
receiptHash
,
txHashes
,
receipts
:=
validData
()
receipts
[
1
]
.
CumulativeGasUsed
=
receipts
[
0
]
.
CumulativeGasUsed
err
:=
validateReceipts
(
block
,
receiptHash
,
txHashes
,
receipts
)
require
.
ErrorContains
(
t
,
err
,
"has invalid gas used metadata"
)
})
t
.
Run
(
"IncorrectLogIndex"
,
func
(
t
*
testing
.
T
)
{
block
,
receiptHash
,
txHashes
,
receipts
:=
validData
()
receipts
[
2
]
.
Logs
[
0
]
.
Index
=
4
err
:=
validateReceipts
(
block
,
receiptHash
,
txHashes
,
receipts
)
require
.
ErrorContains
(
t
,
err
,
"has unexpected log index"
)
})
t
.
Run
(
"LogIndexNotBlockBased"
,
func
(
t
*
testing
.
T
)
{
block
,
receiptHash
,
txHashes
,
receipts
:=
validData
()
receipts
[
3
]
.
Logs
[
0
]
.
Index
=
0
err
:=
validateReceipts
(
block
,
receiptHash
,
txHashes
,
receipts
)
require
.
ErrorContains
(
t
,
err
,
"has unexpected log index"
)
})
t
.
Run
(
"IncorrectLogTxIndex"
,
func
(
t
*
testing
.
T
)
{
block
,
receiptHash
,
txHashes
,
receipts
:=
validData
()
receipts
[
2
]
.
Logs
[
0
]
.
TxIndex
=
1
err
:=
validateReceipts
(
block
,
receiptHash
,
txHashes
,
receipts
)
require
.
ErrorContains
(
t
,
err
,
"has unexpected tx index"
)
})
t
.
Run
(
"IncorrectLogBlockHash"
,
func
(
t
*
testing
.
T
)
{
block
,
receiptHash
,
txHashes
,
receipts
:=
validData
()
receipts
[
2
]
.
Logs
[
0
]
.
BlockHash
=
common
.
Hash
{
0x64
}
err
:=
validateReceipts
(
block
,
receiptHash
,
txHashes
,
receipts
)
require
.
ErrorContains
(
t
,
err
,
"has unexpected block hash"
)
})
t
.
Run
(
"IncorrectLogBlockNumber"
,
func
(
t
*
testing
.
T
)
{
block
,
receiptHash
,
txHashes
,
receipts
:=
validData
()
receipts
[
2
]
.
Logs
[
0
]
.
BlockNumber
=
4727923
err
:=
validateReceipts
(
block
,
receiptHash
,
txHashes
,
receipts
)
require
.
ErrorContains
(
t
,
err
,
"has unexpected block number"
)
})
t
.
Run
(
"IncorrectLogTxHash"
,
func
(
t
*
testing
.
T
)
{
block
,
receiptHash
,
txHashes
,
receipts
:=
validData
()
receipts
[
2
]
.
Logs
[
0
]
.
TxHash
=
common
.
Hash
{
0x87
}
err
:=
validateReceipts
(
block
,
receiptHash
,
txHashes
,
receipts
)
require
.
ErrorContains
(
t
,
err
,
"has unexpected tx hash"
)
})
t
.
Run
(
"Removed"
,
func
(
t
*
testing
.
T
)
{
block
,
receiptHash
,
txHashes
,
receipts
:=
validData
()
receipts
[
2
]
.
Logs
[
0
]
.
Removed
=
true
err
:=
validateReceipts
(
block
,
receiptHash
,
txHashes
,
receipts
)
require
.
ErrorContains
(
t
,
err
,
"must never be removed due to reorg"
)
})
}
op-service/sources/types.go
View file @
37b2b0f0
...
@@ -107,7 +107,16 @@ type rpcHeader struct {
...
@@ -107,7 +107,16 @@ type rpcHeader struct {
BaseFee
*
hexutil
.
Big
`json:"baseFeePerGas"`
BaseFee
*
hexutil
.
Big
`json:"baseFeePerGas"`
// WithdrawalsRoot was added by EIP-4895 and is ignored in legacy headers.
// WithdrawalsRoot was added by EIP-4895 and is ignored in legacy headers.
WithdrawalsRoot
*
common
.
Hash
`json:"withdrawalsRoot"`
WithdrawalsRoot
*
common
.
Hash
`json:"withdrawalsRoot,omitempty"`
// BlobGasUsed was added by EIP-4844 and is ignored in legacy headers.
BlobGasUsed
*
hexutil
.
Uint64
`json:"blobGasUsed,omitempty"`
// ExcessBlobGas was added by EIP-4844 and is ignored in legacy headers.
ExcessBlobGas
*
hexutil
.
Uint64
`json:"excessBlobGas,omitempty"`
// ParentBeaconRoot was added by EIP-4788 and is ignored in legacy headers.
ParentBeaconRoot
*
common
.
Hash
`json:"parentBeaconBlockRoot,omitempty"`
// untrusted info included by RPC, may have to be checked
// untrusted info included by RPC, may have to be checked
Hash
common
.
Hash
`json:"hash"`
Hash
common
.
Hash
`json:"hash"`
...
@@ -160,6 +169,10 @@ func (hdr *rpcHeader) createGethHeader() *types.Header {
...
@@ -160,6 +169,10 @@ func (hdr *rpcHeader) createGethHeader() *types.Header {
Nonce
:
hdr
.
Nonce
,
Nonce
:
hdr
.
Nonce
,
BaseFee
:
(
*
big
.
Int
)(
hdr
.
BaseFee
),
BaseFee
:
(
*
big
.
Int
)(
hdr
.
BaseFee
),
WithdrawalsHash
:
hdr
.
WithdrawalsRoot
,
WithdrawalsHash
:
hdr
.
WithdrawalsRoot
,
// Cancun
BlobGasUsed
:
(
*
uint64
)(
hdr
.
BlobGasUsed
),
ExcessBlobGas
:
(
*
uint64
)(
hdr
.
ExcessBlobGas
),
ParentBeaconRoot
:
hdr
.
ParentBeaconRoot
,
}
}
}
}
...
@@ -189,7 +202,7 @@ func (block *rpcBlock) verify() error {
...
@@ -189,7 +202,7 @@ func (block *rpcBlock) verify() error {
}
}
for
i
,
tx
:=
range
block
.
Transactions
{
for
i
,
tx
:=
range
block
.
Transactions
{
if
tx
==
nil
{
if
tx
==
nil
{
return
fmt
.
Errorf
(
"block tx %d is n
ul
l"
,
i
)
return
fmt
.
Errorf
(
"block tx %d is n
i
l"
,
i
)
}
}
}
}
if
computed
:=
types
.
DeriveSha
(
types
.
Transactions
(
block
.
Transactions
),
trie
.
NewStackTrie
(
nil
));
block
.
TxHash
!=
computed
{
if
computed
:=
types
.
DeriveSha
(
types
.
Transactions
(
block
.
Transactions
),
trie
.
NewStackTrie
(
nil
));
block
.
TxHash
!=
computed
{
...
...
packages/contracts-bedrock/.envrc.example
deleted
100644 → 0
View file @
99e1b2a1
# RPC for the network to deploy to
export ETH_RPC_URL=
# Sets the deployer's key to match the first default hardhat account
export PRIVATE_KEY=ac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80
# Name of the deployed network
export DEPLOYMENT_CONTEXT=getting-started
# Optional Tenderly details for a simulation link during deployment
export TENDERLY_PROJECT=
export TENDERLY_USERNAME=
export ETHERSCAN_API_KEY=
# Optional create2 salt for deterministic deployment of
# contract implementations
export IMPL_SALT=$(openssl rand -hex 32)
packages/contracts-bedrock/.gas-snapshot
View file @
37b2b0f0
AdminFaucetAuthModuleTest:test_adminProof_verify_succeeds() (gas: 57
573
)
AdminFaucetAuthModuleTest:test_adminProof_verify_succeeds() (gas: 57
607
)
AdminFaucetAuthModuleTest:test_nonAdminProof_verify_succeeds() (gas: 59050)
AdminFaucetAuthModuleTest:test_nonAdminProof_verify_succeeds() (gas: 59050)
AdminFaucetAuthModuleTest:test_proofWithWrongId_verify_succeeds() (gas: 60673)
AdminFaucetAuthModuleTest:test_proofWithWrongId_verify_succeeds() (gas: 60673)
AssetReceiverTest:test_constructor_succeeds() (gas: 969
6
)
AssetReceiverTest:test_constructor_succeeds() (gas: 969
3
)
AssetReceiverTest:test_receive_succeeds() (gas: 20844)
AssetReceiverTest:test_receive_succeeds() (gas: 20844)
AssetReceiverTest:test_withdrawERC20_succeeds() (gas: 183383)
AssetReceiverTest:test_withdrawERC20_succeeds() (gas: 183383)
AssetReceiverTest:test_withdrawERC20_unauthorized_reverts() (gas: 153517)
AssetReceiverTest:test_withdrawERC20_unauthorized_reverts() (gas: 153517)
AssetReceiverTest:test_withdrawERC20withAmount_succeeds() (gas: 182567)
AssetReceiverTest:test_withdrawERC20withAmount_succeeds() (gas: 182567)
AssetReceiverTest:test_withdrawERC20withAmount_unauthorized_reverts() (gas: 1535
28
)
AssetReceiverTest:test_withdrawERC20withAmount_unauthorized_reverts() (gas: 1535
64
)
AssetReceiverTest:test_withdrawERC721_succeeds() (gas: 50755)
AssetReceiverTest:test_withdrawERC721_succeeds() (gas: 50755)
AssetReceiverTest:test_withdrawERC721_unauthorized_reverts() (gas: 51063)
AssetReceiverTest:test_withdrawERC721_unauthorized_reverts() (gas: 51063)
AssetReceiverTest:test_withdrawETH_succeeds() (gas: 28344)
AssetReceiverTest:test_withdrawETH_succeeds() (gas: 28344)
AssetReceiverTest:test_withdrawETH_unauthorized_reverts() (gas: 10680)
AssetReceiverTest:test_withdrawETH_unauthorized_reverts() (gas: 10680)
AssetReceiverTest:test_withdrawETHwithAmount_succeeds() (gas: 28241)
AssetReceiverTest:test_withdrawETHwithAmount_succeeds() (gas: 28241)
AssetReceiverTest:test_withdrawETHwithAmount_unauthorized_reverts() (gas: 10738)
AssetReceiverTest:test_withdrawETHwithAmount_unauthorized_reverts() (gas: 10738)
AttestationStationTest:test_attest_bulk_succeeds() (gas: 5443
87
)
AttestationStationTest:test_attest_bulk_succeeds() (gas: 5443
21
)
AttestationStationTest:test_attest_individual_succeeds() (gas: 472850)
AttestationStationTest:test_attest_individual_succeeds() (gas: 472850)
AttestationStationTest:test_attest_single_succeeds() (gas: 491962)
AttestationStationTest:test_attest_single_succeeds() (gas: 491962)
BlockOracle_Test:test_checkpointAndLoad_succeeds() (gas: 58396)
BlockOracle_Test:test_checkpointAndLoad_succeeds() (gas: 58396)
...
@@ -24,71 +24,71 @@ Bytes_slice_Test:test_slice_fromNonZeroIdx_works() (gas: 17240)
...
@@ -24,71 +24,71 @@ Bytes_slice_Test:test_slice_fromNonZeroIdx_works() (gas: 17240)
Bytes_slice_Test:test_slice_fromZeroIdx_works() (gas: 20804)
Bytes_slice_Test:test_slice_fromZeroIdx_works() (gas: 20804)
Bytes_toNibbles_Test:test_toNibbles_expectedResult128Bytes_works() (gas: 78882)
Bytes_toNibbles_Test:test_toNibbles_expectedResult128Bytes_works() (gas: 78882)
Bytes_toNibbles_Test:test_toNibbles_expectedResult5Bytes_works() (gas: 3992)
Bytes_toNibbles_Test:test_toNibbles_expectedResult5Bytes_works() (gas: 3992)
Bytes_toNibbles_Test:test_toNibbles_zeroLengthInput_works() (gas: 8
23
)
Bytes_toNibbles_Test:test_toNibbles_zeroLengthInput_works() (gas: 8
45
)
Constants_Test:test_eip1967Constants_succeeds() (gas: 453)
Constants_Test:test_eip1967Constants_succeeds() (gas: 453)
CrossDomainMessenger_BaseGas_Test:test_baseGas_succeeds() (gas: 20481)
CrossDomainMessenger_BaseGas_Test:test_baseGas_succeeds() (gas: 20481)
CrossDomainOwnable2_Test:test_onlyOwner_notMessenger_reverts() (gas: 8539)
CrossDomainOwnable2_Test:test_onlyOwner_notMessenger_reverts() (gas: 8539)
CrossDomainOwnable2_Test:test_onlyOwner_notOwner2_reverts() (gas: 5751
5
)
CrossDomainOwnable2_Test:test_onlyOwner_notOwner2_reverts() (gas: 5751
8
)
CrossDomainOwnable2_Test:test_onlyOwner_notOwner_reverts() (gas: 16655)
CrossDomainOwnable2_Test:test_onlyOwner_notOwner_reverts() (gas: 16655)
CrossDomainOwnable2_Test:test_onlyOwner_succeeds() (gas: 736
00
)
CrossDomainOwnable2_Test:test_onlyOwner_succeeds() (gas: 736
19
)
CrossDomainOwnable3_Test:test_constructor_succeeds() (gas: 106
05
)
CrossDomainOwnable3_Test:test_constructor_succeeds() (gas: 106
27
)
CrossDomainOwnable3_Test:test_crossDomainOnlyOwner_notMessenger_reverts() (gas: 28363)
CrossDomainOwnable3_Test:test_crossDomainOnlyOwner_notMessenger_reverts() (gas: 28363)
CrossDomainOwnable3_Test:test_crossDomainOnlyOwner_notOwner2_reverts() (gas: 740
40
)
CrossDomainOwnable3_Test:test_crossDomainOnlyOwner_notOwner2_reverts() (gas: 740
02
)
CrossDomainOwnable3_Test:test_crossDomainOnlyOwner_notOwner_reverts() (gas: 32
096
)
CrossDomainOwnable3_Test:test_crossDomainOnlyOwner_notOwner_reverts() (gas: 32
118
)
CrossDomainOwnable3_Test:test_crossDomainTransferOwnership_succeeds() (gas: 91
581
)
CrossDomainOwnable3_Test:test_crossDomainTransferOwnership_succeeds() (gas: 91
600
)
CrossDomainOwnable3_Test:test_localOnlyOwner_notOwner_reverts() (gas: 13260)
CrossDomainOwnable3_Test:test_localOnlyOwner_notOwner_reverts() (gas: 13260)
CrossDomainOwnable3_Test:test_localOnlyOwner_succeeds() (gas: 35271)
CrossDomainOwnable3_Test:test_localOnlyOwner_succeeds() (gas: 35271)
CrossDomainOwnable3_Test:test_localTransferOwnership_succeeds() (gas: 521
64
)
CrossDomainOwnable3_Test:test_localTransferOwnership_succeeds() (gas: 521
58
)
CrossDomainOwnable3_Test:test_transferOwnershipNoLocal_succeeds() (gas: 48
71
2)
CrossDomainOwnable3_Test:test_transferOwnershipNoLocal_succeeds() (gas: 48
66
2)
CrossDomainOwnable3_Test:test_transferOwnership_noLocalZeroAddress_reverts() (gas: 12090)
CrossDomainOwnable3_Test:test_transferOwnership_noLocalZeroAddress_reverts() (gas: 12090)
CrossDomainOwnable3_Test:test_transferOwnership_notOwner_reverts() (gas: 13460)
CrossDomainOwnable3_Test:test_transferOwnership_notOwner_reverts() (gas: 13460)
CrossDomainOwnable3_Test:test_transferOwnership_zeroAddress_reverts() (gas: 121
55
)
CrossDomainOwnable3_Test:test_transferOwnership_zeroAddress_reverts() (gas: 121
77
)
CrossDomainOwnableThroughPortal_Test:test_depositTransaction_crossDomainOwner_succeeds() (gas: 815
56
)
CrossDomainOwnableThroughPortal_Test:test_depositTransaction_crossDomainOwner_succeeds() (gas: 815
74
)
CrossDomainOwnable_Test:test_onlyOwner_notOwner_reverts() (gas: 10597)
CrossDomainOwnable_Test:test_onlyOwner_notOwner_reverts() (gas: 10597)
CrossDomainOwnable_Test:test_onlyOwner_succeeds() (gas: 34
883
)
CrossDomainOwnable_Test:test_onlyOwner_succeeds() (gas: 34
905
)
DelayedVetoable_Getters_Test:test_getters() (gas: 24620)
DelayedVetoable_Getters_Test:test_getters() (gas: 24620)
DelayedVetoable_Getters_TestFail:test_getters_notZeroAddress_reverts() (gas: 36289)
DelayedVetoable_Getters_TestFail:test_getters_notZeroAddress_reverts() (gas: 36289)
DelayedVetoable_HandleCall_TestFail:test_handleCall_unauthorizedInitiation_reverts() (gas: 15165)
DelayedVetoable_HandleCall_TestFail:test_handleCall_unauthorizedInitiation_reverts() (gas: 15165)
DeployerWhitelist_Test:test_owner_succeeds() (gas: 7582)
DeployerWhitelist_Test:test_owner_succeeds() (gas: 7582)
DeployerWhitelist_Test:test_storageSlots_succeeds() (gas: 33
395
)
DeployerWhitelist_Test:test_storageSlots_succeeds() (gas: 33
417
)
DisputeGameFactory_Owner_Test:test_owner_succeeds() (gas: 12611)
DisputeGameFactory_Owner_Test:test_owner_succeeds() (gas: 12611)
DisputeGameFactory_SetImplementation_Test:test_setImplementation_notOwner_reverts() (gas: 16
143
)
DisputeGameFactory_SetImplementation_Test:test_setImplementation_notOwner_reverts() (gas: 16
078
)
DisputeGameFactory_SetImplementation_Test:test_setImplementation_succeeds() (gas: 443
46
)
DisputeGameFactory_SetImplementation_Test:test_setImplementation_succeeds() (gas: 443
23
)
DisputeGameFactory_TransferOwnership_Test:test_transferOwnership_notOwner_reverts() (gas: 15974)
DisputeGameFactory_TransferOwnership_Test:test_transferOwnership_notOwner_reverts() (gas: 15974)
DisputeGameFactory_TransferOwnership_Test:test_transferOwnership_succeeds() (gas: 18738)
DisputeGameFactory_TransferOwnership_Test:test_transferOwnership_succeeds() (gas: 18738)
Drippie_Test:test_create_calledTwice_reverts() (gas: 168
953
)
Drippie_Test:test_create_calledTwice_reverts() (gas: 168
887
)
Drippie_Test:test_create_succeeds() (gas: 183401)
Drippie_Test:test_create_succeeds() (gas: 183401)
Drippie_Test:test_drip_amount_succeeds() (gas: 2853
53
)
Drippie_Test:test_drip_amount_succeeds() (gas: 2853
75
)
Drippie_Test:test_drip_notExist_reverts() (gas: 14920)
Drippie_Test:test_drip_notExist_reverts() (gas: 14920)
Drippie_Test:test_drip_reentrant_reverts() (gas: 18875)
Drippie_Test:test_drip_reentrant_reverts() (gas: 18875)
Drippie_Test:test_name_notExist_reverts() (gas: 16056)
Drippie_Test:test_name_notExist_reverts() (gas: 16056)
Drippie_Test:test_notReentrant_zeroInterval_reverts() (gas: 188
67
)
Drippie_Test:test_notReentrant_zeroInterval_reverts() (gas: 188
89
)
Drippie_Test:test_not_active_reverts() (gas: 1711
62
)
Drippie_Test:test_not_active_reverts() (gas: 1711
84
)
Drippie_Test:test_reentrant_succeeds() (gas: 1801
58
)
Drippie_Test:test_reentrant_succeeds() (gas: 1801
80
)
Drippie_Test:test_set_statusNone_reverts() (gas: 168
809
)
Drippie_Test:test_set_statusNone_reverts() (gas: 168
743
)
Drippie_Test:test_set_statusSame_reverts() (gas: 169
195
)
Drippie_Test:test_set_statusSame_reverts() (gas: 169
240
)
Drippie_Test:test_set_status_succeeds() (gas: 198
603
)
Drippie_Test:test_set_status_succeeds() (gas: 198
536
)
Drippie_Test:test_shouldArchive_ifPaused_succeeds() (gas: 177348)
Drippie_Test:test_shouldArchive_ifPaused_succeeds() (gas: 177348)
Drippie_Test:test_shouldNotAllowActive_ifArchived_reverts() (gas: 1746
69
)
Drippie_Test:test_shouldNotAllowActive_ifArchived_reverts() (gas: 1746
91
)
Drippie_Test:test_shouldNotAllowPaused_ifArchived_reverts() (gas: 174
692
)
Drippie_Test:test_shouldNotAllowPaused_ifArchived_reverts() (gas: 174
714
)
Drippie_Test:test_shouldNotArchive_ifActive_reverts() (gas: 1757
32
)
Drippie_Test:test_shouldNotArchive_ifActive_reverts() (gas: 1757
54
)
Drippie_Test:test_status_unauthorized_reverts() (gas: 167
388
)
Drippie_Test:test_status_unauthorized_reverts() (gas: 167
410
)
Drippie_Test:test_trigger_oneFunction_succeeds() (gas: 3382
26
)
Drippie_Test:test_trigger_oneFunction_succeeds() (gas: 3382
48
)
Drippie_Test:test_trigger_twoFunctions_succeeds() (gas: 4919
07
)
Drippie_Test:test_trigger_twoFunctions_succeeds() (gas: 4919
29
)
Drippie_Test:test_twice_inOneInterval_reverts() (gas: 303
933
)
Drippie_Test:test_twice_inOneInterval_reverts() (gas: 303
889
)
FaucetTest:test_authAdmin_drip_succeeds() (gas: 366
107
)
FaucetTest:test_authAdmin_drip_succeeds() (gas: 366
064
)
FaucetTest:test_drip_afterTimeout_succeeds() (gas: 447
891
)
FaucetTest:test_drip_afterTimeout_succeeds() (gas: 447
913
)
FaucetTest:test_drip_beforeTimeout_reverts() (gas: 378
884
)
FaucetTest:test_drip_beforeTimeout_reverts() (gas: 378
906
)
FaucetTest:test_drip_disabledModule_reverts() (gas: 3524
01
)
FaucetTest:test_drip_disabledModule_reverts() (gas: 3524
23
)
FaucetTest:test_drip_emitsEvent_succeeds() (gas: 3691
61
)
FaucetTest:test_drip_emitsEvent_succeeds() (gas: 3691
16
)
FaucetTest:test_drip_githubSendsCorrectAmount_succeeds() (gas: 366
607
)
FaucetTest:test_drip_githubSendsCorrectAmount_succeeds() (gas: 366
562
)
FaucetTest:test_drip_optimistNftSendsCorrectAmount_succeeds() (gas: 3665
51
)
FaucetTest:test_drip_optimistNftSendsCorrectAmount_succeeds() (gas: 3665
73
)
FaucetTest:test_drip_preventsReplayAttacks_succeeds() (gas: 3692
14
)
FaucetTest:test_drip_preventsReplayAttacks_succeeds() (gas: 3692
36
)
FaucetTest:test_initialize_succeeds() (gas: 76
26
)
FaucetTest:test_initialize_succeeds() (gas: 76
48
)
FaucetTest:test_nonAdmin_drip_fails() (gas: 262520)
FaucetTest:test_nonAdmin_drip_fails() (gas: 262520)
FaucetTest:test_receive_succeeds() (gas: 174
01
)
FaucetTest:test_receive_succeeds() (gas: 174
23
)
FaucetTest:test_withdraw_nonAdmin_reverts() (gas: 131
45
)
FaucetTest:test_withdraw_nonAdmin_reverts() (gas: 131
67
)
FaucetTest:test_withdraw_succeeds() (gas: 783
59
)
FaucetTest:test_withdraw_succeeds() (gas: 783
81
)
FaultDisputeGame_ResolvesCorrectly_CorrectRoot1:test_resolvesCorrectly_succeeds() (gas: 660030)
FaultDisputeGame_ResolvesCorrectly_CorrectRoot1:test_resolvesCorrectly_succeeds() (gas: 660030)
FaultDisputeGame_ResolvesCorrectly_CorrectRoot2:test_resolvesCorrectly_succeeds() (gas: 666890)
FaultDisputeGame_ResolvesCorrectly_CorrectRoot2:test_resolvesCorrectly_succeeds() (gas: 666890)
FaultDisputeGame_ResolvesCorrectly_CorrectRoot3:test_resolvesCorrectly_succeeds() (gas: 663593)
FaultDisputeGame_ResolvesCorrectly_CorrectRoot3:test_resolvesCorrectly_succeeds() (gas: 663593)
...
@@ -99,125 +99,125 @@ FaultDisputeGame_ResolvesCorrectly_IncorrectRoot2:test_resolvesCorrectly_succeed
...
@@ -99,125 +99,125 @@ FaultDisputeGame_ResolvesCorrectly_IncorrectRoot2:test_resolvesCorrectly_succeed
FaultDisputeGame_ResolvesCorrectly_IncorrectRoot3:test_resolvesCorrectly_succeeds() (gas: 655638)
FaultDisputeGame_ResolvesCorrectly_IncorrectRoot3:test_resolvesCorrectly_succeeds() (gas: 655638)
FaultDisputeGame_ResolvesCorrectly_IncorrectRoot4:test_resolvesCorrectly_succeeds() (gas: 656576)
FaultDisputeGame_ResolvesCorrectly_IncorrectRoot4:test_resolvesCorrectly_succeeds() (gas: 656576)
FaultDisputeGame_ResolvesCorrectly_IncorrectRoot5:test_resolvesCorrectly_succeeds() (gas: 656027)
FaultDisputeGame_ResolvesCorrectly_IncorrectRoot5:test_resolvesCorrectly_succeeds() (gas: 656027)
FaultDisputeGame_Test:test_addLocalData_static_succeeds() (gas: 642
441
)
FaultDisputeGame_Test:test_addLocalData_static_succeeds() (gas: 642
366
)
FaultDisputeGame_Test:test_createdAt_succeeds() (gas: 104
76
)
FaultDisputeGame_Test:test_createdAt_succeeds() (gas: 104
61
)
FaultDisputeGame_Test:test_extraData_succeeds() (gas: 324
22
)
FaultDisputeGame_Test:test_extraData_succeeds() (gas: 324
07
)
FaultDisputeGame_Test:test_gameData_succeeds() (gas: 32857)
FaultDisputeGame_Test:test_gameData_succeeds() (gas: 32857)
FaultDisputeGame_Test:test_gameType_succeeds() (gas: 8
302
)
FaultDisputeGame_Test:test_gameType_succeeds() (gas: 8
287
)
FaultDisputeGame_Test:test_initialize_correctData_succeeds() (gas: 577
79
)
FaultDisputeGame_Test:test_initialize_correctData_succeeds() (gas: 577
61
)
FaultDisputeGame_Test:test_initialize_firstOutput_reverts() (gas: 213868)
FaultDisputeGame_Test:test_initialize_firstOutput_reverts() (gas: 213868)
FaultDisputeGame_Test:test_initialize_l1HeadTooOld_reverts() (gas: 22848
8
)
FaultDisputeGame_Test:test_initialize_l1HeadTooOld_reverts() (gas: 22848
2
)
FaultDisputeGame_Test:test_move_clockCorrectness_succeeds() (gas: 5942
94
)
FaultDisputeGame_Test:test_move_clockCorrectness_succeeds() (gas: 5942
23
)
FaultDisputeGame_Test:test_move_clockTimeExceeded_reverts() (gas: 23
200
)
FaultDisputeGame_Test:test_move_clockTimeExceeded_reverts() (gas: 23
197
)
FaultDisputeGame_Test:test_move_defendRoot_reverts() (gas: 1332
5
)
FaultDisputeGame_Test:test_move_defendRoot_reverts() (gas: 1332
2
)
FaultDisputeGame_Test:test_move_duplicateClaim_reverts() (gas: 14739
6
)
FaultDisputeGame_Test:test_move_duplicateClaim_reverts() (gas: 14739
0
)
FaultDisputeGame_Test:test_move_duplicateClaimsDifferentSubgames_succeeds() (gas: 5568
44
)
FaultDisputeGame_Test:test_move_duplicateClaimsDifferentSubgames_succeeds() (gas: 5568
32
)
FaultDisputeGame_Test:test_move_gameDepthExceeded_reverts() (gas: 5858
84
)
FaultDisputeGame_Test:test_move_gameDepthExceeded_reverts() (gas: 5858
75
)
FaultDisputeGame_Test:test_move_gameNotInProgress_reverts() (gas: 1101
9
)
FaultDisputeGame_Test:test_move_gameNotInProgress_reverts() (gas: 1101
0
)
FaultDisputeGame_Test:test_move_nonExistentParent_reverts() (gas: 246
74
)
FaultDisputeGame_Test:test_move_nonExistentParent_reverts() (gas: 246
68
)
FaultDisputeGame_Test:test_move_simpleAttack_succeeds() (gas: 1520
17
)
FaultDisputeGame_Test:test_move_simpleAttack_succeeds() (gas: 1520
08
)
FaultDisputeGame_Test:test_resolve_challengeContested_succeeds() (gas: 2694
8
3)
FaultDisputeGame_Test:test_resolve_challengeContested_succeeds() (gas: 2694
7
3)
FaultDisputeGame_Test:test_resolve_claimAlreadyResolved_reverts() (gas: 2723
68
)
FaultDisputeGame_Test:test_resolve_claimAlreadyResolved_reverts() (gas: 2723
56
)
FaultDisputeGame_Test:test_resolve_claimAtMaxDepthAlreadyResolved_reverts() (gas: 5866
21
)
FaultDisputeGame_Test:test_resolve_claimAtMaxDepthAlreadyResolved_reverts() (gas: 5866
06
)
FaultDisputeGame_Test:test_resolve_notInProgress_reverts() (gas: 97
85
)
FaultDisputeGame_Test:test_resolve_notInProgress_reverts() (gas: 97
76
)
FaultDisputeGame_Test:test_resolve_outOfOrderResolution_reverts() (gas: 3090
02
)
FaultDisputeGame_Test:test_resolve_outOfOrderResolution_reverts() (gas: 3090
15
)
FaultDisputeGame_Test:test_resolve_rootContested_succeeds() (gas: 1391
25
)
FaultDisputeGame_Test:test_resolve_rootContested_succeeds() (gas: 1391
19
)
FaultDisputeGame_Test:test_resolve_rootUncontestedButUnresolved_reverts() (gas: 159
23
)
FaultDisputeGame_Test:test_resolve_rootUncontestedButUnresolved_reverts() (gas: 159
35
)
FaultDisputeGame_Test:test_resolve_rootUncontestedClockNotExpired_succeeds() (gas: 184
31
)
FaultDisputeGame_Test:test_resolve_rootUncontestedClockNotExpired_succeeds() (gas: 184
28
)
FaultDisputeGame_Test:test_resolve_rootUncontested_succeeds() (gas: 5148
7
)
FaultDisputeGame_Test:test_resolve_rootUncontested_succeeds() (gas: 5148
4
)
FaultDisputeGame_Test:test_resolve_stepReached_succeeds() (gas: 4984
67
)
FaultDisputeGame_Test:test_resolve_stepReached_succeeds() (gas: 4984
48
)
FaultDisputeGame_Test:test_resolve_teamDeathmatch_succeeds() (gas: 44339
6
)
FaultDisputeGame_Test:test_resolve_teamDeathmatch_succeeds() (gas: 44339
9
)
FaultDisputeGame_Test:test_rootClaim_succeeds() (gas: 82
47
)
FaultDisputeGame_Test:test_rootClaim_succeeds() (gas: 82
32
)
FeeVault_Test:test_constructor_baseFeeVault_succeeds() (gas: 174
28
)
FeeVault_Test:test_constructor_baseFeeVault_succeeds() (gas: 174
50
)
FeeVault_Test:test_constructor_l1FeeVault_succeeds() (gas: 17
396
)
FeeVault_Test:test_constructor_l1FeeVault_succeeds() (gas: 17
418
)
GasBenchMark_L1CrossDomainMessenger:test_sendMessage_benchmark_0() (gas: 354
511
)
GasBenchMark_L1CrossDomainMessenger:test_sendMessage_benchmark_0() (gas: 354
446
)
GasBenchMark_L1CrossDomainMessenger:test_sendMessage_benchmark_1() (gas: 29526
74
)
GasBenchMark_L1CrossDomainMessenger:test_sendMessage_benchmark_1() (gas: 29526
96
)
GasBenchMark_L1StandardBridge_Deposit:test_depositERC20_benchmark_0() (gas: 5449
27
)
GasBenchMark_L1StandardBridge_Deposit:test_depositERC20_benchmark_0() (gas: 5449
52
)
GasBenchMark_L1StandardBridge_Deposit:test_depositERC20_benchmark_1() (gas: 40571
19
)
GasBenchMark_L1StandardBridge_Deposit:test_depositERC20_benchmark_1() (gas: 40571
22
)
GasBenchMark_L1StandardBridge_Deposit:test_depositETH_benchmark_0() (gas: 4461
61
)
GasBenchMark_L1StandardBridge_Deposit:test_depositETH_benchmark_0() (gas: 4461
83
)
GasBenchMark_L1StandardBridge_Deposit:test_depositETH_benchmark_1() (gas: 3491910)
GasBenchMark_L1StandardBridge_Deposit:test_depositETH_benchmark_1() (gas: 3491910)
GasBenchMark_L1StandardBridge_Finalize:test_finalizeETHWithdrawal_benchmark() (gas: 45337)
GasBenchMark_L1StandardBridge_Finalize:test_finalizeETHWithdrawal_benchmark() (gas: 45337)
GasBenchMark_L2OutputOracle:test_proposeL2Output_benchmark() (gas: 88797)
GasBenchMark_L2OutputOracle:test_proposeL2Output_benchmark() (gas: 88797)
GasBenchMark_OptimismPortal:test_depositTransaction_benchmark() (gas: 683
20
)
GasBenchMark_OptimismPortal:test_depositTransaction_benchmark() (gas: 683
17
)
GasBenchMark_OptimismPortal:test_depositTransaction_benchmark_1() (gas: 6897
3
)
GasBenchMark_OptimismPortal:test_depositTransaction_benchmark_1() (gas: 6897
0
)
GasBenchMark_OptimismPortal:test_proveWithdrawalTransaction_benchmark() (gas: 143303)
GasBenchMark_OptimismPortal:test_proveWithdrawalTransaction_benchmark() (gas: 143303)
GasPriceOracle_Test:test_baseFee_succeeds() (gas: 8348)
GasPriceOracle_Test:test_baseFee_succeeds() (gas: 8348)
GasPriceOracle_Test:test_decimals_succeeds() (gas: 6234)
GasPriceOracle_Test:test_decimals_succeeds() (gas: 6234)
GasPriceOracle_Test:test_gasPrice_succeeds() (gas: 8340)
GasPriceOracle_Test:test_gasPrice_succeeds() (gas: 8340)
GasPriceOracle_Test:test_l1BaseFee_succeeds() (gas: 10
724
)
GasPriceOracle_Test:test_l1BaseFee_succeeds() (gas: 10
680
)
GasPriceOracle_Test:test_overhead_succeeds() (gas: 106
81
)
GasPriceOracle_Test:test_overhead_succeeds() (gas: 106
37
)
GasPriceOracle_Test:test_scalar_succeeds() (gas: 10
678
)
GasPriceOracle_Test:test_scalar_succeeds() (gas: 10
700
)
GasPriceOracle_Test:test_setGasPrice_doesNotExist_reverts() (gas: 59
34
)
GasPriceOracle_Test:test_setGasPrice_doesNotExist_reverts() (gas: 59
56
)
GasPriceOracle_Test:test_setL1BaseFee_doesNotExist_reverts() (gas: 59
54
)
GasPriceOracle_Test:test_setL1BaseFee_doesNotExist_reverts() (gas: 59
76
)
GovernanceToken_Test:test_approve_succeeds() (gas: 1380
01
)
GovernanceToken_Test:test_approve_succeeds() (gas: 1380
23
)
GovernanceToken_Test:test_burnFrom_succeeds() (gas: 1275
60
)
GovernanceToken_Test:test_burnFrom_succeeds() (gas: 1275
82
)
GovernanceToken_Test:test_burn_succeeds() (gas: 119092)
GovernanceToken_Test:test_burn_succeeds() (gas: 119092)
GovernanceToken_Test:test_constructor_succeeds() (gas: 23
757
)
GovernanceToken_Test:test_constructor_succeeds() (gas: 23
693
)
GovernanceToken_Test:test_decreaseAllowance_succeeds() (gas: 141912)
GovernanceToken_Test:test_decreaseAllowance_succeeds() (gas: 141912)
GovernanceToken_Test:test_increaseAllowance_succeeds() (gas: 1420
66
)
GovernanceToken_Test:test_increaseAllowance_succeeds() (gas: 1420
22
)
GovernanceToken_Test:test_mint_fromNotOwner_reverts() (gas: 21
421
)
GovernanceToken_Test:test_mint_fromNotOwner_reverts() (gas: 21
378
)
GovernanceToken_Test:test_mint_fromOwner_succeeds() (gas: 110
895
)
GovernanceToken_Test:test_mint_fromOwner_succeeds() (gas: 110
940
)
GovernanceToken_Test:test_transferFrom_succeeds() (gas: 1513
18
)
GovernanceToken_Test:test_transferFrom_succeeds() (gas: 1513
40
)
GovernanceToken_Test:test_transfer_succeeds() (gas: 1428
45
)
GovernanceToken_Test:test_transfer_succeeds() (gas: 1428
67
)
Hashing_hashDepositSource_Test:test_hashDepositSource_succeeds() (gas: 700)
Hashing_hashDepositSource_Test:test_hashDepositSource_succeeds() (gas: 700)
Initializer_Test:test_cannotReinitializeL1_succeeds() (gas: 1010
30
)
Initializer_Test:test_cannotReinitializeL1_succeeds() (gas: 1010
24
)
L1BlockNumberTest:test_fallback_succeeds() (gas: 186
55
)
L1BlockNumberTest:test_fallback_succeeds() (gas: 186
77
)
L1BlockNumberTest:test_getL1BlockNumber_succeeds() (gas: 106
25
)
L1BlockNumberTest:test_getL1BlockNumber_succeeds() (gas: 106
47
)
L1BlockNumberTest:test_receive_succeeds() (gas: 25384)
L1BlockNumberTest:test_receive_succeeds() (gas: 25384)
L1BlockTest:test_basefee_succeeds() (gas: 75
99
)
L1BlockTest:test_basefee_succeeds() (gas: 75
76
)
L1BlockTest:test_hash_succeeds() (gas: 7
738
)
L1BlockTest:test_hash_succeeds() (gas: 7
694
)
L1BlockTest:test_number_succeeds() (gas: 7674)
L1BlockTest:test_number_succeeds() (gas: 7674)
L1BlockTest:test_sequenceNumber_succeeds() (gas: 7676)
L1BlockTest:test_sequenceNumber_succeeds() (gas: 7676)
L1BlockTest:test_timestamp_succeeds() (gas: 7663)
L1BlockTest:test_timestamp_succeeds() (gas: 7663)
L1BlockTest:test_updateValues_succeeds() (gas: 63327)
L1BlockTest:test_updateValues_succeeds() (gas: 63327)
L1CrossDomainMessenger_Test:test_messageVersion_succeeds() (gas: 24803)
L1CrossDomainMessenger_Test:test_messageVersion_succeeds() (gas: 24803)
L1CrossDomainMessenger_Test:test_relayMessage_legacyOldReplay_reverts() (gas: 49407)
L1CrossDomainMessenger_Test:test_relayMessage_legacyOldReplay_reverts() (gas: 49407)
L1CrossDomainMessenger_Test:test_relayMessage_legacyRetryAfterFailureThenSuccess_reverts() (gas: 2397
50
)
L1CrossDomainMessenger_Test:test_relayMessage_legacyRetryAfterFailureThenSuccess_reverts() (gas: 2397
47
)
L1CrossDomainMessenger_Test:test_relayMessage_legacyRetryAfterFailure_succeeds() (gas: 2334
42
)
L1CrossDomainMessenger_Test:test_relayMessage_legacyRetryAfterFailure_succeeds() (gas: 2334
39
)
L1CrossDomainMessenger_Test:test_relayMessage_legacyRetryAfterSuccess_reverts() (gas: 12634
7
)
L1CrossDomainMessenger_Test:test_relayMessage_legacyRetryAfterSuccess_reverts() (gas: 12634
4
)
L1CrossDomainMessenger_Test:test_relayMessage_legacy_succeeds() (gas: 796
44
)
L1CrossDomainMessenger_Test:test_relayMessage_legacy_succeeds() (gas: 796
00
)
L1CrossDomainMessenger_Test:test_relayMessage_retryAfterFailure_succeeds() (gas: 227
503
)
L1CrossDomainMessenger_Test:test_relayMessage_retryAfterFailure_succeeds() (gas: 227
457
)
L1CrossDomainMessenger_Test:test_relayMessage_succeeds() (gas: 76636)
L1CrossDomainMessenger_Test:test_relayMessage_succeeds() (gas: 76636)
L1CrossDomainMessenger_Test:test_relayMessage_toSystemContract_reverts() (gas: 608
2
2)
L1CrossDomainMessenger_Test:test_relayMessage_toSystemContract_reverts() (gas: 608
0
2)
L1CrossDomainMessenger_Test:test_relayMessage_v2_reverts() (gas: 12
388
)
L1CrossDomainMessenger_Test:test_relayMessage_v2_reverts() (gas: 12
410
)
L1CrossDomainMessenger_Test:test_replayMessage_withValue_reverts() (gas: 331
78
)
L1CrossDomainMessenger_Test:test_replayMessage_withValue_reverts() (gas: 331
34
)
L1CrossDomainMessenger_Test:test_sendMessage_succeeds() (gas: 392934)
L1CrossDomainMessenger_Test:test_sendMessage_succeeds() (gas: 392934)
L1CrossDomainMessenger_Test:test_sendMessage_twice_succeeds() (gas: 16692
7
0)
L1CrossDomainMessenger_Test:test_sendMessage_twice_succeeds() (gas: 16692
4
0)
L1CrossDomainMessenger_Test:test_xDomainMessageSender_reset_succeeds() (gas: 87957)
L1CrossDomainMessenger_Test:test_xDomainMessageSender_reset_succeeds() (gas: 87957)
L1CrossDomainMessenger_Test:test_xDomainSender_notSet_reverts() (gas: 24282)
L1CrossDomainMessenger_Test:test_xDomainSender_notSet_reverts() (gas: 24282)
L1ERC721Bridge_Test:test_bridgeERC721To_localTokenZeroAddress_reverts() (gas: 627
59
)
L1ERC721Bridge_Test:test_bridgeERC721To_localTokenZeroAddress_reverts() (gas: 627
44
)
L1ERC721Bridge_Test:test_bridgeERC721To_remoteTokenZeroAddress_reverts() (gas: 373
76
)
L1ERC721Bridge_Test:test_bridgeERC721To_remoteTokenZeroAddress_reverts() (gas: 373
18
)
L1ERC721Bridge_Test:test_bridgeERC721To_succeeds() (gas: 4552
70
)
L1ERC721Bridge_Test:test_bridgeERC721To_succeeds() (gas: 4552
55
)
L1ERC721Bridge_Test:test_bridgeERC721To_wrongOwner_reverts() (gas: 7100
0
)
L1ERC721Bridge_Test:test_bridgeERC721To_wrongOwner_reverts() (gas: 7100
7
)
L1ERC721Bridge_Test:test_bridgeERC721_fromContract_reverts() (gas: 357
52
)
L1ERC721Bridge_Test:test_bridgeERC721_fromContract_reverts() (gas: 357
37
)
L1ERC721Bridge_Test:test_bridgeERC721_localTokenZeroAddress_reverts() (gas: 605
89
)
L1ERC721Bridge_Test:test_bridgeERC721_localTokenZeroAddress_reverts() (gas: 605
96
)
L1ERC721Bridge_Test:test_bridgeERC721_remoteTokenZeroAddress_reverts() (gas: 351
88
)
L1ERC721Bridge_Test:test_bridgeERC721_remoteTokenZeroAddress_reverts() (gas: 351
73
)
L1ERC721Bridge_Test:test_bridgeERC721_succeeds() (gas: 45
5010
)
L1ERC721Bridge_Test:test_bridgeERC721_succeeds() (gas: 45
4995
)
L1ERC721Bridge_Test:test_bridgeERC721_wrongOwner_reverts() (gas: 708
70
)
L1ERC721Bridge_Test:test_bridgeERC721_wrongOwner_reverts() (gas: 708
55
)
L1ERC721Bridge_Test:test_constructor_succeeds() (gas: 18
927
)
L1ERC721Bridge_Test:test_constructor_succeeds() (gas: 18
883
)
L1ERC721Bridge_Test:test_finalizeBridgeERC721_notEscrowed_reverts() (gas: 29495)
L1ERC721Bridge_Test:test_finalizeBridgeERC721_notEscrowed_reverts() (gas: 29495)
L1ERC721Bridge_Test:test_finalizeBridgeERC721_notFromRemoteMessenger_reverts() (gas: 272
39
)
L1ERC721Bridge_Test:test_finalizeBridgeERC721_notFromRemoteMessenger_reverts() (gas: 272
61
)
L1ERC721Bridge_Test:test_finalizeBridgeERC721_notViaLocalMessenger_reverts() (gas: 23305)
L1ERC721Bridge_Test:test_finalizeBridgeERC721_notViaLocalMessenger_reverts() (gas: 23305)
L1ERC721Bridge_Test:test_finalizeBridgeERC721_selfToken_reverts() (gas: 25035)
L1ERC721Bridge_Test:test_finalizeBridgeERC721_selfToken_reverts() (gas: 25035)
L1ERC721Bridge_Test:test_finalizeBridgeERC721_succeeds() (gas: 425
309
)
L1ERC721Bridge_Test:test_finalizeBridgeERC721_succeeds() (gas: 425
294
)
L1StandardBridge_BridgeETHTo_Test:test_bridgeETHTo_succeeds() (gas: 51721
4
)
L1StandardBridge_BridgeETHTo_Test:test_bridgeETHTo_succeeds() (gas: 51721
1
)
L1StandardBridge_BridgeETH_Test:test_bridgeETH_succeeds() (gas: 5044
58
)
L1StandardBridge_BridgeETH_Test:test_bridgeETH_succeeds() (gas: 5044
43
)
L1StandardBridge_DepositERC20To_Test:test_depositERC20To_succeeds() (gas: 72345
0
)
L1StandardBridge_DepositERC20To_Test:test_depositERC20To_succeeds() (gas: 72345
6
)
L1StandardBridge_DepositERC20_Test:test_depositERC20_succeeds() (gas: 72
0986
)
L1StandardBridge_DepositERC20_Test:test_depositERC20_succeeds() (gas: 72
1010
)
L1StandardBridge_DepositERC20_TestFail:test_depositERC20_notEoa_reverts() (gas: 24955)
L1StandardBridge_DepositERC20_TestFail:test_depositERC20_notEoa_reverts() (gas: 24955)
L1StandardBridge_DepositETHTo_Test:test_depositETHTo_succeeds() (gas: 5173
11
)
L1StandardBridge_DepositETHTo_Test:test_depositETHTo_succeeds() (gas: 5173
08
)
L1StandardBridge_DepositETH_Test:test_depositETH_succeeds() (gas: 5045
97
)
L1StandardBridge_DepositETH_Test:test_depositETH_succeeds() (gas: 5045
82
)
L1StandardBridge_DepositETH_TestFail:test_depositETH_notEoa_reverts() (gas: 43427)
L1StandardBridge_DepositETH_TestFail:test_depositETH_notEoa_reverts() (gas: 43427)
L1StandardBridge_FinalizeBridgeETH_Test:test_finalizeBridgeETH_succeeds() (gas: 57849)
L1StandardBridge_FinalizeBridgeETH_Test:test_finalizeBridgeETH_succeeds() (gas: 57849)
L1StandardBridge_FinalizeBridgeETH_TestFail:test_finalizeBridgeETH_incorrectValue_reverts() (gas: 40320)
L1StandardBridge_FinalizeBridgeETH_TestFail:test_finalizeBridgeETH_incorrectValue_reverts() (gas: 40320)
L1StandardBridge_FinalizeBridgeETH_TestFail:test_finalizeBridgeETH_sendToMessenger_reverts() (gas: 40461)
L1StandardBridge_FinalizeBridgeETH_TestFail:test_finalizeBridgeETH_sendToMessenger_reverts() (gas: 40461)
L1StandardBridge_FinalizeBridgeETH_TestFail:test_finalizeBridgeETH_sendToSelf_reverts() (gas: 40347)
L1StandardBridge_FinalizeBridgeETH_TestFail:test_finalizeBridgeETH_sendToSelf_reverts() (gas: 40347)
L1StandardBridge_FinalizeERC20Withdrawal_Test:test_finalizeERC20Withdrawal_succeeds() (gas:
503457
)
L1StandardBridge_FinalizeERC20Withdrawal_Test:test_finalizeERC20Withdrawal_succeeds() (gas:
478308
)
L1StandardBridge_FinalizeERC20Withdrawal_TestFail:test_finalizeERC20Withdrawal_notMessenger_reverts() (gas: 3718
2
)
L1StandardBridge_FinalizeERC20Withdrawal_TestFail:test_finalizeERC20Withdrawal_notMessenger_reverts() (gas: 3718
8
)
L1StandardBridge_FinalizeERC20Withdrawal_TestFail:test_finalizeERC20Withdrawal_notOtherBridge_reverts() (gas: 378
49
)
L1StandardBridge_FinalizeERC20Withdrawal_TestFail:test_finalizeERC20Withdrawal_notOtherBridge_reverts() (gas: 378
77
)
L1StandardBridge_FinalizeETHWithdrawal_Test:test_finalizeETHWithdrawal_succeeds() (gas: 70062)
L1StandardBridge_FinalizeETHWithdrawal_Test:test_finalizeETHWithdrawal_succeeds() (gas: 70062)
L1StandardBridge_Getter_Test:test_getters_succeeds() (gas: 32693)
L1StandardBridge_Getter_Test:test_getters_succeeds() (gas: 32693)
L1StandardBridge_Initialize_Test:test_initialize_succeeds() (gas: 30
416
)
L1StandardBridge_Initialize_Test:test_initialize_succeeds() (gas: 30
372
)
L1StandardBridge_Receive_Test:test_receive_succeeds() (gas: 617691)
L1StandardBridge_Receive_Test:test_receive_succeeds() (gas: 617691)
L2CrossDomainMessenger_Test:test_messageVersion_succeeds() (gas: 8521)
L2CrossDomainMessenger_Test:test_messageVersion_succeeds() (gas: 8521)
L2CrossDomainMessenger_Test:test_relayMessage_retry_succeeds() (gas: 191101)
L2CrossDomainMessenger_Test:test_relayMessage_retry_succeeds() (gas: 191101)
...
@@ -225,70 +225,70 @@ L2CrossDomainMessenger_Test:test_relayMessage_succeeds() (gas: 48936)
...
@@ -225,70 +225,70 @@ L2CrossDomainMessenger_Test:test_relayMessage_succeeds() (gas: 48936)
L2CrossDomainMessenger_Test:test_relayMessage_toSystemContract_reverts() (gas: 31159)
L2CrossDomainMessenger_Test:test_relayMessage_toSystemContract_reverts() (gas: 31159)
L2CrossDomainMessenger_Test:test_relayMessage_v2_reverts() (gas: 11756)
L2CrossDomainMessenger_Test:test_relayMessage_v2_reverts() (gas: 11756)
L2CrossDomainMessenger_Test:test_sendMessage_succeeds() (gas: 124025)
L2CrossDomainMessenger_Test:test_sendMessage_succeeds() (gas: 124025)
L2CrossDomainMessenger_Test:test_sendMessage_twice_succeeds() (gas: 1358
8
7)
L2CrossDomainMessenger_Test:test_sendMessage_twice_succeeds() (gas: 1358
5
7)
L2CrossDomainMessenger_Test:test_xDomainMessageSender_reset_succeeds() (gas: 49311)
L2CrossDomainMessenger_Test:test_xDomainMessageSender_reset_succeeds() (gas: 49311)
L2CrossDomainMessenger_Test:test_xDomainSender_senderNotSet_reverts() (gas: 10686)
L2CrossDomainMessenger_Test:test_xDomainSender_senderNotSet_reverts() (gas: 10686)
L2ERC721Bridge_Test:test_bridgeERC721To_localTokenZeroAddress_reverts() (gas: 26498)
L2ERC721Bridge_Test:test_bridgeERC721To_localTokenZeroAddress_reverts() (gas: 26498)
L2ERC721Bridge_Test:test_bridgeERC721To_remoteTokenZeroAddress_reverts() (gas: 218
37
)
L2ERC721Bridge_Test:test_bridgeERC721To_remoteTokenZeroAddress_reverts() (gas: 218
14
)
L2ERC721Bridge_Test:test_bridgeERC721To_succeeds() (gas: 152123)
L2ERC721Bridge_Test:test_bridgeERC721To_succeeds() (gas: 152123)
L2ERC721Bridge_Test:test_bridgeERC721To_wrongOwner_reverts() (gas: 294
72
)
L2ERC721Bridge_Test:test_bridgeERC721To_wrongOwner_reverts() (gas: 294
94
)
L2ERC721Bridge_Test:test_bridgeERC721_fromContract_reverts() (gas: 22
216
)
L2ERC721Bridge_Test:test_bridgeERC721_fromContract_reverts() (gas: 22
193
)
L2ERC721Bridge_Test:test_bridgeERC721_localTokenZeroAddress_reverts() (gas: 243
32
)
L2ERC721Bridge_Test:test_bridgeERC721_localTokenZeroAddress_reverts() (gas: 243
54
)
L2ERC721Bridge_Test:test_bridgeERC721_remoteTokenZeroAddress_reverts() (gas: 196
74
)
L2ERC721Bridge_Test:test_bridgeERC721_remoteTokenZeroAddress_reverts() (gas: 196
51
)
L2ERC721Bridge_Test:test_bridgeERC721_succeeds() (gas: 1497
64
)
L2ERC721Bridge_Test:test_bridgeERC721_succeeds() (gas: 1497
86
)
L2ERC721Bridge_Test:test_bridgeERC721_wrongOwner_reverts() (gas: 293
04
)
L2ERC721Bridge_Test:test_bridgeERC721_wrongOwner_reverts() (gas: 293
26
)
L2ERC721Bridge_Test:test_constructor_succeeds() (gas: 146
60
)
L2ERC721Bridge_Test:test_constructor_succeeds() (gas: 146
82
)
L2ERC721Bridge_Test:test_finalizeBridgeERC721_alreadyExists_reverts() (gas: 33650)
L2ERC721Bridge_Test:test_finalizeBridgeERC721_alreadyExists_reverts() (gas: 33650)
L2ERC721Bridge_Test:test_finalizeBridgeERC721_interfaceNotCompliant_reverts() (gas: 2413
98
)
L2ERC721Bridge_Test:test_finalizeBridgeERC721_interfaceNotCompliant_reverts() (gas: 2413
75
)
L2ERC721Bridge_Test:test_finalizeBridgeERC721_notFromRemoteMessenger_reverts() (gas: 22
193
)
L2ERC721Bridge_Test:test_finalizeBridgeERC721_notFromRemoteMessenger_reverts() (gas: 22
215
)
L2ERC721Bridge_Test:test_finalizeBridgeERC721_notViaLocalMessenger_reverts() (gas: 18282)
L2ERC721Bridge_Test:test_finalizeBridgeERC721_notViaLocalMessenger_reverts() (gas: 18282)
L2ERC721Bridge_Test:test_finalizeBridgeERC721_selfToken_reverts() (gas: 22113)
L2ERC721Bridge_Test:test_finalizeBridgeERC721_selfToken_reverts() (gas: 22113)
L2ERC721Bridge_Test:test_finalizeBridgeERC721_succeeds() (gas: 174514)
L2ERC721Bridge_Test:test_finalizeBridgeERC721_succeeds() (gas: 174514)
L2OutputOracleUpgradeable_Test:test_initValuesOnImpl_succeeds() (gas: 326
12
)
L2OutputOracleUpgradeable_Test:test_initValuesOnImpl_succeeds() (gas: 326
35
)
L2OutputOracleUpgradeable_Test:test_initValuesOnProxy_succeeds() (gas: 56622)
L2OutputOracleUpgradeable_Test:test_initValuesOnProxy_succeeds() (gas: 56622)
L2OutputOracleUpgradeable_Test:test_initializeImpl_alreadyInitialized_reverts() (gas: 24782)
L2OutputOracleUpgradeable_Test:test_initializeImpl_alreadyInitialized_reverts() (gas: 24782)
L2OutputOracleUpgradeable_Test:test_initializeProxy_alreadyInitialized_reverts() (gas: 26380)
L2OutputOracleUpgradeable_Test:test_initializeProxy_alreadyInitialized_reverts() (gas: 26380)
L2OutputOracleUpgradeable_Test:test_upgrading_succeeds() (gas: 191207)
L2OutputOracleUpgradeable_Test:test_upgrading_succeeds() (gas: 191207)
L2OutputOracle_constructor_Test:test_constructor_l2BlockTimeZero_reverts() (gas: 44322)
L2OutputOracle_constructor_Test:test_constructor_l2BlockTimeZero_reverts() (gas: 44322)
L2OutputOracle_constructor_Test:test_constructor_submissionInterval_reverts() (gas: 44354)
L2OutputOracle_constructor_Test:test_constructor_submissionInterval_reverts() (gas: 44354)
L2OutputOracle_constructor_Test:test_constructor_succeeds() (gas: 613
77
)
L2OutputOracle_constructor_Test:test_constructor_succeeds() (gas: 613
99
)
L2OutputOracle_constructor_Test:test_initialize_badTimestamp_reverts() (gas: 12
388
)
L2OutputOracle_constructor_Test:test_initialize_badTimestamp_reverts() (gas: 12
433
)
L2OutputOracle_deleteOutputs_Test:test_deleteL2Outputs_afterLatest_reverts() (gas: 2268
25
)
L2OutputOracle_deleteOutputs_Test:test_deleteL2Outputs_afterLatest_reverts() (gas: 2268
02
)
L2OutputOracle_deleteOutputs_Test:test_deleteL2Outputs_finalized_reverts() (gas: 118
642
)
L2OutputOracle_deleteOutputs_Test:test_deleteL2Outputs_finalized_reverts() (gas: 118
576
)
L2OutputOracle_deleteOutputs_Test:test_deleteL2Outputs_ifNotChallenger_reverts() (gas: 21053)
L2OutputOracle_deleteOutputs_Test:test_deleteL2Outputs_ifNotChallenger_reverts() (gas: 21053)
L2OutputOracle_deleteOutputs_Test:test_deleteL2Outputs_nonExistent_reverts() (gas: 117047)
L2OutputOracle_deleteOutputs_Test:test_deleteL2Outputs_nonExistent_reverts() (gas: 117047)
L2OutputOracle_deleteOutputs_Test:test_deleteOutputs_multipleOutputs_succeeds() (gas: 318
242
)
L2OutputOracle_deleteOutputs_Test:test_deleteOutputs_multipleOutputs_succeeds() (gas: 318
177
)
L2OutputOracle_deleteOutputs_Test:test_deleteOutputs_singleOutput_succeeds() (gas: 1932
58
)
L2OutputOracle_deleteOutputs_Test:test_deleteOutputs_singleOutput_succeeds() (gas: 1932
80
)
L2OutputOracle_getter_Test:test_computeL2Timestamp_succeeds() (gas: 44553)
L2OutputOracle_getter_Test:test_computeL2Timestamp_succeeds() (gas: 44553)
L2OutputOracle_getter_Test:test_getL2OutputIndexAfter_multipleOutputsExist_succeeds() (gas: 2774
77
)
L2OutputOracle_getter_Test:test_getL2OutputIndexAfter_multipleOutputsExist_succeeds() (gas: 2774
54
)
L2OutputOracle_getter_Test:test_getL2OutputIndexAfter_noOutputsExis_reverts() (gas: 179
60
)
L2OutputOracle_getter_Test:test_getL2OutputIndexAfter_noOutputsExis_reverts() (gas: 179
37
)
L2OutputOracle_getter_Test:test_getL2OutputIndexAfter_previousBlock_succeeds() (gas: 1035
19
)
L2OutputOracle_getter_Test:test_getL2OutputIndexAfter_previousBlock_succeeds() (gas: 1035
41
)
L2OutputOracle_getter_Test:test_getL2OutputIndexAfter_sameBlock_succeeds() (gas: 1034
27
)
L2OutputOracle_getter_Test:test_getL2OutputIndexAfter_sameBlock_succeeds() (gas: 1034
49
)
L2OutputOracle_getter_Test:test_getL2Output_succeeds() (gas: 1099
54
)
L2OutputOracle_getter_Test:test_getL2Output_succeeds() (gas: 1099
31
)
L2OutputOracle_getter_Test:test_latestBlockNumber_succeeds() (gas: 1045
04
)
L2OutputOracle_getter_Test:test_latestBlockNumber_succeeds() (gas: 1045
26
)
L2OutputOracle_getter_Test:test_nextBlockNumber_succeeds() (gas: 17492)
L2OutputOracle_getter_Test:test_nextBlockNumber_succeeds() (gas: 17492)
L2OutputOracle_proposeL2Output_Test:test_proposeL2Output_emptyOutput_reverts() (gas: 341
66
)
L2OutputOracle_proposeL2Output_Test:test_proposeL2Output_emptyOutput_reverts() (gas: 341
88
)
L2OutputOracle_proposeL2Output_Test:test_proposeL2Output_futureTimetamp_reverts() (gas: 342
40
)
L2OutputOracle_proposeL2Output_Test:test_proposeL2Output_futureTimetamp_reverts() (gas: 342
17
)
L2OutputOracle_proposeL2Output_Test:test_proposeL2Output_notProposer_reverts() (gas: 260
76
)
L2OutputOracle_proposeL2Output_Test:test_proposeL2Output_notProposer_reverts() (gas: 260
98
)
L2OutputOracle_proposeL2Output_Test:test_proposeL2Output_proposeAnotherOutput_succeeds() (gas: 1093
23
)
L2OutputOracle_proposeL2Output_Test:test_proposeL2Output_proposeAnotherOutput_succeeds() (gas: 1093
45
)
L2OutputOracle_proposeL2Output_Test:test_proposeL2Output_unexpectedBlockNumber_reverts() (gas: 33945)
L2OutputOracle_proposeL2Output_Test:test_proposeL2Output_unexpectedBlockNumber_reverts() (gas: 33945)
L2OutputOracle_proposeL2Output_Test:test_proposeL2Output_unmatchedBlockhash_reverts() (gas: 349
46
)
L2OutputOracle_proposeL2Output_Test:test_proposeL2Output_unmatchedBlockhash_reverts() (gas: 349
68
)
L2OutputOracle_proposeL2Output_Test:test_proposeL2Output_wrongFork_reverts() (gas: 34466)
L2OutputOracle_proposeL2Output_Test:test_proposeL2Output_wrongFork_reverts() (gas: 34466)
L2OutputOracle_proposeL2Output_Test:test_proposeWithBlockhashAndHeight_succeeds() (gas: 100845)
L2OutputOracle_proposeL2Output_Test:test_proposeWithBlockhashAndHeight_succeeds() (gas: 100845)
L2StandardBridge_BridgeERC20To_Test:test_bridgeERC20To_succeeds() (gas: 3923
27
)
L2StandardBridge_BridgeERC20To_Test:test_bridgeERC20To_succeeds() (gas: 3923
36
)
L2StandardBridge_BridgeERC20To_Test:test_withdrawTo_withdrawingERC20_succeeds() (gas: 3925
60
)
L2StandardBridge_BridgeERC20To_Test:test_withdrawTo_withdrawingERC20_succeeds() (gas: 3925
84
)
L2StandardBridge_BridgeERC20_Test:test_bridgeERC20_succeeds() (gas: 38796
0
)
L2StandardBridge_BridgeERC20_Test:test_bridgeERC20_succeeds() (gas: 38796
7
)
L2StandardBridge_BridgeERC20_Test:test_bridgeLegacyERC20_succeeds() (gas: 39623
7
)
L2StandardBridge_BridgeERC20_Test:test_bridgeLegacyERC20_succeeds() (gas: 39623
5
)
L2StandardBridge_BridgeERC20_Test:test_withdrawLegacyERC20_succeeds() (gas: 396580)
L2StandardBridge_BridgeERC20_Test:test_withdrawLegacyERC20_succeeds() (gas: 396580)
L2StandardBridge_BridgeERC20_Test:test_withdraw_notEOA_reverts() (gas: 25190
1
)
L2StandardBridge_BridgeERC20_Test:test_withdraw_notEOA_reverts() (gas: 25190
4
)
L2StandardBridge_BridgeERC20_Test:test_withdraw_withdrawingERC20_succeeds() (gas: 38824
1
)
L2StandardBridge_BridgeERC20_Test:test_withdraw_withdrawingERC20_succeeds() (gas: 38824
6
)
L2StandardBridge_Bridge_Test:test_finalizeBridgeETH_incorrectValue_reverts() (gas: 26200)
L2StandardBridge_Bridge_Test:test_finalizeBridgeETH_incorrectValue_reverts() (gas: 26200)
L2StandardBridge_Bridge_Test:test_finalizeBridgeETH_sendToMessenger_reverts() (gas: 26422)
L2StandardBridge_Bridge_Test:test_finalizeBridgeETH_sendToMessenger_reverts() (gas: 26422)
L2StandardBridge_Bridge_Test:test_finalizeBridgeETH_sendToSelf_reverts() (gas: 26227)
L2StandardBridge_Bridge_Test:test_finalizeBridgeETH_sendToSelf_reverts() (gas: 26227)
L2StandardBridge_Bridge_Test:test_finalizeDeposit_depositingERC20_succeeds() (gas: 961
26
)
L2StandardBridge_Bridge_Test:test_finalizeDeposit_depositingERC20_succeeds() (gas: 961
47
)
L2StandardBridge_Bridge_Test:test_finalizeDeposit_depositingETH_succeeds() (gas: 950
23
)
L2StandardBridge_Bridge_Test:test_finalizeDeposit_depositingETH_succeeds() (gas: 950
44
)
L2StandardBridge_FinalizeBridgeETH_Test:test_finalizeBridgeETH_succeeds() (gas: 45610)
L2StandardBridge_FinalizeBridgeETH_Test:test_finalizeBridgeETH_succeeds() (gas: 45610)
L2StandardBridge_Test:test_initialize_succeeds() (gas: 28
938
)
L2StandardBridge_Test:test_initialize_succeeds() (gas: 28
894
)
L2StandardBridge_Test:test_receive_succeeds() (gas: 177147)
L2StandardBridge_Test:test_receive_succeeds() (gas: 177147)
L2StandardBridge_Test:test_withdraw_ether_succeeds() (gas: 143411)
L2StandardBridge_Test:test_withdraw_ether_succeeds() (gas: 143411)
L2StandardBridge_Test:test_withdraw_insufficientValue_reverts() (gas: 16586)
L2StandardBridge_Test:test_withdraw_insufficientValue_reverts() (gas: 16586)
...
@@ -302,41 +302,41 @@ LegacyERC20ETH_Test:test_mint_doesNotExist_reverts() (gas: 10672)
...
@@ -302,41 +302,41 @@ LegacyERC20ETH_Test:test_mint_doesNotExist_reverts() (gas: 10672)
LegacyERC20ETH_Test:test_transferFrom_doesNotExist_reverts() (gas: 13002)
LegacyERC20ETH_Test:test_transferFrom_doesNotExist_reverts() (gas: 13002)
LegacyERC20ETH_Test:test_transfer_doesNotExist_reverts() (gas: 10801)
LegacyERC20ETH_Test:test_transfer_doesNotExist_reverts() (gas: 10801)
LegacyMessagePasser_Test:test_passMessageToL1_succeeds() (gas: 34629)
LegacyMessagePasser_Test:test_passMessageToL1_succeeds() (gas: 34629)
LibPosition_Test:test_pos_correctness_succeeds() (gas: 38
689
)
LibPosition_Test:test_pos_correctness_succeeds() (gas: 38
711
)
LivenessGuard_CheckAfterExecution_TestFails:test_checkAfterExecution_callerIsNotSafe_revert() (gas: 85
31
)
LivenessGuard_CheckAfterExecution_TestFails:test_checkAfterExecution_callerIsNotSafe_revert() (gas: 85
76
)
LivenessGuard_CheckTx_Test:test_checkTransaction_succeeds() (gas: 233535)
LivenessGuard_CheckTx_Test:test_checkTransaction_succeeds() (gas: 233535)
LivenessGuard_CheckTx_TestFails:test_checkTransaction_callerIsNotSafe_revert() (gas: 10358)
LivenessGuard_CheckTx_TestFails:test_checkTransaction_callerIsNotSafe_revert() (gas: 10358)
LivenessGuard_Constructor_Test:test_constructor_works() (gas: 1198965)
LivenessGuard_Constructor_Test:test_constructor_works() (gas: 1198965)
LivenessGuard_Getters_Test:test_getters_works() (gas: 10662)
LivenessGuard_Getters_Test:test_getters_works() (gas: 10662)
LivenessGuard_OwnerManagement_Test:test_addOwner_succeeds() (gas: 2743
66
)
LivenessGuard_OwnerManagement_Test:test_addOwner_succeeds() (gas: 2743
84
)
LivenessGuard_OwnerManagement_Test:test_removeOwner_succeeds() (gas: 2436
84
)
LivenessGuard_OwnerManagement_Test:test_removeOwner_succeeds() (gas: 2436
63
)
LivenessGuard_OwnerManagement_Test:test_swapOwner_succeeds() (gas: 2822
99
)
LivenessGuard_OwnerManagement_Test:test_swapOwner_succeeds() (gas: 2822
61
)
LivenessGuard_ShowLiveness_Test:test_showLiveness_succeeds() (gas: 288
31
)
LivenessGuard_ShowLiveness_Test:test_showLiveness_succeeds() (gas: 288
50
)
LivenessGuard_ShowLiveness_TestFail:test_showLiveness_callIsNotSafeOwner_reverts() (gas: 18770)
LivenessGuard_ShowLiveness_TestFail:test_showLiveness_callIsNotSafeOwner_reverts() (gas: 18770)
LivenessModule_CanRemove_Test:test_canRemove_works() (gas: 330
26
)
LivenessModule_CanRemove_Test:test_canRemove_works() (gas: 330
71
)
LivenessModule_CanRemove_TestFail:test_canRemove_notSafeOwner_reverts() (gas: 20
489
)
LivenessModule_CanRemove_TestFail:test_canRemove_notSafeOwner_reverts() (gas: 20
534
)
LivenessModule_Constructor_TestFail:test_constructor_minOwnersGreaterThanOwners_reverts() (gas: 83623)
LivenessModule_Constructor_TestFail:test_constructor_minOwnersGreaterThanOwners_reverts() (gas: 83623)
LivenessModule_Constructor_TestFail:test_constructor_wrongThreshold_reverts() (gas: 929
25
)
LivenessModule_Constructor_TestFail:test_constructor_wrongThreshold_reverts() (gas: 929
03
)
LivenessModule_Get75PercentThreshold_Test:test_get75PercentThreshold_Works() (gas: 263
39
)
LivenessModule_Get75PercentThreshold_Test:test_get75PercentThreshold_Works() (gas: 263
84
)
LivenessModule_Getters_Test:test_getters_works() (gas: 14853)
LivenessModule_Getters_Test:test_getters_works() (gas: 14853)
LivenessModule_RemoveOwners_Test:test_removeOwners_allOwners_succeeds() (gas: 1316
393
)
LivenessModule_RemoveOwners_Test:test_removeOwners_allOwners_succeeds() (gas: 1316
416
)
LivenessModule_RemoveOwners_Test:test_removeOwners_oneOwner_succeeds() (gas: 130750)
LivenessModule_RemoveOwners_Test:test_removeOwners_oneOwner_succeeds() (gas: 130750)
LivenessModule_RemoveOwners_TestFail:test_removeOwners_belowEmptiedButNotShutDown_reverts() (gas: 1269
598
)
LivenessModule_RemoveOwners_TestFail:test_removeOwners_belowEmptiedButNotShutDown_reverts() (gas: 1269
620
)
LivenessModule_RemoveOwners_TestFail:test_removeOwners_belowMinButNotEmptied_reverts() (gas: 1273409)
LivenessModule_RemoveOwners_TestFail:test_removeOwners_belowMinButNotEmptied_reverts() (gas: 1273409)
LivenessModule_RemoveOwners_TestFail:test_removeOwners_differentArrayLengths_reverts() (gas: 10502)
LivenessModule_RemoveOwners_TestFail:test_removeOwners_differentArrayLengths_reverts() (gas: 10502)
LivenessModule_RemoveOwners_TestFail:test_removeOwners_guardChanged_reverts() (gas: 28361
29
)
LivenessModule_RemoveOwners_TestFail:test_removeOwners_guardChanged_reverts() (gas: 28361
51
)
LivenessModule_RemoveOwners_TestFail:test_removeOwners_invalidThreshold_reverts() (gas: 693
58
)
LivenessModule_RemoveOwners_TestFail:test_removeOwners_invalidThreshold_reverts() (gas: 693
13
)
LivenessModule_RemoveOwners_TestFail:test_removeOwners_ownerHasShownLivenessRecently_reverts() (gas: 777
49
)
LivenessModule_RemoveOwners_TestFail:test_removeOwners_ownerHasShownLivenessRecently_reverts() (gas: 777
71
)
LivenessModule_RemoveOwners_TestFail:test_removeOwners_ownerHasSignedRecently_reverts() (gas: 615047)
LivenessModule_RemoveOwners_TestFail:test_removeOwners_ownerHasSignedRecently_reverts() (gas: 615047)
LivenessModule_RemoveOwners_TestFail:test_removeOwners_swapToFallbackOwner_reverts() (gas: 1278252)
LivenessModule_RemoveOwners_TestFail:test_removeOwners_swapToFallbackOwner_reverts() (gas: 1278252)
LivenessModule_RemoveOwners_TestFail:test_removeOwners_wrongPreviousOwner_reverts() (gas: 73954)
LivenessModule_RemoveOwners_TestFail:test_removeOwners_wrongPreviousOwner_reverts() (gas: 73954)
MIPS_Test:test_add_succeeds() (gas: 123021)
MIPS_Test:test_add_succeeds() (gas: 123021)
MIPS_Test:test_addiSign_succeeds() (gas: 122946)
MIPS_Test:test_addiSign_succeeds() (gas: 122946)
MIPS_Test:test_addi_succeeds() (gas: 123166)
MIPS_Test:test_addi_succeeds() (gas: 123166)
MIPS_Test:test_addu_succeeds() (gas: 12
3041
)
MIPS_Test:test_addu_succeeds() (gas: 12
2975
)
MIPS_Test:test_addui_succeeds() (gas: 123162)
MIPS_Test:test_addui_succeeds() (gas: 123162)
MIPS_Test:test_and_succeeds() (gas: 123017)
MIPS_Test:test_and_succeeds() (gas: 123017)
MIPS_Test:test_andi_succeeds() (gas: 1229
49
)
MIPS_Test:test_andi_succeeds() (gas: 1229
94
)
MIPS_Test:test_beq_succeeds() (gas: 203427)
MIPS_Test:test_beq_succeeds() (gas: 203427)
MIPS_Test:test_bgez_succeeds() (gas: 122265)
MIPS_Test:test_bgez_succeeds() (gas: 122265)
MIPS_Test:test_bgtz_succeeds() (gas: 122205)
MIPS_Test:test_bgtz_succeeds() (gas: 122205)
...
@@ -351,15 +351,15 @@ MIPS_Test:test_clz_succeeds() (gas: 123177)
...
@@ -351,15 +351,15 @@ MIPS_Test:test_clz_succeeds() (gas: 123177)
MIPS_Test:test_div_succeeds() (gas: 123134)
MIPS_Test:test_div_succeeds() (gas: 123134)
MIPS_Test:test_divu_succeeds() (gas: 123142)
MIPS_Test:test_divu_succeeds() (gas: 123142)
MIPS_Test:test_exit_succeeds() (gas: 122657)
MIPS_Test:test_exit_succeeds() (gas: 122657)
MIPS_Test:test_fcntl_succeeds() (gas: 2048
42
)
MIPS_Test:test_fcntl_succeeds() (gas: 2048
64
)
MIPS_Test:test_illegal_instruction_fails() (gas: 92045)
MIPS_Test:test_illegal_instruction_fails() (gas: 92045)
MIPS_Test:test_invalid_root_fails() (gas: 4362
16
)
MIPS_Test:test_invalid_root_fails() (gas: 4362
38
)
MIPS_Test:test_jal_nonzeroRegion_succeeds() (gas: 1212
73
)
MIPS_Test:test_jal_nonzeroRegion_succeeds() (gas: 1212
50
)
MIPS_Test:test_jal_succeeds() (gas: 121217)
MIPS_Test:test_jal_succeeds() (gas: 121217)
MIPS_Test:test_jalr_succeeds() (gas: 122425)
MIPS_Test:test_jalr_succeeds() (gas: 122425)
MIPS_Test:test_jr_succeeds() (gas: 122096)
MIPS_Test:test_jr_succeeds() (gas: 122096)
MIPS_Test:test_jump_inDelaySlot_fails() (gas: 85
928
)
MIPS_Test:test_jump_inDelaySlot_fails() (gas: 85
884
)
MIPS_Test:test_jump_nonzeroRegion_succeeds() (gas: 1209
72
)
MIPS_Test:test_jump_nonzeroRegion_succeeds() (gas: 1209
94
)
MIPS_Test:test_jump_succeeds() (gas: 120969)
MIPS_Test:test_jump_succeeds() (gas: 120969)
MIPS_Test:test_lb_succeeds() (gas: 128187)
MIPS_Test:test_lb_succeeds() (gas: 128187)
MIPS_Test:test_lbu_succeeds() (gas: 128085)
MIPS_Test:test_lbu_succeeds() (gas: 128085)
...
@@ -374,10 +374,10 @@ MIPS_Test:test_mfhi_succeeds() (gas: 122634)
...
@@ -374,10 +374,10 @@ MIPS_Test:test_mfhi_succeeds() (gas: 122634)
MIPS_Test:test_mflo_succeeds() (gas: 122718)
MIPS_Test:test_mflo_succeeds() (gas: 122718)
MIPS_Test:test_mmap_succeeds() (gas: 119637)
MIPS_Test:test_mmap_succeeds() (gas: 119637)
MIPS_Test:test_movn_succeeds() (gas: 204054)
MIPS_Test:test_movn_succeeds() (gas: 204054)
MIPS_Test:test_movz_succeeds() (gas: 2039
23
)
MIPS_Test:test_movz_succeeds() (gas: 2039
45
)
MIPS_Test:test_mthi_succeeds() (gas: 122678)
MIPS_Test:test_mthi_succeeds() (gas: 122678)
MIPS_Test:test_mtlo_succeeds() (gas: 122741)
MIPS_Test:test_mtlo_succeeds() (gas: 122741)
MIPS_Test:test_mul_succeeds() (gas: 1222
56
)
MIPS_Test:test_mul_succeeds() (gas: 1222
78
)
MIPS_Test:test_mult_succeeds() (gas: 122959)
MIPS_Test:test_mult_succeeds() (gas: 122959)
MIPS_Test:test_multu_succeeds() (gas: 123018)
MIPS_Test:test_multu_succeeds() (gas: 123018)
MIPS_Test:test_nor_succeeds() (gas: 123109)
MIPS_Test:test_nor_succeeds() (gas: 123109)
...
@@ -389,42 +389,42 @@ MIPS_Test:test_prestate_exited_succeeds() (gas: 113835)
...
@@ -389,42 +389,42 @@ MIPS_Test:test_prestate_exited_succeeds() (gas: 113835)
MIPS_Test:test_sb_succeeds() (gas: 161547)
MIPS_Test:test_sb_succeeds() (gas: 161547)
MIPS_Test:test_sc_succeeds() (gas: 161752)
MIPS_Test:test_sc_succeeds() (gas: 161752)
MIPS_Test:test_sh_succeeds() (gas: 161606)
MIPS_Test:test_sh_succeeds() (gas: 161606)
MIPS_Test:test_sll_succeeds() (gas: 1222
38
)
MIPS_Test:test_sll_succeeds() (gas: 1222
60
)
MIPS_Test:test_sllv_succeeds() (gas: 122402)
MIPS_Test:test_sllv_succeeds() (gas: 122402)
MIPS_Test:test_slt_succeeds() (gas: 205250)
MIPS_Test:test_slt_succeeds() (gas: 205250)
MIPS_Test:test_sltu_succeeds() (gas: 123285)
MIPS_Test:test_sltu_succeeds() (gas: 123285)
MIPS_Test:test_sra_succeeds() (gas: 1224
68
)
MIPS_Test:test_sra_succeeds() (gas: 1224
90
)
MIPS_Test:test_srav_succeeds() (gas: 122758)
MIPS_Test:test_srav_succeeds() (gas: 122758)
MIPS_Test:test_srl_succeeds() (gas: 122276)
MIPS_Test:test_srl_succeeds() (gas: 122276)
MIPS_Test:test_srlv_succeeds() (gas: 122506)
MIPS_Test:test_srlv_succeeds() (gas: 122506)
MIPS_Test:test_step_abi_succeeds() (gas: 58532)
MIPS_Test:test_step_abi_succeeds() (gas: 58532)
MIPS_Test:test_sub_succeeds() (gas: 123007)
MIPS_Test:test_sub_succeeds() (gas: 123007)
MIPS_Test:test_subu_succeeds() (gas: 1230
70
)
MIPS_Test:test_subu_succeeds() (gas: 1230
92
)
MIPS_Test:test_sw_succeeds() (gas: 161604)
MIPS_Test:test_sw_succeeds() (gas: 161604)
MIPS_Test:test_swl_succeeds() (gas: 161621)
MIPS_Test:test_swl_succeeds() (gas: 161621)
MIPS_Test:test_swr_succeeds() (gas: 161696)
MIPS_Test:test_swr_succeeds() (gas: 161696)
MIPS_Test:test_xor_succeeds() (gas: 123029)
MIPS_Test:test_xor_succeeds() (gas: 123029)
MIPS_Test:test_xori_succeeds() (gas: 123147)
MIPS_Test:test_xori_succeeds() (gas: 123147)
MerkleTrie_get_Test:test_get_corruptedProof_reverts() (gas: 57
33
)
MerkleTrie_get_Test:test_get_corruptedProof_reverts() (gas: 57
10
)
MerkleTrie_get_Test:test_get_extraProofElements_reverts() (gas: 58889)
MerkleTrie_get_Test:test_get_extraProofElements_reverts() (gas: 58889)
MerkleTrie_get_Test:test_get_invalidDataRemainder_reverts() (gas: 358
45
)
MerkleTrie_get_Test:test_get_invalidDataRemainder_reverts() (gas: 358
67
)
MerkleTrie_get_Test:test_get_invalidInternalNodeHash_reverts() (gas: 496
54
)
MerkleTrie_get_Test:test_get_invalidInternalNodeHash_reverts() (gas: 496
76
)
MerkleTrie_get_Test:test_get_nonexistentKey1_reverts() (gas: 547
70
)
MerkleTrie_get_Test:test_get_nonexistentKey1_reverts() (gas: 547
92
)
MerkleTrie_get_Test:test_get_nonexistentKey2_reverts() (gas: 16699)
MerkleTrie_get_Test:test_get_nonexistentKey2_reverts() (gas: 16699)
MerkleTrie_get_Test:test_get_smallerPathThanKey1_reverts() (gas: 514
03
)
MerkleTrie_get_Test:test_get_smallerPathThanKey1_reverts() (gas: 514
25
)
MerkleTrie_get_Test:test_get_smallerPathThanKey2_reverts() (gas: 528
84
)
MerkleTrie_get_Test:test_get_smallerPathThanKey2_reverts() (gas: 528
40
)
MerkleTrie_get_Test:test_get_validProof10_succeeds() (gas: 48845)
MerkleTrie_get_Test:test_get_validProof10_succeeds() (gas: 48845)
MerkleTrie_get_Test:test_get_validProof1_succeeds() (gas: 55970)
MerkleTrie_get_Test:test_get_validProof1_succeeds() (gas: 55970)
MerkleTrie_get_Test:test_get_validProof2_succeeds() (gas: 658
61
)
MerkleTrie_get_Test:test_get_validProof2_succeeds() (gas: 658
83
)
MerkleTrie_get_Test:test_get_validProof3_succeeds() (gas: 27309)
MerkleTrie_get_Test:test_get_validProof3_succeeds() (gas: 27309)
MerkleTrie_get_Test:test_get_validProof4_succeeds() (gas: 181
05
)
MerkleTrie_get_Test:test_get_validProof4_succeeds() (gas: 181
27
)
MerkleTrie_get_Test:test_get_validProof5_succeeds() (gas: 80701)
MerkleTrie_get_Test:test_get_validProof5_succeeds() (gas: 80701)
MerkleTrie_get_Test:test_get_validProof6_succeeds() (gas: 69460)
MerkleTrie_get_Test:test_get_validProof6_succeeds() (gas: 69460)
MerkleTrie_get_Test:test_get_validProof7_succeeds() (gas: 761
58
)
MerkleTrie_get_Test:test_get_validProof7_succeeds() (gas: 761
15
)
MerkleTrie_get_Test:test_get_validProof8_succeeds() (gas: 488
02
)
MerkleTrie_get_Test:test_get_validProof8_succeeds() (gas: 488
24
)
MerkleTrie_get_Test:test_get_validProof9_succeeds() (gas: 48802)
MerkleTrie_get_Test:test_get_validProof9_succeeds() (gas: 48802)
MerkleTrie_get_Test:test_get_wrongKeyProof_reverts() (gas: 507
30
)
MerkleTrie_get_Test:test_get_wrongKeyProof_reverts() (gas: 507
52
)
MerkleTrie_get_Test:test_get_zeroBranchValueLength_reverts() (gas: 41
684
)
MerkleTrie_get_Test:test_get_zeroBranchValueLength_reverts() (gas: 41
706
)
MerkleTrie_get_Test:test_get_zeroLengthKey_reverts() (gas: 3632)
MerkleTrie_get_Test:test_get_zeroLengthKey_reverts() (gas: 3632)
MintManager_constructor_Test:test_constructor_succeeds() (gas: 10623)
MintManager_constructor_Test:test_constructor_succeeds() (gas: 10623)
MintManager_mint_Test:test_mint_afterPeriodElapsed_succeeds() (gas: 148184)
MintManager_mint_Test:test_mint_afterPeriodElapsed_succeeds() (gas: 148184)
...
@@ -436,101 +436,101 @@ MintManager_upgrade_Test:test_upgrade_fromNotOwner_reverts() (gas: 11041)
...
@@ -436,101 +436,101 @@ MintManager_upgrade_Test:test_upgrade_fromNotOwner_reverts() (gas: 11041)
MintManager_upgrade_Test:test_upgrade_fromOwner_succeeds() (gas: 23509)
MintManager_upgrade_Test:test_upgrade_fromOwner_succeeds() (gas: 23509)
MintManager_upgrade_Test:test_upgrade_toZeroAddress_reverts() (gas: 11070)
MintManager_upgrade_Test:test_upgrade_toZeroAddress_reverts() (gas: 11070)
Multichain:test_script_succeeds() (gas: 3078)
Multichain:test_script_succeeds() (gas: 3078)
OptimismMintableERC20_Test:test_bridge_succeeds() (gas: 7
695
)
OptimismMintableERC20_Test:test_bridge_succeeds() (gas: 7
732
)
OptimismMintableERC20_Test:test_burn_notBridge_reverts() (gas: 11
209
)
OptimismMintableERC20_Test:test_burn_notBridge_reverts() (gas: 11
168
)
OptimismMintableERC20_Test:test_burn_succeeds() (gas: 5105
0
)
OptimismMintableERC20_Test:test_burn_succeeds() (gas: 5105
7
)
OptimismMintableERC20_Test:test_erc165_supportsInterface_succeeds() (gas: 78
32
)
OptimismMintableERC20_Test:test_erc165_supportsInterface_succeeds() (gas: 78
63
)
OptimismMintableERC20_Test:test_l1Token_succeeds() (gas: 77
17
)
OptimismMintableERC20_Test:test_l1Token_succeeds() (gas: 77
32
)
OptimismMintableERC20_Test:test_l2Bridge_succeeds() (gas: 76
72
)
OptimismMintableERC20_Test:test_l2Bridge_succeeds() (gas: 76
87
)
OptimismMintableERC20_Test:test_legacy_succeeds() (gas: 14
518
)
OptimismMintableERC20_Test:test_legacy_succeeds() (gas: 14
630
)
OptimismMintableERC20_Test:test_mint_notBridge_reverts() (gas: 11
187
)
OptimismMintableERC20_Test:test_mint_notBridge_reverts() (gas: 11
212
)
OptimismMintableERC20_Test:test_mint_succeeds() (gas: 63
633
)
OptimismMintableERC20_Test:test_mint_succeeds() (gas: 63
595
)
OptimismMintableERC20_Test:test_remoteToken_succeeds() (gas: 77
18
)
OptimismMintableERC20_Test:test_remoteToken_succeeds() (gas: 77
55
)
OptimismMintableERC721Factory_Test:test_constructor_succeeds() (gas: 84
02
)
OptimismMintableERC721Factory_Test:test_constructor_succeeds() (gas: 84
24
)
OptimismMintableERC721Factory_Test:test_createOptimismMintableERC721_sameTwice_reverts() (gas: 8937393460516800078)
OptimismMintableERC721Factory_Test:test_createOptimismMintableERC721_sameTwice_reverts() (gas: 8937393460516800078)
OptimismMintableERC721Factory_Test:test_createOptimismMintableERC721_succeeds() (gas: 23165
23
)
OptimismMintableERC721Factory_Test:test_createOptimismMintableERC721_succeeds() (gas: 23165
45
)
OptimismMintableERC721Factory_Test:test_createOptimismMintableERC721_zeroRemoteToken_reverts() (gas: 9542)
OptimismMintableERC721Factory_Test:test_createOptimismMintableERC721_zeroRemoteToken_reverts() (gas: 9542)
OptimismMintableERC721_Test:test_burn_notBridge_reverts() (gas: 136967)
OptimismMintableERC721_Test:test_burn_notBridge_reverts() (gas: 136967)
OptimismMintableERC721_Test:test_burn_succeeds() (gas: 118874)
OptimismMintableERC721_Test:test_burn_succeeds() (gas: 118874)
OptimismMintableERC721_Test:test_constructor_succeeds() (gas: 24516)
OptimismMintableERC721_Test:test_constructor_succeeds() (gas: 24516)
OptimismMintableERC721_Test:test_safeMint_notBridge_reverts() (gas: 11209)
OptimismMintableERC721_Test:test_safeMint_notBridge_reverts() (gas: 11209)
OptimismMintableERC721_Test:test_safeMint_succeeds() (gas: 140599)
OptimismMintableERC721_Test:test_safeMint_succeeds() (gas: 140599)
OptimismMintableERC721_Test:test_supportsInterfaces_succeeds() (gas: 90
28
)
OptimismMintableERC721_Test:test_supportsInterfaces_succeeds() (gas: 90
50
)
OptimismMintableERC721_Test:test_tokenURI_succeeds() (gas: 163605)
OptimismMintableERC721_Test:test_tokenURI_succeeds() (gas: 163605)
OptimismMintableTokenFactory_Test:test_bridge_succeeds() (gas: 9856)
OptimismMintableTokenFactory_Test:test_bridge_succeeds() (gas: 9856)
OptimismMintableTokenFactory_Test:test_createStandardL2TokenWithDecimals_succeeds() (gas: 1142627)
OptimismMintableTokenFactory_Test:test_createStandardL2TokenWithDecimals_succeeds() (gas: 1142627)
OptimismMintableTokenFactory_Test:test_createStandardL2Token_remoteIsZero_reverts() (gas: 9621)
OptimismMintableTokenFactory_Test:test_createStandardL2Token_remoteIsZero_reverts() (gas: 9621)
OptimismMintableTokenFactory_Test:test_createStandardL2Token_sameTwice_reverts() (gas: 8937393460516764416)
OptimismMintableTokenFactory_Test:test_createStandardL2Token_sameTwice_reverts() (gas: 8937393460516764416)
OptimismMintableTokenFactory_Test:test_createStandardL2Token_succeeds() (gas: 1142
596
)
OptimismMintableTokenFactory_Test:test_createStandardL2Token_succeeds() (gas: 1142
619
)
OptimismPortalUpgradeable_Test:test_initialize_cannotInitImpl_reverts() (gas: 14
593
)
OptimismPortalUpgradeable_Test:test_initialize_cannotInitImpl_reverts() (gas: 14
615
)
OptimismPortalUpgradeable_Test:test_initialize_cannotInitProxy_reverts() (gas: 162
06
)
OptimismPortalUpgradeable_Test:test_initialize_cannotInitProxy_reverts() (gas: 162
22
)
OptimismPortalUpgradeable_Test:test_params_initValuesOnProxy_succeeds() (gas: 26
711
)
OptimismPortalUpgradeable_Test:test_params_initValuesOnProxy_succeeds() (gas: 26
667
)
OptimismPortalUpgradeable_Test:test_upgradeToAndCall_upgrading_succeeds() (gas: 18608
6
)
OptimismPortalUpgradeable_Test:test_upgradeToAndCall_upgrading_succeeds() (gas: 18608
4
)
OptimismPortal_FinalizeWithdrawal_Test:test_finalizeWithdrawalTransaction_ifOutputRootChanges_reverts() (gas: 1787
34
)
OptimismPortal_FinalizeWithdrawal_Test:test_finalizeWithdrawalTransaction_ifOutputRootChanges_reverts() (gas: 1787
56
)
OptimismPortal_FinalizeWithdrawal_Test:test_finalizeWithdrawalTransaction_ifOutputTimestampIsNotFinalized_reverts() (gas: 182
285
)
OptimismPortal_FinalizeWithdrawal_Test:test_finalizeWithdrawalTransaction_ifOutputTimestampIsNotFinalized_reverts() (gas: 182
307
)
OptimismPortal_FinalizeWithdrawal_Test:test_finalizeWithdrawalTransaction_ifWithdrawalNotProven_reverts() (gas: 41781)
OptimismPortal_FinalizeWithdrawal_Test:test_finalizeWithdrawalTransaction_ifWithdrawalNotProven_reverts() (gas: 41781)
OptimismPortal_FinalizeWithdrawal_Test:test_finalizeWithdrawalTransaction_ifWithdrawalProofNotOldEnough_reverts() (gas: 174020)
OptimismPortal_FinalizeWithdrawal_Test:test_finalizeWithdrawalTransaction_ifWithdrawalProofNotOldEnough_reverts() (gas: 174020)
OptimismPortal_FinalizeWithdrawal_Test:test_finalizeWithdrawalTransaction_onInsufficientGas_reverts() (gas: 181245)
OptimismPortal_FinalizeWithdrawal_Test:test_finalizeWithdrawalTransaction_onInsufficientGas_reverts() (gas: 181245)
OptimismPortal_FinalizeWithdrawal_Test:test_finalizeWithdrawalTransaction_onRecentWithdrawal_reverts() (gas: 154
785
)
OptimismPortal_FinalizeWithdrawal_Test:test_finalizeWithdrawalTransaction_onRecentWithdrawal_reverts() (gas: 154
807
)
OptimismPortal_FinalizeWithdrawal_Test:test_finalizeWithdrawalTransaction_onReentrancy_reverts() (gas: 21930
5
)
OptimismPortal_FinalizeWithdrawal_Test:test_finalizeWithdrawalTransaction_onReentrancy_reverts() (gas: 21930
1
)
OptimismPortal_FinalizeWithdrawal_Test:test_finalizeWithdrawalTransaction_onReplay_reverts() (gas: 2209
62
)
OptimismPortal_FinalizeWithdrawal_Test:test_finalizeWithdrawalTransaction_onReplay_reverts() (gas: 2209
84
)
OptimismPortal_FinalizeWithdrawal_Test:test_finalizeWithdrawalTransaction_paused_reverts() (gas: 387
51
)
OptimismPortal_FinalizeWithdrawal_Test:test_finalizeWithdrawalTransaction_paused_reverts() (gas: 387
73
)
OptimismPortal_FinalizeWithdrawal_Test:test_finalizeWithdrawalTransaction_provenWithdrawalHash_succeeds() (gas: 2096
58
)
OptimismPortal_FinalizeWithdrawal_Test:test_finalizeWithdrawalTransaction_provenWithdrawalHash_succeeds() (gas: 2096
80
)
OptimismPortal_FinalizeWithdrawal_Test:test_finalizeWithdrawalTransaction_targetFails_fails() (gas: 879774668769616267
8
)
OptimismPortal_FinalizeWithdrawal_Test:test_finalizeWithdrawalTransaction_targetFails_fails() (gas: 879774668769616267
9
)
OptimismPortal_FinalizeWithdrawal_Test:test_finalizeWithdrawalTransaction_timestampLessThanL2OracleStart_reverts() (gas: 1713
69
)
OptimismPortal_FinalizeWithdrawal_Test:test_finalizeWithdrawalTransaction_timestampLessThanL2OracleStart_reverts() (gas: 1713
24
)
OptimismPortal_FinalizeWithdrawal_Test:test_proveWithdrawalTransaction_onInvalidOutputRootProof_reverts() (gas: 858
06
)
OptimismPortal_FinalizeWithdrawal_Test:test_proveWithdrawalTransaction_onInvalidOutputRootProof_reverts() (gas: 858
28
)
OptimismPortal_FinalizeWithdrawal_Test:test_proveWithdrawalTransaction_onInvalidWithdrawalProof_reverts() (gas: 1113
61
)
OptimismPortal_FinalizeWithdrawal_Test:test_proveWithdrawalTransaction_onInvalidWithdrawalProof_reverts() (gas: 1113
18
)
OptimismPortal_FinalizeWithdrawal_Test:test_proveWithdrawalTransaction_onSelfCall_reverts() (gas: 5299
6
)
OptimismPortal_FinalizeWithdrawal_Test:test_proveWithdrawalTransaction_onSelfCall_reverts() (gas: 5299
3
)
OptimismPortal_FinalizeWithdrawal_Test:test_proveWithdrawalTransaction_paused_reverts() (gas: 58
892
)
OptimismPortal_FinalizeWithdrawal_Test:test_proveWithdrawalTransaction_paused_reverts() (gas: 58
914
)
OptimismPortal_FinalizeWithdrawal_Test:test_proveWithdrawalTransaction_replayProveChangedOutputRootAndOutputIndex_succeeds() (gas: 297
539
)
OptimismPortal_FinalizeWithdrawal_Test:test_proveWithdrawalTransaction_replayProveChangedOutputRootAndOutputIndex_succeeds() (gas: 297
495
)
OptimismPortal_FinalizeWithdrawal_Test:test_proveWithdrawalTransaction_replayProveChangedOutputRoot_succeeds() (gas: 227
641
)
OptimismPortal_FinalizeWithdrawal_Test:test_proveWithdrawalTransaction_replayProveChangedOutputRoot_succeeds() (gas: 227
597
)
OptimismPortal_FinalizeWithdrawal_Test:test_proveWithdrawalTransaction_replayProve_reverts() (gas: 166
744
)
OptimismPortal_FinalizeWithdrawal_Test:test_proveWithdrawalTransaction_replayProve_reverts() (gas: 166
699
)
OptimismPortal_FinalizeWithdrawal_Test:test_proveWithdrawalTransaction_validWithdrawalProof_succeeds() (gas: 1544
75
)
OptimismPortal_FinalizeWithdrawal_Test:test_proveWithdrawalTransaction_validWithdrawalProof_succeeds() (gas: 1544
31
)
OptimismPortal_Test:test_constructor_succeeds() (gas: 334
54
)
OptimismPortal_Test:test_constructor_succeeds() (gas: 334
76
)
OptimismPortal_Test:test_depositTransaction_contractCreation_reverts() (gas: 14
300
)
OptimismPortal_Test:test_depositTransaction_contractCreation_reverts() (gas: 14
294
)
OptimismPortal_Test:test_depositTransaction_largeData_reverts() (gas: 5122
18
)
OptimismPortal_Test:test_depositTransaction_largeData_reverts() (gas: 5122
24
)
OptimismPortal_Test:test_depositTransaction_smallGasLimit_reverts() (gas: 1455
6
)
OptimismPortal_Test:test_depositTransaction_smallGasLimit_reverts() (gas: 1455
0
)
OptimismPortal_Test:test_isOutputFinalized_succeeds() (gas: 1276
17
)
OptimismPortal_Test:test_isOutputFinalized_succeeds() (gas: 1276
39
)
OptimismPortal_Test:test_minimumGasLimit_succeeds() (gas: 176
39
)
OptimismPortal_Test:test_minimumGasLimit_succeeds() (gas: 176
43
)
OptimismPortal_Test:test_pause_onlyGuardian_reverts() (gas: 24487)
OptimismPortal_Test:test_pause_onlyGuardian_reverts() (gas: 24487)
OptimismPortal_Test:test_pause_succeeds() (gas: 27329)
OptimismPortal_Test:test_pause_succeeds() (gas: 27329)
OptimismPortal_Test:test_simple_isOutputFinalized_succeeds() (gas: 40883)
OptimismPortal_Test:test_simple_isOutputFinalized_succeeds() (gas: 40883)
OptimismPortal_Test:test_unpause_onlyGuardian_reverts() (gas: 31580)
OptimismPortal_Test:test_unpause_onlyGuardian_reverts() (gas: 31580)
OptimismPortal_Test:test_unpause_succeeds() (gas: 27349)
OptimismPortal_Test:test_unpause_succeeds() (gas: 27349)
OptimistAllowlistTest:test_constructor_succeeds() (gas: 16
407
)
OptimistAllowlistTest:test_constructor_succeeds() (gas: 16
362
)
OptimistAllowlistTest:test_isAllowedToMint_fromAllowlistAttestorWithFalsyValue_fails() (gas: 4965
0
)
OptimistAllowlistTest:test_isAllowedToMint_fromAllowlistAttestorWithFalsyValue_fails() (gas: 4965
2
)
OptimistAllowlistTest:test_isAllowedToMint_fromAllowlistAttestor_succeeds() (gas: 492
54
)
OptimistAllowlistTest:test_isAllowedToMint_fromAllowlistAttestor_succeeds() (gas: 492
76
)
OptimistAllowlistTest:test_isAllowedToMint_fromCoinbaseQuestAttestorWithFalsyValue_fails() (gas: 493
52
)
OptimistAllowlistTest:test_isAllowedToMint_fromCoinbaseQuestAttestorWithFalsyValue_fails() (gas: 493
47
)
OptimistAllowlistTest:test_isAllowedToMint_fromCoinbaseQuestAttestor_succeeds() (gas: 534
33
)
OptimistAllowlistTest:test_isAllowedToMint_fromCoinbaseQuestAttestor_succeeds() (gas: 534
55
)
OptimistAllowlistTest:test_isAllowedToMint_fromInvite_succeeds() (gas: 235
292
)
OptimistAllowlistTest:test_isAllowedToMint_fromInvite_succeeds() (gas: 235
314
)
OptimistAllowlistTest:test_isAllowedToMint_fromWrongAllowlistAttestor_fails() (gas: 581
22
)
OptimistAllowlistTest:test_isAllowedToMint_fromWrongAllowlistAttestor_fails() (gas: 581
19
)
OptimistAllowlistTest:test_isAllowedToMint_fromWrongCoinbaseQuestAttestor_fails() (gas: 580
79
)
OptimistAllowlistTest:test_isAllowedToMint_fromWrongCoinbaseQuestAttestor_fails() (gas: 580
98
)
OptimistAllowlistTest:test_isAllowedToMint_fromWrongOptimistInviter_fails() (gas: 574
12
)
OptimistAllowlistTest:test_isAllowedToMint_fromWrongOptimistInviter_fails() (gas: 574
09
)
OptimistAllowlistTest:test_isAllowedToMint_withMultipleAttestations_succeeds() (gas: 3247
20
)
OptimistAllowlistTest:test_isAllowedToMint_withMultipleAttestations_succeeds() (gas: 3247
17
)
OptimistAllowlistTest:test_isAllowedToMint_withoutAnyAttestations_fails() (gas: 23046)
OptimistAllowlistTest:test_isAllowedToMint_withoutAnyAttestations_fails() (gas: 23046)
OptimistInviterTest:test_claimInvite_claimBeforeMinCommitmentPeriod_reverts() (gas: 142794)
OptimistInviterTest:test_claimInvite_claimBeforeMinCommitmentPeriod_reverts() (gas: 142794)
OptimistInviterTest:test_claimInvite_claimForSomeoneElse_succeeds() (gas: 2453
13
)
OptimistInviterTest:test_claimInvite_claimForSomeoneElse_succeeds() (gas: 2453
04
)
OptimistInviterTest:test_claimInvite_replayingUsedNonce_reverts() (gas: 288334)
OptimistInviterTest:test_claimInvite_replayingUsedNonce_reverts() (gas: 288334)
OptimistInviterTest:test_claimInvite_succeeds() (gas: 241271)
OptimistInviterTest:test_claimInvite_succeeds() (gas: 241271)
OptimistInviterTest:test_claimInvite_usingERC1271Wallet_succeeds() (gas: 245678)
OptimistInviterTest:test_claimInvite_usingERC1271Wallet_succeeds() (gas: 245678)
OptimistInviterTest:test_claimInvite_usingSignatureIssuedForDifferentChain_reverts() (gas: 156562)
OptimistInviterTest:test_claimInvite_usingSignatureIssuedForDifferentChain_reverts() (gas: 156562)
OptimistInviterTest:test_claimInvite_usingSignatureIssuedForDifferentContract_reverts() (gas: 1564
53
)
OptimistInviterTest:test_claimInvite_usingSignatureIssuedForDifferentContract_reverts() (gas: 1564
75
)
OptimistInviterTest:test_claimInvite_usingSignatureIssuedForDifferentVersion_reverts() (gas: 155077)
OptimistInviterTest:test_claimInvite_usingSignatureIssuedForDifferentVersion_reverts() (gas: 155077)
OptimistInviterTest:test_claimInvite_whenIssuerHasNoInvitesLeft_reverts() (gas: 561851)
OptimistInviterTest:test_claimInvite_whenIssuerHasNoInvitesLeft_reverts() (gas: 561851)
OptimistInviterTest:test_claimInvite_whenIssuerNeverReceivedInvites_reverts() (gas: 110711)
OptimistInviterTest:test_claimInvite_whenIssuerNeverReceivedInvites_reverts() (gas: 110711)
OptimistInviterTest:test_claimInvite_withIncorrectSignature_reverts() (gas: 253045)
OptimistInviterTest:test_claimInvite_withIncorrectSignature_reverts() (gas: 253045)
OptimistInviterTest:test_claimInvite_withoutCommittingHash_reverts() (gas: 119185)
OptimistInviterTest:test_claimInvite_withoutCommittingHash_reverts() (gas: 119185)
OptimistInviterTest:test_commitInvite_committingForSomeoneElse_succeeds() (gas: 140559)
OptimistInviterTest:test_commitInvite_committingForSomeoneElse_succeeds() (gas: 140559)
OptimistInviterTest:test_commitInvite_committingForYourself_succeeds() (gas: 1386
03
)
OptimistInviterTest:test_commitInvite_committingForYourself_succeeds() (gas: 1386
25
)
OptimistInviterTest:test_commitInvite_committingSameHashTwice_reverts() (gas: 142031)
OptimistInviterTest:test_commitInvite_committingSameHashTwice_reverts() (gas: 142031)
OptimistInviterTest:test_grantInvites_adminAddingInvites_succeeds() (gas: 1906
82
)
OptimistInviterTest:test_grantInvites_adminAddingInvites_succeeds() (gas: 1906
70
)
OptimistInviterTest:test_grantInvites_nonAdminAddingInvites_reverts() (gas: 140
26
)
OptimistInviterTest:test_grantInvites_nonAdminAddingInvites_reverts() (gas: 140
48
)
OptimistInviterTest:test_initialize_succeeds() (gas: 105
73
)
OptimistInviterTest:test_initialize_succeeds() (gas: 105
07
)
OptimistTest:test_approve_soulbound_reverts() (gas: 70487)
OptimistTest:test_approve_soulbound_reverts() (gas: 70487)
OptimistTest:test_baseURI_returnsCorrectBaseURI_succeeds() (gas: 124566)
OptimistTest:test_baseURI_returnsCorrectBaseURI_succeeds() (gas: 124566)
OptimistTest:test_burn_byNonOwner_reverts() (gas: 73197)
OptimistTest:test_burn_byNonOwner_reverts() (gas: 73197)
OptimistTest:test_burn_byOwner_succeeds() (gas: 54487)
OptimistTest:test_burn_byOwner_succeeds() (gas: 54487)
OptimistTest:test_initialize_succeeds() (gas: 208
40
)
OptimistTest:test_initialize_succeeds() (gas: 208
62
)
OptimistTest:test_mint_afterAllowlistAttestation_succeeds() (gas: 121365)
OptimistTest:test_mint_afterAllowlistAttestation_succeeds() (gas: 121365)
OptimistTest:test_mint_afterCoinbaseQuestAttestation_succeeds() (gas: 130109)
OptimistTest:test_mint_afterCoinbaseQuestAttestation_succeeds() (gas: 130109)
OptimistTest:test_mint_afterInviteClaimed_succeeds() (gas: 310811)
OptimistTest:test_mint_afterInviteClaimed_succeeds() (gas: 310811)
...
@@ -538,94 +538,94 @@ OptimistTest:test_mint_afterMultipleAttestations_succeeds() (gas: 377472)
...
@@ -538,94 +538,94 @@ OptimistTest:test_mint_afterMultipleAttestations_succeeds() (gas: 377472)
OptimistTest:test_mint_forAlreadyMintedClaimer_reverts() (gas: 117923)
OptimistTest:test_mint_forAlreadyMintedClaimer_reverts() (gas: 117923)
OptimistTest:test_mint_forNonAllowlistedClaimer_reverts() (gas: 29722)
OptimistTest:test_mint_forNonAllowlistedClaimer_reverts() (gas: 29722)
OptimistTest:test_mint_secondaryMinter_succeeds() (gas: 72711)
OptimistTest:test_mint_secondaryMinter_succeeds() (gas: 72711)
OptimistTest:test_multicall_batchingClaimAndMint_succeeds() (gas: 30
8008
)
OptimistTest:test_multicall_batchingClaimAndMint_succeeds() (gas: 30
7999
)
OptimistTest:test_setApprovalForAll_soulbound_reverts() (gas: 74239)
OptimistTest:test_setApprovalForAll_soulbound_reverts() (gas: 74239)
OptimistTest:test_supportsInterface_returnsCorrectInterfaceForERC721_succeeds() (gas: 5805)
OptimistTest:test_supportsInterface_returnsCorrectInterfaceForERC721_succeeds() (gas: 5805)
OptimistTest:test_tokenIdOfAddress_returnsOwnerID_succeeds() (gas: 63730)
OptimistTest:test_tokenIdOfAddress_returnsOwnerID_succeeds() (gas: 63730)
OptimistTest:test_tokenURI_returnsCorrectTokenURI_succeeds() (gas: 195905)
OptimistTest:test_tokenURI_returnsCorrectTokenURI_succeeds() (gas: 195905)
OptimistTest:test_transferFrom_soulbound_reverts() (gas: 75512)
OptimistTest:test_transferFrom_soulbound_reverts() (gas: 75512)
PreimageOracle_Test:test_keccak256PreimageKey_succeeds() (gas: 3
19
)
PreimageOracle_Test:test_keccak256PreimageKey_succeeds() (gas: 3
42
)
PreimageOracle_Test:test_loadKeccak256PreimagePart_outOfBoundsOffset_reverts() (gas: 8971)
PreimageOracle_Test:test_loadKeccak256PreimagePart_outOfBoundsOffset_reverts() (gas: 8971)
PreimageOracle_Test:test_loadKeccak256PreimagePart_succeeds() (gas: 76076)
PreimageOracle_Test:test_loadKeccak256PreimagePart_succeeds() (gas: 76076)
PreimageOracle_Test:test_loadLocalData_multipleContexts_succeeds() (gas: 147718)
PreimageOracle_Test:test_loadLocalData_multipleContexts_succeeds() (gas: 147718)
PreimageOracle_Test:test_loadLocalData_onePart_succeeds() (gas: 75905)
PreimageOracle_Test:test_loadLocalData_onePart_succeeds() (gas: 75905)
PreimageOracle_Test:test_loadLocalData_outOfBoundsOffset_reverts() (gas: 8882)
PreimageOracle_Test:test_loadLocalData_outOfBoundsOffset_reverts() (gas: 8882)
ProtocolVersions_Initialize_Test:test_initialize_events_succeeds() (gas: 41623)
ProtocolVersions_Initialize_Test:test_initialize_events_succeeds() (gas: 41623)
ProtocolVersions_Initialize_Test:test_initialize_values_succeeds() (gas: 450
24
)
ProtocolVersions_Initialize_Test:test_initialize_values_succeeds() (gas: 450
46
)
ProtocolVersions_Setters_TestFail:test_setRecommended_notOwner_reverts() (gas: 155
31
)
ProtocolVersions_Setters_TestFail:test_setRecommended_notOwner_reverts() (gas: 155
53
)
ProtocolVersions_Setters_TestFail:test_setRequired_notOwner_reverts() (gas: 15587)
ProtocolVersions_Setters_TestFail:test_setRequired_notOwner_reverts() (gas: 15587)
ProxyAdmin_Test:test_chugsplashChangeProxyAdmin_succeeds() (gas: 36440)
ProxyAdmin_Test:test_chugsplashChangeProxyAdmin_succeeds() (gas: 36440)
ProxyAdmin_Test:test_chugsplashGetProxyAdmin_succeeds() (gas: 156
75
)
ProxyAdmin_Test:test_chugsplashGetProxyAdmin_succeeds() (gas: 156
10
)
ProxyAdmin_Test:test_chugsplashGetProxyImplementation_succeeds() (gas: 510
84
)
ProxyAdmin_Test:test_chugsplashGetProxyImplementation_succeeds() (gas: 510
40
)
ProxyAdmin_Test:test_chugsplashUpgradeAndCall_succeeds() (gas: 82
311
)
ProxyAdmin_Test:test_chugsplashUpgradeAndCall_succeeds() (gas: 82
239
)
ProxyAdmin_Test:test_chugsplashUpgrade_succeeds() (gas: 489
88
)
ProxyAdmin_Test:test_chugsplashUpgrade_succeeds() (gas: 489
65
)
ProxyAdmin_Test:test_delegateResolvedChangeProxyAdmin_succeeds() (gas: 33936)
ProxyAdmin_Test:test_delegateResolvedChangeProxyAdmin_succeeds() (gas: 33936)
ProxyAdmin_Test:test_delegateResolvedGetProxyAdmin_succeeds() (gas: 176
91
)
ProxyAdmin_Test:test_delegateResolvedGetProxyAdmin_succeeds() (gas: 176
47
)
ProxyAdmin_Test:test_delegateResolvedGetProxyImplementation_succeeds() (gas: 62028)
ProxyAdmin_Test:test_delegateResolvedGetProxyImplementation_succeeds() (gas: 62028)
ProxyAdmin_Test:test_delegateResolvedUpgradeAndCall_succeeds() (gas: 9803
9
)
ProxyAdmin_Test:test_delegateResolvedUpgradeAndCall_succeeds() (gas: 9803
3
)
ProxyAdmin_Test:test_delegateResolvedUpgrade_succeeds() (gas: 58482)
ProxyAdmin_Test:test_delegateResolvedUpgrade_succeeds() (gas: 58482)
ProxyAdmin_Test:test_erc1967ChangeProxyAdmin_succeeds() (gas: 346
74
)
ProxyAdmin_Test:test_erc1967ChangeProxyAdmin_succeeds() (gas: 346
96
)
ProxyAdmin_Test:test_erc1967GetProxyAdmin_succeeds() (gas: 15616)
ProxyAdmin_Test:test_erc1967GetProxyAdmin_succeeds() (gas: 15616)
ProxyAdmin_Test:test_erc1967GetProxyImplementation_succeeds() (gas: 52073)
ProxyAdmin_Test:test_erc1967GetProxyImplementation_succeeds() (gas: 52073)
ProxyAdmin_Test:test_erc1967UpgradeAndCall_succeeds() (gas: 789
71
)
ProxyAdmin_Test:test_erc1967UpgradeAndCall_succeeds() (gas: 789
87
)
ProxyAdmin_Test:test_erc1967Upgrade_succeeds() (gas: 50080)
ProxyAdmin_Test:test_erc1967Upgrade_succeeds() (gas: 50080)
ProxyAdmin_Test:test_isUpgrading_succeeds() (gas: 194
42
)
ProxyAdmin_Test:test_isUpgrading_succeeds() (gas: 194
97
)
ProxyAdmin_Test:test_onlyOwner_notOwner_reverts() (gas: 22767)
ProxyAdmin_Test:test_onlyOwner_notOwner_reverts() (gas: 22767)
ProxyAdmin_Test:test_owner_succeeds() (gas: 9738)
ProxyAdmin_Test:test_owner_succeeds() (gas: 9738)
ProxyAdmin_Test:test_proxyType_succeeds() (gas: 20533)
ProxyAdmin_Test:test_proxyType_succeeds() (gas: 20533)
ProxyAdmin_Test:test_setAddressManager_notOwner_reverts() (gas: 10
578
)
ProxyAdmin_Test:test_setAddressManager_notOwner_reverts() (gas: 10
600
)
ProxyAdmin_Test:test_setImplementationName_notOwner_reverts() (gas: 111
11
)
ProxyAdmin_Test:test_setImplementationName_notOwner_reverts() (gas: 111
56
)
ProxyAdmin_Test:test_setImplementationName_succeeds() (gas: 389
45
)
ProxyAdmin_Test:test_setImplementationName_succeeds() (gas: 389
67
)
ProxyAdmin_Test:test_setProxyType_notOwner_reverts() (gas: 10814)
ProxyAdmin_Test:test_setProxyType_notOwner_reverts() (gas: 10814)
Proxy_Test:test_delegatesToImpl_succeeds() (gas: 45207)
Proxy_Test:test_delegatesToImpl_succeeds() (gas: 45207)
Proxy_Test:test_implementationKey_succeeds() (gas: 209
11
)
Proxy_Test:test_implementationKey_succeeds() (gas: 209
33
)
Proxy_Test:test_implementation_isZeroAddress_reverts() (gas: 476
28
)
Proxy_Test:test_implementation_isZeroAddress_reverts() (gas: 476
50
)
Proxy_Test:test_implementation_zeroAddressCaller_succeeds() (gas: 14752)
Proxy_Test:test_implementation_zeroAddressCaller_succeeds() (gas: 14752)
Proxy_Test:test_ownerKey_succeeds() (gas: 19067)
Proxy_Test:test_ownerKey_succeeds() (gas: 19067)
Proxy_Test:test_ownerProxyCall_notAdmin_succeeds() (gas: 354
77
)
Proxy_Test:test_ownerProxyCall_notAdmin_succeeds() (gas: 354
99
)
Proxy_Test:test_proxyCallToImp_notAdmin_succeeds() (gas: 30010)
Proxy_Test:test_proxyCallToImp_notAdmin_succeeds() (gas: 30010)
Proxy_Test:test_upgradeToAndCall_functionDoesNotExist_reverts() (gas: 1079
80
)
Proxy_Test:test_upgradeToAndCall_functionDoesNotExist_reverts() (gas: 1079
35
)
Proxy_Test:test_upgradeToAndCall_isPayable_succeeds() (gas: 53744)
Proxy_Test:test_upgradeToAndCall_isPayable_succeeds() (gas: 53744)
Proxy_Test:test_upgradeToAndCall_succeeds() (gas: 125
192
)
Proxy_Test:test_upgradeToAndCall_succeeds() (gas: 125
214
)
Proxy_Test:test_upgradeTo_clashingFunctionSignatures_succeeds() (gas: 101363)
Proxy_Test:test_upgradeTo_clashingFunctionSignatures_succeeds() (gas: 101363)
RLPReader_readBytes_Test:test_readBytes_bytestring00_succeeds() (gas: 18
41
)
RLPReader_readBytes_Test:test_readBytes_bytestring00_succeeds() (gas: 18
63
)
RLPReader_readBytes_Test:test_readBytes_bytestring01_succeeds() (gas: 18
18
)
RLPReader_readBytes_Test:test_readBytes_bytestring01_succeeds() (gas: 18
40
)
RLPReader_readBytes_Test:test_readBytes_bytestring7f_succeeds() (gas: 1861)
RLPReader_readBytes_Test:test_readBytes_bytestring7f_succeeds() (gas: 1861)
RLPReader_readBytes_Test:test_readBytes_invalidListLength_reverts() (gas: 39
46
)
RLPReader_readBytes_Test:test_readBytes_invalidListLength_reverts() (gas: 39
03
)
RLPReader_readBytes_Test:test_readBytes_invalidPrefix_reverts() (gas: 3961)
RLPReader_readBytes_Test:test_readBytes_invalidPrefix_reverts() (gas: 3961)
RLPReader_readBytes_Test:test_readBytes_invalidRemainder_reverts() (gas: 4155)
RLPReader_readBytes_Test:test_readBytes_invalidRemainder_reverts() (gas: 4155)
RLPReader_readBytes_Test:test_readBytes_invalidStringLength_reverts() (gas: 3857)
RLPReader_readBytes_Test:test_readBytes_invalidStringLength_reverts() (gas: 3857)
RLPReader_readBytes_Test:test_readBytes_revertListItem_reverts() (gas: 3998)
RLPReader_readBytes_Test:test_readBytes_revertListItem_reverts() (gas: 3998)
RLPReader_readList_Test:test_readList_dictTest1_succeeds() (gas: 23140)
RLPReader_readList_Test:test_readList_dictTest1_succeeds() (gas: 23140)
RLPReader_readList_Test:test_readList_empty_succeeds() (gas: 4610)
RLPReader_readList_Test:test_readList_empty_succeeds() (gas: 4610)
RLPReader_readList_Test:test_readList_incorrectLengthInArray_reverts() (gas: 39
54
)
RLPReader_readList_Test:test_readList_incorrectLengthInArray_reverts() (gas: 39
76
)
RLPReader_readList_Test:test_readList_int32Overflow2_reverts() (gas: 4139)
RLPReader_readList_Test:test_readList_int32Overflow2_reverts() (gas: 4139)
RLPReader_readList_Test:test_readList_int32Overflow_reverts() (gas: 41
16
)
RLPReader_readList_Test:test_readList_int32Overflow_reverts() (gas: 41
38
)
RLPReader_readList_Test:test_readList_invalidRemainder_reverts() (gas: 4114)
RLPReader_readList_Test:test_readList_invalidRemainder_reverts() (gas: 4114)
RLPReader_readList_Test:test_readList_invalidShortList_reverts() (gas: 3967)
RLPReader_readList_Test:test_readList_invalidShortList_reverts() (gas: 3967)
RLPReader_readList_Test:test_readList_invalidValue_reverts() (gas: 3878)
RLPReader_readList_Test:test_readList_invalidValue_reverts() (gas: 3878)
RLPReader_readList_Test:test_readList_leadingZerosInLongLengthArray1_reverts() (gas: 3982)
RLPReader_readList_Test:test_readList_leadingZerosInLongLengthArray1_reverts() (gas: 3982)
RLPReader_readList_Test:test_readList_leadingZerosInLongLengthArray2_reverts() (gas: 39
68
)
RLPReader_readList_Test:test_readList_leadingZerosInLongLengthArray2_reverts() (gas: 39
45
)
RLPReader_readList_Test:test_readList_leadingZerosInLongLengthList1_reverts() (gas: 3984)
RLPReader_readList_Test:test_readList_leadingZerosInLongLengthList1_reverts() (gas: 3984)
RLPReader_readList_Test:test_readList_listLongerThan32Elements_reverts() (gas: 38
590
)
RLPReader_readList_Test:test_readList_listLongerThan32Elements_reverts() (gas: 38
612
)
RLPReader_readList_Test:test_readList_listOfLists2_succeeds() (gas: 12122)
RLPReader_readList_Test:test_readList_listOfLists2_succeeds() (gas: 12122)
RLPReader_readList_Test:test_readList_listOfLists_succeeds() (gas: 94
50
)
RLPReader_readList_Test:test_readList_listOfLists_succeeds() (gas: 94
72
)
RLPReader_readList_Test:test_readList_longList1_succeeds() (gas: 283
32
)
RLPReader_readList_Test:test_readList_longList1_succeeds() (gas: 283
54
)
RLPReader_readList_Test:test_readList_longList2_succeeds() (gas: 1963
95
)
RLPReader_readList_Test:test_readList_longList2_succeeds() (gas: 1963
52
)
RLPReader_readList_Test:test_readList_longListLessThan56Bytes_reverts() (gas: 40
46
)
RLPReader_readList_Test:test_readList_longListLessThan56Bytes_reverts() (gas: 40
23
)
RLPReader_readList_Test:test_readList_longStringLength_reverts() (gas: 39
24
)
RLPReader_readList_Test:test_readList_longStringLength_reverts() (gas: 39
46
)
RLPReader_readList_Test:test_readList_longStringLessThan56Bytes_reverts() (gas: 4009)
RLPReader_readList_Test:test_readList_longStringLessThan56Bytes_reverts() (gas: 4009)
RLPReader_readList_Test:test_readList_multiList_succeeds() (gas: 11
737
)
RLPReader_readList_Test:test_readList_multiList_succeeds() (gas: 11
695
)
RLPReader_readList_Test:test_readList_nonOptimalLongLengthArray1_reverts() (gas: 3999)
RLPReader_readList_Test:test_readList_nonOptimalLongLengthArray1_reverts() (gas: 3999)
RLPReader_readList_Test:test_readList_nonOptimalLongLengthArray2_reverts() (gas: 40
22
)
RLPReader_readList_Test:test_readList_nonOptimalLongLengthArray2_reverts() (gas: 40
44
)
RLPReader_readList_Test:test_readList_notEnoughContentForList1_reverts() (gas: 4115)
RLPReader_readList_Test:test_readList_notEnoughContentForList1_reverts() (gas: 4115)
RLPReader_readList_Test:test_readList_notEnoughContentForList2_reverts() (gas: 41
61
)
RLPReader_readList_Test:test_readList_notEnoughContentForList2_reverts() (gas: 41
17
)
RLPReader_readList_Test:test_readList_notEnoughContentForString1_reverts() (gas: 4072)
RLPReader_readList_Test:test_readList_notEnoughContentForString1_reverts() (gas: 4072)
RLPReader_readList_Test:test_readList_notEnoughContentForString2_reverts() (gas: 4
138
)
RLPReader_readList_Test:test_readList_notEnoughContentForString2_reverts() (gas: 4
094
)
RLPReader_readList_Test:test_readList_notLongEnough_reverts() (gas: 3955)
RLPReader_readList_Test:test_readList_notLongEnough_reverts() (gas: 3955)
RLPReader_readList_Test:test_readList_shortListMax1_succeeds() (gas: 39
580
)
RLPReader_readList_Test:test_readList_shortListMax1_succeeds() (gas: 39
602
)
RLPWriter_writeList_Test:test_writeList_dictTest1_succeeds() (gas: 36979)
RLPWriter_writeList_Test:test_writeList_dictTest1_succeeds() (gas: 36979)
RLPWriter_writeList_Test:test_writeList_empty_succeeds() (gas: 16
66
)
RLPWriter_writeList_Test:test_writeList_empty_succeeds() (gas: 16
89
)
RLPWriter_writeList_Test:test_writeList_listoflists2_succeeds() (gas: 16566)
RLPWriter_writeList_Test:test_writeList_listoflists2_succeeds() (gas: 16566)
RLPWriter_writeList_Test:test_writeList_listoflists_succeeds() (gas: 10841)
RLPWriter_writeList_Test:test_writeList_listoflists_succeeds() (gas: 10841)
RLPWriter_writeList_Test:test_writeList_longlist1_succeeds() (gas: 40383)
RLPWriter_writeList_Test:test_writeList_longlist1_succeeds() (gas: 40383)
...
@@ -634,23 +634,23 @@ RLPWriter_writeList_Test:test_writeList_multiList_succeeds() (gas: 22446)
...
@@ -634,23 +634,23 @@ RLPWriter_writeList_Test:test_writeList_multiList_succeeds() (gas: 22446)
RLPWriter_writeList_Test:test_writeList_shortListMax1_succeeds() (gas: 36793)
RLPWriter_writeList_Test:test_writeList_shortListMax1_succeeds() (gas: 36793)
RLPWriter_writeList_Test:test_writeList_stringList_succeeds() (gas: 10697)
RLPWriter_writeList_Test:test_writeList_stringList_succeeds() (gas: 10697)
RLPWriter_writeString_Test:test_writeString_bytestring00_succeeds() (gas: 929)
RLPWriter_writeString_Test:test_writeString_bytestring00_succeeds() (gas: 929)
RLPWriter_writeString_Test:test_writeString_bytestring01_succeeds() (gas: 9
06
)
RLPWriter_writeString_Test:test_writeString_bytestring01_succeeds() (gas: 9
51
)
RLPWriter_writeString_Test:test_writeString_bytestring7f_succeeds() (gas: 972)
RLPWriter_writeString_Test:test_writeString_bytestring7f_succeeds() (gas: 972)
RLPWriter_writeString_Test:test_writeString_empty_succeeds() (gas: 1611)
RLPWriter_writeString_Test:test_writeString_empty_succeeds() (gas: 1611)
RLPWriter_writeString_Test:test_writeString_longstring2_succeeds() (gas: 258768)
RLPWriter_writeString_Test:test_writeString_longstring2_succeeds() (gas: 258768)
RLPWriter_writeString_Test:test_writeString_longstring_succeeds() (gas: 169
39
)
RLPWriter_writeString_Test:test_writeString_longstring_succeeds() (gas: 169
61
)
RLPWriter_writeString_Test:test_writeString_shortstring2_succeeds() (gas: 15376)
RLPWriter_writeString_Test:test_writeString_shortstring2_succeeds() (gas: 15376)
RLPWriter_writeString_Test:test_writeString_shortstring_succeeds() (gas: 2470)
RLPWriter_writeString_Test:test_writeString_shortstring_succeeds() (gas: 2470)
RLPWriter_writeUint_Test:test_writeUint_mediumint2_succeeds() (gas: 8
699
)
RLPWriter_writeUint_Test:test_writeUint_mediumint2_succeeds() (gas: 8
721
)
RLPWriter_writeUint_Test:test_writeUint_mediumint3_succeeds() (gas: 9098)
RLPWriter_writeUint_Test:test_writeUint_mediumint3_succeeds() (gas: 9098)
RLPWriter_writeUint_Test:test_writeUint_mediumint_succeeds() (gas: 83
80
)
RLPWriter_writeUint_Test:test_writeUint_mediumint_succeeds() (gas: 83
57
)
RLPWriter_writeUint_Test:test_writeUint_smallint2_succeeds() (gas: 7249)
RLPWriter_writeUint_Test:test_writeUint_smallint2_succeeds() (gas: 7249)
RLPWriter_writeUint_Test:test_writeUint_smallint3_succeeds() (gas: 7271)
RLPWriter_writeUint_Test:test_writeUint_smallint3_succeeds() (gas: 7271)
RLPWriter_writeUint_Test:test_writeUint_smallint4_succeeds() (gas: 72
50
)
RLPWriter_writeUint_Test:test_writeUint_smallint4_succeeds() (gas: 72
72
)
RLPWriter_writeUint_Test:test_writeUint_smallint_succeeds() (gas: 72
94
)
RLPWriter_writeUint_Test:test_writeUint_smallint_succeeds() (gas: 72
50
)
RLPWriter_writeUint_Test:test_writeUint_zero_succeeds() (gas: 77
77
)
RLPWriter_writeUint_Test:test_writeUint_zero_succeeds() (gas: 77
34
)
ResolvedDelegateProxy_Test:test_fallback_addressManagerNotSet_reverts() (gas: 6059
06
)
ResolvedDelegateProxy_Test:test_fallback_addressManagerNotSet_reverts() (gas: 6059
28
)
ResolvedDelegateProxy_Test:test_fallback_delegateCallBar_reverts() (gas: 24
783
)
ResolvedDelegateProxy_Test:test_fallback_delegateCallBar_reverts() (gas: 24
805
)
ResourceMetering_Test:test_meter_denominatorEq1_reverts() (gas: 20024064)
ResourceMetering_Test:test_meter_denominatorEq1_reverts() (gas: 20024064)
ResourceMetering_Test:test_meter_initialResourceParams_succeeds() (gas: 12423)
ResourceMetering_Test:test_meter_initialResourceParams_succeeds() (gas: 12423)
ResourceMetering_Test:test_meter_updateNoGasDelta_succeeds() (gas: 2011591)
ResourceMetering_Test:test_meter_updateNoGasDelta_succeeds() (gas: 2011591)
...
@@ -660,25 +660,25 @@ ResourceMetering_Test:test_meter_updateTenEmptyBlocks_succeeds() (gas: 23747)
...
@@ -660,25 +660,25 @@ ResourceMetering_Test:test_meter_updateTenEmptyBlocks_succeeds() (gas: 23747)
ResourceMetering_Test:test_meter_updateTwoEmptyBlocks_succeeds() (gas: 23703)
ResourceMetering_Test:test_meter_updateTwoEmptyBlocks_succeeds() (gas: 23703)
ResourceMetering_Test:test_meter_useMax_succeeds() (gas: 20020816)
ResourceMetering_Test:test_meter_useMax_succeeds() (gas: 20020816)
ResourceMetering_Test:test_meter_useMoreThanMax_reverts() (gas: 19549)
ResourceMetering_Test:test_meter_useMoreThanMax_reverts() (gas: 19549)
SafeCall_Test:test_callWithMinGas_noLeakageHigh_succeeds() (gas: 102
1670598
)
SafeCall_Test:test_callWithMinGas_noLeakageHigh_succeeds() (gas: 102
0805932
)
SafeCall_Test:test_callWithMinGas_noLeakageLow_succeeds() (gas: 109
5190688
)
SafeCall_Test:test_callWithMinGas_noLeakageLow_succeeds() (gas: 109
4905711
)
SequencerFeeVault_L2Withdrawal_Test:test_withdraw_toL2_succeeds() (gas: 80640)
SequencerFeeVault_L2Withdrawal_Test:test_withdraw_toL2_succeeds() (gas: 80640)
SequencerFeeVault_L2Withdrawal_Test:test_withdraw_toL2recipientReverts_fails() (gas: 489
26
)
SequencerFeeVault_L2Withdrawal_Test:test_withdraw_toL2recipientReverts_fails() (gas: 489
48
)
SequencerFeeVault_Test:test_constructor_succeeds() (gas: 7705)
SequencerFeeVault_Test:test_constructor_succeeds() (gas: 7705)
SequencerFeeVault_Test:test_minWithdrawalAmount_succeeds() (gas: 12
816
)
SequencerFeeVault_Test:test_minWithdrawalAmount_succeeds() (gas: 12
794
)
SequencerFeeVault_Test:test_receive_succeeds() (gas: 17395)
SequencerFeeVault_Test:test_receive_succeeds() (gas: 17395)
SequencerFeeVault_Test:test_withdraw_notEnough_reverts() (gas: 9399)
SequencerFeeVault_Test:test_withdraw_notEnough_reverts() (gas: 9399)
SequencerFeeVault_Test:test_withdraw_toL1_succeeds() (gas: 618343)
SequencerFeeVault_Test:test_withdraw_toL1_succeeds() (gas: 618343)
SetPrevBaseFee_Test:test_setPrevBaseFee_succeeds() (gas: 11595)
SetPrevBaseFee_Test:test_setPrevBaseFee_succeeds() (gas: 11595)
StandardBridge_Stateless_Test:test_isCorrectTokenPair_succeeds() (gas: 501
81
)
StandardBridge_Stateless_Test:test_isCorrectTokenPair_succeeds() (gas: 501
49
)
StandardBridge_Stateless_Test:test_isOptimismMintableERC20_succeeds() (gas: 33142)
StandardBridge_Stateless_Test:test_isOptimismMintableERC20_succeeds() (gas: 33142)
Storage_Roundtrip_Test:test_setGetAddress_succeeds(bytes32,address) (runs: 64, μ: 315
10, ~: 31821
)
Storage_Roundtrip_Test:test_setGetAddress_succeeds(bytes32,address) (runs: 64, μ: 315
32, ~: 31843
)
Storage_Roundtrip_Test:test_setGetBytes32_succeeds(bytes32,bytes32) (runs: 64, μ: 31
598, ~: 31598
)
Storage_Roundtrip_Test:test_setGetBytes32_succeeds(bytes32,bytes32) (runs: 64, μ: 31
620, ~: 31620
)
Storage_Roundtrip_Test:test_setGetUint_succeeds(bytes32,uint256) (runs: 64, μ: 30731, ~: 31664)
Storage_Roundtrip_Test:test_setGetUint_succeeds(bytes32,uint256) (runs: 64, μ: 30731, ~: 31664)
SystemConfig_Initialize_Test:test_initialize_events_succeeds() (gas: 8818
8
)
SystemConfig_Initialize_Test:test_initialize_events_succeeds() (gas: 8818
6
)
SystemConfig_Initialize_Test:test_initialize_startBlockNoop_reverts() (gas: 772
53
)
SystemConfig_Initialize_Test:test_initialize_startBlockNoop_reverts() (gas: 772
16
)
SystemConfig_Initialize_Test:test_initialize_startBlockOverride_succeeds() (gas: 81116)
SystemConfig_Initialize_Test:test_initialize_startBlockOverride_succeeds() (gas: 81116)
SystemConfig_Initialize_Test:test_initialize_values_succeeds() (gas: 885
01
)
SystemConfig_Initialize_Test:test_initialize_values_succeeds() (gas: 885
46
)
SystemConfig_Initialize_TestFail:test_initialize_lowGasLimit_reverts() (gas: 59900)
SystemConfig_Initialize_TestFail:test_initialize_lowGasLimit_reverts() (gas: 59900)
SystemConfig_Setters_TestFail:test_setBatcherHash_notOwner_reverts() (gas: 15675)
SystemConfig_Setters_TestFail:test_setBatcherHash_notOwner_reverts() (gas: 15675)
SystemConfig_Setters_TestFail:test_setGasConfig_notOwner_reverts() (gas: 15644)
SystemConfig_Setters_TestFail:test_setGasConfig_notOwner_reverts() (gas: 15644)
...
@@ -689,10 +689,10 @@ SystemConfig_Setters_TestFail:test_setResourceConfig_lowGasLimit_reverts() (gas:
...
@@ -689,10 +689,10 @@ SystemConfig_Setters_TestFail:test_setResourceConfig_lowGasLimit_reverts() (gas:
SystemConfig_Setters_TestFail:test_setResourceConfig_notOwner_reverts() (gas: 16867)
SystemConfig_Setters_TestFail:test_setResourceConfig_notOwner_reverts() (gas: 16867)
SystemConfig_Setters_TestFail:test_setResourceConfig_zeroDenominator_reverts() (gas: 18629)
SystemConfig_Setters_TestFail:test_setResourceConfig_zeroDenominator_reverts() (gas: 18629)
SystemConfig_Setters_TestFail:test_setUnsafeBlockSigner_notOwner_reverts() (gas: 15658)
SystemConfig_Setters_TestFail:test_setUnsafeBlockSigner_notOwner_reverts() (gas: 15658)
TransactorTest:test_call_succeeds() (gas: 267
09
)
TransactorTest:test_call_succeeds() (gas: 267
54
)
TransactorTest:test_call_unauthorized_reverts() (gas: 181
17
)
TransactorTest:test_call_unauthorized_reverts() (gas: 181
39
)
TransactorTest:test_constructor_succeeds() (gas: 9
739
)
TransactorTest:test_constructor_succeeds() (gas: 9
673
)
TransactorTest:test_delegateCall_succeeds() (gas: 209
09
)
TransactorTest:test_delegateCall_succeeds() (gas: 209
31
)
TransactorTest:test_delegateCall_unauthorized_reverts() (gas: 18124)
TransactorTest:test_delegateCall_unauthorized_reverts() (gas: 18124)
TransferOnionTest:test_constructor_succeeds() (gas: 564
855
)
TransferOnionTest:test_constructor_succeeds() (gas: 564
789
)
TransferOnionTest:test_unwrap_succeeds() (gas: 724955)
TransferOnionTest:test_unwrap_succeeds() (gas: 724955)
\ No newline at end of file
packages/contracts-bedrock/.gitignore
View file @
37b2b0f0
...
@@ -26,3 +26,6 @@ deployments/1337
...
@@ -26,3 +26,6 @@ deployments/1337
# Devnet config which changes with each 'make devnet-up'
# Devnet config which changes with each 'make devnet-up'
deploy-config/devnetL1.json
deploy-config/devnetL1.json
# Getting Started guide deploy config
deploy-config/getting-started.json
packages/contracts-bedrock/invariant-docs/SystemConfig.md
View file @
37b2b0f0
# `SystemConfig` Invariants
# `SystemConfig` Invariants
## The gas limit of the `SystemConfig` contract can never be lower than the hard-coded lower bound.
## The gas limit of the `SystemConfig` contract can never be lower than the hard-coded lower bound.
**Test:**
[
`SystemConfig.t.sol#L
80`
](
../test/invariants/SystemConfig.t.sol#L8
0
)
**Test:**
[
`SystemConfig.t.sol#L
70`
](
../test/invariants/SystemConfig.t.sol#L7
0
)
forge-std
@
37a37ab7
Subproject commit
e8a047e3f40f13fa37af6fe14e6e06283d9a060e
Subproject commit
37a37ab73364d6644bfe11edf88a07880f99bd56
packages/contracts-bedrock/scripts/Deployer.sol
View file @
37b2b0f0
...
@@ -284,7 +284,7 @@ abstract contract Deployer is Script {
...
@@ -284,7 +284,7 @@ abstract contract Deployer is Script {
}
}
/// @notice Returns the contract name from a deploy transaction.
/// @notice Returns the contract name from a deploy transaction.
function _getContractNameFromDeployTransaction(string memory _deployTx) internal returns (string memory) {
function _getContractNameFromDeployTransaction(string memory _deployTx) internal
pure
returns (string memory) {
return stdJson.readString(_deployTx, ".contractName");
return stdJson.readString(_deployTx, ".contractName");
}
}
...
...
packages/contracts-bedrock/
deploy-config/getting-started.json
→
packages/contracts-bedrock/
scripts/getting-started/config.sh
100644 → 100755
View file @
37b2b0f0
#!/usr/bin/env bash
# This script is used to generate the getting-started.json configuration file
# used in the Getting Started quickstart guide on the docs site. Avoids the
# need to have the getting-started.json committed to the repo since it's an
# invalid JSON file when not filled in, which is annoying.
reqenv
()
{
if
[
-z
"
${
!1
}
"
]
;
then
echo
"Error: environment variable '
$1
' is undefined"
exit
1
fi
}
# Check required environment variables
reqenv
"GS_ADMIN_ADDRESS"
reqenv
"GS_BATCHER_ADDRESS"
reqenv
"GS_PROPOSER_ADDRESS"
reqenv
"GS_SEQUENCER_ADDRESS"
reqenv
"L1_RPC_URL"
# Get the finalized block timestamp and hash
block
=
$(
cast block finalized
--rpc-url
$L1_RPC_URL
)
timestamp
=
$(
echo
"
$block
"
|
awk
'/timestamp/ { print $2 }'
)
blockhash
=
$(
echo
"
$block
"
|
awk
'/hash/ { print $2 }'
)
# Generate the config file
config
=
$(
cat
<<
EOL
{
{
"finalSystemOwner"
:
"
ADMIN
"
,
"finalSystemOwner": "
$GS_ADMIN_ADDRESS
",
"portalGuardian"
:
"
ADMIN
"
,
"portalGuardian": "
$GS_ADMIN_ADDRESS
",
"l1StartingBlockTag"
:
"
BLOCKHASH
"
,
"l1StartingBlockTag": "
$blockhash
",
"l1ChainID"
:
5
,
"l1ChainID":
11155111
,
"l2ChainID": 42069,
"l2ChainID": 42069,
"l2BlockTime": 2,
"l2BlockTime": 2,
"l1BlockTime": 12,
"l1BlockTime": 12,
...
@@ -13,23 +41,23 @@
...
@@ -13,23 +41,23 @@
"sequencerWindowSize": 3600,
"sequencerWindowSize": 3600,
"channelTimeout": 300,
"channelTimeout": 300,
"p2pSequencerAddress"
:
"
SEQUENCER
"
,
"p2pSequencerAddress": "
$GS_SEQUENCER_ADDRESS
",
"batchInboxAddress": "0xff00000000000000000000000000000000042069",
"batchInboxAddress": "0xff00000000000000000000000000000000042069",
"batchSenderAddress"
:
"
BATCHER
"
,
"batchSenderAddress": "
$GS_BATCHER_ADDRESS
",
"l2OutputOracleSubmissionInterval": 120,
"l2OutputOracleSubmissionInterval": 120,
"l2OutputOracleStartingBlockNumber": 0,
"l2OutputOracleStartingBlockNumber": 0,
"l2OutputOracleStartingTimestamp"
:
TIMESTAMP
,
"l2OutputOracleStartingTimestamp":
$timestamp
,
"l2OutputOracleProposer"
:
"
PROPOSER
"
,
"l2OutputOracleProposer": "
$GS_PROPOSER_ADDRESS
",
"l2OutputOracleChallenger"
:
"
ADMIN
"
,
"l2OutputOracleChallenger": "
$GS_ADMIN_ADDRESS
",
"finalizationPeriodSeconds": 12,
"finalizationPeriodSeconds": 12,
"proxyAdminOwner"
:
"
ADMIN
"
,
"proxyAdminOwner": "
$GS_ADMIN_ADDRESS
",
"baseFeeVaultRecipient"
:
"
ADMIN
"
,
"baseFeeVaultRecipient": "
$GS_ADMIN_ADDRESS
",
"l1FeeVaultRecipient"
:
"
ADMIN
"
,
"l1FeeVaultRecipient": "
$GS_ADMIN_ADDRESS
",
"sequencerFeeVaultRecipient"
:
"
ADMIN
"
,
"sequencerFeeVaultRecipient": "
$GS_ADMIN_ADDRESS
",
"baseFeeVaultMinimumWithdrawalAmount": "0x8ac7230489e80000",
"baseFeeVaultMinimumWithdrawalAmount": "0x8ac7230489e80000",
"l1FeeVaultMinimumWithdrawalAmount": "0x8ac7230489e80000",
"l1FeeVaultMinimumWithdrawalAmount": "0x8ac7230489e80000",
...
@@ -44,7 +72,7 @@
...
@@ -44,7 +72,7 @@
"enableGovernance": true,
"enableGovernance": true,
"governanceTokenSymbol": "OP",
"governanceTokenSymbol": "OP",
"governanceTokenName": "Optimism",
"governanceTokenName": "Optimism",
"governanceTokenOwner"
:
"
ADMIN
"
,
"governanceTokenOwner": "
$GS_ADMIN_ADDRESS
",
"l2GenesisBlockGasLimit": "0x1c9c380",
"l2GenesisBlockGasLimit": "0x1c9c380",
"l2GenesisBlockBaseFeePerGas": "0x3b9aca00",
"l2GenesisBlockBaseFeePerGas": "0x3b9aca00",
...
@@ -59,3 +87,8 @@
...
@@ -59,3 +87,8 @@
"requiredProtocolVersion": "0x0000000000000000000000000000000000000000000000000000000000000000",
"requiredProtocolVersion": "0x0000000000000000000000000000000000000000000000000000000000000000",
"recommendedProtocolVersion": "0x0000000000000000000000000000000000000000000000000000000000000000"
"recommendedProtocolVersion": "0x0000000000000000000000000000000000000000000000000000000000000000"
}
}
EOL
)
# Write the config file
echo
"
$config
"
>
deploy-config/getting-started.json
packages/contracts-bedrock/scripts/getting-started/versions.sh
0 → 100755
View file @
37b2b0f0
#!/usr/bin/env bash
# This script prints out the versions of the various tools used in the Getting
# Started quickstart guide on the docs site. Simplifies things for users so
# they can easily see if they're using the right versions of everything.
version
()
{
local
string
=
$1
local
version_regex
=
'([0-9]+(\.[0-9]+)+)'
if
[[
$string
=
~
$version_regex
]]
;
then
echo
"
${
BASH_REMATCH
[1]
}
"
else
echo
"No version found."
fi
}
# Grab versions
ver_git
=
$(
version
"
$(
git
--version
)
"
)
ver_go
=
$(
version
"
$(
go version
)
"
)
ver_node
=
$(
version
"
$(
node
--version
)
"
)
ver_pnpm
=
$(
version
"
$(
pnpm
--version
)
"
)
ver_foundry
=
$(
version
"
$(
forge
--version
)
"
)
ver_make
=
$(
version
"
$(
make
--version
)
"
)
ver_jq
=
$(
version
"
$(
jq
--version
)
"
)
ver_direnv
=
$(
version
"
$(
direnv
--version
)
"
)
# Print versions
echo
"Dependency | Minimum | Actual"
echo
"git 2
$ver_git
"
echo
"go 1.21
$ver_go
"
echo
"node 20
$ver_node
"
echo
"pnpm 8
$ver_pnpm
"
echo
"foundry 0.2.0
$ver_foundry
"
echo
"make 3
$ver_make
"
echo
"jq 1.6
$ver_jq
"
echo
"direnv 2
$ver_direnv
"
packages/contracts-bedrock/scripts/getting-started/wallets.sh
0 → 100755
View file @
37b2b0f0
#!/usr/bin/env bash
# This script is used to generate the four wallets that are used in the Getting
# Started quickstart guide on the docs site. Simplifies things for users
# slightly while also avoiding the need for users to manually copy/paste a
# bunch of stuff over to the environment file.
# Generate wallets
wallet1
=
$(
cast wallet new
)
wallet2
=
$(
cast wallet new
)
wallet3
=
$(
cast wallet new
)
wallet4
=
$(
cast wallet new
)
# Grab wallet addresses
address1
=
$(
echo
"
$wallet1
"
|
awk
'/Address/ { print $2 }'
)
address2
=
$(
echo
"
$wallet2
"
|
awk
'/Address/ { print $2 }'
)
address3
=
$(
echo
"
$wallet3
"
|
awk
'/Address/ { print $2 }'
)
address4
=
$(
echo
"
$wallet4
"
|
awk
'/Address/ { print $2 }'
)
# Grab wallet private keys
key1
=
$(
echo
"
$wallet1
"
|
awk
'/Private key/ { print $3 }'
)
key2
=
$(
echo
"
$wallet2
"
|
awk
'/Private key/ { print $3 }'
)
key3
=
$(
echo
"
$wallet3
"
|
awk
'/Private key/ { print $3 }'
)
key4
=
$(
echo
"
$wallet4
"
|
awk
'/Private key/ { print $3 }'
)
# Print out the environment variables to copy
echo
"Copy the following into your .envrc file:"
echo
echo
"# Admin account"
echo
"export GS_ADMIN_ADDRESS=
$address1
"
echo
"export GS_ADMIN_PRIVATE_KEY=
$key1
"
echo
echo
"# Batcher account"
echo
"export GS_BATCHER_ADDRESS=
$address2
"
echo
"export GS_BATCHER_PRIVATE_KEY=
$key2
"
echo
echo
"# Proposer account"
echo
"export GS_PROPOSER_ADDRESS=
$address3
"
echo
"export GS_PROPOSER_PRIVATE_KEY=
$key3
"
echo
echo
"# Sequencer account"
echo
"export GS_SEQUENCER_ADDRESS=
$address4
"
echo
"export GS_SEQUENCER_PRIVATE_KEY=
$key4
"
packages/contracts-bedrock/scripts/upgrades/Multichain.s.sol
deleted
100644 → 0
View file @
99e1b2a1
// SPDX-License-Identifier: MIT
pragma solidity 0.8.15;
import { console } from "forge-std/console.sol";
import { SafeBuilder } from "../universal/SafeBuilder.sol";
import { IMulticall3 } from "forge-std/interfaces/IMulticall3.sol";
import { IGnosisSafe, Enum } from "../interfaces/IGnosisSafe.sol";
import { LibSort } from "../libraries/LibSort.sol";
import { ProxyAdmin } from "src/universal/ProxyAdmin.sol";
import { Constants } from "src/libraries/Constants.sol";
import { SystemConfig } from "src/L1/SystemConfig.sol";
import { ResourceMetering } from "src/L1/ResourceMetering.sol";
import { DeployConfig } from "scripts/DeployConfig.s.sol";
import { SystemConfig } from "src/L1/SystemConfig.sol";
import { L1StandardBridge } from "src/L1/L1StandardBridge.sol";
import { L2OutputOracle } from "src/L1/L2OutputOracle.sol";
import { OptimismPortal } from "src/L1/OptimismPortal.sol";
import { L1CrossDomainMessenger } from "src/L1/L1CrossDomainMessenger.sol";
import { OptimismMintableERC20Factory } from "src/universal/OptimismMintableERC20Factory.sol";
import { L1ERC721Bridge } from "src/L1/L1ERC721Bridge.sol";
import { Predeploys } from "src/libraries/Predeploys.sol";
/// @title Multichain
/// @notice Upgrade script for upgrading the L1 contracts after the multichain upgrade.
/// This upgrade involves all of the contracts having the same implementations.
/// The implementation addresses are known ahead of time.
/// Configure the network using the `NETWORK` env var, the options are:
/// `goerli-prod`, `chaosnet` and `devnet`.
contract Multichain is SafeBuilder {
/// @notice Address of the ProxyAdmin, passed in via constructor of `run`.
ProxyAdmin internal PROXY_ADMIN;
/// @notice An instance of the deployconfig contract, the NETWORK env var determines
/// which file is read from disk to populate this contract.
DeployConfig internal cfg;
/// @notice Represents a set of L1 contracts. Used to represent a set of proxies.
struct ContractSet {
address L1CrossDomainMessenger;
address L1StandardBridge;
address L2OutputOracle;
address OptimismMintableERC20Factory;
address OptimismPortal;
address SystemConfig;
address L1ERC721Bridge;
}
/// @notice Possible value of NETWORK env var, for goerli
string internal constant GOERLI_PROD = "goerli-prod";
/// @notice Possible value of NETWORK env var, for chaosnet
string internal constant CHAOSNET = "chaosnet";
/// @notice Possible value of NETWORK env var, for devnet
string internal constant DEVNET = "devnet";
/// @notice Digest of goerli-prod for comparison purposes
bytes32 internal goerli = keccak256(bytes(GOERLI_PROD));
/// @notice Digest of chaosnet for comparison purposes
bytes32 internal chaosnet = keccak256(bytes(CHAOSNET));
/// @notice Digest of devnet for comparison purposes
bytes32 internal devnet = keccak256(bytes(DEVNET));
/// @notice L1CrossDomainMessenger implementation to upgrade to
address internal constant L1CrossDomainMessengerImplementation = 0xb5df97bB67f5AA7254d40E1B7034bBFF7F183a38;
/// @notice L1StandardBridge implementation to upgrade to
address internal constant L1StandardBridgeImplementation = 0xd9aA10f75a2a93Bfc73AaDD41ae777e900CEdBc9;
/// @notice L2OutputOracle implementation to upgrade to
address internal constant L2OutputOracleImplementation = 0xaBd96C062c6B640d5670455E9d1cD98383Dd23CA;
/// @notice OptimismMintableERC20Factory to upgrade to
address internal constant OptimismMintableERC20FactoryImplementation = 0xdfe97868233d1aa22e815a266982f2cf17685a27;
/// @notice OptimismPortal implementation to upgrade to
address internal constant OptimismPortalImplementation = 0x345D27c7B6C90fef5beA9631037C36119f4bF93e;
/// @notice SystemConfig implementation to upgrade to
address internal constant SystemConfigImplementation = 0x543bA4AADBAb8f9025686Bd03993043599c6fB04;
/// @notice L1ERC721Bridge implementation to upgrade to
address internal constant L1ERC721BridgeImplementation = 0x53C115eD8D9902f4999fDBd8B93Ea79BF37cb588;
/// @notice A mapping of deployment name to ContractSet of proxy addresses.
ContractSet internal proxies;
/// @notice The expected versions for the contracts to be upgraded to.
string internal constant L1CrossDomainMessengerVersion = "1.5.1";
string internal constant L1StandardBridgeVersion = "1.2.1";
string internal constant L2OutputOracleVersion = "1.4.1";
string internal constant OptimismMintableERC20FactoryVersion = "1.3.0";
string internal constant OptimismPortalVersion = "1.8.1";
string internal constant SystemConfigVersion = "1.6.0";
string internal constant L1ERC721BridgeVersion = "1.2.1";
/// @notice The value of the NETWORK env var
string internal NETWORK;
// @notice Cache a non view function call to the SystemConfig contract
uint256 internal l2OutputOracleStartingTimestamp;
/// @notice Place the contract addresses in storage so they can be used when building calldata.
function setUp() external {
// Set the network in storage
NETWORK = vm.envOr("NETWORK", GOERLI_PROD);
// TODO: hack
PROXY_ADMIN = ProxyAdmin(vm.envOr("PROXY_ADMIN", 0x01d3670863c3F4b24D7b107900f0b75d4BbC6e0d));
// For simple comparisons of dynamic types
bytes32 network = keccak256(bytes(NETWORK));
string memory deployConfigPath;
if (network == goerli) {
console.log("Using goerli-prod");
deployConfigPath = string.concat(vm.projectRoot(), "/deploy-config/goerli.json");
proxies = ContractSet({
L1CrossDomainMessenger: 0x5086d1eEF304eb5284A0f6720f79403b4e9bE294,
L1StandardBridge: 0x636Af16bf2f682dD3109e60102b8E1A089FedAa8,
L2OutputOracle: 0xE6Dfba0953616Bacab0c9A8ecb3a9BBa77FC15c0,
OptimismMintableERC20Factory: 0x883dcF8B05364083D849D8bD226bC8Cb4c42F9C5,
OptimismPortal: 0x5b47E1A08Ea6d985D6649300584e6722Ec4B1383,
SystemConfig: 0xAe851f927Ee40dE99aaBb7461C00f9622ab91d60,
L1ERC721Bridge: 0x8DD330DdE8D9898d43b4dc840Da27A07dF91b3c9
});
} else if (network == chaosnet) {
console.log("Using chaosnet");
deployConfigPath = string.concat(vm.projectRoot(), "/deploy-config/chaosnet.json");
proxies = ContractSet({
L1CrossDomainMessenger: 0xfc428D28D197fFf99A5EbAc6be8B761FEd8718Da,
L1StandardBridge: 0x60859421Ed85C0B11071230cf61dcEeEf54630Ff,
L2OutputOracle: 0x7D00A03f180d8C07B88d8c1384a15326c38FF9Ff,
OptimismMintableERC20Factory: 0x526920419b61153c1F80fD306B5Ab52b69110A6C,
OptimismPortal: 0x1566c8Eea4A255C07Ef58edF91431c8A73ae0B62,
SystemConfig: 0xf2Fa3621cAa534a2AE9Eb36667da57890E5C9E6a,
L1ERC721Bridge: 0x058BBf091232afE99BC2481F809254cD15e64Df5
});
} else if (network == devnet) {
console.log("Using devnet");
deployConfigPath = string.concat(vm.projectRoot(), "/deploy-config/internal-devnet.json");
proxies = ContractSet({
L1CrossDomainMessenger: 0x71A046D793C71af209960DCb8bD5388d2c5D2a78,
L1StandardBridge: 0x791590936abB3531c9d54CD10CEC4B14415B0Ba7,
L2OutputOracle: 0xA57B9f15AA204b9D68DF58849b02Df16c80C0999,
OptimismMintableERC20Factory: 0x2998dDaF6AaA00Fa8A7104214688d29Bc749B78F,
OptimismPortal: 0x83a242F8481D4F8a605Aa82BA9D42BA574054258,
SystemConfig: 0x9673B370b773D9FFc4C282B3aF315ab05f17E20C,
L1ERC721Bridge: 0x60e0f047FfA2Fad2AF197c9CDb404bDF47277Ed4
});
} else {
revert("Invalid network");
}
cfg = new DeployConfig(deployConfigPath);
// cache the starting timestamp here as to not break the view functions below
l2OutputOracleStartingTimestamp = cfg.l2OutputOracleStartingTimestamp();
}
/// @notice Follow up assertions to ensure that the script ran to completion.
function _postCheck() internal view override {
ContractSet memory prox = getProxies();
require(
_versionHash(prox.L1CrossDomainMessenger) == keccak256(bytes(L1CrossDomainMessengerVersion)),
"L1CrossDomainMessenger"
);
require(_versionHash(prox.L1StandardBridge) == keccak256(bytes(L1StandardBridgeVersion)), "L1StandardBridge");
require(_versionHash(prox.L2OutputOracle) == keccak256(bytes(L2OutputOracleVersion)), "L2OutputOracle");
require(
_versionHash(prox.OptimismMintableERC20Factory) == keccak256(bytes(OptimismMintableERC20FactoryVersion)),
"OptimismMintableERC20Factory"
);
require(_versionHash(prox.OptimismPortal) == keccak256(bytes(OptimismPortalVersion)), "OptimismPortal");
require(_versionHash(prox.SystemConfig) == keccak256(bytes(SystemConfigVersion)), "SystemConfig");
require(_versionHash(prox.L1ERC721Bridge) == keccak256(bytes(L1ERC721BridgeVersion)), "L1ERC721Bridge");
ResourceMetering.ResourceConfig memory rcfg = SystemConfig(prox.SystemConfig).resourceConfig();
ResourceMetering.ResourceConfig memory dflt = Constants.DEFAULT_RESOURCE_CONFIG();
require(keccak256(abi.encode(rcfg)) == keccak256(abi.encode(dflt)));
// Check that the codehashes of all implementations match the proxies set implementations.
require(
PROXY_ADMIN.getProxyImplementation(prox.L1CrossDomainMessenger).codehash
== L1CrossDomainMessengerImplementation.codehash,
"L1CrossDomainMessenger codehash"
);
require(
PROXY_ADMIN.getProxyImplementation(prox.L1StandardBridge).codehash
== L1StandardBridgeImplementation.codehash,
"L1StandardBridge codehash"
);
require(
PROXY_ADMIN.getProxyImplementation(prox.L2OutputOracle).codehash == L2OutputOracleImplementation.codehash,
"L2OutputOracle codehash"
);
require(
PROXY_ADMIN.getProxyImplementation(prox.OptimismMintableERC20Factory).codehash
== OptimismMintableERC20FactoryImplementation.codehash,
"OptimismMintableERC20Factory codehash"
);
require(
PROXY_ADMIN.getProxyImplementation(prox.OptimismPortal).codehash == OptimismPortalImplementation.codehash,
"OptimismPortal codehash"
);
require(
PROXY_ADMIN.getProxyImplementation(prox.SystemConfig).codehash == SystemConfigImplementation.codehash,
"SystemConfig codehash"
);
require(
PROXY_ADMIN.getProxyImplementation(prox.L1ERC721Bridge).codehash == L1ERC721BridgeImplementation.codehash,
"L1ERC721Bridge codehash"
);
_postCheckSystemConfig();
_postCheckL1CrossDomainMessenger();
_postCheckL1StandardBridge();
_postCheckL2OutputOracle();
_postCheckOptimismMintableERC20Factory();
_postCheckL1ERC721Bridge();
_postCheckOptimismPortal();
}
/// @notice Post check hook for the system config
function _postCheckSystemConfig() internal view {
SystemConfig config = SystemConfig(proxies.SystemConfig);
require(config.owner() == cfg.finalSystemOwner());
require(config.overhead() == cfg.gasPriceOracleOverhead());
require(config.scalar() == cfg.gasPriceOracleScalar());
require(config.unsafeBlockSigner() == cfg.p2pSequencerAddress());
require(config.batcherHash() == bytes32(uint256(uint160(cfg.batchSenderAddress()))));
ResourceMetering.ResourceConfig memory rconfig = Constants.DEFAULT_RESOURCE_CONFIG();
ResourceMetering.ResourceConfig memory resourceConfig = config.resourceConfig();
require(resourceConfig.maxResourceLimit == rconfig.maxResourceLimit);
require(resourceConfig.elasticityMultiplier == rconfig.elasticityMultiplier);
require(resourceConfig.baseFeeMaxChangeDenominator == rconfig.baseFeeMaxChangeDenominator);
require(resourceConfig.systemTxMaxGas == rconfig.systemTxMaxGas);
require(resourceConfig.minimumBaseFee == rconfig.minimumBaseFee);
require(resourceConfig.maximumBaseFee == rconfig.maximumBaseFee);
require(config.l1ERC721Bridge() == proxies.L1ERC721Bridge);
require(config.l1StandardBridge() == proxies.L1StandardBridge);
require(config.l2OutputOracle() == proxies.L2OutputOracle);
require(config.optimismPortal() == proxies.OptimismPortal);
require(config.l1CrossDomainMessenger() == proxies.L1CrossDomainMessenger);
// A non zero start block is an override
uint256 startBlock = cfg.systemConfigStartBlock();
if (startBlock != 0) {
require(config.startBlock() == startBlock);
} else {
require(config.startBlock() == block.number);
}
}
/// @notice Post check hook for the L1CrossDomainMessenger
function _postCheckL1CrossDomainMessenger() internal view {
L1CrossDomainMessenger messenger = L1CrossDomainMessenger(proxies.L1CrossDomainMessenger);
require(address(messenger.portal()) == proxies.OptimismPortal);
}
/// @notice Post check hook for the L1StandardBridge
function _postCheckL1StandardBridge() internal view {
L1StandardBridge bridge = L1StandardBridge(payable(proxies.L1StandardBridge));
require(address(bridge.MESSENGER()) == proxies.L1CrossDomainMessenger);
require(address(bridge.messenger()) == proxies.L1CrossDomainMessenger);
require(address(bridge.OTHER_BRIDGE()) == Predeploys.L2_STANDARD_BRIDGE);
require(address(bridge.otherBridge()) == Predeploys.L2_STANDARD_BRIDGE);
// Ensures that the legacy slot is modified correctly. This will fail
// during predeployment simulation on OP Mainnet if there is a bug.
bytes32 slot0 = vm.load(address(bridge), bytes32(uint256(0)));
require(slot0 == bytes32(uint256(2)));
}
/// @notice Post check hook for the L2OutputOracle
function _postCheckL2OutputOracle() internal view {
L2OutputOracle oracle = L2OutputOracle(proxies.L2OutputOracle);
require(oracle.SUBMISSION_INTERVAL() == cfg.l2OutputOracleSubmissionInterval());
require(oracle.submissionInterval() == cfg.l2OutputOracleSubmissionInterval());
require(oracle.L2_BLOCK_TIME() == cfg.l2BlockTime());
require(oracle.l2BlockTime() == cfg.l2BlockTime());
require(oracle.PROPOSER() == cfg.l2OutputOracleProposer());
require(oracle.proposer() == cfg.l2OutputOracleProposer());
require(oracle.CHALLENGER() == cfg.l2OutputOracleChallenger());
require(oracle.challenger() == cfg.l2OutputOracleChallenger());
require(oracle.FINALIZATION_PERIOD_SECONDS() == cfg.finalizationPeriodSeconds());
require(oracle.finalizationPeriodSeconds() == cfg.finalizationPeriodSeconds());
require(oracle.startingBlockNumber() == cfg.l2OutputOracleStartingBlockNumber());
require(oracle.startingTimestamp() == l2OutputOracleStartingTimestamp);
}
/// @notice Post check hook for the OptimismMintableERC20Factory
function _postCheckOptimismMintableERC20Factory() internal view {
OptimismMintableERC20Factory factory = OptimismMintableERC20Factory(proxies.OptimismMintableERC20Factory);
require(factory.BRIDGE() == proxies.L1StandardBridge);
}
/// @notice Post check hook for the L1ERC721Bridge
function _postCheckL1ERC721Bridge() internal view {
L1ERC721Bridge bridge = L1ERC721Bridge(proxies.L1ERC721Bridge);
require(address(bridge.MESSENGER()) == proxies.L1CrossDomainMessenger);
require(bridge.OTHER_BRIDGE() == Predeploys.L2_ERC721_BRIDGE);
}
/// @notice Post check hook for the OptimismPortal
function _postCheckOptimismPortal() internal view {
OptimismPortal portal = OptimismPortal(payable(proxies.OptimismPortal));
require(address(portal.L2_ORACLE()) == proxies.L2OutputOracle);
require(portal.GUARDIAN() == cfg.portalGuardian());
require(address(portal.SYSTEM_CONFIG()) == proxies.SystemConfig);
require(portal.paused() == false);
}
/// @notice Test coverage of the logic. Should only run on goerli but other chains
/// could be added.
function test_script_succeeds() external skipWhenNotForking {
address _safe;
address _proxyAdmin;
if (block.chainid == GOERLI) {
_safe = 0xBc1233d0C3e6B5d53Ab455cF65A6623F6dCd7e4f;
_proxyAdmin = 0x01d3670863c3F4b24D7b107900f0b75d4BbC6e0d;
// Set the proxy admin for the `_postCheck` function
PROXY_ADMIN = ProxyAdmin(_proxyAdmin);
}
require(_safe != address(0) && _proxyAdmin != address(0));
address[] memory owners = IGnosisSafe(payable(_safe)).getOwners();
for (uint256 i; i < owners.length; i++) {
address owner = owners[i];
vm.startBroadcast(owner);
bool success = _run(_safe, _proxyAdmin);
vm.stopBroadcast();
if (success) {
console.log("tx success");
break;
}
}
_postCheck();
}
/// @notice Builds the calldata that the multisig needs to make for the upgrade to happen.
/// A total of 8 calls are made, 7 upgrade implementations and 1 sets the resource
/// config to the default value in the SystemConfig contract.
function buildCalldata(address _proxyAdmin) internal view override returns (bytes memory) {
IMulticall3.Call3[] memory calls = new IMulticall3.Call3[](7);
ContractSet memory prox = getProxies();
// Upgrade the L1CrossDomainMessenger
calls[0] = IMulticall3.Call3({
target: _proxyAdmin,
allowFailure: false,
callData: abi.encodeCall(
ProxyAdmin.upgradeAndCall,
(
payable(prox.L1CrossDomainMessenger), // proxy
L1CrossDomainMessengerImplementation, // implementation
abi.encodeCall( // data
L1CrossDomainMessenger.initialize, (OptimismPortal(payable(prox.OptimismPortal))))
)
)
});
// Upgrade the L1StandardBridge
calls[1] = IMulticall3.Call3({
target: _proxyAdmin,
allowFailure: false,
callData: abi.encodeCall(
ProxyAdmin.upgradeAndCall,
(
payable(prox.L1StandardBridge), // proxy
L1StandardBridgeImplementation, // implementation
abi.encodeCall(L1StandardBridge.initialize, (L1CrossDomainMessenger(prox.L1CrossDomainMessenger))) // data
)
)
});
// Upgrade the L2OutputOracle
calls[2] = IMulticall3.Call3({
target: _proxyAdmin,
allowFailure: false,
callData: abi.encodeCall(
ProxyAdmin.upgradeAndCall,
(
payable(prox.L2OutputOracle), // proxy
L2OutputOracleImplementation, // implementation
abi.encodeCall( // data
L2OutputOracle.initialize,
(
cfg.l2OutputOracleStartingBlockNumber(),
l2OutputOracleStartingTimestamp,
cfg.l2OutputOracleProposer(),
cfg.l2OutputOracleChallenger()
)
)
)
)
});
// Upgrade the OptimismMintableERC20Factory. No initialize function.
calls[3] = IMulticall3.Call3({
target: _proxyAdmin,
allowFailure: false,
callData: abi.encodeCall(
ProxyAdmin.upgradeAndCall,
(
payable(prox.OptimismMintableERC20Factory), // proxy
OptimismMintableERC20FactoryImplementation, // implementation
abi.encodeCall( // data
OptimismMintableERC20Factory.initialize, (prox.L1StandardBridge))
)
)
});
// Upgrade the OptimismPortal
calls[4] = IMulticall3.Call3({
target: _proxyAdmin,
allowFailure: false,
callData: abi.encodeCall(
ProxyAdmin.upgradeAndCall,
(
payable(prox.OptimismPortal), // proxy
OptimismPortalImplementation, // implementation
abi.encodeCall( // data
OptimismPortal.initialize,
(
L2OutputOracle(prox.L2OutputOracle),
cfg.portalGuardian(),
SystemConfig(prox.SystemConfig),
false
)
)
)
)
});
// Upgrade the SystemConfig
calls[5] = IMulticall3.Call3({
target: _proxyAdmin,
allowFailure: false,
callData: abi.encodeCall(
ProxyAdmin.upgradeAndCall,
(
payable(prox.SystemConfig), // proxy
SystemConfigImplementation, // implementation
abi.encodeCall( // data
SystemConfig.initialize,
(
cfg.finalSystemOwner(),
cfg.gasPriceOracleOverhead(),
cfg.gasPriceOracleScalar(),
bytes32(uint256(uint160(cfg.batchSenderAddress()))),
uint64(cfg.l2GenesisBlockGasLimit()),
cfg.p2pSequencerAddress(),
Constants.DEFAULT_RESOURCE_CONFIG(),
cfg.systemConfigStartBlock(),
cfg.batchInboxAddress(),
SystemConfig.Addresses({
l1CrossDomainMessenger: prox.L1CrossDomainMessenger,
l1ERC721Bridge: prox.L1ERC721Bridge,
l1StandardBridge: prox.L1StandardBridge,
l2OutputOracle: prox.L2OutputOracle,
optimismPortal: prox.OptimismPortal,
optimismMintableERC20Factory: prox.OptimismMintableERC20Factory
})
)
)
)
)
});
// Upgrade the L1ERC721Bridge
calls[6] = IMulticall3.Call3({
target: _proxyAdmin,
allowFailure: false,
callData: abi.encodeCall(
ProxyAdmin.upgradeAndCall,
(
payable(prox.L1ERC721Bridge),
L1ERC721BridgeImplementation,
abi.encodeCall(L1ERC721Bridge.initialize, (L1CrossDomainMessenger(prox.L1CrossDomainMessenger)))
)
)
});
return abi.encodeCall(IMulticall3.aggregate3, (calls));
}
/// @notice Returns the ContractSet that represents the proxies for a given network.
/// Configure the network with the NETWORK env var.
function getProxies() internal view returns (ContractSet memory) {
require(proxies.L1CrossDomainMessenger != address(0), "no proxies for this network");
return proxies;
}
}
packages/contracts-bedrock/semver-lock.json
View file @
37b2b0f0
{
{
"src/EAS/EAS.sol"
:
"0x
e5e9700b94a88a2e1baabe4bfa66d5c1c94e811bcc5d2c64526afc649df59118
"
,
"src/EAS/EAS.sol"
:
"0x
850a0eb089d5a01f489c7239f5b9a1b09120afb1bc80239268215c2dfe1de26c
"
,
"src/EAS/SchemaRegistry.sol"
:
"0x5ee1a0c3b2bf1eb5edb53fb0967cf13856be546f0f16fe7acdc3e4f286db6831"
,
"src/EAS/SchemaRegistry.sol"
:
"0x5ee1a0c3b2bf1eb5edb53fb0967cf13856be546f0f16fe7acdc3e4f286db6831"
,
"src/L1/DelayedVetoable.sol"
:
"0x276c6276292095e6aa37a70008cf4e0d1cbcc020dbc9107459bbc72ab5ed744f"
,
"src/L1/DelayedVetoable.sol"
:
"0x276c6276292095e6aa37a70008cf4e0d1cbcc020dbc9107459bbc72ab5ed744f"
,
"src/L1/L1CrossDomainMessenger.sol"
:
"0x2aa4e06827bc48484212eb2bdc30fd604ffd23b37e401b78ef428c12fa9b8385"
,
"src/L1/L1CrossDomainMessenger.sol"
:
"0x2aa4e06827bc48484212eb2bdc30fd604ffd23b37e401b78ef428c12fa9b8385"
,
...
...
packages/contracts-bedrock/src/EAS/EAS.sol
View file @
37b2b0f0
...
@@ -80,11 +80,11 @@ contract EAS is IEAS, ISemver, EIP1271Verifier {
...
@@ -80,11 +80,11 @@ contract EAS is IEAS, ISemver, EIP1271Verifier {
uint256[MAX_GAP - 3] private __gap;
uint256[MAX_GAP - 3] private __gap;
/// @notice Semantic version.
/// @notice Semantic version.
/// @custom:semver 1.
3
.0
/// @custom:semver 1.
4
.0
string public constant version = "1.
3
.0";
string public constant version = "1.
4
.0";
/// @dev Creates a new EAS instance.
/// @dev Creates a new EAS instance.
constructor() EIP1271Verifier("EAS", "1.
2
.0") { }
constructor() EIP1271Verifier("EAS", "1.
3
.0") { }
/// @inheritdoc IEAS
/// @inheritdoc IEAS
function getSchemaRegistry() external pure returns (ISchemaRegistry) {
function getSchemaRegistry() external pure returns (ISchemaRegistry) {
...
...
packages/contracts-bedrock/src/EAS/eip1271/EIP1271Verifier.sol
View file @
37b2b0f0
...
@@ -30,13 +30,13 @@ abstract contract EIP1271Verifier is EIP712 {
...
@@ -30,13 +30,13 @@ abstract contract EIP1271Verifier is EIP712 {
error InvalidNonce();
error InvalidNonce();
// The hash of the data type used to relay calls to the attest function. It's the value of
// The hash of the data type used to relay calls to the attest function. It's the value of
// keccak256("Attest(
bytes32 schema,address recipient,uint64 expirationTime,bool revocable,bytes32 refUID,bytes
// keccak256("Attest(
address attester,bytes32 schema,address recipient,uint64 expirationTime,bool revocable,bytes32
// data,uint256 value,uint256 nonce,uint64 deadline)").
//
refUID,bytes
data,uint256 value,uint256 nonce,uint64 deadline)").
bytes32 private constant ATTEST_TYPEHASH = 0xf
83bb2b0ede93a840239f7e701a54d9bc35f03701f51ae153d601c6947ff3d3f
;
bytes32 private constant ATTEST_TYPEHASH = 0xf
eb2925a02bae3dae48d424a0437a2b6ac939aa9230ddc55a1a76f065d988076
;
// The hash of the data type used to relay calls to the revoke function. It's the value of
// The hash of the data type used to relay calls to the revoke function. It's the value of
// keccak256("Revoke(bytes32 schema,bytes32 uid,uint256 value,uint256 nonce,uint64 deadline)").
// keccak256("Revoke(
address revoker,
bytes32 schema,bytes32 uid,uint256 value,uint256 nonce,uint64 deadline)").
bytes32 private constant REVOKE_TYPEHASH = 0x
2d4116d8c9824e4c316453e5c2843a1885580374159ce8768603c49085ef424c
;
bytes32 private constant REVOKE_TYPEHASH = 0x
b5d556f07587ec0f08cf386545cc4362c702a001650c2058002615ee5c9d1e75
;
// The user readable name of the signing domain.
// The user readable name of the signing domain.
bytes32 private immutable _name;
bytes32 private immutable _name;
...
@@ -116,6 +116,7 @@ abstract contract EIP1271Verifier is EIP712 {
...
@@ -116,6 +116,7 @@ abstract contract EIP1271Verifier is EIP712 {
keccak256(
keccak256(
abi.encode(
abi.encode(
ATTEST_TYPEHASH,
ATTEST_TYPEHASH,
request.attester,
request.schema,
request.schema,
data.recipient,
data.recipient,
data.expirationTime,
data.expirationTime,
...
@@ -150,7 +151,13 @@ abstract contract EIP1271Verifier is EIP712 {
...
@@ -150,7 +151,13 @@ abstract contract EIP1271Verifier is EIP712 {
bytes32 hash = _hashTypedDataV4(
bytes32 hash = _hashTypedDataV4(
keccak256(
keccak256(
abi.encode(
abi.encode(
REVOKE_TYPEHASH, request.schema, data.uid, data.value, _nonces[request.revoker]++, request.deadline
REVOKE_TYPEHASH,
request.revoker,
request.schema,
data.uid,
data.value,
_nonces[request.revoker]++,
request.deadline
)
)
)
)
);
);
...
...
packages/contracts-bedrock/test/SafeCall.t.sol
View file @
37b2b0f0
...
@@ -13,7 +13,7 @@ contract SafeCall_Test is Test {
...
@@ -13,7 +13,7 @@ contract SafeCall_Test is Test {
vm.assume(from.balance == 0);
vm.assume(from.balance == 0);
vm.assume(to.balance == 0);
vm.assume(to.balance == 0);
// no precompiles (mainnet)
// no precompiles (mainnet)
assumeNo
Precompiles(to, 1
);
assumeNo
tPrecompile(to
);
// don't call the vm
// don't call the vm
vm.assume(to != address(vm));
vm.assume(to != address(vm));
vm.assume(from != address(vm));
vm.assume(from != address(vm));
...
@@ -47,7 +47,7 @@ contract SafeCall_Test is Test {
...
@@ -47,7 +47,7 @@ contract SafeCall_Test is Test {
vm.assume(from.balance == 0);
vm.assume(from.balance == 0);
vm.assume(to.balance == 0);
vm.assume(to.balance == 0);
// no precompiles (mainnet)
// no precompiles (mainnet)
assumeNo
Precompiles(to, 1
);
assumeNo
tPrecompile(to
);
// don't call the vm
// don't call the vm
vm.assume(to != address(vm));
vm.assume(to != address(vm));
vm.assume(from != address(vm));
vm.assume(from != address(vm));
...
@@ -89,7 +89,7 @@ contract SafeCall_Test is Test {
...
@@ -89,7 +89,7 @@ contract SafeCall_Test is Test {
vm.assume(from.balance == 0);
vm.assume(from.balance == 0);
vm.assume(to.balance == 0);
vm.assume(to.balance == 0);
// no precompiles (mainnet)
// no precompiles (mainnet)
assumeNo
Precompiles(to, 1
);
assumeNo
tPrecompile(to
);
// don't call the vm
// don't call the vm
vm.assume(to != address(vm));
vm.assume(to != address(vm));
vm.assume(from != address(vm));
vm.assume(from != address(vm));
...
...
packages/contracts-bedrock/test/invariants/SystemConfig.t.sol
View file @
37b2b0f0
...
@@ -8,11 +8,6 @@ import { ResourceMetering } from "src/L1/ResourceMetering.sol";
...
@@ -8,11 +8,6 @@ import { ResourceMetering } from "src/L1/ResourceMetering.sol";
import { Constants } from "src/libraries/Constants.sol";
import { Constants } from "src/libraries/Constants.sol";
contract SystemConfig_GasLimitLowerBound_Invariant is Test {
contract SystemConfig_GasLimitLowerBound_Invariant is Test {
struct FuzzInterface {
address target;
string[] artifacts;
}
SystemConfig public config;
SystemConfig public config;
function setUp() external {
function setUp() external {
...
@@ -59,19 +54,14 @@ contract SystemConfig_GasLimitLowerBound_Invariant is Test {
...
@@ -59,19 +54,14 @@ contract SystemConfig_GasLimitLowerBound_Invariant is Test {
selectors[0] = config.setGasLimit.selector;
selectors[0] = config.setGasLimit.selector;
FuzzSelector memory selector = FuzzSelector({ addr: address(config), selectors: selectors });
FuzzSelector memory selector = FuzzSelector({ addr: address(config), selectors: selectors });
targetSelector(selector);
targetSelector(selector);
}
/// @dev Allows the SystemConfig contract to be the target of the invariant test
/// when it is behind a proxy. Foundry calls this function under the hood to
/// know the ABI to use when calling the target contract.
function targetInterfaces() public view returns (FuzzInterface[] memory) {
require(address(config) != address(0), "SystemConfig not initialized");
FuzzInterface[] memory targets = new FuzzInterface[](1);
/// Allows the SystemConfig contract to be the target of the invariant test
/// when it is behind a proxy. Foundry calls this function under the hood to
/// know the ABI to use when calling the target contract.
string[] memory artifacts = new string[](1);
string[] memory artifacts = new string[](1);
artifacts[0] = "SystemConfig";
artifacts[0] = "SystemConfig";
targets[0]
= FuzzInterface(address(config), artifacts);
FuzzInterface memory target
= FuzzInterface(address(config), artifacts);
return targets
;
targetInterface(target)
;
}
}
/// @custom:invariant The gas limit of the `SystemConfig` contract can never be lower
/// @custom:invariant The gas limit of the `SystemConfig` contract can never be lower
...
...
specs/deposits.md
View file @
37b2b0f0
...
@@ -213,8 +213,9 @@ The RLP-encoded consensus-enforced fields are:
...
@@ -213,8 +213,9 @@ The RLP-encoded consensus-enforced fields are:
-
`bloom`
(standard): bloom filter of the transaction logs.
-
`bloom`
(standard): bloom filter of the transaction logs.
-
`logs`
(standard): log events emitted by the EVM processing.
-
`logs`
(standard): log events emitted by the EVM processing.
-
`depositNonce`
(unique extension): Optional field. The deposit transaction persists the nonce used during execution.
-
`depositNonce`
(unique extension): Optional field. The deposit transaction persists the nonce used during execution.
-
Before Regolith, this
`depositNonce`
field must always be omitted.
-
`depositNonceVersion`
(unique extension): Optional field. The value must be 1 if the field is present
-
With Regolith, this
`depositNonce`
field must always be included.
-
Before Canyon, these
`depositNonce`
&
`depositNonceVersion`
fields must always be omitted.
-
With Canyon, these
`depositNonce`
&
`depositNonceVersion`
fields must always be included.
Starting with Regolith, the receipt API responses utilize the receipt changes for more accurate response data:
Starting with Regolith, the receipt API responses utilize the receipt changes for more accurate response data:
...
...
specs/derivation.md
View file @
37b2b0f0
...
@@ -946,7 +946,7 @@ follows:
...
@@ -946,7 +946,7 @@ follows:
encoded with
[
EIP-2718
]
.
encoded with
[
EIP-2718
]
.
-
`noTxPool`
is set to
`true`
, to use the exact above
`transactions`
list when constructing the block.
-
`noTxPool`
is set to
`true`
, to use the exact above
`transactions`
list when constructing the block.
-
`gasLimit`
is set to the current
`gasLimit`
value in the
[
system configuration
][
g-system-config
]
of this payload.
-
`gasLimit`
is set to the current
`gasLimit`
value in the
[
system configuration
][
g-system-config
]
of this payload.
-
'withdrawals'
is set to nil prior to Canyon and an empty array after Canyon
-
`withdrawals`
is set to nil prior to Canyon and an empty array after Canyon
[
extended-attributes
]:
exec-engine.md#extended-payloadattributesv1
[
extended-attributes
]:
exec-engine.md#extended-payloadattributesv1
[
Fee Vaults
]:
exec-engine.md#fee-vaults
[
Fee Vaults
]:
exec-engine.md#fee-vaults
specs/predeploys.md
View file @
37b2b0f0
...
@@ -23,6 +23,7 @@
...
@@ -23,6 +23,7 @@
-
[
L1FeeVault
](
#l1feevault
)
-
[
L1FeeVault
](
#l1feevault
)
-
[
SchemaRegistry
](
#schemaregistry
)
-
[
SchemaRegistry
](
#schemaregistry
)
-
[
EAS
](
#eas
)
-
[
EAS
](
#eas
)
-
[
create2Deployer
](
#create2deployer
)
<!-- END doctoc generated TOC please keep comment here to allow auto update -->
<!-- END doctoc generated TOC please keep comment here to allow auto update -->
...
@@ -45,7 +46,7 @@ and there is no proxy deployed at that account.
...
@@ -45,7 +46,7 @@ and there is no proxy deployed at that account.
The following table includes each of the predeploys. The system version
The following table includes each of the predeploys. The system version
indicates when the predeploy was introduced. The possible values are
`Legacy`
indicates when the predeploy was introduced. The possible values are
`Legacy`
or
`Bedrock`
. Deprecated contracts should not be used.
or
`Bedrock`
or
`Canyon`
. Deprecated contracts should not be used.
| Name | Address | Introduced | Deprecated | Proxied |
| Name | Address | Introduced | Deprecated | Proxied |
| ----------------------------- | ------------------------------------------ | ---------- | ---------- |---------|
| ----------------------------- | ------------------------------------------ | ---------- | ---------- |---------|
...
@@ -69,6 +70,7 @@ or `Bedrock`. Deprecated contracts should not be used.
...
@@ -69,6 +70,7 @@ or `Bedrock`. Deprecated contracts should not be used.
| L1FeeVault | 0x420000000000000000000000000000000000001a | Bedrock | No | Yes |
| L1FeeVault | 0x420000000000000000000000000000000000001a | Bedrock | No | Yes |
| SchemaRegistry | 0x4200000000000000000000000000000000000020 | Bedrock | No | Yes |
| SchemaRegistry | 0x4200000000000000000000000000000000000020 | Bedrock | No | Yes |
| EAS | 0x4200000000000000000000000000000000000021 | Bedrock | No | Yes |
| EAS | 0x4200000000000000000000000000000000000021 | Bedrock | No | Yes |
| create2Deployer | 0x13b0D85CcB8bf860b6b79AF3029fCA081AE9beF2 | Canyon | No | No |
## LegacyMessagePasser
## LegacyMessagePasser
...
@@ -332,3 +334,54 @@ protocol.
...
@@ -332,3 +334,54 @@ protocol.
Address:
`0x4200000000000000000000000000000000000021`
Address:
`0x4200000000000000000000000000000000000021`
The
`EAS`
predeploy implements the
`Ethereum Attestation Service`
protocol.
The
`EAS`
predeploy implements the
`Ethereum Attestation Service`
protocol.
## create2Deployer
[
Implementation
](
https://github.com/mdehoog/create2deployer/blob/69b9a8e112b15f9257ce8c62b70a09914e7be29c/contracts/Create2Deployer.sol
)
The create2Deployer is a nice Solidity wrapper around the CREATE2 opcode. It provides the following ABI.
```
solidity
/**
* @dev Deploys a contract using `CREATE2`. The address where the
* contract will be deployed can be known in advance via {computeAddress}.
*
* The bytecode for a contract can be obtained from Solidity with
* `type(contractName).creationCode`.
*
* Requirements:
* - `bytecode` must not be empty.
* - `salt` must have not been used for `bytecode` already.
* - the factory must have a balance of at least `value`.
* - if `value` is non-zero, `bytecode` must have a `payable` constructor.
*/
function deploy(uint256 value, bytes32 salt, bytes memory code) public
/**
* @dev Deployment of the {ERC1820Implementer}.
* Further information: https://eips.ethereum.org/EIPS/eip-1820
*/
function deployERC1820Implementer(uint256 value, bytes32 salt)
/**
* @dev Returns the address where a contract will be stored if deployed via {deploy}.
* Any change in the `bytecodeHash` or `salt` will result in a new destination address.
*/
function computeAddress(bytes32 salt, bytes32 codeHash) public view returns (address)
/**
* @dev Returns the address where a contract will be stored if deployed via {deploy} from a
* contract located at `deployer`. If `deployer` is this contract's address, returns the
* same value as {computeAddress}.
*/
function computeAddressWithDeployer(
bytes32 salt,
bytes32 codeHash,
address deployer
) public pure returns (address)
```
Address:
`0x13b0D85CcB8bf860b6b79AF3029fCA081AE9beF2`
When Canyon activates, the contract code at
`0x13b0D85CcB8bf860b6b79AF3029fCA081AE9beF2`
is set to
`0x6080604052600436106100435760003560e01c8063076c37b21461004f578063481286e61461007157806356299481146100ba57806366cfa057146100da57600080fd5b3661004a57005b600080fd5b34801561005b57600080fd5b5061006f61006a366004610327565b6100fa565b005b34801561007d57600080fd5b5061009161008c366004610327565b61014a565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100c657600080fd5b506100916100d5366004610349565b61015d565b3480156100e657600080fd5b5061006f6100f53660046103ca565b610172565b61014582826040518060200161010f9061031a565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082820381018352601f90910116604052610183565b505050565b600061015683836102e7565b9392505050565b600061016a8484846102f0565b949350505050565b61017d838383610183565b50505050565b6000834710156101f4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f437265617465323a20696e73756666696369656e742062616c616e636500000060448201526064015b60405180910390fd5b815160000361025f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f437265617465323a2062797465636f6465206c656e677468206973207a65726f60448201526064016101eb565b8282516020840186f5905073ffffffffffffffffffffffffffffffffffffffff8116610156576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f437265617465323a204661696c6564206f6e206465706c6f790000000000000060448201526064016101eb565b60006101568383305b6000604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b61014e806104ad83390190565b6000806040838503121561033a57600080fd5b50508035926020909101359150565b60008060006060848603121561035e57600080fd5b8335925060208401359150604084013573ffffffffffffffffffffffffffffffffffffffff8116811461039057600080fd5b809150509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000806000606084860312156103df57600080fd5b8335925060208401359150604084013567ffffffffffffffff8082111561040557600080fd5b818601915086601f83011261041957600080fd5b81358181111561042b5761042b61039b565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019083821181831017156104715761047161039b565b8160405282815289602084870101111561048a57600080fd5b826020860160208301376000602084830101528095505050505050925092509256fe608060405234801561001057600080fd5b5061012e806100206000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063249cb3fa14602d575b600080fd5b603c603836600460b1565b604e565b60405190815260200160405180910390f35b60008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915281205460ff16608857600060aa565b7fa2ef4600d742022d532d4747cb3547474667d6f13804902513b2ec01c848f4b45b9392505050565b6000806040838503121560c357600080fd5b82359150602083013573ffffffffffffffffffffffffffffffffffffffff8116811460ed57600080fd5b80915050925092905056fea26469706673582212205ffd4e6cede7d06a5daf93d48d0541fc68189eeb16608c1999a82063b666eb1164736f6c63430008130033a2646970667358221220fdc4a0fe96e3b21c108ca155438d37c9143fb01278a3c1d274948bad89c564ba64736f6c63430008130033`
.
specs/superchain-upgrades.md
View file @
37b2b0f0
...
@@ -32,6 +32,7 @@ chains following the same Superchain Target upgrade synchronously.
...
@@ -32,6 +32,7 @@ chains following the same Superchain Target upgrade synchronously.
-
[
OP-Stack Protocol versions
](
#op-stack-protocol-versions
)
-
[
OP-Stack Protocol versions
](
#op-stack-protocol-versions
)
-
[
Post-Bedrock Network upgrades
](
#post-bedrock-network-upgrades
)
-
[
Post-Bedrock Network upgrades
](
#post-bedrock-network-upgrades
)
-
[
Regolith
](
#regolith
)
-
[
Regolith
](
#regolith
)
-
[
Canyon
](
#canyon
)
<!-- END doctoc generated TOC please keep comment here to allow auto update -->
<!-- END doctoc generated TOC please keep comment here to allow auto update -->
...
@@ -245,6 +246,7 @@ but the matching L1-origin information may not be present at the time of activat
...
@@ -245,6 +246,7 @@ but the matching L1-origin information may not be present at the time of activat
(
[
announcement
](
https://optimism.mirror.xyz/gQWKlrDqHzdKPsB1iUnI-cVN3v0NvsWnazK7ajlt1fI
)
).
(
[
announcement
](
https://optimism.mirror.xyz/gQWKlrDqHzdKPsB1iUnI-cVN3v0NvsWnazK7ajlt1fI
)
).
-
`v3.0.0-1`
: 2023 Jan 13th - Bedrock pre-release, deployed on OP-Goerli, and later Base-Goerli.
-
`v3.0.0-1`
: 2023 Jan 13th - Bedrock pre-release, deployed on OP-Goerli, and later Base-Goerli.
-
`v3.0.0`
: 2023 Jun 6th - Bedrock, including the Regolith hardfork improvements, first deployed on OP-Mainnet.
-
`v3.0.0`
: 2023 Jun 6th - Bedrock, including the Regolith hardfork improvements, first deployed on OP-Mainnet.
-
`v4.0.0`
: TBD - Canyon
## Post-Bedrock Network upgrades
## Post-Bedrock Network upgrades
...
@@ -273,3 +275,24 @@ The [execution engine specification](./exec-engine.md) specifies the L1 cost fun
...
@@ -273,3 +275,24 @@ The [execution engine specification](./exec-engine.md) specifies the L1 cost fun
The Regolith upgrade uses a
*L2 block-timestamp*
activation-rule, and is specified in both the
The Regolith upgrade uses a
*L2 block-timestamp*
activation-rule, and is specified in both the
rollup-node (
`regolith_time`
) and execution engine (
`config.regolithTime`
).
rollup-node (
`regolith_time`
) and execution engine (
`config.regolithTime`
).
## Canyon
The Canyon upgrade contains the Shapella upgrade from L1 and some minor protocol fixes.
-
Shapella Upgrade
-
[
EIP-3651: Warm COINBASE
](
https://eips.ethereum.org/EIPS/eip-3651
)
-
[
EIP-3855: PUSH0 instruction
](
https://eips.ethereum.org/EIPS/eip-3855
)
-
[
EIP-3860: Limit and meter initcode
](
https://eips.ethereum.org/EIPS/eip-3860
)
-
[
EIP-4895: Beacon chain push withdrawals as operations
](
https://eips.ethereum.org/EIPS/eip-4895
)
-
[
Withdrawlas are prohibited in P2P Blocks
](
./rollup-node-p2p.md#block-validation
)
-
[
Withdrawals should be set to the empty array with Canyon
](
./derivation.md#building-individual-payload-attributes
)
-
[
EIP-6049: Deprecate SELFDESTRUCT
](
https://eips.ethereum.org/EIPS/eip-6049
)
-
[
Modifies the EIP-1559 Denominator
](
./exec-engine.md#1559-parameters
)
-
[
Channel Ordering Fix
](
./derivation.md#reading
)
-
[
Adds the deposit nonce & deposit nonce version to the deposit receipt hash
](
./deposits.md#deposit-receipt
)
-
[
Deploys the create2Deployer to `0x13b0D85CcB8bf860b6b79AF3029fCA081AE9beF2`
](
./predeploys.md#create2deployer
)
The Canyon upgrade uses a
*L2 block-timestamp*
activation-rule, and is specified in both the
rollup-node (
`canyon_time`
) and execution engine (
`config.canyonTime`
). Shanghai time in the
execution engine should be set to the same time as the Canyon time.
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