Skip to main content
A wallet or trading app on Elysium needs every movement in its users’ wallets as soon as it happens, to show activity, update balances and send notifications. This guide builds a Turbo pipeline that writes every ERC-20 transfer and every HYPE movement for the wallets you choose into one Postgres table, in both directions. You add and remove wallets by editing a Postgres table, and the running pipeline picks up the change without a redeploy.
To show a wallet’s activity in your app, start with Feeds. The Transfers and Balances endpoints return one wallet’s transfers and balances on Elysium and other chains over REST, with token metadata and USD values. There’s no pipeline or database to run. Data sync, in early access, pushes feed rows to your own database as they land. Use the pipeline below to stream every movement for a large, changing set of wallets into a database you run.

What you’ll need

  1. A Goldsky account and the CLI installed
  1. Install the Goldsky CLI: For macOS/Linux:
    For Windows:
    Windows users need to have Node.js and npm installed first. Download from nodejs.org if not already installed.
  2. Log into your Project by running:
    This opens your browser to sign in (Google, GitHub, SSO, or email). Once you authenticate, the CLI is logged in automatically — there’s no API key to copy or paste.
    On a headless or remote machine (or in CI), create an API key on your Project Settings page and pass it directly with goldsky login --token <API_KEY>. Use goldsky login --no-browser to print the login URL instead of opening a browser.
  3. Now that you are logged in, run goldsky to get started:
  1. A Postgres database and a Goldsky secret for it. The examples call the secret MY_POSTGRES.
  2. Basic familiarity with Turbo pipelines and SQL transforms.

How the pipeline works

  • Two curated Elysium datasets are the sources:
    • elysium_mainnet.erc20_transfers has one row per ERC-20 Transfer event.
    • elysium_mainnet.native_transfers has one row per HYPE transfer, including HYPE sent by contracts in internal calls.
  • A dynamic table holds the wallets to follow.
  • Two transforms keep the transfers where a watched wallet is the sender or the recipient. A UNION ALL combines them, and a Postgres sink writes the result.

Create the wallet table

The pipeline caches the wallet list in memory and checks Postgres for new rows once per second. A cached table must give every new row an increasing timestamp, so create it yourself before you deploy:
Store addresses in lowercase. The datasets use lowercase addresses, and the comparison is exact.

Pipeline YAML

elysium-wallet-activity.yaml
Before you deploy, replace MY_POSTGRES with your secret name in both places. The two datasets use different ID formats (log_… and geth_trace_v2_…), so rows from the two sources never share an id.

Deploy and add wallets

Then add wallets from any Postgres client:
The pipeline loads new rows within about a second. Removals take longer. The cache keeps a deleted wallet until you restart the pipeline with goldsky turbo restart elysium-wallet-activity. If several processes write to the table at the same time, follow the rules for cached tables.

Output

Each row of public.elysium_wallet_activity is one movement: Common tokens to label in your app:

What Elysium activity looks like

Bridged tokens appear as mints and burns. When a watched wallet bridges a token in from HyperEVM, the gateway mints it on Elysium, and withdrawals to HyperEVM burn it: Wrapping HYPE also mints WHYPE. WHYPE on Elysium holds the HYPE behind it. Calling deposit() with HYPE gives two rows in one transaction: a native row from the wallet to the WHYPE contract, and an erc20 row that mints WHYPE from the zero address to the wallet. So a WHYPE row from the zero address is a wrap, not a bridge deposit. Bridged HYPE comes from an aliased address. Elysium credits a HYPE deposit from HyperEVM with a call from the sender’s aliased address: the sender’s HyperEVM address plus 0x1111000000000000000000000000000000001111. The row’s from_address is not an address the user knows. A wallet that bridges to itself shows a native row from its own address plus the offset. To label these rows as deposits, use Track Elysium bridge flows. HYPE that a contract sends is included. native_transfers is built from traces. When a contract pays out HYPE inside a transaction, for example on a swap or an unwrap, the transfer still appears as a native row. Blocks are fast. Elysium can make a block every 100 ms, so many blocks share one block_timestamp. Order a wallet’s history by block_number, not by time.

Notes

  • The pipeline starts at the chain head. A wallet you add now gets its new activity, not its history. To include history, set start_at: earliest on both sources.
  • Every transfer on the chain is read, then filtered. The pipeline is billed on worker hours and records written, not on how many wallets you follow. Each matching movement is one record written to Postgres.

Getting help

Can’t find what you’re looking for? Reach out to us at support@goldsky.com for help.