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
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). Without it, the
TITAN_PAMM_PRICE_LEVEL_URL environment variable is used when set, else the built-in
default.
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 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.
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 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.
Sourcepub fn stale_after(self, duration: Duration) -> Self
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.
Sourcepub fn without_quote_guard(self) -> Self
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.
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.
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§
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.