pub struct PriceLevelStreamBuilder { /* private fields */ }Expand description
Builds a stream of Updates from the Titan pAMM price level WebSocket.
A new builder serves no pAMMs: register the known venues via
with_known_pamms, individual ones via
add_pamm, or opt into serving unknown streamed venues via
auto_detect; with_tokens provides the token
metadata pairs are interpreted with.
One component is emitted per (pAMM, token pair), identified by the concatenation
pamm ++ token0 ++ token1 (tokens sorted ascending), under the protocol system
pricelevelstream:{pamm} — or propammfallback:{pamm} for venues on the PropAMMRouter
whitelist, unless without_fallback_router turns that off.
The venue address is exposed through the PAMM_ADDRESS_ATTRIBUTE static attribute for
downstream encoding.
Implementations§
Source§impl PriceLevelStreamBuilder
impl PriceLevelStreamBuilder
pub fn new() -> Self
Sourcepub fn auto_detect(self, enabled: bool) -> Self
pub fn auto_detect(self, enabled: bool) -> Self
Enables serving pAMMs that are not registered via
with_known_pamms or add_pamm
(disabled by default).
When enabled, any unknown streamed venue — except denied ones (see
deny_pamm) — is served under its full lowercase hex address
as the name, with the default gas cost. A venue’s protocol system therefore changes from
the address form (pricelevelstream:{0xaddress}) to a name (pricelevelstream:{name})
once it gets registered — via add_pamm or a release’s
default_served_pamms recognizing it; the name-independent identifiers — the component id
and the PAMM_ADDRESS_ATTRIBUTE — stay stable across such renames.
Sourcepub fn auto_detected_gas_cost(self, gas_cost: BigUint) -> Self
pub fn auto_detected_gas_cost(self, gas_cost: BigUint) -> Self
Overrides the per-swap gas cost that auto-detected pAMMs (see
auto_detect) are served with. Defaults to the maximum over the
known venue profiles, as the conservative choice. Registered venues are unaffected —
their gas cost comes from their PriceLevelStreamConfig.
Sourcepub fn endpoint(self, url: impl Into<String>) -> Self
pub fn endpoint(self, url: impl Into<String>) -> Self
Overrides the stream endpoint, e.g. to connect to a closer Titan region than the default (see https://docs.titanbuilder.xyz/propamms/takers).
Sourcepub fn connect_timeout(self, timeout: Duration) -> Self
pub fn connect_timeout(self, timeout: Duration) -> Self
Overrides how long a single connection attempt may take before it is aborted and retried (default: 10s), so a hung TCP/TLS handshake cannot block the stream forever.
Sourcepub fn read_idle_timeout(self, timeout: Duration) -> Self
pub fn read_idle_timeout(self, timeout: Duration) -> Self
Overrides the longest gap between Titan messages tolerated before the connection is treated as dead and re-established (default: 30s). Titan pushes several updates per second, so a multi-second silence means a stalled or half-open connection.
Sourcepub fn max_backoff(self, max_backoff: Duration) -> Self
pub fn max_backoff(self, max_backoff: Duration) -> Self
Overrides the cap on the exponential reconnect backoff of 2^attempt seconds
(default: 32s).
Sourcepub fn add_pamm(self, config: PriceLevelStreamConfig) -> Self
pub fn add_pamm(self, config: PriceLevelStreamConfig) -> Self
Registers a pAMM to be served under the given configuration, overriding any default, denied, or auto-detected one for the same address.
Between add_pamm and deny_pamm for the same
address, the later call wins; the defaults applied by
with_known_pamms never override either, in any call order.
Sourcepub fn deny_pamm(self, address: Bytes) -> Self
pub fn deny_pamm(self, address: Bytes) -> Self
Excludes a venue from being served: drops its current registration (default or explicit) and blocks auto-detecting it.
Between add_pamm and deny_pamm for the same
address, the later call wins; the defaults applied by
with_known_pamms never override either, in any call order —
so denying a venue from the default set works whether the denial comes before or after
with_known_pamms.
Sourcepub fn with_known_pamms(self) -> Self
pub fn with_known_pamms(self) -> Self
Applies what is known about the streamed venues: registers the known-good ones
(default_served_pamms) to be served and denies the known-bad ones
(default_denied_pamms) — venues that stream quotes but whose swaps are not executable.
These defaults never override an explicit add_pamm or
deny_pamm for the same address, regardless of call order.
Sourcepub fn with_tokens(self, tokens: HashMap<Bytes, Token>) -> Self
pub fn with_tokens(self, tokens: HashMap<Bytes, Token>) -> Self
Provides the token metadata used to build components and interpret amounts. Pairs whose tokens are missing here are skipped.
Sourcepub fn without_fallback_router(self) -> Self
pub fn without_fallback_router(self) -> Self
Keeps every venue on the direct pricelevelstream:{name} path, so swaps execute on the
venues themselves and a stale maker quote reverts the route.
By default build emits venues on Titan’s PropAMMRouter whitelist under
propammfallback:{name} instead, so tycho-execution routes their swaps through the
router. Opt out when the direct call is what you want to measure or execute, or to skip
the whitelist read at startup.
Sourcepub fn build(self) -> impl Stream<Item = Update> + Send
pub fn build(self) -> impl Stream<Item = Update> + Send
Consumes the builder and opens the stream.
Venues on Titan’s PropAMMRouter whitelist are served under propammfallback:{name}, so
tycho-execution routes their swaps through the router. The router falls back to a
single-hop Uniswap V3 pool when the venue reverts — which a stale maker quote does in any
simulation against a mined block. Only whitelisted venues may use the family: the router
reverts UnknownVenue for others, so every swap would execute on the Uniswap V3 fallback
at a worse price than the venue gives.
Reading that whitelist needs a node at RPC_URL (from the environment, falling back to
.env), and degrades instead of failing: without the variable, or when the read fails, a
warning is logged and every venue stays on the direct pricelevelstream: path.
without_fallback_router skips the read and takes the
direct path unconditionally.
The whitelist is read once, on the first poll, and never re-read — it is governance-gated and changes rarely, and renaming a running component’s protocol system would churn every consumer’s component set. Restart the stream to pick up a whitelist change.
The connection is established lazily on first poll and maintained (with reconnects) for as long as the stream is polled; it never terminates on its own, and dropping the stream closes the connection. Frames that contain no served pAMM produce no update.
Each streamed frame is a complete snapshot of everything Titan currently streams, so
every update carries the full set of the frame’s pair states, with new_pairs /
removed_pairs derived by diffing against the previous frame — a pair (or a whole
venue) the stream stops serving is removed. Frames older than an already processed one
are skipped, so updates never move backwards in block number. Pairs whose tokens are
missing from the provided token metadata are skipped.
Trait Implementations§
Auto Trait Implementations§
impl Freeze for PriceLevelStreamBuilder
impl RefUnwindSafe for PriceLevelStreamBuilder
impl Send for PriceLevelStreamBuilder
impl Sync for PriceLevelStreamBuilder
impl Unpin for PriceLevelStreamBuilder
impl UnsafeUnpin for PriceLevelStreamBuilder
impl UnwindSafe for PriceLevelStreamBuilder
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
impl<T> ErasedDestructor for Twhere
T: 'static,
Source§impl<T> FmtForward for T
impl<T> FmtForward for T
Source§fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
self to use its Binary implementation when Debug-formatted.Source§fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
self to use its Display implementation when
Debug-formatted.Source§fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
self to use its LowerExp implementation when
Debug-formatted.Source§fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
self to use its LowerHex implementation when
Debug-formatted.Source§fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
self to use its Octal implementation when Debug-formatted.Source§fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
self to use its Pointer implementation when
Debug-formatted.Source§fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
self to use its UpperExp implementation when
Debug-formatted.Source§fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
self to use its UpperHex implementation when
Debug-formatted.Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
Source§fn in_current_span(self) -> Instrumented<Self> ⓘ
fn in_current_span(self) -> Instrumented<Self> ⓘ
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§impl<T> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere
T: ?Sized,
Source§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
Source§fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read moreSource§fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read moreSource§fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
Source§fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R,
) -> R
fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
Source§fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
self, then passes self.as_ref() into the pipe function.Source§fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
self, then passes self.as_mut() into the pipe
function.Source§fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
self, then passes self.deref() into the pipe function.Source§impl<T> PolicyExt for Twhere
T: ?Sized,
impl<T> PolicyExt for Twhere
T: ?Sized,
Source§impl<T> Tap for T
impl<T> Tap for T
Source§fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
Borrow<B> of a value. Read moreSource§fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
BorrowMut<B> of a value. Read moreSource§fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
AsRef<R> view of a value. Read moreSource§fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
AsMut<R> view of a value. Read moreSource§fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
Deref::Target of a value. Read moreSource§fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
Deref::Target of a value. Read moreSource§fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
.tap() only in debug builds, and is erased in release builds.Source§fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
.tap_mut() only in debug builds, and is erased in release
builds.Source§fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
.tap_borrow() only in debug builds, and is erased in release
builds.Source§fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
.tap_borrow_mut() only in debug builds, and is erased in release
builds.Source§fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
.tap_ref() only in debug builds, and is erased in release
builds.Source§fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
.tap_ref_mut() only in debug builds, and is erased in release
builds.Source§fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
.tap_deref() only in debug builds, and is erased in release
builds.