placeOrder/cancelOrder/cancelAllOrders/getBalance/getPositions/getOpenOrders
all called a plain X-API-Key REST API that doesn't match how Lighter (a
zk-rollup) actually works: every order/cancel is an L2 transaction, signed
by a native binary the official SDK loads via ctypes (compiled from
github.com/elliottech/lighter-go) — there's no published algorithm spec to
reimplement in TypeScript, and Lighter's own official AI-agent integration
(elliottech/lighter-agent-kit) works the same way: Python calling the real
SDK, not a from-scratch reimplementation in the host language.
New scripts/lighter-bridge/bridge.py wraps the official lighter-sdk (pinned
to a specific commit, matching elliottech/lighter-agent-kit's own lockfile),
invoked as a subprocess from src/exchanges/lighter/index.ts — one JSON
request in on stdin, one JSON result out on stdout, mirroring the existing
Rust fast-broadcast subprocess pattern (src/evm/fast-broadcast.ts) so both
"shell out to a real, verified implementation" paths in this codebase look
and behave the same way. Lazily pip-installs into a local .vendor/ dir on
first use, so nothing needs a pre-existing venv.
Verified live against mainnet: the bridge reaches Lighter's real API,
correctly loads the native signer, and gets back a genuine server response
("invalid account index" for a made-up test account) — proving the full
chain (bootstrap -> native signer load -> key validation -> live network
call) works end to end.
Also rewrote LighterOrder/LighterPosition/LighterBalance to match the real
API response shapes (verified against elliottech/lighter-agent-kit's
schemas-read.md) instead of the old guessed shape, and fixed several stale
"Lighter orderbook DEX on Arbitrum" doc/description strings — Lighter is its
own standalone zk-rollup, unrelated to Arbitrum.
- New Rust binary (rust/fast-broadcast) races eth_sendRawTransaction across
multiple RPC/sequencer endpoints via a TS wrapper (src/evm/fast-broadcast.ts);
proven byte-identical to ethers' native signing path.
- multichain.ts: adds rpcFallbacks/getRaceUrls per chain, plus official
write-only sequencer endpoints for Arbitrum and Base (Optimism's public
sequencer is excluded per its own docs — rate-limited, not for default use).
- odos.ts: races broadcast across configured endpoints when more than one is
set; bumps the retired /sor/quote/v2 endpoint to /sor/quote/v3 and adds the
pathViz request flag (route was previously always empty) and mandatory
pre-broadcast simulation (Odos's own hard rule — refuse to broadcast a
transaction their simulator predicts will revert).
- postinstall self-heals two real environment bugs: bigint-buffer's native
binary SIGILLs on this platform, and @coral-xyz/anchor's CJS build exposes
BN via a getter that breaks native ESM named-export synthesis for
dependents like @meteora-ag/dlmm.
- tsconfig: incremental builds (measured ~22% faster warm typecheck).
- Create Puppeteer script to capture professional screenshots
- Add demo.gif (slideshow of all interfaces)
- Add telegram.png, webchat.png, arbitrage.png, portfolio.png
- Fix combinatorial.ts imports for Database and FeedManager
- Add puppeteer dev dependency for screenshot generation
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>