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
5a9928c0
Unverified
Commit
5a9928c0
authored
Oct 09, 2022
by
Matthew Slipper
Committed by
GitHub
Oct 09, 2022
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
indexer: Upgrade L2 services (#3668)
parent
475b2bfa
Changes
7
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
178 additions
and
267 deletions
+178
-267
indexer.go
indexer/indexer.go
+0
-2
bridge.go
indexer/services/l2/bridge/bridge.go
+30
-29
filter.go
indexer/services/l2/bridge/filter.go
+0
-45
standard_bridge.go
indexer/services/l2/bridge/standard_bridge.go
+82
-53
confirmed_headers.go
indexer/services/l2/confirmed_headers.go
+1
-2
query.go
indexer/services/l2/query.go
+0
-38
service.go
indexer/services/l2/service.go
+65
-98
No files found.
indexer/indexer.go
View file @
5a9928c0
...
...
@@ -183,7 +183,6 @@ func NewIndexer(cfg Config, gitVersion string) (*Indexer, error) {
ConfDepth
:
cfg
.
ConfDepth
,
MaxHeaderBatchSize
:
cfg
.
MaxHeaderBatchSize
,
StartBlockNumber
:
uint64
(
0
),
StartBlockHash
:
cfg
.
L2GenesisBlockHash
,
})
if
err
!=
nil
{
return
nil
,
err
...
...
@@ -211,7 +210,6 @@ func (b *Indexer) Serve() error {
b
.
router
.
HandleFunc
(
"/v1/l1/status"
,
b
.
l1IndexingService
.
GetIndexerStatus
)
.
Methods
(
"GET"
)
b
.
router
.
HandleFunc
(
"/v1/l2/status"
,
b
.
l2IndexingService
.
GetIndexerStatus
)
.
Methods
(
"GET"
)
b
.
router
.
HandleFunc
(
"/v1/deposits/0x{address:[a-fA-F0-9]{40}}"
,
b
.
l1IndexingService
.
GetDeposits
)
.
Methods
(
"GET"
)
b
.
router
.
HandleFunc
(
"/v1/withdrawal/0x{hash:[a-fA-F0-9]{64}}"
,
b
.
l2IndexingService
.
GetWithdrawalStatus
)
.
Methods
(
"GET"
)
b
.
router
.
HandleFunc
(
"/v1/withdrawals/0x{address:[a-fA-F0-9]{40}}"
,
b
.
l2IndexingService
.
GetWithdrawals
)
.
Methods
(
"GET"
)
b
.
router
.
HandleFunc
(
"/v1/airdrops/0x{address:[a-fA-F0-9]{40}}"
,
b
.
airdropService
.
GetAirdrop
)
b
.
router
.
HandleFunc
(
"/healthz"
,
func
(
w
http
.
ResponseWriter
,
r
*
http
.
Request
)
{
...
...
indexer/services/l2/bridge/bridge.go
View file @
5a9928c0
...
...
@@ -7,75 +7,76 @@ import (
"github.com/ethereum-optimism/optimism/indexer/db"
"github.com/ethereum-optimism/optimism/op-bindings/bindings"
"github.com/ethereum-optimism/optimism/op-bindings/predeploys"
"github.com/ethereum/go-ethereum/ethclient"
"github.com/ethereum/go-ethereum/accounts/abi/bind"
"github.com/ethereum/go-ethereum/common"
)
type
DepositsMap
map
[
common
.
Hash
][]
db
.
Deposit
// Finalizations
type
WithdrawalsMap
map
[
common
.
Hash
][]
db
.
Withdrawal
type
Bridge
interface
{
Address
()
common
.
Address
GetDepositsByBlockRange
(
uint64
,
uint64
)
(
DepositsMap
,
error
)
GetWithdrawalsByBlockRange
(
uint64
,
uint64
)
(
WithdrawalsMap
,
error
)
GetWithdrawalsByBlockRange
(
context
.
Context
,
uint64
,
uint64
)
(
WithdrawalsMap
,
error
)
String
()
string
}
type
implConfig
struct
{
name
string
impl
string
addr
string
addr
common
.
Address
}
var
defaultBridgeCfgs
=
map
[
uint64
][]
*
implConfig
{
// Devnet
901
:
{
{
"Standard"
,
"StandardBridge"
,
L2StandardBridgeAddr
},
},
// Goerli Alpha Testnet
28528
:
{
{
"Standard"
,
"StandardBridge"
,
L2StandardBridgeAddr
},
},
var
defaultBridgeCfgs
=
[]
*
implConfig
{
{
"Standard"
,
"StandardBridge"
,
predeploys
.
L2StandardBridgeAddr
},
}
var
customBridgeCfgs
=
map
[
uint64
][]
*
implConfig
{
// Mainnet
10
:
{
{
"BitBTC"
,
StandardBridgeImpl
,
"0x158F513096923fF2d3aab2BcF4478536de6725e2"
},
{
"BitBTC"
,
StandardBridgeImpl
,
common
.
HexToAddress
(
"0x158F513096923fF2d3aab2BcF4478536de6725e2"
)
},
//{"DAI", "DAIBridge", "0x467194771dAe2967Aef3ECbEDD3Bf9a310C76C65"},
{
"wstETH"
,
StandardBridgeImpl
,
common
.
HexToAddress
(
"0x8E01013243a96601a86eb3153F0d9Fa4fbFb6957"
)},
},
// Kovan
69
:
{
{
"BitBTC"
,
StandardBridgeImpl
,
"0x0CFb46528a7002a7D8877a5F7a69b9AaF1A9058e"
},
{
"USX"
,
StandardBridgeImpl
,
"0xB4d37826b14Cd3CB7257A2A5094507d701fe715f"
},
{
"BitBTC"
,
StandardBridgeImpl
,
common
.
HexToAddress
(
"0x0CFb46528a7002a7D8877a5F7a69b9AaF1A9058e"
)},
{
"USX"
,
StandardBridgeImpl
,
common
.
HexToAddress
(
"0xB4d37826b14Cd3CB7257A2A5094507d701fe715f"
)},
{
"wstETH"
,
StandardBridgeImpl
,
common
.
HexToAddress
(
"0x2E34e7d705AfaC3C4665b6feF31Aa394A1c81c92"
)},
//{"DAI", " DAIBridge", "0x467194771dAe2967Aef3ECbEDD3Bf9a310C76C65"},
},
}
func
BridgesByChainID
(
chainID
*
big
.
Int
,
client
bind
.
ContractFilterer
,
ctx
context
.
Context
)
(
map
[
string
]
Bridge
,
error
)
{
func
BridgesByChainID
(
chainID
*
big
.
Int
,
client
*
ethclient
.
Client
,
isBedrock
bool
)
(
map
[
string
]
Bridge
,
error
)
{
allCfgs
:=
make
([]
*
implConfig
,
0
)
allCfgs
=
append
(
allCfgs
,
defaultBridgeCfgs
[
chainID
.
Uint64
()]
...
)
allCfgs
=
append
(
allCfgs
,
defaultBridgeCfgs
...
)
allCfgs
=
append
(
allCfgs
,
customBridgeCfgs
[
chainID
.
Uint64
()]
...
)
var
l2L1MP
*
bindings
.
L2ToL1MessagePasser
var
err
error
if
isBedrock
{
l2L1MP
,
err
=
bindings
.
NewL2ToL1MessagePasser
(
predeploys
.
L2ToL1MessagePasserAddr
,
client
)
if
err
!=
nil
{
return
nil
,
err
}
}
bridges
:=
make
(
map
[
string
]
Bridge
)
for
_
,
bridge
:=
range
allCfgs
{
switch
bridge
.
impl
{
case
"StandardBridge"
:
l2StandardBridgeAddress
:=
common
.
HexToAddress
(
bridge
.
addr
)
l2StandardBridgeFilter
,
err
:=
bindings
.
NewL2StandardBridgeFilterer
(
l2StandardBridgeAddress
,
client
)
l2SB
,
err
:=
bindings
.
NewL2StandardBridge
(
bridge
.
addr
,
client
)
if
err
!=
nil
{
return
nil
,
err
}
standardBridge
:=
&
StandardBridge
{
name
:
bridge
.
name
,
c
tx
:
ctx
,
address
:
l2StandardBridgeAddress
,
client
:
client
,
filterer
:
l2StandardBridgeFilter
,
bridges
[
bridge
.
name
]
=
&
StandardBridge
{
name
:
bridge
.
name
,
address
:
bridge
.
addr
,
c
lient
:
client
,
l2SB
:
l2SB
,
l2L1MP
:
l2L1MP
,
isBedrock
:
isBedrock
,
}
bridges
[
bridge
.
name
]
=
standardBridge
default
:
return
nil
,
errors
.
New
(
"unsupported bridge"
)
}
...
...
indexer/services/l2/bridge/filter.go
deleted
100644 → 0
View file @
475b2bfa
package
bridge
import
(
"context"
"time"
"github.com/ethereum-optimism/optimism/op-bindings/bindings"
"github.com/ethereum/go-ethereum/accounts/abi/bind"
)
// clientRetryInterval is the interval to wait between retrying client API
// calls.
var
clientRetryInterval
=
5
*
time
.
Second
// FilterWithdrawalInitiatedWithRetry retries the given func until it succeeds,
// waiting for clientRetryInterval duration after every call.
func
FilterWithdrawalInitiatedWithRetry
(
ctx
context
.
Context
,
filterer
*
bindings
.
L2StandardBridgeFilterer
,
opts
*
bind
.
FilterOpts
)
(
*
bindings
.
L2StandardBridgeWithdrawalInitiatedIterator
,
error
)
{
for
{
ctxt
,
cancel
:=
context
.
WithTimeout
(
ctx
,
DefaultConnectionTimeout
)
opts
.
Context
=
ctxt
res
,
err
:=
filterer
.
FilterWithdrawalInitiated
(
opts
,
nil
,
nil
,
nil
)
cancel
()
if
err
==
nil
{
return
res
,
nil
}
logger
.
Error
(
"Error fetching filter"
,
"err"
,
err
)
time
.
Sleep
(
clientRetryInterval
)
}
}
// FilterDepositFinalizedWithRetry retries the given func until it succeeds,
// waiting for clientRetryInterval duration after every call.
func
FilterDepositFinalizedWithRetry
(
ctx
context
.
Context
,
filterer
*
bindings
.
L2StandardBridgeFilterer
,
opts
*
bind
.
FilterOpts
)
(
*
bindings
.
L2StandardBridgeDepositFinalizedIterator
,
error
)
{
for
{
ctxt
,
cancel
:=
context
.
WithTimeout
(
ctx
,
DefaultConnectionTimeout
)
opts
.
Context
=
ctxt
res
,
err
:=
filterer
.
FilterDepositFinalized
(
opts
,
nil
,
nil
,
nil
)
cancel
()
if
err
==
nil
{
return
res
,
nil
}
logger
.
Error
(
"Error fetching filter"
,
"err"
,
err
)
time
.
Sleep
(
clientRetryInterval
)
}
}
indexer/services/l2/bridge/standard_bridge.go
View file @
5a9928c0
...
...
@@ -5,83 +5,112 @@ import (
"github.com/ethereum-optimism/optimism/indexer/db"
"github.com/ethereum-optimism/optimism/op-bindings/bindings"
"github.com/ethereum-optimism/optimism/op-node/withdrawals"
"github.com/ethereum-optimism/optimism/op-service/backoff"
"github.com/ethereum/go-ethereum/core/types"
"github.com/ethereum/go-ethereum/ethclient"
"github.com/ethereum/go-ethereum/accounts/abi/bind"
"github.com/ethereum/go-ethereum/common"
)
type
StandardBridge
struct
{
name
string
ctx
context
.
Context
address
common
.
Address
client
bind
.
ContractFilterer
filterer
*
bindings
.
L2StandardBridgeFilterer
name
string
address
common
.
Address
client
*
ethclient
.
Client
l2SB
*
bindings
.
L2StandardBridge
l2L1MP
*
bindings
.
L2ToL1MessagePasser
isBedrock
bool
}
func
(
s
*
StandardBridge
)
Address
()
common
.
Address
{
return
s
.
address
}
func
(
s
*
StandardBridge
)
GetDepositsByBlockRange
(
start
,
end
uint64
)
(
DepositsMap
,
error
)
{
depositsByBlockhash
:=
make
(
DepositsMap
)
func
(
s
*
StandardBridge
)
GetWithdrawalsByBlockRange
(
ctx
context
.
Context
,
start
,
end
uint64
)
(
WithdrawalsMap
,
error
)
{
withdrawalsByBlockhash
:=
make
(
map
[
common
.
Hash
][]
db
.
Withdrawal
)
opts
:=
&
bind
.
FilterOpts
{
Context
:
ctx
,
Start
:
start
,
End
:
&
end
,
}
iter
,
err
:=
FilterDepositFinalizedWithRetry
(
s
.
ctx
,
s
.
filterer
,
&
bind
.
FilterOpts
{
Start
:
start
,
End
:
&
end
,
var
iter
*
bindings
.
L2StandardBridgeWithdrawalInitiatedIterator
err
:=
backoff
.
Do
(
3
,
backoff
.
Exponential
(),
func
()
error
{
var
err
error
iter
,
err
=
s
.
l2SB
.
FilterWithdrawalInitiated
(
opts
,
nil
,
nil
,
nil
)
return
err
})
if
err
!=
nil
{
logger
.
Error
(
"Error fetching filter"
,
"err"
,
err
)
return
nil
,
err
}
receipts
:=
make
(
map
[
common
.
Hash
]
*
types
.
Receipt
)
defer
iter
.
Close
()
for
iter
.
Next
()
{
depositsByBlockhash
[
iter
.
Event
.
Raw
.
BlockHash
]
=
append
(
depositsByBlockhash
[
iter
.
Event
.
Raw
.
BlockHash
],
db
.
Deposit
{
TxHash
:
iter
.
Event
.
Raw
.
TxHash
,
L1Token
:
iter
.
Event
.
L1Token
,
L2Token
:
iter
.
Event
.
L2Token
,
FromAddress
:
iter
.
Event
.
From
,
ToAddress
:
iter
.
Event
.
To
,
Amount
:
iter
.
Event
.
Amount
,
Data
:
iter
.
Event
.
ExtraData
,
LogIndex
:
iter
.
Event
.
Raw
.
Index
,
})
}
if
err
:=
iter
.
Error
();
err
!=
nil
{
return
nil
,
err
}
ev
:=
iter
.
Event
if
s
.
isBedrock
{
receipt
:=
receipts
[
ev
.
Raw
.
TxHash
]
if
receipt
==
nil
{
receipt
,
err
=
s
.
client
.
TransactionReceipt
(
ctx
,
ev
.
Raw
.
TxHash
)
if
err
!=
nil
{
return
nil
,
err
}
receipts
[
ev
.
Raw
.
TxHash
]
=
receipt
}
return
depositsByBlockhash
,
nil
}
var
withdrawalInitiated
*
bindings
.
L2ToL1MessagePasserMessagePassed
for
_
,
eLog
:=
range
receipt
.
Logs
{
if
len
(
eLog
.
Topics
)
==
0
||
eLog
.
Topics
[
0
]
!=
withdrawals
.
MessagePassedTopic
{
continue
}
func
(
s
*
StandardBridge
)
GetWithdrawalsByBlockRange
(
start
,
end
uint64
)
(
WithdrawalsMap
,
error
)
{
withdrawalsByBlockhash
:=
make
(
map
[
common
.
Hash
][]
db
.
Withdrawal
)
if
withdrawalInitiated
!=
nil
{
logger
.
Warn
(
"detected multiple withdrawal initiated events! ignoring"
,
"tx_hash"
,
ev
.
Raw
.
TxHash
)
continue
}
iter
,
err
:=
FilterWithdrawalInitiatedWithRetry
(
s
.
ctx
,
s
.
filterer
,
&
bind
.
FilterOpts
{
Start
:
start
,
End
:
&
end
,
})
if
err
!=
nil
{
logger
.
Error
(
"Error fetching filter"
,
"err"
,
err
)
}
withdrawalInitiated
,
err
=
s
.
l2L1MP
.
ParseMessagePassed
(
*
eLog
)
if
err
!=
nil
{
return
nil
,
err
}
}
for
iter
.
Next
()
{
withdrawalsByBlockhash
[
iter
.
Event
.
Raw
.
BlockHash
]
=
append
(
withdrawalsByBlockhash
[
iter
.
Event
.
Raw
.
BlockHash
],
db
.
Withdrawal
{
TxHash
:
iter
.
Event
.
Raw
.
TxHash
,
L1Token
:
iter
.
Event
.
L1Token
,
L2Token
:
iter
.
Event
.
L2Token
,
FromAddress
:
iter
.
Event
.
From
,
ToAddress
:
iter
.
Event
.
To
,
Amount
:
iter
.
Event
.
Amount
,
Data
:
iter
.
Event
.
ExtraData
,
LogIndex
:
iter
.
Event
.
Raw
.
Index
,
})
}
if
err
:=
iter
.
Error
();
err
!=
nil
{
return
nil
,
err
hash
,
err
:=
withdrawals
.
WithdrawalHash
(
withdrawalInitiated
)
if
err
!=
nil
{
return
nil
,
err
}
withdrawalsByBlockhash
[
ev
.
Raw
.
BlockHash
]
=
append
(
withdrawalsByBlockhash
[
ev
.
Raw
.
BlockHash
],
db
.
Withdrawal
{
TxHash
:
ev
.
Raw
.
TxHash
,
L1Token
:
ev
.
L1Token
,
L2Token
:
ev
.
L2Token
,
FromAddress
:
ev
.
From
,
ToAddress
:
ev
.
To
,
Amount
:
ev
.
Amount
,
Data
:
ev
.
ExtraData
,
LogIndex
:
ev
.
Raw
.
Index
,
BedrockHash
:
&
hash
,
},
)
}
else
{
withdrawalsByBlockhash
[
ev
.
Raw
.
BlockHash
]
=
append
(
withdrawalsByBlockhash
[
ev
.
Raw
.
BlockHash
],
db
.
Withdrawal
{
TxHash
:
ev
.
Raw
.
TxHash
,
L1Token
:
ev
.
L1Token
,
L2Token
:
ev
.
L2Token
,
FromAddress
:
ev
.
From
,
ToAddress
:
ev
.
To
,
Amount
:
ev
.
Amount
,
Data
:
ev
.
ExtraData
,
LogIndex
:
ev
.
Raw
.
Index
,
},
)
}
}
return
withdrawalsByBlockhash
,
nil
return
withdrawalsByBlockhash
,
iter
.
Error
()
}
func
(
s
*
StandardBridge
)
String
()
string
{
...
...
indexer/services/l2/confirmed_headers.go
View file @
5a9928c0
...
...
@@ -147,8 +147,7 @@ func (f *ConfirmedHeaderSelector) NewHead(
return
headers
,
nil
}
func
NewConfirmedHeaderSelector
(
cfg
HeaderSelectorConfig
)
(
*
ConfirmedHeaderSelector
,
error
)
{
func
NewConfirmedHeaderSelector
(
cfg
HeaderSelectorConfig
)
(
*
ConfirmedHeaderSelector
,
error
)
{
if
cfg
.
ConfDepth
==
0
{
return
nil
,
errors
.
New
(
"ConfDepth must be greater than zero"
)
}
...
...
indexer/services/l2/query.go
deleted
100644 → 0
View file @
475b2bfa
package
l2
import
(
"github.com/ethereum-optimism/optimism/indexer/db"
"github.com/ethereum-optimism/optimism/op-bindings/bindings"
"github.com/ethereum/go-ethereum/accounts/abi/bind"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/ethclient"
)
func
QueryERC20
(
address
common
.
Address
,
client
*
ethclient
.
Client
)
(
*
db
.
Token
,
error
)
{
contract
,
err
:=
bindings
.
NewERC20
(
address
,
client
)
if
err
!=
nil
{
return
nil
,
err
}
name
,
err
:=
contract
.
Name
(
&
bind
.
CallOpts
{})
if
err
!=
nil
{
return
nil
,
err
}
symbol
,
err
:=
contract
.
Symbol
(
&
bind
.
CallOpts
{})
if
err
!=
nil
{
return
nil
,
err
}
decimals
,
err
:=
contract
.
Decimals
(
&
bind
.
CallOpts
{})
if
err
!=
nil
{
return
nil
,
err
}
return
&
db
.
Token
{
Name
:
name
,
Symbol
:
symbol
,
Decimals
:
decimals
,
},
nil
}
indexer/services/l2/service.go
View file @
5a9928c0
This diff is collapsed.
Click to expand it.
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