@@ -86,21 +86,28 @@ type SyncProgressBackend interface {
86
86
FinalizedBlockNumber (ctx context.Context ) (uint64 , error )
87
87
}
88
88
89
- func createRegisterAPIBackend (backend * Backend , sync SyncProgressBackend , filterConfig filters.Config , fallbackClientUrl string , fallbackClientTimeout time.Duration ) (* filters.FilterSystem , error ) {
89
+ func createRegisterAPIBackend (backend * Backend , filterConfig filters.Config , fallbackClientUrl string , fallbackClientTimeout time.Duration ) (* filters.FilterSystem , error ) {
90
90
fallbackClient , err := CreateFallbackClient (fallbackClientUrl , fallbackClientTimeout )
91
91
if err != nil {
92
92
return nil , err
93
93
}
94
94
backend .apiBackend = & APIBackend {
95
95
b : backend ,
96
96
fallbackClient : fallbackClient ,
97
- sync : sync ,
98
97
}
99
98
filterSystem := filters .NewFilterSystem (backend .apiBackend , filterConfig )
100
99
backend .stack .RegisterAPIs (backend .apiBackend .GetAPIs (filterSystem ))
101
100
return filterSystem , nil
102
101
}
103
102
103
+ func (a * APIBackend ) SetSyncBackend (sync SyncProgressBackend ) error {
104
+ if a .sync != nil {
105
+ return errors .New ("sync progress monitor already set" )
106
+ }
107
+ a .sync = sync
108
+ return nil
109
+ }
110
+
104
111
func (a * APIBackend ) GetAPIs (filterSystem * filters.FilterSystem ) []rpc.API {
105
112
apis := ethapi .GetAPIs (a )
106
113
@@ -137,7 +144,7 @@ func (a *APIBackend) GetAPIs(filterSystem *filters.FilterSystem) []rpc.API {
137
144
return apis
138
145
}
139
146
140
- func (a * APIBackend ) blockChain () * core.BlockChain {
147
+ func (a * APIBackend ) BlockChain () * core.BlockChain {
141
148
return a .b .arb .BlockChain ()
142
149
}
143
150
@@ -146,19 +153,24 @@ func (a *APIBackend) GetArbitrumNode() interface{} {
146
153
}
147
154
148
155
func (a * APIBackend ) GetBody (ctx context.Context , hash common.Hash , number rpc.BlockNumber ) (* types.Body , error ) {
149
- if body := a .blockChain ().GetBody (hash ); body != nil {
156
+ if body := a .BlockChain ().GetBody (hash ); body != nil {
150
157
return body , nil
151
158
}
152
159
return nil , errors .New ("block body not found" )
153
160
}
154
161
155
162
// General Ethereum API
156
163
func (a * APIBackend ) SyncProgressMap () map [string ]interface {} {
164
+ if a .sync == nil {
165
+ res := make (map [string ]interface {})
166
+ res ["error" ] = "sync object not set in apibackend"
167
+ return res
168
+ }
157
169
return a .sync .SyncProgressMap ()
158
170
}
159
171
160
172
func (a * APIBackend ) SyncProgress () ethereum.SyncProgress {
161
- progress := a .sync . SyncProgressMap ()
173
+ progress := a .SyncProgressMap ()
162
174
163
175
if len (progress ) == 0 {
164
176
return ethereum.SyncProgress {}
@@ -184,7 +196,7 @@ func (a *APIBackend) FeeHistory(
184
196
}
185
197
186
198
nitroGenesis := rpc .BlockNumber (a .ChainConfig ().ArbitrumChainParams .GenesisBlockNum )
187
- newestBlock , latestBlock := a .blockChain ().ClipToPostNitroGenesis (newestBlock )
199
+ newestBlock , latestBlock := a .BlockChain ().ClipToPostNitroGenesis (newestBlock )
188
200
189
201
maxFeeHistory := a .b .config .FeeHistoryMaxBlockCount
190
202
if blocks > maxFeeHistory {
@@ -260,7 +272,7 @@ func (a *APIBackend) FeeHistory(
260
272
currentTimestampGasUsed = 0
261
273
}
262
274
263
- receipts := a .blockChain ().GetReceiptsByHash (header .ReceiptHash )
275
+ receipts := a .BlockChain ().GetReceiptsByHash (header .ReceiptHash )
264
276
for _ , receipt := range receipts {
265
277
if receipt .GasUsed > receipt .GasUsedForL1 {
266
278
currentTimestampGasUsed += receipt .GasUsed - receipt .GasUsedForL1
@@ -329,17 +341,23 @@ func (a *APIBackend) HeaderByNumber(ctx context.Context, number rpc.BlockNumber)
329
341
}
330
342
331
343
func (a * APIBackend ) HeaderByHash (ctx context.Context , hash common.Hash ) (* types.Header , error ) {
332
- return a .blockChain ().GetHeaderByHash (hash ), nil
344
+ return a .BlockChain ().GetHeaderByHash (hash ), nil
333
345
}
334
346
335
347
func (a * APIBackend ) blockNumberToUint (ctx context.Context , number rpc.BlockNumber ) (uint64 , error ) {
336
348
if number == rpc .LatestBlockNumber || number == rpc .PendingBlockNumber {
337
- return a .blockChain ().CurrentBlock ().Number .Uint64 (), nil
349
+ return a .BlockChain ().CurrentBlock ().Number .Uint64 (), nil
338
350
}
339
351
if number == rpc .SafeBlockNumber {
352
+ if a .sync == nil {
353
+ return 0 , errors .New ("block number not supported: object not set" )
354
+ }
340
355
return a .sync .SafeBlockNumber (ctx )
341
356
}
342
357
if number == rpc .FinalizedBlockNumber {
358
+ if a .sync == nil {
359
+ return 0 , errors .New ("block number not supported: object not set" )
360
+ }
343
361
return a .sync .FinalizedBlockNumber (ctx )
344
362
}
345
363
if number < 0 {
@@ -350,13 +368,13 @@ func (a *APIBackend) blockNumberToUint(ctx context.Context, number rpc.BlockNumb
350
368
351
369
func (a * APIBackend ) headerByNumberImpl (ctx context.Context , number rpc.BlockNumber ) (* types.Header , error ) {
352
370
if number == rpc .LatestBlockNumber || number == rpc .PendingBlockNumber {
353
- return a .blockChain ().CurrentBlock (), nil
371
+ return a .BlockChain ().CurrentBlock (), nil
354
372
}
355
373
numUint , err := a .blockNumberToUint (ctx , number )
356
374
if err != nil {
357
375
return nil , err
358
376
}
359
- return a .blockChain ().GetHeaderByNumber (numUint ), nil
377
+ return a .BlockChain ().GetHeaderByNumber (numUint ), nil
360
378
}
361
379
362
380
func (a * APIBackend ) headerByNumberOrHashImpl (ctx context.Context , blockNrOrHash rpc.BlockNumberOrHash ) (* types.Header , error ) {
@@ -366,7 +384,7 @@ func (a *APIBackend) headerByNumberOrHashImpl(ctx context.Context, blockNrOrHash
366
384
}
367
385
hash , ishash := blockNrOrHash .Hash ()
368
386
if ishash {
369
- return a .blockChain ().GetHeaderByHash (hash ), nil
387
+ return a .BlockChain ().GetHeaderByHash (hash ), nil
370
388
}
371
389
return nil , errors .New ("invalid arguments; neither block nor hash specified" )
372
390
}
@@ -376,17 +394,17 @@ func (a *APIBackend) HeaderByNumberOrHash(ctx context.Context, blockNrOrHash rpc
376
394
}
377
395
378
396
func (a * APIBackend ) CurrentHeader () * types.Header {
379
- return a .blockChain ().CurrentHeader ()
397
+ return a .BlockChain ().CurrentHeader ()
380
398
}
381
399
382
400
func (a * APIBackend ) CurrentBlock () * types.Header {
383
- return a .blockChain ().CurrentBlock ()
401
+ return a .BlockChain ().CurrentBlock ()
384
402
}
385
403
386
404
func (a * APIBackend ) BlockByNumber (ctx context.Context , number rpc.BlockNumber ) (* types.Block , error ) {
387
405
if number == rpc .LatestBlockNumber || number == rpc .PendingBlockNumber {
388
- currentHeader := a .blockChain ().CurrentBlock ()
389
- currentBlock := a .blockChain ().GetBlock (currentHeader .Hash (), currentHeader .Number .Uint64 ())
406
+ currentHeader := a .BlockChain ().CurrentBlock ()
407
+ currentBlock := a .BlockChain ().GetBlock (currentHeader .Hash (), currentHeader .Number .Uint64 ())
390
408
if currentBlock == nil {
391
409
return nil , errors .New ("can't find block for current header" )
392
410
}
@@ -396,11 +414,11 @@ func (a *APIBackend) BlockByNumber(ctx context.Context, number rpc.BlockNumber)
396
414
if err != nil {
397
415
return nil , err
398
416
}
399
- return a .blockChain ().GetBlockByNumber (numUint ), nil
417
+ return a .BlockChain ().GetBlockByNumber (numUint ), nil
400
418
}
401
419
402
420
func (a * APIBackend ) BlockByHash (ctx context.Context , hash common.Hash ) (* types.Block , error ) {
403
- return a .blockChain ().GetBlockByHash (hash ), nil
421
+ return a .BlockChain ().GetBlockByHash (hash ), nil
404
422
}
405
423
406
424
func (a * APIBackend ) BlockByNumberOrHash (ctx context.Context , blockNrOrHash rpc.BlockNumberOrHash ) (* types.Block , error ) {
@@ -422,10 +440,10 @@ func (a *APIBackend) stateAndHeaderFromHeader(ctx context.Context, header *types
422
440
if header == nil {
423
441
return nil , nil , errors .New ("header not found" )
424
442
}
425
- if ! a .blockChain ().Config ().IsArbitrumNitro (header .Number ) {
443
+ if ! a .BlockChain ().Config ().IsArbitrumNitro (header .Number ) {
426
444
return nil , header , types .ErrUseFallback
427
445
}
428
- bc := a .blockChain ()
446
+ bc := a .BlockChain ()
429
447
stateFor := func (header * types.Header ) (* state.StateDB , error ) {
430
448
return bc .StateAt (header .Root )
431
449
}
@@ -454,51 +472,51 @@ func (a *APIBackend) StateAndHeaderByNumberOrHash(ctx context.Context, blockNrOr
454
472
}
455
473
456
474
func (a * APIBackend ) StateAtBlock (ctx context.Context , block * types.Block , reexec uint64 , base * state.StateDB , checkLive bool , preferDisk bool ) (statedb * state.StateDB , release tracers.StateReleaseFunc , err error ) {
457
- if ! a .blockChain ().Config ().IsArbitrumNitro (block .Number ()) {
475
+ if ! a .BlockChain ().Config ().IsArbitrumNitro (block .Number ()) {
458
476
return nil , nil , types .ErrUseFallback
459
477
}
460
478
// DEV: This assumes that `StateAtBlock` only accesses the blockchain and chainDb fields
461
479
return eth .NewArbEthereum (a .b .arb .BlockChain (), a .ChainDb ()).StateAtBlock (ctx , block , reexec , base , checkLive , preferDisk )
462
480
}
463
481
464
482
func (a * APIBackend ) StateAtTransaction (ctx context.Context , block * types.Block , txIndex int , reexec uint64 ) (* core.Message , vm.BlockContext , * state.StateDB , tracers.StateReleaseFunc , error ) {
465
- if ! a .blockChain ().Config ().IsArbitrumNitro (block .Number ()) {
483
+ if ! a .BlockChain ().Config ().IsArbitrumNitro (block .Number ()) {
466
484
return nil , vm.BlockContext {}, nil , nil , types .ErrUseFallback
467
485
}
468
486
// DEV: This assumes that `StateAtTransaction` only accesses the blockchain and chainDb fields
469
487
return eth .NewArbEthereum (a .b .arb .BlockChain (), a .ChainDb ()).StateAtTransaction (ctx , block , txIndex , reexec )
470
488
}
471
489
472
490
func (a * APIBackend ) GetReceipts (ctx context.Context , hash common.Hash ) (types.Receipts , error ) {
473
- return a .blockChain ().GetReceiptsByHash (hash ), nil
491
+ return a .BlockChain ().GetReceiptsByHash (hash ), nil
474
492
}
475
493
476
494
func (a * APIBackend ) GetTd (ctx context.Context , hash common.Hash ) * big.Int {
477
- if header := a .blockChain ().GetHeaderByHash (hash ); header != nil {
478
- return a .blockChain ().GetTd (hash , header .Number .Uint64 ())
495
+ if header := a .BlockChain ().GetHeaderByHash (hash ); header != nil {
496
+ return a .BlockChain ().GetTd (hash , header .Number .Uint64 ())
479
497
}
480
498
return nil
481
499
}
482
500
483
501
func (a * APIBackend ) GetEVM (ctx context.Context , msg * core.Message , state * state.StateDB , header * types.Header , vmConfig * vm.Config , blockCtx * vm.BlockContext ) (* vm.EVM , func () error ) {
484
502
vmError := func () error { return nil }
485
503
if vmConfig == nil {
486
- vmConfig = a .blockChain ().GetVMConfig ()
504
+ vmConfig = a .BlockChain ().GetVMConfig ()
487
505
}
488
506
txContext := core .NewEVMTxContext (msg )
489
- return vm .NewEVM (* blockCtx , txContext , state , a .blockChain ().Config (), * vmConfig ), vmError
507
+ return vm .NewEVM (* blockCtx , txContext , state , a .BlockChain ().Config (), * vmConfig ), vmError
490
508
}
491
509
492
510
func (a * APIBackend ) SubscribeChainEvent (ch chan <- core.ChainEvent ) event.Subscription {
493
- return a .blockChain ().SubscribeChainEvent (ch )
511
+ return a .BlockChain ().SubscribeChainEvent (ch )
494
512
}
495
513
496
514
func (a * APIBackend ) SubscribeChainHeadEvent (ch chan <- core.ChainHeadEvent ) event.Subscription {
497
- return a .blockChain ().SubscribeChainHeadEvent (ch )
515
+ return a .BlockChain ().SubscribeChainHeadEvent (ch )
498
516
}
499
517
500
518
func (a * APIBackend ) SubscribeChainSideEvent (ch chan <- core.ChainSideEvent ) event.Subscription {
501
- return a .blockChain ().SubscribeChainSideEvent (ch )
519
+ return a .BlockChain ().SubscribeChainSideEvent (ch )
502
520
}
503
521
504
522
// Transaction pool API
@@ -526,7 +544,7 @@ func (a *APIBackend) GetPoolTransaction(txHash common.Hash) *types.Transaction {
526
544
}
527
545
528
546
func (a * APIBackend ) GetPoolNonce (ctx context.Context , addr common.Address ) (uint64 , error ) {
529
- stateDB , err := a .blockChain ().State ()
547
+ stateDB , err := a .BlockChain ().State ()
530
548
if err != nil {
531
549
return 0 , err
532
550
}
@@ -566,7 +584,7 @@ func (a *APIBackend) ServiceFilter(ctx context.Context, session *bloombits.Match
566
584
}
567
585
568
586
func (a * APIBackend ) SubscribeLogsEvent (ch chan <- []* types.Log ) event.Subscription {
569
- return a .blockChain ().SubscribeLogsEvent (ch )
587
+ return a .BlockChain ().SubscribeLogsEvent (ch )
570
588
}
571
589
572
590
func (a * APIBackend ) SubscribePendingLogsEvent (ch chan <- []* types.Log ) event.Subscription {
@@ -575,15 +593,15 @@ func (a *APIBackend) SubscribePendingLogsEvent(ch chan<- []*types.Log) event.Sub
575
593
}
576
594
577
595
func (a * APIBackend ) SubscribeRemovedLogsEvent (ch chan <- core.RemovedLogsEvent ) event.Subscription {
578
- return a .blockChain ().SubscribeRemovedLogsEvent (ch )
596
+ return a .BlockChain ().SubscribeRemovedLogsEvent (ch )
579
597
}
580
598
581
599
func (a * APIBackend ) ChainConfig () * params.ChainConfig {
582
- return a .blockChain ().Config ()
600
+ return a .BlockChain ().Config ()
583
601
}
584
602
585
603
func (a * APIBackend ) Engine () consensus.Engine {
586
- return a .blockChain ().Engine ()
604
+ return a .BlockChain ().Engine ()
587
605
}
588
606
589
607
func (b * APIBackend ) PendingBlockAndReceipts () (* types.Block , types.Receipts ) {
0 commit comments