-
Notifications
You must be signed in to change notification settings - Fork 12
Implement the new transactionReceipts subscription API
#917
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Conversation
WalkthroughThis pull request implements the new Changes
Sequence DiagramsequenceDiagram
participant EventSource as Event Source
participant IngestionEngine as Ingestion Engine
participant ReceiptsPublisher as Receipts Publisher
participant StreamAPI as Stream API
participant Subscriber as Subscriber/WebSocket
EventSource->>IngestionEngine: processEvents(receipts, logs)
IngestionEngine->>ReceiptsPublisher: publish([]*Receipt)
ReceiptsPublisher->>StreamAPI: notify(receipts batch)
Subscriber->>StreamAPI: TransactionReceipts(ctx, filter)
StreamAPI->>StreamAPI: validate txHashes count
StreamAPI->>ReceiptsPublisher: subscribe
ReceiptsPublisher->>StreamAPI: batch notification
StreamAPI->>StreamAPI: filter receipts by txHashes
StreamAPI->>Subscriber: send batch in notification
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~25 minutes
Possibly related PRs
Suggested labels
Suggested reviewers
Poem
Pre-merge checks and finishing touches❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✨ Finishing touches
🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
transactionReceipts subscription API
ee75cc9 to
f9e2865
Compare
4925450 to
0bd1756
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 0
🧹 Nitpick comments (1)
api/stream.go (1)
158-176: Consider precomputing hash lookups.Right now each receipt does an
O(len(txHashes))slices.Contains. With the 200-hash cap that’s fine, but a tiny helper that builds amap[common.Hash]struct{}up front would make the loop constant time and future-proof us if the cap ever grows.
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (7)
api/stream.go(6 hunks)bootstrap/bootstrap.go(4 hunks)models/errors/errors.go(1 hunks)models/events.go(1 hunks)services/ingestion/engine.go(4 hunks)services/ingestion/engine_test.go(5 hunks)tests/web3js/eth_streaming_test.js(3 hunks)
🧰 Additional context used
🧠 Learnings (1)
📚 Learning: 2025-06-19T11:36:25.478Z
Learnt from: m-Peter
Repo: onflow/flow-evm-gateway PR: 831
File: services/requester/batch_tx_pool.go:0-0
Timestamp: 2025-06-19T11:36:25.478Z
Learning: In Go, when copying maps that contain slices (like `map[gethCommon.Address][]pooledEvmTx`), perform deep copies by iterating over the map and copying each slice individually using `make()` and `copy()` to avoid shared references that could lead to race conditions and data corruption.
Applied to files:
api/stream.go
🧬 Code graph analysis (5)
tests/web3js/eth_streaming_test.js (2)
tests/web3js/config.js (2)
require(1-1)web3(2-2)tests/web3js/helpers.js (4)
signedTx(66-66)signedTx(79-79)conf(2-2)web3(5-5)
services/ingestion/engine_test.go (2)
models/stream.go (1)
NewPublisher(14-19)models/receipt.go (1)
Receipt(18-36)
api/stream.go (4)
models/stream.go (2)
Publisher(9-12)Subscription(49-53)models/receipt.go (1)
Receipt(18-36)models/errors/errors.go (1)
ErrExceedMaxTxHashes(20-20)eth/types/types.go (1)
MarshalReceipt(514-578)
services/ingestion/engine.go (4)
storage/index.go (1)
ReceiptIndexer(61-82)models/stream.go (1)
Publisher(9-12)models/receipt.go (1)
Receipt(18-36)storage/pebble/receipts.go (1)
Receipts(20-22)
bootstrap/bootstrap.go (3)
storage/pebble/receipts.go (1)
Receipts(20-22)models/stream.go (2)
Publisher(9-12)NewPublisher(14-19)models/receipt.go (1)
Receipt(18-36)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
- GitHub Check: Test
🔇 Additional comments (6)
models/events.go (1)
80-83: Nice alignment with upstream log schema.Adding
BlockTimestampto each log keeps our receipts consistent with go-ethereum’s v1.16.x payloads that already shipblockTimestamp, so downstream consumers don’t need an extra block lookup. (chainrelease.info)models/errors/errors.go (1)
19-21: Error surface matches the new subscription contract.Exporting
ErrExceedMaxTxHashesgives the API layer a precise failure mode when enforcing the hash cap.services/ingestion/engine_test.go (1)
74-83: Tests updated for the extra publisher.Thanks for threading the receipts publisher through the test harness—this guards the constructor signature change right away.
services/ingestion/engine.go (1)
208-214: Receipts published post-commit.Emitting through
receiptsPublisheronly afterindexEvents(and the batch commit) keeps subscribers from racing partially persisted data—good call.tests/web3js/eth_streaming_test.js (1)
166-204: Coverage for hash-filtered subscriptions.Great to see the second leg asserting that only the requested hashes surface—this will catch regressions in the filtering logic quickly.
bootstrap/bootstrap.go (1)
58-58: LGTM! Clean wiring of receipts publisher throughout the bootstrap.The receipts support is correctly threaded through all layers:
- Storage and publisher infrastructure added to core structs
- Publisher initialized in the constructor
- Properly wired to both ingestion engine (for publishing) and stream API (for subscriptions)
The implementation follows the established pattern for blocks, transactions, and logs, ensuring consistency across the codebase.
Also applies to: 65-65, 109-109, 204-204, 344-344
Closes: #906
Description
When
eth_subscribeis given thetransactionReceiptstype, it creates a subscription that fires transaction receipts when transactions are included in blocks. Optional tx hashes can be passed in.For contributor use:
masterbranchFiles changedin the Github PR explorerSummary by CodeRabbit
Release Notes
New Features
Tests