feat(dex): integrate Agra DEX (ethereum, hyperevm) - #9839
Conversation
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Drop the duplicated taker aggregate leg of Seaport matchOrders settlements using settlement_evt_ordersmatched; set agra_start_date to 2026-03-01. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Collapse the near-identical agra_ethereum/agra_hyperevm base_trades models (105 lines each, differing only by chain) into a parameterized agra_base_trades(blockchain, start_date) macro. Each chain model is now config + a one-line macro call. Compiled SQL is unchanged. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Add a branded agra.trades view via dex_project_trades('agra'), unioning the
enriched dex_<chain>_trades filtered to project = 'agra'. Inherits amount_usd
from the sector enrichment; currently covers ethereum and hyperevm. Register
the view in dex_trades_views_schema.yml.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: bbfd7a2670
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| inner join consideration_side con | ||
| on con.tx_hash = o.tx_hash | ||
| and con.evt_index = o.evt_index |
There was a problem hiding this comment.
Preserve item identity when joining Seaport legs
When an Agra OrderFulfilled contains more than one ERC20 offer or consideration item, offer_side and consideration_side each produce one row per token, but this join only uses tx_hash and evt_index. A single event then expands into every offer-token × consideration-token combination while the model is keyed and tested only by tx_hash, evt_index, so multi-asset fills will either fail the unique test/merge or be arbitrarily de-duped downstream in dex_base_trades_macro.
Useful? React with 👍 / 👎.
There was a problem hiding this comment.
This shouldn't happen for Agra. It's a CLOB — every order matches exactly one ERC20 against the quote token (a/b or c/b). A single order paying two tokens for one (a + c / b) isn't a valid trade; it could only come from a contract failure. Confirmed across all production data so far (247 events: 235 ethereum, 12 hyperevm) — every OrderFulfilled has exactly one distinct ERC20 per side.
And even if it did occur, a multi-asset fill isn't representable in dex.trades anyway (one token_bought_address / one token_sold_address per row, and no prices at the base layer to split a leg), so it's intentionally out of scope — consistent with the rest of the base-trades sector.
That said, I added a deterministic guard so a malformed order can never silently break the (tx_hash, evt_index) unique key or the incremental merge: each side collapses to one row per event via row_number() (QUALIFY isn't supported in DuneSQL/Trino). It's a verified no-op on all current data — old-vs-new output is byte-identical (209 = 209 rows, empty symmetric difference) — and the unique key stays the tripwire if an anomalous order ever appears.
Collapse offer/consideration to one deterministic row per (tx_hash, evt_index) via row_number, so a malformed multi-token Agra order cannot break the unique key or the incremental merge. Agra is a CLOB (1:1 settlement), so this is a no-op on all real data; verified output is byte-identical to before. Uses a row_number subquery rather than QUALIFY, which DuneSQL/Trino does not support. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Thank you for contributing to Spellbook 🪄
Description
Integrates Agra, a Seaport-fork order-settlement (direct) DEX, into the DEX sector for ethereum and hyperevm.
What's included
agra_multichain(sources/_sector/dex/trades/ethereum/_sources.yml), withsettlement_evt_orderfulfilledandsettlement_evt_ordersmatched. A single multichain source serves both chains (the decoded table is multichain).agra_base_trades(blockchain, start_date)macro — each chain model is config + a one-line macro call.dex_ethereum_base_trades/dex_hyperevm_base_tradesand index_info.unique_combination_of_columns,check_dex_base_trades_seed) + seeds per chain.agra.tradesproject view viadex_project_trades('agra')— inheritsamount_usdfrom the sector enrichment.Notes
OrderFulfilled(offer → token_bought, consideration → token_sold) and dedupes the aggregate taker leg ofmatchOrderssettlements.volume_usdcomes from the standard sector enrichment index.trades; the project view just filters the enriched per-chain trades.🤖 Generated with Claude Code