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
e552edee
Unverified
Commit
e552edee
authored
Sep 06, 2023
by
mergify[bot]
Committed by
GitHub
Sep 06, 2023
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'develop' into aj/cannon-invalid-output-root
parents
fdfa5df3
eb1d3f50
Changes
12
Hide whitespace changes
Inline
Side-by-side
Showing
12 changed files
with
299 additions
and
487 deletions
+299
-487
api.go
indexer/api/api.go
+84
-12
api_test.go
indexer/api/api_test.go
+13
-3
cli.go
indexer/cmd/indexer/cli.go
+2
-2
blocks.go
indexer/database/blocks.go
+1
-1
bridge_transactions.go
indexer/database/bridge_transactions.go
+56
-0
l1_etl.go
indexer/etl/l1_etl.go
+2
-2
indexer.toml
indexer/indexer.toml
+9
-5
bridge.go
indexer/processors/bridge.go
+39
-31
l1_bridge_processor.go
indexer/processors/bridge/l1_bridge_processor.go
+0
-78
l2_bridge_processor.go
indexer/processors/bridge/l2_bridge_processor.go
+0
-70
schema.prisma
indexer/ui/schema.prisma
+73
-74
pnpm-lock.yaml
pnpm-lock.yaml
+20
-209
No files found.
indexer/api/api.go
View file @
e552edee
...
...
@@ -4,42 +4,114 @@ import (
"context"
"fmt"
"net/http"
"runtime/debug"
"sync"
"github.com/ethereum-optimism/optimism/indexer/api/routes"
"github.com/ethereum-optimism/optimism/indexer/config"
"github.com/ethereum-optimism/optimism/indexer/database"
"github.com/ethereum-optimism/optimism/op-service/httputil"
"github.com/ethereum-optimism/optimism/op-service/metrics"
"github.com/ethereum/go-ethereum/log"
"github.com/go-chi/chi/v5"
"github.com/go-chi/chi/v5/middleware"
"github.com/prometheus/client_golang/prometheus"
)
const
ethereumAddressRegex
=
`^0x[a-fA-F0-9]{40}$`
type
Api
struct
{
log
log
.
Logger
Router
*
chi
.
Mux
log
log
.
Logger
Router
*
chi
.
Mux
serverConfig
config
.
ServerConfig
metricsConfig
config
.
ServerConfig
metricsRegistry
*
prometheus
.
Registry
}
func
NewApi
(
logger
log
.
Logger
,
bv
database
.
BridgeTransfersView
)
*
Api
{
r
:=
chi
.
NewRouter
()
h
:=
routes
.
NewRoutes
(
logger
,
bv
,
r
)
const
(
MetricsNamespace
=
"op_indexer"
)
func
chiMetricsMiddleware
(
rec
metrics
.
HTTPRecorder
)
func
(
http
.
Handler
)
http
.
Handler
{
return
func
(
next
http
.
Handler
)
http
.
Handler
{
return
metrics
.
NewHTTPRecordingMiddleware
(
rec
,
next
)
}
}
func
NewApi
(
logger
log
.
Logger
,
bv
database
.
BridgeTransfersView
,
serverConfig
config
.
ServerConfig
,
metricsConfig
config
.
ServerConfig
)
*
Api
{
apiRouter
:=
chi
.
NewRouter
()
h
:=
routes
.
NewRoutes
(
logger
,
bv
,
apiRouter
)
mr
:=
metrics
.
NewRegistry
()
promRecorder
:=
metrics
.
NewPromHTTPRecorder
(
mr
,
MetricsNamespace
)
apiRouter
.
Use
(
chiMetricsMiddleware
(
promRecorder
))
apiRouter
.
Use
(
middleware
.
Recoverer
)
apiRouter
.
Use
(
middleware
.
Heartbeat
(
"/healthz"
))
apiRouter
.
Get
(
fmt
.
Sprintf
(
"/api/v0/deposits/{address:%s}"
,
ethereumAddressRegex
),
h
.
L1DepositsHandler
)
apiRouter
.
Get
(
fmt
.
Sprintf
(
"/api/v0/withdrawals/{address:%s}"
,
ethereumAddressRegex
),
h
.
L2WithdrawalsHandler
)
return
&
Api
{
log
:
logger
,
Router
:
apiRouter
,
metricsRegistry
:
mr
,
serverConfig
:
serverConfig
,
metricsConfig
:
metricsConfig
}
}
func
(
a
*
Api
)
Start
(
ctx
context
.
Context
)
error
{
var
wg
sync
.
WaitGroup
errCh
:=
make
(
chan
error
,
2
)
processCtx
,
processCancel
:=
context
.
WithCancel
(
ctx
)
runProcess
:=
func
(
start
func
(
ctx
context
.
Context
)
error
)
{
wg
.
Add
(
1
)
go
func
()
{
defer
func
()
{
if
err
:=
recover
();
err
!=
nil
{
a
.
log
.
Error
(
"halting api on panic"
,
"err"
,
err
)
debug
.
PrintStack
()
errCh
<-
fmt
.
Errorf
(
"panic: %v"
,
err
)
}
processCancel
()
wg
.
Done
()
}()
r
.
Use
(
middleware
.
Heartbeat
(
"/healthz"
))
errCh
<-
start
(
processCtx
)
}()
}
runProcess
(
a
.
startServer
)
runProcess
(
a
.
startMetricsServer
)
wg
.
Wait
()
err
:=
<-
errCh
if
err
!=
nil
{
a
.
log
.
Error
(
"api stopped"
,
"err"
,
err
)
}
else
{
a
.
log
.
Info
(
"api stopped"
)
}
r
.
Get
(
fmt
.
Sprintf
(
"/api/v0/deposits/{address:%s}"
,
ethereumAddressRegex
),
h
.
L1DepositsHandler
)
r
.
Get
(
fmt
.
Sprintf
(
"/api/v0/withdrawals/{address:%s}"
,
ethereumAddressRegex
),
h
.
L2WithdrawalsHandler
)
return
&
Api
{
log
:
logger
,
Router
:
r
}
return
err
}
func
(
a
*
Api
)
Listen
(
ctx
context
.
Context
,
port
in
t
)
error
{
a
.
log
.
Info
(
"api server listening..."
,
"port"
,
p
ort
)
server
:=
http
.
Server
{
Addr
:
fmt
.
Sprintf
(
":%d"
,
p
ort
),
Handler
:
a
.
Router
}
func
(
a
*
Api
)
startServer
(
ctx
context
.
Contex
t
)
error
{
a
.
log
.
Info
(
"api server listening..."
,
"port"
,
a
.
serverConfig
.
P
ort
)
server
:=
http
.
Server
{
Addr
:
fmt
.
Sprintf
(
":%d"
,
a
.
serverConfig
.
P
ort
),
Handler
:
a
.
Router
}
err
:=
httputil
.
ListenAndServeContext
(
ctx
,
&
server
)
if
err
!=
nil
{
a
.
log
.
Error
(
"api server stopped"
,
"err"
,
err
)
}
else
{
a
.
log
.
Info
(
"api server stopped"
)
}
return
err
}
func
(
a
*
Api
)
startMetricsServer
(
ctx
context
.
Context
)
error
{
a
.
log
.
Info
(
"starting metrics server..."
,
"port"
,
a
.
metricsConfig
.
Port
)
err
:=
metrics
.
ListenAndServe
(
ctx
,
a
.
metricsRegistry
,
a
.
metricsConfig
.
Host
,
a
.
metricsConfig
.
Port
)
if
err
!=
nil
{
a
.
log
.
Error
(
"metrics server stopped"
,
"err"
,
err
)
}
else
{
a
.
log
.
Info
(
"metrics server stopped"
)
}
return
err
}
indexer/api/api_test.go
View file @
e552edee
...
...
@@ -6,6 +6,7 @@ import (
"net/http/httptest"
"testing"
"github.com/ethereum-optimism/optimism/indexer/config"
"github.com/ethereum-optimism/optimism/indexer/database"
"github.com/ethereum-optimism/optimism/op-node/testlog"
"github.com/ethereum/go-ethereum/common"
...
...
@@ -18,6 +19,15 @@ type MockBridgeTransfersView struct{}
var
mockAddress
=
"0x4204204204204204204204204204204204204204"
var
apiConfig
=
config
.
ServerConfig
{
Host
:
"localhost"
,
Port
:
8080
,
}
var
metricsConfig
=
config
.
ServerConfig
{
Host
:
"localhost"
,
Port
:
7300
,
}
var
(
deposit
=
database
.
L1BridgeDeposit
{
TransactionSourceHash
:
common
.
HexToHash
(
"abc"
),
...
...
@@ -77,7 +87,7 @@ func (mbv *MockBridgeTransfersView) L2BridgeWithdrawalsByAddress(address common.
}
func
TestHealthz
(
t
*
testing
.
T
)
{
logger
:=
testlog
.
Logger
(
t
,
log
.
LvlInfo
)
api
:=
NewApi
(
logger
,
&
MockBridgeTransfersView
{})
api
:=
NewApi
(
logger
,
&
MockBridgeTransfersView
{}
,
apiConfig
,
metricsConfig
)
request
,
err
:=
http
.
NewRequest
(
"GET"
,
"/healthz"
,
nil
)
assert
.
Nil
(
t
,
err
)
...
...
@@ -89,7 +99,7 @@ func TestHealthz(t *testing.T) {
func
TestL1BridgeDepositsHandler
(
t
*
testing
.
T
)
{
logger
:=
testlog
.
Logger
(
t
,
log
.
LvlInfo
)
api
:=
NewApi
(
logger
,
&
MockBridgeTransfersView
{})
api
:=
NewApi
(
logger
,
&
MockBridgeTransfersView
{}
,
apiConfig
,
metricsConfig
)
request
,
err
:=
http
.
NewRequest
(
"GET"
,
fmt
.
Sprintf
(
"/api/v0/deposits/%s"
,
mockAddress
),
nil
)
assert
.
Nil
(
t
,
err
)
...
...
@@ -101,7 +111,7 @@ func TestL1BridgeDepositsHandler(t *testing.T) {
func
TestL2BridgeWithdrawalsByAddressHandler
(
t
*
testing
.
T
)
{
logger
:=
testlog
.
Logger
(
t
,
log
.
LvlInfo
)
api
:=
NewApi
(
logger
,
&
MockBridgeTransfersView
{})
api
:=
NewApi
(
logger
,
&
MockBridgeTransfersView
{}
,
apiConfig
,
metricsConfig
)
request
,
err
:=
http
.
NewRequest
(
"GET"
,
fmt
.
Sprintf
(
"/api/v0/withdrawals/%s"
,
mockAddress
),
nil
)
assert
.
Nil
(
t
,
err
)
...
...
indexer/cmd/indexer/cli.go
View file @
e552edee
...
...
@@ -62,8 +62,8 @@ func runApi(ctx *cli.Context) error {
}
defer
db
.
Close
()
api
:=
api
.
NewApi
(
log
,
db
.
BridgeTransfers
)
return
api
.
Listen
(
ctx
.
Context
,
cfg
.
HTTPServer
.
Por
t
)
api
:=
api
.
NewApi
(
log
,
db
.
BridgeTransfers
,
cfg
.
HTTPServer
,
cfg
.
MetricsServer
)
return
api
.
Start
(
ctx
.
Contex
t
)
}
func
runAll
(
ctx
*
cli
.
Context
)
error
{
...
...
indexer/database/blocks.go
View file @
e552edee
...
...
@@ -233,7 +233,7 @@ func (db *blocksDB) LatestEpoch() (*Epoch, error) {
// L2 for a faster query. Per the protocol, the L2 block that starts a new epoch
// will have a matching timestamp with the L1 origin.
query
:=
db
.
gorm
.
Table
(
"l1_block_headers"
)
.
Order
(
"l1_block_headers.timestamp DESC"
)
query
=
query
.
Joins
(
"INNER JOIN l2_block_headers ON l
1_block_headers.timestamp = l2
_block_headers.timestamp"
)
query
=
query
.
Joins
(
"INNER JOIN l2_block_headers ON l
2_block_headers.timestamp = l1
_block_headers.timestamp"
)
query
=
query
.
Select
(
"*"
)
var
epoch
Epoch
...
...
indexer/database/bridge_transactions.go
View file @
e552edee
...
...
@@ -47,7 +47,10 @@ type L2TransactionWithdrawal struct {
type
BridgeTransactionsView
interface
{
L1TransactionDeposit
(
common
.
Hash
)
(
*
L1TransactionDeposit
,
error
)
L1LatestBlockHeader
()
(
*
L1BlockHeader
,
error
)
L2TransactionWithdrawal
(
common
.
Hash
)
(
*
L2TransactionWithdrawal
,
error
)
L2LatestBlockHeader
()
(
*
L2BlockHeader
,
error
)
}
type
BridgeTransactionsDB
interface
{
...
...
@@ -94,6 +97,37 @@ func (db *bridgeTransactionsDB) L1TransactionDeposit(sourceHash common.Hash) (*L
return
&
deposit
,
nil
}
func
(
db
*
bridgeTransactionsDB
)
L1LatestBlockHeader
()
(
*
L1BlockHeader
,
error
)
{
// Markers for an indexed bridge event
// L1: Latest Transaction Deposit, Latest Proven/Finalized Withdrawal
l1DepositQuery
:=
db
.
gorm
.
Table
(
"l1_transaction_deposits"
)
.
Order
(
"l1_transaction_deposits.timestamp DESC"
)
.
Limit
(
1
)
l1DepositQuery
=
l1DepositQuery
.
Joins
(
"INNER JOIN l1_contract_events ON l1_contract_events.guid = l1_transaction_deposits.initiated_l1_event_guid"
)
l1DepositQuery
=
l1DepositQuery
.
Select
(
"l1_contract_events.*"
)
l1ProvenQuery
:=
db
.
gorm
.
Table
(
"l2_transaction_withdrawals"
)
l1ProvenQuery
=
l1ProvenQuery
.
Joins
(
"INNER JOIN l1_contract_events ON l1_contract_events.guid = l2_transaction_withdrawals.proven_l1_event_guid"
)
l1ProvenQuery
=
l1ProvenQuery
.
Order
(
"l1_contract_events.timestamp DESC"
)
.
Select
(
"l1_contract_events.*"
)
.
Limit
(
1
)
l1FinalizedQuery
:=
db
.
gorm
.
Table
(
"l2_transaction_withdrawals"
)
l1FinalizedQuery
=
l1FinalizedQuery
.
Joins
(
"INNER JOIN l1_contract_events ON l1_contract_events.guid = l2_transaction_withdrawals.proven_l1_event_guid"
)
l1FinalizedQuery
=
l1FinalizedQuery
.
Order
(
"l1_contract_events.timestamp DESC"
)
.
Select
(
"l1_contract_events.*"
)
.
Limit
(
1
)
l1Query
:=
db
.
gorm
.
Table
(
"((?) UNION (?) UNION (?)) AS latest_bridge_events"
,
l1DepositQuery
.
Limit
(
1
),
l1ProvenQuery
,
l1FinalizedQuery
)
l1Query
=
l1Query
.
Joins
(
"INNER JOIN l1_block_headers ON l1_block_headers.hash = latest_bridge_events.block_hash"
)
l1Query
=
l1Query
.
Order
(
"l1_block_headers.number DESC"
)
.
Select
(
"l1_block_headers.*"
)
var
l1Header
L1BlockHeader
result
:=
l1Query
.
Take
(
&
l1Header
)
if
result
.
Error
!=
nil
{
if
errors
.
Is
(
result
.
Error
,
gorm
.
ErrRecordNotFound
)
{
return
nil
,
nil
}
return
nil
,
result
.
Error
}
return
&
l1Header
,
nil
}
/**
* Transactions withdrawn from L2
*/
...
...
@@ -149,3 +183,25 @@ func (db *bridgeTransactionsDB) MarkL2TransactionWithdrawalFinalizedEvent(withdr
result
:=
db
.
gorm
.
Save
(
&
withdrawal
)
return
result
.
Error
}
func
(
db
*
bridgeTransactionsDB
)
L2LatestBlockHeader
()
(
*
L2BlockHeader
,
error
)
{
// L2: Inclusion of the latest deposit
l1DepositQuery
:=
db
.
gorm
.
Table
(
"l1_transaction_deposits"
)
.
Order
(
"l1_transaction_deposits.timestamp DESC"
)
l1DepositQuery
=
l1DepositQuery
.
Joins
(
"INNER JOIN l1_contract_events ON l1_contract_events.guid = l1_transaction_deposits.initiated_l1_event_guid"
)
l1DepositQuery
=
l1DepositQuery
.
Select
(
"l1_contract_events.*"
)
l2Query
:=
db
.
gorm
.
Table
(
"(?) AS l1_deposit_events"
,
l1DepositQuery
)
l2Query
=
l2Query
.
Joins
(
"INNER JOIN l2_block_headers ON l2_block_headers.timestamp = l1_deposit_events.timestamp"
)
l2Query
=
l2Query
.
Select
(
"l2_block_headers.*"
)
var
l2Header
L2BlockHeader
result
:=
l2Query
.
Take
(
&
l2Header
)
if
result
.
Error
!=
nil
{
if
errors
.
Is
(
result
.
Error
,
gorm
.
ErrRecordNotFound
)
{
return
nil
,
nil
}
return
nil
,
result
.
Error
}
return
&
l2Header
,
nil
}
indexer/etl/l1_etl.go
View file @
e552edee
...
...
@@ -44,7 +44,7 @@ func NewL1ETL(cfg Config, log log.Logger, db *database.DB, metrics Metricer, cli
fromHeader
=
latestHeader
.
RLPHeader
.
Header
()
}
else
if
cfg
.
StartHeight
.
BitLen
()
>
0
{
log
.
Info
(
"no indexed state
in storage,
starting from supplied L1 height"
,
"height"
,
cfg
.
StartHeight
.
String
())
log
.
Info
(
"no indexed state starting from supplied L1 height"
,
"height"
,
cfg
.
StartHeight
.
String
())
header
,
err
:=
client
.
BlockHeaderByNumber
(
cfg
.
StartHeight
)
if
err
!=
nil
{
return
nil
,
fmt
.
Errorf
(
"could not fetch starting block header: %w"
,
err
)
...
...
@@ -53,7 +53,7 @@ func NewL1ETL(cfg Config, log log.Logger, db *database.DB, metrics Metricer, cli
fromHeader
=
header
}
else
{
log
.
Info
(
"no indexed state
in storage, starting from L1
genesis"
)
log
.
Info
(
"no indexed state
, starting from
genesis"
)
}
// NOTE - The use of un-buffered channel here assumes that downstream consumers
...
...
indexer/indexer.toml
View file @
e552edee
...
...
@@ -22,11 +22,15 @@ l1-rpc = "${INDEXER_RPC_URL_L1}"
l2-rpc
=
"${INDEXER_RPC_URL_L2}"
[db]
host
=
"postgres"
port
=
5432
user
=
"db_username"
password
=
"db_password"
name
=
"db_name"
host
=
"$INDEXER_DB_HOST"
# this port may be problematic once we depoly
# the DATABASE_URL looks like this for previous services and didn't include a port
# DATABASE_URL="postgresql://${INDEXER_DB_USER}:${INDEXER_DB_PASS}@localhost/${INDEXER_DB_NAME}?host=${INDEXER_DB_HOST}"
# If not problematic delete these comments
port
=
$INDEXER_DB_PORT
user
=
"$INDEXER_DB_USER"
password
=
"$INDEXER_DB_PASS"
name
=
"$INDEXER_DB_NAME"
[http]
host
=
"127.0.0.1"
...
...
indexer/processors/bridge.go
View file @
e552edee
...
...
@@ -29,35 +29,32 @@ type BridgeProcessor struct {
func
NewBridgeProcessor
(
log
log
.
Logger
,
db
*
database
.
DB
,
l1Etl
*
etl
.
L1ETL
,
chainConfig
config
.
ChainConfig
)
(
*
BridgeProcessor
,
error
)
{
log
=
log
.
New
(
"processor"
,
"bridge"
)
latestL1Header
,
err
:=
bridge
.
L1LatestBridgeEventHeader
(
db
,
chainConfig
)
latestL1Header
,
err
:=
db
.
BridgeTransactions
.
L1LatestBlockHeader
(
)
if
err
!=
nil
{
return
nil
,
err
}
latestL2Header
,
err
:=
bridge
.
L2LatestBridgeEventHeader
(
db
)
latestL2Header
,
err
:=
db
.
BridgeTransactions
.
L2LatestBlockHeader
(
)
if
err
!=
nil
{
return
nil
,
err
}
// Since the bridge processor indexes events based on epochs, there's
// no scenario in which we have indexed L2 data with no L1 data.
//
// NOTE: Technically there is an exception if our bridging contracts are
// used to bridges native from L2 and an op-chain happens to launch where
// only L2 native bridge events have occurred. This is a rare situation now
// and it's worth the assertion as an integrity check. We can revisit this
// as more chains launch with primarily L2-native activity.
if
latestL1Header
==
nil
&&
latestL2Header
!=
nil
{
log
.
Error
(
"detected indexed L2 bridge activity with no indexed L1 state"
,
"l2_block_number"
,
latestL2Header
.
Number
)
return
nil
,
errors
.
New
(
"detected indexed L2 bridge activity with no indexed L1 state"
)
}
var
l1Header
,
l2Header
*
types
.
Header
if
latestL1Header
==
nil
&&
latestL2Header
==
nil
{
log
.
Info
(
"no indexed state, starting from genesis"
)
log
.
Info
(
"no indexed state, starting from
rollup
genesis"
)
}
else
{
log
.
Info
(
"detected the latest indexed state"
,
"l1_block_number"
,
latestL1Header
.
Number
,
"l2_block_number"
,
latestL2Header
.
Number
)
l1Height
,
l2Height
:=
big
.
NewInt
(
0
),
big
.
NewInt
(
0
)
if
latestL1Header
!=
nil
{
l1Height
=
latestL1Header
.
Number
l1Header
=
latestL1Header
.
RLPHeader
.
Header
()
}
if
latestL2Header
!=
nil
{
l2Height
=
latestL2Header
.
Number
l2Header
=
latestL2Header
.
RLPHeader
.
Header
()
}
log
.
Info
(
"detected latest indexed state"
,
"l1_block_number"
,
l1Height
,
"l2_block_number"
,
l2Height
)
}
return
&
BridgeProcessor
{
log
,
db
,
l1Etl
,
chainConfig
,
l
atestL1Header
,
latestL
2Header
},
nil
return
&
BridgeProcessor
{
log
,
db
,
l1Etl
,
chainConfig
,
l
1Header
,
l
2Header
},
nil
}
func
(
b
*
BridgeProcessor
)
Start
(
ctx
context
.
Context
)
error
{
...
...
@@ -83,29 +80,40 @@ func (b *BridgeProcessor) Start(ctx context.Context) error {
latestEpoch
,
err
:=
b
.
db
.
Blocks
.
LatestEpoch
()
if
err
!=
nil
{
return
err
}
if
latestEpoch
==
nil
{
if
b
.
LatestL1Header
!=
nil
{
// Once we have some state `latestEpoch` should never return nil.
b
.
log
.
Error
(
"started with indexed bridge state, but no latest epoch returned"
,
"latest_bridge_l1_block_number"
,
b
.
LatestL1Header
.
Number
)
return
errors
.
New
(
"started with indexed bridge state, but no blocks epochs returned"
)
}
else
{
b
.
log
.
Warn
(
"no indexed epochs. waiting..."
)
continue
}
else
if
latestEpoch
==
nil
{
if
b
.
LatestL1Header
!=
nil
||
b
.
LatestL2Header
!=
nil
{
// Once we have some indexed state `latestEpoch` can never return nil
b
.
log
.
Error
(
"bridge events indexed, but no indexed epoch returned"
,
"latest_bridge_l1_block_number"
,
b
.
LatestL1Header
.
Number
)
return
errors
.
New
(
"bridge events indexed, but no indexed epoch returned"
)
}
b
.
log
.
Warn
(
"no indexed epochs available. waiting..."
)
continue
}
// Integrity Checks
if
b
.
LatestL1Header
!=
nil
&&
latestEpoch
.
L1BlockHeader
.
Hash
==
b
.
LatestL1Header
.
Hash
()
{
// Marked as a warning since the bridge should always be processing at least 1 new epoch
b
.
log
.
Warn
(
"all available epochs indexed by the bridge"
,
"latest_epoch_number"
,
b
.
LatestL1Header
.
Number
)
b
.
log
.
Warn
(
"all available epochs indexed"
,
"latest_bridge_l1_block_number"
,
b
.
LatestL1Header
.
Number
)
continue
}
if
b
.
LatestL1Header
!=
nil
&&
latestEpoch
.
L1BlockHeader
.
Number
.
Cmp
(
b
.
LatestL1Header
.
Number
)
<=
0
{
b
.
log
.
Error
(
"non-increasing l1 block height observed"
,
"latest_bridge_l1_block_number"
,
b
.
LatestL1Header
.
Number
,
"latest_epoch_number"
,
latestEpoch
.
L1BlockHeader
.
Number
)
return
errors
.
New
(
"non-increasing l1 block heght observed"
)
}
if
b
.
LatestL2Header
!=
nil
&&
latestEpoch
.
L2BlockHeader
.
Number
.
Cmp
(
b
.
LatestL2Header
.
Number
)
<=
0
{
b
.
log
.
Error
(
"non-increasing l2 block height observed"
,
"latest_bridge_l2_block_number"
,
b
.
LatestL2Header
.
Number
,
"latest_epoch_number"
,
latestEpoch
.
L2BlockHeader
.
Number
)
return
errors
.
New
(
"non-increasing l2 block heght observed"
)
}
// Process Bridge Events
toL1Height
,
toL2Height
:=
latestEpoch
.
L1BlockHeader
.
Number
,
latestEpoch
.
L2BlockHeader
.
Number
fromL1Height
,
fromL2Height
:=
big
.
NewInt
(
0
),
big
.
NewInt
(
0
)
if
b
.
LatestL1Header
!=
nil
{
// `NewBridgeProcessor` ensures that LatestL2Header must not be nil if LatestL1Header is set
fromL1Height
=
new
(
big
.
Int
)
.
Add
(
b
.
LatestL1Header
.
Number
,
big
.
NewInt
(
1
))
}
if
b
.
LatestL2Header
!=
nil
{
fromL2Height
=
new
(
big
.
Int
)
.
Add
(
b
.
LatestL2Header
.
Number
,
big
.
NewInt
(
1
))
}
...
...
@@ -139,7 +147,7 @@ func (b *BridgeProcessor) Start(ctx context.Context) error {
// Try again on a subsequent interval
batchLog
.
Error
(
"unable to index new bridge events"
,
"err"
,
err
)
}
else
{
batchLog
.
Info
(
"done indexing
new
bridge events"
,
"latest_l1_block_number"
,
toL1Height
,
"latest_l2_block_number"
,
toL2Height
)
batchLog
.
Info
(
"done indexing bridge events"
,
"latest_l1_block_number"
,
toL1Height
,
"latest_l2_block_number"
,
toL2Height
)
b
.
LatestL1Header
=
latestEpoch
.
L1BlockHeader
.
RLPHeader
.
Header
()
b
.
LatestL2Header
=
latestEpoch
.
L2BlockHeader
.
RLPHeader
.
Header
()
}
...
...
indexer/processors/bridge/l1_bridge_processor.go
View file @
e552edee
...
...
@@ -8,7 +8,6 @@ import (
"github.com/ethereum-optimism/optimism/indexer/config"
"github.com/ethereum-optimism/optimism/indexer/database"
"github.com/ethereum-optimism/optimism/indexer/processors/contracts"
"github.com/ethereum-optimism/optimism/op-bindings/bindings"
"github.com/ethereum/go-ethereum/core/types"
"github.com/ethereum/go-ethereum/log"
...
...
@@ -233,80 +232,3 @@ func L1ProcessFinalizedBridgeEvents(log log.Logger, db *database.DB, chainConfig
// a-ok!
return
nil
}
// L1LatestBridgeEventHeader returns the latest header for which and on-chain event
// has been observed on L1 -- Both initiated L1 events and finalization markers on L2.
func
L1LatestBridgeEventHeader
(
db
*
database
.
DB
,
chainConfig
config
.
ChainConfig
)
(
*
types
.
Header
,
error
)
{
portalAbi
,
err
:=
bindings
.
OptimismPortalMetaData
.
GetAbi
()
if
err
!=
nil
{
return
nil
,
err
}
depositEventID
:=
portalAbi
.
Events
[
"TransactionDeposited"
]
.
ID
provenEventID
:=
portalAbi
.
Events
[
"WithdrawalProven"
]
.
ID
finalizedEventID
:=
portalAbi
.
Events
[
"WithdrawalFinalized"
]
.
ID
// (1) Initiated L1 Events
// Since all initaited bridge events eventually reach the OptimismPortal to
// conduct the deposit, we can simply look for the last deposited transaction
// event on L2.
var
latestDepositHeader
*
types
.
Header
contractEventFilter
:=
database
.
ContractEvent
{
ContractAddress
:
chainConfig
.
L1Contracts
.
OptimismPortalProxy
,
EventSignature
:
depositEventID
}
depositEvent
,
err
:=
db
.
ContractEvents
.
L1LatestContractEventWithFilter
(
contractEventFilter
)
if
err
!=
nil
{
return
nil
,
err
}
if
depositEvent
!=
nil
{
l1BlockHeader
,
err
:=
db
.
Blocks
.
L1BlockHeader
(
depositEvent
.
BlockHash
)
if
err
!=
nil
{
return
nil
,
err
}
if
l1BlockHeader
!=
nil
{
latestDepositHeader
=
l1BlockHeader
.
RLPHeader
.
Header
()
}
}
// (2) Finalization markers for L2
// Like initiated L1 events, all withdrawals must flow through the OptimismPortal
// contract. We must look for both proven and finalized withdrawal events.
var
latestWithdrawHeader
*
types
.
Header
contractEventFilter
.
EventSignature
=
finalizedEventID
withdrawEvent
,
err
:=
db
.
ContractEvents
.
L1LatestContractEventWithFilter
(
contractEventFilter
)
if
err
!=
nil
{
return
nil
,
err
}
if
withdrawEvent
!=
nil
{
// Check if a have a later detected proven event
contractEventFilter
.
EventSignature
=
provenEventID
provenEvent
,
err
:=
db
.
ContractEvents
.
L1LatestContractEventWithFilter
(
contractEventFilter
)
if
err
!=
nil
{
return
nil
,
err
}
if
provenEvent
!=
nil
&&
provenEvent
.
Timestamp
>
withdrawEvent
.
Timestamp
{
withdrawEvent
=
provenEvent
}
l1BlockHeader
,
err
:=
db
.
Blocks
.
L1BlockHeader
(
withdrawEvent
.
BlockHash
)
if
err
!=
nil
{
return
nil
,
err
}
latestWithdrawHeader
=
l1BlockHeader
.
RLPHeader
.
Header
()
}
if
latestDepositHeader
==
nil
{
// If there has been no seen deposits yet, there could have been no seen withdrawals
if
latestWithdrawHeader
!=
nil
{
return
nil
,
errors
.
New
(
"detected an indexed withdrawal without any deposits"
)
}
return
nil
,
nil
}
else
if
latestWithdrawHeader
==
nil
{
return
latestDepositHeader
,
nil
}
else
{
// both deposits & withdrawals have occurred
if
latestDepositHeader
.
Time
>
latestWithdrawHeader
.
Time
{
return
latestDepositHeader
,
nil
}
else
{
return
latestWithdrawHeader
,
nil
}
}
}
indexer/processors/bridge/l2_bridge_processor.go
View file @
e552edee
...
...
@@ -7,10 +7,8 @@ import (
"github.com/ethereum-optimism/optimism/indexer/database"
"github.com/ethereum-optimism/optimism/indexer/processors/contracts"
"github.com/ethereum-optimism/optimism/op-bindings/bindings"
"github.com/ethereum-optimism/optimism/op-bindings/predeploys"
"github.com/ethereum/go-ethereum/core/types"
"github.com/ethereum/go-ethereum/log"
)
...
...
@@ -182,71 +180,3 @@ func L2ProcessFinalizedBridgeEvents(log log.Logger, db *database.DB, fromHeight
// a-ok!
return
nil
}
// L2LatestBridgeEventHeader returns the latest header for which and on-chain event
// has been observed on L2 -- Both initiated L2 events and finalization markers from L1.
func
L2LatestBridgeEventHeader
(
db
*
database
.
DB
)
(
*
types
.
Header
,
error
)
{
l2ToL1MessagePasserAbi
,
err
:=
bindings
.
L2ToL1MessagePasserMetaData
.
GetAbi
()
if
err
!=
nil
{
return
nil
,
err
}
crossDomainMessengerAbi
,
err
:=
bindings
.
CrossDomainMessengerMetaData
.
GetAbi
()
if
err
!=
nil
{
return
nil
,
err
}
messagePassedID
:=
l2ToL1MessagePasserAbi
.
Events
[
"MessagePassed"
]
.
ID
relayedEventID
:=
crossDomainMessengerAbi
.
Events
[
"RelayedMessage"
]
.
ID
// (1) Initiated L2 Events
// Since all initiated bridge events eventually reach the L2ToL1MessagePasser to
// initiate the withdrawal, we can simply look for the last message passed from
// this cont
var
latestWithdrawHeader
*
types
.
Header
contractEventFilter
:=
database
.
ContractEvent
{
ContractAddress
:
predeploys
.
L2ToL1MessagePasserAddr
,
EventSignature
:
messagePassedID
}
withdrawEvent
,
err
:=
db
.
ContractEvents
.
L2LatestContractEventWithFilter
(
contractEventFilter
)
if
err
!=
nil
{
return
nil
,
err
}
if
withdrawEvent
!=
nil
{
l2BlockHeader
,
err
:=
db
.
Blocks
.
L2BlockHeader
(
withdrawEvent
.
BlockHash
)
if
err
!=
nil
{
return
nil
,
err
}
if
l2BlockHeader
!=
nil
{
latestWithdrawHeader
=
l2BlockHeader
.
RLPHeader
.
Header
()
}
}
// (2) Finalization markers for L1
// Since deposited transactions from L1 are apart of the block derivation process,
// there are no native finalization markers for OptimismPortal#TransactionDeposited.
// The lowest layer to check for here is the CrossDomainMessenger#RelayedMessage event.
// This also converts the StandardBridge which simply is an extension of the messenger.
var
latestRelayedMessageHeader
*
types
.
Header
contractEventFilter
=
database
.
ContractEvent
{
ContractAddress
:
predeploys
.
L2CrossDomainMessengerAddr
,
EventSignature
:
relayedEventID
}
relayedEvent
,
err
:=
db
.
ContractEvents
.
L2LatestContractEventWithFilter
(
contractEventFilter
)
if
err
!=
nil
{
return
nil
,
err
}
if
relayedEvent
!=
nil
{
l2BlockHeader
,
err
:=
db
.
Blocks
.
L2BlockHeader
(
relayedEvent
.
BlockHash
)
if
err
!=
nil
{
return
nil
,
err
}
if
l2BlockHeader
!=
nil
{
latestRelayedMessageHeader
=
l2BlockHeader
.
RLPHeader
.
Header
()
}
}
// No causaal relationship between withdraw and relayed messages
if
latestWithdrawHeader
==
nil
||
latestRelayedMessageHeader
==
nil
{
return
nil
,
nil
}
else
{
if
latestWithdrawHeader
.
Time
>
latestRelayedMessageHeader
.
Time
{
return
latestWithdrawHeader
,
nil
}
else
{
return
latestRelayedMessageHeader
,
nil
}
}
}
indexer/ui/schema.prisma
View file @
e552edee
...
...
@@ -4,35 +4,34 @@ generator client {
datasource
db
{
provider
=
"postgresql"
url
=
env
(
"DATABASE_URL"
)
url
=
"postgresql://db_username:db_password@localhost:5434/db_name"
}
model
l1_bridged_tokens
{
address
String
@
id
@
db
.
VarChar
bridge_address
String
@
db
.
VarChar
l2_token_address
String
@
db
.
VarChar
name
String
@
db
.
VarChar
symbol
String
@
db
.
VarChar
decimals
Int
l2_bridged_tokens
l2_bridged_tokens
[]
address
String
@
id
@
db
.
VarChar
bridge_address
String
@
db
.
VarChar
name
String
@
db
.
VarChar
symbol
String
@
db
.
VarChar
decimals
Int
l2_bridged_tokens
l2_bridged_tokens
[]
}
model
l2_bridged_tokens
{
address
String
@
id
@
db
.
VarChar
bridge_address
String
@
db
.
VarChar
l1_token_address
String
?
@
db
.
VarChar
name
String
@
db
.
VarChar
symbol
String
@
db
.
VarChar
decimals
Int
l1_bridged_tokens
l1_bridged_tokens
?
@
relation
(
fields
:
[
l1_token_address
],
references
:
[
address
],
onDelete
:
NoAction
,
onUpdate
:
NoAction
)
address
String
@
id
@
db
.
VarChar
bridge_address
String
@
db
.
VarChar
l1_token_address
String
?
@
db
.
VarChar
name
String
@
db
.
VarChar
symbol
String
@
db
.
VarChar
decimals
Int
l1_bridged_tokens
l1_bridged_tokens
?
@
relation
(
fields
:
[
l1_token_address
],
references
:
[
address
],
onDelete
:
Cascade
,
onUpdate
:
NoAction
)
}
///
This
table
contains
check
constraints
and
requires
additional
setup
for
migrations
.
Visit
https
://
pris
.
ly
/
d
/
check
-
constraints
for
more
info
.
model
l1_block_headers
{
hash
String
@
id
@
db
.
VarChar
parent_hash
String
@
db
.
VarChar
number
Decimal
@
db
.
Decimal
timestamp
Int
parent_hash
String
@
unique
@
db
.
VarChar
number
Decimal
@
unique
@
db
.
Decimal
timestamp
Int
@
unique
rlp_bytes
String
@
db
.
VarChar
l1_contract_events
l1_contract_events
[]
}
...
...
@@ -40,7 +39,7 @@ model l1_block_headers {
///
This
table
contains
check
constraints
and
requires
additional
setup
for
migrations
.
Visit
https
://
pris
.
ly
/
d
/
check
-
constraints
for
more
info
.
model
l1_bridge_deposits
{
transaction_source_hash
String
@
id
@
db
.
VarChar
cross_domain_message_hash
String
?
@
unique
@
db
.
VarChar
cross_domain_message_hash
String
@
unique
@
db
.
VarChar
from_address
String
@
db
.
VarChar
to_address
String
@
db
.
VarChar
local_token_address
String
@
db
.
VarChar
...
...
@@ -48,8 +47,8 @@ model l1_bridge_deposits {
amount
Decimal
@
db
.
Decimal
data
String
@
db
.
VarChar
timestamp
Int
l1_bridge_messages
l1_bridge_messages
?
@
relation
(
fields
:
[
cross_domain_message_hash
],
references
:
[
message_hash
],
onDelete
:
NoAction
,
onUpdate
:
NoAction
)
l1_transaction_deposits
l1_transaction_deposits
@
relation
(
fields
:
[
transaction_source_hash
],
references
:
[
source_hash
],
onDelete
:
NoAction
,
onUpdate
:
NoAction
)
l1_bridge_messages
l1_bridge_messages
@
relation
(
fields
:
[
cross_domain_message_hash
],
references
:
[
message_hash
],
onDelete
:
Cascade
,
onUpdate
:
NoAction
)
l1_transaction_deposits
l1_transaction_deposits
@
relation
(
fields
:
[
transaction_source_hash
],
references
:
[
source_hash
],
onDelete
:
Cascade
,
onUpdate
:
NoAction
)
}
///
This
table
contains
check
constraints
and
requires
additional
setup
for
migrations
.
Visit
https
://
pris
.
ly
/
d
/
check
-
constraints
for
more
info
.
...
...
@@ -66,36 +65,36 @@ model l1_bridge_messages {
data
String
@
db
.
VarChar
timestamp
Int
l1_bridge_deposits
l1_bridge_deposits
?
l2_contract_events
l2_contract_events
?
@
relation
(
fields
:
[
relayed_message_event_guid
],
references
:
[
guid
],
onDelete
:
NoAction
,
onUpdate
:
NoAction
)
l1_contract_events
l1_contract_events
@
relation
(
fields
:
[
sent_message_event_guid
],
references
:
[
guid
],
onDelete
:
NoAction
,
onUpdate
:
NoAction
)
l1_transaction_deposits
l1_transaction_deposits
@
relation
(
fields
:
[
transaction_source_hash
],
references
:
[
source_hash
],
onDelete
:
NoAction
,
onUpdate
:
NoAction
)
l2_contract_events
l2_contract_events
?
@
relation
(
fields
:
[
relayed_message_event_guid
],
references
:
[
guid
],
onDelete
:
Cascade
,
onUpdate
:
NoAction
)
l1_contract_events
l1_contract_events
@
relation
(
fields
:
[
sent_message_event_guid
],
references
:
[
guid
],
onDelete
:
Cascade
,
onUpdate
:
NoAction
)
l1_transaction_deposits
l1_transaction_deposits
@
relation
(
fields
:
[
transaction_source_hash
],
references
:
[
source_hash
],
onDelete
:
Cascade
,
onUpdate
:
NoAction
)
}
///
This
table
contains
check
constraints
and
requires
additional
setup
for
migrations
.
Visit
https
://
pris
.
ly
/
d
/
check
-
constraints
for
more
info
.
model
l1_contract_events
{
guid
String
@
id
@
db
.
VarChar
block_hash
String
@
db
.
VarChar
contract_address
String
@
db
.
VarChar
transaction_hash
String
@
db
.
VarChar
guid
String
@
id
@
db
.
VarChar
block_hash
String
@
db
.
VarChar
contract_address
String
@
db
.
VarChar
transaction_hash
String
@
db
.
VarChar
log_index
Int
event_signature
String
@
db
.
VarChar
event_signature
String
@
db
.
VarChar
timestamp
Int
rlp_bytes
String
@
db
.
VarChar
rlp_bytes
String
@
db
.
VarChar
l1_bridge_messages
l1_bridge_messages
?
l1_block_headers
l1_block_headers
@
relation
(
fields
:
[
block_hash
],
references
:
[
hash
],
onDelete
:
NoAction
,
onUpdate
:
NoAction
)
l1_transaction_deposits
l1_transaction_deposits
[]
l1_block_headers
l1_block_headers
@
relation
(
fields
:
[
block_hash
],
references
:
[
hash
],
onDelete
:
Cascade
,
onUpdate
:
NoAction
)
l1_transaction_deposits
l1_transaction_deposits
?
l2_bridge_messages
l2_bridge_messages
?
l2_transaction_withdrawals_l2_transaction_withdrawals_finalized_l1_event_guidTol1_contract_events
l2_transaction_withdrawals
[]
@
relation
(
"l2_transaction_withdrawals_finalized_l1_event_guidTol1_contract_events"
)
l2_transaction_withdrawals_l2_transaction_withdrawals_proven_l1_event_guidTol1_contract_events
l2_transaction_withdrawals
[]
@
relation
(
"l2_transaction_withdrawals_proven_l1_event_guidTol1_contract_events"
)
legacy_state_batches
legacy_state_batches
[]
output_proposals
output_proposals
[]
l2_transaction_withdrawals_l2_transaction_withdrawals_finalized_l1_event_guidTol1_contract_events
l2_transaction_withdrawals
?
@
relation
(
"l2_transaction_withdrawals_finalized_l1_event_guidTol1_contract_events"
)
l2_transaction_withdrawals_l2_transaction_withdrawals_proven_l1_event_guidTol1_contract_events
l2_transaction_withdrawals
?
@
relation
(
"l2_transaction_withdrawals_proven_l1_event_guidTol1_contract_events"
)
legacy_state_batches
legacy_state_batches
?
output_proposals
output_proposals
?
}
///
This
table
contains
check
constraints
and
requires
additional
setup
for
migrations
.
Visit
https
://
pris
.
ly
/
d
/
check
-
constraints
for
more
info
.
model
l1_transaction_deposits
{
source_hash
String
@
id
@
db
.
VarChar
l2_transaction_hash
String
@
db
.
VarChar
initiated_l1_event_guid
String
@
db
.
VarChar
l2_transaction_hash
String
@
unique
@
db
.
VarChar
initiated_l1_event_guid
String
@
unique
@
db
.
VarChar
from_address
String
@
db
.
VarChar
to_address
String
@
db
.
VarChar
amount
Decimal
@
db
.
Decimal
...
...
@@ -104,15 +103,15 @@ model l1_transaction_deposits {
timestamp
Int
l1_bridge_deposits
l1_bridge_deposits
?
l1_bridge_messages
l1_bridge_messages
?
l1_contract_events
l1_contract_events
@
relation
(
fields
:
[
initiated_l1_event_guid
],
references
:
[
guid
],
onDelete
:
NoAction
,
onUpdate
:
NoAction
)
l1_contract_events
l1_contract_events
@
relation
(
fields
:
[
initiated_l1_event_guid
],
references
:
[
guid
],
onDelete
:
Cascade
,
onUpdate
:
NoAction
)
}
///
This
table
contains
check
constraints
and
requires
additional
setup
for
migrations
.
Visit
https
://
pris
.
ly
/
d
/
check
-
constraints
for
more
info
.
model
l2_block_headers
{
hash
String
@
id
@
db
.
VarChar
parent_hash
String
@
db
.
VarChar
number
Decimal
@
db
.
Decimal
timestamp
Int
parent_hash
String
@
unique
@
db
.
VarChar
number
Decimal
@
unique
@
db
.
Decimal
timestamp
Int
@
unique
rlp_bytes
String
@
db
.
VarChar
l2_contract_events
l2_contract_events
[]
}
...
...
@@ -130,16 +129,16 @@ model l2_bridge_messages {
gas_limit
Decimal
@
db
.
Decimal
data
String
@
db
.
VarChar
timestamp
Int
l1_contract_events
l1_contract_events
?
@
relation
(
fields
:
[
relayed_message_event_guid
],
references
:
[
guid
],
onDelete
:
NoAction
,
onUpdate
:
NoAction
)
l2_contract_events
l2_contract_events
@
relation
(
fields
:
[
sent_message_event_guid
],
references
:
[
guid
],
onDelete
:
NoAction
,
onUpdate
:
NoAction
)
l2_transaction_withdrawals
l2_transaction_withdrawals
@
relation
(
fields
:
[
transaction_withdrawal_hash
],
references
:
[
withdrawal_hash
],
onDelete
:
NoAction
,
onUpdate
:
NoAction
)
l1_contract_events
l1_contract_events
?
@
relation
(
fields
:
[
relayed_message_event_guid
],
references
:
[
guid
],
onDelete
:
Cascade
,
onUpdate
:
NoAction
)
l2_contract_events
l2_contract_events
@
relation
(
fields
:
[
sent_message_event_guid
],
references
:
[
guid
],
onDelete
:
Cascade
,
onUpdate
:
NoAction
)
l2_transaction_withdrawals
l2_transaction_withdrawals
@
relation
(
fields
:
[
transaction_withdrawal_hash
],
references
:
[
withdrawal_hash
],
onDelete
:
Cascade
,
onUpdate
:
NoAction
)
l2_bridge_withdrawals
l2_bridge_withdrawals
?
}
///
This
table
contains
check
constraints
and
requires
additional
setup
for
migrations
.
Visit
https
://
pris
.
ly
/
d
/
check
-
constraints
for
more
info
.
model
l2_bridge_withdrawals
{
transaction_withdrawal_hash
String
@
id
@
db
.
VarChar
cross_domain_message_hash
String
?
@
unique
@
db
.
VarChar
cross_domain_message_hash
String
@
unique
@
db
.
VarChar
from_address
String
@
db
.
VarChar
to_address
String
@
db
.
VarChar
local_token_address
String
@
db
.
VarChar
...
...
@@ -147,34 +146,34 @@ model l2_bridge_withdrawals {
amount
Decimal
@
db
.
Decimal
data
String
@
db
.
VarChar
timestamp
Int
l2_bridge_messages
l2_bridge_messages
?
@
relation
(
fields
:
[
cross_domain_message_hash
],
references
:
[
message_hash
],
onDelete
:
NoAction
,
onUpdate
:
NoAction
)
l2_transaction_withdrawals
l2_transaction_withdrawals
@
relation
(
fields
:
[
transaction_withdrawal_hash
],
references
:
[
withdrawal_hash
],
onDelete
:
NoAction
,
onUpdate
:
NoAction
)
l2_bridge_messages
l2_bridge_messages
@
relation
(
fields
:
[
cross_domain_message_hash
],
references
:
[
message_hash
],
onDelete
:
Cascade
,
onUpdate
:
NoAction
)
l2_transaction_withdrawals
l2_transaction_withdrawals
@
relation
(
fields
:
[
transaction_withdrawal_hash
],
references
:
[
withdrawal_hash
],
onDelete
:
Cascade
,
onUpdate
:
NoAction
)
}
///
This
table
contains
check
constraints
and
requires
additional
setup
for
migrations
.
Visit
https
://
pris
.
ly
/
d
/
check
-
constraints
for
more
info
.
model
l2_contract_events
{
guid
String
@
id
@
db
.
VarChar
block_hash
String
@
db
.
VarChar
contract_address
String
@
db
.
VarChar
transaction_hash
String
@
db
.
VarChar
guid
String
@
id
@
db
.
VarChar
block_hash
String
@
db
.
VarChar
contract_address
String
@
db
.
VarChar
transaction_hash
String
@
db
.
VarChar
log_index
Int
event_signature
String
@
db
.
VarChar
event_signature
String
@
db
.
VarChar
timestamp
Int
rlp_bytes
String
@
db
.
VarChar
rlp_bytes
String
@
db
.
VarChar
l1_bridge_messages
l1_bridge_messages
?
l2_bridge_messages
l2_bridge_messages
?
l2_block_headers
l2_block_headers
@
relation
(
fields
:
[
block_hash
],
references
:
[
hash
],
onDelete
:
NoAction
,
onUpdate
:
NoAction
)
l2_transaction_withdrawals
l2_transaction_withdrawals
[]
l2_block_headers
l2_block_headers
@
relation
(
fields
:
[
block_hash
],
references
:
[
hash
],
onDelete
:
Cascade
,
onUpdate
:
NoAction
)
l2_transaction_withdrawals
l2_transaction_withdrawals
?
}
///
This
table
contains
check
constraints
and
requires
additional
setup
for
migrations
.
Visit
https
://
pris
.
ly
/
d
/
check
-
constraints
for
more
info
.
model
l2_transaction_withdrawals
{
withdrawal_hash
String
@
id
@
db
.
VarChar
initiated_l2_event_guid
String
@
db
.
VarChar
proven_l1_event_guid
String
?
@
db
.
VarChar
finalized_l1_event_guid
String
?
@
db
.
VarChar
nonce
Decimal
@
unique
@
db
.
Decimal
initiated_l2_event_guid
String
@
unique
@
db
.
VarChar
proven_l1_event_guid
String
?
@
unique
@
db
.
VarChar
finalized_l1_event_guid
String
?
@
unique
@
db
.
VarChar
succeeded
Boolean
?
nonce
Decimal
?
@
unique
@
db
.
Decimal
from_address
String
@
db
.
VarChar
to_address
String
@
db
.
VarChar
amount
Decimal
@
db
.
Decimal
...
...
@@ -183,24 +182,24 @@ model l2_transaction_withdrawals {
timestamp
Int
l2_bridge_messages
l2_bridge_messages
?
l2_bridge_withdrawals
l2_bridge_withdrawals
?
l1_contract_events_l2_transaction_withdrawals_finalized_l1_event_guidTol1_contract_events
l1_contract_events
?
@
relation
(
"l2_transaction_withdrawals_finalized_l1_event_guidTol1_contract_events"
,
fields
:
[
finalized_l1_event_guid
],
references
:
[
guid
],
onDelete
:
NoAction
,
onUpdate
:
NoAction
)
l2_contract_events
l2_contract_events
@
relation
(
fields
:
[
initiated_l2_event_guid
],
references
:
[
guid
],
onDelete
:
NoAction
,
onUpdate
:
NoAction
)
l1_contract_events_l2_transaction_withdrawals_proven_l1_event_guidTol1_contract_events
l1_contract_events
?
@
relation
(
"l2_transaction_withdrawals_proven_l1_event_guidTol1_contract_events"
,
fields
:
[
proven_l1_event_guid
],
references
:
[
guid
],
onDelete
:
NoAction
,
onUpdate
:
NoAction
)
l1_contract_events_l2_transaction_withdrawals_finalized_l1_event_guidTol1_contract_events
l1_contract_events
?
@
relation
(
"l2_transaction_withdrawals_finalized_l1_event_guidTol1_contract_events"
,
fields
:
[
finalized_l1_event_guid
],
references
:
[
guid
],
onDelete
:
Cascade
,
onUpdate
:
NoAction
)
l2_contract_events
l2_contract_events
@
relation
(
fields
:
[
initiated_l2_event_guid
],
references
:
[
guid
],
onDelete
:
Cascade
,
onUpdate
:
NoAction
)
l1_contract_events_l2_transaction_withdrawals_proven_l1_event_guidTol1_contract_events
l1_contract_events
?
@
relation
(
"l2_transaction_withdrawals_proven_l1_event_guidTol1_contract_events"
,
fields
:
[
proven_l1_event_guid
],
references
:
[
guid
],
onDelete
:
Cascade
,
onUpdate
:
NoAction
)
}
model
legacy_state_batches
{
index
Int
@
id
root
String
@
db
.
VarChar
size
Int
prev_total
Int
l1_contract_event_guid
String
?
@
db
.
VarChar
l1_contract_events
l1_contract_events
?
@
relation
(
fields
:
[
l1_contract_event_guid
],
references
:
[
guid
],
onDelete
:
NoAction
,
onUpdate
:
NoAction
)
index
Int
@
id
root
String
@
unique
@
db
.
VarChar
size
Int
prev_total
Int
state_batch_appended_guid
String
@
unique
@
db
.
VarChar
l1_contract_events
l1_contract_events
@
relation
(
fields
:
[
state_batch_appended_guid
],
references
:
[
guid
],
onDelete
:
Cascade
,
onUpdate
:
NoAction
)
}
model
output_proposals
{
output_root
String
@
id
@
db
.
VarChar
l2_output_index
Decimal
@
db
.
Decimal
l2_block_number
Decimal
@
db
.
Decimal
l1_contract_event_guid
String
?
@
db
.
VarChar
l1_contract_events
l1_contract_events
?
@
relation
(
fields
:
[
l1_contract_event_guid
],
references
:
[
guid
],
onDelete
:
NoAction
,
onUpdate
:
NoAction
)
output_root
String
@
id
@
db
.
VarChar
l2_output_index
Decimal
@
unique
@
db
.
Decimal
l2_block_number
Decimal
@
unique
@
db
.
Decimal
output_proposed_guid
String
@
unique
@
db
.
VarChar
l1_contract_events
l1_contract_events
@
relation
(
fields
:
[
output_proposed_guid
],
references
:
[
guid
],
onDelete
:
Cascade
,
onUpdate
:
NoAction
)
}
pnpm-lock.yaml
View file @
e552edee
...
...
@@ -17,7 +17,7 @@ importers:
devDependencies
:
'
@babel/eslint-parser'
:
specifier
:
^7.18.2
version
:
7.22.1
0
(@babel/core@7.22.10)(eslint@8.47.0)
version
:
7.22.1
5
(@babel/core@7.22.10)(eslint@8.47.0)
'
@changesets/changelog-github'
:
specifier
:
^0.4.8
version
:
0.4.8
...
...
@@ -604,13 +604,6 @@ packages:
'
@babel/highlight'
:
7.22.10
chalk
:
2.4.2
/@babel/code-frame@7.22.5
:
resolution
:
{
integrity
:
sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ==
}
engines
:
{
node
:
'
>=6.9.0'
}
dependencies
:
'
@babel/highlight'
:
7.22.10
dev
:
true
/@babel/compat-data@7.22.9
:
resolution
:
{
integrity
:
sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ==
}
engines
:
{
node
:
'
>=6.9.0'
}
...
...
@@ -639,31 +632,8 @@ packages:
-
supports-color
dev
:
true
/@babel/core@7.22.9
:
resolution
:
{
integrity
:
sha512-G2EgeufBcYw27U4hhoIwFcgc1XU7TlXJ3mv04oOv1WCuo900U/anZSPzEqNjwdjgffkk2Gs0AN0dW1CKVLcG7w==
}
engines
:
{
node
:
'
>=6.9.0'
}
dependencies
:
'
@ampproject/remapping'
:
2.2.1
'
@babel/code-frame'
:
7.22.10
'
@babel/generator'
:
7.22.9
'
@babel/helper-compilation-targets'
:
7.22.9(@babel/core@7.22.9)
'
@babel/helper-module-transforms'
:
7.22.9(@babel/core@7.22.9)
'
@babel/helpers'
:
7.22.6
'
@babel/parser'
:
7.22.7
'
@babel/template'
:
7.22.5
'
@babel/traverse'
:
7.22.8
'
@babel/types'
:
7.22.5
convert-source-map
:
1.9.0
debug
:
4.3.4(supports-color@8.1.1)
gensync
:
1.0.0-beta.2
json5
:
2.2.3
semver
:
6.3.1
transitivePeerDependencies
:
-
supports-color
dev
:
true
/@babel/eslint-parser@7.22.10(@babel/core@7.22.10)(eslint@8.47.0)
:
resolution
:
{
integrity
:
sha512-0J8DNPRXQRLeR9rPaUMM3fA+RbixjnVLe/MRMYCkp3hzgsSuxCHQ8NN8xQG1wIHKJ4a1DTROTvFJdW+B5/eOsg==
}
/@babel/eslint-parser@7.22.15(@babel/core@7.22.10)(eslint@8.47.0)
:
resolution
:
{
integrity
:
sha512-yc8OOBIQk1EcRrpizuARSQS0TWAcOMpEJ1aafhNznaeYkeL+OhqnDObGFylB8ka8VFF/sZc+S4RzHyO+3LjQxg==
}
engines
:
{
node
:
^10.13.0 || ^12.13.0 || >=14.0.0
}
peerDependencies
:
'
@babel/core'
:
^7.11.0
...
...
@@ -686,26 +656,6 @@ packages:
jsesc
:
2.5.2
dev
:
true
/@babel/generator@7.22.5
:
resolution
:
{
integrity
:
sha512-+lcUbnTRhd0jOewtFSedLyiPsD5tswKkbgcezOqqWFUVNEwoUTlpPOBmvhG7OXWLR4jMdv0czPGH5XbflnD1EA==
}
engines
:
{
node
:
'
>=6.9.0'
}
dependencies
:
'
@babel/types'
:
7.22.5
'
@jridgewell/gen-mapping'
:
0.3.3
'
@jridgewell/trace-mapping'
:
0.3.19
jsesc
:
2.5.2
dev
:
true
/@babel/generator@7.22.9
:
resolution
:
{
integrity
:
sha512-KtLMbmicyuK2Ak/FTCJVbDnkN1SlT8/kceFTiuDiiRUUSMnHMidxSCdG4ndkTOHHpoomWe/4xkvHkEOncwjYIw==
}
engines
:
{
node
:
'
>=6.9.0'
}
dependencies
:
'
@babel/types'
:
7.22.5
'
@jridgewell/gen-mapping'
:
0.3.3
'
@jridgewell/trace-mapping'
:
0.3.19
jsesc
:
2.5.2
dev
:
true
/@babel/helper-compilation-targets@7.22.10
:
resolution
:
{
integrity
:
sha512-JMSwHD4J7SLod0idLq5PKgI+6g/hLD/iuWBq08ZX49xE14VpVEojJ5rHWptpirV2j020MvypRLAXAO50igCJ5Q==
}
engines
:
{
node
:
'
>=6.9.0'
}
...
...
@@ -717,65 +667,31 @@ packages:
semver
:
6.3.1
dev
:
true
/@babel/helper-compilation-targets@7.22.9(@babel/core@7.22.9)
:
resolution
:
{
integrity
:
sha512-7qYrNM6HjpnPHJbopxmb8hSPoZ0gsX8IvUS32JGVoy+pU9e5N0nLr1VjJoR6kA4d9dmGLxNYOjeB8sUDal2WMw==
}
engines
:
{
node
:
'
>=6.9.0'
}
peerDependencies
:
'
@babel/core'
:
^7.0.0
dependencies
:
'
@babel/compat-data'
:
7.22.9
'
@babel/core'
:
7.22.9
'
@babel/helper-validator-option'
:
7.22.5
browserslist
:
4.21.9
lru-cache
:
5.1.1
semver
:
6.3.1
dev
:
true
/@babel/helper-environment-visitor@7.18.2
:
resolution
:
{
integrity
:
sha512-14GQKWkX9oJzPiQQ7/J36FTXcD4kSp8egKjO9nINlSKiHITRA9q/R74qu8S9xlc/b/yjsJItQUeeh3xnGN0voQ==
}
engines
:
{
node
:
'
>=6.9.0'
}
dev
:
true
/@babel/helper-environment-visitor@7.22.5
:
resolution
:
{
integrity
:
sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==
}
engines
:
{
node
:
'
>=6.9.0'
}
dev
:
true
/@babel/helper-function-name@7.17.9
:
resolution
:
{
integrity
:
sha512-7cRisGlVtiVqZ0MW0/yFB4atgpGLWEHUVYnb448hZK4x+vih0YO5UoS11XIYtZYqHd0dIPMdUSv8q5K4LdMnIg==
}
engines
:
{
node
:
'
>=6.9.0'
}
dependencies
:
'
@babel/template'
:
7.22.5
'
@babel/types'
:
7.22.5
dev
:
true
/@babel/helper-function-name@7.22.5
:
resolution
:
{
integrity
:
sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==
}
engines
:
{
node
:
'
>=6.9.0'
}
dependencies
:
'
@babel/template'
:
7.22.5
'
@babel/types'
:
7.22.5
dev
:
true
/@babel/helper-hoist-variables@7.16.7
:
resolution
:
{
integrity
:
sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==
}
engines
:
{
node
:
'
>=6.9.0'
}
dependencies
:
'
@babel/types'
:
7.22.5
'
@babel/types'
:
7.22.10
dev
:
true
/@babel/helper-hoist-variables@7.22.5
:
resolution
:
{
integrity
:
sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==
}
engines
:
{
node
:
'
>=6.9.0'
}
dependencies
:
'
@babel/types'
:
7.22.
5
'
@babel/types'
:
7.22.
10
dev
:
true
/@babel/helper-module-imports@7.22.5
:
resolution
:
{
integrity
:
sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==
}
engines
:
{
node
:
'
>=6.9.0'
}
dependencies
:
'
@babel/types'
:
7.22.
5
'
@babel/types'
:
7.22.
10
dev
:
true
/@babel/helper-module-transforms@7.22.9(@babel/core@7.22.10)
:
...
...
@@ -792,39 +708,18 @@ packages:
'
@babel/helper-validator-identifier'
:
7.22.5
dev
:
true
/@babel/helper-module-transforms@7.22.9(@babel/core@7.22.9)
:
resolution
:
{
integrity
:
sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ==
}
engines
:
{
node
:
'
>=6.9.0'
}
peerDependencies
:
'
@babel/core'
:
^7.0.0
dependencies
:
'
@babel/core'
:
7.22.9
'
@babel/helper-environment-visitor'
:
7.22.5
'
@babel/helper-module-imports'
:
7.22.5
'
@babel/helper-simple-access'
:
7.22.5
'
@babel/helper-split-export-declaration'
:
7.22.6
'
@babel/helper-validator-identifier'
:
7.22.5
dev
:
true
/@babel/helper-simple-access@7.22.5
:
resolution
:
{
integrity
:
sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==
}
engines
:
{
node
:
'
>=6.9.0'
}
dependencies
:
'
@babel/types'
:
7.22.5
dev
:
true
/@babel/helper-split-export-declaration@7.16.7
:
resolution
:
{
integrity
:
sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==
}
engines
:
{
node
:
'
>=6.9.0'
}
dependencies
:
'
@babel/types'
:
7.22.5
'
@babel/types'
:
7.22.10
dev
:
true
/@babel/helper-split-export-declaration@7.22.6
:
resolution
:
{
integrity
:
sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==
}
engines
:
{
node
:
'
>=6.9.0'
}
dependencies
:
'
@babel/types'
:
7.22.
5
'
@babel/types'
:
7.22.
10
dev
:
true
/@babel/helper-string-parser@7.22.5
:
...
...
@@ -857,17 +752,6 @@ packages:
-
supports-color
dev
:
true
/@babel/helpers@7.22.6
:
resolution
:
{
integrity
:
sha512-YjDs6y/fVOYFV8hAf1rxd1QvR9wJe1pDBZ2AREKq/SDayfPzgk0PBnVuTCE5X1acEpMMNOVUqoe+OwiZGJ+OaA==
}
engines
:
{
node
:
'
>=6.9.0'
}
dependencies
:
'
@babel/template'
:
7.22.5
'
@babel/traverse'
:
7.22.8
'
@babel/types'
:
7.22.5
transitivePeerDependencies
:
-
supports-color
dev
:
true
/@babel/highlight@7.22.10
:
resolution
:
{
integrity
:
sha512-78aUtVcT7MUscr0K5mIEnkwxPE0MaxkR5RxRwuHaQ+JuU5AmTPhY+do2mdzVTnIJJpyBglql2pehuBIWHug+WQ==
}
engines
:
{
node
:
'
>=6.9.0'
}
...
...
@@ -881,7 +765,7 @@ packages:
engines
:
{
node
:
'
>=6.0.0'
}
hasBin
:
true
dependencies
:
'
@babel/types'
:
7.22.
5
'
@babel/types'
:
7.22.
10
dev
:
true
/@babel/parser@7.22.10
:
...
...
@@ -892,22 +776,6 @@ packages:
'
@babel/types'
:
7.22.10
dev
:
true
/@babel/parser@7.22.5
:
resolution
:
{
integrity
:
sha512-DFZMC9LJUG9PLOclRC32G63UXwzqS2koQC8dkx+PLdmt1xSePYpbT/NbsrJy8Q/muXz7o/h/d4A7Fuyixm559Q==
}
engines
:
{
node
:
'
>=6.0.0'
}
hasBin
:
true
dependencies
:
'
@babel/types'
:
7.22.5
dev
:
true
/@babel/parser@7.22.7
:
resolution
:
{
integrity
:
sha512-7NF8pOkHP5o2vpmGgNGcfAeCvOYhGLyA3Z4eBQkT1RJlWu47n63bCs93QfJ2hIAFCil7L5P2IWhs1oToVgrL0Q==
}
engines
:
{
node
:
'
>=6.0.0'
}
hasBin
:
true
dependencies
:
'
@babel/types'
:
7.22.5
dev
:
true
/@babel/runtime@7.20.7
:
resolution
:
{
integrity
:
sha512-UF0tvkUtxwAgZ5W/KrkHf0Rn0fdnLDU9ScxBrEVNUprE/MzirjK4MJUX1/BVDv00Sv8cljtukVK1aky++X1SjQ==
}
engines
:
{
node
:
'
>=6.9.0'
}
...
...
@@ -926,31 +794,13 @@ packages:
engines
:
{
node
:
'
>=6.9.0'
}
dependencies
:
'
@babel/code-frame'
:
7.22.10
'
@babel/parser'
:
7.22.
7
'
@babel/types'
:
7.22.
5
'
@babel/parser'
:
7.22.
10
'
@babel/types'
:
7.22.
10
dev
:
true
/@babel/traverse@7.18.2
:
resolution
:
{
integrity
:
sha512-9eNwoeovJ6KH9zcCNnENY7DMFwTU9JdGCFtqNLfUAqtUHRCOsTOqWoffosP8vKmNYeSBUv3yVJXjfd8ucwOjUA==
}
engines
:
{
node
:
'
>=6.9.0'
}
dependencies
:
'
@babel/code-frame'
:
7.22.5
'
@babel/generator'
:
7.22.5
'
@babel/helper-environment-visitor'
:
7.18.2
'
@babel/helper-function-name'
:
7.17.9
'
@babel/helper-hoist-variables'
:
7.16.7
'
@babel/helper-split-export-declaration'
:
7.16.7
'
@babel/parser'
:
7.22.5
'
@babel/types'
:
7.22.5
debug
:
4.3.4(supports-color@8.1.1)
globals
:
11.12.0
transitivePeerDependencies
:
-
supports-color
dev
:
true
/@babel/traverse@7.22.10
:
resolution
:
{
integrity
:
sha512-Q/urqV4pRByiNNpb/f5OSv28ZlGJiFiiTh+GAHktbIrkPhPbl90+uW6SmpoLyZqutrg9AEaEf3Q/ZBRHBXgxig==
}
engines
:
{
node
:
'
>=6.9.0'
}
dependencies
:
'
@babel/code-frame'
:
7.22.10
'
@babel/generator'
:
7.22.10
...
...
@@ -966,18 +816,18 @@ packages:
-
supports-color
dev
:
true
/@babel/traverse@7.22.
8
:
resolution
:
{
integrity
:
sha512-
y6LPR+wpM2I3qJrsheCTwhIinzkETbplIgPBbwvqPKc+uljeA5gP+3nP8irdYt1mjQaDnlIcG+dw8OjAco4GXw
==
}
/@babel/traverse@7.22.
10
:
resolution
:
{
integrity
:
sha512-
Q/urqV4pRByiNNpb/f5OSv28ZlGJiFiiTh+GAHktbIrkPhPbl90+uW6SmpoLyZqutrg9AEaEf3Q/ZBRHBXgxig
==
}
engines
:
{
node
:
'
>=6.9.0'
}
dependencies
:
'
@babel/code-frame'
:
7.22.10
'
@babel/generator'
:
7.22.
9
'
@babel/generator'
:
7.22.
10
'
@babel/helper-environment-visitor'
:
7.22.5
'
@babel/helper-function-name'
:
7.22.5
'
@babel/helper-hoist-variables'
:
7.22.5
'
@babel/helper-split-export-declaration'
:
7.22.6
'
@babel/parser'
:
7.22.
7
'
@babel/types'
:
7.22.
5
'
@babel/parser'
:
7.22.
10
'
@babel/types'
:
7.22.
10
debug
:
4.3.4(supports-color@8.1.1)
globals
:
11.12.0
transitivePeerDependencies
:
...
...
@@ -993,15 +843,6 @@ packages:
to-fast-properties
:
2.0.0
dev
:
true
/@babel/types@7.22.5
:
resolution
:
{
integrity
:
sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA==
}
engines
:
{
node
:
'
>=6.9.0'
}
dependencies
:
'
@babel/helper-string-parser'
:
7.22.5
'
@babel/helper-validator-identifier'
:
7.22.5
to-fast-properties
:
2.0.0
dev
:
true
/@changesets/apply-release-plan@6.1.3
:
resolution
:
{
integrity
:
sha512-ECDNeoc3nfeAe1jqJb5aFQX7CqzQhD2klXRez2JDb/aVpGUbX673HgKrnrgJRuQR/9f2TtLoYIzrGB9qwD77mg==
}
dependencies
:
...
...
@@ -4578,7 +4419,7 @@ packages:
/@vue/compiler-core@3.2.36
:
resolution
:
{
integrity
:
sha512-bbyZM5hvBicv0PW3KUfVi+x3ylHnfKG7DOn5wM+f2OztTzTjLEyBb/5yrarIYpmnGitVGbjZqDbODyW4iK8hqw==
}
dependencies
:
'
@babel/parser'
:
7.22.
5
'
@babel/parser'
:
7.22.
10
'
@vue/shared'
:
3.2.36
estree-walker
:
2.0.2
source-map
:
0.6.1
...
...
@@ -4594,7 +4435,7 @@ packages:
/@vue/compiler-sfc@3.2.36
:
resolution
:
{
integrity
:
sha512-AvGb4bTj4W8uQ4BqaSxo7UwTEqX5utdRSMyHy58OragWlt8nEACQ9mIeQh3K4di4/SX+41+pJrLIY01lHAOFOA==
}
dependencies
:
'
@babel/parser'
:
7.22.
5
'
@babel/parser'
:
7.22.
10
'
@vue/compiler-core'
:
3.2.36
'
@vue/compiler-dom'
:
3.2.36
'
@vue/compiler-ssr'
:
3.2.36
...
...
@@ -4616,7 +4457,7 @@ packages:
/@vue/reactivity-transform@3.2.36
:
resolution
:
{
integrity
:
sha512-Jk5o2BhpODC9XTA7o4EL8hSJ4JyrFWErLtClG3NH8wDS7ri9jBDWxI7/549T7JY9uilKsaNM+4pJASLj5dtRwA==
}
dependencies
:
'
@babel/parser'
:
7.22.
5
'
@babel/parser'
:
7.22.
10
'
@vue/compiler-core'
:
3.2.36
'
@vue/shared'
:
3.2.36
estree-walker
:
2.0.2
...
...
@@ -6105,17 +5946,6 @@ packages:
update-browserslist-db
:
1.0.11(browserslist@4.21.10)
dev
:
true
/browserslist@4.21.9
:
resolution
:
{
integrity
:
sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg==
}
engines
:
{
node
:
^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7
}
hasBin
:
true
dependencies
:
caniuse-lite
:
1.0.30001517
electron-to-chromium
:
1.4.468
node-releases
:
2.0.13
update-browserslist-db
:
1.0.11(browserslist@4.21.9)
dev
:
true
/bs58@4.0.1
:
resolution
:
{
integrity
:
sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==
}
dependencies
:
...
...
@@ -6302,10 +6132,6 @@ packages:
engines
:
{
node
:
'
>=10'
}
dev
:
true
/caniuse-lite@1.0.30001517
:
resolution
:
{
integrity
:
sha512-Vdhm5S11DaFVLlyiKu4hiUTkpZu+y1KA/rZZqVQfOD5YdDT/eQKlkt7NaE0WGOFgX32diqt9MiP9CAiFeRklaA==
}
dev
:
true
/caniuse-lite@1.0.30001520
:
resolution
:
{
integrity
:
sha512-tahF5O9EiiTzwTUqAeFjIZbn4Dnqxzz7ktrgGlMYNLH43Ul26IgTMH/zvL3DG0lZxBYnlT04axvInszUsZULdA==
}
dev
:
true
...
...
@@ -7455,10 +7281,6 @@ packages:
jake
:
10.8.7
dev
:
true
/electron-to-chromium@1.4.468
:
resolution
:
{
integrity
:
sha512-6M1qyhaJOt7rQtNti1lBA0GwclPH+oKCmsra/hkcWs5INLxfXXD/dtdnaKUYQu/pjOBP/8Osoe4mAcNvvzoFag==
}
dev
:
true
/electron-to-chromium@1.4.491
:
resolution
:
{
integrity
:
sha512-ZzPqGKghdVzlQJ+qpfE+r6EB321zed7e5JsvHIlMM4zPFF8okXUkF5Of7h7F3l3cltPL0rG7YVmlp5Qro7RQLA==
}
dev
:
true
...
...
@@ -10394,7 +10216,7 @@ packages:
resolution
:
{
integrity
:
sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==
}
engines
:
{
node
:
'
>=8'
}
dependencies
:
'
@babel/core'
:
7.22.
9
'
@babel/core'
:
7.22.
10
'
@istanbuljs/schema'
:
0.1.3
istanbul-lib-coverage
:
3.2.0
semver
:
6.3.1
...
...
@@ -15823,17 +15645,6 @@ packages:
picocolors
:
1.0.0
dev
:
true
/update-browserslist-db@1.0.11(browserslist@4.21.9)
:
resolution
:
{
integrity
:
sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==
}
hasBin
:
true
peerDependencies
:
browserslist
:
'
>=
4.21.0'
dependencies
:
browserslist
:
4.21.9
escalade
:
3.1.1
picocolors
:
1.0.0
dev
:
true
/update-section@0.3.3
:
resolution
:
{
integrity
:
sha512-BpRZMZpgXLuTiKeiu7kK0nIPwGdyrqrs6EDSaXtjD/aQ2T+qVo9a5hRC3HN3iJjCMxNT/VxoLGQ7E/OzE5ucnw==
}
dev
:
true
...
...
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