Skip to content

docs: add AGGLAYER provider, Bali chains and ETA behaviour (agglayer/issues#46) - #124

Open
arnaubennassar wants to merge 7 commits into
mainfrom
agglayer-provider-docs
Open

arnaubennassar wants to merge 7 commits into
mainfrom
agglayer-provider-docs

Conversation

@arnaubennassar

@arnaubennassar arnaubennassar commented Oct 15, 2026 •

Copy link
Copy Markdown

The docs do not cover the AGGLAYER route provider, the two Bali pilot chains, or the multi-hour ETA behavior integrators will see on AggLayer routes — the first integrator to quote a Bali corridor sees a 3-hour ETA materialize from a 15-minute route with no documented explanation. This PR documents all three, with every behavioral claim verified against the SDK implementation that ships the behavior (0xsequence/trails#1297): estimate-driven polling windows with 20-minute/3-hour origin floors, origin-based direction (any L2 origin is an exit), the Bali PP and FEP pilot chains (EVM chain IDs 828282/858585, Sepolia L1 11155111), and measured pilot claim-gas figures.

  • Adds AGGLAYER to the provider list and supported chains: the Bali pilot testnet networks — EVM chain IDs 828282/858585, AggLayer rollup IDs 82 (PP) and 85 (FEP), testnet, native ETH, Sepolia L1 (11155111), verified on-chain; no public block explorer exists yet.
  • Documents the ETA model as shipped: any L2-origin hop (82→85, 85→82) is an exit floored at 3 hours; the displayed estimate is the quote's estimate raised to the direction floor and the receipt-polling window is max(estimate × 1.5, floor). Raw route estimates are ≈10–15 min (82→85) and ≈20 min (85→82) in the pilot measurements.
  • Documents the missing-estimate behavior: a quote that carries no completion estimate displays and polls the direction floor itself.
  • Documents user-paid claim gas (≈1.02M first claim, ≈228k repeat ERC-20, ≈150k ETH, × the claim chain's gas price) — pilot measurements, not guarantees.

Related: SDK work on 0xsequence/trails#1297 (the polling windows, direction rule and Bali chain registry this documents) and 0xsequence/trails#1227 (the AGGLAYER provider it builds on); token lists 0xsequence/token-directory#162; the API side 0xsequence/trails-api#1186 (agglayer/issues#42), which is what serves the Bali corridors these pages describe.

On token listings: these docs enumerate no token addresses — the SDK registry and demo reference the verified on-chain pilot contracts directly (the USDC wrapper, JTT, E2E), while the public token dataset (0xsequence/token-directory#162) intentionally lists the native-ETH sentinels first and adds the wrapped ERC-20s once the Bali team confirms metadata. The two surfaces are independent.

Note: commit 0157570 uses a fix: prefix against this repo's docs: convention — the content is accurate; kept as-is (additive history, flattened on squash-merge).

Closes agglayer/issues#46

@mintlify

mintlify Bot commented Oct 15, 2026 •

Copy link
Copy Markdown
Contributor

Preview deployment for your docs. Learn more about Mintlify Previews.

Project Status Preview Updated
trails 🟢 Ready View Preview Oct 20, 2026, 5:13 PM

💡 Tip: Enable Automations to automatically generate PRs for you.

@arnaubennassar

Copy link
Copy Markdown
Author

@claude

Verified on-chain via eth_chainId (agglayer/issues#39, gke configs, live
RPC). Also drop the agglayer/networks registry reference (superseded by
the SDK chain registry). Refs agglayer/issues#46.

@arnaubennassar arnaubennassar left a comment

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Verdict: NEEDS WORK — the Bali chain IDs are still given as 82/85 in three places (the follow-up fixed only the new table), and the ETA floors need clarifying before readers can rely on them.

Reviewed at 0157570 against the on-chain Bali values: EVM chain IDs 828282 (rollup 82, PP) and 858585 (rollup 85, FEP), Sepolia L1 11155111, native ETH, no public explorer.

What checks out: the new Testnet Chains table (828282/858585, ETH, Sepolia 11155111), the rollup-ID clarification in the <Note>, no explorer URLs, and no pointer to the networks repo. Internal links (/sdk/quote-providers) resolve to an existing page.

Blocking

  1. resources/supported-chains.mdx, Route provider table, AggLayer row — "Bali pilot testnet chains 82/85" uses rollup IDs where the table above says 828282/858585. Use "Bali pilot testnet chains (828282, 858585)".
  2. sdk/quote-providers.mdx, AggLayer section, intro paragraph — "chain 82 (PP) and chain 85 (FEP)" calls rollup IDs chain IDs. Suggest "Bali PP (chain ID 828282, rollup ID 82) and Bali FEP (chain ID 858585, rollup ID 85)".
  3. sdk/quote-providers.mdx, AggLayer section, "Slow routes" bullet — "the FEP chain (85)", "82 → 85" and "85 → 82" have the same problem. A reader who passes 85 as a chain ID gets a different chain, or none. Use 858585/828282 here, or name the chains ("Bali PP → Bali FEP").
  4. sdk/quote-providers.mdx, "ETA-driven waits" bullet — floors are not defined clearly enough to rely on. "20 minutes for transfers entering from the L1, 3 hours for exits" never says what an "exit" is. Direction is decided by the origin chain: an L1 origin is an entry, and any L2 origin is an exit. That includes L2→L2 hops such as 828282 ↔ 858585, which are the only routes this page documents. Read plainly, a Bali→Bali transfer looks like it gets the 20-minute entry floor, but the code gives it the 3-hour floor.
    • The same bullet should say that the floored figure is what the quote and widget display. Without that, the "typical 10–15 / ~20 minutes" figures in the next bullet look like they contradict a 3-hour estimate on the quote.
    • Please also reconcile the 3-hour floor with the expected behaviour that only L1-origin quotes reach the ~8100 s (2h15m+) polling window and that L2-origin estimates are shorter. See the first question below.

Nits

  1. sdk/quote-providers.mdx, "Slow routes" bullet — "can take 90 minutes or more" for 85-origin hops sits right next to "about 20 minutes for 85 → 82". Both are origin-85 routes, so the two statements read as contradictory. Say when the slow path applies (the L1 global exit root change must land before the claim), or give one range per direction.
  2. sdk/quote-providers.mdx, "L1 data fee" bullet — the figures are claim gas (1.02M / 228k / 150k), not a fee. The bullet doesn't say who pays, in which currency, or whether the user sees it. "Corridors" is also not defined for readers. Either reword to say what the user sees, or drop the exact gas numbers, which will go stale.
  3. sdk/quote-providers.mdx, AggLayer config example — <Swap apiKey="..." bridgeProvider="AGGLAYER" /> matches the neighbouring examples but doesn't help anyone reach the Bali chains. Add a concrete example with from/to on the Bali chain IDs and ETH. For Bali→Bali that gives the reader a copy-pasteable route, and it shows the ID form to use.
  4. resources/supported-chains.mdx, <Note> — "Bridge transfers on these chains wait for the quote's completion estimate" is loose. The SDK polls for the estimate × 1.5, raised to a floor. Link to the AggLayer anchor (/sdk/quote-providers#agglayer) instead of the page root, so readers land on the ETA text.
  5. resources/supported-chains.mdx, Testnet Chains — add one line saying there is currently no public block explorer for either chain, so readers don't go looking. Don't add URLs.
  6. sdk/quote-providers.mdx, "Available Providers" entry — "(Polygon AggLayer)" is the only place the product is called that. The section and the chain table use "AggLayer". Pick one.

Questions

  • ETA floors (item 4): the docs say 20 min (L1 origin) and 3 h (L2 origin). The expected behaviour is that AggLayer exit claims wait for the L1 finality/claim window, that only L1-origin quotes can reach the ~8100 s floor, and that L2-origin estimates are shorter. Which is the intended product behaviour? The SDK change currently uses an origin-based 20 min / 3 h split, plus a polling window of estimate × 1.5. If the SDK is right, the docs need the "exit = L2 origin" definition. If the behaviour above is right, the SDK and these numbers both need another look.
  • Release sequencing: this describes SDK behaviour (estimate-driven polling, the Bali chain registry) that depends on the SDK PRs. Should the docs wait for an SDK release, or is a version note wanted?
  • Sepolia: the section says the chains "settle to" Sepolia, and L1-origin quotes imply Sepolia as an origin. Is Sepolia itself a Trails-supported chain? If so, it belongs in the Testnet table. If not, say so.

…ayer example (agglayer/issues#46)

- Use EVM chain IDs 828282/858585 in the provider table, AggLayer intro
  and slow-routes text; label 82/85 as AggLayer rollup IDs everywhere
- Rewrite the ETA section per the SDK implementation: direction is set by
  the quote's origin chain (L1 origin = entry, any L2 origin = exit,
  including Bali-to-Bali hops), entries floor at 20 minutes and exits at
  3 hours, the displayed estimate is the estimate raised to the floor,
  and the receipt-polling window is max(estimate x 1.5, floor)
- Recast the 'L1 data fee' bullet as user-paid claim gas
- Extend the AggLayer config example with from/to on the Bali chain IDs
- Add Sepolia (11155111) to the testnet table — verified supported in
  the SDK chain registry (supportedSequenceTestnetChains/ALL_CHAINS)
- Note there is no public block explorer for the Bali chains yet, that
  AGGLAYER ships with the upcoming SDK release, tighten the Note, link
  the ETA anchor, and standardize on 'AggLayer'
@arnaubennassar

Copy link
Copy Markdown
Author

Pushed 1f5da4b addressing the review:

Blockers

  • The three remaining 82/85-as-chain-ID spots are fixed: the provider-table row in Supported Chains, the AggLayer intro here, and the slow-routes bullet now use EVM chain IDs 828282/858585 (or the Bali PP / Bali FEP names); where 82/85 are kept, they're explicitly labeled AggLayer rollup IDs.
  • The ETA section is rewritten to match the SDK implementation (routeDuration.ts on the SDK side): direction is decided by the quote's origin chain — an L1 origin (Sepolia) is an entry, and any L2 origin is an exit, including Bali-to-Bali hops. Entries floor at 20 minutes, exits at 3 hours (exit claims wait for the L1 global exit root). The displayed estimate is the quote's estimate raised to that floor, and the receipt-polling window is max(estimate × 1.5, floor) — so a 90-minute estimate polls 2h15m from an L1 origin but 3 hours from an L2 origin. The docs now say the floored figure is what the quote/widget shows and what the SDK polls.
  • The "90 minutes or more" vs "about 20 minutes" contradiction is resolved under that model: both Bali↔Bali directions are exits, so the widget displays the 3-hour floor even when the raw route estimate is ~10–20 minutes.
  • The "L1 data fee" bullet is retitled Claim gas and describes the user-paid claim gas cost (≈1.02M gas first token claim, ≈228k repeat ERC-20, ≈150k ETH), not a data fee.

Other changes

  • The AggLayer example now passes from/to on the Bali chain IDs with ETH, plus a note that Sepolia (11155111) works as the L1 side.
  • Sepolia: verified in the SDK chain registry (supportedSequenceTestnetChains / ALL_CHAINS) that Sepolia is itself a supported testnet chain, so it's now in the Testnet table.
  • The Supported Chains Note is tightened, links to the AggLayer anchor, and adds that no public block explorer exists for the Bali chains yet.
  • "(Polygon AggLayer)" is dropped — the docs now use "AggLayer" consistently.
  • Added a note that AGGLAYER support ships with the upcoming SDK release, so readers on the currently published version aren't surprised when it's missing.

…le (agglayer/issues#46)

- FEP is Full Execution Proof, not "front-end provers" (supported-chains type column)
- AGGLAYER also serves Ethereum <-> Katana mainnet corridors (the routing table registers it for chains 1 and 747474), so both pages state the provider's general AggLayer corridor coverage instead of Bali-only scope
- Exit-floor rationale qualified: the L1-GER-anchored wait is the FEP (85)-origin path (OP Succinct proof anchored to an L1 info-tree leaf); PP (82)-origin hops do not wait on it — the 3-hour floor is unchanged
- Document the missing-estimate behavior: a quote with no estimate displays and polls the direction floor itself
- Soften "require an explicit selection": AUTO only falls back to AGGLAYER last and a trustless route preference also selects it; mirror the qualifier in the routes table
- Separate display (floored estimate) from polling (1.5x headroom) in the supported-chains note; bridge PP/FEP naming to the SDK's "Bali 82"/"Bali 85"
@arnaubennassar

Copy link
Copy Markdown
Author

Pushed 036462d addressing the follow-up review round:

Majors

  • FEP was mis-expanded as "front-end provers" in the Supported Chains type column — it is Full Execution Proof (AggLayer's ZK validity proof covering a chain's full state transition; Bali 85 runs it via OP Succinct). The cell now reads "AggLayer full execution proof (FEP)".
  • The AGGLAYER provider was described as serving only the Bali pilot testnet chains, but it also serves Ethereum ↔ Katana mainnet corridors — the routing table registers AGGLAYER for Ethereum (1) and Katana (747474), and the SDK demo ships mainnet↔Katana AGGLAYER scenarios. Both pages now state the provider's general corridor coverage and scope the Bali chains as what the section documents.

Minors

  • The exit-floor rationale no longer claims every exit waits for an L1 global exit root change (this supersedes the same wording in the 1f5da4b comment above): the GER-anchored wait is the FEP (85)-origin path — its OP Succinct proof anchors to a new L1 info-tree leaf that appears only when the L1's global exit root changes (roughly hourly on quiet Sepolia); PP (82)-origin hops do not wait on it. The 3-hour floor itself is unchanged — it stays a worst-case corridor guarantee for any L2 origin.
  • Documented the missing-estimate behavior: a quote that carries no completion estimate displays and polls the direction floor itself (20 minutes from an L1 origin, 3 hours from an L2 origin) — matching the SDK, which floors absent estimates rather than letting their small defaults shrink below the corridor floor.
  • "AggLayer routes require an explicit selection" is corrected: AUTO only falls back to AGGLAYER as a last resort when no other provider can route a corridor it serves, and a trustless route preference also selects it deliberately. Pinning bridgeProvider="AGGLAYER" remains the way to guarantee an AggLayer route. The Supported Bridges table row now carries a matching qualifier instead of the siblings' "explicit selection only".
  • The PR body is refreshed: the stale ETA bullet and "L1 data fee" wording are replaced with the shipped model and user-paid claim gas, it now opens with the problem the docs solve, and Related links 0xsequence/trails#1297 (the SDK PR that implements the documented behavior) alongside #1227.

Nits

  • The Supported Chains Note now separates display (the floored estimate, no headroom) from polling (up to 1.5× the estimate, never below the floor) — previously it attached the 1.5× to both.
  • The chain table bridges the docs' PP/FEP naming to the SDK's display names: Bali PP ("Bali 82" in the SDK) / Bali FEP ("Bali 85" in the SDK).
  • Commit 0157570's fix: prefix (vs this repo's docs: convention) is noted in the PR body rather than rewritten — history stays additive and flattens on squash-merge.

Mintlify broken-links check is green on the pushed tip; every changed behavioral claim was re-verified against the SDK at 0xsequence/trails@65d6f41c (read-only).

@miguelmota miguelmota left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Checked every behavioural claim against the SDK (#1297) and API (#1186) branches: the 20-minute and 3-hour floors, the 10-minute warning threshold, origin-based direction, chain ids 828282/858585, AggLayer as an AUTO last resort only, trustless-preference selection, and numeric chain ids in the Swap from/to props all match the code. Three edits before merging:

1. The claim-gas sentence is wrong (sdk/quote-providers.mdx, "the final claim step is paid by the user in ETH"). In the API, L2 destinations are auto-claimed by the chain operator's AggKit and claims into an ecosystem's L1 are sent and paid by Trails (lib/routes/agglayer/agglayer.go:1000-1001, ClaimServiceSponsorsDestination); the claim cost is folded into the quoted fee, denominated in the route token (claimGasFee, agglayer.go:533). The gas figures are still useful as the basis of that fee, but the text should say who executes the claim and that the user pays it through the quote, not in ETH at claim time.

2. The "ships with the upcoming 0xtrails SDK release" note has no removal trigger. Tie it to the release that carries #1297 or drop it, otherwise it goes stale the day the SDK ships.

3. The ETA model is written out twice with slightly different framing: the supported-chains table says "explicit selection recommended", the provider page says "an explicit selection is not required". Keep the provider page as the single source and have the supported-chains note link to it.

🤖 Generated with Claude Code (Claude Fable 5.1)

@arnaubennassar

Copy link
Copy Markdown
Author

Thanks — addressed in the latest commit:

  1. Claim gas: now states who executes the claim (L2 destinations are auto-claimed by the chain operator's AggKit; claims into an ecosystem's L1 are sent by Trails) and that the cost is folded into the quoted fee in the route token, not paid in ETH at claim time. Gas figures kept as the basis of that fee.
  2. Release note: tied to the release that carries 0xsequence/trails#1297 (not available in 0xtrails@0.19.1 or earlier), with a removal comment in the source.
  3. ETA model: the AggLayer provider page is now the single source; the supported-chains note and table row just link to it (and no longer say "explicit selection recommended").

@miguelmota miguelmota left a comment •

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The release-note and ETA de-duplication edits at 136ce3c are correct. The claim-gas paragraph needs one more pass, suggested inline on line 204: "executed automatically by the chain operator's AggKit" is stale, since upstream aggkit removed autoclaim (agglayer/aggkit#1901, in v0.11.0) and on the API branch Trails claims every destination itself after a short grace (workers/agglayer.go:452-463). The fee statement is right as written: the claim gas is priced into the quoted fee for every destination, in the route token.

Heads-up, not a blocker: the 20-minute and 3-hour figures match the SDK floors in 0xsequence/trails#1297 and the API's static estimates; if #1297 changes them these need a follow-up edit.

🤖 Generated with Claude Code (Claude Fable 5.1)

Comment thread sdk/quote-providers.mdx Outdated
@arnaubennassar

Copy link
Copy Markdown
Author

Updated the AggLayer polling windows in sdk/quote-providers.mdx to match the API budgets: the floors are now 2 h from an L1 origin and 24 h from any L2 origin, with a 24 h ceiling (6c90476). The ×1.5 headroom explanation and the worked example are recomputed for these numbers.

@arnaubennassar

Copy link
Copy Markdown
Author

Pushed a follow-up fixing two things in the AggLayer section of sdk/quote-providers.mdx:

  • Claim gas now follows the suggestion on line 204: Trails executes every claim (L2 or L1 destination), since upstream aggkit removed autoclaim; the fee statement is unchanged.
  • ETA waits / Slow routes no longer say the quote and widget display the 2 h / 24 h figures. Those are the SDK's receipt-polling floors; what the quote and widget display (and when the slow-transfer warning is due) is still floored at 20 minutes for an L1 origin and 3 hours for an L2 origin. The worked example is recomputed for both.

This branch was successfully deployed

1 active deployment
staging — a9ae24f5 Deployed Oct 20, 2026 by mintlify[bot]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants