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
af26334a
Commit
af26334a
authored
Oct 21, 2023
by
Hamdi Allam
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
indexer bridge finalization
parent
fce08b3c
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
27 additions
and
65 deletions
+27
-65
l1_bridge_processor.go
indexer/processors/bridge/l1_bridge_processor.go
+6
-27
l2_bridge_processor.go
indexer/processors/bridge/l2_bridge_processor.go
+9
-30
legacy_bridge_processor.go
indexer/processors/bridge/legacy_bridge_processor.go
+12
-8
No files found.
indexer/processors/bridge/l1_bridge_processor.go
View file @
af26334a
...
...
@@ -29,7 +29,7 @@ func L1ProcessInitiatedBridgeEvents(log log.Logger, db *database.DB, metrics L1M
log
.
Info
(
"detected transaction deposits"
,
"size"
,
len
(
optimismPortalTxDeposits
))
}
var
mintedGWEI
=
bigint
.
Zero
mintedGWEI
:
=
bigint
.
Zero
portalDeposits
:=
make
(
map
[
logKey
]
*
contracts
.
OptimismPortalTransactionDepositEvent
,
len
(
optimismPortalTxDeposits
))
transactionDeposits
:=
make
([]
database
.
L1TransactionDeposit
,
len
(
optimismPortalTxDeposits
))
for
i
:=
range
optimismPortalTxDeposits
{
...
...
@@ -44,7 +44,6 @@ func L1ProcessInitiatedBridgeEvents(log log.Logger, db *database.DB, metrics L1M
GasLimit
:
depositTx
.
GasLimit
,
Tx
:
depositTx
.
Tx
,
}
}
if
len
(
transactionDeposits
)
>
0
{
...
...
@@ -125,6 +124,7 @@ func L1ProcessInitiatedBridgeEvents(log log.Logger, db *database.DB, metrics L1M
}
bridgedTokens
[
initiatedBridge
.
BridgeTransfer
.
TokenPair
.
LocalTokenAddress
]
++
initiatedBridge
.
BridgeTransfer
.
CrossDomainMessageHash
=
&
sentMessage
.
BridgeMessage
.
MessageHash
bridgeDeposits
[
i
]
=
database
.
L1BridgeDeposit
{
TransactionSourceHash
:
portalDeposit
.
DepositTx
.
SourceHash
,
...
...
@@ -214,10 +214,8 @@ func L1ProcessFinalizedBridgeEvents(log log.Logger, db *database.DB, metrics L1M
log
.
Info
(
"detected relayed messages"
,
"size"
,
len
(
crossDomainRelayedMessages
))
}
relayedMessages
:=
make
(
map
[
logKey
]
*
contracts
.
CrossDomainMessengerRelayedMessageEvent
,
len
(
crossDomainRelayedMessages
))
for
i
:=
range
crossDomainRelayedMessages
{
relayed
:=
crossDomainRelayedMessages
[
i
]
relayedMessages
[
logKey
{
BlockHash
:
relayed
.
Event
.
BlockHash
,
LogIndex
:
relayed
.
Event
.
LogIndex
}]
=
&
relayed
message
,
err
:=
db
.
BridgeMessages
.
L2BridgeMessage
(
relayed
.
MessageHash
)
if
err
!=
nil
{
return
err
...
...
@@ -236,40 +234,21 @@ func L1ProcessFinalizedBridgeEvents(log log.Logger, db *database.DB, metrics L1M
}
// (4) L1StandardBridge
// - Nothing actionable on the database. Since the StandardBridge is layered ontop of the
// CrossDomainMessenger, there's no need for any sanity or invariant checks as the previous step
// ensures a relayed message (finalized bridge) can be linked with a sent message (initiated bridge).
finalizedBridges
,
err
:=
contracts
.
StandardBridgeFinalizedEvents
(
"l1"
,
l1Contracts
.
L1StandardBridgeProxy
,
db
,
fromHeight
,
toHeight
)
if
err
!=
nil
{
return
err
}
if
len
(
finalizedBridges
)
>
0
{
log
.
Info
(
"detected finalized bridge withdrawals"
,
"size"
,
len
(
finalizedBridges
))
}
finalizedTokens
:=
make
(
map
[
common
.
Address
]
int
)
for
i
:=
range
finalizedBridges
{
// Nothing actionable on the database. However, we can treat the relayed message
// as an invariant by ensuring we can query for a deposit by the same hash
finalizedBridge
:=
finalizedBridges
[
i
]
relayedMessage
,
ok
:=
relayedMessages
[
logKey
{
finalizedBridge
.
Event
.
BlockHash
,
finalizedBridge
.
Event
.
LogIndex
+
1
}]
if
!
ok
{
log
.
Error
(
"expected RelayedMessage following BridgeFinalized event"
,
"tx_hash"
,
finalizedBridge
.
Event
.
TransactionHash
.
String
())
return
fmt
.
Errorf
(
"expected RelayedMessage following BridgeFinalized event. tx_hash = %s"
,
finalizedBridge
.
Event
.
TransactionHash
.
String
())
}
else
if
relayedMessage
.
Event
.
TransactionHash
!=
finalizedBridge
.
Event
.
TransactionHash
{
log
.
Error
(
"correlated events tx hash mismatch"
,
"message_tx_hash"
,
relayedMessage
.
Event
.
TransactionHash
.
String
(),
"bridge_tx_hash"
,
finalizedBridge
.
Event
.
TransactionHash
.
String
())
return
fmt
.
Errorf
(
"correlated events tx hash mismatch"
)
}
// Since the message hash is computed from the relayed message, this ensures the deposit fields must match
withdrawal
,
err
:=
db
.
BridgeTransfers
.
L2BridgeWithdrawalWithFilter
(
database
.
BridgeTransfer
{
CrossDomainMessageHash
:
&
relayedMessage
.
MessageHash
})
if
err
!=
nil
{
return
err
}
else
if
withdrawal
==
nil
{
log
.
Error
(
"missing L2StandardBridge withdrawal on L1 finalization"
,
"tx_hash"
,
finalizedBridge
.
Event
.
TransactionHash
.
String
())
return
fmt
.
Errorf
(
"missing L2StandardBridge withdrawal on L1 finalization. tx_hash: %s"
,
finalizedBridge
.
Event
.
TransactionHash
.
String
())
}
finalizedTokens
[
finalizedBridge
.
BridgeTransfer
.
TokenPair
.
LocalTokenAddress
]
++
}
if
len
(
finalizedBridges
)
>
0
{
log
.
Info
(
"detected finalized bridge withdrawals"
,
"size"
,
len
(
finalizedBridges
))
for
tokenAddr
,
size
:=
range
finalizedTokens
{
metrics
.
RecordL1FinalizedBridgeTransfers
(
tokenAddr
,
size
)
}
...
...
indexer/processors/bridge/l2_bridge_processor.go
View file @
af26334a
package
bridge
import
(
"errors"
"fmt"
"math/big"
...
...
@@ -29,7 +28,7 @@ func L2ProcessInitiatedBridgeEvents(log log.Logger, db *database.DB, metrics L2M
log
.
Info
(
"detected transaction withdrawals"
,
"size"
,
len
(
l2ToL1MPMessagesPassed
))
}
var
withdrawnWEI
=
bigint
.
Zero
withdrawnWEI
:
=
bigint
.
Zero
messagesPassed
:=
make
(
map
[
logKey
]
*
contracts
.
L2ToL1MessagePasserMessagePassed
,
len
(
l2ToL1MPMessagesPassed
))
transactionWithdrawals
:=
make
([]
database
.
L2TransactionWithdrawal
,
len
(
l2ToL1MPMessagesPassed
))
for
i
:=
range
l2ToL1MPMessagesPassed
{
...
...
@@ -122,8 +121,9 @@ func L2ProcessInitiatedBridgeEvents(log log.Logger, db *database.DB, metrics L2M
return
fmt
.
Errorf
(
"correlated events tx hash mismatch"
)
}
initiatedBridge
.
BridgeTransfer
.
CrossDomainMessageHash
=
&
sentMessage
.
BridgeMessage
.
MessageHash
bridgedTokens
[
initiatedBridge
.
BridgeTransfer
.
TokenPair
.
LocalTokenAddress
]
++
initiatedBridge
.
BridgeTransfer
.
CrossDomainMessageHash
=
&
sentMessage
.
BridgeMessage
.
MessageHash
bridgeWithdrawals
[
i
]
=
database
.
L2BridgeWithdrawal
{
TransactionWithdrawalHash
:
messagePassed
.
WithdrawalHash
,
BridgeTransfer
:
initiatedBridge
.
BridgeTransfer
,
...
...
@@ -158,10 +158,8 @@ func L2ProcessFinalizedBridgeEvents(log log.Logger, db *database.DB, metrics L2M
log
.
Info
(
"detected relayed messages"
,
"size"
,
len
(
crossDomainRelayedMessages
))
}
relayedMessages
:=
make
(
map
[
logKey
]
*
contracts
.
CrossDomainMessengerRelayedMessageEvent
,
len
(
crossDomainRelayedMessages
))
for
i
:=
range
crossDomainRelayedMessages
{
relayed
:=
crossDomainRelayedMessages
[
i
]
relayedMessages
[
logKey
{
BlockHash
:
relayed
.
Event
.
BlockHash
,
LogIndex
:
relayed
.
Event
.
LogIndex
}]
=
&
relayed
message
,
err
:=
db
.
BridgeMessages
.
L1BridgeMessage
(
relayed
.
MessageHash
)
if
err
!=
nil
{
return
err
...
...
@@ -175,45 +173,26 @@ func L2ProcessFinalizedBridgeEvents(log log.Logger, db *database.DB, metrics L2M
return
err
}
}
if
len
(
r
elayedMessages
)
>
0
{
metrics
.
RecordL2CrossDomainRelayedMessages
(
len
(
r
elayedMessages
))
if
len
(
crossDomainR
elayedMessages
)
>
0
{
metrics
.
RecordL2CrossDomainRelayedMessages
(
len
(
crossDomainR
elayedMessages
))
}
// (2) L2StandardBridge
// - Nothing actionable on the database. Since the StandardBridge is layered ontop of the
// CrossDomainMessenger, there's no need for any sanity or invariant checks as the previous step
// ensures a relayed message (finalized bridge) can be linked with a sent message (initiated bridge).
finalizedBridges
,
err
:=
contracts
.
StandardBridgeFinalizedEvents
(
"l2"
,
l2Contracts
.
L2StandardBridge
,
db
,
fromHeight
,
toHeight
)
if
err
!=
nil
{
return
err
}
if
len
(
finalizedBridges
)
>
0
{
log
.
Info
(
"detected finalized bridge deposits"
,
"size"
,
len
(
finalizedBridges
))
}
finalizedTokens
:=
make
(
map
[
common
.
Address
]
int
)
for
i
:=
range
finalizedBridges
{
// Nothing actionable on the database. However, we can treat the relayed message
// as an invariant by ensuring we can query for a deposit by the same hash
finalizedBridge
:=
finalizedBridges
[
i
]
relayedMessage
,
ok
:=
relayedMessages
[
logKey
{
finalizedBridge
.
Event
.
BlockHash
,
finalizedBridge
.
Event
.
LogIndex
+
1
}]
if
!
ok
{
log
.
Error
(
"expected RelayedMessage following BridgeFinalized event"
,
"tx_hash"
,
finalizedBridge
.
Event
.
TransactionHash
.
String
())
return
fmt
.
Errorf
(
"expected RelayedMessage following BridgeFinalized event. tx_hash = %s"
,
finalizedBridge
.
Event
.
TransactionHash
.
String
())
}
else
if
relayedMessage
.
Event
.
TransactionHash
!=
finalizedBridge
.
Event
.
TransactionHash
{
log
.
Error
(
"correlated events tx hash mismatch"
,
"message_tx_hash"
,
relayedMessage
.
Event
.
TransactionHash
.
String
(),
"bridge_tx_hash"
,
finalizedBridge
.
Event
.
TransactionHash
.
String
())
return
fmt
.
Errorf
(
"correlated events tx hash mismatch"
)
}
// Since the message hash is computed from the relayed message, this ensures the withdrawal fields must match
deposit
,
err
:=
db
.
BridgeTransfers
.
L1BridgeDepositWithFilter
(
database
.
BridgeTransfer
{
CrossDomainMessageHash
:
&
relayedMessage
.
MessageHash
})
if
err
!=
nil
{
return
err
}
else
if
deposit
==
nil
{
log
.
Error
(
"missing L1StandardBridge deposit on L2 finalization"
,
"tx_hash"
,
finalizedBridge
.
Event
.
TransactionHash
.
String
())
return
errors
.
New
(
"missing L1StandardBridge deposit on L2 finalization"
)
}
finalizedTokens
[
finalizedBridge
.
BridgeTransfer
.
TokenPair
.
LocalTokenAddress
]
++
}
if
len
(
finalizedBridges
)
>
0
{
log
.
Info
(
"detected finalized bridge deposits"
,
"size"
,
len
(
finalizedBridges
))
for
tokenAddr
,
size
:=
range
finalizedTokens
{
metrics
.
RecordL2FinalizedBridgeTransfers
(
tokenAddr
,
size
)
}
...
...
indexer/processors/bridge/legacy_bridge_processor.go
View file @
af26334a
...
...
@@ -330,10 +330,12 @@ func LegacyL1ProcessFinalizedBridgeEvents(log log.Logger, db *database.DB, metri
log
.
Warn
(
"skipped pre-regensis relayed L2CrossDomainMessenger withdrawals"
,
"size"
,
skippedPreRegenesisMessages
)
}
// (2) L2StandardBridge -- no-op for now as there's nothing actionable to do here besides
// santiy checks which is not important for legacy code. Not worth extra code pre-bedrock.
// The message status is already tracked via the relayed bridge messed through the cross domain messenger.
// - NOTE: This means we dont increment metrics for finalized bridge transfers
// (2) L1StandardBridge
// - Nothing actionable on the database. Since the StandardBridge is layered ontop of the
// CrossDomainMessenger, there's no need for any sanity or invariant checks as the previous step
// ensures a relayed message (finalized bridge) can be linked with a sent message (initiated bridge).
// - NOTE: Ignoring metrics for pre-bedrock transfers
// a-ok!
return
nil
...
...
@@ -372,10 +374,12 @@ func LegacyL2ProcessFinalizedBridgeEvents(log log.Logger, db *database.DB, metri
metrics
.
RecordL2CrossDomainRelayedMessages
(
len
(
crossDomainRelayedMessages
))
}
// (2) L2StandardBridge -- no-op for now as there's nothing actionable to do here besides
// santiy checks which is not important for legacy code. Not worth the extra code pre-bedorck.
// The message status is already tracked via the relayed bridge messed through the cross domain messenger.
// - NOTE: This means we dont increment metrics for finalized bridge transfers
// (2) L2StandardBridge
// - Nothing actionable on the database. Since the StandardBridge is layered ontop of the
// CrossDomainMessenger, there's no need for any sanity or invariant checks as the previous step
// ensures a relayed message (finalized bridge) can be linked with a sent message (initiated bridge).
// - NOTE: Ignoring metrics for pre-bedrock transfers
// a-ok!
return
nil
...
...
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