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
5f128658
Unverified
Commit
5f128658
authored
Aug 16, 2023
by
mergify[bot]
Committed by
GitHub
Aug 16, 2023
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'develop' into jg/channel_bank_metric
parents
c37e68fa
d3f4ec81
Changes
26
Hide whitespace changes
Inline
Side-by-side
Showing
26 changed files
with
462 additions
and
368 deletions
+462
-368
CONTRIBUTING.md
CONTRIBUTING.md
+34
-0
api_test.go
indexer/api/api_test.go
+13
-10
deposits.go
indexer/api/routes/deposits.go
+2
-2
withdrawals.go
indexer/api/routes/withdrawals.go
+2
-2
bridge_messages.go
indexer/database/bridge_messages.go
+20
-67
bridge_transactions.go
indexer/database/bridge_transactions.go
+3
-8
bridge_transfers.go
indexer/database/bridge_transfers.go
+23
-18
bridge_messages_e2e_test.go
indexer/e2e_tests/bridge_messages_e2e_test.go
+6
-6
bridge_transactions_e2e_test.go
indexer/e2e_tests/bridge_transactions_e2e_test.go
+0
-3
bridge_transfers_e2e_test.go
indexer/e2e_tests/bridge_transfers_e2e_test.go
+36
-19
20230523_create_schema.sql
indexer/migrations/20230523_create_schema.sql
+16
-18
l1_processor.go
indexer/processor/l1_processor.go
+24
-29
l2_processor.go
indexer/processor/l2_processor.go
+22
-24
standard_bridge.go
indexer/processor/standard_bridge.go
+47
-81
systemconfig.go
op-bindings/bindings/systemconfig.go
+1
-1
systemconfig_more.go
op-bindings/bindings/systemconfig_more.go
+1
-1
.gas-snapshot
packages/contracts-bedrock/.gas-snapshot
+4
-3
SystemConfig.json
...es/contracts-bedrock/deployments/goerli/SystemConfig.json
+114
-54
package.json
packages/contracts-bedrock/package.json
+2
-2
Multichain.s.sol
packages/contracts-bedrock/scripts/upgrades/Multichain.s.sol
+2
-2
semver-lock.json
packages/contracts-bedrock/semver-lock.json
+1
-1
SystemConfig.sol
packages/contracts-bedrock/src/L1/SystemConfig.sol
+36
-11
CommonTest.t.sol
packages/contracts-bedrock/test/CommonTest.t.sol
+3
-0
CrossDomainOwnable3.t.sol
packages/contracts-bedrock/test/CrossDomainOwnable3.t.sol
+0
-3
SystemConfig.t.sol
packages/contracts-bedrock/test/SystemConfig.t.sol
+47
-2
.depcheckrc
packages/sdk/.depcheckrc
+3
-1
No files found.
CONTRIBUTING.md
View file @
5f128658
...
@@ -185,3 +185,37 @@ cd packages/contracts
...
@@ -185,3 +185,37 @@ cd packages/contracts
pip3
install
slither-analyzer
pip3
install
slither-analyzer
pnpm
test
:slither
pnpm
test
:slither
```
```
## Labels
Labels are divided into categories with their descriptions annotated as
`<Category Name>: <description>`
.
The following are a comprehensive list of label categories.
-
**Area labels**
(
[
`A-`
][
area
]
): Denote the general area for the related issue or PR changes.
-
**Category labels**
(
[
`C-`
][
category
]
): Contextualize the type of issue or change.
-
**Meta labels**
(
[
`M-`
][
meta
]
): These add context to the issues or prs themselves primarily relating to process.
-
**Difficulty labels**
(
[
`D-`
][
difficulty
]
): Describe the associated implementation's difficulty level.
-
**Status labels**
(
[
`S-`
][
status
]
): Specify the status of an issue or pr.
Labels also provide a versatile filter for finding tickets that need help or are open for assignment.
This makes them a great tool for contributors!
[
area
]:
https://github.com/ethereum-optimism/optimism/labels?q=a-
[
category
]:
https://github.com/ethereum-optimism/optimism/labels?q=c-
[
meta
]:
https://github.com/ethereum-optimism/optimism/labels?q=m-
[
difficulty
]:
https://github.com/ethereum-optimism/optimism/labels?q=d-
[
status
]:
https://github.com/ethereum-optimism/optimism/labels?q=s-
#### Filtering for Work
To find tickets available for external contribution, take a look at the
[
`M-community`
][
M-community
]
label.
You can filter by the
[
`D-good-first-issue`
][
D-good-first-issue
]
label to find issues that are intended to be easy to implement or fix.
Also, all labels can be seen by visiting the
[
labels page
][
labels
]
[
labels
]:
https://github.com/ethereum-optimism/optimism/labels
[
M-community
]:
https://github.com/ethereum-optimism/optimism/labels/M-community
[
D-good-first-issue
]:
https://github.com/ethereum-optimism/optimism/labels/D-good-first-issue
indexer/api/api_test.go
View file @
5f128658
...
@@ -2,7 +2,6 @@ package api
...
@@ -2,7 +2,6 @@ package api
import
(
import
(
"fmt"
"fmt"
"math/big"
"net/http"
"net/http"
"net/http/httptest"
"net/http/httptest"
"testing"
"testing"
...
@@ -21,17 +20,21 @@ var mockAddress = "0x4204204204204204204204204204204204204204"
...
@@ -21,17 +20,21 @@ var mockAddress = "0x4204204204204204204204204204204204204204"
var
(
var
(
deposit
=
database
.
L1BridgeDeposit
{
deposit
=
database
.
L1BridgeDeposit
{
TransactionSourceHash
:
common
.
HexToHash
(
"abc"
),
TransactionSourceHash
:
common
.
HexToHash
(
"abc"
),
CrossDomainMessengerNonce
:
&
database
.
U256
{
Int
:
big
.
NewInt
(
0
)},
BridgeTransfer
:
database
.
BridgeTransfer
{
Tx
:
database
.
Transaction
{},
CrossDomainMessageHash
:
&
common
.
Hash
{},
TokenPair
:
database
.
TokenPair
{},
Tx
:
database
.
Transaction
{},
TokenPair
:
database
.
TokenPair
{},
},
}
}
withdrawal
=
database
.
L2BridgeWithdrawal
{
withdrawal
=
database
.
L2BridgeWithdrawal
{
TransactionWithdrawalHash
:
common
.
HexToHash
(
"0x420"
),
TransactionWithdrawalHash
:
common
.
HexToHash
(
"0x420"
),
CrossDomainMessengerNonce
:
&
database
.
U256
{
Int
:
big
.
NewInt
(
0
)},
BridgeTransfer
:
database
.
BridgeTransfer
{
Tx
:
database
.
Transaction
{},
CrossDomainMessageHash
:
&
common
.
Hash
{},
TokenPair
:
database
.
TokenPair
{},
Tx
:
database
.
Transaction
{},
TokenPair
:
database
.
TokenPair
{},
},
}
}
)
)
...
@@ -39,7 +42,7 @@ func (mbv *MockBridgeTransfersView) L1BridgeDeposit(hash common.Hash) (*database
...
@@ -39,7 +42,7 @@ func (mbv *MockBridgeTransfersView) L1BridgeDeposit(hash common.Hash) (*database
return
&
deposit
,
nil
return
&
deposit
,
nil
}
}
func
(
mbv
*
MockBridgeTransfersView
)
L1BridgeDeposit
ByCrossDomainMessengerNonce
(
nonce
*
big
.
Int
)
(
*
database
.
L1BridgeDeposit
,
error
)
{
func
(
mbv
*
MockBridgeTransfersView
)
L1BridgeDeposit
WithFilter
(
filter
database
.
BridgeTransfer
)
(
*
database
.
L1BridgeDeposit
,
error
)
{
return
&
deposit
,
nil
return
&
deposit
,
nil
}
}
...
@@ -56,7 +59,7 @@ func (mbv *MockBridgeTransfersView) L2BridgeWithdrawal(address common.Hash) (*da
...
@@ -56,7 +59,7 @@ func (mbv *MockBridgeTransfersView) L2BridgeWithdrawal(address common.Hash) (*da
return
&
withdrawal
,
nil
return
&
withdrawal
,
nil
}
}
func
(
mbv
*
MockBridgeTransfersView
)
L2BridgeWithdrawal
ByCrossDomainMessengerNonce
(
nonce
*
big
.
Int
)
(
*
database
.
L2BridgeWithdrawal
,
error
)
{
func
(
mbv
*
MockBridgeTransfersView
)
L2BridgeWithdrawal
WithFilter
(
filter
database
.
BridgeTransfer
)
(
*
database
.
L2BridgeWithdrawal
,
error
)
{
return
&
withdrawal
,
nil
return
&
withdrawal
,
nil
}
}
...
...
indexer/api/routes/deposits.go
View file @
5f128658
...
@@ -48,7 +48,7 @@ func newDepositResponse(deposits []*database.L1BridgeDepositWithTransactionHashe
...
@@ -48,7 +48,7 @@ func newDepositResponse(deposits []*database.L1BridgeDepositWithTransactionHashe
Amount
:
deposit
.
L1BridgeDeposit
.
Tx
.
Amount
.
Int
.
String
(),
Amount
:
deposit
.
L1BridgeDeposit
.
Tx
.
Amount
.
Int
.
String
(),
L1Token
:
TokenInfo
{
L1Token
:
TokenInfo
{
ChainId
:
1
,
ChainId
:
1
,
Address
:
deposit
.
L1BridgeDeposit
.
TokenPair
.
L
1
TokenAddress
.
String
(),
Address
:
deposit
.
L1BridgeDeposit
.
TokenPair
.
L
ocal
TokenAddress
.
String
(),
Name
:
"TODO"
,
Name
:
"TODO"
,
Symbol
:
"TODO"
,
Symbol
:
"TODO"
,
Decimals
:
420
,
Decimals
:
420
,
...
@@ -58,7 +58,7 @@ func newDepositResponse(deposits []*database.L1BridgeDepositWithTransactionHashe
...
@@ -58,7 +58,7 @@ func newDepositResponse(deposits []*database.L1BridgeDepositWithTransactionHashe
},
},
L2Token
:
TokenInfo
{
L2Token
:
TokenInfo
{
ChainId
:
10
,
ChainId
:
10
,
Address
:
deposit
.
L1BridgeDeposit
.
TokenPair
.
L2
TokenAddress
.
String
(),
Address
:
deposit
.
L1BridgeDeposit
.
TokenPair
.
Remote
TokenAddress
.
String
(),
Name
:
"TODO"
,
Name
:
"TODO"
,
Symbol
:
"TODO"
,
Symbol
:
"TODO"
,
Decimals
:
420
,
Decimals
:
420
,
...
...
indexer/api/routes/withdrawals.go
View file @
5f128658
...
@@ -73,7 +73,7 @@ func newWithdrawalResponse(withdrawals []*database.L2BridgeWithdrawalWithTransac
...
@@ -73,7 +73,7 @@ func newWithdrawalResponse(withdrawals []*database.L2BridgeWithdrawalWithTransac
WithdrawalState
:
"COMPLETE"
,
// TODO
WithdrawalState
:
"COMPLETE"
,
// TODO
L1Token
:
TokenInfo
{
L1Token
:
TokenInfo
{
ChainId
:
1
,
ChainId
:
1
,
Address
:
withdrawal
.
L2BridgeWithdrawal
.
TokenPair
.
L1
TokenAddress
.
String
(),
Address
:
withdrawal
.
L2BridgeWithdrawal
.
TokenPair
.
Remote
TokenAddress
.
String
(),
Name
:
"Example"
,
// TODO
Name
:
"Example"
,
// TODO
Symbol
:
"EXAMPLE"
,
// TODO
Symbol
:
"EXAMPLE"
,
// TODO
Decimals
:
18
,
// TODO
Decimals
:
18
,
// TODO
...
@@ -83,7 +83,7 @@ func newWithdrawalResponse(withdrawals []*database.L2BridgeWithdrawalWithTransac
...
@@ -83,7 +83,7 @@ func newWithdrawalResponse(withdrawals []*database.L2BridgeWithdrawalWithTransac
},
},
L2Token
:
TokenInfo
{
L2Token
:
TokenInfo
{
ChainId
:
10
,
ChainId
:
10
,
Address
:
withdrawal
.
L2BridgeWithdrawal
.
TokenPair
.
L
2
TokenAddress
.
String
(),
Address
:
withdrawal
.
L2BridgeWithdrawal
.
TokenPair
.
L
ocal
TokenAddress
.
String
(),
Name
:
"Example"
,
// TODO
Name
:
"Example"
,
// TODO
Symbol
:
"EXAMPLE"
,
// TODO
Symbol
:
"EXAMPLE"
,
// TODO
Decimals
:
18
,
// TODO
Decimals
:
18
,
// TODO
...
...
indexer/database/bridge_messages.go
View file @
5f128658
...
@@ -3,7 +3,6 @@ package database
...
@@ -3,7 +3,6 @@ package database
import
(
import
(
"errors"
"errors"
"fmt"
"fmt"
"math/big"
"gorm.io/gorm"
"gorm.io/gorm"
...
@@ -17,8 +16,8 @@ import (
...
@@ -17,8 +16,8 @@ import (
*/
*/
type
BridgeMessage
struct
{
type
BridgeMessage
struct
{
Nonce
U256
`gorm:"primaryKey
"`
MessageHash
common
.
Hash
`gorm:"primaryKey;serializer:json
"`
MessageHash
common
.
Hash
`gorm:"serializer:json"`
Nonce
U256
SentMessageEventGUID
uuid
.
UUID
SentMessageEventGUID
uuid
.
UUID
RelayedMessageEventGUID
*
uuid
.
UUID
RelayedMessageEventGUID
*
uuid
.
UUID
...
@@ -38,13 +37,11 @@ type L2BridgeMessage struct {
...
@@ -38,13 +37,11 @@ type L2BridgeMessage struct {
}
}
type
BridgeMessagesView
interface
{
type
BridgeMessagesView
interface
{
L1BridgeMessage
(
*
big
.
Int
)
(
*
L1BridgeMessage
,
error
)
L1BridgeMessage
(
common
.
Hash
)
(
*
L1BridgeMessage
,
error
)
L1BridgeMessageByHash
(
common
.
Hash
)
(
*
L1BridgeMessage
,
error
)
L1BridgeMessageWithFilter
(
BridgeMessage
)
(
*
L1BridgeMessage
,
error
)
LatestL1BridgeMessageNonce
()
(
*
big
.
Int
,
error
)
L2BridgeMessage
(
*
big
.
Int
)
(
*
L2BridgeMessage
,
error
)
L2BridgeMessage
(
common
.
Hash
)
(
*
L2BridgeMessage
,
error
)
L2BridgeMessageByHash
(
common
.
Hash
)
(
*
L2BridgeMessage
,
error
)
L2BridgeMessageWithFilter
(
BridgeMessage
)
(
*
L2BridgeMessage
,
error
)
LatestL2BridgeMessageNonce
()
(
*
big
.
Int
,
error
)
}
}
type
BridgeMessagesDB
interface
{
type
BridgeMessagesDB
interface
{
...
@@ -78,22 +75,13 @@ func (db bridgeMessagesDB) StoreL1BridgeMessages(messages []*L1BridgeMessage) er
...
@@ -78,22 +75,13 @@ func (db bridgeMessagesDB) StoreL1BridgeMessages(messages []*L1BridgeMessage) er
return
result
.
Error
return
result
.
Error
}
}
func
(
db
bridgeMessagesDB
)
L1BridgeMessage
(
nonce
*
big
.
Int
)
(
*
L1BridgeMessage
,
error
)
{
func
(
db
bridgeMessagesDB
)
L1BridgeMessage
(
msgHash
common
.
Hash
)
(
*
L1BridgeMessage
,
error
)
{
var
sentMessage
L1BridgeMessage
return
db
.
L1BridgeMessageWithFilter
(
BridgeMessage
{
MessageHash
:
msgHash
})
result
:=
db
.
gorm
.
Where
(
&
BridgeMessage
{
Nonce
:
U256
{
Int
:
nonce
}})
.
Take
(
&
sentMessage
)
if
result
.
Error
!=
nil
{
if
errors
.
Is
(
result
.
Error
,
gorm
.
ErrRecordNotFound
)
{
return
nil
,
nil
}
return
nil
,
result
.
Error
}
return
&
sentMessage
,
nil
}
}
func
(
db
bridgeMessagesDB
)
L1BridgeMessage
ByHash
(
messageHash
common
.
Hash
)
(
*
L1BridgeMessage
,
error
)
{
func
(
db
bridgeMessagesDB
)
L1BridgeMessage
WithFilter
(
filter
BridgeMessage
)
(
*
L1BridgeMessage
,
error
)
{
var
sentMessage
L1BridgeMessage
var
sentMessage
L1BridgeMessage
result
:=
db
.
gorm
.
Where
(
&
BridgeMessage
{
MessageHash
:
messageHash
}
)
.
Take
(
&
sentMessage
)
result
:=
db
.
gorm
.
Where
(
&
filter
)
.
Take
(
&
sentMessage
)
if
result
.
Error
!=
nil
{
if
result
.
Error
!=
nil
{
if
errors
.
Is
(
result
.
Error
,
gorm
.
ErrRecordNotFound
)
{
if
errors
.
Is
(
result
.
Error
,
gorm
.
ErrRecordNotFound
)
{
return
nil
,
nil
return
nil
,
nil
...
@@ -104,25 +92,8 @@ func (db bridgeMessagesDB) L1BridgeMessageByHash(messageHash common.Hash) (*L1Br
...
@@ -104,25 +92,8 @@ func (db bridgeMessagesDB) L1BridgeMessageByHash(messageHash common.Hash) (*L1Br
return
&
sentMessage
,
nil
return
&
sentMessage
,
nil
}
}
func
(
db
bridgeMessagesDB
)
LatestL1BridgeMessageNonce
()
(
*
big
.
Int
,
error
)
{
var
sentMessage
L1BridgeMessage
result
:=
db
.
gorm
.
Order
(
"nonce DESC"
)
.
Take
(
&
sentMessage
)
if
result
.
Error
!=
nil
{
if
errors
.
Is
(
result
.
Error
,
gorm
.
ErrRecordNotFound
)
{
return
nil
,
nil
}
return
nil
,
result
.
Error
}
return
sentMessage
.
Nonce
.
Int
,
nil
}
/**
* Arbitrary Messages Sent from L2
*/
func
(
db
bridgeMessagesDB
)
MarkRelayedL1BridgeMessage
(
messageHash
common
.
Hash
,
relayEvent
uuid
.
UUID
)
error
{
func
(
db
bridgeMessagesDB
)
MarkRelayedL1BridgeMessage
(
messageHash
common
.
Hash
,
relayEvent
uuid
.
UUID
)
error
{
message
,
err
:=
db
.
L1BridgeMessage
ByHash
(
messageHash
)
message
,
err
:=
db
.
L1BridgeMessage
(
messageHash
)
if
err
!=
nil
{
if
err
!=
nil
{
return
err
return
err
}
else
if
message
==
nil
{
}
else
if
message
==
nil
{
...
@@ -134,27 +105,22 @@ func (db bridgeMessagesDB) MarkRelayedL1BridgeMessage(messageHash common.Hash, r
...
@@ -134,27 +105,22 @@ func (db bridgeMessagesDB) MarkRelayedL1BridgeMessage(messageHash common.Hash, r
return
result
.
Error
return
result
.
Error
}
}
/**
* Arbitrary Messages Sent from L2
*/
func
(
db
bridgeMessagesDB
)
StoreL2BridgeMessages
(
messages
[]
*
L2BridgeMessage
)
error
{
func
(
db
bridgeMessagesDB
)
StoreL2BridgeMessages
(
messages
[]
*
L2BridgeMessage
)
error
{
result
:=
db
.
gorm
.
Create
(
&
messages
)
result
:=
db
.
gorm
.
Create
(
&
messages
)
return
result
.
Error
return
result
.
Error
}
}
func
(
db
bridgeMessagesDB
)
L2BridgeMessage
(
nonce
*
big
.
Int
)
(
*
L2BridgeMessage
,
error
)
{
func
(
db
bridgeMessagesDB
)
L2BridgeMessage
(
msgHash
common
.
Hash
)
(
*
L2BridgeMessage
,
error
)
{
var
sentMessage
L2BridgeMessage
return
db
.
L2BridgeMessageWithFilter
(
BridgeMessage
{
MessageHash
:
msgHash
})
result
:=
db
.
gorm
.
Where
(
&
BridgeMessage
{
Nonce
:
U256
{
Int
:
nonce
}})
.
Take
(
&
sentMessage
)
if
result
.
Error
!=
nil
{
if
errors
.
Is
(
result
.
Error
,
gorm
.
ErrRecordNotFound
)
{
return
nil
,
nil
}
return
nil
,
result
.
Error
}
return
&
sentMessage
,
nil
}
}
func
(
db
bridgeMessagesDB
)
L2BridgeMessage
ByHash
(
messageHash
common
.
Hash
)
(
*
L2BridgeMessage
,
error
)
{
func
(
db
bridgeMessagesDB
)
L2BridgeMessage
WithFilter
(
filter
BridgeMessage
)
(
*
L2BridgeMessage
,
error
)
{
var
sentMessage
L2BridgeMessage
var
sentMessage
L2BridgeMessage
result
:=
db
.
gorm
.
Where
(
&
BridgeMessage
{
MessageHash
:
messageHash
}
)
.
Take
(
&
sentMessage
)
result
:=
db
.
gorm
.
Where
(
&
filter
)
.
Take
(
&
sentMessage
)
if
result
.
Error
!=
nil
{
if
result
.
Error
!=
nil
{
if
errors
.
Is
(
result
.
Error
,
gorm
.
ErrRecordNotFound
)
{
if
errors
.
Is
(
result
.
Error
,
gorm
.
ErrRecordNotFound
)
{
return
nil
,
nil
return
nil
,
nil
...
@@ -165,21 +131,8 @@ func (db bridgeMessagesDB) L2BridgeMessageByHash(messageHash common.Hash) (*L2Br
...
@@ -165,21 +131,8 @@ func (db bridgeMessagesDB) L2BridgeMessageByHash(messageHash common.Hash) (*L2Br
return
&
sentMessage
,
nil
return
&
sentMessage
,
nil
}
}
func
(
db
bridgeMessagesDB
)
LatestL2BridgeMessageNonce
()
(
*
big
.
Int
,
error
)
{
var
sentMessage
L2BridgeMessage
result
:=
db
.
gorm
.
Order
(
"nonce DESC"
)
.
Take
(
&
sentMessage
)
if
result
.
Error
!=
nil
{
if
errors
.
Is
(
result
.
Error
,
gorm
.
ErrRecordNotFound
)
{
return
nil
,
nil
}
return
nil
,
result
.
Error
}
return
sentMessage
.
Nonce
.
Int
,
nil
}
func
(
db
bridgeMessagesDB
)
MarkRelayedL2BridgeMessage
(
messageHash
common
.
Hash
,
relayEvent
uuid
.
UUID
)
error
{
func
(
db
bridgeMessagesDB
)
MarkRelayedL2BridgeMessage
(
messageHash
common
.
Hash
,
relayEvent
uuid
.
UUID
)
error
{
message
,
err
:=
db
.
L2BridgeMessage
ByHash
(
messageHash
)
message
,
err
:=
db
.
L2BridgeMessage
(
messageHash
)
if
err
!=
nil
{
if
err
!=
nil
{
return
err
return
err
}
else
if
message
==
nil
{
}
else
if
message
==
nil
{
...
...
indexer/database/bridge_transactions.go
View file @
5f128658
...
@@ -24,21 +24,16 @@ type Transaction struct {
...
@@ -24,21 +24,16 @@ type Transaction struct {
}
}
type
L1TransactionDeposit
struct
{
type
L1TransactionDeposit
struct
{
SourceHash
common
.
Hash
`gorm:"serializer:json;primaryKey"`
SourceHash
common
.
Hash
`gorm:"serializer:json;primaryKey"`
L2TransactionHash
common
.
Hash
`gorm:"serializer:json"`
L2TransactionHash
common
.
Hash
`gorm:"serializer:json"`
InitiatedL1EventGUID
uuid
.
UUID
InitiatedL1EventGUID
uuid
.
UUID
Version
U256
OpaqueData
hexutil
.
Bytes
`gorm:"serializer:json"`
Tx
Transaction
`gorm:"embedded"`
Tx
Transaction
`gorm:"embedded"`
GasLimit
U256
GasLimit
U256
}
}
type
L2TransactionWithdrawal
struct
{
type
L2TransactionWithdrawal
struct
{
WithdrawalHash
common
.
Hash
`gorm:"serializer:json;primaryKey"`
WithdrawalHash
common
.
Hash
`gorm:"serializer:json;primaryKey"`
Nonce
U256
Nonce
U256
InitiatedL2EventGUID
uuid
.
UUID
InitiatedL2EventGUID
uuid
.
UUID
...
...
indexer/database/bridge_transfers.go
View file @
5f128658
...
@@ -2,31 +2,39 @@ package database
...
@@ -2,31 +2,39 @@ package database
import
(
import
(
"errors"
"errors"
"math/big"
"gorm.io/gorm"
"gorm.io/gorm"
"github.com/ethereum-optimism/optimism/op-bindings/predeploys"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/common"
)
)
var
(
ETHTokenPair
=
TokenPair
{
LocalTokenAddress
:
predeploys
.
LegacyERC20ETHAddr
,
RemoteTokenAddress
:
predeploys
.
LegacyERC20ETHAddr
}
)
/**
/**
* Types
* Types
*/
*/
type
TokenPair
struct
{
type
TokenPair
struct
{
L
1TokenAddress
common
.
Address
`gorm:"serializer:json"`
L
ocalTokenAddress
common
.
Address
`gorm:"serializer:json"`
L2
TokenAddress
common
.
Address
`gorm:"serializer:json"`
Remote
TokenAddress
common
.
Address
`gorm:"serializer:json"`
}
}
type
L1BridgeDeposit
struct
{
type
BridgeTransfer
struct
{
TransactionSourceHash
common
.
Hash
`gorm:"primaryKey;serializer:json"`
CrossDomainMessageHash
*
common
.
Hash
`gorm:"serializer:json"`
CrossDomainMessengerNonce
*
U256
Tx
Transaction
`gorm:"embedded"`
Tx
Transaction
`gorm:"embedded"`
TokenPair
TokenPair
`gorm:"embedded"`
TokenPair
TokenPair
`gorm:"embedded"`
}
}
type
L1BridgeDeposit
struct
{
BridgeTransfer
`gorm:"embedded"`
TransactionSourceHash
common
.
Hash
`gorm:"primaryKey;serializer:json"`
}
type
L1BridgeDepositWithTransactionHashes
struct
{
type
L1BridgeDepositWithTransactionHashes
struct
{
L1BridgeDeposit
L1BridgeDeposit
`gorm:"embedded"`
L1BridgeDeposit
L1BridgeDeposit
`gorm:"embedded"`
...
@@ -35,12 +43,9 @@ type L1BridgeDepositWithTransactionHashes struct {
...
@@ -35,12 +43,9 @@ type L1BridgeDepositWithTransactionHashes struct {
}
}
type
L2BridgeWithdrawal
struct
{
type
L2BridgeWithdrawal
struct
{
TransactionWithdrawalHash
common
.
Hash
`gorm:"primaryKey;serializer:json"`
BridgeTransfer
`gorm:"embedded"`
CrossDomainMessengerNonce
*
U256
Tx
Transaction
`gorm:"embedded"`
TransactionWithdrawalHash
common
.
Hash
`gorm:"primaryKey;serializer:json"`
TokenPair
TokenPair
`gorm:"embedded"`
}
}
type
L2BridgeWithdrawalWithTransactionHashes
struct
{
type
L2BridgeWithdrawalWithTransactionHashes
struct
{
...
@@ -53,11 +58,11 @@ type L2BridgeWithdrawalWithTransactionHashes struct {
...
@@ -53,11 +58,11 @@ type L2BridgeWithdrawalWithTransactionHashes struct {
type
BridgeTransfersView
interface
{
type
BridgeTransfersView
interface
{
L1BridgeDeposit
(
common
.
Hash
)
(
*
L1BridgeDeposit
,
error
)
L1BridgeDeposit
(
common
.
Hash
)
(
*
L1BridgeDeposit
,
error
)
L1BridgeDeposit
ByCrossDomainMessengerNonce
(
*
big
.
Int
)
(
*
L1BridgeDeposit
,
error
)
L1BridgeDeposit
WithFilter
(
BridgeTransfer
)
(
*
L1BridgeDeposit
,
error
)
L1BridgeDepositsByAddress
(
common
.
Address
)
([]
*
L1BridgeDepositWithTransactionHashes
,
error
)
L1BridgeDepositsByAddress
(
common
.
Address
)
([]
*
L1BridgeDepositWithTransactionHashes
,
error
)
L2BridgeWithdrawal
(
common
.
Hash
)
(
*
L2BridgeWithdrawal
,
error
)
L2BridgeWithdrawal
(
common
.
Hash
)
(
*
L2BridgeWithdrawal
,
error
)
L2BridgeWithdrawal
ByCrossDomainMessengerNonce
(
*
big
.
Int
)
(
*
L2BridgeWithdrawal
,
error
)
L2BridgeWithdrawal
WithFilter
(
BridgeTransfer
)
(
*
L2BridgeWithdrawal
,
error
)
L2BridgeWithdrawalsByAddress
(
common
.
Address
)
([]
*
L2BridgeWithdrawalWithTransactionHashes
,
error
)
L2BridgeWithdrawalsByAddress
(
common
.
Address
)
([]
*
L2BridgeWithdrawalWithTransactionHashes
,
error
)
}
}
...
@@ -104,9 +109,9 @@ func (db *bridgeTransfersDB) L1BridgeDeposit(txSourceHash common.Hash) (*L1Bridg
...
@@ -104,9 +109,9 @@ func (db *bridgeTransfersDB) L1BridgeDeposit(txSourceHash common.Hash) (*L1Bridg
// L1BridgeDepositByCrossDomainMessengerNonce retrieves tokens deposited, specified by the associated `L1CrossDomainMessenger` nonce.
// L1BridgeDepositByCrossDomainMessengerNonce retrieves tokens deposited, specified by the associated `L1CrossDomainMessenger` nonce.
// All tokens bridged via the StandardBridge flows through the L1CrossDomainMessenger
// All tokens bridged via the StandardBridge flows through the L1CrossDomainMessenger
func
(
db
*
bridgeTransfersDB
)
L1BridgeDeposit
ByCrossDomainMessengerNonce
(
nonce
*
big
.
Int
)
(
*
L1BridgeDeposit
,
error
)
{
func
(
db
*
bridgeTransfersDB
)
L1BridgeDeposit
WithFilter
(
filter
BridgeTransfer
)
(
*
L1BridgeDeposit
,
error
)
{
var
deposit
L1BridgeDeposit
var
deposit
L1BridgeDeposit
result
:=
db
.
gorm
.
Where
(
&
L1BridgeDeposit
{
CrossDomainMessengerNonce
:
&
U256
{
Int
:
nonce
}}
)
.
Take
(
&
deposit
)
result
:=
db
.
gorm
.
Where
(
&
filter
)
.
Take
(
&
deposit
)
if
result
.
Error
!=
nil
{
if
result
.
Error
!=
nil
{
if
errors
.
Is
(
result
.
Error
,
gorm
.
ErrRecordNotFound
)
{
if
errors
.
Is
(
result
.
Error
,
gorm
.
ErrRecordNotFound
)
{
return
nil
,
nil
return
nil
,
nil
...
@@ -168,9 +173,9 @@ func (db *bridgeTransfersDB) L2BridgeWithdrawal(txWithdrawalHash common.Hash) (*
...
@@ -168,9 +173,9 @@ func (db *bridgeTransfersDB) L2BridgeWithdrawal(txWithdrawalHash common.Hash) (*
// L2BridgeWithdrawalByCrossDomainMessengerNonce retrieves tokens withdrawn, specified by the associated `L2CrossDomainMessenger` nonce.
// L2BridgeWithdrawalByCrossDomainMessengerNonce retrieves tokens withdrawn, specified by the associated `L2CrossDomainMessenger` nonce.
// All tokens bridged via the StandardBridge flows through the L2CrossDomainMessenger
// All tokens bridged via the StandardBridge flows through the L2CrossDomainMessenger
func
(
db
*
bridgeTransfersDB
)
L2BridgeWithdrawal
ByCrossDomainMessengerNonce
(
nonce
*
big
.
Int
)
(
*
L2BridgeWithdrawal
,
error
)
{
func
(
db
*
bridgeTransfersDB
)
L2BridgeWithdrawal
WithFilter
(
filter
BridgeTransfer
)
(
*
L2BridgeWithdrawal
,
error
)
{
var
withdrawal
L2BridgeWithdrawal
var
withdrawal
L2BridgeWithdrawal
result
:=
db
.
gorm
.
Where
(
&
L2BridgeWithdrawal
{
CrossDomainMessengerNonce
:
&
U256
{
Int
:
nonce
}}
)
.
Take
(
&
withdrawal
)
result
:=
db
.
gorm
.
Where
(
filter
)
.
Take
(
&
withdrawal
)
if
result
.
Error
!=
nil
{
if
result
.
Error
!=
nil
{
if
errors
.
Is
(
result
.
Error
,
gorm
.
ErrRecordNotFound
)
{
if
errors
.
Is
(
result
.
Error
,
gorm
.
ErrRecordNotFound
)
{
return
nil
,
nil
return
nil
,
nil
...
...
indexer/e2e_tests/bridge_messages_e2e_test.go
View file @
5f128658
...
@@ -57,12 +57,12 @@ func TestE2EBridgeL1CrossDomainMessenger(t *testing.T) {
...
@@ -57,12 +57,12 @@ func TestE2EBridgeL1CrossDomainMessenger(t *testing.T) {
nonceBytes
:=
[
31
]
byte
{
0
:
byte
(
1
)}
nonceBytes
:=
[
31
]
byte
{
0
:
byte
(
1
)}
nonce
:=
new
(
big
.
Int
)
.
SetBytes
(
nonceBytes
[
:
])
nonce
:=
new
(
big
.
Int
)
.
SetBytes
(
nonceBytes
[
:
])
sentMessage
,
err
:=
testSuite
.
DB
.
BridgeMessages
.
L1BridgeMessage
(
nonce
)
sentMessage
,
err
:=
testSuite
.
DB
.
BridgeMessages
.
L1BridgeMessage
(
parsedMessage
.
MessageHash
)
require
.
NoError
(
t
,
err
)
require
.
NoError
(
t
,
err
)
require
.
NotNil
(
t
,
sentMessage
)
require
.
NotNil
(
t
,
sentMessage
)
require
.
NotNil
(
t
,
sentMessage
.
SentMessageEventGUID
)
require
.
NotNil
(
t
,
sentMessage
.
SentMessageEventGUID
)
require
.
Equal
(
t
,
depositInfo
.
DepositTx
.
SourceHash
,
sentMessage
.
TransactionSourceHash
)
require
.
Equal
(
t
,
depositInfo
.
DepositTx
.
SourceHash
,
sentMessage
.
TransactionSourceHash
)
require
.
Equal
(
t
,
parsedMessage
.
MessageHash
,
sentMessage
.
MessageHash
)
require
.
Equal
(
t
,
nonce
.
Uint64
(),
sentMessage
.
Nonce
.
Int
.
Uint64
()
)
require
.
Equal
(
t
,
uint64
(
100
_000
),
sentMessage
.
GasLimit
.
Int
.
Uint64
())
require
.
Equal
(
t
,
uint64
(
100
_000
),
sentMessage
.
GasLimit
.
Int
.
Uint64
())
require
.
Equal
(
t
,
big
.
NewInt
(
params
.
Ether
),
sentMessage
.
Tx
.
Amount
.
Int
)
require
.
Equal
(
t
,
big
.
NewInt
(
params
.
Ether
),
sentMessage
.
Tx
.
Amount
.
Int
)
require
.
Equal
(
t
,
aliceAddr
,
sentMessage
.
Tx
.
FromAddress
)
require
.
Equal
(
t
,
aliceAddr
,
sentMessage
.
Tx
.
FromAddress
)
...
@@ -83,7 +83,7 @@ func TestE2EBridgeL1CrossDomainMessenger(t *testing.T) {
...
@@ -83,7 +83,7 @@ func TestE2EBridgeL1CrossDomainMessenger(t *testing.T) {
return
l2Header
!=
nil
&&
l2Header
.
Number
.
Uint64
()
>=
depositReceipt
.
BlockNumber
.
Uint64
(),
nil
return
l2Header
!=
nil
&&
l2Header
.
Number
.
Uint64
()
>=
depositReceipt
.
BlockNumber
.
Uint64
(),
nil
}))
}))
sentMessage
,
err
=
testSuite
.
DB
.
BridgeMessages
.
L1BridgeMessage
(
nonce
)
sentMessage
,
err
=
testSuite
.
DB
.
BridgeMessages
.
L1BridgeMessage
(
parsedMessage
.
MessageHash
)
require
.
NoError
(
t
,
err
)
require
.
NoError
(
t
,
err
)
require
.
NotNil
(
t
,
sentMessage
)
require
.
NotNil
(
t
,
sentMessage
)
require
.
NotNil
(
t
,
sentMessage
.
RelayedMessageEventGUID
)
require
.
NotNil
(
t
,
sentMessage
.
RelayedMessageEventGUID
)
...
@@ -143,12 +143,12 @@ func TestE2EBridgeL2CrossDomainMessenger(t *testing.T) {
...
@@ -143,12 +143,12 @@ func TestE2EBridgeL2CrossDomainMessenger(t *testing.T) {
nonceBytes
:=
[
31
]
byte
{
0
:
byte
(
1
)}
nonceBytes
:=
[
31
]
byte
{
0
:
byte
(
1
)}
nonce
:=
new
(
big
.
Int
)
.
SetBytes
(
nonceBytes
[
:
])
nonce
:=
new
(
big
.
Int
)
.
SetBytes
(
nonceBytes
[
:
])
sentMessage
,
err
:=
testSuite
.
DB
.
BridgeMessages
.
L2BridgeMessage
(
nonce
)
sentMessage
,
err
:=
testSuite
.
DB
.
BridgeMessages
.
L2BridgeMessage
(
parsedMessage
.
MessageHash
)
require
.
NoError
(
t
,
err
)
require
.
NoError
(
t
,
err
)
require
.
NotNil
(
t
,
sentMessage
)
require
.
NotNil
(
t
,
sentMessage
)
require
.
NotNil
(
t
,
sentMessage
.
SentMessageEventGUID
)
require
.
NotNil
(
t
,
sentMessage
.
SentMessageEventGUID
)
require
.
Equal
(
t
,
withdrawalHash
,
sentMessage
.
TransactionWithdrawalHash
)
require
.
Equal
(
t
,
withdrawalHash
,
sentMessage
.
TransactionWithdrawalHash
)
require
.
Equal
(
t
,
parsedMessage
.
MessageHash
,
sentMessage
.
MessageHash
)
require
.
Equal
(
t
,
nonce
.
Uint64
(),
sentMessage
.
Nonce
.
Int
.
Uint64
()
)
require
.
Equal
(
t
,
uint64
(
100
_000
),
sentMessage
.
GasLimit
.
Int
.
Uint64
())
require
.
Equal
(
t
,
uint64
(
100
_000
),
sentMessage
.
GasLimit
.
Int
.
Uint64
())
require
.
Equal
(
t
,
big
.
NewInt
(
params
.
Ether
),
sentMessage
.
Tx
.
Amount
.
Int
)
require
.
Equal
(
t
,
big
.
NewInt
(
params
.
Ether
),
sentMessage
.
Tx
.
Amount
.
Int
)
require
.
Equal
(
t
,
aliceAddr
,
sentMessage
.
Tx
.
FromAddress
)
require
.
Equal
(
t
,
aliceAddr
,
sentMessage
.
Tx
.
FromAddress
)
...
@@ -166,7 +166,7 @@ func TestE2EBridgeL2CrossDomainMessenger(t *testing.T) {
...
@@ -166,7 +166,7 @@ func TestE2EBridgeL2CrossDomainMessenger(t *testing.T) {
}))
}))
// message is marked as relayed
// message is marked as relayed
sentMessage
,
err
=
testSuite
.
DB
.
BridgeMessages
.
L2BridgeMessage
(
nonce
)
sentMessage
,
err
=
testSuite
.
DB
.
BridgeMessages
.
L2BridgeMessage
(
parsedMessage
.
MessageHash
)
require
.
NoError
(
t
,
err
)
require
.
NoError
(
t
,
err
)
require
.
NotNil
(
t
,
sentMessage
)
require
.
NotNil
(
t
,
sentMessage
)
require
.
NotNil
(
t
,
sentMessage
.
RelayedMessageEventGUID
)
require
.
NotNil
(
t
,
sentMessage
.
RelayedMessageEventGUID
)
...
...
indexer/e2e_tests/bridge_transactions_e2e_test.go
View file @
5f128658
...
@@ -59,9 +59,6 @@ func TestE2EBridgeTransactionsOptimismPortalDeposits(t *testing.T) {
...
@@ -59,9 +59,6 @@ func TestE2EBridgeTransactionsOptimismPortalDeposits(t *testing.T) {
require
.
Equal
(
t
,
aliceAddr
,
deposit
.
Tx
.
ToAddress
)
require
.
Equal
(
t
,
aliceAddr
,
deposit
.
Tx
.
ToAddress
)
require
.
ElementsMatch
(
t
,
calldata
,
deposit
.
Tx
.
Data
)
require
.
ElementsMatch
(
t
,
calldata
,
deposit
.
Tx
.
Data
)
require
.
Equal
(
t
,
depositInfo
.
Version
.
Uint64
(),
deposit
.
Version
.
Int
.
Uint64
())
require
.
ElementsMatch
(
t
,
depositInfo
.
OpaqueData
,
deposit
.
OpaqueData
)
event
,
err
:=
testSuite
.
DB
.
ContractEvents
.
L1ContractEvent
(
deposit
.
InitiatedL1EventGUID
)
event
,
err
:=
testSuite
.
DB
.
ContractEvents
.
L1ContractEvent
(
deposit
.
InitiatedL1EventGUID
)
require
.
NoError
(
t
,
err
)
require
.
NoError
(
t
,
err
)
require
.
NotNil
(
t
,
event
)
require
.
NotNil
(
t
,
event
)
...
...
indexer/e2e_tests/bridge_transfers_e2e_test.go
View file @
5f128658
...
@@ -7,7 +7,6 @@ import (
...
@@ -7,7 +7,6 @@ import (
"time"
"time"
e2etest_utils
"github.com/ethereum-optimism/optimism/indexer/e2e_tests/utils"
e2etest_utils
"github.com/ethereum-optimism/optimism/indexer/e2e_tests/utils"
"github.com/ethereum-optimism/optimism/indexer/processor"
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/wait"
"github.com/ethereum-optimism/optimism/op-e2e/e2eutils/wait"
"github.com/ethereum-optimism/optimism/op-node/withdrawals"
"github.com/ethereum-optimism/optimism/op-node/withdrawals"
...
@@ -56,8 +55,8 @@ func TestE2EBridgeTransfersStandardBridgeETHDeposit(t *testing.T) {
...
@@ -56,8 +55,8 @@ func TestE2EBridgeTransfersStandardBridgeETHDeposit(t *testing.T) {
deposit
:=
aliceDeposits
[
0
]
.
L1BridgeDeposit
deposit
:=
aliceDeposits
[
0
]
.
L1BridgeDeposit
require
.
Equal
(
t
,
depositInfo
.
DepositTx
.
SourceHash
,
deposit
.
TransactionSourceHash
)
require
.
Equal
(
t
,
depositInfo
.
DepositTx
.
SourceHash
,
deposit
.
TransactionSourceHash
)
require
.
Equal
(
t
,
predeploys
.
LegacyERC20ETHAddr
,
deposit
.
TokenPair
.
L
1
TokenAddress
)
require
.
Equal
(
t
,
predeploys
.
LegacyERC20ETHAddr
,
deposit
.
TokenPair
.
L
ocal
TokenAddress
)
require
.
Equal
(
t
,
predeploys
.
LegacyERC20ETHAddr
,
deposit
.
TokenPair
.
L2
TokenAddress
)
require
.
Equal
(
t
,
predeploys
.
LegacyERC20ETHAddr
,
deposit
.
TokenPair
.
Remote
TokenAddress
)
require
.
Equal
(
t
,
big
.
NewInt
(
params
.
Ether
),
deposit
.
Tx
.
Amount
.
Int
)
require
.
Equal
(
t
,
big
.
NewInt
(
params
.
Ether
),
deposit
.
Tx
.
Amount
.
Int
)
require
.
Equal
(
t
,
aliceAddr
,
deposit
.
Tx
.
FromAddress
)
require
.
Equal
(
t
,
aliceAddr
,
deposit
.
Tx
.
FromAddress
)
require
.
Equal
(
t
,
aliceAddr
,
deposit
.
Tx
.
ToAddress
)
require
.
Equal
(
t
,
aliceAddr
,
deposit
.
Tx
.
ToAddress
)
...
@@ -65,9 +64,7 @@ func TestE2EBridgeTransfersStandardBridgeETHDeposit(t *testing.T) {
...
@@ -65,9 +64,7 @@ func TestE2EBridgeTransfersStandardBridgeETHDeposit(t *testing.T) {
// StandardBridge flows through the messenger. We remove the first two significant
// StandardBridge flows through the messenger. We remove the first two significant
// bytes of the nonce dedicated to the version. nonce == 0 (first message)
// bytes of the nonce dedicated to the version. nonce == 0 (first message)
require
.
NotNil
(
t
,
deposit
.
CrossDomainMessengerNonce
)
require
.
NotNil
(
t
,
deposit
.
CrossDomainMessageHash
)
_
,
nonce
:=
processor
.
DecodeVersionedNonce
(
deposit
.
CrossDomainMessengerNonce
.
Int
)
require
.
Zero
(
t
,
nonce
.
Uint64
())
// (2) Test Deposit Finalization via CrossDomainMessenger relayed message
// (2) Test Deposit Finalization via CrossDomainMessenger relayed message
depositReceipt
,
err
=
wait
.
ForReceiptOK
(
context
.
Background
(),
testSuite
.
L2Client
,
types
.
NewTx
(
depositInfo
.
DepositTx
)
.
Hash
())
depositReceipt
,
err
=
wait
.
ForReceiptOK
(
context
.
Background
(),
testSuite
.
L2Client
,
types
.
NewTx
(
depositInfo
.
DepositTx
)
.
Hash
())
...
@@ -77,7 +74,7 @@ func TestE2EBridgeTransfersStandardBridgeETHDeposit(t *testing.T) {
...
@@ -77,7 +74,7 @@ func TestE2EBridgeTransfersStandardBridgeETHDeposit(t *testing.T) {
return
l2Header
!=
nil
&&
l2Header
.
Number
.
Uint64
()
>=
depositReceipt
.
BlockNumber
.
Uint64
(),
nil
return
l2Header
!=
nil
&&
l2Header
.
Number
.
Uint64
()
>=
depositReceipt
.
BlockNumber
.
Uint64
(),
nil
}))
}))
crossDomainBridgeMessage
,
err
:=
testSuite
.
DB
.
BridgeMessages
.
L1BridgeMessage
(
deposit
.
CrossDomainMessengerNonce
.
Int
)
crossDomainBridgeMessage
,
err
:=
testSuite
.
DB
.
BridgeMessages
.
L1BridgeMessage
(
*
deposit
.
CrossDomainMessageHash
)
require
.
NoError
(
t
,
err
)
require
.
NoError
(
t
,
err
)
require
.
NotNil
(
t
,
crossDomainBridgeMessage
)
require
.
NotNil
(
t
,
crossDomainBridgeMessage
)
require
.
NotNil
(
t
,
crossDomainBridgeMessage
.
RelayedMessageEventGUID
)
require
.
NotNil
(
t
,
crossDomainBridgeMessage
.
RelayedMessageEventGUID
)
...
@@ -117,18 +114,28 @@ func TestE2EBridgeTransfersOptimismPortalETHReceive(t *testing.T) {
...
@@ -117,18 +114,28 @@ func TestE2EBridgeTransfersOptimismPortalETHReceive(t *testing.T) {
deposit
:=
aliceDeposits
[
0
]
.
L1BridgeDeposit
deposit
:=
aliceDeposits
[
0
]
.
L1BridgeDeposit
require
.
Equal
(
t
,
depositInfo
.
DepositTx
.
SourceHash
,
deposit
.
TransactionSourceHash
)
require
.
Equal
(
t
,
depositInfo
.
DepositTx
.
SourceHash
,
deposit
.
TransactionSourceHash
)
require
.
Equal
(
t
,
predeploys
.
LegacyERC20ETHAddr
,
deposit
.
TokenPair
.
L
1
TokenAddress
)
require
.
Equal
(
t
,
predeploys
.
LegacyERC20ETHAddr
,
deposit
.
TokenPair
.
L
ocal
TokenAddress
)
require
.
Equal
(
t
,
predeploys
.
LegacyERC20ETHAddr
,
deposit
.
TokenPair
.
L2
TokenAddress
)
require
.
Equal
(
t
,
predeploys
.
LegacyERC20ETHAddr
,
deposit
.
TokenPair
.
Remote
TokenAddress
)
require
.
Equal
(
t
,
big
.
NewInt
(
params
.
Ether
),
deposit
.
Tx
.
Amount
.
Int
)
require
.
Equal
(
t
,
big
.
NewInt
(
params
.
Ether
),
deposit
.
Tx
.
Amount
.
Int
)
require
.
Equal
(
t
,
aliceAddr
,
deposit
.
Tx
.
FromAddress
)
require
.
Equal
(
t
,
aliceAddr
,
deposit
.
Tx
.
FromAddress
)
require
.
Equal
(
t
,
aliceAddr
,
deposit
.
Tx
.
ToAddress
)
require
.
Equal
(
t
,
aliceAddr
,
deposit
.
Tx
.
ToAddress
)
require
.
Len
(
t
,
deposit
.
Tx
.
Data
,
0
)
require
.
Len
(
t
,
deposit
.
Tx
.
Data
,
0
)
// deposit was not sent through the cross domain messenger
// deposit was not sent through the cross domain messenger
require
.
Nil
(
t
,
deposit
.
CrossDomainMess
engerNonce
)
require
.
Nil
(
t
,
deposit
.
CrossDomainMess
ageHash
)
// (2) Test Deposit Finalization
// (2) Test Deposit Finalization
// Nothing to do as we rely on the derivation process to include the deposit
depositReceipt
,
err
:=
wait
.
ForReceiptOK
(
context
.
Background
(),
testSuite
.
L2Client
,
types
.
NewTx
(
depositInfo
.
DepositTx
)
.
Hash
())
require
.
NoError
(
t
,
err
)
require
.
NoError
(
t
,
wait
.
For
(
context
.
Background
(),
500
*
time
.
Millisecond
,
func
()
(
bool
,
error
)
{
l2Header
:=
testSuite
.
Indexer
.
L2Processor
.
LatestProcessedHeader
()
return
l2Header
!=
nil
&&
l2Header
.
Number
.
Uint64
()
>=
depositReceipt
.
BlockNumber
.
Uint64
(),
nil
}))
// Still nil as the withdrawal did not occur through the standard bridge
aliceDeposits
,
err
=
testSuite
.
DB
.
BridgeTransfers
.
L1BridgeDepositsByAddress
(
aliceAddr
)
require
.
NoError
(
t
,
err
)
require
.
Nil
(
t
,
aliceDeposits
[
0
]
.
L1BridgeDeposit
.
CrossDomainMessageHash
)
}
}
func
TestE2EBridgeTransfersStandardBridgeETHWithdrawal
(
t
*
testing
.
T
)
{
func
TestE2EBridgeTransfersStandardBridgeETHWithdrawal
(
t
*
testing
.
T
)
{
...
@@ -178,8 +185,8 @@ func TestE2EBridgeTransfersStandardBridgeETHWithdrawal(t *testing.T) {
...
@@ -178,8 +185,8 @@ func TestE2EBridgeTransfersStandardBridgeETHWithdrawal(t *testing.T) {
withdrawal
:=
aliceWithdrawals
[
0
]
.
L2BridgeWithdrawal
withdrawal
:=
aliceWithdrawals
[
0
]
.
L2BridgeWithdrawal
require
.
Equal
(
t
,
withdrawalHash
,
withdrawal
.
TransactionWithdrawalHash
)
require
.
Equal
(
t
,
withdrawalHash
,
withdrawal
.
TransactionWithdrawalHash
)
require
.
Equal
(
t
,
predeploys
.
LegacyERC20ETHAddr
,
withdrawal
.
TokenPair
.
L
1
TokenAddress
)
require
.
Equal
(
t
,
predeploys
.
LegacyERC20ETHAddr
,
withdrawal
.
TokenPair
.
L
ocal
TokenAddress
)
require
.
Equal
(
t
,
predeploys
.
LegacyERC20ETHAddr
,
withdrawal
.
TokenPair
.
L2
TokenAddress
)
require
.
Equal
(
t
,
predeploys
.
LegacyERC20ETHAddr
,
withdrawal
.
TokenPair
.
Remote
TokenAddress
)
require
.
Equal
(
t
,
big
.
NewInt
(
params
.
Ether
),
withdrawal
.
Tx
.
Amount
.
Int
)
require
.
Equal
(
t
,
big
.
NewInt
(
params
.
Ether
),
withdrawal
.
Tx
.
Amount
.
Int
)
require
.
Equal
(
t
,
aliceAddr
,
withdrawal
.
Tx
.
FromAddress
)
require
.
Equal
(
t
,
aliceAddr
,
withdrawal
.
Tx
.
FromAddress
)
require
.
Equal
(
t
,
aliceAddr
,
withdrawal
.
Tx
.
ToAddress
)
require
.
Equal
(
t
,
aliceAddr
,
withdrawal
.
Tx
.
ToAddress
)
...
@@ -187,9 +194,11 @@ func TestE2EBridgeTransfersStandardBridgeETHWithdrawal(t *testing.T) {
...
@@ -187,9 +194,11 @@ func TestE2EBridgeTransfersStandardBridgeETHWithdrawal(t *testing.T) {
// StandardBridge flows through the messenger. We remove the first two
// StandardBridge flows through the messenger. We remove the first two
// bytes of the nonce dedicated to the version. nonce == 0 (first message)
// bytes of the nonce dedicated to the version. nonce == 0 (first message)
require
.
NotNil
(
t
,
withdrawal
.
CrossDomainMessengerNonce
)
require
.
NotNil
(
t
,
withdrawal
.
CrossDomainMessageHash
)
_
,
nonce
:=
processor
.
DecodeVersionedNonce
(
withdrawal
.
CrossDomainMessengerNonce
.
Int
)
require
.
Zero
(
t
,
nonce
.
Uint64
())
crossDomainBridgeMessage
,
err
:=
testSuite
.
DB
.
BridgeMessages
.
L2BridgeMessage
(
*
withdrawal
.
CrossDomainMessageHash
)
require
.
NoError
(
t
,
err
)
require
.
Nil
(
t
,
crossDomainBridgeMessage
.
RelayedMessageEventGUID
)
// (2) Test Withdrawal Proven/Finalized. Test the sql join queries to populate the right transaction
// (2) Test Withdrawal Proven/Finalized. Test the sql join queries to populate the right transaction
require
.
Empty
(
t
,
aliceWithdrawals
[
0
]
.
ProvenL1TransactionHash
)
require
.
Empty
(
t
,
aliceWithdrawals
[
0
]
.
ProvenL1TransactionHash
)
...
@@ -206,6 +215,11 @@ func TestE2EBridgeTransfersStandardBridgeETHWithdrawal(t *testing.T) {
...
@@ -206,6 +215,11 @@ func TestE2EBridgeTransfersStandardBridgeETHWithdrawal(t *testing.T) {
require
.
NoError
(
t
,
err
)
require
.
NoError
(
t
,
err
)
require
.
Equal
(
t
,
proveReceipt
.
TxHash
,
aliceWithdrawals
[
0
]
.
ProvenL1TransactionHash
)
require
.
Equal
(
t
,
proveReceipt
.
TxHash
,
aliceWithdrawals
[
0
]
.
ProvenL1TransactionHash
)
require
.
Equal
(
t
,
finalizeReceipt
.
TxHash
,
aliceWithdrawals
[
0
]
.
FinalizedL1TransactionHash
)
require
.
Equal
(
t
,
finalizeReceipt
.
TxHash
,
aliceWithdrawals
[
0
]
.
FinalizedL1TransactionHash
)
crossDomainBridgeMessage
,
err
=
testSuite
.
DB
.
BridgeMessages
.
L2BridgeMessage
(
*
withdrawal
.
CrossDomainMessageHash
)
require
.
NoError
(
t
,
err
)
require
.
NotNil
(
t
,
crossDomainBridgeMessage
)
require
.
NotNil
(
t
,
crossDomainBridgeMessage
.
RelayedMessageEventGUID
)
}
}
func
TestE2EBridgeTransfersL2ToL1MessagePasserReceive
(
t
*
testing
.
T
)
{
func
TestE2EBridgeTransfersL2ToL1MessagePasserReceive
(
t
*
testing
.
T
)
{
...
@@ -254,15 +268,15 @@ func TestE2EBridgeTransfersL2ToL1MessagePasserReceive(t *testing.T) {
...
@@ -254,15 +268,15 @@ func TestE2EBridgeTransfersL2ToL1MessagePasserReceive(t *testing.T) {
withdrawal
:=
aliceWithdrawals
[
0
]
.
L2BridgeWithdrawal
withdrawal
:=
aliceWithdrawals
[
0
]
.
L2BridgeWithdrawal
require
.
Equal
(
t
,
withdrawalHash
,
withdrawal
.
TransactionWithdrawalHash
)
require
.
Equal
(
t
,
withdrawalHash
,
withdrawal
.
TransactionWithdrawalHash
)
require
.
Equal
(
t
,
predeploys
.
LegacyERC20ETHAddr
,
withdrawal
.
TokenPair
.
L
1
TokenAddress
)
require
.
Equal
(
t
,
predeploys
.
LegacyERC20ETHAddr
,
withdrawal
.
TokenPair
.
L
ocal
TokenAddress
)
require
.
Equal
(
t
,
predeploys
.
LegacyERC20ETHAddr
,
withdrawal
.
TokenPair
.
L2
TokenAddress
)
require
.
Equal
(
t
,
predeploys
.
LegacyERC20ETHAddr
,
withdrawal
.
TokenPair
.
Remote
TokenAddress
)
require
.
Equal
(
t
,
big
.
NewInt
(
params
.
Ether
),
withdrawal
.
Tx
.
Amount
.
Int
)
require
.
Equal
(
t
,
big
.
NewInt
(
params
.
Ether
),
withdrawal
.
Tx
.
Amount
.
Int
)
require
.
Equal
(
t
,
aliceAddr
,
withdrawal
.
Tx
.
FromAddress
)
require
.
Equal
(
t
,
aliceAddr
,
withdrawal
.
Tx
.
FromAddress
)
require
.
Equal
(
t
,
aliceAddr
,
withdrawal
.
Tx
.
ToAddress
)
require
.
Equal
(
t
,
aliceAddr
,
withdrawal
.
Tx
.
ToAddress
)
require
.
Len
(
t
,
withdrawal
.
Tx
.
Data
,
0
)
require
.
Len
(
t
,
withdrawal
.
Tx
.
Data
,
0
)
// withdrawal was not sent through the cross domain messenger
// withdrawal was not sent through the cross domain messenger
require
.
Nil
(
t
,
withdrawal
.
CrossDomainMess
engerNonce
)
require
.
Nil
(
t
,
withdrawal
.
CrossDomainMess
ageHash
)
// (2) Test Withdrawal Proven/Finalized. Test the sql join queries to populate the right transaction
// (2) Test Withdrawal Proven/Finalized. Test the sql join queries to populate the right transaction
require
.
Empty
(
t
,
aliceWithdrawals
[
0
]
.
ProvenL1TransactionHash
)
require
.
Empty
(
t
,
aliceWithdrawals
[
0
]
.
ProvenL1TransactionHash
)
...
@@ -279,4 +293,7 @@ func TestE2EBridgeTransfersL2ToL1MessagePasserReceive(t *testing.T) {
...
@@ -279,4 +293,7 @@ func TestE2EBridgeTransfersL2ToL1MessagePasserReceive(t *testing.T) {
require
.
NoError
(
t
,
err
)
require
.
NoError
(
t
,
err
)
require
.
Equal
(
t
,
proveReceipt
.
TxHash
,
aliceWithdrawals
[
0
]
.
ProvenL1TransactionHash
)
require
.
Equal
(
t
,
proveReceipt
.
TxHash
,
aliceWithdrawals
[
0
]
.
ProvenL1TransactionHash
)
require
.
Equal
(
t
,
finalizeReceipt
.
TxHash
,
aliceWithdrawals
[
0
]
.
FinalizedL1TransactionHash
)
require
.
Equal
(
t
,
finalizeReceipt
.
TxHash
,
aliceWithdrawals
[
0
]
.
FinalizedL1TransactionHash
)
// Still nil as the withdrawal did not occur through the standard bridge
require
.
Nil
(
t
,
aliceWithdrawals
[
0
]
.
L2BridgeWithdrawal
.
CrossDomainMessageHash
)
}
}
indexer/migrations/20230523_create_schema.sql
View file @
5f128658
...
@@ -116,10 +116,6 @@ CREATE TABLE IF NOT EXISTS l1_transaction_deposits (
...
@@ -116,10 +116,6 @@ CREATE TABLE IF NOT EXISTS l1_transaction_deposits (
initiated_l1_event_guid
VARCHAR
NOT
NULL
REFERENCES
l1_contract_events
(
guid
),
initiated_l1_event_guid
VARCHAR
NOT
NULL
REFERENCES
l1_contract_events
(
guid
),
-- OptimismPortal specific
version
UINT256
NOT
NULL
,
opaque_data
VARCHAR
NOT
NULL
,
-- transaction data
-- transaction data
from_address
VARCHAR
NOT
NULL
,
from_address
VARCHAR
NOT
NULL
,
to_address
VARCHAR
NOT
NULL
,
to_address
VARCHAR
NOT
NULL
,
...
@@ -152,9 +148,10 @@ CREATE TABLE IF NOT EXISTS l2_transaction_withdrawals (
...
@@ -152,9 +148,10 @@ CREATE TABLE IF NOT EXISTS l2_transaction_withdrawals (
-- CrossDomainMessenger
-- CrossDomainMessenger
CREATE
TABLE
IF
NOT
EXISTS
l1_bridge_messages
(
CREATE
TABLE
IF
NOT
EXISTS
l1_bridge_messages
(
nonce
UINT256
NOT
NULL
PRIMARY
KEY
,
message_hash
VARCHAR
NOT
NULL
PRIMARY
KEY
,
message_hash
VARCHAR
NOT
NULL
,
nonce
UINT256
NOT
NULL
UNIQUE
,
transaction_source_hash
VARCHAR
NOT
NULL
REFERENCES
l1_transaction_deposits
(
source_hash
),
transaction_source_hash
VARCHAR
NOT
NULL
UNIQUE
REFERENCES
l1_transaction_deposits
(
source_hash
),
sent_message_event_guid
VARCHAR
NOT
NULL
UNIQUE
REFERENCES
l1_contract_events
(
guid
),
sent_message_event_guid
VARCHAR
NOT
NULL
UNIQUE
REFERENCES
l1_contract_events
(
guid
),
relayed_message_event_guid
VARCHAR
UNIQUE
REFERENCES
l2_contract_events
(
guid
),
relayed_message_event_guid
VARCHAR
UNIQUE
REFERENCES
l2_contract_events
(
guid
),
...
@@ -168,9 +165,10 @@ CREATE TABLE IF NOT EXISTS l1_bridge_messages(
...
@@ -168,9 +165,10 @@ CREATE TABLE IF NOT EXISTS l1_bridge_messages(
timestamp
INTEGER
NOT
NULL
CHECK
(
timestamp
>
0
)
timestamp
INTEGER
NOT
NULL
CHECK
(
timestamp
>
0
)
);
);
CREATE
TABLE
IF
NOT
EXISTS
l2_bridge_messages
(
CREATE
TABLE
IF
NOT
EXISTS
l2_bridge_messages
(
nonce
UINT256
NOT
NULL
PRIMARY
KEY
,
message_hash
VARCHAR
NOT
NULL
PRIMARY
KEY
,
message_hash
VARCHAR
NOT
NULL
,
nonce
UINT256
NOT
NULL
UNIQUE
,
transaction_withdrawal_hash
VARCHAR
NOT
NULL
REFERENCES
l2_transaction_withdrawals
(
withdrawal_hash
),
transaction_withdrawal_hash
VARCHAR
NOT
NULL
UNIQUE
REFERENCES
l2_transaction_withdrawals
(
withdrawal_hash
),
sent_message_event_guid
VARCHAR
NOT
NULL
UNIQUE
REFERENCES
l2_contract_events
(
guid
),
sent_message_event_guid
VARCHAR
NOT
NULL
UNIQUE
REFERENCES
l2_contract_events
(
guid
),
relayed_message_event_guid
VARCHAR
UNIQUE
REFERENCES
l1_contract_events
(
guid
),
relayed_message_event_guid
VARCHAR
UNIQUE
REFERENCES
l1_contract_events
(
guid
),
...
@@ -188,15 +186,15 @@ CREATE TABLE IF NOT EXISTS l2_bridge_messages(
...
@@ -188,15 +186,15 @@ CREATE TABLE IF NOT EXISTS l2_bridge_messages(
CREATE
TABLE
IF
NOT
EXISTS
l1_bridge_deposits
(
CREATE
TABLE
IF
NOT
EXISTS
l1_bridge_deposits
(
transaction_source_hash
VARCHAR
PRIMARY
KEY
REFERENCES
l1_transaction_deposits
(
source_hash
),
transaction_source_hash
VARCHAR
PRIMARY
KEY
REFERENCES
l1_transaction_deposits
(
source_hash
),
-- We allow the cross_domain_mess
enger_nonce
to be NULL-able to account
-- We allow the cross_domain_mess
age_hash
to be NULL-able to account
-- for scenarios where ETH is simply sent to the OptimismPortal contract
-- for scenarios where ETH is simply sent to the OptimismPortal contract
cross_domain_mess
enger_nonce
UINT256
UNIQUE
REFERENCES
l1_bridge_messages
(
nonce
),
cross_domain_mess
age_hash
VARCHAR
UNIQUE
REFERENCES
l1_bridge_messages
(
message_hash
),
-- Deposit information
-- Deposit information
from_address
VARCHAR
NOT
NULL
,
from_address
VARCHAR
NOT
NULL
,
to_address
VARCHAR
NOT
NULL
,
to_address
VARCHAR
NOT
NULL
,
l1
_token_address
VARCHAR
NOT
NULL
,
-- REFERENCES l1_tokens(address), uncomment me in future pr
local
_token_address
VARCHAR
NOT
NULL
,
-- REFERENCES l1_tokens(address), uncomment me in future pr
l2
_token_address
VARCHAR
NOT
NULL
,
-- REFERENCES l2_tokens(address), uncomment me in future pr
remote
_token_address
VARCHAR
NOT
NULL
,
-- REFERENCES l2_tokens(address), uncomment me in future pr
amount
UINT256
NOT
NULL
,
amount
UINT256
NOT
NULL
,
data
VARCHAR
NOT
NULL
,
data
VARCHAR
NOT
NULL
,
timestamp
INTEGER
NOT
NULL
CHECK
(
timestamp
>
0
)
timestamp
INTEGER
NOT
NULL
CHECK
(
timestamp
>
0
)
...
@@ -204,15 +202,15 @@ CREATE TABLE IF NOT EXISTS l1_bridge_deposits (
...
@@ -204,15 +202,15 @@ CREATE TABLE IF NOT EXISTS l1_bridge_deposits (
CREATE
TABLE
IF
NOT
EXISTS
l2_bridge_withdrawals
(
CREATE
TABLE
IF
NOT
EXISTS
l2_bridge_withdrawals
(
transaction_withdrawal_hash
VARCHAR
PRIMARY
KEY
REFERENCES
l2_transaction_withdrawals
(
withdrawal_hash
),
transaction_withdrawal_hash
VARCHAR
PRIMARY
KEY
REFERENCES
l2_transaction_withdrawals
(
withdrawal_hash
),
-- We allow the cross_domain_mess
enger_nonce
to be NULL-able to account for
-- We allow the cross_domain_mess
age_hash
to be NULL-able to account for
-- scenarios where ETH is simply sent to the L2ToL1MessagePasser contract
-- scenarios where ETH is simply sent to the L2ToL1MessagePasser contract
cross_domain_mess
enger_nonce
UINT256
UNIQUE
REFERENCES
l2_bridge_messages
(
nonce
),
cross_domain_mess
age_hash
VARCHAR
UNIQUE
REFERENCES
l2_bridge_messages
(
message_hash
),
-- Withdrawal information
-- Withdrawal information
from_address
VARCHAR
NOT
NULL
,
from_address
VARCHAR
NOT
NULL
,
to_address
VARCHAR
NOT
NULL
,
to_address
VARCHAR
NOT
NULL
,
l1_token_address
VARCHAR
NOT
NULL
,
-- REFERENCES l1
_tokens(address), uncomment me in future pr
local_token_address
VARCHAR
NOT
NULL
,
-- REFERENCES l2
_tokens(address), uncomment me in future pr
l2_token_address
VARCHAR
NOT
NULL
,
-- REFERENCES l2
_tokens(address), uncomment me in future pr
remote_token_address
VARCHAR
NOT
NULL
,
-- REFERENCES l1
_tokens(address), uncomment me in future pr
amount
UINT256
NOT
NULL
,
amount
UINT256
NOT
NULL
,
data
VARCHAR
NOT
NULL
,
data
VARCHAR
NOT
NULL
,
timestamp
INTEGER
NOT
NULL
CHECK
(
timestamp
>
0
)
timestamp
INTEGER
NOT
NULL
CHECK
(
timestamp
>
0
)
...
...
indexer/processor/l1_processor.go
View file @
5f128658
...
@@ -12,7 +12,6 @@ import (
...
@@ -12,7 +12,6 @@ import (
"github.com/ethereum-optimism/optimism/indexer/node"
"github.com/ethereum-optimism/optimism/indexer/node"
"github.com/ethereum-optimism/optimism/op-bindings/bindings"
"github.com/ethereum-optimism/optimism/op-bindings/bindings"
legacy_bindings
"github.com/ethereum-optimism/optimism/op-bindings/legacy-bindings"
legacy_bindings
"github.com/ethereum-optimism/optimism/op-bindings/legacy-bindings"
"github.com/ethereum-optimism/optimism/op-bindings/predeploys"
"github.com/ethereum-optimism/optimism/op-node/rollup/derive"
"github.com/ethereum-optimism/optimism/op-node/rollup/derive"
"github.com/ethereum/go-ethereum"
"github.com/ethereum/go-ethereum"
...
@@ -222,7 +221,7 @@ func l1ProcessFn(processLog log.Logger, ethClient node.EthClient, l1Contracts co
...
@@ -222,7 +221,7 @@ func l1ProcessFn(processLog log.Logger, ethClient node.EthClient, l1Contracts co
}
}
// forward along contract events to standard bridge processor
// forward along contract events to standard bridge processor
err
=
l1ProcessContractEventsStandardBridge
(
processLog
,
db
,
ethClient
,
processedContractEvents
)
err
=
l1ProcessContractEventsStandardBridge
(
processLog
,
db
,
processedContractEvents
)
if
err
!=
nil
{
if
err
!=
nil
{
return
err
return
err
}
}
...
@@ -250,8 +249,6 @@ func l1ProcessContractEventsBridgeTransactions(processLog log.Logger, db *databa
...
@@ -250,8 +249,6 @@ func l1ProcessContractEventsBridgeTransactions(processLog log.Logger, db *databa
SourceHash
:
depositTx
.
SourceHash
,
SourceHash
:
depositTx
.
SourceHash
,
L2TransactionHash
:
types
.
NewTx
(
depositTx
)
.
Hash
(),
L2TransactionHash
:
types
.
NewTx
(
depositTx
)
.
Hash
(),
InitiatedL1EventGUID
:
depositEvent
.
Event
.
GUID
,
InitiatedL1EventGUID
:
depositEvent
.
Event
.
GUID
,
Version
:
database
.
U256
{
Int
:
depositEvent
.
Version
},
OpaqueData
:
depositEvent
.
OpaqueData
,
GasLimit
:
database
.
U256
{
Int
:
new
(
big
.
Int
)
.
SetUint64
(
depositTx
.
Gas
)},
GasLimit
:
database
.
U256
{
Int
:
new
(
big
.
Int
)
.
SetUint64
(
depositTx
.
Gas
)},
Tx
:
database
.
Transaction
{
Tx
:
database
.
Transaction
{
FromAddress
:
depositTx
.
From
,
FromAddress
:
depositTx
.
From
,
...
@@ -266,11 +263,10 @@ func l1ProcessContractEventsBridgeTransactions(processLog log.Logger, db *databa
...
@@ -266,11 +263,10 @@ func l1ProcessContractEventsBridgeTransactions(processLog log.Logger, db *databa
if
len
(
depositTx
.
Data
)
==
0
&&
depositTx
.
Value
.
BitLen
()
>
0
{
if
len
(
depositTx
.
Data
)
==
0
&&
depositTx
.
Value
.
BitLen
()
>
0
{
ethDeposits
=
append
(
ethDeposits
,
&
database
.
L1BridgeDeposit
{
ethDeposits
=
append
(
ethDeposits
,
&
database
.
L1BridgeDeposit
{
TransactionSourceHash
:
depositTx
.
SourceHash
,
TransactionSourceHash
:
depositTx
.
SourceHash
,
Tx
:
transactionDeposits
[
i
]
.
Tx
,
BridgeTransfer
:
database
.
BridgeTransfer
{
TokenPair
:
database
.
TokenPair
{
Tx
:
transactionDeposits
[
i
]
.
Tx
,
// TODO index eth token if it doesn't exist
// TODO index eth token if it doesn't exist
L1TokenAddress
:
predeploys
.
LegacyERC20ETHAddr
,
TokenPair
:
database
.
ETHTokenPair
,
L2TokenAddress
:
predeploys
.
LegacyERC20ETHAddr
,
},
},
})
})
}
}
...
@@ -386,8 +382,8 @@ func l1ProcessContractEventsBridgeCrossDomainMessages(processLog log.Logger, db
...
@@ -386,8 +382,8 @@ func l1ProcessContractEventsBridgeCrossDomainMessages(processLog log.Logger, db
sentMessages
[
i
]
=
&
database
.
L1BridgeMessage
{
sentMessages
[
i
]
=
&
database
.
L1BridgeMessage
{
TransactionSourceHash
:
depositTx
.
SourceHash
,
TransactionSourceHash
:
depositTx
.
SourceHash
,
BridgeMessage
:
database
.
BridgeMessage
{
BridgeMessage
:
database
.
BridgeMessage
{
Nonce
:
database
.
U256
{
Int
:
sentMessageEvent
.
MessageNonce
},
MessageHash
:
sentMessageEvent
.
MessageHash
,
MessageHash
:
sentMessageEvent
.
MessageHash
,
Nonce
:
database
.
U256
{
Int
:
sentMessageEvent
.
MessageNonce
},
SentMessageEventGUID
:
sentMessageEvent
.
Event
.
GUID
,
SentMessageEventGUID
:
sentMessageEvent
.
Event
.
GUID
,
GasLimit
:
database
.
U256
{
Int
:
sentMessageEvent
.
GasLimit
},
GasLimit
:
database
.
U256
{
Int
:
sentMessageEvent
.
GasLimit
},
Tx
:
database
.
Transaction
{
Tx
:
database
.
Transaction
{
...
@@ -419,7 +415,7 @@ func l1ProcessContractEventsBridgeCrossDomainMessages(processLog log.Logger, db
...
@@ -419,7 +415,7 @@ func l1ProcessContractEventsBridgeCrossDomainMessages(processLog log.Logger, db
}
}
for
_
,
relayedMessage
:=
range
relayedMessageEvents
{
for
_
,
relayedMessage
:=
range
relayedMessageEvents
{
message
,
err
:=
db
.
BridgeMessages
.
L2BridgeMessage
ByHash
(
relayedMessage
.
MsgHash
)
message
,
err
:=
db
.
BridgeMessages
.
L2BridgeMessage
(
relayedMessage
.
MsgHash
)
if
err
!=
nil
{
if
err
!=
nil
{
return
err
return
err
}
else
if
message
==
nil
{
}
else
if
message
==
nil
{
...
@@ -443,9 +439,7 @@ func l1ProcessContractEventsBridgeCrossDomainMessages(processLog log.Logger, db
...
@@ -443,9 +439,7 @@ func l1ProcessContractEventsBridgeCrossDomainMessages(processLog log.Logger, db
return
nil
return
nil
}
}
func
l1ProcessContractEventsStandardBridge
(
processLog
log
.
Logger
,
db
*
database
.
DB
,
ethClient
node
.
EthClient
,
events
*
ProcessedContractEvents
)
error
{
func
l1ProcessContractEventsStandardBridge
(
processLog
log
.
Logger
,
db
*
database
.
DB
,
events
*
ProcessedContractEvents
)
error
{
rawEthClient
:=
ethclient
.
NewClient
(
ethClient
.
RawRpcClient
())
// (1) Process New Deposits
// (1) Process New Deposits
initiatedDepositEvents
,
err
:=
StandardBridgeInitiatedEvents
(
events
)
initiatedDepositEvents
,
err
:=
StandardBridgeInitiatedEvents
(
events
)
if
err
!=
nil
{
if
err
!=
nil
{
...
@@ -465,16 +459,18 @@ func l1ProcessContractEventsStandardBridge(processLog log.Logger, db *database.D
...
@@ -465,16 +459,18 @@ func l1ProcessContractEventsStandardBridge(processLog log.Logger, db *database.D
}
}
deposits
[
i
]
=
&
database
.
L1BridgeDeposit
{
deposits
[
i
]
=
&
database
.
L1BridgeDeposit
{
TransactionSourceHash
:
depositTx
.
SourceHash
,
TransactionSourceHash
:
depositTx
.
SourceHash
,
CrossDomainMessengerNonce
:
&
database
.
U256
{
Int
:
initiatedBridgeEvent
.
CrossDomainMessengerNonce
},
BridgeTransfer
:
database
.
BridgeTransfer
{
// TODO index the tokens pairs if they don't exist
CrossDomainMessageHash
:
&
initiatedBridgeEvent
.
CrossDomainMessageHash
,
TokenPair
:
database
.
TokenPair
{
L1TokenAddress
:
initiatedBridgeEvent
.
LocalToken
,
L2TokenAddress
:
initiatedBridgeEvent
.
RemoteToken
},
// TODO index the tokens pairs if they don't exist
Tx
:
database
.
Transaction
{
TokenPair
:
database
.
TokenPair
{
LocalTokenAddress
:
initiatedBridgeEvent
.
LocalToken
,
RemoteTokenAddress
:
initiatedBridgeEvent
.
RemoteToken
},
FromAddress
:
initiatedBridgeEvent
.
From
,
Tx
:
database
.
Transaction
{
ToAddress
:
initiatedBridgeEvent
.
To
,
FromAddress
:
initiatedBridgeEvent
.
From
,
Amount
:
database
.
U256
{
Int
:
initiatedBridgeEvent
.
Amount
},
ToAddress
:
initiatedBridgeEvent
.
To
,
Data
:
initiatedBridgeEvent
.
ExtraData
,
Amount
:
database
.
U256
{
Int
:
initiatedBridgeEvent
.
Amount
},
Timestamp
:
initiatedBridgeEvent
.
Event
.
Timestamp
,
Data
:
initiatedBridgeEvent
.
ExtraData
,
Timestamp
:
initiatedBridgeEvent
.
Event
.
Timestamp
,
},
},
},
}
}
}
}
...
@@ -491,26 +487,25 @@ func l1ProcessContractEventsStandardBridge(processLog log.Logger, db *database.D
...
@@ -491,26 +487,25 @@ func l1ProcessContractEventsStandardBridge(processLog log.Logger, db *database.D
// - We dont need do anything actionable on the database here as this is layered on top of the
// - We dont need do anything actionable on the database here as this is layered on top of the
// bridge transaction & messages that have a tracked lifecyle. We simply walk through and ensure
// bridge transaction & messages that have a tracked lifecyle. We simply walk through and ensure
// that the corresponding initiated withdrawals exist and match as an integrity check
// that the corresponding initiated withdrawals exist and match as an integrity check
finalizedWithdrawalEvents
,
err
:=
StandardBridgeFinalizedEvents
(
rawEthClient
,
events
)
finalizedWithdrawalEvents
,
err
:=
StandardBridgeFinalizedEvents
(
events
)
if
err
!=
nil
{
if
err
!=
nil
{
return
err
return
err
}
}
for
_
,
finalizedWithdrawalEvent
:=
range
finalizedWithdrawalEvents
{
for
_
,
finalizedWithdrawalEvent
:=
range
finalizedWithdrawalEvents
{
withdrawal
,
err
:=
db
.
BridgeTransfers
.
L2BridgeWithdrawal
ByCrossDomainMessengerNonce
(
finalizedWithdrawalEvent
.
CrossDomainMessengerNonce
)
withdrawal
,
err
:=
db
.
BridgeTransfers
.
L2BridgeWithdrawal
WithFilter
(
database
.
BridgeTransfer
{
CrossDomainMessageHash
:
&
finalizedWithdrawalEvent
.
CrossDomainMessageHash
}
)
if
err
!=
nil
{
if
err
!=
nil
{
return
err
return
err
}
else
if
withdrawal
==
nil
{
}
else
if
withdrawal
==
nil
{
processLog
.
Error
(
"missing indexed L2StandardBridge withdrawal for finalization"
,
"cross_domain_mess
enger_nonce"
,
finalizedWithdrawalEvent
.
CrossDomainMessengerNonce
)
processLog
.
Error
(
"missing indexed L2StandardBridge withdrawal for finalization"
,
"cross_domain_mess
age_hash"
,
finalizedWithdrawalEvent
.
CrossDomainMessageHash
)
return
errors
.
New
(
"missing indexed L2StandardBridge withdrawal for finalization event"
)
return
errors
.
New
(
"missing indexed L2StandardBridge withdrawal for finalization event"
)
}
}
// sanity check on the bridge fields
// sanity check on the bridge fields
if
finalizedWithdrawalEvent
.
From
!=
withdrawal
.
Tx
.
FromAddress
||
finalizedWithdrawalEvent
.
To
!=
withdrawal
.
Tx
.
ToAddress
||
if
finalizedWithdrawalEvent
.
From
!=
withdrawal
.
Tx
.
FromAddress
||
finalizedWithdrawalEvent
.
To
!=
withdrawal
.
Tx
.
ToAddress
||
finalizedWithdrawalEvent
.
Amount
.
Cmp
(
withdrawal
.
Tx
.
Amount
.
Int
)
!=
0
||
!
bytes
.
Equal
(
finalizedWithdrawalEvent
.
ExtraData
,
withdrawal
.
Tx
.
Data
)
||
finalizedWithdrawalEvent
.
Amount
.
Cmp
(
withdrawal
.
Tx
.
Amount
.
Int
)
!=
0
||
!
bytes
.
Equal
(
finalizedWithdrawalEvent
.
ExtraData
,
withdrawal
.
Tx
.
Data
)
||
finalizedWithdrawalEvent
.
LocalToken
!=
withdrawal
.
TokenPair
.
L1TokenAddress
||
finalizedWithdrawalEvent
.
RemoteToken
!=
withdrawal
.
TokenPair
.
L2TokenAddress
{
finalizedWithdrawalEvent
.
LocalToken
!=
withdrawal
.
TokenPair
.
LocalTokenAddress
||
finalizedWithdrawalEvent
.
RemoteToken
!=
withdrawal
.
TokenPair
.
RemoteTokenAddress
{
processLog
.
Crit
(
"bridge finalization fields mismatch with initiated fields!"
,
"tx_withdrawal_hash"
,
withdrawal
.
TransactionWithdrawalHash
,
"cross_domain_messenger_nonce"
,
withdrawal
.
CrossDomainMessengerNonce
.
Int
)
processLog
.
Crit
(
"bridge finalization fields mismatch with initiated fields!"
,
"tx_withdrawal_hash"
,
withdrawal
.
TransactionWithdrawalHash
,
"cross_domain_message_hash"
,
withdrawal
.
CrossDomainMessageHash
)
return
errors
.
New
(
"bridge tx mismatch!"
)
}
}
}
}
...
...
indexer/processor/l2_processor.go
View file @
5f128658
...
@@ -10,7 +10,6 @@ import (
...
@@ -10,7 +10,6 @@ import (
"github.com/ethereum-optimism/optimism/indexer/database"
"github.com/ethereum-optimism/optimism/indexer/database"
"github.com/ethereum-optimism/optimism/indexer/node"
"github.com/ethereum-optimism/optimism/indexer/node"
"github.com/ethereum-optimism/optimism/op-bindings/bindings"
"github.com/ethereum-optimism/optimism/op-bindings/bindings"
"github.com/ethereum-optimism/optimism/op-bindings/predeploys"
"github.com/ethereum/go-ethereum"
"github.com/ethereum/go-ethereum"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/common"
...
@@ -160,7 +159,7 @@ func l2ProcessFn(processLog log.Logger, ethClient node.EthClient, l2Contracts L2
...
@@ -160,7 +159,7 @@ func l2ProcessFn(processLog log.Logger, ethClient node.EthClient, l2Contracts L2
}
}
// forward along contract events to standard bridge processor
// forward along contract events to standard bridge processor
err
=
l2ProcessContractEventsStandardBridge
(
processLog
,
db
,
ethClient
,
processedContractEvents
)
err
=
l2ProcessContractEventsStandardBridge
(
processLog
,
db
,
processedContractEvents
)
if
err
!=
nil
{
if
err
!=
nil
{
return
err
return
err
}
}
...
@@ -198,10 +197,9 @@ func l2ProcessContractEventsBridgeTransactions(processLog log.Logger, db *databa
...
@@ -198,10 +197,9 @@ func l2ProcessContractEventsBridgeTransactions(processLog log.Logger, db *databa
if
len
(
withdrawalEvent
.
Data
)
==
0
&&
withdrawalEvent
.
Value
.
BitLen
()
>
0
{
if
len
(
withdrawalEvent
.
Data
)
==
0
&&
withdrawalEvent
.
Value
.
BitLen
()
>
0
{
ethWithdrawals
=
append
(
ethWithdrawals
,
&
database
.
L2BridgeWithdrawal
{
ethWithdrawals
=
append
(
ethWithdrawals
,
&
database
.
L2BridgeWithdrawal
{
TransactionWithdrawalHash
:
withdrawalEvent
.
WithdrawalHash
,
TransactionWithdrawalHash
:
withdrawalEvent
.
WithdrawalHash
,
Tx
:
transactionWithdrawals
[
i
]
.
Tx
,
BridgeTransfer
:
database
.
BridgeTransfer
{
TokenPair
:
database
.
TokenPair
{
Tx
:
transactionWithdrawals
[
i
]
.
Tx
,
L1TokenAddress
:
predeploys
.
LegacyERC20ETHAddr
,
TokenPair
:
database
.
ETHTokenPair
,
L2TokenAddress
:
predeploys
.
LegacyERC20ETHAddr
,
},
},
})
})
}
}
...
@@ -258,8 +256,8 @@ func l2ProcessContractEventsBridgeCrossDomainMessages(processLog log.Logger, db
...
@@ -258,8 +256,8 @@ func l2ProcessContractEventsBridgeCrossDomainMessages(processLog log.Logger, db
sentMessages
[
i
]
=
&
database
.
L2BridgeMessage
{
sentMessages
[
i
]
=
&
database
.
L2BridgeMessage
{
TransactionWithdrawalHash
:
msgPassedEvent
.
WithdrawalHash
,
TransactionWithdrawalHash
:
msgPassedEvent
.
WithdrawalHash
,
BridgeMessage
:
database
.
BridgeMessage
{
BridgeMessage
:
database
.
BridgeMessage
{
Nonce
:
database
.
U256
{
Int
:
sentMessageEvent
.
MessageNonce
},
MessageHash
:
sentMessageEvent
.
MessageHash
,
MessageHash
:
sentMessageEvent
.
MessageHash
,
Nonce
:
database
.
U256
{
Int
:
sentMessageEvent
.
MessageNonce
},
SentMessageEventGUID
:
sentMessageEvent
.
Event
.
GUID
,
SentMessageEventGUID
:
sentMessageEvent
.
Event
.
GUID
,
GasLimit
:
database
.
U256
{
Int
:
sentMessageEvent
.
GasLimit
},
GasLimit
:
database
.
U256
{
Int
:
sentMessageEvent
.
GasLimit
},
Tx
:
database
.
Transaction
{
Tx
:
database
.
Transaction
{
...
@@ -298,7 +296,7 @@ func l2ProcessContractEventsBridgeCrossDomainMessages(processLog log.Logger, db
...
@@ -298,7 +296,7 @@ func l2ProcessContractEventsBridgeCrossDomainMessages(processLog log.Logger, db
}
}
for
_
,
relayedMessage
:=
range
relayedMessageEvents
{
for
_
,
relayedMessage
:=
range
relayedMessageEvents
{
message
,
err
:=
db
.
BridgeMessages
.
L1BridgeMessage
ByHash
(
relayedMessage
.
MsgHash
)
message
,
err
:=
db
.
BridgeMessages
.
L1BridgeMessage
(
relayedMessage
.
MsgHash
)
if
err
!=
nil
{
if
err
!=
nil
{
return
err
return
err
}
}
...
@@ -330,9 +328,7 @@ func l2ProcessContractEventsBridgeCrossDomainMessages(processLog log.Logger, db
...
@@ -330,9 +328,7 @@ func l2ProcessContractEventsBridgeCrossDomainMessages(processLog log.Logger, db
return
nil
return
nil
}
}
func
l2ProcessContractEventsStandardBridge
(
processLog
log
.
Logger
,
db
*
database
.
DB
,
ethClient
node
.
EthClient
,
events
*
ProcessedContractEvents
)
error
{
func
l2ProcessContractEventsStandardBridge
(
processLog
log
.
Logger
,
db
*
database
.
DB
,
events
*
ProcessedContractEvents
)
error
{
rawEthClient
:=
ethclient
.
NewClient
(
ethClient
.
RawRpcClient
())
l2ToL1MessagePasserABI
,
err
:=
bindings
.
NewL2ToL1MessagePasser
(
common
.
Address
{},
nil
)
l2ToL1MessagePasserABI
,
err
:=
bindings
.
NewL2ToL1MessagePasser
(
common
.
Address
{},
nil
)
if
err
!=
nil
{
if
err
!=
nil
{
return
err
return
err
...
@@ -357,14 +353,16 @@ func l2ProcessContractEventsStandardBridge(processLog log.Logger, db *database.D
...
@@ -357,14 +353,16 @@ func l2ProcessContractEventsStandardBridge(processLog log.Logger, db *database.D
withdrawals
[
i
]
=
&
database
.
L2BridgeWithdrawal
{
withdrawals
[
i
]
=
&
database
.
L2BridgeWithdrawal
{
TransactionWithdrawalHash
:
msgPassedEvent
.
WithdrawalHash
,
TransactionWithdrawalHash
:
msgPassedEvent
.
WithdrawalHash
,
CrossDomainMessengerNonce
:
&
database
.
U256
{
Int
:
initiatedBridgeEvent
.
CrossDomainMessengerNonce
},
BridgeTransfer
:
database
.
BridgeTransfer
{
TokenPair
:
database
.
TokenPair
{
L1TokenAddress
:
initiatedBridgeEvent
.
LocalToken
,
L2TokenAddress
:
initiatedBridgeEvent
.
RemoteToken
},
CrossDomainMessageHash
:
&
initiatedBridgeEvent
.
CrossDomainMessageHash
,
Tx
:
database
.
Transaction
{
TokenPair
:
database
.
TokenPair
{
LocalTokenAddress
:
initiatedBridgeEvent
.
LocalToken
,
RemoteTokenAddress
:
initiatedBridgeEvent
.
RemoteToken
},
FromAddress
:
initiatedBridgeEvent
.
From
,
Tx
:
database
.
Transaction
{
ToAddress
:
initiatedBridgeEvent
.
To
,
FromAddress
:
initiatedBridgeEvent
.
From
,
Amount
:
database
.
U256
{
Int
:
initiatedBridgeEvent
.
Amount
},
ToAddress
:
initiatedBridgeEvent
.
To
,
Data
:
initiatedBridgeEvent
.
ExtraData
,
Amount
:
database
.
U256
{
Int
:
initiatedBridgeEvent
.
Amount
},
Timestamp
:
initiatedBridgeEvent
.
Event
.
Timestamp
,
Data
:
initiatedBridgeEvent
.
ExtraData
,
Timestamp
:
initiatedBridgeEvent
.
Event
.
Timestamp
,
},
},
},
}
}
}
}
...
@@ -382,26 +380,26 @@ func l2ProcessContractEventsStandardBridge(processLog log.Logger, db *database.D
...
@@ -382,26 +380,26 @@ func l2ProcessContractEventsStandardBridge(processLog log.Logger, db *database.D
// bridge transaction & messages that have a tracked lifecyle. We simply walk through and ensure
// bridge transaction & messages that have a tracked lifecyle. We simply walk through and ensure
// that the corresponding initiated deposits exist as an integrity check
// that the corresponding initiated deposits exist as an integrity check
finalizedDepositEvents
,
err
:=
StandardBridgeFinalizedEvents
(
rawEthClient
,
events
)
finalizedDepositEvents
,
err
:=
StandardBridgeFinalizedEvents
(
events
)
if
err
!=
nil
{
if
err
!=
nil
{
return
err
return
err
}
}
for
_
,
finalizedDepositEvent
:=
range
finalizedDepositEvents
{
for
_
,
finalizedDepositEvent
:=
range
finalizedDepositEvents
{
deposit
,
err
:=
db
.
BridgeTransfers
.
L1BridgeDeposit
ByCrossDomainMessengerNonce
(
finalizedDepositEvent
.
CrossDomainMessengerNonce
)
deposit
,
err
:=
db
.
BridgeTransfers
.
L1BridgeDeposit
WithFilter
(
database
.
BridgeTransfer
{
CrossDomainMessageHash
:
&
finalizedDepositEvent
.
CrossDomainMessageHash
}
)
if
err
!=
nil
{
if
err
!=
nil
{
return
err
return
err
}
else
if
deposit
==
nil
{
}
else
if
deposit
==
nil
{
// Indexed CrossDomainMessenger messages ensure we're in a caught up state here
// Indexed CrossDomainMessenger messages ensure we're in a caught up state here
processLog
.
Error
(
"missing indexed L1StandardBridge deposit on finalization"
,
"cross_domain_m
essenger_nonce"
,
finalizedDepositEvent
.
CrossDomainMessengerNonce
)
processLog
.
Error
(
"missing indexed L1StandardBridge deposit on finalization"
,
"cross_domain_m
assage_hash"
,
finalizedDepositEvent
.
CrossDomainMessageHash
)
return
errors
.
New
(
"missing indexed L1StandardBridge deposit on finalization"
)
return
errors
.
New
(
"missing indexed L1StandardBridge deposit on finalization"
)
}
}
// sanity check on the bridge fields
// sanity check on the bridge fields
if
finalizedDepositEvent
.
From
!=
deposit
.
Tx
.
FromAddress
||
finalizedDepositEvent
.
To
!=
deposit
.
Tx
.
ToAddress
||
if
finalizedDepositEvent
.
From
!=
deposit
.
Tx
.
FromAddress
||
finalizedDepositEvent
.
To
!=
deposit
.
Tx
.
ToAddress
||
finalizedDepositEvent
.
Amount
.
Cmp
(
deposit
.
Tx
.
Amount
.
Int
)
!=
0
||
!
bytes
.
Equal
(
finalizedDepositEvent
.
ExtraData
,
deposit
.
Tx
.
Data
)
||
finalizedDepositEvent
.
Amount
.
Cmp
(
deposit
.
Tx
.
Amount
.
Int
)
!=
0
||
!
bytes
.
Equal
(
finalizedDepositEvent
.
ExtraData
,
deposit
.
Tx
.
Data
)
||
finalizedDepositEvent
.
LocalToken
!=
deposit
.
TokenPair
.
L
1TokenAddress
||
finalizedDepositEvent
.
RemoteToken
!=
deposit
.
TokenPair
.
L2
TokenAddress
{
finalizedDepositEvent
.
LocalToken
!=
deposit
.
TokenPair
.
L
ocalTokenAddress
||
finalizedDepositEvent
.
RemoteToken
!=
deposit
.
TokenPair
.
Remote
TokenAddress
{
processLog
.
Error
(
"bridge finalization fields mismatch with initiated fields!"
,
"tx_source_hash"
,
deposit
.
TransactionSourceHash
,
"cross_domain_mess
enger_nonce"
,
deposit
.
CrossDomainMessengerNonce
.
Int
)
processLog
.
Error
(
"bridge finalization fields mismatch with initiated fields!"
,
"tx_source_hash"
,
deposit
.
TransactionSourceHash
,
"cross_domain_mess
age_hash"
,
deposit
.
CrossDomainMessageHash
)
return
errors
.
New
(
"bridge tx mismatch"
)
return
errors
.
New
(
"bridge tx mismatch"
)
}
}
}
}
...
...
indexer/processor/standard_bridge.go
View file @
5f128658
...
@@ -2,16 +2,13 @@ package processor
...
@@ -2,16 +2,13 @@ package processor
import
(
import
(
"bytes"
"bytes"
"context"
"errors"
"errors"
"fmt"
"math/big"
"github.com/ethereum-optimism/optimism/indexer/database"
"github.com/ethereum-optimism/optimism/indexer/database"
"github.com/ethereum-optimism/optimism/op-bindings/bindings"
"github.com/ethereum-optimism/optimism/op-bindings/bindings"
"github.com/ethereum-optimism/optimism/op-bindings/predeploys"
"github.com/ethereum-optimism/optimism/op-bindings/predeploys"
"github.com/ethereum/go-ethereum/
ethclient
"
"github.com/ethereum/go-ethereum/
common
"
)
)
type
StandardBridgeInitiatedEvent
struct
{
type
StandardBridgeInitiatedEvent
struct
{
...
@@ -19,8 +16,8 @@ type StandardBridgeInitiatedEvent struct {
...
@@ -19,8 +16,8 @@ type StandardBridgeInitiatedEvent struct {
// the hardcoded ETH address
// the hardcoded ETH address
*
bindings
.
StandardBridgeERC20BridgeInitiated
*
bindings
.
StandardBridgeERC20BridgeInitiated
CrossDomainMess
engerNonce
*
big
.
Int
CrossDomainMess
ageHash
common
.
Hash
Event
*
database
.
ContractEvent
Event
*
database
.
ContractEvent
}
}
type
StandardBridgeFinalizedEvent
struct
{
type
StandardBridgeFinalizedEvent
struct
{
...
@@ -28,8 +25,8 @@ type StandardBridgeFinalizedEvent struct {
...
@@ -28,8 +25,8 @@ type StandardBridgeFinalizedEvent struct {
// the hardcoded ETH address
// the hardcoded ETH address
*
bindings
.
StandardBridgeERC20BridgeFinalized
*
bindings
.
StandardBridgeERC20BridgeFinalized
CrossDomainMess
engerNonce
*
big
.
Int
CrossDomainMess
ageHash
common
.
Hash
Event
*
database
.
ContractEvent
Event
*
database
.
ContractEvent
}
}
// StandardBridgeInitiatedEvents extracts all initiated bridge events from the contracts that follow the StandardBridge ABI. The
// StandardBridgeInitiatedEvents extracts all initiated bridge events from the contracts that follow the StandardBridge ABI. The
...
@@ -50,13 +47,13 @@ func StandardBridgeInitiatedEvents(events *ProcessedContractEvents) ([]StandardB
...
@@ -50,13 +47,13 @@ func StandardBridgeInitiatedEvents(events *ProcessedContractEvents) ([]StandardB
// StandardBridgeFinalizedEvents extracts all finalization bridge events from the contracts that follow the StandardBridge ABI. The
// StandardBridgeFinalizedEvents extracts all finalization bridge events from the contracts that follow the StandardBridge ABI. The
// correlated CrossDomainMessenger nonce is also parsed by looking at the parameters of the corresponding relayMessage transaction data.
// correlated CrossDomainMessenger nonce is also parsed by looking at the parameters of the corresponding relayMessage transaction data.
func
StandardBridgeFinalizedEvents
(
rawEthClient
*
ethclient
.
Client
,
events
*
ProcessedContractEvents
)
([]
StandardBridgeFinalizedEvent
,
error
)
{
func
StandardBridgeFinalizedEvents
(
events
*
ProcessedContractEvents
)
([]
StandardBridgeFinalizedEvent
,
error
)
{
ethBridgeFinalizedEvents
,
err
:=
_standardBridgeFinalizedEvents
[
bindings
.
StandardBridgeETHBridgeFinalized
](
rawEthClient
,
events
)
ethBridgeFinalizedEvents
,
err
:=
_standardBridgeFinalizedEvents
[
bindings
.
StandardBridgeETHBridgeFinalized
](
events
)
if
err
!=
nil
{
if
err
!=
nil
{
return
nil
,
err
return
nil
,
err
}
}
erc20BridgeFinalizedEvents
,
err
:=
_standardBridgeFinalizedEvents
[
bindings
.
StandardBridgeERC20BridgeFinalized
](
rawEthClient
,
events
)
erc20BridgeFinalizedEvents
,
err
:=
_standardBridgeFinalizedEvents
[
bindings
.
StandardBridgeERC20BridgeFinalized
](
events
)
if
err
!=
nil
{
if
err
!=
nil
{
return
nil
,
err
return
nil
,
err
}
}
...
@@ -68,17 +65,18 @@ func StandardBridgeFinalizedEvents(rawEthClient *ethclient.Client, events *Proce
...
@@ -68,17 +65,18 @@ func StandardBridgeFinalizedEvents(rawEthClient *ethclient.Client, events *Proce
func
_standardBridgeInitiatedEvents
[
BridgeEvent
bindings
.
StandardBridgeETHBridgeInitiated
|
bindings
.
StandardBridgeERC20BridgeInitiated
](
func
_standardBridgeInitiatedEvents
[
BridgeEvent
bindings
.
StandardBridgeETHBridgeInitiated
|
bindings
.
StandardBridgeERC20BridgeInitiated
](
events
*
ProcessedContractEvents
,
events
*
ProcessedContractEvents
,
)
([]
StandardBridgeInitiatedEvent
,
error
)
{
)
([]
StandardBridgeInitiatedEvent
,
error
)
{
S
tandardBridgeABI
,
err
:=
bindings
.
StandardBridgeMetaData
.
GetAbi
()
s
tandardBridgeABI
,
err
:=
bindings
.
StandardBridgeMetaData
.
GetAbi
()
if
err
!=
nil
{
if
err
!=
nil
{
return
nil
,
err
return
nil
,
err
}
}
l1CrossDomainMessengerABI
,
err
:=
bindings
.
L1
CrossDomainMessengerMetaData
.
GetAbi
()
crossDomainMessengerABI
,
err
:=
bindings
.
CrossDomainMessengerMetaData
.
GetAbi
()
if
err
!=
nil
{
if
err
!=
nil
{
return
nil
,
err
return
nil
,
err
}
}
sentMessageEventAbi
:=
l1CrossDomainMessengerABI
.
Events
[
"SentMessage"
]
sentMessageEventAbi
:=
crossDomainMessengerABI
.
Events
[
"SentMessage"
]
sentMessageExtensionEventAbi
:=
crossDomainMessengerABI
.
Events
[
"SentMessageExtension1"
]
var
tmp
BridgeEvent
var
tmp
BridgeEvent
var
eventName
string
var
eventName
string
...
@@ -94,24 +92,43 @@ func _standardBridgeInitiatedEvents[BridgeEvent bindings.StandardBridgeETHBridge
...
@@ -94,24 +92,43 @@ func _standardBridgeInitiatedEvents[BridgeEvent bindings.StandardBridgeETHBridge
panic
(
"should not be here"
)
panic
(
"should not be here"
)
}
}
processedInitiatedBridgeEvents
:=
events
.
eventsBySignature
[
S
tandardBridgeABI
.
Events
[
eventName
]
.
ID
]
processedInitiatedBridgeEvents
:=
events
.
eventsBySignature
[
s
tandardBridgeABI
.
Events
[
eventName
]
.
ID
]
initiatedBridgeEvents
:=
make
([]
StandardBridgeInitiatedEvent
,
len
(
processedInitiatedBridgeEvents
))
initiatedBridgeEvents
:=
make
([]
StandardBridgeInitiatedEvent
,
len
(
processedInitiatedBridgeEvents
))
for
i
,
bridgeInitiatedEvent
:=
range
processedInitiatedBridgeEvents
{
for
i
,
bridgeInitiatedEvent
:=
range
processedInitiatedBridgeEvents
{
log
:=
bridgeInitiatedEvent
.
RLPLog
log
:=
bridgeInitiatedEvent
.
RLPLog
var
bridgeData
BridgeEvent
var
bridgeData
BridgeEvent
err
:=
UnpackLog
(
&
bridgeData
,
log
,
eventName
,
S
tandardBridgeABI
)
err
:=
UnpackLog
(
&
bridgeData
,
log
,
eventName
,
s
tandardBridgeABI
)
if
err
!=
nil
{
if
err
!=
nil
{
return
nil
,
err
return
nil
,
err
}
}
// Look for the sent message event to
extract the associated messager nonce
// Look for the sent message event to
compute the message hash of the relayed tx
// - L1: BridgeInitiated -> Portal#DepositTransaction -> SentMessage ...
// - L1: BridgeInitiated -> Portal#DepositTransaction -> SentMessage ...
// - L1: BridgeInitiated -> L2ToL1MessagePasser#MessagePassed -> SentMessage ...
// - L1: BridgeInitiated -> L2ToL1MessagePasser#MessagePassed -> SentMessage ...
var
sentMsgData
bindings
.
L1
CrossDomainMessengerSentMessage
var
sentMsgData
bindings
.
CrossDomainMessengerSentMessage
sentMsgLog
:=
events
.
eventByLogIndex
[
ProcessedContractEventLogIndexKey
{
log
.
BlockHash
,
log
.
Index
+
2
}]
.
RLPLog
sentMsgLog
:=
events
.
eventByLogIndex
[
ProcessedContractEventLogIndexKey
{
log
.
BlockHash
,
log
.
Index
+
2
}]
.
RLPLog
if
sentMsgLog
.
Topics
[
0
]
!=
sentMessageEventAbi
.
ID
{
return
nil
,
errors
.
New
(
"unexpected bridge event ordering"
)
}
sentMsgData
.
Raw
=
*
sentMsgLog
sentMsgData
.
Raw
=
*
sentMsgLog
err
=
UnpackLog
(
&
sentMsgData
,
sentMsgLog
,
sentMessageEventAbi
.
Name
,
l1CrossDomainMessengerABI
)
err
=
UnpackLog
(
&
sentMsgData
,
sentMsgLog
,
sentMessageEventAbi
.
Name
,
crossDomainMessengerABI
)
if
err
!=
nil
{
return
nil
,
err
}
var
sentMsgExtensionData
bindings
.
CrossDomainMessengerSentMessageExtension1
sentMsgExtensionLog
:=
events
.
eventByLogIndex
[
ProcessedContractEventLogIndexKey
{
log
.
BlockHash
,
log
.
Index
+
3
}]
.
RLPLog
if
sentMsgExtensionLog
.
Topics
[
0
]
!=
sentMessageExtensionEventAbi
.
ID
{
return
nil
,
errors
.
New
(
"unexpected bridge event ordering"
)
}
sentMsgData
.
Raw
=
*
sentMsgLog
err
=
UnpackLog
(
&
sentMsgExtensionData
,
sentMsgExtensionLog
,
sentMessageExtensionEventAbi
.
Name
,
crossDomainMessengerABI
)
if
err
!=
nil
{
return
nil
,
err
}
msgHash
,
err
:=
CrossDomainMessageHash
(
crossDomainMessengerABI
,
&
sentMsgData
,
sentMsgExtensionData
.
Value
)
if
err
!=
nil
{
if
err
!=
nil
{
return
nil
,
err
return
nil
,
err
}
}
...
@@ -121,7 +138,7 @@ func _standardBridgeInitiatedEvents[BridgeEvent bindings.StandardBridgeETHBridge
...
@@ -121,7 +138,7 @@ func _standardBridgeInitiatedEvents[BridgeEvent bindings.StandardBridgeETHBridge
switch
any
(
bridgeData
)
.
(
type
)
{
switch
any
(
bridgeData
)
.
(
type
)
{
case
bindings
.
StandardBridgeETHBridgeInitiated
:
case
bindings
.
StandardBridgeETHBridgeInitiated
:
ethBridgeData
:=
any
(
bridgeData
)
.
(
bindings
.
StandardBridgeETHBridgeInitiated
)
ethBridgeData
:=
any
(
bridgeData
)
.
(
bindings
.
StandardBridgeETHBridgeInitiated
)
expectedCrossDomainMessage
,
err
=
S
tandardBridgeABI
.
Pack
(
finalizeMethodName
,
ethBridgeData
.
From
,
ethBridgeData
.
To
,
ethBridgeData
.
Amount
,
ethBridgeData
.
ExtraData
)
expectedCrossDomainMessage
,
err
=
s
tandardBridgeABI
.
Pack
(
finalizeMethodName
,
ethBridgeData
.
From
,
ethBridgeData
.
To
,
ethBridgeData
.
Amount
,
ethBridgeData
.
ExtraData
)
if
err
!=
nil
{
if
err
!=
nil
{
return
nil
,
err
return
nil
,
err
}
}
...
@@ -139,7 +156,7 @@ func _standardBridgeInitiatedEvents[BridgeEvent bindings.StandardBridgeETHBridge
...
@@ -139,7 +156,7 @@ func _standardBridgeInitiatedEvents[BridgeEvent bindings.StandardBridgeETHBridge
_temp
:=
any
(
bridgeData
)
.
(
bindings
.
StandardBridgeERC20BridgeInitiated
)
_temp
:=
any
(
bridgeData
)
.
(
bindings
.
StandardBridgeERC20BridgeInitiated
)
erc20BridgeData
=
&
_temp
erc20BridgeData
=
&
_temp
erc20BridgeData
.
Raw
=
*
log
erc20BridgeData
.
Raw
=
*
log
expectedCrossDomainMessage
,
err
=
S
tandardBridgeABI
.
Pack
(
finalizeMethodName
,
erc20BridgeData
.
RemoteToken
,
erc20BridgeData
.
LocalToken
,
erc20BridgeData
.
From
,
erc20BridgeData
.
To
,
erc20BridgeData
.
Amount
,
erc20BridgeData
.
ExtraData
)
expectedCrossDomainMessage
,
err
=
s
tandardBridgeABI
.
Pack
(
finalizeMethodName
,
erc20BridgeData
.
RemoteToken
,
erc20BridgeData
.
LocalToken
,
erc20BridgeData
.
From
,
erc20BridgeData
.
To
,
erc20BridgeData
.
Amount
,
erc20BridgeData
.
ExtraData
)
if
err
!=
nil
{
if
err
!=
nil
{
return
nil
,
err
return
nil
,
err
}
}
...
@@ -151,7 +168,7 @@ func _standardBridgeInitiatedEvents[BridgeEvent bindings.StandardBridgeETHBridge
...
@@ -151,7 +168,7 @@ func _standardBridgeInitiatedEvents[BridgeEvent bindings.StandardBridgeETHBridge
initiatedBridgeEvents
[
i
]
=
StandardBridgeInitiatedEvent
{
initiatedBridgeEvents
[
i
]
=
StandardBridgeInitiatedEvent
{
StandardBridgeERC20BridgeInitiated
:
erc20BridgeData
,
StandardBridgeERC20BridgeInitiated
:
erc20BridgeData
,
CrossDomainMess
engerNonce
:
sentMsgData
.
MessageNonce
,
CrossDomainMess
ageHash
:
msgHash
,
Event
:
bridgeInitiatedEvent
,
Event
:
bridgeInitiatedEvent
,
}
}
}
}
...
@@ -161,27 +178,19 @@ func _standardBridgeInitiatedEvents[BridgeEvent bindings.StandardBridgeETHBridge
...
@@ -161,27 +178,19 @@ func _standardBridgeInitiatedEvents[BridgeEvent bindings.StandardBridgeETHBridge
// parse out eth or erc20 bridge finalization events
// parse out eth or erc20 bridge finalization events
func
_standardBridgeFinalizedEvents
[
BridgeEvent
bindings
.
StandardBridgeETHBridgeFinalized
|
bindings
.
StandardBridgeERC20BridgeFinalized
](
func
_standardBridgeFinalizedEvents
[
BridgeEvent
bindings
.
StandardBridgeETHBridgeFinalized
|
bindings
.
StandardBridgeERC20BridgeFinalized
](
rawEthClient
*
ethclient
.
Client
,
events
*
ProcessedContractEvents
,
events
*
ProcessedContractEvents
,
)
([]
StandardBridgeFinalizedEvent
,
error
)
{
)
([]
StandardBridgeFinalizedEvent
,
error
)
{
S
tandardBridgeABI
,
err
:=
bindings
.
StandardBridgeMetaData
.
GetAbi
()
s
tandardBridgeABI
,
err
:=
bindings
.
StandardBridgeMetaData
.
GetAbi
()
if
err
!=
nil
{
if
err
!=
nil
{
return
nil
,
err
return
nil
,
err
}
}
l1CrossDomainMessengerABI
,
err
:=
bindings
.
L1
CrossDomainMessengerMetaData
.
GetAbi
()
crossDomainMessengerABI
,
err
:=
bindings
.
CrossDomainMessengerMetaData
.
GetAbi
()
if
err
!=
nil
{
if
err
!=
nil
{
return
nil
,
err
return
nil
,
err
}
}
optimismPortalAbi
,
err
:=
bindings
.
OptimismPortalMetaData
.
GetAbi
()
relayedMessageEventAbi
:=
crossDomainMessengerABI
.
Events
[
"RelayedMessage"
]
if
err
!=
nil
{
return
nil
,
err
}
relayedMessageEventAbi
:=
l1CrossDomainMessengerABI
.
Events
[
"RelayedMessage"
]
relayMessageMethodAbi
:=
l1CrossDomainMessengerABI
.
Methods
[
"relayMessage"
]
finalizeWithdrawalTransactionMethodAbi
:=
optimismPortalAbi
.
Methods
[
"finalizeWithdrawalTransaction"
]
var
bridgeData
BridgeEvent
var
bridgeData
BridgeEvent
var
eventName
string
var
eventName
string
...
@@ -194,70 +203,27 @@ func _standardBridgeFinalizedEvents[BridgeEvent bindings.StandardBridgeETHBridge
...
@@ -194,70 +203,27 @@ func _standardBridgeFinalizedEvents[BridgeEvent bindings.StandardBridgeETHBridge
panic
(
"should not be here"
)
panic
(
"should not be here"
)
}
}
processedFinalizedBridgeEvents
:=
events
.
eventsBySignature
[
S
tandardBridgeABI
.
Events
[
eventName
]
.
ID
]
processedFinalizedBridgeEvents
:=
events
.
eventsBySignature
[
s
tandardBridgeABI
.
Events
[
eventName
]
.
ID
]
finalizedBridgeEvents
:=
make
([]
StandardBridgeFinalizedEvent
,
len
(
processedFinalizedBridgeEvents
))
finalizedBridgeEvents
:=
make
([]
StandardBridgeFinalizedEvent
,
len
(
processedFinalizedBridgeEvents
))
for
i
,
bridgeFinalizedEvent
:=
range
processedFinalizedBridgeEvents
{
for
i
,
bridgeFinalizedEvent
:=
range
processedFinalizedBridgeEvents
{
log
:=
bridgeFinalizedEvent
.
RLPLog
log
:=
bridgeFinalizedEvent
.
RLPLog
var
bridgeData
BridgeEvent
var
bridgeData
BridgeEvent
err
:=
UnpackLog
(
&
bridgeData
,
log
,
eventName
,
S
tandardBridgeABI
)
err
:=
UnpackLog
(
&
bridgeData
,
log
,
eventName
,
s
tandardBridgeABI
)
if
err
!=
nil
{
if
err
!=
nil
{
return
nil
,
err
return
nil
,
err
}
}
// Look for the RelayedMessage event that follows right after the BridgeFinalized Event
// Look for the RelayedMessage event that follows right after the BridgeFinalized Event
var
relayedMsgData
bindings
.
CrossDomainMessengerRelayedMessage
relayedMsgLog
:=
events
.
eventByLogIndex
[
ProcessedContractEventLogIndexKey
{
log
.
BlockHash
,
log
.
Index
+
1
}]
.
RLPLog
relayedMsgLog
:=
events
.
eventByLogIndex
[
ProcessedContractEventLogIndexKey
{
log
.
BlockHash
,
log
.
Index
+
1
}]
.
RLPLog
if
relayedMsgLog
.
Topics
[
0
]
!=
relayedMessageEventAbi
.
ID
{
if
relayedMsgLog
.
Topics
[
0
]
!=
relayedMessageEventAbi
.
ID
{
return
nil
,
errors
.
New
(
"unexpected bridge event ordering"
)
return
nil
,
errors
.
New
(
"unexpected bridge event ordering"
)
}
}
err
=
UnpackLog
(
&
relayedMsgData
,
relayedMsgLog
,
relayedMessageEventAbi
.
Name
,
crossDomainMessengerABI
)
// There's no way to extract the nonce on the relayed message event. we can extract the nonce by
// by unpacking the transaction input for the `relayMessage` transaction. Since bedrock has OptimismPortal
// as on L1 as an intermediary for finalization, we have to check both scenarios
tx
,
isPending
,
err
:=
rawEthClient
.
TransactionByHash
(
context
.
Background
(),
relayedMsgLog
.
TxHash
)
if
err
!=
nil
||
isPending
{
return
nil
,
errors
.
New
(
"unable to query relayMessage tx for bridge finalization event"
)
}
// If this is a finalization step with the optimism portal, the calldata for relayMessage invocation can be
// extracted from the withdrawal transaction.
// NOTE: the L2CrossDomainMessenger nonce may not match the L2ToL1MessagePasser nonce, hence the additional
// layer of decoding vs reading the nocne of the withdrawal transaction. Both nonces have a similar but
// different lifeycle that might not match (i.e L2ToL1MessagePasser can be invoced directly)
var
relayMsgCallData
[]
byte
switch
{
case
bytes
.
Equal
(
tx
.
Data
()[
:
4
],
relayMessageMethodAbi
.
ID
)
:
relayMsgCallData
=
tx
.
Data
()[
4
:
]
case
bytes
.
Equal
(
tx
.
Data
()[
:
4
],
finalizeWithdrawalTransactionMethodAbi
.
ID
)
:
data
,
err
:=
finalizeWithdrawalTransactionMethodAbi
.
Inputs
.
Unpack
(
tx
.
Data
()[
4
:
])
if
err
!=
nil
{
return
nil
,
err
}
finalizeWithdrawTransactionInput
:=
new
(
struct
{
Tx
bindings
.
TypesWithdrawalTransaction
})
err
=
finalizeWithdrawalTransactionMethodAbi
.
Inputs
.
Copy
(
finalizeWithdrawTransactionInput
,
data
)
if
err
!=
nil
{
return
nil
,
fmt
.
Errorf
(
"unable extract withdrawal tx input from finalizeWithdrawalTransaction calldata: %w"
,
err
)
}
else
if
!
bytes
.
Equal
(
finalizeWithdrawTransactionInput
.
Tx
.
Data
[
:
4
],
relayMessageMethodAbi
.
ID
)
{
return
nil
,
errors
.
New
(
"finalizeWithdrawalTransaction calldata does not match relayMessage invocation"
)
}
relayMsgCallData
=
finalizeWithdrawTransactionInput
.
Tx
.
Data
[
4
:
]
default
:
return
nil
,
errors
.
New
(
"bridge finalization event does not correlate with a relayMessage tx invocation"
)
}
inputsMap
:=
make
(
map
[
string
]
interface
{})
err
=
relayMessageMethodAbi
.
Inputs
.
UnpackIntoMap
(
inputsMap
,
relayMsgCallData
)
if
err
!=
nil
{
if
err
!=
nil
{
return
nil
,
err
return
nil
,
err
}
}
nonce
,
ok
:=
inputsMap
[
"_nonce"
]
.
(
*
big
.
Int
)
if
!
ok
{
return
nil
,
errors
.
New
(
"unable to extract `_nonce` parameter from relayMessage calldata"
)
}
var
erc20BridgeData
*
bindings
.
StandardBridgeERC20BridgeFinalized
var
erc20BridgeData
*
bindings
.
StandardBridgeERC20BridgeFinalized
switch
any
(
bridgeData
)
.
(
type
)
{
switch
any
(
bridgeData
)
.
(
type
)
{
...
@@ -279,7 +245,7 @@ func _standardBridgeFinalizedEvents[BridgeEvent bindings.StandardBridgeETHBridge
...
@@ -279,7 +245,7 @@ func _standardBridgeFinalizedEvents[BridgeEvent bindings.StandardBridgeETHBridge
finalizedBridgeEvents
[
i
]
=
StandardBridgeFinalizedEvent
{
finalizedBridgeEvents
[
i
]
=
StandardBridgeFinalizedEvent
{
StandardBridgeERC20BridgeFinalized
:
erc20BridgeData
,
StandardBridgeERC20BridgeFinalized
:
erc20BridgeData
,
CrossDomainMess
engerNonce
:
nonce
,
CrossDomainMess
ageHash
:
relayedMsgData
.
MsgHash
,
Event
:
bridgeFinalizedEvent
,
Event
:
bridgeFinalizedEvent
,
}
}
}
}
...
...
op-bindings/bindings/systemconfig.go
View file @
5f128658
...
@@ -51,7 +51,7 @@ type SystemConfigAddresses struct {
...
@@ -51,7 +51,7 @@ type SystemConfigAddresses struct {
// SystemConfigMetaData contains all meta data concerning the SystemConfig contract.
// SystemConfigMetaData contains all meta data concerning the SystemConfig contract.
var
SystemConfigMetaData
=
&
bind
.
MetaData
{
var
SystemConfigMetaData
=
&
bind
.
MetaData
{
ABI
:
"[{
\"
inputs
\"
:[],
\"
stateMutability
\"
:
\"
nonpayable
\"
,
\"
type
\"
:
\"
constructor
\"
},{
\"
anonymous
\"
:false,
\"
inputs
\"
:[{
\"
indexed
\"
:true,
\"
internalType
\"
:
\"
uint256
\"
,
\"
name
\"
:
\"
version
\"
,
\"
type
\"
:
\"
uint256
\"
},{
\"
indexed
\"
:true,
\"
internalType
\"
:
\"
enumSystemConfig.UpdateType
\"
,
\"
name
\"
:
\"
updateType
\"
,
\"
type
\"
:
\"
uint8
\"
},{
\"
indexed
\"
:false,
\"
internalType
\"
:
\"
bytes
\"
,
\"
name
\"
:
\"
data
\"
,
\"
type
\"
:
\"
bytes
\"
}],
\"
name
\"
:
\"
ConfigUpdate
\"
,
\"
type
\"
:
\"
event
\"
},{
\"
anonymous
\"
:false,
\"
inputs
\"
:[{
\"
indexed
\"
:false,
\"
internalType
\"
:
\"
uint8
\"
,
\"
name
\"
:
\"
version
\"
,
\"
type
\"
:
\"
uint8
\"
}],
\"
name
\"
:
\"
Initialized
\"
,
\"
type
\"
:
\"
event
\"
},{
\"
anonymous
\"
:false,
\"
inputs
\"
:[{
\"
indexed
\"
:true,
\"
internalType
\"
:
\"
address
\"
,
\"
name
\"
:
\"
previousOwner
\"
,
\"
type
\"
:
\"
address
\"
},{
\"
indexed
\"
:true,
\"
internalType
\"
:
\"
address
\"
,
\"
name
\"
:
\"
newOwner
\"
,
\"
type
\"
:
\"
address
\"
}],
\"
name
\"
:
\"
OwnershipTransferred
\"
,
\"
type
\"
:
\"
event
\"
},{
\"
inputs
\"
:[],
\"
name
\"
:
\"
BATCH_INBOX_SLOT
\"
,
\"
outputs
\"
:[{
\"
internalType
\"
:
\"
bytes32
\"
,
\"
name
\"
:
\"\"
,
\"
type
\"
:
\"
bytes32
\"
}],
\"
stateMutability
\"
:
\"
view
\"
,
\"
type
\"
:
\"
function
\"
},{
\"
inputs
\"
:[],
\"
name
\"
:
\"
L1_CROSS_DOMAIN_MESSENGER_SLOT
\"
,
\"
outputs
\"
:[{
\"
internalType
\"
:
\"
bytes32
\"
,
\"
name
\"
:
\"\"
,
\"
type
\"
:
\"
bytes32
\"
}],
\"
stateMutability
\"
:
\"
view
\"
,
\"
type
\"
:
\"
function
\"
},{
\"
inputs
\"
:[],
\"
name
\"
:
\"
L1_ERC_721_BRIDGE_SLOT
\"
,
\"
outputs
\"
:[{
\"
internalType
\"
:
\"
bytes32
\"
,
\"
name
\"
:
\"\"
,
\"
type
\"
:
\"
bytes32
\"
}],
\"
stateMutability
\"
:
\"
view
\"
,
\"
type
\"
:
\"
function
\"
},{
\"
inputs
\"
:[],
\"
name
\"
:
\"
L1_STANDARD_BRIDGE_SLOT
\"
,
\"
outputs
\"
:[{
\"
internalType
\"
:
\"
bytes32
\"
,
\"
name
\"
:
\"\"
,
\"
type
\"
:
\"
bytes32
\"
}],
\"
stateMutability
\"
:
\"
view
\"
,
\"
type
\"
:
\"
function
\"
},{
\"
inputs
\"
:[],
\"
name
\"
:
\"
L2_OUTPUT_ORACLE_SLOT
\"
,
\"
outputs
\"
:[{
\"
internalType
\"
:
\"
bytes32
\"
,
\"
name
\"
:
\"\"
,
\"
type
\"
:
\"
bytes32
\"
}],
\"
stateMutability
\"
:
\"
view
\"
,
\"
type
\"
:
\"
function
\"
},{
\"
inputs
\"
:[],
\"
name
\"
:
\"
OPTIMISM_MINTABLE_ERC20_FACTORY_SLOT
\"
,
\"
outputs
\"
:[{
\"
internalType
\"
:
\"
bytes32
\"
,
\"
name
\"
:
\"\"
,
\"
type
\"
:
\"
bytes32
\"
}],
\"
stateMutability
\"
:
\"
view
\"
,
\"
type
\"
:
\"
function
\"
},{
\"
inputs
\"
:[],
\"
name
\"
:
\"
OPTIMISM_PORTAL_SLOT
\"
,
\"
outputs
\"
:[{
\"
internalType
\"
:
\"
bytes32
\"
,
\"
name
\"
:
\"\"
,
\"
type
\"
:
\"
bytes32
\"
}],
\"
stateMutability
\"
:
\"
view
\"
,
\"
type
\"
:
\"
function
\"
},{
\"
inputs
\"
:[],
\"
name
\"
:
\"
UNSAFE_BLOCK_SIGNER_SLOT
\"
,
\"
outputs
\"
:[{
\"
internalType
\"
:
\"
bytes32
\"
,
\"
name
\"
:
\"\"
,
\"
type
\"
:
\"
bytes32
\"
}],
\"
stateMutability
\"
:
\"
view
\"
,
\"
type
\"
:
\"
function
\"
},{
\"
inputs
\"
:[],
\"
name
\"
:
\"
VERSION
\"
,
\"
outputs
\"
:[{
\"
internalType
\"
:
\"
uint256
\"
,
\"
name
\"
:
\"\"
,
\"
type
\"
:
\"
uint256
\"
}],
\"
stateMutability
\"
:
\"
view
\"
,
\"
type
\"
:
\"
function
\"
},{
\"
inputs
\"
:[],
\"
name
\"
:
\"
batchInbox
\"
,
\"
outputs
\"
:[{
\"
internalType
\"
:
\"
address
\"
,
\"
name
\"
:
\"
addr_
\"
,
\"
type
\"
:
\"
address
\"
}],
\"
stateMutability
\"
:
\"
view
\"
,
\"
type
\"
:
\"
function
\"
},{
\"
inputs
\"
:[],
\"
name
\"
:
\"
batcherHash
\"
,
\"
outputs
\"
:[{
\"
internalType
\"
:
\"
bytes32
\"
,
\"
name
\"
:
\"\"
,
\"
type
\"
:
\"
bytes32
\"
}],
\"
stateMutability
\"
:
\"
view
\"
,
\"
type
\"
:
\"
function
\"
},{
\"
inputs
\"
:[],
\"
name
\"
:
\"
gasLimit
\"
,
\"
outputs
\"
:[{
\"
internalType
\"
:
\"
uint64
\"
,
\"
name
\"
:
\"\"
,
\"
type
\"
:
\"
uint64
\"
}],
\"
stateMutability
\"
:
\"
view
\"
,
\"
type
\"
:
\"
function
\"
},{
\"
inputs
\"
:[{
\"
internalType
\"
:
\"
address
\"
,
\"
name
\"
:
\"
_owner
\"
,
\"
type
\"
:
\"
address
\"
},{
\"
internalType
\"
:
\"
uint256
\"
,
\"
name
\"
:
\"
_overhead
\"
,
\"
type
\"
:
\"
uint256
\"
},{
\"
internalType
\"
:
\"
uint256
\"
,
\"
name
\"
:
\"
_scalar
\"
,
\"
type
\"
:
\"
uint256
\"
},{
\"
internalType
\"
:
\"
bytes32
\"
,
\"
name
\"
:
\"
_batcherHash
\"
,
\"
type
\"
:
\"
bytes32
\"
},{
\"
internalType
\"
:
\"
uint64
\"
,
\"
name
\"
:
\"
_gasLimit
\"
,
\"
type
\"
:
\"
uint64
\"
},{
\"
internalType
\"
:
\"
address
\"
,
\"
name
\"
:
\"
_unsafeBlockSigner
\"
,
\"
type
\"
:
\"
address
\"
},{
\"
components
\"
:[{
\"
internalType
\"
:
\"
uint32
\"
,
\"
name
\"
:
\"
maxResourceLimit
\"
,
\"
type
\"
:
\"
uint32
\"
},{
\"
internalType
\"
:
\"
uint8
\"
,
\"
name
\"
:
\"
elasticityMultiplier
\"
,
\"
type
\"
:
\"
uint8
\"
},{
\"
internalType
\"
:
\"
uint8
\"
,
\"
name
\"
:
\"
baseFeeMaxChangeDenominator
\"
,
\"
type
\"
:
\"
uint8
\"
},{
\"
internalType
\"
:
\"
uint32
\"
,
\"
name
\"
:
\"
minimumBaseFee
\"
,
\"
type
\"
:
\"
uint32
\"
},{
\"
internalType
\"
:
\"
uint32
\"
,
\"
name
\"
:
\"
systemTxMaxGas
\"
,
\"
type
\"
:
\"
uint32
\"
},{
\"
internalType
\"
:
\"
uint128
\"
,
\"
name
\"
:
\"
maximumBaseFee
\"
,
\"
type
\"
:
\"
uint128
\"
}],
\"
internalType
\"
:
\"
structResourceMetering.ResourceConfig
\"
,
\"
name
\"
:
\"
_config
\"
,
\"
type
\"
:
\"
tuple
\"
},{
\"
internalType
\"
:
\"
uint256
\"
,
\"
name
\"
:
\"
_startBlock
\"
,
\"
type
\"
:
\"
uint256
\"
},{
\"
internalType
\"
:
\"
address
\"
,
\"
name
\"
:
\"
_batchInbox
\"
,
\"
type
\"
:
\"
address
\"
},{
\"
components
\"
:[{
\"
internalType
\"
:
\"
address
\"
,
\"
name
\"
:
\"
l1CrossDomainMessenger
\"
,
\"
type
\"
:
\"
address
\"
},{
\"
internalType
\"
:
\"
address
\"
,
\"
name
\"
:
\"
l1ERC721Bridge
\"
,
\"
type
\"
:
\"
address
\"
},{
\"
internalType
\"
:
\"
address
\"
,
\"
name
\"
:
\"
l1StandardBridge
\"
,
\"
type
\"
:
\"
address
\"
},{
\"
internalType
\"
:
\"
address
\"
,
\"
name
\"
:
\"
l2OutputOracle
\"
,
\"
type
\"
:
\"
address
\"
},{
\"
internalType
\"
:
\"
address
\"
,
\"
name
\"
:
\"
optimismPortal
\"
,
\"
type
\"
:
\"
address
\"
},{
\"
internalType
\"
:
\"
address
\"
,
\"
name
\"
:
\"
optimismMintableERC20Factory
\"
,
\"
type
\"
:
\"
address
\"
}],
\"
internalType
\"
:
\"
structSystemConfig.Addresses
\"
,
\"
name
\"
:
\"
_addresses
\"
,
\"
type
\"
:
\"
tuple
\"
}],
\"
name
\"
:
\"
initialize
\"
,
\"
outputs
\"
:[],
\"
stateMutability
\"
:
\"
nonpayable
\"
,
\"
type
\"
:
\"
function
\"
},{
\"
inputs
\"
:[],
\"
name
\"
:
\"
l1CrossDomainMessenger
\"
,
\"
outputs
\"
:[{
\"
internalType
\"
:
\"
address
\"
,
\"
name
\"
:
\"
addr_
\"
,
\"
type
\"
:
\"
address
\"
}],
\"
stateMutability
\"
:
\"
view
\"
,
\"
type
\"
:
\"
function
\"
},{
\"
inputs
\"
:[],
\"
name
\"
:
\"
l1ERC721Bridge
\"
,
\"
outputs
\"
:[{
\"
internalType
\"
:
\"
address
\"
,
\"
name
\"
:
\"
addr_
\"
,
\"
type
\"
:
\"
address
\"
}],
\"
stateMutability
\"
:
\"
view
\"
,
\"
type
\"
:
\"
function
\"
},{
\"
inputs
\"
:[],
\"
name
\"
:
\"
l1StandardBridge
\"
,
\"
outputs
\"
:[{
\"
internalType
\"
:
\"
address
\"
,
\"
name
\"
:
\"
addr_
\"
,
\"
type
\"
:
\"
address
\"
}],
\"
stateMutability
\"
:
\"
view
\"
,
\"
type
\"
:
\"
function
\"
},{
\"
inputs
\"
:[],
\"
name
\"
:
\"
l2OutputOracle
\"
,
\"
outputs
\"
:[{
\"
internalType
\"
:
\"
address
\"
,
\"
name
\"
:
\"
addr_
\"
,
\"
type
\"
:
\"
address
\"
}],
\"
stateMutability
\"
:
\"
view
\"
,
\"
type
\"
:
\"
function
\"
},{
\"
inputs
\"
:[],
\"
name
\"
:
\"
minimumGasLimit
\"
,
\"
outputs
\"
:[{
\"
internalType
\"
:
\"
uint64
\"
,
\"
name
\"
:
\"\"
,
\"
type
\"
:
\"
uint64
\"
}],
\"
stateMutability
\"
:
\"
view
\"
,
\"
type
\"
:
\"
function
\"
},{
\"
inputs
\"
:[],
\"
name
\"
:
\"
optimismMintableERC20Factory
\"
,
\"
outputs
\"
:[{
\"
internalType
\"
:
\"
address
\"
,
\"
name
\"
:
\"
addr_
\"
,
\"
type
\"
:
\"
address
\"
}],
\"
stateMutability
\"
:
\"
view
\"
,
\"
type
\"
:
\"
function
\"
},{
\"
inputs
\"
:[],
\"
name
\"
:
\"
optimismPortal
\"
,
\"
outputs
\"
:[{
\"
internalType
\"
:
\"
address
\"
,
\"
name
\"
:
\"
addr_
\"
,
\"
type
\"
:
\"
address
\"
}],
\"
stateMutability
\"
:
\"
view
\"
,
\"
type
\"
:
\"
function
\"
},{
\"
inputs
\"
:[],
\"
name
\"
:
\"
overhead
\"
,
\"
outputs
\"
:[{
\"
internalType
\"
:
\"
uint256
\"
,
\"
name
\"
:
\"\"
,
\"
type
\"
:
\"
uint256
\"
}],
\"
stateMutability
\"
:
\"
view
\"
,
\"
type
\"
:
\"
function
\"
},{
\"
inputs
\"
:[],
\"
name
\"
:
\"
owner
\"
,
\"
outputs
\"
:[{
\"
internalType
\"
:
\"
address
\"
,
\"
name
\"
:
\"\"
,
\"
type
\"
:
\"
address
\"
}],
\"
stateMutability
\"
:
\"
view
\"
,
\"
type
\"
:
\"
function
\"
},{
\"
inputs
\"
:[],
\"
name
\"
:
\"
renounceOwnership
\"
,
\"
outputs
\"
:[],
\"
stateMutability
\"
:
\"
nonpayable
\"
,
\"
type
\"
:
\"
function
\"
},{
\"
inputs
\"
:[],
\"
name
\"
:
\"
resourceConfig
\"
,
\"
outputs
\"
:[{
\"
components
\"
:[{
\"
internalType
\"
:
\"
uint32
\"
,
\"
name
\"
:
\"
maxResourceLimit
\"
,
\"
type
\"
:
\"
uint32
\"
},{
\"
internalType
\"
:
\"
uint8
\"
,
\"
name
\"
:
\"
elasticityMultiplier
\"
,
\"
type
\"
:
\"
uint8
\"
},{
\"
internalType
\"
:
\"
uint8
\"
,
\"
name
\"
:
\"
baseFeeMaxChangeDenominator
\"
,
\"
type
\"
:
\"
uint8
\"
},{
\"
internalType
\"
:
\"
uint32
\"
,
\"
name
\"
:
\"
minimumBaseFee
\"
,
\"
type
\"
:
\"
uint32
\"
},{
\"
internalType
\"
:
\"
uint32
\"
,
\"
name
\"
:
\"
systemTxMaxGas
\"
,
\"
type
\"
:
\"
uint32
\"
},{
\"
internalType
\"
:
\"
uint128
\"
,
\"
name
\"
:
\"
maximumBaseFee
\"
,
\"
type
\"
:
\"
uint128
\"
}],
\"
internalType
\"
:
\"
structResourceMetering.ResourceConfig
\"
,
\"
name
\"
:
\"\"
,
\"
type
\"
:
\"
tuple
\"
}],
\"
stateMutability
\"
:
\"
view
\"
,
\"
type
\"
:
\"
function
\"
},{
\"
inputs
\"
:[],
\"
name
\"
:
\"
scalar
\"
,
\"
outputs
\"
:[{
\"
internalType
\"
:
\"
uint256
\"
,
\"
name
\"
:
\"\"
,
\"
type
\"
:
\"
uint256
\"
}],
\"
stateMutability
\"
:
\"
view
\"
,
\"
type
\"
:
\"
function
\"
},{
\"
inputs
\"
:[{
\"
internalType
\"
:
\"
bytes32
\"
,
\"
name
\"
:
\"
_batcherHash
\"
,
\"
type
\"
:
\"
bytes32
\"
}],
\"
name
\"
:
\"
setBatcherHash
\"
,
\"
outputs
\"
:[],
\"
stateMutability
\"
:
\"
nonpayable
\"
,
\"
type
\"
:
\"
function
\"
},{
\"
inputs
\"
:[{
\"
internalType
\"
:
\"
uint256
\"
,
\"
name
\"
:
\"
_overhead
\"
,
\"
type
\"
:
\"
uint256
\"
},{
\"
internalType
\"
:
\"
uint256
\"
,
\"
name
\"
:
\"
_scalar
\"
,
\"
type
\"
:
\"
uint256
\"
}],
\"
name
\"
:
\"
setGasConfig
\"
,
\"
outputs
\"
:[],
\"
stateMutability
\"
:
\"
nonpayable
\"
,
\"
type
\"
:
\"
function
\"
},{
\"
inputs
\"
:[{
\"
internalType
\"
:
\"
uint64
\"
,
\"
name
\"
:
\"
_gasLimit
\"
,
\"
type
\"
:
\"
uint64
\"
}],
\"
name
\"
:
\"
setGasLimit
\"
,
\"
outputs
\"
:[],
\"
stateMutability
\"
:
\"
nonpayable
\"
,
\"
type
\"
:
\"
function
\"
},{
\"
inputs
\"
:[{
\"
components
\"
:[{
\"
internalType
\"
:
\"
uint32
\"
,
\"
name
\"
:
\"
maxResourceLimit
\"
,
\"
type
\"
:
\"
uint32
\"
},{
\"
internalType
\"
:
\"
uint8
\"
,
\"
name
\"
:
\"
elasticityMultiplier
\"
,
\"
type
\"
:
\"
uint8
\"
},{
\"
internalType
\"
:
\"
uint8
\"
,
\"
name
\"
:
\"
baseFeeMaxChangeDenominator
\"
,
\"
type
\"
:
\"
uint8
\"
},{
\"
internalType
\"
:
\"
uint32
\"
,
\"
name
\"
:
\"
minimumBaseFee
\"
,
\"
type
\"
:
\"
uint32
\"
},{
\"
internalType
\"
:
\"
uint32
\"
,
\"
name
\"
:
\"
systemTxMaxGas
\"
,
\"
type
\"
:
\"
uint32
\"
},{
\"
internalType
\"
:
\"
uint128
\"
,
\"
name
\"
:
\"
maximumBaseFee
\"
,
\"
type
\"
:
\"
uint128
\"
}],
\"
internalType
\"
:
\"
structResourceMetering.ResourceConfig
\"
,
\"
name
\"
:
\"
_config
\"
,
\"
type
\"
:
\"
tuple
\"
}],
\"
name
\"
:
\"
setResourceConfig
\"
,
\"
outputs
\"
:[],
\"
stateMutability
\"
:
\"
nonpayable
\"
,
\"
type
\"
:
\"
function
\"
},{
\"
inputs
\"
:[{
\"
internalType
\"
:
\"
address
\"
,
\"
name
\"
:
\"
_unsafeBlockSigner
\"
,
\"
type
\"
:
\"
address
\"
}],
\"
name
\"
:
\"
setUnsafeBlockSigner
\"
,
\"
outputs
\"
:[],
\"
stateMutability
\"
:
\"
nonpayable
\"
,
\"
type
\"
:
\"
function
\"
},{
\"
inputs
\"
:[],
\"
name
\"
:
\"
startBlock
\"
,
\"
outputs
\"
:[{
\"
internalType
\"
:
\"
uint256
\"
,
\"
name
\"
:
\"\"
,
\"
type
\"
:
\"
uint256
\"
}],
\"
stateMutability
\"
:
\"
view
\"
,
\"
type
\"
:
\"
function
\"
},{
\"
inputs
\"
:[{
\"
internalType
\"
:
\"
address
\"
,
\"
name
\"
:
\"
newOwner
\"
,
\"
type
\"
:
\"
address
\"
}],
\"
name
\"
:
\"
transferOwnership
\"
,
\"
outputs
\"
:[],
\"
stateMutability
\"
:
\"
nonpayable
\"
,
\"
type
\"
:
\"
function
\"
},{
\"
inputs
\"
:[],
\"
name
\"
:
\"
unsafeBlockSigner
\"
,
\"
outputs
\"
:[{
\"
internalType
\"
:
\"
address
\"
,
\"
name
\"
:
\"
addr_
\"
,
\"
type
\"
:
\"
address
\"
}],
\"
stateMutability
\"
:
\"
view
\"
,
\"
type
\"
:
\"
function
\"
},{
\"
inputs
\"
:[],
\"
name
\"
:
\"
version
\"
,
\"
outputs
\"
:[{
\"
internalType
\"
:
\"
string
\"
,
\"
name
\"
:
\"\"
,
\"
type
\"
:
\"
string
\"
}],
\"
stateMutability
\"
:
\"
view
\"
,
\"
type
\"
:
\"
function
\"
}]"
,
ABI
:
"[{
\"
inputs
\"
:[],
\"
stateMutability
\"
:
\"
nonpayable
\"
,
\"
type
\"
:
\"
constructor
\"
},{
\"
anonymous
\"
:false,
\"
inputs
\"
:[{
\"
indexed
\"
:true,
\"
internalType
\"
:
\"
uint256
\"
,
\"
name
\"
:
\"
version
\"
,
\"
type
\"
:
\"
uint256
\"
},{
\"
indexed
\"
:true,
\"
internalType
\"
:
\"
enumSystemConfig.UpdateType
\"
,
\"
name
\"
:
\"
updateType
\"
,
\"
type
\"
:
\"
uint8
\"
},{
\"
indexed
\"
:false,
\"
internalType
\"
:
\"
bytes
\"
,
\"
name
\"
:
\"
data
\"
,
\"
type
\"
:
\"
bytes
\"
}],
\"
name
\"
:
\"
ConfigUpdate
\"
,
\"
type
\"
:
\"
event
\"
},{
\"
anonymous
\"
:false,
\"
inputs
\"
:[{
\"
indexed
\"
:false,
\"
internalType
\"
:
\"
uint8
\"
,
\"
name
\"
:
\"
version
\"
,
\"
type
\"
:
\"
uint8
\"
}],
\"
name
\"
:
\"
Initialized
\"
,
\"
type
\"
:
\"
event
\"
},{
\"
anonymous
\"
:false,
\"
inputs
\"
:[{
\"
indexed
\"
:true,
\"
internalType
\"
:
\"
address
\"
,
\"
name
\"
:
\"
previousOwner
\"
,
\"
type
\"
:
\"
address
\"
},{
\"
indexed
\"
:true,
\"
internalType
\"
:
\"
address
\"
,
\"
name
\"
:
\"
newOwner
\"
,
\"
type
\"
:
\"
address
\"
}],
\"
name
\"
:
\"
OwnershipTransferred
\"
,
\"
type
\"
:
\"
event
\"
},{
\"
inputs
\"
:[],
\"
name
\"
:
\"
BATCH_INBOX_SLOT
\"
,
\"
outputs
\"
:[{
\"
internalType
\"
:
\"
bytes32
\"
,
\"
name
\"
:
\"\"
,
\"
type
\"
:
\"
bytes32
\"
}],
\"
stateMutability
\"
:
\"
view
\"
,
\"
type
\"
:
\"
function
\"
},{
\"
inputs
\"
:[],
\"
name
\"
:
\"
L1_CROSS_DOMAIN_MESSENGER_SLOT
\"
,
\"
outputs
\"
:[{
\"
internalType
\"
:
\"
bytes32
\"
,
\"
name
\"
:
\"\"
,
\"
type
\"
:
\"
bytes32
\"
}],
\"
stateMutability
\"
:
\"
view
\"
,
\"
type
\"
:
\"
function
\"
},{
\"
inputs
\"
:[],
\"
name
\"
:
\"
L1_ERC_721_BRIDGE_SLOT
\"
,
\"
outputs
\"
:[{
\"
internalType
\"
:
\"
bytes32
\"
,
\"
name
\"
:
\"\"
,
\"
type
\"
:
\"
bytes32
\"
}],
\"
stateMutability
\"
:
\"
view
\"
,
\"
type
\"
:
\"
function
\"
},{
\"
inputs
\"
:[],
\"
name
\"
:
\"
L1_STANDARD_BRIDGE_SLOT
\"
,
\"
outputs
\"
:[{
\"
internalType
\"
:
\"
bytes32
\"
,
\"
name
\"
:
\"\"
,
\"
type
\"
:
\"
bytes32
\"
}],
\"
stateMutability
\"
:
\"
view
\"
,
\"
type
\"
:
\"
function
\"
},{
\"
inputs
\"
:[],
\"
name
\"
:
\"
L2_OUTPUT_ORACLE_SLOT
\"
,
\"
outputs
\"
:[{
\"
internalType
\"
:
\"
bytes32
\"
,
\"
name
\"
:
\"\"
,
\"
type
\"
:
\"
bytes32
\"
}],
\"
stateMutability
\"
:
\"
view
\"
,
\"
type
\"
:
\"
function
\"
},{
\"
inputs
\"
:[],
\"
name
\"
:
\"
OPTIMISM_MINTABLE_ERC20_FACTORY_SLOT
\"
,
\"
outputs
\"
:[{
\"
internalType
\"
:
\"
bytes32
\"
,
\"
name
\"
:
\"\"
,
\"
type
\"
:
\"
bytes32
\"
}],
\"
stateMutability
\"
:
\"
view
\"
,
\"
type
\"
:
\"
function
\"
},{
\"
inputs
\"
:[],
\"
name
\"
:
\"
OPTIMISM_PORTAL_SLOT
\"
,
\"
outputs
\"
:[{
\"
internalType
\"
:
\"
bytes32
\"
,
\"
name
\"
:
\"\"
,
\"
type
\"
:
\"
bytes32
\"
}],
\"
stateMutability
\"
:
\"
view
\"
,
\"
type
\"
:
\"
function
\"
},{
\"
inputs
\"
:[],
\"
name
\"
:
\"
UNSAFE_BLOCK_SIGNER_SLOT
\"
,
\"
outputs
\"
:[{
\"
internalType
\"
:
\"
bytes32
\"
,
\"
name
\"
:
\"\"
,
\"
type
\"
:
\"
bytes32
\"
}],
\"
stateMutability
\"
:
\"
view
\"
,
\"
type
\"
:
\"
function
\"
},{
\"
inputs
\"
:[],
\"
name
\"
:
\"
VERSION
\"
,
\"
outputs
\"
:[{
\"
internalType
\"
:
\"
uint256
\"
,
\"
name
\"
:
\"\"
,
\"
type
\"
:
\"
uint256
\"
}],
\"
stateMutability
\"
:
\"
view
\"
,
\"
type
\"
:
\"
function
\"
},{
\"
inputs
\"
:[],
\"
name
\"
:
\"
batchInbox
\"
,
\"
outputs
\"
:[{
\"
internalType
\"
:
\"
address
\"
,
\"
name
\"
:
\"
addr_
\"
,
\"
type
\"
:
\"
address
\"
}],
\"
stateMutability
\"
:
\"
view
\"
,
\"
type
\"
:
\"
function
\"
},{
\"
inputs
\"
:[],
\"
name
\"
:
\"
batcherHash
\"
,
\"
outputs
\"
:[{
\"
internalType
\"
:
\"
bytes32
\"
,
\"
name
\"
:
\"\"
,
\"
type
\"
:
\"
bytes32
\"
}],
\"
stateMutability
\"
:
\"
view
\"
,
\"
type
\"
:
\"
function
\"
},{
\"
inputs
\"
:[],
\"
name
\"
:
\"
gasLimit
\"
,
\"
outputs
\"
:[{
\"
internalType
\"
:
\"
uint64
\"
,
\"
name
\"
:
\"\"
,
\"
type
\"
:
\"
uint64
\"
}],
\"
stateMutability
\"
:
\"
view
\"
,
\"
type
\"
:
\"
function
\"
},{
\"
inputs
\"
:[{
\"
internalType
\"
:
\"
address
\"
,
\"
name
\"
:
\"
_owner
\"
,
\"
type
\"
:
\"
address
\"
},{
\"
internalType
\"
:
\"
uint256
\"
,
\"
name
\"
:
\"
_overhead
\"
,
\"
type
\"
:
\"
uint256
\"
},{
\"
internalType
\"
:
\"
uint256
\"
,
\"
name
\"
:
\"
_scalar
\"
,
\"
type
\"
:
\"
uint256
\"
},{
\"
internalType
\"
:
\"
bytes32
\"
,
\"
name
\"
:
\"
_batcherHash
\"
,
\"
type
\"
:
\"
bytes32
\"
},{
\"
internalType
\"
:
\"
uint64
\"
,
\"
name
\"
:
\"
_gasLimit
\"
,
\"
type
\"
:
\"
uint64
\"
},{
\"
internalType
\"
:
\"
address
\"
,
\"
name
\"
:
\"
_unsafeBlockSigner
\"
,
\"
type
\"
:
\"
address
\"
},{
\"
components
\"
:[{
\"
internalType
\"
:
\"
uint32
\"
,
\"
name
\"
:
\"
maxResourceLimit
\"
,
\"
type
\"
:
\"
uint32
\"
},{
\"
internalType
\"
:
\"
uint8
\"
,
\"
name
\"
:
\"
elasticityMultiplier
\"
,
\"
type
\"
:
\"
uint8
\"
},{
\"
internalType
\"
:
\"
uint8
\"
,
\"
name
\"
:
\"
baseFeeMaxChangeDenominator
\"
,
\"
type
\"
:
\"
uint8
\"
},{
\"
internalType
\"
:
\"
uint32
\"
,
\"
name
\"
:
\"
minimumBaseFee
\"
,
\"
type
\"
:
\"
uint32
\"
},{
\"
internalType
\"
:
\"
uint32
\"
,
\"
name
\"
:
\"
systemTxMaxGas
\"
,
\"
type
\"
:
\"
uint32
\"
},{
\"
internalType
\"
:
\"
uint128
\"
,
\"
name
\"
:
\"
maximumBaseFee
\"
,
\"
type
\"
:
\"
uint128
\"
}],
\"
internalType
\"
:
\"
structResourceMetering.ResourceConfig
\"
,
\"
name
\"
:
\"
_config
\"
,
\"
type
\"
:
\"
tuple
\"
},{
\"
internalType
\"
:
\"
uint256
\"
,
\"
name
\"
:
\"
_startBlock
\"
,
\"
type
\"
:
\"
uint256
\"
},{
\"
internalType
\"
:
\"
address
\"
,
\"
name
\"
:
\"
_batchInbox
\"
,
\"
type
\"
:
\"
address
\"
},{
\"
components
\"
:[{
\"
internalType
\"
:
\"
address
\"
,
\"
name
\"
:
\"
l1CrossDomainMessenger
\"
,
\"
type
\"
:
\"
address
\"
},{
\"
internalType
\"
:
\"
address
\"
,
\"
name
\"
:
\"
l1ERC721Bridge
\"
,
\"
type
\"
:
\"
address
\"
},{
\"
internalType
\"
:
\"
address
\"
,
\"
name
\"
:
\"
l1StandardBridge
\"
,
\"
type
\"
:
\"
address
\"
},{
\"
internalType
\"
:
\"
address
\"
,
\"
name
\"
:
\"
l2OutputOracle
\"
,
\"
type
\"
:
\"
address
\"
},{
\"
internalType
\"
:
\"
address
\"
,
\"
name
\"
:
\"
optimismPortal
\"
,
\"
type
\"
:
\"
address
\"
},{
\"
internalType
\"
:
\"
address
\"
,
\"
name
\"
:
\"
optimismMintableERC20Factory
\"
,
\"
type
\"
:
\"
address
\"
}],
\"
internalType
\"
:
\"
structSystemConfig.Addresses
\"
,
\"
name
\"
:
\"
_addresses
\"
,
\"
type
\"
:
\"
tuple
\"
}],
\"
name
\"
:
\"
initialize
\"
,
\"
outputs
\"
:[],
\"
stateMutability
\"
:
\"
nonpayable
\"
,
\"
type
\"
:
\"
function
\"
},{
\"
inputs
\"
:[],
\"
name
\"
:
\"
l1CrossDomainMessenger
\"
,
\"
outputs
\"
:[{
\"
internalType
\"
:
\"
address
\"
,
\"
name
\"
:
\"
addr_
\"
,
\"
type
\"
:
\"
address
\"
}],
\"
stateMutability
\"
:
\"
view
\"
,
\"
type
\"
:
\"
function
\"
},{
\"
inputs
\"
:[],
\"
name
\"
:
\"
l1ERC721Bridge
\"
,
\"
outputs
\"
:[{
\"
internalType
\"
:
\"
address
\"
,
\"
name
\"
:
\"
addr_
\"
,
\"
type
\"
:
\"
address
\"
}],
\"
stateMutability
\"
:
\"
view
\"
,
\"
type
\"
:
\"
function
\"
},{
\"
inputs
\"
:[],
\"
name
\"
:
\"
l1StandardBridge
\"
,
\"
outputs
\"
:[{
\"
internalType
\"
:
\"
address
\"
,
\"
name
\"
:
\"
addr_
\"
,
\"
type
\"
:
\"
address
\"
}],
\"
stateMutability
\"
:
\"
view
\"
,
\"
type
\"
:
\"
function
\"
},{
\"
inputs
\"
:[],
\"
name
\"
:
\"
l2OutputOracle
\"
,
\"
outputs
\"
:[{
\"
internalType
\"
:
\"
address
\"
,
\"
name
\"
:
\"
addr_
\"
,
\"
type
\"
:
\"
address
\"
}],
\"
stateMutability
\"
:
\"
view
\"
,
\"
type
\"
:
\"
function
\"
},{
\"
inputs
\"
:[],
\"
name
\"
:
\"
minimumGasLimit
\"
,
\"
outputs
\"
:[{
\"
internalType
\"
:
\"
uint64
\"
,
\"
name
\"
:
\"\"
,
\"
type
\"
:
\"
uint64
\"
}],
\"
stateMutability
\"
:
\"
view
\"
,
\"
type
\"
:
\"
function
\"
},{
\"
inputs
\"
:[],
\"
name
\"
:
\"
optimismMintableERC20Factory
\"
,
\"
outputs
\"
:[{
\"
internalType
\"
:
\"
address
\"
,
\"
name
\"
:
\"
addr_
\"
,
\"
type
\"
:
\"
address
\"
}],
\"
stateMutability
\"
:
\"
view
\"
,
\"
type
\"
:
\"
function
\"
},{
\"
inputs
\"
:[],
\"
name
\"
:
\"
optimismPortal
\"
,
\"
outputs
\"
:[{
\"
internalType
\"
:
\"
address
\"
,
\"
name
\"
:
\"
addr_
\"
,
\"
type
\"
:
\"
address
\"
}],
\"
stateMutability
\"
:
\"
view
\"
,
\"
type
\"
:
\"
function
\"
},{
\"
inputs
\"
:[],
\"
name
\"
:
\"
overhead
\"
,
\"
outputs
\"
:[{
\"
internalType
\"
:
\"
uint256
\"
,
\"
name
\"
:
\"\"
,
\"
type
\"
:
\"
uint256
\"
}],
\"
stateMutability
\"
:
\"
view
\"
,
\"
type
\"
:
\"
function
\"
},{
\"
inputs
\"
:[],
\"
name
\"
:
\"
owner
\"
,
\"
outputs
\"
:[{
\"
internalType
\"
:
\"
address
\"
,
\"
name
\"
:
\"\"
,
\"
type
\"
:
\"
address
\"
}],
\"
stateMutability
\"
:
\"
view
\"
,
\"
type
\"
:
\"
function
\"
},{
\"
inputs
\"
:[],
\"
name
\"
:
\"
renounceOwnership
\"
,
\"
outputs
\"
:[],
\"
stateMutability
\"
:
\"
nonpayable
\"
,
\"
type
\"
:
\"
function
\"
},{
\"
inputs
\"
:[],
\"
name
\"
:
\"
resourceConfig
\"
,
\"
outputs
\"
:[{
\"
components
\"
:[{
\"
internalType
\"
:
\"
uint32
\"
,
\"
name
\"
:
\"
maxResourceLimit
\"
,
\"
type
\"
:
\"
uint32
\"
},{
\"
internalType
\"
:
\"
uint8
\"
,
\"
name
\"
:
\"
elasticityMultiplier
\"
,
\"
type
\"
:
\"
uint8
\"
},{
\"
internalType
\"
:
\"
uint8
\"
,
\"
name
\"
:
\"
baseFeeMaxChangeDenominator
\"
,
\"
type
\"
:
\"
uint8
\"
},{
\"
internalType
\"
:
\"
uint32
\"
,
\"
name
\"
:
\"
minimumBaseFee
\"
,
\"
type
\"
:
\"
uint32
\"
},{
\"
internalType
\"
:
\"
uint32
\"
,
\"
name
\"
:
\"
systemTxMaxGas
\"
,
\"
type
\"
:
\"
uint32
\"
},{
\"
internalType
\"
:
\"
uint128
\"
,
\"
name
\"
:
\"
maximumBaseFee
\"
,
\"
type
\"
:
\"
uint128
\"
}],
\"
internalType
\"
:
\"
structResourceMetering.ResourceConfig
\"
,
\"
name
\"
:
\"\"
,
\"
type
\"
:
\"
tuple
\"
}],
\"
stateMutability
\"
:
\"
view
\"
,
\"
type
\"
:
\"
function
\"
},{
\"
inputs
\"
:[],
\"
name
\"
:
\"
scalar
\"
,
\"
outputs
\"
:[{
\"
internalType
\"
:
\"
uint256
\"
,
\"
name
\"
:
\"\"
,
\"
type
\"
:
\"
uint256
\"
}],
\"
stateMutability
\"
:
\"
view
\"
,
\"
type
\"
:
\"
function
\"
},{
\"
inputs
\"
:[{
\"
internalType
\"
:
\"
bytes32
\"
,
\"
name
\"
:
\"
_batcherHash
\"
,
\"
type
\"
:
\"
bytes32
\"
}],
\"
name
\"
:
\"
setBatcherHash
\"
,
\"
outputs
\"
:[],
\"
stateMutability
\"
:
\"
nonpayable
\"
,
\"
type
\"
:
\"
function
\"
},{
\"
inputs
\"
:[{
\"
internalType
\"
:
\"
uint256
\"
,
\"
name
\"
:
\"
_overhead
\"
,
\"
type
\"
:
\"
uint256
\"
},{
\"
internalType
\"
:
\"
uint256
\"
,
\"
name
\"
:
\"
_scalar
\"
,
\"
type
\"
:
\"
uint256
\"
}],
\"
name
\"
:
\"
setGasConfig
\"
,
\"
outputs
\"
:[],
\"
stateMutability
\"
:
\"
nonpayable
\"
,
\"
type
\"
:
\"
function
\"
},{
\"
inputs
\"
:[{
\"
internalType
\"
:
\"
uint64
\"
,
\"
name
\"
:
\"
_gasLimit
\"
,
\"
type
\"
:
\"
uint64
\"
}],
\"
name
\"
:
\"
setGasLimit
\"
,
\"
outputs
\"
:[],
\"
stateMutability
\"
:
\"
nonpayable
\"
,
\"
type
\"
:
\"
function
\"
},{
\"
inputs
\"
:[{
\"
components
\"
:[{
\"
internalType
\"
:
\"
uint32
\"
,
\"
name
\"
:
\"
maxResourceLimit
\"
,
\"
type
\"
:
\"
uint32
\"
},{
\"
internalType
\"
:
\"
uint8
\"
,
\"
name
\"
:
\"
elasticityMultiplier
\"
,
\"
type
\"
:
\"
uint8
\"
},{
\"
internalType
\"
:
\"
uint8
\"
,
\"
name
\"
:
\"
baseFeeMaxChangeDenominator
\"
,
\"
type
\"
:
\"
uint8
\"
},{
\"
internalType
\"
:
\"
uint32
\"
,
\"
name
\"
:
\"
minimumBaseFee
\"
,
\"
type
\"
:
\"
uint32
\"
},{
\"
internalType
\"
:
\"
uint32
\"
,
\"
name
\"
:
\"
systemTxMaxGas
\"
,
\"
type
\"
:
\"
uint32
\"
},{
\"
internalType
\"
:
\"
uint128
\"
,
\"
name
\"
:
\"
maximumBaseFee
\"
,
\"
type
\"
:
\"
uint128
\"
}],
\"
internalType
\"
:
\"
structResourceMetering.ResourceConfig
\"
,
\"
name
\"
:
\"
_config
\"
,
\"
type
\"
:
\"
tuple
\"
}],
\"
name
\"
:
\"
setResourceConfig
\"
,
\"
outputs
\"
:[],
\"
stateMutability
\"
:
\"
nonpayable
\"
,
\"
type
\"
:
\"
function
\"
},{
\"
inputs
\"
:[{
\"
internalType
\"
:
\"
address
\"
,
\"
name
\"
:
\"
_unsafeBlockSigner
\"
,
\"
type
\"
:
\"
address
\"
}],
\"
name
\"
:
\"
setUnsafeBlockSigner
\"
,
\"
outputs
\"
:[],
\"
stateMutability
\"
:
\"
nonpayable
\"
,
\"
type
\"
:
\"
function
\"
},{
\"
inputs
\"
:[],
\"
name
\"
:
\"
startBlock
\"
,
\"
outputs
\"
:[{
\"
internalType
\"
:
\"
uint256
\"
,
\"
name
\"
:
\"\"
,
\"
type
\"
:
\"
uint256
\"
}],
\"
stateMutability
\"
:
\"
view
\"
,
\"
type
\"
:
\"
function
\"
},{
\"
inputs
\"
:[{
\"
internalType
\"
:
\"
address
\"
,
\"
name
\"
:
\"
newOwner
\"
,
\"
type
\"
:
\"
address
\"
}],
\"
name
\"
:
\"
transferOwnership
\"
,
\"
outputs
\"
:[],
\"
stateMutability
\"
:
\"
nonpayable
\"
,
\"
type
\"
:
\"
function
\"
},{
\"
inputs
\"
:[],
\"
name
\"
:
\"
unsafeBlockSigner
\"
,
\"
outputs
\"
:[{
\"
internalType
\"
:
\"
address
\"
,
\"
name
\"
:
\"
addr_
\"
,
\"
type
\"
:
\"
address
\"
}],
\"
stateMutability
\"
:
\"
view
\"
,
\"
type
\"
:
\"
function
\"
},{
\"
inputs
\"
:[],
\"
name
\"
:
\"
version
\"
,
\"
outputs
\"
:[{
\"
internalType
\"
:
\"
string
\"
,
\"
name
\"
:
\"\"
,
\"
type
\"
:
\"
string
\"
}],
\"
stateMutability
\"
:
\"
view
\"
,
\"
type
\"
:
\"
function
\"
}]"
,
Bin
:
"0x60e06040523480156200001157600080fd5b5060016080818152600
560a0908152600060c081815260408051808301825286815260208082018890526002828401526060808301869052828801869052828701869052835194850184528585529084018590529183018490529082018390529381018290529182018190526200009c9361dead9391928392839291839190600019908390620000a2565b62000ae1565b600054600290610100900460ff16158015620000c5575060005460ff8083169116105b6200012e5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805461ffff191660ff8316176101001790556200014c620003f7565b620001578b6200045f565b60658a905560668990556067889055606880546001600160401b0319166001600160401b038916179055620001aa867f65a7ed542fb37fe237fdfbdd70b31598523fe5b32879e307bae27a0bd9581c0855565b620001df83620001dc60017f71ac12829d66ee73d8d95bff50b3589745ce57edae70a3fb111a2342464dc59862000a16565b55565b81516200021390620001dc60017f383f291819e6d54073bc9a648251d97421076bdd101933c0c022219ce958063762000a16565b60208201516200024a90620001dc60017f46adcbebc6be8ce551740c29c47c8798210f23f7f4086c41752944352568d5a862000a16565b60408201516200028190620001dc60017f9904ba90dde5696cda05c9e0dab5cbaa0fea005ace4d11218a02ac668dad637762000a16565b6060820151620002b890620001dc60017fe52a667f71ec761b9b381c7b76ca9b852adf7e8905da0e0ad49986a0a687181662000a16565b6080820151620002ef90620001dc60017f4b6c74f9e688cb39801f2112c14a8c57232a3fc5202e1444126d4bce86eb19ad62000a16565b60a08201516200032690620001dc60017fa04c5bb938ca6fc46d95553abf0a76345ce3e722a30bf4f74928b8e7d852320d62000a16565b6200033184620004de565b6200033c8562000569565b62000346620008be565b6001600160401b0316876001600160401b03161015620003a95760405162461bcd60e51b815260206004820152601f60248201527f53797374656d436f6e6669673a20676173206c696d697420746f6f206c6f7700604482015260640162000125565b6000805461ff001916905560405160ff821681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050505050505050505050565b600054610100900460ff16620004535760405162461bcd60e51b815260206004820152602b6024820152600080516020620029dc83398151915260448201526a6e697469616c697a696e6760a81b606482015260840162000125565b6200045d620008eb565b565b6200046962000952565b6001600160a01b038116620004d05760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840162000125565b620004db81620009ae565b50565b606a5415620005565760405162461bcd60e51b815260206004820152603860248201527f53797374656d436f6e6669673a2063616e6e6f74206f7665727269646520616e60448201527f20616c72656164792073657420737461727420626c6f636b0000000000000000606482015260840162000125565b80156200056257606a55565b43606a5550565b8060a001516001600160801b0316816060015163ffffffff161115620005f85760405162461bcd60e51b815260206004820152603560248201527f53797374656d436f6e6669673a206d696e206261736520666565206d7573742060448201527f6265206c657373207468616e206d617820626173650000000000000000000000606482015260840162000125565b6001816040015160ff1611620006695760405162461bcd60e51b815260206004820152602f60248201527f53797374656d436f6e6669673a2064656e6f6d696e61746f72206d757374206260448201526e65206c6172676572207468616e203160881b606482015260840162000125565b606854608082015182516001600160401b03909216916200068b919062000a30565b63ffffffff161115620006e15760405162461bcd60e51b815260206004820152601f60248201527f53797374656d436f6e6669673a20676173206c696d697420746f6f206c6f7700604482015260640162000125565b6000816020015160ff1611620007525760405162461bcd60e51b815260206004820152602f60248201527f53797374656d436f6e6669673a20656c6173746963697479206d756c7469706c60448201526e06965722063616e6e6f74206265203608c1b606482015260840162000125565b8051602082015163ffffffff82169160ff909116906200077490829062000a5b565b62000780919062000a8d565b63ffffffff1614620007fb5760405162461bcd60e51b815260206004820152603760248201527f53797374656d436f6e6669673a20707265636973696f6e206c6f73732077697460448201527f6820746172676574207265736f75726365206c696d6974000000000000000000606482015260840162000125565b805160698054602084015160408501516060860151608087015160a09097015163ffffffff96871664ffffffffff199095169490941764010000000060ff948516021764ffffffffff60281b191665010000000000939092169290920263ffffffff60301b19161766010000000000009185169190910217600160501b600160f01b0319166a01000000000000000000009390941692909202600160701b600160f01b03191692909217600160701b6001600160801b0390921691909102179055565b606954600090620008e69063ffffffff6a010000000000000000000082048116911662000abc565b905090565b600054610100900460ff16620009475760405162461bcd60e51b815260206004820152602b6024820152600080516020620029dc83398151915260448201526a6e697469616c697a696e6760a81b606482015260840162000125565b6200045d33620009ae565b6033546001600160a01b031633146200045d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640162000125565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b634e487b7160e01b600052601160045260246000fd5b60008282101562000a2b5762000a2b62000a00565b500390565b600063ffffffff80831681851680830382111562000a525762000a5262000a00565b01949350505050565b600063ffffffff8084168062000a8157634e487b7160e01b600052601260045260246000fd5b92169190910492915050565b600063ffffffff8083168185168183048111821515161562000ab35762000ab362000a00565b02949350505050565b60006001600160401b0382811684821680830382111562000a525762000a5262000a00565b60805160a05160c051611ecb62000b116000396000610b7d01526000610b5401526000610b2b0152611ecb6000f3fe608060405234801561001057600080fd5b50600436106102265760003560e01c8063935f029e1161012a578063cc731b02116100bd578063f45e65d81161008c578063f8c68de011610071578063f8c68de014610541578063fd32aa0f14610549578063ffa1ad741461055157600080fd5b8063f45e65d814610524578063f68016b71461052d57600080fd5b8063cc731b02146103cc578063dac6e63a14610500578063e81b2c6d14610508578063f2fde38b1461051157600080fd5b8063bc49ce5f116100f9578063bc49ce5f14610396578063c4e8ddfa1461039e578063c71973f6146103a6578063c9b26f61146103b957600080fd5b8063935f029e146103605780639b7d7f0a14610373578063a71198691461037b578063b40a817c1461038357600080fd5b80634add321d116101bd57806354fd4d501161018c57806361d157681161017157806361d1576814610332578063715018a61461033a5780638da5cb5b1461034257600080fd5b806354fd4d50146103155780635d73369c1461032a57600080fd5b80634add321d146102b25780634d9f1559146102d35780634f16540b146102db5780635228a6ac1461030257600080fd5b806318d13918116101f957806318d139181461028457806319f5cea8146102995780631fd19ee1146102a157806348cd4cb1146102a957600080fd5b806306c926571461022b578063078f29cf146102465780630a49cb03146102735780630c18c1621461027b575b600080fd5b610233610559565b6040519081526020015b60405180910390f35b61024e610587565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161023d565b61024e6105c0565b61023360655481565b61029761029236600461189c565b6105f0565b005b6102336106b4565b61024e6106df565b610233606a5481565b6102ba610709565b60405167ffffffffffffffff909116815260200161023d565b61024e61072f565b6102337f65a7ed542fb37fe237fdfbdd70b31598523fe5b32879e307bae27a0bd9581c0881565b610297610310366004611a5b565b61075f565b61031d610b24565b60405161023d9190611c0d565b610233610bc7565b610233610bf2565b610297610c1d565b60335473ffffffffffffffffffffffffffffffffffffffff1661024e565b61029761036e366004611c20565b610c31565b61024e610cca565b61024e610cfa565b610297610391366004611c42565b610d2a565b610233610e10565b61024e610e3b565b6102976103b4366004611c5d565b610e6b565b6102976103c7366004611c79565b610e7f565b6104906040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a0810191909152506040805160c08101825260695463ffffffff8082168352640100000000820460ff9081166020850152650100000000008304169383019390935266010000000000008104831660608301526a0100000000000000000000810490921660808201526e0100000000000000000000000000009091046fffffffffffffffffffffffffffffffff1660a082015290565b60405161023d9190600060c08201905063ffffffff80845116835260ff602085015116602084015260ff6040850151166040840152806060850151166060840152806080850151166080840152506fffffffffffffffffffffffffffffffff60a08401511660a083015292915050565b61024e610eaf565b61023360675481565b61029761051f36600461189c565b610edf565b61023360665481565b6068546102ba9067ffffffffffffffff1681565b610233610f93565b610233610fbe565b610233600081565b61058460017fa04c5bb938ca6fc46d95553abf0a76345ce3e722a30bf4f74928b8e7d852320d611cc1565b81565b60006105bb6105b760017f9904ba90dde5696cda05c9e0dab5cbaa0fea005ace4d11218a02ac668dad6377611cc1565b5490565b905090565b60006105bb6105b760017f4b6c74f9e688cb39801f2112c14a8c57232a3fc5202e1444126d4bce86eb19ad611cc1565b6105f8610fe9565b610620817f65a7ed542fb37fe237fdfbdd70b31598523fe5b32879e307bae27a0bd9581c0855565b6040805173ffffffffffffffffffffffffffffffffffffffff8316602082015260009101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052905060035b60007f1d2b0bda21d56b8bd12d4f94ebacffdfb35f5e226f84b461103bb8beab6353be836040516106a89190611c0d565b60405180910390a35050565b61058460017f46adcbebc6be8ce551740c29c47c8798210f23f7f4086c41752944352568d5a8611cc1565b60006105bb7f65a7ed542fb37fe237fdfbdd70b31598523fe5b32879e307bae27a0bd9581c085490565b6069546000906105bb9063ffffffff6a0100000000000000000000820481169116611cd8565b60006105bb6105b760017fe52a667f71ec761b9b381c7b76ca9b852adf7e8905da0e0ad49986a0a6871816611cc1565b600054600290610100900460ff16158015610781575060005460ff8083169116105b610812576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001660ff83161761010017905561084b61106a565b6108548b610edf565b60658a905560668990556067889055606880547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff89161790557f65a7ed542fb37fe237fdfbdd70b31598523fe5b32879e307bae27a0bd9581c088690556108ed836108ea60017f71ac12829d66ee73d8d95bff50b3589745ce57edae70a3fb111a2342464dc598611cc1565b55565b815161091e906108ea60017f383f291819e6d54073bc9a648251d97421076bdd101933c0c022219ce9580637611cc1565b6020820151610952906108ea60017f46adcbebc6be8ce551740c29c47c8798210f23f7f4086c41752944352568d5a8611cc1565b6040820151610986906108ea60017f9904ba90dde5696cda05c9e0dab5cbaa0fea005ace4d11218a02ac668dad6377611cc1565b60608201516109ba906108ea60017fe52a667f71ec761b9b381c7b76ca9b852adf7e8905da0e0ad49986a0a6871816611cc1565b60808201516109ee906108ea60017f4b6c74f9e688cb39801f2112c14a8c57232a3fc5202e1444126d4bce86eb19ad611cc1565b60a0820151610a22906108ea60017fa04c5bb938ca6fc46d95553abf0a76345ce3e722a30bf4f74928b8e7d852320d611cc1565b610a2b84611109565b610a34856111ab565b610a3c610709565b67ffffffffffffffff168767ffffffffffffffff161015610ab9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f53797374656d436f6e6669673a20676173206c696d697420746f6f206c6f77006044820152606401610809565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16905560405160ff821681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050505050505050505050565b6060610b4f7f000000000000000000000000000000000000000000000000000000000000000061161f565b610b787f000000000000000000000000000000000000000000000000000000000000000061161f565b610ba17f000000000000000000000000000000000000000000000000000000000000000061161f565b604051602001610bb393929190611d04565b604051602081830303815290604052905090565b61058460017f383f291819e6d54073bc9a648251d97421076bdd101933c0c022219ce9580637611cc1565b61058460017fe52a667f71ec761b9b381c7b76ca9b852adf7e8905da0e0ad49986a0a6871816611cc1565b610c25610fe9565b610c2f600061175c565b565b610c39610fe9565b606582905560668190556040805160208101849052908101829052600090606001604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190529050600160007f1d2b0bda21d56b8bd12d4f94ebacffdfb35f5e226f84b461103bb8beab6353be83604051610cbd9190611c0d565b60405180910390a3505050565b60006105bb6105b760017fa04c5bb938ca6fc46d95553abf0a76345ce3e722a30bf4f74928b8e7d852320d611cc1565b60006105bb6105b760017f383f291819e6d54073bc9a648251d97421076bdd101933c0c022219ce9580637611cc1565b610d32610fe9565b610d3a610709565b67ffffffffffffffff168167ffffffffffffffff161015610db7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f53797374656d436f6e6669673a20676173206c696d697420746f6f206c6f77006044820152606401610809565b606880547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff83169081179091556040805160208082019390935281518082039093018352810190526002610677565b61058460017f71ac12829d66ee73d8d95bff50b3589745ce57edae70a3fb111a2342464dc598611cc1565b60006105bb6105b760017f46adcbebc6be8ce551740c29c47c8798210f23f7f4086c41752944352568d5a8611cc1565b610e73610fe9565b610e7c816111ab565b50565b610e87610fe9565b6067819055604080516020808201849052825180830390910181529082019091526000610677565b60006105bb6105b760017f71ac12829d66ee73d8d95bff50b3589745ce57edae70a3fb111a2342464dc598611cc1565b610ee7610fe9565b73ffffffffffffffffffffffffffffffffffffffff8116610f8a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610809565b610e7c8161175c565b61058460017f9904ba90dde5696cda05c9e0dab5cbaa0fea005ace4d11218a02ac668dad6377611cc1565b61058460017f4b6c74f9e688cb39801f2112c14a8c57232a3fc5202e1444126d4bce86eb19ad611cc1565b60335473ffffffffffffffffffffffffffffffffffffffff163314610c2f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610809565b600054610100900460ff16611101576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610809565b610c2f6117d3565b606a5415611199576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603860248201527f53797374656d436f6e6669673a2063616e6e6f74206f7665727269646520616e60448201527f20616c72656164792073657420737461727420626c6f636b00000000000000006064820152608401610809565b80156111a457606a55565b43606a5550565b8060a001516fffffffffffffffffffffffffffffffff16816060015163ffffffff16111561125b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f53797374656d436f6e6669673a206d696e206261736520666565206d7573742060448201527f6265206c657373207468616e206d6178206261736500000000000000000000006064820152608401610809565b6001816040015160ff16116112f2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f53797374656d436f6e6669673a2064656e6f6d696e61746f72206d757374206260448201527f65206c6172676572207468616e203100000000000000000000000000000000006064820152608401610809565b6068546080820151825167ffffffffffffffff909216916113139190611d7a565b63ffffffff161115611381576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f53797374656d436f6e6669673a20676173206c696d697420746f6f206c6f77006044820152606401610809565b6000816020015160ff1611611418576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f53797374656d436f6e6669673a20656c6173746963697479206d756c7469706c60448201527f6965722063616e6e6f74206265203000000000000000000000000000000000006064820152608401610809565b8051602082015163ffffffff82169160ff90911690611438908290611dc8565b6114429190611deb565b63ffffffff16146114d5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f53797374656d436f6e6669673a20707265636973696f6e206c6f73732077697460448201527f6820746172676574207265736f75726365206c696d69740000000000000000006064820152608401610809565b805160698054602084015160408501516060860151608087015160a09097015163ffffffff9687167fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000009095169490941764010000000060ff94851602177fffffffffffffffffffffffffffffffffffffffffffff0000000000ffffffffff166501000000000093909216929092027fffffffffffffffffffffffffffffffffffffffffffff00000000ffffffffffff1617660100000000000091851691909102177fffff0000000000000000000000000000000000000000ffffffffffffffffffff166a010000000000000000000093909416929092027fffff00000000000000000000000000000000ffffffffffffffffffffffffffff16929092176e0100000000000000000000000000006fffffffffffffffffffffffffffffffff90921691909102179055565b60608160000361166257505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b811561168c578061167681611e17565b91506116859050600a83611e4f565b9150611666565b60008167ffffffffffffffff8111156116a7576116a76118d6565b6040519080825280601f01601f1916602001820160405280156116d1576020820181803683370190505b5090505b8415611754576116e6600183611cc1565b91506116f3600a86611e63565b6116fe906030611e77565b60f81b81838151811061171357611713611e8f565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535061174d600a86611e4f565b94506116d5565b949350505050565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600054610100900460ff1661186a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610809565b610c2f3361175c565b803573ffffffffffffffffffffffffffffffffffffffff8116811461189757600080fd5b919050565b6000602082840312156118ae57600080fd5b6118b782611873565b9392505050565b803567ffffffffffffffff8116811461189757600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405160c0810167ffffffffffffffff8111828210171561194f577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405290565b803563ffffffff8116811461189757600080fd5b803560ff8116811461189757600080fd5b600060c0828403121561198c57600080fd5b60405160c0810181811067ffffffffffffffff821117156119d6577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040529050806119e583611955565b81526119f360208401611969565b6020820152611a0460408401611969565b6040820152611a1560608401611955565b6060820152611a2660808401611955565b608082015260a08301356fffffffffffffffffffffffffffffffff81168114611a4e57600080fd5b60a0919091015292915050565b6000806000806000806000806000808a8c03610280811215611a7c57600080fd5b611a858c611873565b9a5060208c0135995060408c0135985060608c01359750611aa860808d016118be565b9650611ab660a08d01611873565b9550611ac58d60c08e0161197a565b94506101808c01359350611adc6101a08d01611873565b925060c07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe4082011215611b0e57600080fd5b50611b17611905565b611b246101c08d01611873565b8152611b336101e08d01611873565b6020820152611b456102008d01611873565b6040820152611b576102208d01611873565b6060820152611b696102408d01611873565b6080820152611b7b6102608d01611873565b60a0820152809150509295989b9194979a5092959850565b60005b83811015611bae578181015183820152602001611b96565b83811115611bbd576000848401525b50505050565b60008151808452611bdb816020860160208601611b93565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006118b76020830184611bc3565b60008060408385031215611c3357600080fd5b50508035926020909101359150565b600060208284031215611c5457600080fd5b6118b7826118be565b600060c08284031215611c6f57600080fd5b6118b7838361197a565b600060208284031215611c8b57600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082821015611cd357611cd3611c92565b500390565b600067ffffffffffffffff808316818516808303821115611cfb57611cfb611c92565b01949350505050565b60008451611d16818460208901611b93565b80830190507f2e000000000000000000000000000000000000000000000000000000000000008082528551611d52816001850160208a01611b93565b60019201918201528351611d6d816002840160208801611b93565b0160020195945050505050565b600063ffffffff808316818516808303821115611cfb57611cfb611c92565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600063ffffffff80841680611ddf57611ddf611d99565b92169190910492915050565b600063ffffffff80831681851681830481118215151615611e0e57611e0e611c92565b02949350505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611e4857611e48611c92565b5060010190565b600082611e5e57611e5e611d99565b500490565b600082611e7257611e72611d99565b500690565b60008219821115611e8a57611e8a611c92565b500190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fdfea164736f6c634300080f000a
496e697469616c697a61626c653a20636f6e7472616374206973206e6f742069"
,
Bin
:
"0x60e06040523480156200001157600080fd5b5060016080818152600
660a0908152600060c081815260408051808301825286815260208082018890526002828401526060808301869052828801869052828701869052835194850184528585529084018590529183018490529082018390529381018290529182018190526200009c9361dead9391928392839291839190600019908390620000a2565b62000c9e565b600054600290610100900460ff16158015620000c5575060005460ff8083169116105b6200012e5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805461ffff191660ff8316176101001790556200014c620003c0565b620001578b62000428565b6200016288620004a7565b6200016e8a8a620004f9565b62000179876200055d565b6200018486620005fa565b620001b983620001b660017f71ac12829d66ee73d8d95bff50b3589745ce57edae70a3fb111a2342464dc59862000b7b565b55565b8151620001ed90620001b660017f383f291819e6d54073bc9a648251d97421076bdd101933c0c022219ce958063762000b7b565b60208201516200022490620001b660017f46adcbebc6be8ce551740c29c47c8798210f23f7f4086c41752944352568d5a862000b7b565b60408201516200025b90620001b660017f9904ba90dde5696cda05c9e0dab5cbaa0fea005ace4d11218a02ac668dad637762000b7b565b60608201516200029290620001b660017fe52a667f71ec761b9b381c7b76ca9b852adf7e8905da0e0ad49986a0a687181662000b7b565b6080820151620002c990620001b660017f4b6c74f9e688cb39801f2112c14a8c57232a3fc5202e1444126d4bce86eb19ad62000b7b565b60a08201516200030090620001b660017fa04c5bb938ca6fc46d95553abf0a76345ce3e722a30bf4f74928b8e7d852320d62000b7b565b6200030b8462000654565b6200031685620006df565b6200032062000a23565b6001600160401b0316876001600160401b03161015620003725760405162461bcd60e51b815260206004820152601f602482015260008051602062002b80833981519152604482015260640162000125565b6000805461ff001916905560405160ff821681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050505050505050505050565b600054610100900460ff166200041c5760405162461bcd60e51b815260206004820152602b602482015260008051602062002bc083398151915260448201526a6e697469616c697a696e6760a81b606482015260840162000125565b6200042662000a50565b565b6200043262000ab7565b6001600160a01b038116620004995760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840162000125565b620004a48162000b13565b50565b60678190556040805160208082018490528251808303909101815290820190915260005b600060008051602062002ba083398151915283604051620004ed919062000b95565b60405180910390a35050565b60658290556066819055604080516020810184905290810182905260009060600160408051601f1981840301815291905290506001600060008051602062002ba08339815191528360405162000550919062000b95565b60405180910390a3505050565b6200056762000a23565b6001600160401b0316816001600160401b03161015620005b95760405162461bcd60e51b815260206004820152601f602482015260008051602062002b80833981519152604482015260640162000125565b606880546001600160401b0319166001600160401b0383169081179091556040805160208082019390935281518082039093018352810190526002620004cb565b62000623817f65a7ed542fb37fe237fdfbdd70b31598523fe5b32879e307bae27a0bd9581c0855565b604080516001600160a01b03831660208201526000910160408051601f1981840301815291905290506003620004cb565b606a5415620006cc5760405162461bcd60e51b815260206004820152603860248201527f53797374656d436f6e6669673a2063616e6e6f74206f7665727269646520616e60448201527f20616c72656164792073657420737461727420626c6f636b0000000000000000606482015260840162000125565b8015620006d857606a55565b43606a5550565b8060a001516001600160801b0316816060015163ffffffff1611156200076e5760405162461bcd60e51b815260206004820152603560248201527f53797374656d436f6e6669673a206d696e206261736520666565206d7573742060448201527f6265206c657373207468616e206d617820626173650000000000000000000000606482015260840162000125565b6001816040015160ff1611620007df5760405162461bcd60e51b815260206004820152602f60248201527f53797374656d436f6e6669673a2064656e6f6d696e61746f72206d757374206260448201526e65206c6172676572207468616e203160881b606482015260840162000125565b606854608082015182516001600160401b039092169162000801919062000bed565b63ffffffff161115620008465760405162461bcd60e51b815260206004820152601f602482015260008051602062002b80833981519152604482015260640162000125565b6000816020015160ff1611620008b75760405162461bcd60e51b815260206004820152602f60248201527f53797374656d436f6e6669673a20656c6173746963697479206d756c7469706c60448201526e06965722063616e6e6f74206265203608c1b606482015260840162000125565b8051602082015163ffffffff82169160ff90911690620008d990829062000c18565b620008e5919062000c4a565b63ffffffff1614620009605760405162461bcd60e51b815260206004820152603760248201527f53797374656d436f6e6669673a20707265636973696f6e206c6f73732077697460448201527f6820746172676574207265736f75726365206c696d6974000000000000000000606482015260840162000125565b805160698054602084015160408501516060860151608087015160a09097015163ffffffff96871664ffffffffff199095169490941764010000000060ff948516021764ffffffffff60281b191665010000000000939092169290920263ffffffff60301b19161766010000000000009185169190910217600160501b600160f01b0319166a01000000000000000000009390941692909202600160701b600160f01b03191692909217600160701b6001600160801b0390921691909102179055565b60695460009062000a4b9063ffffffff6a010000000000000000000082048116911662000c79565b905090565b600054610100900460ff1662000aac5760405162461bcd60e51b815260206004820152602b602482015260008051602062002bc083398151915260448201526a6e697469616c697a696e6760a81b606482015260840162000125565b620004263362000b13565b6033546001600160a01b03163314620004265760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640162000125565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b634e487b7160e01b600052601160045260246000fd5b60008282101562000b905762000b9062000b65565b500390565b600060208083528351808285015260005b8181101562000bc45785810183015185820160400152820162000ba6565b8181111562000bd7576000604083870101525b50601f01601f1916929092016040019392505050565b600063ffffffff80831681851680830382111562000c0f5762000c0f62000b65565b01949350505050565b600063ffffffff8084168062000c3e57634e487b7160e01b600052601260045260246000fd5b92169190910492915050565b600063ffffffff8083168185168183048111821515161562000c705762000c7062000b65565b02949350505050565b60006001600160401b0382811684821680830382111562000c0f5762000c0f62000b65565b60805160a05160c051611eb262000cce6000396000610a8b01526000610a6201526000610a390152611eb26000f3fe608060405234801561001057600080fd5b50600436106102265760003560e01c8063935f029e1161012a578063cc731b02116100bd578063f45e65d81161008c578063f8c68de011610071578063f8c68de014610541578063fd32aa0f14610549578063ffa1ad741461055157600080fd5b8063f45e65d814610524578063f68016b71461052d57600080fd5b8063cc731b02146103cc578063dac6e63a14610500578063e81b2c6d14610508578063f2fde38b1461051157600080fd5b8063bc49ce5f116100f9578063bc49ce5f14610396578063c4e8ddfa1461039e578063c71973f6146103a6578063c9b26f61146103b957600080fd5b8063935f029e146103605780639b7d7f0a14610373578063a71198691461037b578063b40a817c1461038357600080fd5b80634add321d116101bd57806354fd4d501161018c57806361d157681161017157806361d1576814610332578063715018a61461033a5780638da5cb5b1461034257600080fd5b806354fd4d50146103155780635d73369c1461032a57600080fd5b80634add321d146102b25780634d9f1559146102d35780634f16540b146102db5780635228a6ac1461030257600080fd5b806318d13918116101f957806318d139181461028457806319f5cea8146102995780631fd19ee1146102a157806348cd4cb1146102a957600080fd5b806306c926571461022b578063078f29cf146102465780630a49cb03146102735780630c18c1621461027b575b600080fd5b610233610559565b6040519081526020015b60405180910390f35b61024e610587565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161023d565b61024e6105c0565b61023360655481565b610297610292366004611883565b6105f0565b005b610233610604565b61024e61062f565b610233606a5481565b6102ba610659565b60405167ffffffffffffffff909116815260200161023d565b61024e61067f565b6102337f65a7ed542fb37fe237fdfbdd70b31598523fe5b32879e307bae27a0bd9581c0881565b610297610310366004611a42565b6106af565b61031d610a32565b60405161023d9190611bf4565b610233610ad5565b610233610b00565b610297610b2b565b60335473ffffffffffffffffffffffffffffffffffffffff1661024e565b61029761036e366004611c07565b610b3f565b61024e610b55565b61024e610b85565b610297610391366004611c29565b610bb5565b610233610bc6565b61024e610bf1565b6102976103b4366004611c44565b610c21565b6102976103c7366004611c60565b610c32565b6104906040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a0810191909152506040805160c08101825260695463ffffffff8082168352640100000000820460ff9081166020850152650100000000008304169383019390935266010000000000008104831660608301526a0100000000000000000000810490921660808201526e0100000000000000000000000000009091046fffffffffffffffffffffffffffffffff1660a082015290565b60405161023d9190600060c08201905063ffffffff80845116835260ff602085015116602084015260ff6040850151166040840152806060850151166060840152806080850151166080840152506fffffffffffffffffffffffffffffffff60a08401511660a083015292915050565b61024e610c43565b61023360675481565b61029761051f366004611883565b610c73565b61023360665481565b6068546102ba9067ffffffffffffffff1681565b610233610d27565b610233610d52565b610233600081565b61058460017fa04c5bb938ca6fc46d95553abf0a76345ce3e722a30bf4f74928b8e7d852320d611ca8565b81565b60006105bb6105b760017f9904ba90dde5696cda05c9e0dab5cbaa0fea005ace4d11218a02ac668dad6377611ca8565b5490565b905090565b60006105bb6105b760017f4b6c74f9e688cb39801f2112c14a8c57232a3fc5202e1444126d4bce86eb19ad611ca8565b6105f8610d7d565b61060181610dfe565b50565b61058460017f46adcbebc6be8ce551740c29c47c8798210f23f7f4086c41752944352568d5a8611ca8565b60006105bb7f65a7ed542fb37fe237fdfbdd70b31598523fe5b32879e307bae27a0bd9581c085490565b6069546000906105bb9063ffffffff6a0100000000000000000000820481169116611cbf565b60006105bb6105b760017fe52a667f71ec761b9b381c7b76ca9b852adf7e8905da0e0ad49986a0a6871816611ca8565b600054600290610100900460ff161580156106d1575060005460ff8083169116105b610762576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001660ff83161761010017905561079b610eba565b6107a48b610c73565b6107ad88610f59565b6107b78a8a610f81565b6107c087611012565b6107c986610dfe565b6107fb836107f860017f71ac12829d66ee73d8d95bff50b3589745ce57edae70a3fb111a2342464dc598611ca8565b55565b815161082c906107f860017f383f291819e6d54073bc9a648251d97421076bdd101933c0c022219ce9580637611ca8565b6020820151610860906107f860017f46adcbebc6be8ce551740c29c47c8798210f23f7f4086c41752944352568d5a8611ca8565b6040820151610894906107f860017f9904ba90dde5696cda05c9e0dab5cbaa0fea005ace4d11218a02ac668dad6377611ca8565b60608201516108c8906107f860017fe52a667f71ec761b9b381c7b76ca9b852adf7e8905da0e0ad49986a0a6871816611ca8565b60808201516108fc906107f860017f4b6c74f9e688cb39801f2112c14a8c57232a3fc5202e1444126d4bce86eb19ad611ca8565b60a0820151610930906107f860017fa04c5bb938ca6fc46d95553abf0a76345ce3e722a30bf4f74928b8e7d852320d611ca8565b610939846110f0565b61094285611192565b61094a610659565b67ffffffffffffffff168767ffffffffffffffff1610156109c7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f53797374656d436f6e6669673a20676173206c696d697420746f6f206c6f77006044820152606401610759565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16905560405160ff821681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050505050505050505050565b6060610a5d7f0000000000000000000000000000000000000000000000000000000000000000611606565b610a867f0000000000000000000000000000000000000000000000000000000000000000611606565b610aaf7f0000000000000000000000000000000000000000000000000000000000000000611606565b604051602001610ac193929190611ceb565b604051602081830303815290604052905090565b61058460017f383f291819e6d54073bc9a648251d97421076bdd101933c0c022219ce9580637611ca8565b61058460017fe52a667f71ec761b9b381c7b76ca9b852adf7e8905da0e0ad49986a0a6871816611ca8565b610b33610d7d565b610b3d6000611743565b565b610b47610d7d565b610b518282610f81565b5050565b60006105bb6105b760017fa04c5bb938ca6fc46d95553abf0a76345ce3e722a30bf4f74928b8e7d852320d611ca8565b60006105bb6105b760017f383f291819e6d54073bc9a648251d97421076bdd101933c0c022219ce9580637611ca8565b610bbd610d7d565b61060181611012565b61058460017f71ac12829d66ee73d8d95bff50b3589745ce57edae70a3fb111a2342464dc598611ca8565b60006105bb6105b760017f46adcbebc6be8ce551740c29c47c8798210f23f7f4086c41752944352568d5a8611ca8565b610c29610d7d565b61060181611192565b610c3a610d7d565b61060181610f59565b60006105bb6105b760017f71ac12829d66ee73d8d95bff50b3589745ce57edae70a3fb111a2342464dc598611ca8565b610c7b610d7d565b73ffffffffffffffffffffffffffffffffffffffff8116610d1e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610759565b61060181611743565b61058460017f9904ba90dde5696cda05c9e0dab5cbaa0fea005ace4d11218a02ac668dad6377611ca8565b61058460017f4b6c74f9e688cb39801f2112c14a8c57232a3fc5202e1444126d4bce86eb19ad611ca8565b60335473ffffffffffffffffffffffffffffffffffffffff163314610b3d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610759565b610e26817f65a7ed542fb37fe237fdfbdd70b31598523fe5b32879e307bae27a0bd9581c0855565b6040805173ffffffffffffffffffffffffffffffffffffffff8316602082015260009101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052905060035b60007f1d2b0bda21d56b8bd12d4f94ebacffdfb35f5e226f84b461103bb8beab6353be83604051610eae9190611bf4565b60405180910390a35050565b600054610100900460ff16610f51576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610759565b610b3d6117ba565b6067819055604080516020808201849052825180830390910181529082019091526000610e7d565b606582905560668190556040805160208101849052908101829052600090606001604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190529050600160007f1d2b0bda21d56b8bd12d4f94ebacffdfb35f5e226f84b461103bb8beab6353be836040516110059190611bf4565b60405180910390a3505050565b61101a610659565b67ffffffffffffffff168167ffffffffffffffff161015611097576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f53797374656d436f6e6669673a20676173206c696d697420746f6f206c6f77006044820152606401610759565b606880547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff83169081179091556040805160208082019390935281518082039093018352810190526002610e7d565b606a5415611180576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603860248201527f53797374656d436f6e6669673a2063616e6e6f74206f7665727269646520616e60448201527f20616c72656164792073657420737461727420626c6f636b00000000000000006064820152608401610759565b801561118b57606a55565b43606a5550565b8060a001516fffffffffffffffffffffffffffffffff16816060015163ffffffff161115611242576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f53797374656d436f6e6669673a206d696e206261736520666565206d7573742060448201527f6265206c657373207468616e206d6178206261736500000000000000000000006064820152608401610759565b6001816040015160ff16116112d9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f53797374656d436f6e6669673a2064656e6f6d696e61746f72206d757374206260448201527f65206c6172676572207468616e203100000000000000000000000000000000006064820152608401610759565b6068546080820151825167ffffffffffffffff909216916112fa9190611d61565b63ffffffff161115611368576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f53797374656d436f6e6669673a20676173206c696d697420746f6f206c6f77006044820152606401610759565b6000816020015160ff16116113ff576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f53797374656d436f6e6669673a20656c6173746963697479206d756c7469706c60448201527f6965722063616e6e6f74206265203000000000000000000000000000000000006064820152608401610759565b8051602082015163ffffffff82169160ff9091169061141f908290611daf565b6114299190611dd2565b63ffffffff16146114bc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f53797374656d436f6e6669673a20707265636973696f6e206c6f73732077697460448201527f6820746172676574207265736f75726365206c696d69740000000000000000006064820152608401610759565b805160698054602084015160408501516060860151608087015160a09097015163ffffffff9687167fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000009095169490941764010000000060ff94851602177fffffffffffffffffffffffffffffffffffffffffffff0000000000ffffffffff166501000000000093909216929092027fffffffffffffffffffffffffffffffffffffffffffff00000000ffffffffffff1617660100000000000091851691909102177fffff0000000000000000000000000000000000000000ffffffffffffffffffff166a010000000000000000000093909416929092027fffff00000000000000000000000000000000ffffffffffffffffffffffffffff16929092176e0100000000000000000000000000006fffffffffffffffffffffffffffffffff90921691909102179055565b60608160000361164957505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115611673578061165d81611dfe565b915061166c9050600a83611e36565b915061164d565b60008167ffffffffffffffff81111561168e5761168e6118bd565b6040519080825280601f01601f1916602001820160405280156116b8576020820181803683370190505b5090505b841561173b576116cd600183611ca8565b91506116da600a86611e4a565b6116e5906030611e5e565b60f81b8183815181106116fa576116fa611e76565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350611734600a86611e36565b94506116bc565b949350505050565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600054610100900460ff16611851576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610759565b610b3d33611743565b803573ffffffffffffffffffffffffffffffffffffffff8116811461187e57600080fd5b919050565b60006020828403121561189557600080fd5b61189e8261185a565b9392505050565b803567ffffffffffffffff8116811461187e57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405160c0810167ffffffffffffffff81118282101715611936577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405290565b803563ffffffff8116811461187e57600080fd5b803560ff8116811461187e57600080fd5b600060c0828403121561197357600080fd5b60405160c0810181811067ffffffffffffffff821117156119bd577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040529050806119cc8361193c565b81526119da60208401611950565b60208201526119eb60408401611950565b60408201526119fc6060840161193c565b6060820152611a0d6080840161193c565b608082015260a08301356fffffffffffffffffffffffffffffffff81168114611a3557600080fd5b60a0919091015292915050565b6000806000806000806000806000808a8c03610280811215611a6357600080fd5b611a6c8c61185a565b9a5060208c0135995060408c0135985060608c01359750611a8f60808d016118a5565b9650611a9d60a08d0161185a565b9550611aac8d60c08e01611961565b94506101808c01359350611ac36101a08d0161185a565b925060c07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe4082011215611af557600080fd5b50611afe6118ec565b611b0b6101c08d0161185a565b8152611b1a6101e08d0161185a565b6020820152611b2c6102008d0161185a565b6040820152611b3e6102208d0161185a565b6060820152611b506102408d0161185a565b6080820152611b626102608d0161185a565b60a0820152809150509295989b9194979a5092959850565b60005b83811015611b95578181015183820152602001611b7d565b83811115611ba4576000848401525b50505050565b60008151808452611bc2816020860160208601611b7a565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061189e6020830184611baa565b60008060408385031215611c1a57600080fd5b50508035926020909101359150565b600060208284031215611c3b57600080fd5b61189e826118a5565b600060c08284031215611c5657600080fd5b61189e8383611961565b600060208284031215611c7257600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082821015611cba57611cba611c79565b500390565b600067ffffffffffffffff808316818516808303821115611ce257611ce2611c79565b01949350505050565b60008451611cfd818460208901611b7a565b80830190507f2e000000000000000000000000000000000000000000000000000000000000008082528551611d39816001850160208a01611b7a565b60019201918201528351611d54816002840160208801611b7a565b0160020195945050505050565b600063ffffffff808316818516808303821115611ce257611ce2611c79565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600063ffffffff80841680611dc657611dc6611d80565b92169190910492915050565b600063ffffffff80831681851681830481118215151615611df557611df5611c79565b02949350505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611e2f57611e2f611c79565b5060010190565b600082611e4557611e45611d80565b500490565b600082611e5957611e59611d80565b500690565b60008219821115611e7157611e71611c79565b500190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fdfea164736f6c634300080f000a53797374656d436f6e6669673a20676173206c696d697420746f6f206c6f77001d2b0bda21d56b8bd12d4f94ebacffdfb35f5e226f84b461103bb8beab6353be
496e697469616c697a61626c653a20636f6e7472616374206973206e6f742069"
,
}
}
// SystemConfigABI is the input ABI used to generate the binding from.
// SystemConfigABI is the input ABI used to generate the binding from.
...
...
op-bindings/bindings/systemconfig_more.go
View file @
5f128658
...
@@ -13,7 +13,7 @@ const SystemConfigStorageLayoutJSON = "{\"storage\":[{\"astId\":1000,\"contract\
...
@@ -13,7 +13,7 @@ const SystemConfigStorageLayoutJSON = "{\"storage\":[{\"astId\":1000,\"contract\
var
SystemConfigStorageLayout
=
new
(
solc
.
StorageLayout
)
var
SystemConfigStorageLayout
=
new
(
solc
.
StorageLayout
)
var
SystemConfigDeployedBin
=
"0x608060405234801561001057600080fd5b50600436106102265760003560e01c8063935f029e1161012a578063cc731b02116100bd578063f45e65d81161008c578063f8c68de011610071578063f8c68de014610541578063fd32aa0f14610549578063ffa1ad741461055157600080fd5b8063f45e65d814610524578063f68016b71461052d57600080fd5b8063cc731b02146103cc578063dac6e63a14610500578063e81b2c6d14610508578063f2fde38b1461051157600080fd5b8063bc49ce5f116100f9578063bc49ce5f14610396578063c4e8ddfa1461039e578063c71973f6146103a6578063c9b26f61146103b957600080fd5b8063935f029e146103605780639b7d7f0a14610373578063a71198691461037b578063b40a817c1461038357600080fd5b80634add321d116101bd57806354fd4d501161018c57806361d157681161017157806361d1576814610332578063715018a61461033a5780638da5cb5b1461034257600080fd5b806354fd4d50146103155780635d73369c1461032a57600080fd5b80634add321d146102b25780634d9f1559146102d35780634f16540b146102db5780635228a6ac1461030257600080fd5b806318d13918116101f957806318d139181461028457806319f5cea8146102995780631fd19ee1146102a157806348cd4cb1146102a957600080fd5b806306c926571461022b578063078f29cf146102465780630a49cb03146102735780630c18c1621461027b575b600080fd5b610233610559565b6040519081526020015b60405180910390f35b61024e610587565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161023d565b61024e6105c0565b61023360655481565b6102976102923660046118
9c565b6105f0565b005b6102336106b4565b61024e6106df565b610233606a5481565b6102ba610709565b60405167ffffffffffffffff909116815260200161023d565b61024e61072f565b6102337f65a7ed542fb37fe237fdfbdd70b31598523fe5b32879e307bae27a0bd9581c0881565b610297610310366004611a5b565b61075f565b61031d610b24565b60405161023d9190611c0d565b610233610bc7565b610233610bf2565b610297610c1d565b60335473ffffffffffffffffffffffffffffffffffffffff1661024e565b61029761036e366004611c20565b610c31565b61024e610cca565b61024e610cfa565b610297610391366004611c42565b610d2a565b610233610e10565b61024e610e3b565b6102976103b4366004611c5d565b610e6b565b6102976103c7366004611c79565b610e7f565b6104906040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a0810191909152506040805160c08101825260695463ffffffff8082168352640100000000820460ff9081166020850152650100000000008304169383019390935266010000000000008104831660608301526a0100000000000000000000810490921660808201526e0100000000000000000000000000009091046fffffffffffffffffffffffffffffffff1660a082015290565b60405161023d9190600060c08201905063ffffffff80845116835260ff602085015116602084015260ff6040850151166040840152806060850151166060840152806080850151166080840152506fffffffffffffffffffffffffffffffff60a08401511660a083015292915050565b61024e610eaf565b61023360675481565b61029761051f36600461189c565b610edf565b61023360665481565b6068546102ba9067ffffffffffffffff1681565b610233610f93565b610233610fbe565b610233600081565b61058460017fa04c5bb938ca6fc46d95553abf0a76345ce3e722a30bf4f74928b8e7d852320d611cc1565b81565b60006105bb6105b760017f9904ba90dde5696cda05c9e0dab5cbaa0fea005ace4d11218a02ac668dad6377611cc1565b5490565b905090565b60006105bb6105b760017f4b6c74f9e688cb39801f2112c14a8c57232a3fc5202e1444126d4bce86eb19ad611cc1565b6105f8610fe9565b610620817f65a7ed542fb37fe237fdfbdd70b31598523fe5b32879e307bae27a0bd9581c0855565b6040805173ffffffffffffffffffffffffffffffffffffffff8316602082015260009101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052905060035b60007f1d2b0bda21d56b8bd12d4f94ebacffdfb35f5e226f84b461103bb8beab6353be836040516106a89190611c0d565b60405180910390a35050565b61058460017f46adcbebc6be8ce551740c29c47c8798210f23f7f4086c41752944352568d5a8611cc1565b60006105bb7f65a7ed542fb37fe237fdfbdd70b31598523fe5b32879e307bae27a0bd9581c085490565b6069546000906105bb9063ffffffff6a0100000000000000000000820481169116611cd8565b60006105bb6105b760017fe52a667f71ec761b9b381c7b76ca9b852adf7e8905da0e0ad49986a0a6871816611cc1565b600054600290610100900460ff16158015610781575060005460ff8083169116105b610812576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001660ff83161761010017905561084b61106a565b6108548b610edf565b60658a905560668990556067889055606880547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff89161790557f65a7ed542fb37fe237fdfbdd70b31598523fe5b32879e307bae27a0bd9581c088690556108ed836108ea60017f71ac12829d66ee73d8d95bff50b3589745ce57edae70a3fb111a2342464dc598611cc1565b55565b815161091e906108ea60017f383f291819e6d54073bc9a648251d97421076bdd101933c0c022219ce9580637611cc1565b6020820151610952906108ea60017f46adcbebc6be8ce551740c29c47c8798210f23f7f4086c41752944352568d5a8611cc1565b6040820151610986906108ea60017f9904ba90dde5696cda05c9e0dab5cbaa0fea005ace4d11218a02ac668dad6377611cc1565b60608201516109ba906108ea60017fe52a667f71ec761b9b381c7b76ca9b852adf7e8905da0e0ad49986a0a6871816611cc1565b60808201516109ee906108ea60017f4b6c74f9e688cb39801f2112c14a8c57232a3fc5202e1444126d4bce86eb19ad611cc1565b60a0820151610a22906108ea60017fa04c5bb938ca6fc46d95553abf0a76345ce3e722a30bf4f74928b8e7d852320d611cc1565b610a2b84611109565b610a34856111ab565b610a3c610709565b67ffffffffffffffff168767ffffffffffffffff161015610ab9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f53797374656d436f6e6669673a20676173206c696d697420746f6f206c6f77006044820152606401610809565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16905560405160ff821681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050505050505050505050565b6060610b4f7f000000000000000000000000000000000000000000000000000000000000000061161f565b610b787f000000000000000000000000000000000000000000000000000000000000000061161f565b610ba17f000000000000000000000000000000000000000000000000000000000000000061161f565b604051602001610bb393929190611d04565b604051602081830303815290604052905090565b61058460017f383f291819e6d54073bc9a648251d97421076bdd101933c0c022219ce9580637611cc1565b61058460017fe52a667f71ec761b9b381c7b76ca9b852adf7e8905da0e0ad49986a0a6871816611cc1565b610c25610fe9565b610c2f600061175c565b565b610c39610fe9565b606582905560668190556040805160208101849052908101829052600090606001604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190529050600160007f1d2b0bda21d56b8bd12d4f94ebacffdfb35f5e226f84b461103bb8beab6353be83604051610cbd9190611c0d565b60405180910390a3505050565b60006105bb6105b760017fa04c5bb938ca6fc46d95553abf0a76345ce3e722a30bf4f74928b8e7d852320d611cc1565b60006105bb6105b760017f383f291819e6d54073bc9a648251d97421076bdd101933c0c022219ce9580637611cc1565b610d32610fe9565b610d3a610709565b67ffffffffffffffff168167ffffffffffffffff161015610db7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f53797374656d436f6e6669673a20676173206c696d697420746f6f206c6f77006044820152606401610809565b606880547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff83169081179091556040805160208082019390935281518082039093018352810190526002610677565b61058460017f71ac12829d66ee73d8d95bff50b3589745ce57edae70a3fb111a2342464dc598611cc1565b60006105bb6105b760017f46adcbebc6be8ce551740c29c47c8798210f23f7f4086c41752944352568d5a8611cc1565b610e73610fe9565b610e7c816111ab565b50565b610e87610fe9565b6067819055604080516020808201849052825180830390910181529082019091526000610677565b60006105bb6105b760017f71ac12829d66ee73d8d95bff50b3589745ce57edae70a3fb111a2342464dc598611cc1565b610ee7610fe9565b73ffffffffffffffffffffffffffffffffffffffff8116610f8a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610809565b610e7c8161175c565b61058460017f9904ba90dde5696cda05c9e0dab5cbaa0fea005ace4d11218a02ac668dad6377611cc1565b61058460017f4b6c74f9e688cb39801f2112c14a8c57232a3fc5202e1444126d4bce86eb19ad611cc1565b60335473ffffffffffffffffffffffffffffffffffffffff163314610c2f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610809565b600054610100900460ff16611101576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610809565b610c2f6117d3565b606a5415611199576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603860248201527f53797374656d436f6e6669673a2063616e6e6f74206f7665727269646520616e60448201527f20616c72656164792073657420737461727420626c6f636b00000000000000006064820152608401610809565b80156111a457606a55565b43606a5550565b8060a001516fffffffffffffffffffffffffffffffff16816060015163ffffffff16111561125b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f53797374656d436f6e6669673a206d696e206261736520666565206d7573742060448201527f6265206c657373207468616e206d6178206261736500000000000000000000006064820152608401610809565b6001816040015160ff16116112f2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f53797374656d436f6e6669673a2064656e6f6d696e61746f72206d757374206260448201527f65206c6172676572207468616e203100000000000000000000000000000000006064820152608401610809565b6068546080820151825167ffffffffffffffff909216916113139190611d7a565b63ffffffff161115611381576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f53797374656d436f6e6669673a20676173206c696d697420746f6f206c6f77006044820152606401610809565b6000816020015160ff1611611418576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f53797374656d436f6e6669673a20656c6173746963697479206d756c7469706c60448201527f6965722063616e6e6f74206265203000000000000000000000000000000000006064820152608401610809565b8051602082015163ffffffff82169160ff90911690611438908290611dc8565b6114429190611deb565b63ffffffff16146114d5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f53797374656d436f6e6669673a20707265636973696f6e206c6f73732077697460448201527f6820746172676574207265736f75726365206c696d69740000000000000000006064820152608401610809565b805160698054602084015160408501516060860151608087015160a09097015163ffffffff9687167fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000009095169490941764010000000060ff94851602177fffffffffffffffffffffffffffffffffffffffffffff0000000000ffffffffff166501000000000093909216929092027fffffffffffffffffffffffffffffffffffffffffffff00000000ffffffffffff1617660100000000000091851691909102177fffff0000000000000000000000000000000000000000ffffffffffffffffffff166a010000000000000000000093909416929092027fffff00000000000000000000000000000000ffffffffffffffffffffffffffff16929092176e0100000000000000000000000000006fffffffffffffffffffffffffffffffff90921691909102179055565b60608160000361166257505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b811561168c578061167681611e17565b91506116859050600a83611e4f565b9150611666565b60008167ffffffffffffffff8111156116a7576116a76118d6565b6040519080825280601f01601f1916602001820160405280156116d1576020820181803683370190505b5090505b8415611754576116e6600183611cc1565b91506116f3600a86611e63565b6116fe906030611e77565b60f81b81838151811061171357611713611e8f565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535061174d600a86611e4f565b94506116d5565b949350505050565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600054610100900460ff1661186a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610809565b610c2f3361175c565b803573ffffffffffffffffffffffffffffffffffffffff8116811461189757600080fd5b919050565b6000602082840312156118ae57600080fd5b6118b782611873565b9392505050565b803567ffffffffffffffff8116811461189757600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405160c0810167ffffffffffffffff8111828210171561194f577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405290565b803563ffffffff8116811461189757600080fd5b803560ff8116811461189757600080fd5b600060c0828403121561198c57600080fd5b60405160c0810181811067ffffffffffffffff821117156119d6577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040529050806119e583611955565b81526119f360208401611969565b6020820152611a0460408401611969565b6040820152611a1560608401611955565b6060820152611a2660808401611955565b608082015260a08301356fffffffffffffffffffffffffffffffff81168114611a4e57600080fd5b60a0919091015292915050565b6000806000806000806000806000808a8c03610280811215611a7c57600080fd5b611a858c611873565b9a5060208c0135995060408c0135985060608c01359750611aa860808d016118be565b9650611ab660a08d01611873565b9550611ac58d60c08e0161197a565b94506101808c01359350611adc6101a08d01611873565b925060c07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe4082011215611b0e57600080fd5b50611b17611905565b611b246101c08d01611873565b8152611b336101e08d01611873565b6020820152611b456102008d01611873565b6040820152611b576102208d01611873565b6060820152611b696102408d01611873565b6080820152611b7b6102608d01611873565b60a0820152809150509295989b9194979a5092959850565b60005b83811015611bae578181015183820152602001611b96565b83811115611bbd576000848401525b50505050565b60008151808452611bdb816020860160208601611b93565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006118b76020830184611bc3565b60008060408385031215611c3357600080fd5b50508035926020909101359150565b600060208284031215611c5457600080fd5b6118b7826118be565b600060c08284031215611c6f57600080fd5b6118b7838361197a565b600060208284031215611c8b57600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082821015611cd357611cd3611c92565b500390565b600067ffffffffffffffff808316818516808303821115611cfb57611cfb611c92565b01949350505050565b60008451611d16818460208901611b93565b80830190507f2e000000000000000000000000000000000000000000000000000000000000008082528551611d52816001850160208a01611b93565b60019201918201528351611d6d816002840160208801611b93565b0160020195945050505050565b600063ffffffff808316818516808303821115611cfb57611cfb611c92565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600063ffffffff80841680611ddf57611ddf611d99565b92169190910492915050565b600063ffffffff80831681851681830481118215151615611e0e57611e0e611c92565b02949350505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611e4857611e48611c92565b5060010190565b600082611e5e57611e5e611d99565b500490565b600082611e7257611e72611d99565b500690565b60008219821115611e8a57611e8a611c92
565b500190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fdfea164736f6c634300080f000a"
var
SystemConfigDeployedBin
=
"0x608060405234801561001057600080fd5b50600436106102265760003560e01c8063935f029e1161012a578063cc731b02116100bd578063f45e65d81161008c578063f8c68de011610071578063f8c68de014610541578063fd32aa0f14610549578063ffa1ad741461055157600080fd5b8063f45e65d814610524578063f68016b71461052d57600080fd5b8063cc731b02146103cc578063dac6e63a14610500578063e81b2c6d14610508578063f2fde38b1461051157600080fd5b8063bc49ce5f116100f9578063bc49ce5f14610396578063c4e8ddfa1461039e578063c71973f6146103a6578063c9b26f61146103b957600080fd5b8063935f029e146103605780639b7d7f0a14610373578063a71198691461037b578063b40a817c1461038357600080fd5b80634add321d116101bd57806354fd4d501161018c57806361d157681161017157806361d1576814610332578063715018a61461033a5780638da5cb5b1461034257600080fd5b806354fd4d50146103155780635d73369c1461032a57600080fd5b80634add321d146102b25780634d9f1559146102d35780634f16540b146102db5780635228a6ac1461030257600080fd5b806318d13918116101f957806318d139181461028457806319f5cea8146102995780631fd19ee1146102a157806348cd4cb1146102a957600080fd5b806306c926571461022b578063078f29cf146102465780630a49cb03146102735780630c18c1621461027b575b600080fd5b610233610559565b6040519081526020015b60405180910390f35b61024e610587565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161023d565b61024e6105c0565b61023360655481565b6102976102923660046118
83565b6105f0565b005b610233610604565b61024e61062f565b610233606a5481565b6102ba610659565b60405167ffffffffffffffff909116815260200161023d565b61024e61067f565b6102337f65a7ed542fb37fe237fdfbdd70b31598523fe5b32879e307bae27a0bd9581c0881565b610297610310366004611a42565b6106af565b61031d610a32565b60405161023d9190611bf4565b610233610ad5565b610233610b00565b610297610b2b565b60335473ffffffffffffffffffffffffffffffffffffffff1661024e565b61029761036e366004611c07565b610b3f565b61024e610b55565b61024e610b85565b610297610391366004611c29565b610bb5565b610233610bc6565b61024e610bf1565b6102976103b4366004611c44565b610c21565b6102976103c7366004611c60565b610c32565b6104906040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a0810191909152506040805160c08101825260695463ffffffff8082168352640100000000820460ff9081166020850152650100000000008304169383019390935266010000000000008104831660608301526a0100000000000000000000810490921660808201526e0100000000000000000000000000009091046fffffffffffffffffffffffffffffffff1660a082015290565b60405161023d9190600060c08201905063ffffffff80845116835260ff602085015116602084015260ff6040850151166040840152806060850151166060840152806080850151166080840152506fffffffffffffffffffffffffffffffff60a08401511660a083015292915050565b61024e610c43565b61023360675481565b61029761051f366004611883565b610c73565b61023360665481565b6068546102ba9067ffffffffffffffff1681565b610233610d27565b610233610d52565b610233600081565b61058460017fa04c5bb938ca6fc46d95553abf0a76345ce3e722a30bf4f74928b8e7d852320d611ca8565b81565b60006105bb6105b760017f9904ba90dde5696cda05c9e0dab5cbaa0fea005ace4d11218a02ac668dad6377611ca8565b5490565b905090565b60006105bb6105b760017f4b6c74f9e688cb39801f2112c14a8c57232a3fc5202e1444126d4bce86eb19ad611ca8565b6105f8610d7d565b61060181610dfe565b50565b61058460017f46adcbebc6be8ce551740c29c47c8798210f23f7f4086c41752944352568d5a8611ca8565b60006105bb7f65a7ed542fb37fe237fdfbdd70b31598523fe5b32879e307bae27a0bd9581c085490565b6069546000906105bb9063ffffffff6a0100000000000000000000820481169116611cbf565b60006105bb6105b760017fe52a667f71ec761b9b381c7b76ca9b852adf7e8905da0e0ad49986a0a6871816611ca8565b600054600290610100900460ff161580156106d1575060005460ff8083169116105b610762576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001660ff83161761010017905561079b610eba565b6107a48b610c73565b6107ad88610f59565b6107b78a8a610f81565b6107c087611012565b6107c986610dfe565b6107fb836107f860017f71ac12829d66ee73d8d95bff50b3589745ce57edae70a3fb111a2342464dc598611ca8565b55565b815161082c906107f860017f383f291819e6d54073bc9a648251d97421076bdd101933c0c022219ce9580637611ca8565b6020820151610860906107f860017f46adcbebc6be8ce551740c29c47c8798210f23f7f4086c41752944352568d5a8611ca8565b6040820151610894906107f860017f9904ba90dde5696cda05c9e0dab5cbaa0fea005ace4d11218a02ac668dad6377611ca8565b60608201516108c8906107f860017fe52a667f71ec761b9b381c7b76ca9b852adf7e8905da0e0ad49986a0a6871816611ca8565b60808201516108fc906107f860017f4b6c74f9e688cb39801f2112c14a8c57232a3fc5202e1444126d4bce86eb19ad611ca8565b60a0820151610930906107f860017fa04c5bb938ca6fc46d95553abf0a76345ce3e722a30bf4f74928b8e7d852320d611ca8565b610939846110f0565b61094285611192565b61094a610659565b67ffffffffffffffff168767ffffffffffffffff1610156109c7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f53797374656d436f6e6669673a20676173206c696d697420746f6f206c6f77006044820152606401610759565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16905560405160ff821681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050505050505050505050565b6060610a5d7f0000000000000000000000000000000000000000000000000000000000000000611606565b610a867f0000000000000000000000000000000000000000000000000000000000000000611606565b610aaf7f0000000000000000000000000000000000000000000000000000000000000000611606565b604051602001610ac193929190611ceb565b604051602081830303815290604052905090565b61058460017f383f291819e6d54073bc9a648251d97421076bdd101933c0c022219ce9580637611ca8565b61058460017fe52a667f71ec761b9b381c7b76ca9b852adf7e8905da0e0ad49986a0a6871816611ca8565b610b33610d7d565b610b3d6000611743565b565b610b47610d7d565b610b518282610f81565b5050565b60006105bb6105b760017fa04c5bb938ca6fc46d95553abf0a76345ce3e722a30bf4f74928b8e7d852320d611ca8565b60006105bb6105b760017f383f291819e6d54073bc9a648251d97421076bdd101933c0c022219ce9580637611ca8565b610bbd610d7d565b61060181611012565b61058460017f71ac12829d66ee73d8d95bff50b3589745ce57edae70a3fb111a2342464dc598611ca8565b60006105bb6105b760017f46adcbebc6be8ce551740c29c47c8798210f23f7f4086c41752944352568d5a8611ca8565b610c29610d7d565b61060181611192565b610c3a610d7d565b61060181610f59565b60006105bb6105b760017f71ac12829d66ee73d8d95bff50b3589745ce57edae70a3fb111a2342464dc598611ca8565b610c7b610d7d565b73ffffffffffffffffffffffffffffffffffffffff8116610d1e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610759565b61060181611743565b61058460017f9904ba90dde5696cda05c9e0dab5cbaa0fea005ace4d11218a02ac668dad6377611ca8565b61058460017f4b6c74f9e688cb39801f2112c14a8c57232a3fc5202e1444126d4bce86eb19ad611ca8565b60335473ffffffffffffffffffffffffffffffffffffffff163314610b3d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610759565b610e26817f65a7ed542fb37fe237fdfbdd70b31598523fe5b32879e307bae27a0bd9581c0855565b6040805173ffffffffffffffffffffffffffffffffffffffff8316602082015260009101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052905060035b60007f1d2b0bda21d56b8bd12d4f94ebacffdfb35f5e226f84b461103bb8beab6353be83604051610eae9190611bf4565b60405180910390a35050565b600054610100900460ff16610f51576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610759565b610b3d6117ba565b6067819055604080516020808201849052825180830390910181529082019091526000610e7d565b606582905560668190556040805160208101849052908101829052600090606001604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190529050600160007f1d2b0bda21d56b8bd12d4f94ebacffdfb35f5e226f84b461103bb8beab6353be836040516110059190611bf4565b60405180910390a3505050565b61101a610659565b67ffffffffffffffff168167ffffffffffffffff161015611097576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f53797374656d436f6e6669673a20676173206c696d697420746f6f206c6f77006044820152606401610759565b606880547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff83169081179091556040805160208082019390935281518082039093018352810190526002610e7d565b606a5415611180576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603860248201527f53797374656d436f6e6669673a2063616e6e6f74206f7665727269646520616e60448201527f20616c72656164792073657420737461727420626c6f636b00000000000000006064820152608401610759565b801561118b57606a55565b43606a5550565b8060a001516fffffffffffffffffffffffffffffffff16816060015163ffffffff161115611242576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f53797374656d436f6e6669673a206d696e206261736520666565206d7573742060448201527f6265206c657373207468616e206d6178206261736500000000000000000000006064820152608401610759565b6001816040015160ff16116112d9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f53797374656d436f6e6669673a2064656e6f6d696e61746f72206d757374206260448201527f65206c6172676572207468616e203100000000000000000000000000000000006064820152608401610759565b6068546080820151825167ffffffffffffffff909216916112fa9190611d61565b63ffffffff161115611368576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f53797374656d436f6e6669673a20676173206c696d697420746f6f206c6f77006044820152606401610759565b6000816020015160ff16116113ff576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f53797374656d436f6e6669673a20656c6173746963697479206d756c7469706c60448201527f6965722063616e6e6f74206265203000000000000000000000000000000000006064820152608401610759565b8051602082015163ffffffff82169160ff9091169061141f908290611daf565b6114299190611dd2565b63ffffffff16146114bc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f53797374656d436f6e6669673a20707265636973696f6e206c6f73732077697460448201527f6820746172676574207265736f75726365206c696d69740000000000000000006064820152608401610759565b805160698054602084015160408501516060860151608087015160a09097015163ffffffff9687167fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000009095169490941764010000000060ff94851602177fffffffffffffffffffffffffffffffffffffffffffff0000000000ffffffffff166501000000000093909216929092027fffffffffffffffffffffffffffffffffffffffffffff00000000ffffffffffff1617660100000000000091851691909102177fffff0000000000000000000000000000000000000000ffffffffffffffffffff166a010000000000000000000093909416929092027fffff00000000000000000000000000000000ffffffffffffffffffffffffffff16929092176e0100000000000000000000000000006fffffffffffffffffffffffffffffffff90921691909102179055565b60608160000361164957505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115611673578061165d81611dfe565b915061166c9050600a83611e36565b915061164d565b60008167ffffffffffffffff81111561168e5761168e6118bd565b6040519080825280601f01601f1916602001820160405280156116b8576020820181803683370190505b5090505b841561173b576116cd600183611ca8565b91506116da600a86611e4a565b6116e5906030611e5e565b60f81b8183815181106116fa576116fa611e76565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350611734600a86611e36565b94506116bc565b949350505050565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600054610100900460ff16611851576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610759565b610b3d33611743565b803573ffffffffffffffffffffffffffffffffffffffff8116811461187e57600080fd5b919050565b60006020828403121561189557600080fd5b61189e8261185a565b9392505050565b803567ffffffffffffffff8116811461187e57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405160c0810167ffffffffffffffff81118282101715611936577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405290565b803563ffffffff8116811461187e57600080fd5b803560ff8116811461187e57600080fd5b600060c0828403121561197357600080fd5b60405160c0810181811067ffffffffffffffff821117156119bd577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040529050806119cc8361193c565b81526119da60208401611950565b60208201526119eb60408401611950565b60408201526119fc6060840161193c565b6060820152611a0d6080840161193c565b608082015260a08301356fffffffffffffffffffffffffffffffff81168114611a3557600080fd5b60a0919091015292915050565b6000806000806000806000806000808a8c03610280811215611a6357600080fd5b611a6c8c61185a565b9a5060208c0135995060408c0135985060608c01359750611a8f60808d016118a5565b9650611a9d60a08d0161185a565b9550611aac8d60c08e01611961565b94506101808c01359350611ac36101a08d0161185a565b925060c07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe4082011215611af557600080fd5b50611afe6118ec565b611b0b6101c08d0161185a565b8152611b1a6101e08d0161185a565b6020820152611b2c6102008d0161185a565b6040820152611b3e6102208d0161185a565b6060820152611b506102408d0161185a565b6080820152611b626102608d0161185a565b60a0820152809150509295989b9194979a5092959850565b60005b83811015611b95578181015183820152602001611b7d565b83811115611ba4576000848401525b50505050565b60008151808452611bc2816020860160208601611b7a565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061189e6020830184611baa565b60008060408385031215611c1a57600080fd5b50508035926020909101359150565b600060208284031215611c3b57600080fd5b61189e826118a5565b600060c08284031215611c5657600080fd5b61189e8383611961565b600060208284031215611c7257600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082821015611cba57611cba611c79565b500390565b600067ffffffffffffffff808316818516808303821115611ce257611ce2611c79565b01949350505050565b60008451611cfd818460208901611b7a565b80830190507f2e000000000000000000000000000000000000000000000000000000000000008082528551611d39816001850160208a01611b7a565b60019201918201528351611d54816002840160208801611b7a565b0160020195945050505050565b600063ffffffff808316818516808303821115611ce257611ce2611c79565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600063ffffffff80841680611dc657611dc6611d80565b92169190910492915050565b600063ffffffff80831681851681830481118215151615611df557611df5611c79565b02949350505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611e2f57611e2f611c79565b5060010190565b600082611e4557611e45611d80565b500490565b600082611e5957611e59611d80565b500690565b60008219821115611e7157611e71611c79
565b500190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fdfea164736f6c634300080f000a"
func
init
()
{
func
init
()
{
if
err
:=
json
.
Unmarshal
([]
byte
(
SystemConfigStorageLayoutJSON
),
SystemConfigStorageLayout
);
err
!=
nil
{
if
err
:=
json
.
Unmarshal
([]
byte
(
SystemConfigStorageLayoutJSON
),
SystemConfigStorageLayout
);
err
!=
nil
{
...
...
packages/contracts-bedrock/.gas-snapshot
View file @
5f128658
...
@@ -643,10 +643,11 @@ SequencerFeeVault_Test:test_withdraw_toL1_succeeds() (gas: 171357)
...
@@ -643,10 +643,11 @@ SequencerFeeVault_Test:test_withdraw_toL1_succeeds() (gas: 171357)
SetPrevBaseFee_Test:test_setPrevBaseFee_succeeds() (gas: 11549)
SetPrevBaseFee_Test:test_setPrevBaseFee_succeeds() (gas: 11549)
StandardBridge_Stateless_Test:test_isCorrectTokenPair_succeeds() (gas: 49936)
StandardBridge_Stateless_Test:test_isCorrectTokenPair_succeeds() (gas: 49936)
StandardBridge_Stateless_Test:test_isOptimismMintableERC20_succeeds() (gas: 33072)
StandardBridge_Stateless_Test:test_isOptimismMintableERC20_succeeds() (gas: 33072)
SystemConfig_Initialize_Test:test_initialize_startBlockOverride_succeeds() (gas: 55905)
SystemConfig_Initialize_Test:test_initialize_events_succeeds() (gas: 72059)
SystemConfig_Initialize_Test:test_initialize_startBlockOverride_succeeds() (gas: 65240)
SystemConfig_Initialize_Test:test_initialize_values_succeeds() (gas: 64946)
SystemConfig_Initialize_Test:test_initialize_values_succeeds() (gas: 64946)
SystemConfig_Initialize_TestFail:test_initialize_lowGasLimit_reverts() (gas:
94515
)
SystemConfig_Initialize_TestFail:test_initialize_lowGasLimit_reverts() (gas:
55653
)
SystemConfig_Initialize_TestFail:test_initialize_startBlock_reverts() (gas:
64676
)
SystemConfig_Initialize_TestFail:test_initialize_startBlock_reverts() (gas:
78350
)
SystemConfig_Setters_TestFail:test_setBatcherHash_notOwner_reverts() (gas: 15607)
SystemConfig_Setters_TestFail:test_setBatcherHash_notOwner_reverts() (gas: 15607)
SystemConfig_Setters_TestFail:test_setGasConfig_notOwner_reverts() (gas: 15577)
SystemConfig_Setters_TestFail:test_setGasConfig_notOwner_reverts() (gas: 15577)
SystemConfig_Setters_TestFail:test_setGasLimit_notOwner_reverts() (gas: 15676)
SystemConfig_Setters_TestFail:test_setGasLimit_notOwner_reverts() (gas: 15676)
...
...
packages/contracts-bedrock/deployments/goerli/SystemConfig.json
View file @
5f128658
This source diff could not be displayed because it is too large. You can
view the blob
instead.
packages/contracts-bedrock/package.json
View file @
5f128658
...
@@ -16,7 +16,7 @@
...
@@ -16,7 +16,7 @@
"prebuild"
:
"./scripts/verify-foundry-install.sh"
,
"prebuild"
:
"./scripts/verify-foundry-install.sh"
,
"build:differential"
:
"go build -o ./scripts/differential-testing/differential-testing ./scripts/differential-testing"
,
"build:differential"
:
"go build -o ./scripts/differential-testing/differential-testing ./scripts/differential-testing"
,
"build:fuzz"
:
"(cd test-case-generator && go build ./cmd/fuzz.go)"
,
"build:fuzz"
:
"(cd test-case-generator && go build ./cmd/fuzz.go)"
,
"autogen:invariant-docs"
:
"tsx scripts/invariant-doc-gen.ts"
,
"autogen:invariant-docs"
:
"
npx
tsx scripts/invariant-doc-gen.ts"
,
"test"
:
"pnpm build:differential && pnpm build:fuzz && forge test"
,
"test"
:
"pnpm build:differential && pnpm build:fuzz && forge test"
,
"coverage"
:
"pnpm build:differential && pnpm build:fuzz && forge coverage"
,
"coverage"
:
"pnpm build:differential && pnpm build:fuzz && forge coverage"
,
"coverage:lcov"
:
"pnpm build:differential && pnpm build:fuzz && forge coverage --report lcov"
,
"coverage:lcov"
:
"pnpm build:differential && pnpm build:fuzz && forge coverage --report lcov"
,
...
@@ -32,7 +32,7 @@
...
@@ -32,7 +32,7 @@
"pre-pr"
:
"pnpm clean && pnpm gas-snapshot && pnpm storage-snapshot && pnpm semver-lock && pnpm autogen:invariant-docs && pnpm lint && (cd ../../op-bindings && make)"
,
"pre-pr"
:
"pnpm clean && pnpm gas-snapshot && pnpm storage-snapshot && pnpm semver-lock && pnpm autogen:invariant-docs && pnpm lint && (cd ../../op-bindings && make)"
,
"pre-pr:full"
:
"pnpm test && pnpm slither && pnpm validate-deploy-configs && pnpm validate-spacers && pnpm pre-pr"
,
"pre-pr:full"
:
"pnpm test && pnpm slither && pnpm validate-deploy-configs && pnpm validate-spacers && pnpm pre-pr"
,
"lint:ts:check"
:
"eslint . --max-warnings=0"
,
"lint:ts:check"
:
"eslint . --max-warnings=0"
,
"lint:forge-tests:check"
:
"tsx scripts/forge-test-names.ts"
,
"lint:forge-tests:check"
:
"
npx
tsx scripts/forge-test-names.ts"
,
"lint:contracts:check"
:
"pnpm lint:fix && git diff --exit-code"
,
"lint:contracts:check"
:
"pnpm lint:fix && git diff --exit-code"
,
"lint:check"
:
"pnpm lint:contracts:check && pnpm lint:ts:check"
,
"lint:check"
:
"pnpm lint:contracts:check && pnpm lint:ts:check"
,
"lint:ts:fix"
:
"eslint --fix ."
,
"lint:ts:fix"
:
"eslint --fix ."
,
...
...
packages/contracts-bedrock/scripts/upgrades/Multichain.s.sol
View file @
5f128658
...
@@ -71,7 +71,7 @@ contract Multichain is SafeBuilder {
...
@@ -71,7 +71,7 @@ contract Multichain is SafeBuilder {
/// @notice OptimismPortal implementation to upgrade to
/// @notice OptimismPortal implementation to upgrade to
address internal constant OptimismPortalImplementation = 0x345D27c7B6C90fef5beA9631037C36119f4bF93e;
address internal constant OptimismPortalImplementation = 0x345D27c7B6C90fef5beA9631037C36119f4bF93e;
/// @notice SystemConfig implementation to upgrade to
/// @notice SystemConfig implementation to upgrade to
address internal constant SystemConfigImplementation = 0x
00CB689221540dEd0FA5247dbE7Fc66621F431a6
;
address internal constant SystemConfigImplementation = 0x
543bA4AADBAb8f9025686Bd03993043599c6fB04
;
/// @notice L1ERC721Bridge implementation to upgrade to
/// @notice L1ERC721Bridge implementation to upgrade to
address internal constant L1ERC721BridgeImplementation = 0x53C115eD8D9902f4999fDBd8B93Ea79BF37cb588;
address internal constant L1ERC721BridgeImplementation = 0x53C115eD8D9902f4999fDBd8B93Ea79BF37cb588;
...
@@ -84,7 +84,7 @@ contract Multichain is SafeBuilder {
...
@@ -84,7 +84,7 @@ contract Multichain is SafeBuilder {
string internal constant L2OutputOracleVersion = "1.4.1";
string internal constant L2OutputOracleVersion = "1.4.1";
string internal constant OptimismMintableERC20FactoryVersion = "1.1.2";
string internal constant OptimismMintableERC20FactoryVersion = "1.1.2";
string internal constant OptimismPortalVersion = "1.8.1";
string internal constant OptimismPortalVersion = "1.8.1";
string internal constant SystemConfigVersion = "1.
5
.0";
string internal constant SystemConfigVersion = "1.
6
.0";
string internal constant L1ERC721BridgeVersion = "1.2.1";
string internal constant L1ERC721BridgeVersion = "1.2.1";
/// @notice The value of the NETWORK env var
/// @notice The value of the NETWORK env var
...
...
packages/contracts-bedrock/semver-lock.json
View file @
5f128658
...
@@ -6,7 +6,7 @@
...
@@ -6,7 +6,7 @@
"src/L1/L1StandardBridge.sol"
:
"0xbd7b303cefe46bc14bf1a2b81e5702ff45ce9c5257524e59778e11c75f7f5bdc"
,
"src/L1/L1StandardBridge.sol"
:
"0xbd7b303cefe46bc14bf1a2b81e5702ff45ce9c5257524e59778e11c75f7f5bdc"
,
"src/L1/L2OutputOracle.sol"
:
"0x05ea17a834563ffa50cade81189b120b6f0805ba316d6a9893c8cf8b231e57e3"
,
"src/L1/L2OutputOracle.sol"
:
"0x05ea17a834563ffa50cade81189b120b6f0805ba316d6a9893c8cf8b231e57e3"
,
"src/L1/OptimismPortal.sol"
:
"0xeefcc16d30e14ed7ce9970f3aeaf1d5668324b3fc1ddb4790da5804cfdd78980"
,
"src/L1/OptimismPortal.sol"
:
"0xeefcc16d30e14ed7ce9970f3aeaf1d5668324b3fc1ddb4790da5804cfdd78980"
,
"src/L1/SystemConfig.sol"
:
"0x
29beec0a03b9602a53e3ceaec2354972d917f8b80f1b3a8f03f4fb7a67753fce
"
,
"src/L1/SystemConfig.sol"
:
"0x
d5904b53153f2e32be28f2ce1ea51374b19fdf4f478f486f02cf67d8b62b7c29
"
,
"src/L2/BaseFeeVault.sol"
:
"0xd8df28898799b80c370e77e9aad09f79235dfda2bf13e56daf21997cfe54200d"
,
"src/L2/BaseFeeVault.sol"
:
"0xd8df28898799b80c370e77e9aad09f79235dfda2bf13e56daf21997cfe54200d"
,
"src/L2/GasPriceOracle.sol"
:
"0xb7d8c4f3ea8db31900125e341aae42a862a2b7d3f1c1aa60c97dc2d0e022b7ba"
,
"src/L2/GasPriceOracle.sol"
:
"0xb7d8c4f3ea8db31900125e341aae42a862a2b7d3f1c1aa60c97dc2d0e022b7ba"
,
"src/L2/L1Block.sol"
:
"0x38ea78a9611656a60ae4d58db75e96413a638e3ccb2e935052441f98a1fd3105"
,
"src/L2/L1Block.sol"
:
"0x38ea78a9611656a60ae4d58db75e96413a638e3ccb2e935052441f98a1fd3105"
,
...
...
packages/contracts-bedrock/src/L1/SystemConfig.sol
View file @
5f128658
...
@@ -98,11 +98,11 @@ contract SystemConfig is OwnableUpgradeable, Semver {
...
@@ -98,11 +98,11 @@ contract SystemConfig is OwnableUpgradeable, Semver {
/// @notice The block at which the op-node can start searching for logs from.
/// @notice The block at which the op-node can start searching for logs from.
uint256 public startBlock;
uint256 public startBlock;
/// @custom:semver 1.
5
.0
/// @custom:semver 1.
6
.0
/// @notice Constructs the SystemConfig contract. Cannot set
/// @notice Constructs the SystemConfig contract. Cannot set
/// the owner to `address(0)` due to the Ownable contract's
/// the owner to `address(0)` due to the Ownable contract's
/// implementation, so set it to `address(0xdEaD)`
/// implementation, so set it to `address(0xdEaD)`
constructor() Semver(1,
5
, 0) {
constructor() Semver(1,
6
, 0) {
initialize({
initialize({
_owner: address(0xdEaD),
_owner: address(0xdEaD),
_overhead: 0,
_overhead: 0,
...
@@ -165,12 +165,12 @@ contract SystemConfig is OwnableUpgradeable, Semver {
...
@@ -165,12 +165,12 @@ contract SystemConfig is OwnableUpgradeable, Semver {
__Ownable_init();
__Ownable_init();
transferOwnership(_owner);
transferOwnership(_owner);
overhead = _overhead;
// These are set in ascending order of their UpdateTypes.
scalar = _scalar;
_setBatcherHash(_batcherHash);
batcherHash = _batcherHash;
_setGasConfig({ _overhead: _overhead, _scalar: _scalar });
gasLimit = _gasLimit;
_setGasLimit(_gasLimit);
_setUnsafeBlockSigner(_unsafeBlockSigner);
_setAddress(_unsafeBlockSigner, UNSAFE_BLOCK_SIGNER_SLOT);
_setAddress(_batchInbox, BATCH_INBOX_SLOT);
_setAddress(_batchInbox, BATCH_INBOX_SLOT);
_setAddress(_addresses.l1CrossDomainMessenger, L1_CROSS_DOMAIN_MESSENGER_SLOT);
_setAddress(_addresses.l1CrossDomainMessenger, L1_CROSS_DOMAIN_MESSENGER_SLOT);
_setAddress(_addresses.l1ERC721Bridge, L1_ERC_721_BRIDGE_SLOT);
_setAddress(_addresses.l1ERC721Bridge, L1_ERC_721_BRIDGE_SLOT);
...
@@ -282,28 +282,47 @@ contract SystemConfig is OwnableUpgradeable, Semver {
...
@@ -282,28 +282,47 @@ contract SystemConfig is OwnableUpgradeable, Semver {
}
}
}
}
/// @notice Updates the unsafe block signer address.
/// @notice Updates the unsafe block signer address.
Can only be called by the owner.
/// @param _unsafeBlockSigner New unsafe block signer address.
/// @param _unsafeBlockSigner New unsafe block signer address.
function setUnsafeBlockSigner(address _unsafeBlockSigner) external onlyOwner {
function setUnsafeBlockSigner(address _unsafeBlockSigner) external onlyOwner {
_setUnsafeBlockSigner(_unsafeBlockSigner);
}
/// @notice Updates the unsafe block signer address.
/// @param _unsafeBlockSigner New unsafe block signer address.
function _setUnsafeBlockSigner(address _unsafeBlockSigner) internal {
_setAddress(_unsafeBlockSigner, UNSAFE_BLOCK_SIGNER_SLOT);
_setAddress(_unsafeBlockSigner, UNSAFE_BLOCK_SIGNER_SLOT);
bytes memory data = abi.encode(_unsafeBlockSigner);
bytes memory data = abi.encode(_unsafeBlockSigner);
emit ConfigUpdate(VERSION, UpdateType.UNSAFE_BLOCK_SIGNER, data);
emit ConfigUpdate(VERSION, UpdateType.UNSAFE_BLOCK_SIGNER, data);
}
}
/// @notice Updates the batcher hash.
/// @notice Updates the batcher hash.
Can only be called by the owner.
/// @param _batcherHash New batcher hash.
/// @param _batcherHash New batcher hash.
function setBatcherHash(bytes32 _batcherHash) external onlyOwner {
function setBatcherHash(bytes32 _batcherHash) external onlyOwner {
_setBatcherHash(_batcherHash);
}
/// @notice Internal function for updating the batcher hash.
/// @param _batcherHash New batcher hash.
function _setBatcherHash(bytes32 _batcherHash) internal {
batcherHash = _batcherHash;
batcherHash = _batcherHash;
bytes memory data = abi.encode(_batcherHash);
bytes memory data = abi.encode(_batcherHash);
emit ConfigUpdate(VERSION, UpdateType.BATCHER, data);
emit ConfigUpdate(VERSION, UpdateType.BATCHER, data);
}
}
/// @notice Updates gas config.
/// @notice Updates gas config.
Can only be called by the owner.
/// @param _overhead New overhead value.
/// @param _overhead New overhead value.
/// @param _scalar New scalar value.
/// @param _scalar New scalar value.
function setGasConfig(uint256 _overhead, uint256 _scalar) external onlyOwner {
function setGasConfig(uint256 _overhead, uint256 _scalar) external onlyOwner {
_setGasConfig(_overhead, _scalar);
}
/// @notice Internal function for updating the gas config.
/// @param _overhead New overhead value.
/// @param _scalar New scalar value.
function _setGasConfig(uint256 _overhead, uint256 _scalar) internal {
overhead = _overhead;
overhead = _overhead;
scalar = _scalar;
scalar = _scalar;
...
@@ -311,9 +330,15 @@ contract SystemConfig is OwnableUpgradeable, Semver {
...
@@ -311,9 +330,15 @@ contract SystemConfig is OwnableUpgradeable, Semver {
emit ConfigUpdate(VERSION, UpdateType.GAS_CONFIG, data);
emit ConfigUpdate(VERSION, UpdateType.GAS_CONFIG, data);
}
}
/// @notice Updates the L2 gas limit.
/// @notice Updates the L2 gas limit.
Can only be called by the owner.
/// @param _gasLimit New gas limit.
/// @param _gasLimit New gas limit.
function setGasLimit(uint64 _gasLimit) external onlyOwner {
function setGasLimit(uint64 _gasLimit) external onlyOwner {
_setGasLimit(_gasLimit);
}
/// @notice Internal function for updating the L2 gas limit.
/// @param _gasLimit New gas limit.
function _setGasLimit(uint64 _gasLimit) internal {
require(_gasLimit >= minimumGasLimit(), "SystemConfig: gas limit too low");
require(_gasLimit >= minimumGasLimit(), "SystemConfig: gas limit too low");
gasLimit = _gasLimit;
gasLimit = _gasLimit;
...
...
packages/contracts-bedrock/test/CommonTest.t.sol
View file @
5f128658
...
@@ -51,6 +51,9 @@ contract CommonTest is Test {
...
@@ -51,6 +51,9 @@ contract CommonTest is Test {
event TransactionDeposited(address indexed from, address indexed to, uint256 indexed version, bytes opaqueData);
event TransactionDeposited(address indexed from, address indexed to, uint256 indexed version, bytes opaqueData);
/// @dev OpenZeppelin Ownable.sol transferOwnership event
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
FFIInterface ffi;
FFIInterface ffi;
function setUp() public virtual {
function setUp() public virtual {
...
...
packages/contracts-bedrock/test/CrossDomainOwnable3.t.sol
View file @
5f128658
...
@@ -26,9 +26,6 @@ contract XDomainSetter3 is CrossDomainOwnable3 {
...
@@ -26,9 +26,6 @@ contract XDomainSetter3 is CrossDomainOwnable3 {
contract CrossDomainOwnable3_Test is Messenger_Initializer {
contract CrossDomainOwnable3_Test is Messenger_Initializer {
XDomainSetter3 setter;
XDomainSetter3 setter;
/// @dev OpenZeppelin Ownable.sol transferOwnership event
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/// @dev CrossDomainOwnable3.sol transferOwnership event
/// @dev CrossDomainOwnable3.sol transferOwnership event
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner, bool isLocal);
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner, bool isLocal);
...
...
packages/contracts-bedrock/test/SystemConfig.t.sol
View file @
5f128658
...
@@ -18,6 +18,8 @@ contract SystemConfig_Init is CommonTest {
...
@@ -18,6 +18,8 @@ contract SystemConfig_Init is CommonTest {
SystemConfig sysConf;
SystemConfig sysConf;
SystemConfig systemConfigImpl;
SystemConfig systemConfigImpl;
event ConfigUpdate(uint256 indexed version, SystemConfig.UpdateType indexed updateType, bytes data);
// Dummy addresses used to test getters
// Dummy addresses used to test getters
address constant batchInbox = address(0x18);
address constant batchInbox = address(0x18);
address constant l1CrossDomainMessenger = address(0x20);
address constant l1CrossDomainMessenger = address(0x20);
...
@@ -138,6 +140,51 @@ contract SystemConfig_Initialize_Test is SystemConfig_Init {
...
@@ -138,6 +140,51 @@ contract SystemConfig_Initialize_Test is SystemConfig_Init {
);
);
assertEq(sysConf.startBlock(), startBlock);
assertEq(sysConf.startBlock(), startBlock);
}
}
/// @dev Ensures that the events are emitted during initialization.
function test_initialize_events_succeeds() external {
// Wipe out the initialized slot so the proxy can be initialized again
vm.store(address(sysConf), bytes32(0), bytes32(0));
vm.store(address(sysConf), bytes32(uint256(106)), bytes32(0));
assertEq(sysConf.startBlock(), 0);
// The order depends here
vm.expectEmit(true, true, true, true, address(sysConf));
emit ConfigUpdate(0, SystemConfig.UpdateType.BATCHER, abi.encode(batcherHash));
vm.expectEmit(true, true, true, true, address(sysConf));
emit ConfigUpdate(0, SystemConfig.UpdateType.GAS_CONFIG, abi.encode(overhead, scalar));
vm.expectEmit(true, true, true, true, address(sysConf));
emit ConfigUpdate(0, SystemConfig.UpdateType.GAS_LIMIT, abi.encode(gasLimit));
vm.expectEmit(true, true, true, true, address(sysConf));
emit ConfigUpdate(0, SystemConfig.UpdateType.UNSAFE_BLOCK_SIGNER, abi.encode(unsafeBlockSigner));
vm.prank(multisig);
Proxy(payable(address(sysConf))).upgradeToAndCall(
address(systemConfigImpl),
abi.encodeCall(
SystemConfig.initialize,
(
alice, // _owner,
overhead, // _overhead,
scalar, // _scalar,
batcherHash, // _batcherHash
gasLimit, // _gasLimit,
unsafeBlockSigner, // _unsafeBlockSigner,
Constants.DEFAULT_RESOURCE_CONFIG(), // _config,
0, // _startBlock
batchInbox, // _batchInbox
SystemConfig.Addresses({ // _addresses
l1CrossDomainMessenger: l1CrossDomainMessenger,
l1ERC721Bridge: l1ERC721Bridge,
l1StandardBridge: l1StandardBridge,
l2OutputOracle: l2OutputOracle,
optimismPortal: optimismPortal,
optimismMintableERC20Factory: optimismMintableERC20Factory
})
)
)
);
}
}
}
contract SystemConfig_Initialize_TestFail is SystemConfig_Init {
contract SystemConfig_Initialize_TestFail is SystemConfig_Init {
...
@@ -318,8 +365,6 @@ contract SystemConfig_Setters_TestFail is SystemConfig_Init {
...
@@ -318,8 +365,6 @@ contract SystemConfig_Setters_TestFail is SystemConfig_Init {
}
}
contract SystemConfig_Setters_Test is SystemConfig_Init {
contract SystemConfig_Setters_Test is SystemConfig_Init {
event ConfigUpdate(uint256 indexed version, SystemConfig.UpdateType indexed updateType, bytes data);
/// @dev Tests that `setBatcherHash` updates the batcher hash successfully.
/// @dev Tests that `setBatcherHash` updates the batcher hash successfully.
function testFuzz_setBatcherHash_succeeds(bytes32 newBatcherHash) external {
function testFuzz_setBatcherHash_succeeds(bytes32 newBatcherHash) external {
vm.expectEmit(true, true, true, true);
vm.expectEmit(true, true, true, true);
...
...
packages/sdk/.depcheckrc
View file @
5f128658
...
@@ -11,5 +11,7 @@ ignores: [
...
@@ -11,5 +11,7 @@ ignores: [
"eslint-plugin-prettier",
"eslint-plugin-prettier",
"chai",
"chai",
"ts-node",
"ts-node",
"typedoc"
"typedoc",
"ethereum-waffle",
"nyc"
]
]
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