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 fallback:{pamm} — or pricelevelstream:{pamm} after without_fallback_router. 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). Without it, the TITAN_PAMM_PRICE_LEVEL_URL environment variable is used when set, else the built-in default.

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 parsed Titan frames tolerated before the connection is treated as dead and re-established (default: 10s). Titan pushes one frame per second and sends no keepalives, so a multi-second silence means a stalled or half-open connection. Control frames and unparsable text do not reset this timeout, and neither does the time the consumer spends between polls: the gap is measured while the stream waits on the socket.

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 components are emitted under fallback:{name}, so tycho-execution routes their swaps through TychoFallbackRouter. Opt out when the direct call is what you want to measure or execute.

Source

pub fn stale_after(self, duration: Duration) -> Self

Overrides how long a component stays served after the last accepted frame that carried it (default: 24s, two slots). A component no accepted frame has carried for this long turns stale and is emitted in removed_pairs; the next accepted frame carrying it re-adds it in new_pairs. Frames whose timestamp is this old or older are rejected. Independent of this setting, a state refuses to quote once its frame is one slot old (see without_quote_guard).

Values above MAX_STALE_AFTER are capped to it. A value shorter than the age frames arrive with rejects every frame as too_old, which the price_level_stream_frames_rejected_total counter and a WARN log show.

Source

pub fn without_quote_guard(self) -> Self

Emits states that never refuse to quote.

By default every emitted state refuses spot_price, get_amount_out and get_limits once its frame is one slot (QUOTE_TTL) old: Titan quotes the block being built, and a venue rejects a fill against an older ladder as stale, so such a quote is not executable. Opt out only for a consumer that quotes a state more than one slot after it arrived by design — a batch simulator, a validation harness — and that accepts a quote the venue may no longer fill. The component still turns stale and is removed after stale_after, which then becomes the only bound on how old a quoted ladder can be. Never disable it on a live router.

Source

pub fn build(self) -> impl Stream<Item = Update> + Send

Consumes the builder and opens the stream.

Components are emitted under fallback:{name}, so tycho-execution routes their swaps through TychoFallbackRouter, which retries a reverted pAMM swap — a stale maker quote reverts in any simulation against a mined block — on the fallback pool the solver names. without_fallback_router keeps them on the direct pricelevelstream: path.

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.

Every accepted frame yields an update with the states of the served pairs it carries, with new_pairs for pairs not currently served. The update does not mention pairs the frame does not carry, so consumers keep their previous state. A component no accepted frame has carried for stale_after turns stale and is emitted in removed_pairs, together with every other component turning stale at that instant, and re-added by the next accepted frame carrying it. Frames that are too old, from the future, out of order, or whose block regresses or jumps more than one block per elapsed slot plus 2 are rejected without effect. Frames that contain no served pAMM produce no update. Pairs whose tokens are missing from the provided token metadata are skipped.

Every update is stamped with the block its frame targets, a removal with the newest accepted block. Block numbers never decrease while something is served. Once every component has turned stale, the next accepted frame is judged as a first frame and may carry a lower block than the removal did: that is how the stream recovers from a frame with an implausible block, so consumers must not rely on the block number to order updates across such a gap. See the module documentation for the full contract.

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 = !

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

fn try_from(value: U) -> Result<T, !>

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