Changelog
All notable changes to the Python 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: 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
decimalsvalues onPriceLevels,PriceLevelsRpcSourceandPriceLevelsWsSourcemust be integers from 0 to 255; anything else raisesPricesErrorwhen the source is built. A book whose decimals in the table passed toparse_price_levels_messagearen't valid is skipped.
Removed
- The
eth_rpc_urlkeyword argument onPriceLevels,PriceLevelsRpcSourceandPriceLevelsWsSource. A single faileddecimals()read skipped that token's books for the source's lifetime, and timeouts escaped as raw exceptions. Pass the decimals of tokens missing fromTOKEN_DECIMALSwithdecimalsinstead; code that passedeth_rpc_urlmust drop it.
Fixed
- A v2 price rung whose amounts don't fit a uint256 is dropped, instead of raising
decimal.InvalidOperation(past 100 digits) or being returned. 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 nowPriceVariant | None(defaultNone): the v2 feed doesn't say whether a rung was simulated or interpolated, so it is only set for v1 payloads.to_state_override'spammsargument 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().decimalsandeth_rpc_urlkeyword arguments onPriceLevels,PriceLevelsRpcSourceandPriceLevelsWsSource: 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_messagetakes an optional decimals table.QUOTE_ADDRESS_VENUESincommon.pamms.
[1.6.0] - 2026-10-15
Added
GOLIATHvenue constant incommon.pamms, plus itsgoliathentry inPAMMS.
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.
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.
Removed
TokenOutBalanceDecreasedfrom the bundled router ABI. The router stopped reverting with it when the bespoke Bebop adapter was removed, so it is no longer part of the compiled ABI and no longer decodes from a revert. (#67)
[1.2.0] - 2026-08-28
Added
TEMPEST,TAURUSFIandMETRICvenue constants incommon.pamms, plus theirtempest/taurusfi/metricentries inPAMMS.
Changed
BEBOPnow points at0xB09AaA5614916d7AEb59C295C52c92ca82aDdD76, the current Bebop deployment. Code that hardcoded the previous Bebop address must be updated.
Removed
_LEGACY_BEBOP_LOWERand the legacy-Bebop handling into_state_override. The superseded Bebop deployments are no longer whitelisted on the router, so they can be neither quoted nor dispatched and need no price neutralization;bebop_defaultnow zeroes only the currentBEBOPslot when a snapshot omits it.
[1.1.3] - 2026-07-01
Added
- The
swapandswap_and_waitfunctions now attach a hardcoded per-function gas limit and skip 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.2] - 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. (#63)
[1.1.1] - 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. (#53) - Optional RPC URL argument on the client constructor. (#53)
[1.0.0] - 2026-06-19
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: