jagnani73P.03
[the record]STATUS: NTU SINGAPORE — AUG 2026

GoldRush Decoder

OPEN SOURCE · 200+ CHAINS
raw EVM logs in, structured human events out — one endpoint, 200+ chains, enriched with metadata and pricing
fig. 1 — a raw event log decoding into a named, enriched eventdecode() · Transfer

RAW LOG · hex

topic0 0xddf252ad…b3ef

topic1 0x000…d8dA…96045

topic2 0x000…aB58…aeC9B

data 0x0000…1158e46091

DECODED · structured

Transfer {

from:

to:

value:

value_usd:

}

01THE PROBLEMlogs are opaque by default

On-chain, everything is an event — but raw logs are packed hex: topics and data, no names, no meaning without the ABI and context to read them.

GoldRush Decoder solves this at the infrastructure level: a single REST endpoint takes a chain name and a transaction hash, and returns an array of fully structured, labelled event objects — enriched with token metadata and USD pricing — across 200+ EVM chains. I built it from the ground up at Covalent.

02THE ARCHITECTUREa decoder registry · protocol-name:EventName

At startup, initDecoder scans a protocol directory and builds a map of decoder keys — strings like uniswap-v3:Swap — to handlers registered via .on(). Each handler gets the raw log, the full transaction, and the Covalent client for live enrichment. A fallback decoder guarantees the API always returns something meaningful.

01

REGISTER

scan protocols, build the key map

initDecoder · .on()

02

MATCH

log → the right decoder, or fallback

decoder registry

03

DECODE

typed, named event object

TypeScript

04

ENRICH

token metadata + USD pricing

Covalent API

STACK — TypeScript · Node · Express · Covalent API · CLI scaffolding
03THE HARD PARTbatched-parallel log processing

A single transaction can emit dozens of logs from different protocols — awaiting each decoder serially was unacceptably slow. I redesigned the execution model to fan out decoder calls in parallel batches while preserving original log order in the response:

01

parallel batches

decoder invocations fanned out, not serialized

02

order preserved

responses re-sequenced to original log order

03

fallback decoder

unknown events still return meaning

04

contributor CLI

yarn add-config scaffolds a new protocol in one command

04IN THE WILDplates 01–02 · code · the decoder API
GoldRushDecoder.on(
  "uniswap-v3:Swap",
  ["base-mainnet"],
  async (log, tx, chain, covalent) => {
    const { sender, amount0, amount1 } =
      decodeEventLog(log);

    return {
      name: "Swap",
      protocol: { name: "Uniswap V3" },
      ...await enrichWithPricing(
        amount0, amount1, covalent,
      ),
    };
  },
);