#  Listening to Arbitrum events, fetching 4844 blobs, and destructuring batches for an L2 indexer

**URL:** <https://forum.arbitrum.foundation/t/listening-to-arbitrum-events-fetching-4844-blobs-and-destructuring-batches-for-an-l2-indexer/30045>\
**Category:** Technical Discussion\
**Created:** [October 1, 2025, 12:58pm UTC](https://forum.arbitrum.foundation/t/listening-to-arbitrum-events-fetching-4844-blobs-and-destructuring-batches-for-an-l2-indexer/30045 "2025-10-01T12:58:49Z")\
**Posts on this page:** 4\
**Page:** 1

<div class="post-metadata">

**Author:** ![jk\_it\_is](https://avatars.discourse-cdn.com/v4/letter/j/898d66/32.png) [@jk\_it\_is](https://forum.arbitrum.foundation/u/jk_it_is)\
**Post date:** [October 1, 2025, 12:58pm UTC](https://forum.arbitrum.foundation/t/listening-to-arbitrum-events-fetching-4844-blobs-and-destructuring-batches-for-an-l2-indexer/30045/1 "2025-10-01T12:58:49Z")

</div>

What I’m building

- We’re building an L2 indexer that listens to Arbitrum contracts, fetches associated 4844 blobs, and decodes the batches into L2 messages and transactions.

What I need help with

- I have a basic working model for listening to arbitrum’s sequence inbox contract on ethereum for the event **`SequencerBatchDelivered`** : 0x1c479675ad559DC151F6Ec7ed3FbF8ceE79582B6. Is this the right contract to keep listening to?

- I am using blobscan’s APIs to fetch the blob for the current block submitted by Arbitrum’s contract.

- Below is the production-safe way to decode the blob. Help me understand if this is right finding.

Brief findings so far (sanity check)

- Validating KZG commitment before decoding seems correct. So i believe the blob that I am fetching is right according to the metadata found in the event.

- Below is a top-level branching according to first byte of the blob that I’m following.

- Nitro batch → RLP segments (no outer list), where segment kinds: 0=L2 message, 1=L2 message brotli-compressed, 2=delayed pointer.

- L2 message kinds: 0x04=SignedTx (accept legacy/0x01/0x02), 0x03=Nested batch (8-byte big-endian frame lengths), 0x09=synthetic delayed.

Questions

- Is this branching/decoding strategy correct for production scenarios?

- Are we missing any common edge cases or alternative encodings we should expect?

- Any references or best practices for DAC fetch and base64 handling, and for robust RLP segment iteration?

Was reviewing this repo: [arbitrum-cli-tools/packages/batch-tx-handler/src/main.ts at main · OffchainLabs/arbitrum-cli-tools · GitHub](https://github.com/OffchainLabs/arbitrum-cli-tools/blob/main/packages/batch-tx-handler/src/main.ts) which helped me come up with the above findings. Is this a good place to start with? or are there any other resources which I can use to move ahead?

Here is my rust codebase

- GitHub: [GitHub - Jkrish1011/ZK-DeFI-Indexer: This project is an zero knowledge based indexer which is targetting major DeFI protocols](https://github.com/Jkrish1011/ZK-DeFI-Indexer)

---

<div class="post-metadata">

**Author:** ![TempeTechie](https://yyz1.discourse-cdn.com/flex029/user_avatar/forum.arbitrum.foundation/tempetechie/32/2730_2.png) [@TempeTechie](https://forum.arbitrum.foundation/u/TempeTechie)\
**Post date:** [October 3, 2025, 10:07am UTC](https://forum.arbitrum.foundation/t/listening-to-arbitrum-events-fetching-4844-blobs-and-destructuring-batches-for-an-l2-indexer/30045/2 "2025-10-03T10:07:29Z")

</div>

Hey, these questions may be too technical for an average DAO delegate, but perhaps @stonecoldpat could answer some, or point you to where you can get the answers.

Or maybe some of the Security Council candidates with deep technical understanding of Arbitrum could answer these, e.g. @gustavo-grieco, @emilianobonassi, @Cyfrin, @WakeUpLabs, @dzack23, @pablitoeth etc.

---

<div class="post-metadata">

**Author:** ![gustavo-grieco](https://yyz1.discourse-cdn.com/flex029/user_avatar/forum.arbitrum.foundation/gustavo-grieco/32/14855_2.png) [@gustavo-grieco](https://forum.arbitrum.foundation/u/gustavo-grieco)\
**Post date:** [October 3, 2025, 10:43am UTC](https://forum.arbitrum.foundation/t/listening-to-arbitrum-events-fetching-4844-blobs-and-destructuring-batches-for-an-l2-indexer/30045/3 "2025-10-03T10:43:58Z")

</div>

Hello @jk_it_is !

Your best source of information on the block parsing is the nitro code itself, in particular:

- [nitro/arbstate/inbox.go at master · OffchainLabs/nitro · GitHub](https://github.com/OffchainLabs/nitro/blob/master/arbstate/inbox.go#L68-L113:) : initial parsing of the block, with DA headers
- [nitro/daprovider at master · OffchainLabs/nitro · GitHub](https://github.com/OffchainLabs/nitro/tree/master/daprovider) : complete implementation of the DA information extraction.

Start from the inbox.go file and review all the called DA functions in `nitro/daprovider`.

In general, I think you are in the right track. There are no “alternative” encodings, however, some L2 messages changed a bit over time, so depending on the block number there are differences that must be accounted to preserved the code retro compatible. Keep that in mind if you want to parse past Arbitrum events as well.

Regards,

Gustavo.

---

<div class="post-metadata">

**Author:** ![jk\_it\_is](https://avatars.discourse-cdn.com/v4/letter/j/898d66/32.png) [@jk\_it\_is](https://forum.arbitrum.foundation/u/jk_it_is)\
**Post date:** [October 3, 2025, 1:55pm UTC](https://forum.arbitrum.foundation/t/listening-to-arbitrum-events-fetching-4844-blobs-and-destructuring-batches-for-an-l2-indexer/30045/4 "2025-10-03T13:55:02Z")

</div>

Thanks @gustavo-grieco - Looking into the links you have shared.
