Changelog
All notable changes to the TypeScript SDK (propamm) are documented here.
[1.10.0] - 2026-10-23
Changed
TAURUSFInow points at0x20861433D9119B866EEB398cb1ad46652A3cF953, TaurusFi's new contract. The previous address,0x3ce2672Aa806138585920421406Bf0dEcB8130Cb, no longer receives price updates, so quoting it reverts withStaleUpdate(). Code that hardcoded the old address must be updated.
[1.9.0] - 2026-10-22
Added
PropAmmRouter.getQuotes: every whitelisted venue that actually prices a pair, best output first. Quotes each venue on its own so a venue that cannot serve the pair reverts rather than falling back to Uniswap, and drops reverting and zero quotes. The result is the venue list for a venue-restricted swap, which skips the on-chain requote of every venue that cannot fill.
[1.8.1] - 2026-10-19
Changed
decimalsvalues onPriceLevels,PriceLevelsRpcSourceandPriceLevelsWsSourcemust be integers from 0 to 255; anything else throws when the source is built. A book whose decimals in the table passed toparsePriceLevelsMessagearen't valid is skipped, instead of throwing.
Removed
- The
ethRpcUrloption onPriceLevels,PriceLevelsRpcSourceandPriceLevelsWsSource. A single faileddecimals()read skipped that token's books for the source's lifetime. Pass the decimals of tokens missing fromTOKEN_DECIMALSwithdecimalsinstead; code that passedethRpcUrlmust drop it.
Fixed
- A v2 price rung whose amounts don't fit a uint256 is dropped instead of being returned. So is a rung whose input rounds to zero base units, which read as a free fill.
[1.8.0] - 2026-10-16
Changed
- Titan's v2 pAMM feeds are the default. Titan deprecated
/ws/pamm_quote_streamand/ws/pamm_price_levels(they may stop after 2026-10-23).OverridesWsSourcenow defaults towss://eu.data.titanbuilder.xyz/ws/pamm_quote_stream_v2andPriceLevelsWsSourcetowss://eu.data.titanbuilder.xyz/ws/pamm_price_levels_v2;OverridesRpcSourcecallstitan_getPammVenuesandPriceLevelsRpcSourcecallstitan_getPammBooksinstead of the undocumentedtitan_getPammStateOverrides/titan_getPammPriceLevels. The default JSON-RPC URL is nowhttps://eu.data.titanbuilder.xyz/data, the path Titan documents. Both parsers still accept the v1 payloads. - v2 price levels are rebuilt into the same base-unit order books. The v2 feed sends one book per maker and pair with float
price/cumVolumebids and asks; each side becomes atoken_in -> token_outorder book of base-unit amounts, as before. Titan's floats can leave an amount a few base units off the exact simulated value. Books are filed under the router venue address (QUOTE_ADDRESS_VENUESincommon/pammsmaps Kipseli's and Metric's publishing addresses), and a book quoting a token without known decimals is skipped. PriceLevel.variantis now optional (variant?): the v2 feed doesn't say whether a rung was simulated or interpolated, so it is only set for v1 payloads.toStateOverride'spammsoption now also matches an entry whose priced addresses or mapped router venue include the listed address, soMETRICselects both of Metric's entries andKIPSELIselects Kipseli's.
Added
TOKEN_DECIMALSincommon/tokens: decimals of the tokens Titan's price levels quote today, read from each token'sdecimals().decimalsandethRpcUrloptions onPriceLevels,PriceLevelsRpcSourceandPriceLevelsWsSource: extra decimals, and an Ethereum RPC URL to read thedecimals()of any other token once and cache it.OverridesSnapshot.pricedAddresses: the addresses priced from each entry, from the v2 payload.parsePriceLevelsMessagetakes an optional decimals table.QUOTE_ADDRESS_VENUESincommon/pamms.
[1.7.0] - 2026-10-15
Added
GOLIATHvenue constant incommon/pamms, plus itsgoliathentry inPAMMS(and therefore in thePammNameunion).
Changed
METRICnow points at0x99Ab7c1C5eab47801F7937075998527a550fbA8a, Metric's new adapter over its own pool factory, whitelisted on 2026-10-15. The previous address is no longer whitelisted on the router, so naming it invenuesselected nothing. Code that hardcoded the old address must be updated.
[1.6.0] - 2026-10-08
Added
STELAXISvenue constant incommon/pamms, plus itsstelaxisentry inPAMMS(and therefore in thePammNameunion).
Changed
BEBOPnow points at0xB09AAA8933626d7E4C48D65dAd2D77021CFBCA9aandTAURUSFIat0x3ce2672Aa806138585920421406Bf0dEcB8130Cb, the current deployments. The previous addresses are no longer whitelisted on the router, so naming them invenuesselected nothing. Code that hardcoded either old address must be updated.- The Bebop default slot that
toStateOverridezeroes now lands on the newBEBOPaddress, which is the key Titan serves Bebop's overrides under.
[1.5.0] - 2026-09-16
Changed
Titan moved the state-override and price-level endpoints to dedicated infrastructure. Every default now points at
eu.data.titanbuilder.xyzinstead ofrpc.titanbuilder.xyz:DEFAULT_OVERRIDES_RPC_URL—https://eu.data.titanbuilder.xyzDEFAULT_OVERRIDES_WS_URL—wss://eu.data.titanbuilder.xyz/ws/pamm_quote_streamDEFAULT_PRICE_LEVELS_RPC_URL—https://eu.data.titanbuilder.xyzDEFAULT_PRICE_LEVELS_WS_URL—wss://eu.data.titanbuilder.xyz/ws/pamm_price_levels
Titan serves the same data from
eu.,ap.andus.hosts; the oldrpc.hosts still respond but are deprecated. Callers that pass an explicit URL are unaffected — update it to the matching*.data.titanbuilder.xyzhost. Callers on the defaults outside the EU should now set the URL explicitly, since the previous non-regional default has nodata.equivalent.
[1.4.0] - 2026-09-07
Added
EL_ZORROvenue constant incommon/pamms, plus itselzorroentry inPAMMS(and therefore in thePammNameunion).
Removed
TokenOutBalanceDecreased()frompropAmmRouterAbi. The router stopped reverting with it when the bespoke Bebop adapter was removed, so viem can no longer decode a revert into it. (#67)
[1.3.0] - 2026-08-28
Added
TEMPEST,TAURUSFIandMETRICvenue constants incommon/pamms, plus theirtempest/taurusfi/metricentries inPAMMS(and therefore in thePammNameunion).
Changed
BEBOPnow points at0xB09AaA5614916d7AEb59C295C52c92ca82aDdD76, the current Bebop deployment. Code that hardcoded the previous Bebop address must be updated.
[1.2.2] - 2026-07-01
Added
- The
swapandswapAndWaitfunctions now attach a hardcoded per-function gas limit and skip node gas estimation, which can under-shoot when execution takes a heavier branch than it simulated. Override the gas limit per call with the newSwapOptions.gasLimit. PropAmmRouter.gasLimitFor(opts?)returns the gas limit a swap will attach for the given options (the explicitgasLimit, else the per-function default) — for previewing the maximum network fee without sending.
[1.2.1] - 2026-06-25
Fixed
- State-override quotes now pin the simulated
block.timestampto the beacon slot's canonical block time (genesis + slot*12) instead of the frame's emit time, falling back to the emit time when no slot is present. Venues validateblock.timestampagainst the state they pushed, which is keyed to the slot. (#61)
[1.2.0] - 2026-06-25
Added
- Browser / injected wallet support:
ContractClient.fromClientsaccepts prebuilt viem public and wallet clients (e.g. wagmi'susePublicClient/useWalletClient), so swaps can be signed by a browser wallet instead of a raw private key. (#56)
Changed
- Breaking: the
ContractClientconstructor is now private. Build a client from an RPC URL with the newContractClient.fromRpcstatic method instead ofnew ContractClient(...). (#56)
[1.1.0] - 2026-06-24
Added
- Price levels: subscribe to maker price-level updates and apply them to quotes via
PriceLevelsWsSource(WebSocket) orPriceLevelsRpcSource(RPC), plus thePriceLevelscontainer and related utilities. (#51)
[1.0.0] - 2026-06-18
Added
- Initial release. Core surface for interacting with the
PropAMMRouter:- Router actions:
quote,swap,waitForSwap,approve,allowance, and view helpers. - State overrides: apply fresh pAMM state to quotes via
OverridesWsSource(WebSocket) orOverridesRpcSource(RPC), plus utilities. - Shared helpers and types.
- Router actions: