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
a9a17f97
Unverified
Commit
a9a17f97
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 fix/sys-cfg-events
parents
25661884
6622db2e
Changes
12
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
12 changed files
with
230 additions
and
253 deletions
+230
-253
CONTRIBUTING.md
CONTRIBUTING.md
+34
-0
api_test.go
indexer/api/api_test.go
+13
-10
bridge_messages.go
indexer/database/bridge_messages.go
+20
-67
bridge_transfers.go
indexer/database/bridge_transfers.go
+21
-16
bridge_messages_e2e_test.go
indexer/e2e_tests/bridge_messages_e2e_test.go
+6
-6
bridge_transfers_e2e_test.go
indexer/e2e_tests/bridge_transfers_e2e_test.go
+28
-11
20230523_create_schema.sql
indexer/migrations/20230523_create_schema.sql
+12
-10
l1_processor.go
indexer/processor/l1_processor.go
+23
-26
l2_processor.go
indexer/processor/l2_processor.go
+21
-23
standard_bridge.go
indexer/processor/standard_bridge.go
+47
-81
package.json
packages/contracts-bedrock/package.json
+2
-2
.depcheckrc
packages/sdk/.depcheckrc
+3
-1
No files found.
CONTRIBUTING.md
View file @
a9a17f97
...
...
@@ -185,3 +185,37 @@ cd packages/contracts
pip3
install
slither-analyzer
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 @
a9a17f97
...
...
@@ -2,7 +2,6 @@ package api
import
(
"fmt"
"math/big"
"net/http"
"net/http/httptest"
"testing"
...
...
@@ -21,17 +20,21 @@ var mockAddress = "0x4204204204204204204204204204204204204204"
var
(
deposit
=
database
.
L1BridgeDeposit
{
TransactionSourceHash
:
common
.
HexToHash
(
"abc"
),
CrossDomainMessengerNonce
:
&
database
.
U256
{
Int
:
big
.
NewInt
(
0
)},
Tx
:
database
.
Transaction
{},
TokenPair
:
database
.
TokenPair
{},
TransactionSourceHash
:
common
.
HexToHash
(
"abc"
),
BridgeTransfer
:
database
.
BridgeTransfer
{
CrossDomainMessageHash
:
&
common
.
Hash
{},
Tx
:
database
.
Transaction
{},
TokenPair
:
database
.
TokenPair
{},
},
}
withdrawal
=
database
.
L2BridgeWithdrawal
{
TransactionWithdrawalHash
:
common
.
HexToHash
(
"0x420"
),
CrossDomainMessengerNonce
:
&
database
.
U256
{
Int
:
big
.
NewInt
(
0
)},
Tx
:
database
.
Transaction
{},
TokenPair
:
database
.
TokenPair
{},
BridgeTransfer
:
database
.
BridgeTransfer
{
CrossDomainMessageHash
:
&
common
.
Hash
{},
Tx
:
database
.
Transaction
{},
TokenPair
:
database
.
TokenPair
{},
},
}
)
...
...
@@ -39,7 +42,7 @@ func (mbv *MockBridgeTransfersView) L1BridgeDeposit(hash common.Hash) (*database
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
}
...
...
@@ -56,7 +59,7 @@ func (mbv *MockBridgeTransfersView) L2BridgeWithdrawal(address common.Hash) (*da
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
}
...
...
indexer/database/bridge_messages.go
View file @
a9a17f97
...
...
@@ -3,7 +3,6 @@ package database
import
(
"errors"
"fmt"
"math/big"
"gorm.io/gorm"
...
...
@@ -17,8 +16,8 @@ import (
*/
type
BridgeMessage
struct
{
Nonce
U256
`gorm:"primaryKey
"`
MessageHash
common
.
Hash
`gorm:"serializer:json"`
MessageHash
common
.
Hash
`gorm:"primaryKey;serializer:json
"`
Nonce
U256
SentMessageEventGUID
uuid
.
UUID
RelayedMessageEventGUID
*
uuid
.
UUID
...
...
@@ -38,13 +37,11 @@ type L2BridgeMessage struct {
}
type
BridgeMessagesView
interface
{
L1BridgeMessage
(
*
big
.
Int
)
(
*
L1BridgeMessage
,
error
)
L1BridgeMessageByHash
(
common
.
Hash
)
(
*
L1BridgeMessage
,
error
)
LatestL1BridgeMessageNonce
()
(
*
big
.
Int
,
error
)
L1BridgeMessage
(
common
.
Hash
)
(
*
L1BridgeMessage
,
error
)
L1BridgeMessageWithFilter
(
BridgeMessage
)
(
*
L1BridgeMessage
,
error
)
L2BridgeMessage
(
*
big
.
Int
)
(
*
L2BridgeMessage
,
error
)
L2BridgeMessageByHash
(
common
.
Hash
)
(
*
L2BridgeMessage
,
error
)
LatestL2BridgeMessageNonce
()
(
*
big
.
Int
,
error
)
L2BridgeMessage
(
common
.
Hash
)
(
*
L2BridgeMessage
,
error
)
L2BridgeMessageWithFilter
(
BridgeMessage
)
(
*
L2BridgeMessage
,
error
)
}
type
BridgeMessagesDB
interface
{
...
...
@@ -78,22 +75,13 @@ func (db bridgeMessagesDB) StoreL1BridgeMessages(messages []*L1BridgeMessage) er
return
result
.
Error
}
func
(
db
bridgeMessagesDB
)
L1BridgeMessage
(
nonce
*
big
.
Int
)
(
*
L1BridgeMessage
,
error
)
{
var
sentMessage
L1BridgeMessage
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
(
msgHash
common
.
Hash
)
(
*
L1BridgeMessage
,
error
)
{
return
db
.
L1BridgeMessageWithFilter
(
BridgeMessage
{
MessageHash
:
msgHash
})
}
func
(
db
bridgeMessagesDB
)
L1BridgeMessage
ByHash
(
messageHash
common
.
Hash
)
(
*
L1BridgeMessage
,
error
)
{
func
(
db
bridgeMessagesDB
)
L1BridgeMessage
WithFilter
(
filter
BridgeMessage
)
(
*
L1BridgeMessage
,
error
)
{
var
sentMessage
L1BridgeMessage
result
:=
db
.
gorm
.
Where
(
&
BridgeMessage
{
MessageHash
:
messageHash
}
)
.
Take
(
&
sentMessage
)
result
:=
db
.
gorm
.
Where
(
&
filter
)
.
Take
(
&
sentMessage
)
if
result
.
Error
!=
nil
{
if
errors
.
Is
(
result
.
Error
,
gorm
.
ErrRecordNotFound
)
{
return
nil
,
nil
...
...
@@ -104,25 +92,8 @@ func (db bridgeMessagesDB) L1BridgeMessageByHash(messageHash common.Hash) (*L1Br
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
{
message
,
err
:=
db
.
L1BridgeMessage
ByHash
(
messageHash
)
message
,
err
:=
db
.
L1BridgeMessage
(
messageHash
)
if
err
!=
nil
{
return
err
}
else
if
message
==
nil
{
...
...
@@ -134,27 +105,22 @@ func (db bridgeMessagesDB) MarkRelayedL1BridgeMessage(messageHash common.Hash, r
return
result
.
Error
}
/**
* Arbitrary Messages Sent from L2
*/
func
(
db
bridgeMessagesDB
)
StoreL2BridgeMessages
(
messages
[]
*
L2BridgeMessage
)
error
{
result
:=
db
.
gorm
.
Create
(
&
messages
)
return
result
.
Error
}
func
(
db
bridgeMessagesDB
)
L2BridgeMessage
(
nonce
*
big
.
Int
)
(
*
L2BridgeMessage
,
error
)
{
var
sentMessage
L2BridgeMessage
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
(
msgHash
common
.
Hash
)
(
*
L2BridgeMessage
,
error
)
{
return
db
.
L2BridgeMessageWithFilter
(
BridgeMessage
{
MessageHash
:
msgHash
})
}
func
(
db
bridgeMessagesDB
)
L2BridgeMessage
ByHash
(
messageHash
common
.
Hash
)
(
*
L2BridgeMessage
,
error
)
{
func
(
db
bridgeMessagesDB
)
L2BridgeMessage
WithFilter
(
filter
BridgeMessage
)
(
*
L2BridgeMessage
,
error
)
{
var
sentMessage
L2BridgeMessage
result
:=
db
.
gorm
.
Where
(
&
BridgeMessage
{
MessageHash
:
messageHash
}
)
.
Take
(
&
sentMessage
)
result
:=
db
.
gorm
.
Where
(
&
filter
)
.
Take
(
&
sentMessage
)
if
result
.
Error
!=
nil
{
if
errors
.
Is
(
result
.
Error
,
gorm
.
ErrRecordNotFound
)
{
return
nil
,
nil
...
...
@@ -165,21 +131,8 @@ func (db bridgeMessagesDB) L2BridgeMessageByHash(messageHash common.Hash) (*L2Br
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
{
message
,
err
:=
db
.
L2BridgeMessage
ByHash
(
messageHash
)
message
,
err
:=
db
.
L2BridgeMessage
(
messageHash
)
if
err
!=
nil
{
return
err
}
else
if
message
==
nil
{
...
...
indexer/database/bridge_transfers.go
View file @
a9a17f97
...
...
@@ -2,13 +2,17 @@ package database
import
(
"errors"
"math/big"
"gorm.io/gorm"
"github.com/ethereum-optimism/optimism/op-bindings/predeploys"
"github.com/ethereum/go-ethereum/common"
)
var
(
ETHTokenPair
=
TokenPair
{
L1TokenAddress
:
predeploys
.
LegacyERC20ETHAddr
,
L2TokenAddress
:
predeploys
.
LegacyERC20ETHAddr
}
)
/**
* Types
*/
...
...
@@ -18,15 +22,19 @@ type TokenPair struct {
L2TokenAddress
common
.
Address
`gorm:"serializer:json"`
}
type
L1BridgeDeposit
struct
{
TransactionSourceHash
common
.
Hash
`gorm:"primaryKey;serializer:json"`
CrossDomainMessengerNonce
*
U256
type
BridgeTransfer
struct
{
CrossDomainMessageHash
*
common
.
Hash
`gorm:"serializer:json"`
Tx
Transaction
`gorm:"embedded"`
TokenPair
TokenPair
`gorm:"embedded"`
}
type
L1BridgeDeposit
struct
{
BridgeTransfer
`gorm:"embedded"`
TransactionSourceHash
common
.
Hash
`gorm:"primaryKey;serializer:json"`
}
type
L1BridgeDepositWithTransactionHashes
struct
{
L1BridgeDeposit
L1BridgeDeposit
`gorm:"embedded"`
...
...
@@ -35,12 +43,9 @@ type L1BridgeDepositWithTransactionHashes struct {
}
type
L2BridgeWithdrawal
struct
{
TransactionWithdrawalHash
common
.
Hash
`gorm:"primaryKey;serializer:json"`
CrossDomainMessengerNonce
*
U256
BridgeTransfer
`gorm:"embedded"`
Tx
Transaction
`gorm:"embedded"`
TokenPair
TokenPair
`gorm:"embedded"`
TransactionWithdrawalHash
common
.
Hash
`gorm:"primaryKey;serializer:json"`
}
type
L2BridgeWithdrawalWithTransactionHashes
struct
{
...
...
@@ -53,11 +58,11 @@ type L2BridgeWithdrawalWithTransactionHashes struct {
type
BridgeTransfersView
interface
{
L1BridgeDeposit
(
common
.
Hash
)
(
*
L1BridgeDeposit
,
error
)
L1BridgeDeposit
ByCrossDomainMessengerNonce
(
*
big
.
Int
)
(
*
L1BridgeDeposit
,
error
)
L1BridgeDeposit
WithFilter
(
BridgeTransfer
)
(
*
L1BridgeDeposit
,
error
)
L1BridgeDepositsByAddress
(
common
.
Address
)
([]
*
L1BridgeDepositWithTransactionHashes
,
error
)
L2BridgeWithdrawal
(
common
.
Hash
)
(
*
L2BridgeWithdrawal
,
error
)
L2BridgeWithdrawal
ByCrossDomainMessengerNonce
(
*
big
.
Int
)
(
*
L2BridgeWithdrawal
,
error
)
L2BridgeWithdrawal
WithFilter
(
BridgeTransfer
)
(
*
L2BridgeWithdrawal
,
error
)
L2BridgeWithdrawalsByAddress
(
common
.
Address
)
([]
*
L2BridgeWithdrawalWithTransactionHashes
,
error
)
}
...
...
@@ -104,9 +109,9 @@ func (db *bridgeTransfersDB) L1BridgeDeposit(txSourceHash common.Hash) (*L1Bridg
// L1BridgeDepositByCrossDomainMessengerNonce retrieves tokens deposited, specified by the associated `L1CrossDomainMessenger` nonce.
// 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
result
:=
db
.
gorm
.
Where
(
&
L1BridgeDeposit
{
CrossDomainMessengerNonce
:
&
U256
{
Int
:
nonce
}}
)
.
Take
(
&
deposit
)
result
:=
db
.
gorm
.
Where
(
&
filter
)
.
Take
(
&
deposit
)
if
result
.
Error
!=
nil
{
if
errors
.
Is
(
result
.
Error
,
gorm
.
ErrRecordNotFound
)
{
return
nil
,
nil
...
...
@@ -168,9 +173,9 @@ func (db *bridgeTransfersDB) L2BridgeWithdrawal(txWithdrawalHash common.Hash) (*
// L2BridgeWithdrawalByCrossDomainMessengerNonce retrieves tokens withdrawn, specified by the associated `L2CrossDomainMessenger` nonce.
// 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
result
:=
db
.
gorm
.
Where
(
&
L2BridgeWithdrawal
{
CrossDomainMessengerNonce
:
&
U256
{
Int
:
nonce
}}
)
.
Take
(
&
withdrawal
)
result
:=
db
.
gorm
.
Where
(
filter
)
.
Take
(
&
withdrawal
)
if
result
.
Error
!=
nil
{
if
errors
.
Is
(
result
.
Error
,
gorm
.
ErrRecordNotFound
)
{
return
nil
,
nil
...
...
indexer/e2e_tests/bridge_messages_e2e_test.go
View file @
a9a17f97
...
...
@@ -57,12 +57,12 @@ func TestE2EBridgeL1CrossDomainMessenger(t *testing.T) {
nonceBytes
:=
[
31
]
byte
{
0
:
byte
(
1
)}
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
.
NotNil
(
t
,
sentMessage
)
require
.
NotNil
(
t
,
sentMessage
.
SentMessageEventGUID
)
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
,
big
.
NewInt
(
params
.
Ether
),
sentMessage
.
Tx
.
Amount
.
Int
)
require
.
Equal
(
t
,
aliceAddr
,
sentMessage
.
Tx
.
FromAddress
)
...
...
@@ -83,7 +83,7 @@ func TestE2EBridgeL1CrossDomainMessenger(t *testing.T) {
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
.
NotNil
(
t
,
sentMessage
)
require
.
NotNil
(
t
,
sentMessage
.
RelayedMessageEventGUID
)
...
...
@@ -143,12 +143,12 @@ func TestE2EBridgeL2CrossDomainMessenger(t *testing.T) {
nonceBytes
:=
[
31
]
byte
{
0
:
byte
(
1
)}
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
.
NotNil
(
t
,
sentMessage
)
require
.
NotNil
(
t
,
sentMessage
.
SentMessageEventGUID
)
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
,
big
.
NewInt
(
params
.
Ether
),
sentMessage
.
Tx
.
Amount
.
Int
)
require
.
Equal
(
t
,
aliceAddr
,
sentMessage
.
Tx
.
FromAddress
)
...
...
@@ -166,7 +166,7 @@ func TestE2EBridgeL2CrossDomainMessenger(t *testing.T) {
}))
// 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
.
NotNil
(
t
,
sentMessage
)
require
.
NotNil
(
t
,
sentMessage
.
RelayedMessageEventGUID
)
...
...
indexer/e2e_tests/bridge_transfers_e2e_test.go
View file @
a9a17f97
...
...
@@ -7,7 +7,6 @@ import (
"time"
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"
"github.com/ethereum-optimism/optimism/op-e2e/e2eutils/wait"
"github.com/ethereum-optimism/optimism/op-node/withdrawals"
...
...
@@ -65,9 +64,7 @@ func TestE2EBridgeTransfersStandardBridgeETHDeposit(t *testing.T) {
// StandardBridge flows through the messenger. We remove the first two significant
// bytes of the nonce dedicated to the version. nonce == 0 (first message)
require
.
NotNil
(
t
,
deposit
.
CrossDomainMessengerNonce
)
_
,
nonce
:=
processor
.
DecodeVersionedNonce
(
deposit
.
CrossDomainMessengerNonce
.
Int
)
require
.
Zero
(
t
,
nonce
.
Uint64
())
require
.
NotNil
(
t
,
deposit
.
CrossDomainMessageHash
)
// (2) Test Deposit Finalization via CrossDomainMessenger relayed message
depositReceipt
,
err
=
wait
.
ForReceiptOK
(
context
.
Background
(),
testSuite
.
L2Client
,
types
.
NewTx
(
depositInfo
.
DepositTx
)
.
Hash
())
...
...
@@ -77,7 +74,7 @@ func TestE2EBridgeTransfersStandardBridgeETHDeposit(t *testing.T) {
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
.
NotNil
(
t
,
crossDomainBridgeMessage
)
require
.
NotNil
(
t
,
crossDomainBridgeMessage
.
RelayedMessageEventGUID
)
...
...
@@ -125,10 +122,20 @@ func TestE2EBridgeTransfersOptimismPortalETHReceive(t *testing.T) {
require
.
Len
(
t
,
deposit
.
Tx
.
Data
,
0
)
// 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
// 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
)
{
...
...
@@ -187,9 +194,11 @@ func TestE2EBridgeTransfersStandardBridgeETHWithdrawal(t *testing.T) {
// StandardBridge flows through the messenger. We remove the first two
// bytes of the nonce dedicated to the version. nonce == 0 (first message)
require
.
NotNil
(
t
,
withdrawal
.
CrossDomainMessengerNonce
)
_
,
nonce
:=
processor
.
DecodeVersionedNonce
(
withdrawal
.
CrossDomainMessengerNonce
.
Int
)
require
.
Zero
(
t
,
nonce
.
Uint64
())
require
.
NotNil
(
t
,
withdrawal
.
CrossDomainMessageHash
)
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
require
.
Empty
(
t
,
aliceWithdrawals
[
0
]
.
ProvenL1TransactionHash
)
...
...
@@ -206,6 +215,11 @@ func TestE2EBridgeTransfersStandardBridgeETHWithdrawal(t *testing.T) {
require
.
NoError
(
t
,
err
)
require
.
Equal
(
t
,
proveReceipt
.
TxHash
,
aliceWithdrawals
[
0
]
.
ProvenL1TransactionHash
)
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
)
{
...
...
@@ -262,7 +276,7 @@ func TestE2EBridgeTransfersL2ToL1MessagePasserReceive(t *testing.T) {
require
.
Len
(
t
,
withdrawal
.
Tx
.
Data
,
0
)
// 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
require
.
Empty
(
t
,
aliceWithdrawals
[
0
]
.
ProvenL1TransactionHash
)
...
...
@@ -279,4 +293,7 @@ func TestE2EBridgeTransfersL2ToL1MessagePasserReceive(t *testing.T) {
require
.
NoError
(
t
,
err
)
require
.
Equal
(
t
,
proveReceipt
.
TxHash
,
aliceWithdrawals
[
0
]
.
ProvenL1TransactionHash
)
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 @
a9a17f97
...
...
@@ -152,9 +152,10 @@ CREATE TABLE IF NOT EXISTS l2_transaction_withdrawals (
-- CrossDomainMessenger
CREATE
TABLE
IF
NOT
EXISTS
l1_bridge_messages
(
nonce
UINT256
NOT
NULL
PRIMARY
KEY
,
message_hash
VARCHAR
NOT
NULL
,
transaction_source_hash
VARCHAR
NOT
NULL
REFERENCES
l1_transaction_deposits
(
source_hash
),
message_hash
VARCHAR
NOT
NULL
PRIMARY
KEY
,
nonce
UINT256
NOT
NULL
UNIQUE
,
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
),
relayed_message_event_guid
VARCHAR
UNIQUE
REFERENCES
l2_contract_events
(
guid
),
...
...
@@ -168,9 +169,10 @@ CREATE TABLE IF NOT EXISTS l1_bridge_messages(
timestamp
INTEGER
NOT
NULL
CHECK
(
timestamp
>
0
)
);
CREATE
TABLE
IF
NOT
EXISTS
l2_bridge_messages
(
nonce
UINT256
NOT
NULL
PRIMARY
KEY
,
message_hash
VARCHAR
NOT
NULL
,
transaction_withdrawal_hash
VARCHAR
NOT
NULL
REFERENCES
l2_transaction_withdrawals
(
withdrawal_hash
),
message_hash
VARCHAR
NOT
NULL
PRIMARY
KEY
,
nonce
UINT256
NOT
NULL
UNIQUE
,
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
),
relayed_message_event_guid
VARCHAR
UNIQUE
REFERENCES
l1_contract_events
(
guid
),
...
...
@@ -188,9 +190,9 @@ CREATE TABLE IF NOT EXISTS l2_bridge_messages(
CREATE
TABLE
IF
NOT
EXISTS
l1_bridge_deposits
(
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
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
from_address
VARCHAR
NOT
NULL
,
...
...
@@ -204,9 +206,9 @@ CREATE TABLE IF NOT EXISTS l1_bridge_deposits (
CREATE
TABLE
IF
NOT
EXISTS
l2_bridge_withdrawals
(
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
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
from_address
VARCHAR
NOT
NULL
,
...
...
indexer/processor/l1_processor.go
View file @
a9a17f97
...
...
@@ -12,7 +12,6 @@ import (
"github.com/ethereum-optimism/optimism/indexer/node"
"github.com/ethereum-optimism/optimism/op-bindings/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/go-ethereum"
...
...
@@ -222,7 +221,7 @@ func l1ProcessFn(processLog log.Logger, ethClient node.EthClient, l1Contracts co
}
// forward along contract events to standard bridge processor
err
=
l1ProcessContractEventsStandardBridge
(
processLog
,
db
,
ethClient
,
processedContractEvents
)
err
=
l1ProcessContractEventsStandardBridge
(
processLog
,
db
,
processedContractEvents
)
if
err
!=
nil
{
return
err
}
...
...
@@ -266,11 +265,10 @@ func l1ProcessContractEventsBridgeTransactions(processLog log.Logger, db *databa
if
len
(
depositTx
.
Data
)
==
0
&&
depositTx
.
Value
.
BitLen
()
>
0
{
ethDeposits
=
append
(
ethDeposits
,
&
database
.
L1BridgeDeposit
{
TransactionSourceHash
:
depositTx
.
SourceHash
,
Tx
:
transactionDeposits
[
i
]
.
Tx
,
TokenPair
:
database
.
TokenPair
{
BridgeTransfer
:
database
.
BridgeTransfer
{
Tx
:
transactionDeposits
[
i
]
.
Tx
,
// TODO index eth token if it doesn't exist
L1TokenAddress
:
predeploys
.
LegacyERC20ETHAddr
,
L2TokenAddress
:
predeploys
.
LegacyERC20ETHAddr
,
TokenPair
:
database
.
ETHTokenPair
,
},
})
}
...
...
@@ -386,8 +384,8 @@ func l1ProcessContractEventsBridgeCrossDomainMessages(processLog log.Logger, db
sentMessages
[
i
]
=
&
database
.
L1BridgeMessage
{
TransactionSourceHash
:
depositTx
.
SourceHash
,
BridgeMessage
:
database
.
BridgeMessage
{
Nonce
:
database
.
U256
{
Int
:
sentMessageEvent
.
MessageNonce
},
MessageHash
:
sentMessageEvent
.
MessageHash
,
Nonce
:
database
.
U256
{
Int
:
sentMessageEvent
.
MessageNonce
},
SentMessageEventGUID
:
sentMessageEvent
.
Event
.
GUID
,
GasLimit
:
database
.
U256
{
Int
:
sentMessageEvent
.
GasLimit
},
Tx
:
database
.
Transaction
{
...
...
@@ -419,7 +417,7 @@ func l1ProcessContractEventsBridgeCrossDomainMessages(processLog log.Logger, db
}
for
_
,
relayedMessage
:=
range
relayedMessageEvents
{
message
,
err
:=
db
.
BridgeMessages
.
L2BridgeMessage
ByHash
(
relayedMessage
.
MsgHash
)
message
,
err
:=
db
.
BridgeMessages
.
L2BridgeMessage
(
relayedMessage
.
MsgHash
)
if
err
!=
nil
{
return
err
}
else
if
message
==
nil
{
...
...
@@ -443,9 +441,7 @@ func l1ProcessContractEventsBridgeCrossDomainMessages(processLog log.Logger, db
return
nil
}
func
l1ProcessContractEventsStandardBridge
(
processLog
log
.
Logger
,
db
*
database
.
DB
,
ethClient
node
.
EthClient
,
events
*
ProcessedContractEvents
)
error
{
rawEthClient
:=
ethclient
.
NewClient
(
ethClient
.
RawRpcClient
())
func
l1ProcessContractEventsStandardBridge
(
processLog
log
.
Logger
,
db
*
database
.
DB
,
events
*
ProcessedContractEvents
)
error
{
// (1) Process New Deposits
initiatedDepositEvents
,
err
:=
StandardBridgeInitiatedEvents
(
events
)
if
err
!=
nil
{
...
...
@@ -465,16 +461,18 @@ func l1ProcessContractEventsStandardBridge(processLog log.Logger, db *database.D
}
deposits
[
i
]
=
&
database
.
L1BridgeDeposit
{
TransactionSourceHash
:
depositTx
.
SourceHash
,
CrossDomainMessengerNonce
:
&
database
.
U256
{
Int
:
initiatedBridgeEvent
.
CrossDomainMessengerNonce
},
// TODO index the tokens pairs if they don't exist
TokenPair
:
database
.
TokenPair
{
L1TokenAddress
:
initiatedBridgeEvent
.
LocalToken
,
L2TokenAddress
:
initiatedBridgeEvent
.
RemoteToken
},
Tx
:
database
.
Transaction
{
FromAddress
:
initiatedBridgeEvent
.
From
,
ToAddress
:
initiatedBridgeEvent
.
To
,
Amount
:
database
.
U256
{
Int
:
initiatedBridgeEvent
.
Amount
},
Data
:
initiatedBridgeEvent
.
ExtraData
,
Timestamp
:
initiatedBridgeEvent
.
Event
.
Timestamp
,
TransactionSourceHash
:
depositTx
.
SourceHash
,
BridgeTransfer
:
database
.
BridgeTransfer
{
CrossDomainMessageHash
:
&
initiatedBridgeEvent
.
CrossDomainMessageHash
,
// TODO index the tokens pairs if they don't exist
TokenPair
:
database
.
TokenPair
{
L1TokenAddress
:
initiatedBridgeEvent
.
LocalToken
,
L2TokenAddress
:
initiatedBridgeEvent
.
RemoteToken
},
Tx
:
database
.
Transaction
{
FromAddress
:
initiatedBridgeEvent
.
From
,
ToAddress
:
initiatedBridgeEvent
.
To
,
Amount
:
database
.
U256
{
Int
:
initiatedBridgeEvent
.
Amount
},
Data
:
initiatedBridgeEvent
.
ExtraData
,
Timestamp
:
initiatedBridgeEvent
.
Event
.
Timestamp
,
},
},
}
}
...
...
@@ -491,17 +489,17 @@ 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
// 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
finalizedWithdrawalEvents
,
err
:=
StandardBridgeFinalizedEvents
(
rawEthClient
,
events
)
finalizedWithdrawalEvents
,
err
:=
StandardBridgeFinalizedEvents
(
events
)
if
err
!=
nil
{
return
err
}
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
{
return
err
}
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"
)
}
...
...
@@ -509,8 +507,7 @@ func l1ProcessContractEventsStandardBridge(processLog log.Logger, db *database.D
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
.
LocalToken
!=
withdrawal
.
TokenPair
.
L1TokenAddress
||
finalizedWithdrawalEvent
.
RemoteToken
!=
withdrawal
.
TokenPair
.
L2TokenAddress
{
processLog
.
Crit
(
"bridge finalization fields mismatch with initiated fields!"
,
"tx_withdrawal_hash"
,
withdrawal
.
TransactionWithdrawalHash
,
"cross_domain_messenger_nonce"
,
withdrawal
.
CrossDomainMessengerNonce
.
Int
)
return
errors
.
New
(
"bridge tx mismatch!"
)
processLog
.
Crit
(
"bridge finalization fields mismatch with initiated fields!"
,
"tx_withdrawal_hash"
,
withdrawal
.
TransactionWithdrawalHash
,
"cross_domain_message_hash"
,
withdrawal
.
CrossDomainMessageHash
)
}
}
...
...
indexer/processor/l2_processor.go
View file @
a9a17f97
...
...
@@ -10,7 +10,6 @@ import (
"github.com/ethereum-optimism/optimism/indexer/database"
"github.com/ethereum-optimism/optimism/indexer/node"
"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/common"
...
...
@@ -160,7 +159,7 @@ func l2ProcessFn(processLog log.Logger, ethClient node.EthClient, l2Contracts L2
}
// forward along contract events to standard bridge processor
err
=
l2ProcessContractEventsStandardBridge
(
processLog
,
db
,
ethClient
,
processedContractEvents
)
err
=
l2ProcessContractEventsStandardBridge
(
processLog
,
db
,
processedContractEvents
)
if
err
!=
nil
{
return
err
}
...
...
@@ -198,10 +197,9 @@ func l2ProcessContractEventsBridgeTransactions(processLog log.Logger, db *databa
if
len
(
withdrawalEvent
.
Data
)
==
0
&&
withdrawalEvent
.
Value
.
BitLen
()
>
0
{
ethWithdrawals
=
append
(
ethWithdrawals
,
&
database
.
L2BridgeWithdrawal
{
TransactionWithdrawalHash
:
withdrawalEvent
.
WithdrawalHash
,
Tx
:
transactionWithdrawals
[
i
]
.
Tx
,
TokenPair
:
database
.
TokenPair
{
L1TokenAddress
:
predeploys
.
LegacyERC20ETHAddr
,
L2TokenAddress
:
predeploys
.
LegacyERC20ETHAddr
,
BridgeTransfer
:
database
.
BridgeTransfer
{
Tx
:
transactionWithdrawals
[
i
]
.
Tx
,
TokenPair
:
database
.
ETHTokenPair
,
},
})
}
...
...
@@ -258,8 +256,8 @@ func l2ProcessContractEventsBridgeCrossDomainMessages(processLog log.Logger, db
sentMessages
[
i
]
=
&
database
.
L2BridgeMessage
{
TransactionWithdrawalHash
:
msgPassedEvent
.
WithdrawalHash
,
BridgeMessage
:
database
.
BridgeMessage
{
Nonce
:
database
.
U256
{
Int
:
sentMessageEvent
.
MessageNonce
},
MessageHash
:
sentMessageEvent
.
MessageHash
,
Nonce
:
database
.
U256
{
Int
:
sentMessageEvent
.
MessageNonce
},
SentMessageEventGUID
:
sentMessageEvent
.
Event
.
GUID
,
GasLimit
:
database
.
U256
{
Int
:
sentMessageEvent
.
GasLimit
},
Tx
:
database
.
Transaction
{
...
...
@@ -298,7 +296,7 @@ func l2ProcessContractEventsBridgeCrossDomainMessages(processLog log.Logger, db
}
for
_
,
relayedMessage
:=
range
relayedMessageEvents
{
message
,
err
:=
db
.
BridgeMessages
.
L1BridgeMessage
ByHash
(
relayedMessage
.
MsgHash
)
message
,
err
:=
db
.
BridgeMessages
.
L1BridgeMessage
(
relayedMessage
.
MsgHash
)
if
err
!=
nil
{
return
err
}
...
...
@@ -330,9 +328,7 @@ func l2ProcessContractEventsBridgeCrossDomainMessages(processLog log.Logger, db
return
nil
}
func
l2ProcessContractEventsStandardBridge
(
processLog
log
.
Logger
,
db
*
database
.
DB
,
ethClient
node
.
EthClient
,
events
*
ProcessedContractEvents
)
error
{
rawEthClient
:=
ethclient
.
NewClient
(
ethClient
.
RawRpcClient
())
func
l2ProcessContractEventsStandardBridge
(
processLog
log
.
Logger
,
db
*
database
.
DB
,
events
*
ProcessedContractEvents
)
error
{
l2ToL1MessagePasserABI
,
err
:=
bindings
.
NewL2ToL1MessagePasser
(
common
.
Address
{},
nil
)
if
err
!=
nil
{
return
err
...
...
@@ -357,14 +353,16 @@ func l2ProcessContractEventsStandardBridge(processLog log.Logger, db *database.D
withdrawals
[
i
]
=
&
database
.
L2BridgeWithdrawal
{
TransactionWithdrawalHash
:
msgPassedEvent
.
WithdrawalHash
,
CrossDomainMessengerNonce
:
&
database
.
U256
{
Int
:
initiatedBridgeEvent
.
CrossDomainMessengerNonce
},
TokenPair
:
database
.
TokenPair
{
L1TokenAddress
:
initiatedBridgeEvent
.
LocalToken
,
L2TokenAddress
:
initiatedBridgeEvent
.
RemoteToken
},
Tx
:
database
.
Transaction
{
FromAddress
:
initiatedBridgeEvent
.
From
,
ToAddress
:
initiatedBridgeEvent
.
To
,
Amount
:
database
.
U256
{
Int
:
initiatedBridgeEvent
.
Amount
},
Data
:
initiatedBridgeEvent
.
ExtraData
,
Timestamp
:
initiatedBridgeEvent
.
Event
.
Timestamp
,
BridgeTransfer
:
database
.
BridgeTransfer
{
CrossDomainMessageHash
:
&
initiatedBridgeEvent
.
CrossDomainMessageHash
,
TokenPair
:
database
.
TokenPair
{
L1TokenAddress
:
initiatedBridgeEvent
.
LocalToken
,
L2TokenAddress
:
initiatedBridgeEvent
.
RemoteToken
},
Tx
:
database
.
Transaction
{
FromAddress
:
initiatedBridgeEvent
.
From
,
ToAddress
:
initiatedBridgeEvent
.
To
,
Amount
:
database
.
U256
{
Int
:
initiatedBridgeEvent
.
Amount
},
Data
:
initiatedBridgeEvent
.
ExtraData
,
Timestamp
:
initiatedBridgeEvent
.
Event
.
Timestamp
,
},
},
}
}
...
...
@@ -382,18 +380,18 @@ func l2ProcessContractEventsStandardBridge(processLog log.Logger, db *database.D
// bridge transaction & messages that have a tracked lifecyle. We simply walk through and ensure
// that the corresponding initiated deposits exist as an integrity check
finalizedDepositEvents
,
err
:=
StandardBridgeFinalizedEvents
(
rawEthClient
,
events
)
finalizedDepositEvents
,
err
:=
StandardBridgeFinalizedEvents
(
events
)
if
err
!=
nil
{
return
err
}
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
{
return
err
}
else
if
deposit
==
nil
{
// 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"
)
}
...
...
@@ -401,7 +399,7 @@ func l2ProcessContractEventsStandardBridge(processLog log.Logger, db *database.D
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
.
LocalToken
!=
deposit
.
TokenPair
.
L1TokenAddress
||
finalizedDepositEvent
.
RemoteToken
!=
deposit
.
TokenPair
.
L2TokenAddress
{
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"
)
}
}
...
...
indexer/processor/standard_bridge.go
View file @
a9a17f97
This diff is collapsed.
Click to expand it.
packages/contracts-bedrock/package.json
View file @
a9a17f97
...
...
@@ -16,7 +16,7 @@
"prebuild"
:
"./scripts/verify-foundry-install.sh"
,
"build:differential"
:
"go build -o ./scripts/differential-testing/differential-testing ./scripts/differential-testing"
,
"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"
,
"coverage"
:
"pnpm build:differential && pnpm build:fuzz && forge coverage"
,
"coverage:lcov"
:
"pnpm build:differential && pnpm build:fuzz && forge coverage --report lcov"
,
...
...
@@ -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:full"
:
"pnpm test && pnpm slither && pnpm validate-deploy-configs && pnpm validate-spacers && pnpm pre-pr"
,
"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:check"
:
"pnpm lint:contracts:check && pnpm lint:ts:check"
,
"lint:ts:fix"
:
"eslint --fix ."
,
...
...
packages/sdk/.depcheckrc
View file @
a9a17f97
...
...
@@ -11,5 +11,7 @@ ignores: [
"eslint-plugin-prettier",
"chai",
"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