From 7f46f13e308c1c962a0fb745ff58ed1931f835a7 Mon Sep 17 00:00:00 2001 From: Aryan Godara <65490434+AryanGodara@users.noreply.github.com> Date: Thu, 25 Jun 2026 03:42:14 +0530 Subject: [PATCH] Drop the pool-indexer wait-until-timeout config --- crates/driver/example.toml | 2 +- .../src/boundary/liquidity/uniswap/v3.rs | 2 -- crates/driver/src/infra/config/file/load.rs | 14 +++----- crates/driver/src/infra/config/file/mod.rs | 35 ++++++++++--------- crates/driver/src/infra/liquidity/config.rs | 5 --- .../src/uniswap_v3/pool_indexer.rs | 22 ++++++------ 6 files changed, 35 insertions(+), 45 deletions(-) diff --git a/crates/driver/example.toml b/crates/driver/example.toml index 7925978367..d82b4ee910 100644 --- a/crates/driver/example.toml +++ b/crates/driver/example.toml @@ -98,7 +98,7 @@ max-order-age = "1m" # [[liquidity.uniswap-v3]] # Uniswap V3 configuration (pool-indexer as data source) # preset = "uniswap-v3" -# indexer-config = { pool-indexer = { url = "http://pool-indexer/", wait-until-timeout = "5m" } } +# indexer-config = { pool-indexer = { url = "http://pool-indexer/" } } # max_pools_to_initialize = 100 # [[liquidity.uniswap-v3]] # Custom Uniswap V3 configuration diff --git a/crates/driver/src/boundary/liquidity/uniswap/v3.rs b/crates/driver/src/boundary/liquidity/uniswap/v3.rs index cc8bd148b4..74dc6a44a3 100644 --- a/crates/driver/src/boundary/liquidity/uniswap/v3.rs +++ b/crates/driver/src/boundary/liquidity/uniswap/v3.rs @@ -157,14 +157,12 @@ async fn build_pool_data_source( UniswapV3PoolSource::PoolIndexer(indexer) => { tracing::info!( url = %indexer.url, - wait_until_timeout = ?indexer.wait_until_timeout, "uniswap v3: using pool-indexer as data source", ); Ok(Arc::new(PoolIndexerClient::new( indexer.url.clone(), eth.chain(), http, - indexer.wait_until_timeout, ))) } UniswapV3PoolSource::Subgraph(subgraph) => { diff --git a/crates/driver/src/infra/config/file/load.rs b/crates/driver/src/infra/config/file/load.rs index 68f54c3507..f501de6477 100644 --- a/crates/driver/src/infra/config/file/load.rs +++ b/crates/driver/src/infra/config/file/load.rs @@ -380,15 +380,11 @@ fn uniswap_v3_pool_source( max_pools_per_tick_query, }) } - file::IndexerConfig::PoolIndexer { - url, - wait_until_timeout, - } => liquidity::config::UniswapV3PoolSource::PoolIndexer( - liquidity::config::UniswapV3PoolIndexer { - url, - wait_until_timeout, - }, - ), + file::IndexerConfig::PoolIndexer { url } => { + liquidity::config::UniswapV3PoolSource::PoolIndexer( + liquidity::config::UniswapV3PoolIndexer { url }, + ) + } } } diff --git a/crates/driver/src/infra/config/file/mod.rs b/crates/driver/src/infra/config/file/mod.rs index 69db5aa29b..00496059f6 100644 --- a/crates/driver/src/infra/config/file/mod.rs +++ b/crates/driver/src/infra/config/file/mod.rs @@ -637,16 +637,7 @@ enum IndexerConfig { max_pools_per_tick_query: usize, }, #[serde(rename_all = "kebab-case")] - PoolIndexer { - url: Url, - /// Upper bound on a single `wait_until` call. Size per-network to - /// comfortably exceed the worst-case first-deploy seed time. - #[serde( - with = "humantime_serde", - default = "uniswap_v3::default_pool_indexer_wait_until_timeout" - )] - wait_until_timeout: Duration, - }, + PoolIndexer { url: Url }, } #[derive(Clone, Debug, Deserialize)] @@ -656,8 +647,6 @@ enum UniswapV3Preset { } mod uniswap_v3 { - use std::time::Duration; - pub fn default_max_pools_to_initialize() -> usize { 100 } @@ -665,10 +654,6 @@ mod uniswap_v3 { pub fn default_max_pools_per_tick_query() -> usize { usize::MAX } - - pub fn default_pool_indexer_wait_until_timeout() -> Duration { - Duration::from_secs(300) - } } #[derive(Clone, Debug, Deserialize)] @@ -1205,6 +1190,24 @@ mod tests { assert!(err.to_string().contains("must be signers")); } + #[test] + fn pool_indexer_config_needs_only_a_url() { + let config: IndexerConfig = + toml::from_str(r#"pool-indexer = { url = "http://pool-indexer/" }"#).unwrap(); + assert!(matches!(config, IndexerConfig::PoolIndexer { .. })); + } + + #[test] + fn pool_indexer_config_rejects_wait_until_timeout() { + // The field was dropped (bootstrap is its own initContainer now); a + // stale config still carrying it should fail loudly, not be ignored. + let err = toml::from_str::( + r#"pool-indexer = { url = "http://pool-indexer/", wait-until-timeout = "5m" }"#, + ) + .unwrap_err(); + assert!(err.to_string().contains("wait-until-timeout")); + } + #[test] fn submission_accounts_new_accepts_signers() { let signer = Account::PrivateKey( diff --git a/crates/driver/src/infra/liquidity/config.rs b/crates/driver/src/infra/liquidity/config.rs index 1b7a69df84..b73b893052 100644 --- a/crates/driver/src/infra/liquidity/config.rs +++ b/crates/driver/src/infra/liquidity/config.rs @@ -175,11 +175,6 @@ pub struct UniswapV3PoolIndexer { /// Service root, e.g. `http://pool-indexer/` exposing /// `/api/v1/{network}/uniswap/v3/`. pub url: Url, - - /// Upper bound on a single `wait_until` call. Size per-network to - /// comfortably exceed the worst-case first-deploy seed time (~13 min - /// for mainnet's ~60k pools; tens of seconds for smaller chains). - pub wait_until_timeout: Duration, } /// Where Uniswap V3 pool definitions and tick data are fetched from. Exactly diff --git a/crates/liquidity-sources/src/uniswap_v3/pool_indexer.rs b/crates/liquidity-sources/src/uniswap_v3/pool_indexer.rs index 2717184a79..51cefc9fa0 100644 --- a/crates/liquidity-sources/src/uniswap_v3/pool_indexer.rs +++ b/crates/liquidity-sources/src/uniswap_v3/pool_indexer.rs @@ -30,6 +30,11 @@ use { /// Poll interval for [`PoolIndexerClient::wait_until`]. const WAIT_UNTIL_POLL_INTERVAL: Duration = Duration::from_millis(500); +/// Cap on a single `wait_until` call. Bootstrap now runs as a separate +/// initContainer, so the serve container is up within seconds — this only +/// covers the indexer coming up at startup, not the old cold-bootstrap time. +const WAIT_UNTIL_TIMEOUT: Duration = Duration::from_secs(60); + /// Matches the server-side `MAX_POOL_IDS_PER_REQUEST`. const POOL_IDS_PER_REQUEST: usize = 500; @@ -39,20 +44,13 @@ const LIST_PAGE_SIZE: u64 = 5000; pub struct PoolIndexerClient { base_url: Url, http: Client, - /// Cap on a single `wait_until` call. Pick per network to exceed the - /// worst-case fresh-deploy seed time. - wait_until_timeout: Duration, } impl PoolIndexerClient { - pub fn new(base_url: Url, chain: Chain, http: Client, wait_until_timeout: Duration) -> Self { + pub fn new(base_url: Url, chain: Chain, http: Client) -> Self { let prefix = format!("api/v1/{}/uniswap/v3/", chain.as_str()); let base_url = url_join(&base_url, &prefix); - Self { - base_url, - http, - wait_until_timeout, - } + Self { base_url, http } } fn path(&self, suffix: &str) -> Url { @@ -215,12 +213,12 @@ impl IndexerTick { impl PoolIndexerClient { /// Polls `/pools?limit=1` every [`WAIT_UNTIL_POLL_INTERVAL`] until the /// envelope reports `block_number >= target_block`. Returns - /// immediately if already there; bails after [`Self::wait_until_timeout`]. + /// immediately if already there; bails after [`WAIT_UNTIL_TIMEOUT`]. /// /// `503` is treated as "still bootstrapping" and the loop keeps /// polling. Other non-2xx statuses propagate as errors. async fn wait_until(&self, target_block: u64) -> Result<()> { - let deadline = std::time::Instant::now() + self.wait_until_timeout; + let deadline = std::time::Instant::now() + WAIT_UNTIL_TIMEOUT; let mut last_observed: Option = None; let mut interval = tokio::time::interval(WAIT_UNTIL_POLL_INTERVAL); interval.set_missed_tick_behavior(tokio::time::MissedTickBehavior::Delay); @@ -247,7 +245,7 @@ impl PoolIndexerClient { anyhow::bail!( "pool-indexer wait_until exceeded {:?} waiting for block {target_block}; last \ observed indexer block: {last_observed:?}", - self.wait_until_timeout, + WAIT_UNTIL_TIMEOUT, ); } }