Changelog
All notable changes to the Rust SDK (propamm) are documented here.
[1.9.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.8.0] - 2026-10-22
Added
PropAmmRouter::get_quotes/get_quotes_with: 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.7.1] - 2026-10-19
Changed
with_decimalsno longer takes an Ethereum RPC URL: it is nowwith_decimals(decimals)onPriceLevelsRpcSourceandPriceLevelsWsSource. A single faileddecimals()read skipped that token's books for the source's lifetime, and the read had no timeout. Callers that passedNonedrop the argument; callers that passedSome(url)pass the decimals of the tokens they need instead.
Fixed
- A v2 price rung whose amounts overflow a
U256is dropped, instead of panicking the parse (and, forPriceLevelsWsSource, the stream's handler task). So is a rung whose input rounds to zero base units, which read as a free fill.
[1.7.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 nowOption<PriceVariant>: the v2 feed doesn't say whether a rung was simulated or interpolated, so it is only set for v1 payloads.ToStateOverrideOptions::pammsnow 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().with_decimals(decimals, eth_rpc_url)onPriceLevelsRpcSourceandPriceLevelsWsSource: extra decimals, and an Ethereum RPC URL to read thedecimals()of any other token once and cache it.OverridesSnapshot::priced_addresses: the addresses priced from each entry, from the v2 payload.parse_price_levels_message_withtakes a decimals table.QUOTE_ADDRESS_VENUESincommon::pamms.
[1.6.0] - 2026-10-15
Added
GOLIATHvenue constant incommon::pamms, plus itsgoliathentry inPAMMS(whose length goes from 8 to 9).
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.5.0] - 2026-10-08
Added
STELAXISvenue constant incommon::pamms, plus itsstelaxisentry inPAMMS(whose length goes from 7 to 8).
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
to_state_overridezeroes now lands on the newBEBOPaddress, which is the key Titan serves Bebop's overrides under.
[1.4.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.3.0] - 2026-09-07
Added
EL_ZORROvenue constant incommon::pamms, plus itselzorroentry inPAMMS(whose length goes from 6 to 7).
Removed
TokenOutBalanceDecreased()fromERROR_SIGNATURES. The router stopped reverting with it when the bespoke Bebop adapter was removed, so the selector no longer decodes into a named error. (#67)
[1.2.0] - 2026-08-28
Added
TEMPEST,TAURUSFIandMETRICvenue constants incommon::pamms, plus theirtempest/taurusfi/metricentries inPAMMS(whose length goes from 3 to 6).
Changed
BEBOPnow points at0xB09AaA5614916d7AEb59C295C52c92ca82aDdD76, the current Bebop deployment. Code that hardcoded the previous Bebop address must be updated.
[1.1.2] - 2026-07-01
Added
- The
swapandswap_withfunctions (and their_and_waitvariants) 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.gas_limit.
[1.1.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. (#62)
[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. (#52)
Changed
- Updated
rex/ethrexdependencies. (#55)
[1.0.0] - 2026-06-18
Added
- Initial release. Core surface for interacting with the
PropAMMRouter:- Router actions:
quote,swap,wait_for_swap,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: