Skip to main content

PriceLevelStreamBuilder

Struct PriceLevelStreamBuilder 

Source
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

Source

pub fn new() -> Self

Source

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.

Source

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.

Source

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).

Source

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.

Source

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.

Source

pub fn max_backoff(self, max_backoff: Duration) -> Self

Overrides the cap on the exponential reconnect backoff of 2^attempt seconds (default: 32s).

Source

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.

Source

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.

Source

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.

Source

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.

Source

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.

Source

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§

Source§

impl Default for PriceLevelStreamBuilder

Source§

fn default() -> Self

Returns the “default value” for a type. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> Conv for T

Source§

fn conv<T>(self) -> T
where Self: Into<T>,

Converts self into T using Into<T>. Read more
Source§

impl<T> ErasedDestructor for T
where T: 'static,

Source§

impl<T> FmtForward for T

Source§

fn fmt_binary(self) -> FmtBinary<Self>
where Self: Binary,

Causes self to use its Binary implementation when Debug-formatted.
Source§

fn fmt_display(self) -> FmtDisplay<Self>
where Self: Display,

Causes self to use its Display implementation when Debug-formatted.
Source§

fn fmt_lower_exp(self) -> FmtLowerExp<Self>
where Self: LowerExp,

Causes self to use its LowerExp implementation when Debug-formatted.
Source§

fn fmt_lower_hex(self) -> FmtLowerHex<Self>
where Self: LowerHex,

Causes self to use its LowerHex implementation when Debug-formatted.
Source§

fn fmt_octal(self) -> FmtOctal<Self>
where Self: Octal,

Causes self to use its Octal implementation when Debug-formatted.
Source§

fn fmt_pointer(self) -> FmtPointer<Self>
where Self: Pointer,

Causes self to use its Pointer implementation when Debug-formatted.
Source§

fn fmt_upper_exp(self) -> FmtUpperExp<Self>
where Self: UpperExp,

Causes self to use its UpperExp implementation when Debug-formatted.
Source§

fn fmt_upper_hex(self) -> FmtUpperHex<Self>
where Self: UpperHex,

Causes self to use its UpperHex implementation when Debug-formatted.
Source§

fn fmt_list(self) -> FmtList<Self>
where &'a Self: for<'a> IntoIterator,

Formats each item in a sequence. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts 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 more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts 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 more
Source§

impl<T> Pipe for T
where T: ?Sized,

Source§

fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> R
where Self: Sized,

Pipes by value. This is generally the method you want to use. Read more
Source§

fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> R
where R: 'a,

Borrows self and passes that borrow into the pipe function. Read more
Source§

fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> R
where R: 'a,

Mutably borrows self and passes that borrow into the pipe function. Read more
Source§

fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
where Self: Borrow<B>, B: 'a + ?Sized, R: 'a,

Borrows self, then passes self.borrow() into the pipe function. Read more
Source§

fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
where Self: BorrowMut<B>, B: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.borrow_mut() into the pipe function. Read more
Source§

fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
where Self: AsRef<U>, U: 'a + ?Sized, R: 'a,

Borrows 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
where Self: AsMut<U>, U: 'a + ?Sized, R: 'a,

Mutably borrows 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
where Self: Deref<Target = T>, T: 'a + ?Sized, R: 'a,

Borrows self, then passes self.deref() into the pipe function.
Source§

fn pipe_deref_mut<'a, T, R>( &'a mut self, func: impl FnOnce(&'a mut T) -> R, ) -> R
where Self: DerefMut<Target = T> + Deref, T: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.deref_mut() into the pipe function.
Source§

impl<T> PolicyExt for T
where T: ?Sized,

Source§

fn and<P, B, E>(self, other: P) -> And<T, P>
where T: Sized + Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow only if self and other return Action::Follow. Read more
Source§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where T: Sized + Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow if either self or other returns Action::Follow. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> Tap for T

Source§

fn tap(self, func: impl FnOnce(&Self)) -> Self

Immutable access to a value. Read more
Source§

fn tap_mut(self, func: impl FnOnce(&mut Self)) -> Self

Mutable access to a value. Read more
Source§

fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Immutable access to the Borrow<B> of a value. Read more
Source§

fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
where Self: BorrowMut<B>, B: ?Sized,

Mutable access to the BorrowMut<B> of a value. Read more
Source§

fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
where Self: AsRef<R>, R: ?Sized,

Immutable access to the AsRef<R> view of a value. Read more
Source§

fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
where Self: AsMut<R>, R: ?Sized,

Mutable access to the AsMut<R> view of a value. Read more
Source§

fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
where Self: Deref<Target = T>, T: ?Sized,

Immutable access to the Deref::Target of a value. Read more
Source§

fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Mutable access to the Deref::Target of a value. Read more
Source§

fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self

Calls .tap() only in debug builds, and is erased in release builds.
Source§

fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self

Calls .tap_mut() only in debug builds, and is erased in release builds.
Source§

fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Calls .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
where Self: BorrowMut<B>, B: ?Sized,

Calls .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
where Self: AsRef<R>, R: ?Sized,

Calls .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
where Self: AsMut<R>, R: ?Sized,

Calls .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
where Self: Deref<Target = T>, T: ?Sized,

Calls .tap_deref() only in debug builds, and is erased in release builds.
Source§

fn tap_deref_mut_dbg<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Calls .tap_deref_mut() only in debug builds, and is erased in release builds.
Source§

impl<T> TryConv for T

Source§

fn try_conv<T>(self) -> Result<T, Self::Error>
where Self: TryInto<T>,

Attempts to convert self into T using TryInto<T>. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V

Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more