Skip to content

feat: add starknet provider metrics#7009

Merged
yjamin merged 4 commits intomainfrom
yjamin/starknet-provider-metrics
Oct 16, 2025
Merged

feat: add starknet provider metrics#7009
yjamin merged 4 commits intomainfrom
yjamin/starknet-provider-metrics

Conversation

@yjamin
Copy link
Copy Markdown
Contributor

@yjamin yjamin commented Sep 8, 2025

Description

Drive-by changes

Related issues

Backward compatibility

Testing

Summary by CodeRabbit

  • New Features

    • Prometheus-backed RPC metrics for Starknet with per-method and per-endpoint observability.
    • Richer chain metrics now include latest block info for improved dashboards.
  • Refactor

    • Unified "provider-first" initialization across Starknet components and indexers for consistent configuration.
    • RPC transport reworked to a metrics-enabled fallback provider with clearer transport error reporting and per-URL metric providers.

@changeset-bot
Copy link
Copy Markdown

changeset-bot Bot commented Sep 8, 2025

⚠️ No Changeset found

Latest commit: eea42f6

Merging this PR will not cause a version bump for any packages. If these changes should not result in a new version, you're good to go. If these changes should result in a version bump, you need to add a changeset.

This PR includes no changesets

When changesets are added to this PR, you'll see the packages that this PR includes changesets for and the associated semver types

Click here to learn what changesets are, and how to add one.

Click here if you're a maintainer who wants to add a changeset to this PR

@codecov
Copy link
Copy Markdown

codecov Bot commented Sep 8, 2025

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 0.00%. Comparing base (3181c49) to head (eea42f6).
⚠️ Report is 1 commits behind head on main.

Additional details and impacted files
@@          Coverage Diff          @@
##            main   #7009   +/-   ##
=====================================
  Coverage   0.00%       0           
=====================================
  Files          1       0    -1     
  Lines         14       0   -14     
=====================================
+ Misses        14       0   -14     
Components Coverage Δ
core ∅ <ø> (∅)
hooks ∅ <ø> (∅)
isms ∅ <ø> (∅)
token ∅ <ø> (∅)
middlewares ∅ <ø> (∅)
🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Sep 8, 2025

📝 Walkthrough

Walkthrough

Shifts Starknet code to a provider-first model (injecting StarknetProvider), integrates Prometheus-backed RPC metrics via a new MetricProvider and metrics-aware FallbackHttpTransport, updates account construction to use a JsonProvider, and adds the hyperlane-metric dependency.

Changes

Cohort / File(s) Summary
Provider metrics + transport
rust/main/chains/hyperlane-starknet/src/provider/client.rs, rust/main/chains/hyperlane-starknet/src/provider/fallback.rs, rust/main/chains/hyperlane-starknet/src/provider/metric.rs, rust/main/chains/hyperlane-starknet/src/provider/mod.rs
Add MetricProvider (Prometheus-wrapped RPC transport), switch FallbackHttpTransport to use MetricProvider, add FallbackHttpTransportError, update StarknetProvider::new to accept metrics and optional ChainInfo, implement chain-metrics retrieval, and re-export metric module.
Constructor injection (provider-first)
rust/main/chains/hyperlane-starknet/src/mailbox.rs, .../merkle_tree_hook.rs, .../interchain_gas.rs, .../ism/aggregation_ism.rs, .../ism/interchain_security_module.rs, .../ism/multisig_ism.rs, .../ism/routing_ism.rs, .../validator_announce.rs, .../indexer.rs
Change many .new signatures to accept StarknetProvider as first parameter instead of building one internally from ConnectionConf; use provider.rpc_client().clone() for readers and store injected provider.
Settings wiring
rust/main/hyperlane-base/src/settings/chains.rs
Add build_starknet_provider helper, wire metrics into provider construction, and update all Starknet component and indexer call sites to the provider-first signatures.
Utils account builder
rust/main/chains/hyperlane-starknet/src/utils.rs
Change build_single_owner_account to accept (signer, &JsonProvider), remove URL-based RPC construction, and select execution encoding based on signer.is_legacy.
Manifest
rust/main/chains/hyperlane-starknet/Cargo.toml
Add dependency: hyperlane-metric = { path = "../../hyperlane-metric" }.

Sequence Diagram(s)

sequenceDiagram
  autonumber
  participant Settings as Settings(chains.rs)
  participant Metrics as PrometheusClientMetrics
  participant Provider as StarknetProvider
  participant Transport as FallbackHttpTransport
  participant MetricProv as MetricProvider
  participant JsonRPC as JsonRpcClient
  participant Component as StarknetComponent

  Settings->>Metrics: prepare metrics config
  Settings->>Provider: build_starknet_provider(domain, conf, Metrics, &locator)
  Provider->>Transport: FallbackHttpTransport::new(urls, Metrics, chain)
  loop per URL
    Transport->>MetricProv: MetricProvider::new(url, Metrics, cfg)
  end
  Provider->>JsonRPC: construct JsonRpcClient with Transport
  Settings->>Component: Component::new(Provider, conf, locator, ...)
  Component->>Provider: rpc_client().clone()
  Note over Component,Provider: Contract readers use JsonProvider clone
Loading
sequenceDiagram
  autonumber
  participant Reader as ContractReader
  participant Provider as StarknetProvider
  participant JsonRPC as JsonRpcClient
  participant MetricProv as MetricProvider
  participant Prom as Prometheus

  Reader->>Provider: rpc_client().clone()
  Provider->>JsonRPC: use JsonRpcClient
  JsonRPC->>MetricProv: send_request(method, params)
  MetricProv->>Prom: record start/time & method
  MetricProv->>JsonRPC: dispatch via HTTP transport
  JsonRPC-->>MetricProv: response / error
  MetricProv->>Prom: record success/failure
  MetricProv-->>Reader: return JsonRpcResponse
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Possibly related PRs

Suggested reviewers

  • ameten
  • daniel-savu
  • tkporter

Poem

A wee change in the swamp tonight,
Providers carry metrics bright.
Readers hum and RPC sings,
New hooks, new bolts, and tidy things.
🍃 Keep the provider close, aye, that’s right.

Pre-merge checks and finishing touches

❌ Failed checks (2 warnings)
Check name Status Explanation Resolution
Description Check ⚠️ Warning Aye, the pull request description is empty aside from the template headings and lacks any real content, so it's like peekin’ into an empty swamp. It doesn’t describe what's included, note drive-by changes, link related issues, address backward compatibility, or detail testing. Without that info, reviewers can’t properly gauge the scope or impact of the changes. Please fill in each section of the template with a summary of the metrics integration and any drive-by changes so that the scope is clear. Link any related issues and confirm backward compatibility so we know if older setups keep workin’. Also detail the testing you've done to validate these updates before we merge.
Docstring Coverage ⚠️ Warning Docstring coverage is 33.33% which is insufficient. The required threshold is 80.00%. You can run @coderabbitai generate docstrings to improve docstring coverage.
✅ Passed checks (1 passed)
Check name Status Explanation
Title Check ✅ Passed Aye, this title keeps things simple and clear by describing the addition of metrics to the Starknet provider. It directly references the main change without any fluff. The phrasing is concise and easy for a mate to grasp at a glance.
✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch yjamin/starknet-provider-metrics

📜 Recent review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between fea2f3e and eea42f6.

📒 Files selected for processing (1)
  • rust/main/chains/hyperlane-starknet/src/provider/metric.rs (1 hunks)
🚧 Files skipped from review as they are similar to previous changes (1)
  • rust/main/chains/hyperlane-starknet/src/provider/metric.rs
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (11)
  • GitHub Check: infra-test
  • GitHub Check: build-and-push-to-gcr
  • GitHub Check: lander-coverage
  • GitHub Check: e2e-matrix (radix)
  • GitHub Check: e2e-matrix (starknet)
  • GitHub Check: e2e-matrix (cosmosnative)
  • GitHub Check: e2e-matrix (sealevel)
  • GitHub Check: e2e-matrix (evm)
  • GitHub Check: e2e-matrix (cosmwasm)
  • GitHub Check: lint-rs
  • GitHub Check: test-rs

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Comment thread rust/main/chains/hyperlane-starknet/src/provider/metric.rs
Comment thread rust/main/chains/hyperlane-starknet/src/provider/metric.rs
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

♻️ Duplicate comments (2)
rust/main/chains/hyperlane-starknet/src/provider/metric.rs (2)

79-87: Consider handling JsonRpcResponse success/failure for finer metrics.

While the current implementation tracks HTTP-level success, you might want to inspect the actual RPC response to distinguish between successful responses and RPC errors. The transport layer might return OK even when the RPC call failed at the application level.

You could enhance the metrics by checking if the response is JsonRpcResponse::Success or JsonRpcResponse::Error:

 let result = self.client.send_request(method, params_json).await;
 let method_string = serde_json::to_string(&method).map_err(Self::Error::Json)?;
+let is_success = result.as_ref().map(|r| matches!(r, JsonRpcResponse::Success(_))).unwrap_or(false);
 self.metrics
-    .increment_metrics(&self.metrics_config, &method_string, start, result.is_ok());
+    .increment_metrics(&self.metrics_config, &method_string, start, is_success);

96-117: Batch request metrics handled properly.

The implementation extracts method names from each request and logs metrics for all of them. This gives you per-method visibility even in batch operations, which is quite useful for debugging and monitoring.

🧹 Nitpick comments (14)
rust/main/chains/hyperlane-starknet/src/validator_announce.rs (1)

172-177: Return None when no funds are needed

If balance covers overall_fee, returning Some(0) is a bit soggy. Prefer None to signal “no top‑up required.”

Apply:

-        Some(
-            estimate
-                .overall_fee
-                .saturating_sub(balance.as_u128())
-                .into(),
-        )
+        {
+            let missing = estimate.overall_fee.saturating_sub(balance.as_u128());
+            if missing == 0 { None } else { Some(missing.into()) }
+        }
rust/main/chains/hyperlane-starknet/src/interchain_gas.rs (1)

21-26: Avoid needless clone of conn

You take conn by value and then clone it. Just move it in.

Apply:

-    pub fn new(provider: StarknetProvider, conn: ConnectionConf) -> ChainResult<Self> {
-        Ok(Self {
-            provider,
-            conn: conn.clone(),
-        })
-    }
+    pub fn new(provider: StarknetProvider, conn: ConnectionConf) -> ChainResult<Self> {
+        Ok(Self { provider, conn })
+    }
rust/main/chains/hyperlane-starknet/src/indexer.rs (1)

253-261: Guard against reversed ranges (optional)

Add a quick check for start > end to fail fast instead of querying an empty slice of the swamp.

Apply:

-    if *range.start() > current_block || *range.end() > current_block {
+    if *range.start() > *range.end() || *range.start() > current_block || *range.end() > current_block {
         return Err(HyperlaneStarknetError::Other(format!(
             "range {:?} is not valid for current block {}",
             range, current_block
         ))
         .into());
     }
rust/main/chains/hyperlane-starknet/src/provider/client.rs (5)

8-8: Alias the metrics ChainInfo to avoid type shadowing with hyperlane_core::ChainInfo

Two different ChainInfo types live in this file; aliasing the metrics one keeps things tidy and reduces head‑scratching.

-use hyperlane_metric::prometheus_metric::{ChainInfo, PrometheusClientMetrics};
+use hyperlane_metric::prometheus_metric::{ChainInfo as MetricChainInfo, PrometheusClientMetrics};

34-45: Provider construction with metrics looks good; minor API polish

Wiring metrics and chain through the transport is clean. Consider accepting &PrometheusClientMetrics (cloning inside) to make the call‑site cheaper and nudge sharing, but not a blocker.


34-39: Follow‑up to aliasing: update the param type if you adopt the alias

Keeps signatures unambiguous for readers.

-        chain: Option<ChainInfo>,
+        chain: Option<MetricChainInfo>,

80-94: Block fetch path LGTM; minor edge note

Numeric block ids shouldn’t return Pending, but if they ever do, mapping to InvalidBlock is a bit spiky. Optional: log at debug before erroring to aid swamp‑tracking during flaky RPCs.


195-203: Unify rpc_client accessor and error-conversion style

All good — tidy up: get_chain_metrics (rust/main/chains/hyperlane-starknet/src/provider/client.rs, ~lines 195–203): replace self.rpc_client with self.rpc_client() and change .map_err(HyperlaneStarknetError::from) to .map_err(Into::::into) to match the rest of the file.

rust/main/chains/hyperlane-starknet/src/provider/fallback.rs (4)

5-5: Tiny doc nit: “Clopying” → “Copying”

Polish the comment; reads smoother than a mudslide.


55-66: Drop an unnecessary clone on metrics_config

No need to clone right before moving. Lighter footprints, fewer footprints in the swamp.

-        let providers = urls.into_iter().map(|url| {
-            let metrics_config =
-                PrometheusConfig::from_url(&url, ClientConnectionType::Rpc, chain.clone());
-
-            MetricProvider::new(url, metrics.clone(), metrics_config.clone())
-        });
+        let providers = urls.into_iter().map(|url| {
+            let metrics_config =
+                PrometheusConfig::from_url(&url, ClientConnectionType::Rpc, chain.clone());
+            MetricProvider::new(url, metrics.clone(), metrics_config)
+        });

89-129: Retry/backoff knobs: make constants or config; consider delegating to FallbackProvider

Hard‑coding 4 attempts and 100ms backoff makes tuning harder if RPC mud gets thick. Promote to constants at module scope (or a config), and, when feasible, reuse FallbackProvider::call for single‑request paths too so both codepaths share brains.

+// Retry controls for single-request path
+const MAX_ATTEMPTS: usize = 4;
+const RETRY_BACKOFF_MS: u64 = 100;
@@
-        // Try up to 4 times
-        for _ in 0..4 {
+        // Try up to MAX_ATTEMPTS times
+        for _ in 0..MAX_ATTEMPTS {
             if !errors.is_empty() {
-                sleep(Duration::from_millis(100)).await;
+                sleep(Duration::from_millis(RETRY_BACKOFF_MS)).await;
             }

If/when trait bounds allow, mirror send_requests by using self.call(...) here to consolidate fallback behavior.


39-51: Embed provider index/URL in FallbackHttpTransportError::Errors for clearer post‑mortems

You already log provider_index and fallback_count (rust/main/chains/hyperlane-starknet/src/provider/fallback.rs — debug around lines ~100–103; warn push around ~117–121; final Err at ~131). Make the error self‑describing by changing Errors(Vec) → Errors(Vec) where ProviderError contains provider_index and/or provider_url plus the HttpTransportError (minimal option: Errors(Vec<(usize, HttpTransportError)>)). Keeps current logs and gives breadcrumbs when logs aren't available — makes triage less swampy.

rust/main/hyperlane-base/src/settings/chains.rs (2)

841-849: Avoid ref‑of‑clone on locator

Passing &locator.clone() does extra work. Just borrow locator.

-                    h_starknet::StarknetValidatorAnnounce::new(
-                        provider,
-                        conf,
-                        &locator.clone(),
-                        signer,
-                    )
+                    h_starknet::StarknetValidatorAnnounce::new(
+                        provider,
+                        conf,
+                        &locator,
+                        signer,
+                    )

1360-1374: Starknet provider builder: small clone cleanup and param naming nit

  • metrics.clone() is unnecessary right before move.
  • Optional: rename local metrics to client_metrics to avoid shadowing/confusion with the CoreMetrics arg.
-fn build_starknet_provider(
+fn build_starknet_provider(
     chain_conf: &ChainConf,
     connection_conf: &h_starknet::ConnectionConf,
-    metrics: &CoreMetrics,
+    metrics: &CoreMetrics,
     locator: &ContractLocator,
 ) -> ChainResult<StarknetProvider> {
     let middleware_metrics = chain_conf.metrics_conf();
-    let metrics = metrics.client_metrics();
+    let client_metrics = metrics.client_metrics();
     Ok(StarknetProvider::new(
         locator.domain.clone(),
         connection_conf,
-        metrics.clone(),
+        client_metrics,
         middleware_metrics.chain.clone(),
     ))
 }
📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 0268a7d and f1249ce.

⛔ Files ignored due to path filters (1)
  • rust/main/Cargo.lock is excluded by !**/*.lock
📒 Files selected for processing (16)
  • rust/main/chains/hyperlane-starknet/Cargo.toml (1 hunks)
  • rust/main/chains/hyperlane-starknet/src/indexer.rs (3 hunks)
  • rust/main/chains/hyperlane-starknet/src/interchain_gas.rs (2 hunks)
  • rust/main/chains/hyperlane-starknet/src/ism/aggregation_ism.rs (2 hunks)
  • rust/main/chains/hyperlane-starknet/src/ism/interchain_security_module.rs (2 hunks)
  • rust/main/chains/hyperlane-starknet/src/ism/multisig_ism.rs (2 hunks)
  • rust/main/chains/hyperlane-starknet/src/ism/routing_ism.rs (2 hunks)
  • rust/main/chains/hyperlane-starknet/src/mailbox.rs (1 hunks)
  • rust/main/chains/hyperlane-starknet/src/merkle_tree_hook.rs (2 hunks)
  • rust/main/chains/hyperlane-starknet/src/provider/client.rs (4 hunks)
  • rust/main/chains/hyperlane-starknet/src/provider/fallback.rs (2 hunks)
  • rust/main/chains/hyperlane-starknet/src/provider/metric.rs (1 hunks)
  • rust/main/chains/hyperlane-starknet/src/provider/mod.rs (1 hunks)
  • rust/main/chains/hyperlane-starknet/src/utils.rs (4 hunks)
  • rust/main/chains/hyperlane-starknet/src/validator_announce.rs (1 hunks)
  • rust/main/hyperlane-base/src/settings/chains.rs (14 hunks)
🧰 Additional context used
📓 Path-based instructions (2)
rust/main/**/src/**/*.rs

📄 CodeRabbit inference engine (CLAUDE.md)

Run cargo clippy for Rust code linting

Files:

  • rust/main/chains/hyperlane-starknet/src/provider/mod.rs
  • rust/main/chains/hyperlane-starknet/src/merkle_tree_hook.rs
  • rust/main/chains/hyperlane-starknet/src/ism/aggregation_ism.rs
  • rust/main/chains/hyperlane-starknet/src/ism/interchain_security_module.rs
  • rust/main/chains/hyperlane-starknet/src/mailbox.rs
  • rust/main/chains/hyperlane-starknet/src/validator_announce.rs
  • rust/main/chains/hyperlane-starknet/src/ism/routing_ism.rs
  • rust/main/chains/hyperlane-starknet/src/provider/metric.rs
  • rust/main/chains/hyperlane-starknet/src/ism/multisig_ism.rs
  • rust/main/chains/hyperlane-starknet/src/utils.rs
  • rust/main/chains/hyperlane-starknet/src/provider/client.rs
  • rust/main/chains/hyperlane-starknet/src/interchain_gas.rs
  • rust/main/chains/hyperlane-starknet/src/indexer.rs
  • rust/main/hyperlane-base/src/settings/chains.rs
  • rust/main/chains/hyperlane-starknet/src/provider/fallback.rs
rust/main/{hyperlane-core,hyperlane-base}/**/src/**/*.rs

📄 CodeRabbit inference engine (CLAUDE.md)

Keep shared Rust core crates in rust/main/{hyperlane-core,hyperlane-base}

Files:

  • rust/main/hyperlane-base/src/settings/chains.rs
🧠 Learnings (2)
📚 Learning: 2025-09-02T18:44:06.598Z
Learnt from: CR
PR: hyperlane-xyz/hyperlane-monorepo#0
File: CLAUDE.md:0-0
Timestamp: 2025-09-02T18:44:06.598Z
Learning: Applies to rust/main/{hyperlane-core,hyperlane-base}/**/src/**/*.rs : Keep shared Rust core crates in rust/main/{hyperlane-core,hyperlane-base}

Applied to files:

  • rust/main/chains/hyperlane-starknet/Cargo.toml
📚 Learning: 2025-09-02T18:44:06.598Z
Learnt from: CR
PR: hyperlane-xyz/hyperlane-monorepo#0
File: CLAUDE.md:0-0
Timestamp: 2025-09-02T18:44:06.598Z
Learning: Applies to rust/main/chains/{hyperlane-ethereum,hyperlane-cosmos,hyperlane-sealevel,hyperlane-fuel}/**/src/**/*.rs : Keep chain support implementations within rust/main/chains/{hyperlane-ethereum,hyperlane-cosmos,hyperlane-sealevel,hyperlane-fuel}

Applied to files:

  • rust/main/chains/hyperlane-starknet/Cargo.toml
  • rust/main/chains/hyperlane-starknet/src/interchain_gas.rs
🧬 Code graph analysis (13)
rust/main/chains/hyperlane-starknet/src/merkle_tree_hook.rs (8)
rust/main/chains/hyperlane-starknet/src/indexer.rs (2)
  • new (31-45)
  • new (139-153)
rust/main/chains/hyperlane-starknet/src/interchain_gas.rs (2)
  • new (21-26)
  • provider (34-36)
rust/main/chains/hyperlane-starknet/src/ism/aggregation_ism.rs (2)
  • new (29-43)
  • provider (51-53)
rust/main/chains/hyperlane-starknet/src/ism/interchain_security_module.rs (2)
  • new (29-43)
  • provider (51-53)
rust/main/chains/hyperlane-starknet/src/ism/multisig_ism.rs (2)
  • new (29-43)
  • provider (51-53)
rust/main/chains/hyperlane-starknet/src/ism/routing_ism.rs (2)
  • new (28-42)
  • provider (50-52)
rust/main/chains/hyperlane-starknet/src/mailbox.rs (2)
  • new (40-57)
  • provider (75-77)
rust/main/chains/hyperlane-starknet/src/validator_announce.rs (2)
  • new (47-64)
  • provider (90-92)
rust/main/chains/hyperlane-starknet/src/ism/aggregation_ism.rs (7)
rust/main/chains/hyperlane-starknet/src/provider/client.rs (2)
  • new (34-54)
  • provider (72-74)
rust/main/chains/hyperlane-starknet/src/indexer.rs (2)
  • new (31-45)
  • new (139-153)
rust/main/chains/hyperlane-starknet/src/ism/interchain_security_module.rs (2)
  • new (29-43)
  • provider (51-53)
rust/main/chains/hyperlane-starknet/src/ism/multisig_ism.rs (2)
  • new (29-43)
  • provider (51-53)
rust/main/chains/hyperlane-starknet/src/ism/routing_ism.rs (2)
  • new (28-42)
  • provider (50-52)
rust/main/chains/hyperlane-starknet/src/mailbox.rs (2)
  • new (40-57)
  • provider (75-77)
rust/main/chains/hyperlane-starknet/src/merkle_tree_hook.rs (2)
  • new (32-45)
  • provider (53-55)
rust/main/chains/hyperlane-starknet/src/ism/interchain_security_module.rs (7)
rust/main/chains/hyperlane-starknet/src/provider/client.rs (2)
  • new (34-54)
  • provider (72-74)
rust/main/chains/hyperlane-starknet/src/indexer.rs (2)
  • new (31-45)
  • new (139-153)
rust/main/chains/hyperlane-starknet/src/ism/aggregation_ism.rs (2)
  • new (29-43)
  • provider (51-53)
rust/main/chains/hyperlane-starknet/src/ism/multisig_ism.rs (2)
  • new (29-43)
  • provider (51-53)
rust/main/chains/hyperlane-starknet/src/ism/routing_ism.rs (2)
  • new (28-42)
  • provider (50-52)
rust/main/chains/hyperlane-starknet/src/mailbox.rs (2)
  • new (40-57)
  • provider (75-77)
rust/main/chains/hyperlane-starknet/src/merkle_tree_hook.rs (2)
  • new (32-45)
  • provider (53-55)
rust/main/chains/hyperlane-starknet/src/mailbox.rs (2)
rust/main/chains/hyperlane-starknet/src/validator_announce.rs (2)
  • provider (90-92)
  • new (47-64)
rust/main/chains/hyperlane-starknet/src/utils.rs (1)
  • build_single_owner_account (76-101)
rust/main/chains/hyperlane-starknet/src/validator_announce.rs (2)
rust/main/chains/hyperlane-starknet/src/mailbox.rs (2)
  • provider (75-77)
  • new (40-57)
rust/main/chains/hyperlane-starknet/src/utils.rs (1)
  • build_single_owner_account (76-101)
rust/main/chains/hyperlane-starknet/src/ism/routing_ism.rs (8)
rust/main/chains/hyperlane-starknet/src/provider/client.rs (2)
  • new (34-54)
  • provider (72-74)
rust/main/chains/hyperlane-starknet/src/indexer.rs (2)
  • new (31-45)
  • new (139-153)
rust/main/chains/hyperlane-starknet/src/ism/aggregation_ism.rs (2)
  • new (29-43)
  • provider (51-53)
rust/main/chains/hyperlane-starknet/src/ism/interchain_security_module.rs (2)
  • new (29-43)
  • provider (51-53)
rust/main/chains/hyperlane-starknet/src/ism/multisig_ism.rs (2)
  • new (29-43)
  • provider (51-53)
rust/main/chains/hyperlane-starknet/src/mailbox.rs (2)
  • new (40-57)
  • provider (75-77)
rust/main/chains/hyperlane-starknet/src/merkle_tree_hook.rs (2)
  • new (32-45)
  • provider (53-55)
rust/main/chains/hyperlane-starknet/src/validator_announce.rs (2)
  • new (47-64)
  • provider (90-92)
rust/main/chains/hyperlane-starknet/src/provider/metric.rs (2)
rust/main/chains/hyperlane-starknet/src/provider/client.rs (1)
  • new (34-54)
rust/main/chains/hyperlane-starknet/src/provider/fallback.rs (2)
  • new (55-69)
  • send_request (77-132)
rust/main/chains/hyperlane-starknet/src/ism/multisig_ism.rs (6)
rust/main/chains/hyperlane-starknet/src/indexer.rs (2)
  • new (31-45)
  • new (139-153)
rust/main/chains/hyperlane-starknet/src/ism/aggregation_ism.rs (2)
  • new (29-43)
  • provider (51-53)
rust/main/chains/hyperlane-starknet/src/ism/interchain_security_module.rs (2)
  • new (29-43)
  • provider (51-53)
rust/main/chains/hyperlane-starknet/src/ism/routing_ism.rs (2)
  • new (28-42)
  • provider (50-52)
rust/main/chains/hyperlane-starknet/src/mailbox.rs (2)
  • new (40-57)
  • provider (75-77)
rust/main/chains/hyperlane-starknet/src/merkle_tree_hook.rs (2)
  • new (32-45)
  • provider (53-55)
rust/main/chains/hyperlane-starknet/src/provider/client.rs (2)
rust/main/chains/hyperlane-starknet/src/provider/fallback.rs (1)
  • new (55-69)
rust/main/chains/hyperlane-starknet/src/provider/metric.rs (1)
  • new (27-41)
rust/main/chains/hyperlane-starknet/src/interchain_gas.rs (9)
rust/main/chains/hyperlane-starknet/src/provider/client.rs (2)
  • new (34-54)
  • provider (72-74)
rust/main/chains/hyperlane-starknet/src/indexer.rs (2)
  • new (31-45)
  • new (139-153)
rust/main/chains/hyperlane-starknet/src/ism/aggregation_ism.rs (2)
  • new (29-43)
  • provider (51-53)
rust/main/chains/hyperlane-starknet/src/ism/interchain_security_module.rs (2)
  • new (29-43)
  • provider (51-53)
rust/main/chains/hyperlane-starknet/src/ism/multisig_ism.rs (2)
  • new (29-43)
  • provider (51-53)
rust/main/chains/hyperlane-starknet/src/ism/routing_ism.rs (2)
  • new (28-42)
  • provider (50-52)
rust/main/chains/hyperlane-starknet/src/mailbox.rs (2)
  • new (40-57)
  • provider (75-77)
rust/main/chains/hyperlane-starknet/src/merkle_tree_hook.rs (2)
  • new (32-45)
  • provider (53-55)
rust/main/chains/hyperlane-starknet/src/validator_announce.rs (2)
  • new (47-64)
  • provider (90-92)
rust/main/chains/hyperlane-starknet/src/indexer.rs (2)
rust/main/chains/hyperlane-starknet/src/provider/client.rs (2)
  • provider (72-74)
  • new (34-54)
rust/main/chains/hyperlane-starknet/src/merkle_tree_hook.rs (2)
  • provider (53-55)
  • new (32-45)
rust/main/hyperlane-base/src/settings/chains.rs (8)
rust/main/chains/hyperlane-starknet/src/provider/client.rs (1)
  • provider (72-74)
rust/main/chains/hyperlane-starknet/src/ism/aggregation_ism.rs (2)
  • provider (51-53)
  • new (29-43)
rust/main/chains/hyperlane-starknet/src/ism/interchain_security_module.rs (2)
  • provider (51-53)
  • new (29-43)
rust/main/chains/hyperlane-starknet/src/ism/multisig_ism.rs (2)
  • provider (51-53)
  • new (29-43)
rust/main/chains/hyperlane-starknet/src/ism/routing_ism.rs (2)
  • provider (50-52)
  • new (28-42)
rust/main/chains/hyperlane-starknet/src/mailbox.rs (2)
  • provider (75-77)
  • new (40-57)
rust/main/chains/hyperlane-starknet/src/merkle_tree_hook.rs (2)
  • provider (53-55)
  • new (32-45)
rust/main/chains/hyperlane-starknet/src/validator_announce.rs (2)
  • provider (90-92)
  • new (47-64)
rust/main/chains/hyperlane-starknet/src/provider/fallback.rs (2)
rust/main/chains/hyperlane-starknet/src/provider/client.rs (1)
  • new (34-54)
rust/main/chains/hyperlane-starknet/src/provider/metric.rs (1)
  • new (27-41)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (49)
  • GitHub Check: infra-test
  • GitHub Check: cli-evm-e2e-matrix (warp-extend-basic)
  • GitHub Check: cli-evm-e2e-matrix (warp-read)
  • GitHub Check: cli-evm-e2e-matrix (core-init)
  • GitHub Check: cli-evm-e2e-matrix (warp-send)
  • GitHub Check: cli-evm-e2e-matrix (warp-apply-2)
  • GitHub Check: cli-evm-e2e-matrix (warp-check-2)
  • GitHub Check: cli-evm-e2e-matrix (warp-deploy)
  • GitHub Check: cli-evm-e2e-matrix (core-deploy)
  • GitHub Check: cli-evm-e2e-matrix (warp-extend-recovery)
  • GitHub Check: cli-evm-e2e-matrix (warp-init)
  • GitHub Check: cli-evm-e2e-matrix (warp-extend-config)
  • GitHub Check: cli-evm-e2e-matrix (warp-rebalancer)
  • GitHub Check: cli-evm-e2e-matrix (warp-bridge-2)
  • GitHub Check: cli-evm-e2e-matrix (warp-apply-submitters)
  • GitHub Check: cli-evm-e2e-matrix (warp-check-3)
  • GitHub Check: cli-evm-e2e-matrix (warp-apply-1)
  • GitHub Check: cli-evm-e2e-matrix (warp-check-1)
  • GitHub Check: cli-evm-e2e-matrix (relay)
  • GitHub Check: cli-evm-e2e-matrix (warp-bridge-1)
  • GitHub Check: cli-evm-e2e-matrix (core-read)
  • GitHub Check: cli-evm-e2e-matrix (core-check)
  • GitHub Check: cli-cosmos-e2e-matrix (core-deploy)
  • GitHub Check: cli-cosmos-e2e-matrix (warp-read)
  • GitHub Check: cli-evm-e2e-matrix (core-apply)
  • GitHub Check: cli-cosmos-e2e-matrix (core-read)
  • GitHub Check: cli-cosmos-e2e-matrix (warp-deploy)
  • GitHub Check: cli-cosmos-e2e-matrix (core-apply)
  • GitHub Check: cli-cosmos-e2e-matrix (core-check)
  • GitHub Check: env-test-matrix (mainnet3, inevm, core)
  • GitHub Check: env-test-matrix (mainnet3, ethereum, core)
  • GitHub Check: env-test-matrix (mainnet3, optimism, core)
  • GitHub Check: env-test-matrix (mainnet3, optimism, igp)
  • GitHub Check: env-test-matrix (testnet4, sepolia, core)
  • GitHub Check: env-test-matrix (mainnet3, arbitrum, igp)
  • GitHub Check: env-test-matrix (mainnet3, inevm, igp)
  • GitHub Check: env-test-matrix (mainnet3, ethereum, igp)
  • GitHub Check: env-test-matrix (mainnet3, arbitrum, core)
  • GitHub Check: cli-install-test-run
  • GitHub Check: cosmos-sdk-e2e-run
  • GitHub Check: build-and-push-to-gcr
  • GitHub Check: e2e-matrix (starknet)
  • GitHub Check: e2e-matrix (cosmosnative)
  • GitHub Check: e2e-matrix (evm)
  • GitHub Check: e2e-matrix (sealevel)
  • GitHub Check: e2e-matrix (cosmwasm)
  • GitHub Check: test-rs
  • GitHub Check: lint-rs
  • GitHub Check: lander-coverage
🔇 Additional comments (35)
rust/main/chains/hyperlane-starknet/Cargo.toml (1)

31-31: LGTM! Dependency addition looks proper.

The new hyperlane-metric dependency follows the workspace pattern just like the other local dependencies. This'll enable the Prometheus metrics functionality throughout the Starknet provider implementation.

rust/main/chains/hyperlane-starknet/src/utils.rs (2)

76-79: Nice refactor to dependency injection!

Changed from building providers internally to accepting an injected JsonProvider. This is a much cleaner approach - lets the caller control the provider lifecycle and configuration.


88-92: Good handling of the execution encoding.

The logic properly switches between Legacy and New encoding based on the signer's type. This ensures compatibility with both Cairo 0 and newer account types.

rust/main/chains/hyperlane-starknet/src/provider/metric.rs (4)

17-23: Well-structured metric provider wrapper.

The MetricProvider struct cleanly encapsulates the HTTP transport with metrics collection. Keeping the metrics and config separate from the client is a solid design choice.


44-56: Clone implementation correctly manages metrics.

You're incrementing the provider instance count on clone, which is important for accurate tracking of active providers. The implementation maintains all the necessary state properly.


58-64: Drop implementation ensures proper cleanup.

Decrementing the provider count in the destructor prevents metric leaks. This'll keep your Prometheus metrics accurate when providers are cleaned up.


122-132: BlockNumberGetter implementation looks good.

The trait implementation properly wraps the JSON-RPC client and maps errors through the appropriate error types. This'll work well with the fallback provider setup.

rust/main/chains/hyperlane-starknet/src/provider/mod.rs (1)

3-3: Module organization is clean and follows conventions.

Adding the metric module and re-exporting its contents keeps the provider functionality well-organized. This makes the MetricProvider available throughout the crate without needing deep imports.

Also applies to: 7-7

rust/main/chains/hyperlane-starknet/src/merkle_tree_hook.rs (1)

32-45: Constructor properly accepts injected provider.

The refactor from building providers internally to accepting an injected StarknetProvider is consistent with the broader changes across the codebase. The provider's RPC client is properly cloned for the contract reader initialization.

rust/main/chains/hyperlane-starknet/src/validator_announce.rs (3)

48-53: Provider-first constructor: solid move

Injecting StarknetProvider and deriving the account from provider.rpc_client() aligns with the rest of the crate’s pattern. Nice and tidy.


61-63: Store-and-expose provider is consistent

Keeping the cloned provider and returning it via HyperlaneChain::provider() matches sibling modules. All good.


163-167: Verify address format passed to get_balance

Heads-up: self.contract.account.address().to_string() may produce a decimal string; confirm provider.get_balance expects a 0x‑prefixed hex address — my earlier rg search returned no matches so I couldn't verify the signature.

Location: rust/main/chains/hyperlane-starknet/src/validator_announce.rs:163-167

Run in repo root to show get_balance signature / provider impl:

rg -n -C2 '\bget_balance\s*\(' -S -g '!**/target/**'
rg -n -C2 'impl\s+StarknetProvider' -S -g '!**/target/**'
rg -n -C2 'trait\s+StarknetProvider' -S -g '!**/target/**'

If get_balance expects hex, adapt the call:

-            .get_balance(self.contract.account.address().to_string())
+            .get_balance(format!("{:#x}", self.contract.account.address()))

If LowerHex isn't implemented, convert the address to bytes and hex-encode.

rust/main/chains/hyperlane-starknet/src/interchain_gas.rs (1)

6-8: Imports look right

New traits/types wired cleanly. No fuss.

rust/main/chains/hyperlane-starknet/src/mailbox.rs (2)

41-47: Constructor refactor: clean and consistent

Using provider.rpc_client() for account creation matches the new pattern. Nicely layered, like onions.


54-56: Provider plumbed through

Storing the injected provider keeps HyperlaneChain::provider() trivial and consistent. All good.

rust/main/chains/hyperlane-starknet/src/ism/multisig_ism.rs (3)

15-16: Import shuffle OK

Bringing in JsonProvider is expected for reader construction.


29-37: Provider-first API matches siblings

Deriving json_provider from provider.rpc_client() and storing provider keeps things uniform across ISMs.


40-42: Consistent state init

Struct init mirrors the rest; no loose ends.

rust/main/chains/hyperlane-starknet/src/ism/routing_ism.rs (3)

15-16: Import alignment

Switch to JsonProvider is as expected for the reader.


28-36: Constructor consistency

Provider injection + json_provider cloning fits the new pattern. Looks good.


39-41: Init tidy

All fields set cleanly; nothing muddy here.

rust/main/chains/hyperlane-starknet/src/ism/interchain_security_module.rs (3)

15-16: Imports: OK

JsonProvider and helpers wired up fine.


29-37: Provider-first constructor: good

Reader built from json_provider, provider retained for traits — consistent with the swamp… err, crate.


40-42: Field init consistent

No footguns spotted.

rust/main/chains/hyperlane-starknet/src/ism/aggregation_ism.rs (3)

15-16: Imports look right

JsonProvider added appropriately.


29-37: Constructor matches the new pattern

Use of provider.rpc_client().clone() for the reader and storing provider mirrors siblings. Ship it.


40-42: Init is straightforward

No redundant work here.

rust/main/chains/hyperlane-starknet/src/indexer.rs (4)

16-18: Imports updated correctly

Switch to JsonProvider + StarknetProvider fits with provider-first indexing.


31-39: Mailbox indexer: provider-first wiring LGTM

Reader now uses provider.rpc_client().clone(); constructor signature updated. All consistent.


140-147: MerkleTreeHook indexer: same good pattern

Mirrors mailbox indexer changes; no surprises.


1-317: Run Clippy on changed crate (rust/main/chains/hyperlane-starknet)

Sandbox couldn't run Clippy: "Unable to proceed. Could not locate working directory.: no /proc/self/exe available. Is /proc mounted?" — can't verify lints here. Run locally or in CI and fix warnings-as-errors:

cd rust/main/chains/hyperlane-starknet
cargo clippy -q --no-deps --all-features -- -D warnings

Fix reported warnings and push the results or attach the Clippy output.

rust/main/chains/hyperlane-starknet/src/provider/fallback.rs (1)

134-156: Batch path uses FallbackProvider::call correctly

Error mapping and boxing look tidy. Nice and layered.

rust/main/hyperlane-base/src/settings/chains.rs (3)

34-35: Importing StarknetProvider here is the right call

Keeps construction centralized. No concerns.


312-314: Provider-first Starknet wiring — quick sweep passed

Found provider-first constructor at rust/main/chains/hyperlane-starknet/src/interchain_gas.rs:21; no occurrences of old conf/locator-first calls detected.


1-1: Run cargo clippy on the touched crates and fix &*.clone() borrow nits

Couldn't run cargo clippy in the sandbox (no /proc). rg flagged these &*.clone() spots — prefer borrowing (&x) or cloning without the extra &:

  • rust/main/hyperlane-base/src/settings/chains.rs:845 — &locator.clone()
  • rust/main/agents/relayer/src/relayer.rs:313 — &task_monitor.clone()
  • rust/main/agents/scraper/src/agent.rs:273 — &metrics.clone()
  • rust/main/agents/scraper/src/agent.rs:274 — &contract_sync_metrics.clone()
  • rust/main/agents/scraper/src/agent.rs:315 — &metrics.clone()
  • rust/main/agents/scraper/src/agent.rs:316 — &contract_sync_metrics.clone()
  • rust/main/agents/scraper/src/agent.rs:358 — &metrics.clone()
  • rust/main/agents/scraper/src/agent.rs:359 — &contract_sync_metrics.clone()
  • rust/main/hyperlane-base/src/cache/moka/mod.rs:142 — cache.set(&key.clone(), &value, ttl)
  • rust/main/hyperlane-base/src/cache/moka/mod.rs:176 — cache.set(&key.clone(), &value, ttl)
  • rust/main/hyperlane-base/src/cache/moka/mod.rs:201 — cache.set(&key.clone(), &value, ttl)
  • rust/main/hyperlane-base/src/cache/moka/mod.rs:228 — cache.set(&key.clone(), &value, ttl)

Run locally: cargo clippy -p hyperlane-starknet -p hyperlane-base -D warnings.

@yjamin yjamin enabled auto-merge October 16, 2025 12:21
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

🧹 Nitpick comments (3)
rust/main/hyperlane-base/src/settings/chains.rs (2)

847-856: Drop the needless clone on locator reference

Passing &locator.clone() allocates for nothing. Just pass &locator.

-                    h_starknet::StarknetValidatorAnnounce::new(
-                        provider,
-                        conf,
-                        &locator.clone(),
-                        signer,
-                    )
+                    h_starknet::StarknetValidatorAnnounce::new(
+                        provider,
+                        conf,
+                        &locator,
+                        signer,
+                    )

1376-1390: Helper reads well; consider avoiding ident shadowing

let metrics = metrics.client_metrics(); shadows the param; harmless but a bit muddy. Consider renaming to client_metrics for clarity.

rust/main/chains/hyperlane-starknet/src/provider/client.rs (1)

8-8: Alias ChainInfo import to reduce type shadowing

Both metric and core define ChainInfo. You already FQ the core one later; aliasing the metric one keeps the ogre-mind clear.

-use hyperlane_metric::prometheus_metric::{ChainInfo, PrometheusClientMetrics};
+use hyperlane_metric::prometheus_metric::{ChainInfo as MetricChainInfo, PrometheusClientMetrics};

And update the new signature param to Option<MetricChainInfo>.

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between f1249ce and fea2f3e.

⛔ Files ignored due to path filters (1)
  • rust/main/Cargo.lock is excluded by !**/*.lock
📒 Files selected for processing (4)
  • rust/main/chains/hyperlane-starknet/src/mailbox.rs (1 hunks)
  • rust/main/chains/hyperlane-starknet/src/provider/client.rs (4 hunks)
  • rust/main/chains/hyperlane-starknet/src/validator_announce.rs (1 hunks)
  • rust/main/hyperlane-base/src/settings/chains.rs (14 hunks)
🚧 Files skipped from review as they are similar to previous changes (1)
  • rust/main/chains/hyperlane-starknet/src/validator_announce.rs
🧰 Additional context used
📓 Path-based instructions (2)
rust/main/**/src/**/*.rs

📄 CodeRabbit inference engine (CLAUDE.md)

Run cargo clippy for Rust code linting

Files:

  • rust/main/chains/hyperlane-starknet/src/mailbox.rs
  • rust/main/chains/hyperlane-starknet/src/provider/client.rs
  • rust/main/hyperlane-base/src/settings/chains.rs
rust/main/{hyperlane-core,hyperlane-base}/**/src/**/*.rs

📄 CodeRabbit inference engine (CLAUDE.md)

Keep shared Rust core crates in rust/main/{hyperlane-core,hyperlane-base}

Files:

  • rust/main/hyperlane-base/src/settings/chains.rs
🧬 Code graph analysis (3)
rust/main/chains/hyperlane-starknet/src/mailbox.rs (2)
rust/main/chains/hyperlane-starknet/src/validator_announce.rs (2)
  • provider (90-92)
  • new (47-64)
rust/main/chains/hyperlane-starknet/src/utils.rs (1)
  • build_single_owner_account (76-101)
rust/main/chains/hyperlane-starknet/src/provider/client.rs (3)
rust/main/chains/hyperlane-starknet/src/provider/fallback.rs (1)
  • new (55-69)
rust/main/chains/hyperlane-starknet/src/provider/metric.rs (1)
  • new (27-41)
rust/main/chains/hyperlane-ethereum/src/rpc_clients/provider.rs (3)
  • domain (61-63)
  • provider (65-70)
  • get_chain_metrics (470-503)
rust/main/hyperlane-base/src/settings/chains.rs (7)
rust/main/chains/hyperlane-starknet/src/validator_announce.rs (2)
  • provider (90-92)
  • new (47-64)
rust/main/chains/hyperlane-starknet/src/mailbox.rs (2)
  • provider (75-77)
  • new (40-57)
rust/main/chains/hyperlane-starknet/src/ism/interchain_security_module.rs (2)
  • provider (51-53)
  • new (29-43)
rust/main/chains/hyperlane-starknet/src/ism/aggregation_ism.rs (2)
  • provider (51-53)
  • new (29-43)
rust/main/chains/hyperlane-starknet/src/ism/routing_ism.rs (2)
  • provider (50-52)
  • new (28-42)
rust/main/chains/hyperlane-starknet/src/ism/multisig_ism.rs (2)
  • provider (51-53)
  • new (29-43)
rust/main/chains/hyperlane-starknet/src/merkle_tree_hook.rs (2)
  • provider (53-55)
  • new (32-45)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (11)
  • GitHub Check: infra-test
  • GitHub Check: build-and-push-to-gcr
  • GitHub Check: e2e-matrix (sealevel)
  • GitHub Check: e2e-matrix (starknet)
  • GitHub Check: e2e-matrix (evm)
  • GitHub Check: e2e-matrix (cosmwasm)
  • GitHub Check: e2e-matrix (cosmosnative)
  • GitHub Check: e2e-matrix (radix)
  • GitHub Check: lint-rs
  • GitHub Check: test-rs
  • GitHub Check: lander-coverage
🔇 Additional comments (14)
rust/main/hyperlane-base/src/settings/chains.rs (10)

312-314: Provider-first Starknet wiring looks clean

Builds provider via helper and returns as HyperlaneProvider. Consistent with other chains.


371-374: Mailbox path: provider + signer flow is solid

Building signer, then provider, then passing into provider-first ctor is spot on.

Also applies to: 372-374


429-431: Merkle tree hook: provider-first constructor is aligned

Neat and tidy; matches the new pattern.


500-505: Message indexer: reorg period preserved

Provider-first ctor with reorg period forwarded. All good.

Please confirm StarknetMailboxIndexer’s reorg semantics didn’t change with the ctor switch.


572-577: Delivery indexer: consistent migration

Same as message indexer; looks good.


922-925: ISM ctor change looks right

Provider-first and locator forwarded. Good.


977-981: Multisig ISM ctor migration LGTM

Matches the new pattern across modules.


1026-1029: Routing ISM wiring is consistent

Provider-first + locator. All good, donkey.


1078-1081: Aggregation ISM: clean transition

No nits here.


637-642: No missing locator in Starknet IGP ctor
The StarknetInterchainGasPaymaster::new signature only takes (provider, conn: ConnectionConf), so conf.clone() is correct and no locator is needed.

rust/main/chains/hyperlane-starknet/src/mailbox.rs (1)

41-47: Provider-first mailbox ctor is on point

Using build_single_owner_account(signer, provider.rpc_client()) and storing the passed provider keeps things simple and consistent.

Also applies to: 52-55

rust/main/chains/hyperlane-starknet/src/provider/client.rs (3)

34-45: Constructor neatly folds transport + metrics

Creating the JsonRpcClient with the metrics-enabled fallback transport is clean and keeps concerns local to the provider.


81-94: Block lookup maps cleanly to BlockInfo

Good use of MaybePendingBlockWithTxHashes and error mapping; no footguns spotted.


195-203: Chain metrics now real—nice

Fetching latest height and reusing get_block_by_height is straightforward. Returning None for base fee is sensible on Starknet.

@yjamin yjamin added this pull request to the merge queue Oct 16, 2025
Merged via the queue into main with commit e619004 Oct 16, 2025
40 checks passed
@yjamin yjamin deleted the yjamin/starknet-provider-metrics branch October 16, 2025 13:26
@github-project-automation github-project-automation Bot moved this from In Review to Done in Hyperlane Tasks Oct 16, 2025
@github-actions github-actions Bot mentioned this pull request Oct 29, 2025
This was referenced Nov 5, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Archived in project

Development

Successfully merging this pull request may close these issues.

2 participants