Skip to content

Commit 05b1de0

Browse files
committed
Fix breaking changes due to BlockNumber special values
1 parent 0c3dbdf commit 05b1de0

4 files changed

Lines changed: 53 additions & 53 deletions

File tree

api/api.go

Lines changed: 33 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -295,15 +295,12 @@ func (b *BlockChainAPI) GetTransactionByBlockNumberAndIndex(
295295
return nil, err
296296
}
297297

298-
if blockNumber < rpc.EarliestBlockNumber {
299-
latestBlockNumber, err := b.blocks.LatestEVMHeight()
300-
if err != nil {
301-
return handleError[*ethTypes.Transaction](err, l, b.collector)
302-
}
303-
blockNumber = rpc.BlockNumber(latestBlockNumber)
298+
height, err := resolveBlockNumber(blockNumber, b.blocks)
299+
if err != nil {
300+
return nil, err
304301
}
305302

306-
block, err := b.blocks.GetByHeight(uint64(blockNumber))
303+
block, err := b.blocks.GetByHeight(height)
307304
if err != nil {
308305
return handleError[*ethTypes.Transaction](err, l, b.collector)
309306
}
@@ -387,6 +384,7 @@ func (b *BlockChainAPI) GetBlockByHash(
387384
// - When blockNr is -2 the chain latest block is returned.
388385
// - When blockNr is -3 the chain finalized block is returned.
389386
// - When blockNr is -4 the chain safe block is returned.
387+
// - When blockNr is -5 the chain earliest block is returned.
390388
// - When fullTx is true all transactions in the block are returned, otherwise
391389
// only the transaction hash is returned.
392390
func (b *BlockChainAPI) GetBlockByNumber(
@@ -403,13 +401,9 @@ func (b *BlockChainAPI) GetBlockByNumber(
403401
return nil, err
404402
}
405403

406-
height := uint64(blockNumber)
407-
var err error
408-
if blockNumber < 0 {
409-
height, err = b.blocks.LatestEVMHeight()
410-
if err != nil {
411-
return handleError[*ethTypes.Block](err, l, b.collector)
412-
}
404+
height, err := resolveBlockNumber(blockNumber, b.blocks)
405+
if err != nil {
406+
return handleError[*ethTypes.Block](err, l, b.collector)
413407
}
414408

415409
block, err := b.blocks.GetByHeight(height)
@@ -430,7 +424,7 @@ func (b *BlockChainAPI) GetBlockByNumber(
430424
func (b *BlockChainAPI) GetBlockReceipts(
431425
ctx context.Context,
432426
blockNumberOrHash rpc.BlockNumberOrHash,
433-
) ([]map[string]interface{}, error) {
427+
) ([]map[string]any, error) {
434428
l := b.logger.With().
435429
Str("endpoint", "getBlockReceipts").
436430
Str("hash", blockNumberOrHash.String()).
@@ -442,29 +436,29 @@ func (b *BlockChainAPI) GetBlockReceipts(
442436

443437
height, err := resolveBlockTag(&blockNumberOrHash, b.blocks, b.logger)
444438
if err != nil {
445-
return handleError[[]map[string]interface{}](err, l, b.collector)
439+
return handleError[[]map[string]any](err, l, b.collector)
446440
}
447441

448442
block, err := b.blocks.GetByHeight(height)
449443
if err != nil {
450-
return handleError[[]map[string]interface{}](err, l, b.collector)
444+
return handleError[[]map[string]any](err, l, b.collector)
451445
}
452446

453-
receipts := make([]map[string]interface{}, len(block.TransactionHashes))
447+
receipts := make([]map[string]any, len(block.TransactionHashes))
454448
for i, hash := range block.TransactionHashes {
455449
tx, err := b.transactions.Get(hash)
456450
if err != nil {
457-
return handleError[[]map[string]interface{}](err, l, b.collector)
451+
return handleError[[]map[string]any](err, l, b.collector)
458452
}
459453

460454
receipt, err := b.receipts.GetByTransactionID(hash)
461455
if err != nil {
462-
return handleError[[]map[string]interface{}](err, l, b.collector)
456+
return handleError[[]map[string]any](err, l, b.collector)
463457
}
464458

465459
receipts[i], err = ethTypes.MarshalReceipt(receipt, tx)
466460
if err != nil {
467-
return handleError[[]map[string]interface{}](err, l, b.collector)
461+
return handleError[[]map[string]any](err, l, b.collector)
468462
}
469463
}
470464

@@ -510,15 +504,12 @@ func (b *BlockChainAPI) GetBlockTransactionCountByNumber(
510504
return nil, err
511505
}
512506

513-
if blockNumber < rpc.EarliestBlockNumber {
514-
latestBlockNumber, err := b.blocks.LatestEVMHeight()
515-
if err != nil {
516-
return handleError[*hexutil.Uint](err, l, b.collector)
517-
}
518-
blockNumber = rpc.BlockNumber(latestBlockNumber)
507+
height, err := resolveBlockNumber(blockNumber, b.blocks)
508+
if err != nil {
509+
return handleError[*hexutil.Uint](err, l, b.collector)
519510
}
520511

521-
block, err := b.blocks.GetByHeight(uint64(blockNumber))
512+
block, err := b.blocks.GetByHeight(height)
522513
if err != nil {
523514
return handleError[*hexutil.Uint](err, l, b.collector)
524515
}
@@ -638,10 +629,15 @@ func (b *BlockChainAPI) GetLogs(
638629
latest := big.NewInt(int64(h))
639630

640631
// if special value, use latest block number
641-
if from.Cmp(models.EarliestBlockNumber) < 0 {
632+
if from.Cmp(models.EarliestBlockNumber) == 0 {
633+
from = big.NewInt(0)
634+
} else if from.Cmp(models.PendingBlockNumber) < 0 {
642635
from = latest
643636
}
644-
if to.Cmp(models.EarliestBlockNumber) < 0 {
637+
638+
if to.Cmp(models.EarliestBlockNumber) == 0 {
639+
to = big.NewInt(0)
640+
} else if to.Cmp(models.PendingBlockNumber) < 0 {
645641
to = latest
646642
}
647643

@@ -797,14 +793,9 @@ func (b *BlockChainAPI) FeeHistory(
797793
)
798794
}
799795

800-
lastBlockNumber := uint64(lastBlock)
801-
var err error
802-
if lastBlock < 0 {
803-
// From the special block tags, we only support "latest".
804-
lastBlockNumber, err = b.blocks.LatestEVMHeight()
805-
if err != nil {
806-
return handleError[*ethTypes.FeeHistoryResult](err, l, b.collector)
807-
}
796+
lastBlockNumber, err := resolveBlockNumber(lastBlock, b.blocks)
797+
if err != nil {
798+
return handleError[*ethTypes.FeeHistoryResult](err, l, b.collector)
808799
}
809800

810801
var (
@@ -1046,17 +1037,17 @@ func (b *BlockChainAPI) GetUncleByBlockHashAndIndex(
10461037
ctx context.Context,
10471038
blockHash common.Hash,
10481039
index hexutil.Uint,
1049-
) (map[string]interface{}, error) {
1050-
return map[string]interface{}{}, nil
1040+
) (map[string]any, error) {
1041+
return map[string]any{}, nil
10511042
}
10521043

10531044
// GetUncleByBlockNumberAndIndex returns the uncle block for the given block hash and index.
10541045
func (b *BlockChainAPI) GetUncleByBlockNumberAndIndex(
10551046
ctx context.Context,
10561047
blockNumber rpc.BlockNumber,
10571048
index hexutil.Uint,
1058-
) (map[string]interface{}, error) {
1059-
return map[string]interface{}{}, nil
1049+
) (map[string]any, error) {
1050+
return map[string]any{}, nil
10601051
}
10611052

10621053
// MaxPriorityFeePerGas returns a suggestion for a gas tip cap for dynamic fee transactions.

api/debug.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -359,7 +359,11 @@ func (d *DebugAPI) traceBlockByNumber(
359359
number rpc.BlockNumber,
360360
config *tracers.TraceConfig,
361361
) ([]*txTraceResult, error) {
362-
block, err := d.blocks.GetByHeight(uint64(number.Int64()))
362+
height, err := resolveBlockNumber(number, d.blocks)
363+
if err != nil {
364+
return nil, err
365+
}
366+
block, err := d.blocks.GetByHeight(height)
363367
if err != nil {
364368
return nil, err
365369
}

api/utils.go

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -55,29 +55,31 @@ func resolveBlockTag(
5555
}
5656

5757
func resolveBlockNumber(
58-
number rpc.BlockNumber,
58+
blockNumber rpc.BlockNumber,
5959
blocksDB storage.BlockIndexer,
6060
) (uint64, error) {
61-
height := number.Int64()
62-
6361
// if special values (latest) we return latest executed height
6462
//
6563
// all the special values are:
64+
// EarliestBlockNumber = BlockNumber(-5)
6665
// SafeBlockNumber = BlockNumber(-4)
6766
// FinalizedBlockNumber = BlockNumber(-3)
6867
// LatestBlockNumber = BlockNumber(-2)
6968
// PendingBlockNumber = BlockNumber(-1)
7069
//
7170
// EVM on Flow does not have these concepts, but the latest block is the closest fit
72-
if height < 0 {
73-
executed, err := blocksDB.LatestEVMHeight()
71+
height := uint64(blockNumber)
72+
var err error
73+
if blockNumber == rpc.EarliestBlockNumber {
74+
height = 0
75+
} else if blockNumber <= rpc.PendingBlockNumber {
76+
height, err = blocksDB.LatestEVMHeight()
7477
if err != nil {
7578
return 0, err
7679
}
77-
height = int64(executed)
7880
}
7981

80-
return uint64(height), nil
82+
return height, nil
8183
}
8284

8385
// decodeHash parses a hex-encoded 32-byte hash. The input may optionally

models/block.go

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,12 @@ import (
1414
)
1515

1616
var (
17-
LatestBlockNumber = big.NewInt(-2)
18-
EarliestBlockNumber = big.NewInt(0)
19-
zeroGethHash = gethCommon.HexToHash("0x0")
17+
EarliestBlockNumber = big.NewInt(-5)
18+
SafeBlockNumber = big.NewInt(-4)
19+
FinalizedBlockNumber = big.NewInt(-3)
20+
LatestBlockNumber = big.NewInt(-2)
21+
PendingBlockNumber = big.NewInt(-1)
22+
zeroGethHash = gethCommon.HexToHash("0x0")
2023
)
2124

2225
func GenesisBlock(chainID flow.ChainID) *Block {

0 commit comments

Comments
 (0)