From ae2696bffa3cf9d7f73ca73f3d13c541a7cd9932 Mon Sep 17 00:00:00 2001 From: Macpie Date: Fri, 3 Oct 2025 15:38:36 -0700 Subject: [PATCH 01/33] Create migration test --- Cargo.lock | 1 + mobile_config/Cargo.toml | 1 + .../20251003000000_gateways_historical.sql | 24 ++++ mobile_config/src/gateway/db.rs | 25 ++-- mobile_config/src/gateway/metadata_db.rs | 2 +- .../tests/integrations/common/gateway_db.rs | 71 ++++++++++++ .../tests/integrations/common/mod.rs | 2 + .../integrations/common/partial_migrator.rs | 108 ++++++++++++++++++ .../tests/integrations/gateway_db.rs | 27 +++-- .../tests/integrations/gateway_service.rs | 96 ++++++++-------- .../tests/integrations/gateway_service_v3.rs | 34 +++--- mobile_config/tests/integrations/main.rs | 1 + .../tests/integrations/migrations.rs | 61 ++++++++++ 13 files changed, 361 insertions(+), 92 deletions(-) create mode 100644 mobile_config/migrations/20251003000000_gateways_historical.sql create mode 100644 mobile_config/tests/integrations/common/gateway_db.rs create mode 100644 mobile_config/tests/integrations/common/partial_migrator.rs create mode 100644 mobile_config/tests/integrations/migrations.rs diff --git a/Cargo.lock b/Cargo.lock index 4b7399e57..6d5de88ff 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4995,6 +4995,7 @@ dependencies = [ "strum", "strum_macros", "task-manager", + "tempfile", "thiserror 1.0.69", "tls-init", "tokio", diff --git a/mobile_config/Cargo.toml b/mobile_config/Cargo.toml index 27a6e6197..8d08d76c6 100644 --- a/mobile_config/Cargo.toml +++ b/mobile_config/Cargo.toml @@ -60,3 +60,4 @@ tls-init = { path = "../tls_init" } [dev-dependencies] rand = { workspace = true } tokio-stream = { workspace = true, features = ["net"] } +tempfile = "3" diff --git a/mobile_config/migrations/20251003000000_gateways_historical.sql b/mobile_config/migrations/20251003000000_gateways_historical.sql new file mode 100644 index 000000000..ada65eee2 --- /dev/null +++ b/mobile_config/migrations/20251003000000_gateways_historical.sql @@ -0,0 +1,24 @@ +-- 1. Drop the primary key constraint on address +ALTER TABLE + gateways DROP CONSTRAINT IF EXISTS gateways_pkey; + +-- 2. Rename column updated_at -> inserted_at +ALTER TABLE + gateways RENAME COLUMN updated_at TO inserted_at; + +-- 3. Backfill inserted_at with created_at values +UPDATE + gateways +SET + inserted_at = created_at; + +-- 4. Ensure inserted_at is NOT NULL +ALTER TABLE + gateways +ALTER COLUMN + inserted_at +SET + NOT NULL; + +-- 5. Create an index on (address, inserted_at DESC) +CREATE INDEX IF NOT EXISTS gateways_address_inserted_idx ON gateways (address, inserted_at DESC); \ No newline at end of file diff --git a/mobile_config/src/gateway/db.rs b/mobile_config/src/gateway/db.rs index c7a4c039a..d721b4e86 100644 --- a/mobile_config/src/gateway/db.rs +++ b/mobile_config/src/gateway/db.rs @@ -81,8 +81,8 @@ pub struct Gateway { pub gateway_type: GatewayType, // When the record was first created from metadata DB pub created_at: DateTime, - // When record was last updated - pub updated_at: DateTime, + // When record was inserted + pub inserted_at: DateTime, // When record was last updated from metadata DB (could be set to now if no metadata DB info) pub refreshed_at: DateTime, // When location or hash last changed, set to refreshed_at (updated via SQL query see Gateway::insert) @@ -96,6 +96,7 @@ pub struct Gateway { pub location_changed_at: Option>, pub location_asserts: Option, } + #[derive(Debug)] pub struct LocationChangedAtUpdate { pub address: PublicKeyBinary, @@ -113,7 +114,7 @@ impl Gateway { address, gateway_type, created_at, - updated_at, + inserted_at, refreshed_at, last_changed_at, hash, @@ -130,7 +131,7 @@ impl Gateway { b.push_bind(g.address.as_ref()) .push_bind(g.gateway_type) .push_bind(g.created_at) - .push_bind(g.updated_at) + .push_bind(g.inserted_at) .push_bind(g.refreshed_at) .push_bind(g.last_changed_at) .push_bind(g.hash.as_str()) @@ -146,7 +147,7 @@ impl Gateway { " ON CONFLICT (address) DO UPDATE SET gateway_type = EXCLUDED.gateway_type, created_at = EXCLUDED.created_at, - updated_at = EXCLUDED.updated_at, + inserted_at = EXCLUDED.inserted_at, refreshed_at = EXCLUDED.refreshed_at, last_changed_at = CASE WHEN gateways.location IS DISTINCT FROM EXCLUDED.location @@ -178,7 +179,7 @@ impl Gateway { address, gateway_type, created_at, - updated_at, + inserted_at, refreshed_at, last_changed_at, hash, @@ -197,7 +198,7 @@ impl Gateway { DO UPDATE SET gateway_type = EXCLUDED.gateway_type, created_at = EXCLUDED.created_at, - updated_at = EXCLUDED.updated_at, + inserted_at = EXCLUDED.inserted_at, refreshed_at = EXCLUDED.refreshed_at, last_changed_at = CASE WHEN gateways.location IS DISTINCT FROM EXCLUDED.location @@ -221,7 +222,7 @@ impl Gateway { .bind(self.address.as_ref()) .bind(self.gateway_type) .bind(self.created_at) - .bind(self.updated_at) + .bind(self.inserted_at) .bind(self.refreshed_at) .bind(self.last_changed_at) .bind(self.hash.as_str()) @@ -247,7 +248,7 @@ impl Gateway { address, gateway_type, created_at, - updated_at, + inserted_at, refreshed_at, last_changed_at, hash, @@ -281,7 +282,7 @@ impl Gateway { address, gateway_type, created_at, - updated_at, + inserted_at, refreshed_at, last_changed_at, hash, @@ -315,7 +316,7 @@ impl Gateway { address, gateway_type, created_at, - updated_at, + inserted_at, refreshed_at, last_changed_at, hash, @@ -395,7 +396,7 @@ impl FromRow<'_, PgRow> for Gateway { address: PublicKeyBinary::from(row.try_get::, _>("address")?), gateway_type: row.try_get("gateway_type")?, created_at: row.try_get("created_at")?, - updated_at: row.try_get("updated_at")?, + inserted_at: row.try_get("inserted_at")?, refreshed_at: row.try_get("refreshed_at")?, last_changed_at: row.try_get("last_changed_at")?, hash: row.try_get("hash")?, diff --git a/mobile_config/src/gateway/metadata_db.rs b/mobile_config/src/gateway/metadata_db.rs index 7987579cd..badb7fc9e 100644 --- a/mobile_config/src/gateway/metadata_db.rs +++ b/mobile_config/src/gateway/metadata_db.rs @@ -123,7 +123,7 @@ impl MobileHotspotInfo { address: self.entity_key.clone(), gateway_type: GatewayType::try_from(self.device_type.clone())?, created_at: self.created_at, - updated_at: Utc::now(), + inserted_at: Utc::now(), refreshed_at: self.refreshed_at.unwrap_or_else(Utc::now), // Updated via SQL query see Gateway::insert last_changed_at: Utc::now(), diff --git a/mobile_config/tests/integrations/common/gateway_db.rs b/mobile_config/tests/integrations/common/gateway_db.rs new file mode 100644 index 000000000..7ca9dd2d0 --- /dev/null +++ b/mobile_config/tests/integrations/common/gateway_db.rs @@ -0,0 +1,71 @@ +use chrono::{DateTime, Utc}; +use helium_crypto::PublicKeyBinary; +use mobile_config::gateway::db::GatewayType; +use sqlx::PgPool; + +#[derive(Debug, Clone)] +pub struct PreHistoricalGateway { + pub address: PublicKeyBinary, + pub gateway_type: GatewayType, + // When the record was first created from metadata DB + pub created_at: DateTime, + // When record was last updated + pub updated_at: DateTime, + // When record was last updated from metadata DB (could be set to now if no metadata DB info) + pub refreshed_at: DateTime, + // When location or hash last changed, set to refreshed_at (updated via SQL query see Gateway::insert) + pub last_changed_at: DateTime, + pub hash: String, + pub antenna: Option, + pub elevation: Option, + pub azimuth: Option, + pub location: Option, + // When location last changed, set to refreshed_at (updated via SQL query see Gateway::insert) + pub location_changed_at: Option>, + pub location_asserts: Option, +} + +impl PreHistoricalGateway { + pub async fn insert(&self, pool: &PgPool) -> anyhow::Result<()> { + sqlx::query( + r#" + INSERT INTO gateways ( + address, + gateway_type, + created_at, + updated_at, + refreshed_at, + last_changed_at, + hash, + antenna, + elevation, + azimuth, + location, + location_changed_at, + location_asserts + ) + VALUES ( + $1, $2, $3, $4, $5, $6, $7, + $8, $9, $10, $11, $12, $13 + ) + "#, + ) + .bind(self.address.as_ref()) + .bind(self.gateway_type) + .bind(self.created_at) + .bind(self.updated_at) + .bind(self.refreshed_at) + .bind(self.last_changed_at) + .bind(self.hash.as_str()) + .bind(self.antenna.map(|v| v as i64)) + .bind(self.elevation.map(|v| v as i64)) + .bind(self.azimuth.map(|v| v as i64)) + .bind(self.location.map(|v| v as i64)) + .bind(self.location_changed_at) + .bind(self.location_asserts.map(|v| v as i64)) + .execute(pool) + .await?; + + Ok(()) + } +} diff --git a/mobile_config/tests/integrations/common/mod.rs b/mobile_config/tests/integrations/common/mod.rs index 6007db573..c9813fe78 100644 --- a/mobile_config/tests/integrations/common/mod.rs +++ b/mobile_config/tests/integrations/common/mod.rs @@ -12,7 +12,9 @@ use std::sync::Arc; use tokio::net::TcpListener; use tonic::transport; +pub mod gateway_db; pub mod gateway_metadata_db; +pub mod partial_migrator; pub fn make_keypair() -> Keypair { Keypair::generate(KeyTag::default(), &mut rand::rngs::OsRng) diff --git a/mobile_config/tests/integrations/common/partial_migrator.rs b/mobile_config/tests/integrations/common/partial_migrator.rs new file mode 100644 index 000000000..3d9c38a8a --- /dev/null +++ b/mobile_config/tests/integrations/common/partial_migrator.rs @@ -0,0 +1,108 @@ +use chrono::Utc; +use sqlx::{ + migrate::{Migration, Migrator}, + PgPool, +}; +use std::path::Path; + +pub struct PartialMigrator { + pool: PgPool, + versions: Vec, + path: String, +} + +impl PartialMigrator { + pub async fn new( + pool: PgPool, + versions: Vec, + path: Option, + ) -> anyhow::Result { + let count: (i64,) = sqlx::query_as("SELECT COUNT(*) FROM _sqlx_migrations") + .fetch_one(&pool) + .await + .unwrap_or((0,)); + + if count.0 > 0 { + anyhow::bail!("PartialMigrator: database already has applied migrations. Did you forget `migrations = false`?"); + } + + Ok(Self { + pool, + versions, + path: path.unwrap_or_else(|| "./migrations".to_string()), + }) + } + + pub async fn run_partial(&self) -> anyhow::Result<()> { + { + // Run tmp_migrator to create _sqlx_migrations table + let tmp_dir = tempfile::tempdir()?; + let tmp_migrator = Migrator::new(tmp_dir.path()).await?; + tmp_migrator.run(&self.pool).await?; + } + + let migrator = Migrator::new(Path::new(&self.path)).await?; + + // Mark skipped migrations as applied first + for m in migrator.iter() { + if self.versions.contains(&m.version) { + println!("⏭️ Skipping migration {} {}", m.version, m.description); + self.skip_migration(m).await?; + } + } + + // Now run the migrator normally + migrator.run(&self.pool).await?; + + Ok(()) + } + + pub async fn run_skipped(&self) -> anyhow::Result<()> { + let migrator = Migrator::new(Path::new(&self.path)).await?; + + println!("Re applaying skipped migrations... {:?}", self.versions); + + // Delete skipped migrations first + self.delete_skipped().await?; + + // Now run the migrator normally + migrator.run(&self.pool).await?; + + Ok(()) + } + + async fn skip_migration(&self, migration: &Migration) -> anyhow::Result<()> { + sqlx::query( + r#" + INSERT INTO _sqlx_migrations + (version, description, installed_on, success, checksum, execution_time) + VALUES ($1, $2, $3, TRUE, $4, 0) + ON CONFLICT (version) DO NOTHING + "#, + ) + .bind(migration.version) + .bind(format!("SKIPPED - {}", migration.description.clone())) + .bind(Utc::now()) + .bind(migration.checksum.as_ref()) + .execute(&self.pool) + .await?; + + Ok(()) + } + + async fn delete_skipped(&self) -> anyhow::Result<()> { + for version in &self.versions { + sqlx::query( + r#" + DELETE FROM _sqlx_migrations + WHERE version = $1 + "#, + ) + .bind(version) + .execute(&self.pool) + .await?; + } + + Ok(()) + } +} diff --git a/mobile_config/tests/integrations/gateway_db.rs b/mobile_config/tests/integrations/gateway_db.rs index de7f8cb43..3ba000d78 100644 --- a/mobile_config/tests/integrations/gateway_db.rs +++ b/mobile_config/tests/integrations/gateway_db.rs @@ -1,11 +1,10 @@ +use crate::common; use chrono::{TimeZone, Utc}; use futures::{pin_mut, StreamExt}; use helium_crypto::PublicKeyBinary; use mobile_config::gateway::db::{Gateway, GatewayType}; use sqlx::PgPool; -use crate::common; - #[sqlx::test] async fn gateway_insert_and_get_by_address(pool: PgPool) -> anyhow::Result<()> { let addr = pk_binary(); @@ -20,7 +19,7 @@ async fn gateway_insert_and_get_by_address(pool: PgPool) -> anyhow::Result<()> { assert_eq!(gateway.gateway_type, GatewayType::WifiIndoor); assert_eq!(gateway.created_at, common::nanos_trunc(now)); - assert_eq!(gateway.updated_at, common::nanos_trunc(now)); + assert_eq!(gateway.inserted_at, common::nanos_trunc(now)); assert_eq!(gateway.refreshed_at, common::nanos_trunc(now)); assert_eq!(gateway.last_changed_at, common::nanos_trunc(now)); // first insert: equals refreshed_at assert_eq!(gateway.location, Some(123)); @@ -45,7 +44,7 @@ async fn gateway_upsert_last_changed_at_on_location_or_hash_change( // upsert with no change (only timestamps move) let mut same = gw(addr.clone(), GatewayType::WifiOutdoor, t0); - same.updated_at = t1; + same.inserted_at = t1; same.refreshed_at = t1; same.last_changed_at = t1; // should be ignored by SQL if no change same.insert(&pool).await?; @@ -56,7 +55,7 @@ async fn gateway_upsert_last_changed_at_on_location_or_hash_change( // upsert with location change -> last_changed_at bumps to refreshed_at (t2) let mut loc = after_same.clone(); - loc.updated_at = t2; + loc.inserted_at = t2; loc.refreshed_at = t2; loc.location = Some(456); loc.insert(&pool).await?; @@ -67,7 +66,7 @@ async fn gateway_upsert_last_changed_at_on_location_or_hash_change( // upsert with hash change (location same) -> last_changed_at bumps again let mut h = after_loc.clone(); - h.updated_at = t3; + h.inserted_at = t3; h.refreshed_at = t3; h.hash = "h1".into(); h.insert(&pool).await?; @@ -99,7 +98,7 @@ async fn gateway_bulk_insert_and_get(pool: PgPool) -> anyhow::Result<()> { .await? .expect("row should exist"); assert_eq!(got.created_at, common::nanos_trunc(now)); - assert_eq!(got.updated_at, common::nanos_trunc(now)); + assert_eq!(got.inserted_at, common::nanos_trunc(now)); assert_eq!(got.refreshed_at, common::nanos_trunc(now)); assert_eq!(got.last_changed_at, common::nanos_trunc(now)); assert_eq!(got.location, Some(123)); @@ -124,11 +123,11 @@ async fn gateway_bulk_upsert_updates_and_change(pool: PgPool) -> anyhow::Result< // and change location for g2 (should bump last_changed_at) let t1 = Utc::now(); - g1.updated_at = t1; + g1.inserted_at = t1; g1.refreshed_at = t1; // leave g1.location / g1.hash the same - g2.updated_at = t1; + g2.inserted_at = t1; g2.refreshed_at = t1; g2.location = Some(456); // change => last_changed_at should bump to t1 // g2.hash unchanged @@ -141,7 +140,7 @@ async fn gateway_bulk_upsert_updates_and_change(pool: PgPool) -> anyhow::Result< let got1 = Gateway::get_by_address(&pool, &a1) .await? .expect("row should exist"); - assert_eq!(got1.updated_at, common::nanos_trunc(t1)); + assert_eq!(got1.inserted_at, common::nanos_trunc(t1)); assert_eq!(got1.refreshed_at, common::nanos_trunc(t1)); assert_eq!( got1.last_changed_at, @@ -155,7 +154,7 @@ async fn gateway_bulk_upsert_updates_and_change(pool: PgPool) -> anyhow::Result< let got2 = Gateway::get_by_address(&pool, &a2) .await? .expect("row should exist"); - assert_eq!(got2.updated_at, common::nanos_trunc(t1)); + assert_eq!(got2.inserted_at, common::nanos_trunc(t1)); assert_eq!(got2.refreshed_at, common::nanos_trunc(t1)); assert_eq!( got2.last_changed_at, @@ -168,7 +167,7 @@ async fn gateway_bulk_upsert_updates_and_change(pool: PgPool) -> anyhow::Result< // second upsert at t2: change hash only for g1, ensure bump let t2 = Utc::now(); - g1.updated_at = t2; + g1.inserted_at = t2; g1.refreshed_at = t2; g1.hash = "h1".into(); // change ⇒ bump last_changed_at @@ -178,7 +177,7 @@ async fn gateway_bulk_upsert_updates_and_change(pool: PgPool) -> anyhow::Result< let got1b = Gateway::get_by_address(&pool, &a1) .await? .expect("row should exist"); - assert_eq!(got1b.updated_at, common::nanos_trunc(t2)); + assert_eq!(got1b.inserted_at, common::nanos_trunc(t2)); assert_eq!(got1b.refreshed_at, common::nanos_trunc(t2)); assert_eq!( got1b.last_changed_at, @@ -292,7 +291,7 @@ fn gw(address: PublicKeyBinary, gateway_type: GatewayType, t: chrono::DateTime anyhow::Result<()> { address: address1.clone().into(), gateway_type: GatewayType::WifiIndoor, created_at: now, - updated_at: now, + inserted_at: now, refreshed_at: now, last_changed_at: now, hash: "".to_string(), @@ -134,7 +134,7 @@ async fn gateway_stream_info_v1(pool: PgPool) -> anyhow::Result<()> { address: address2.clone().into(), gateway_type: GatewayType::WifiDataOnly, created_at: now_plus_10, - updated_at: now_plus_10, + inserted_at: now_plus_10, refreshed_at: now_plus_10, last_changed_at: now_plus_10, hash: "".to_string(), @@ -182,7 +182,7 @@ async fn gateway_stream_info_v2_by_type(pool: PgPool) -> anyhow::Result<()> { address: address1.clone().into(), gateway_type: GatewayType::WifiIndoor, created_at: now, - updated_at: now, + inserted_at: now, refreshed_at: now, last_changed_at: now, hash: "".to_string(), @@ -199,7 +199,7 @@ async fn gateway_stream_info_v2_by_type(pool: PgPool) -> anyhow::Result<()> { address: address2.clone().into(), gateway_type: GatewayType::WifiDataOnly, created_at: now_plus_10, - updated_at: now_plus_10, + inserted_at: now_plus_10, refreshed_at: now_plus_10, last_changed_at: now_plus_10, hash: "".to_string(), @@ -247,21 +247,21 @@ async fn gateway_stream_info_v2(pool: PgPool) -> anyhow::Result<()> { let loc4 = 0x8c44a82aed527ff_u64; let created_at = Utc::now() - Duration::hours(5); - let updated_at = Utc::now() - Duration::hours(3); + let inserted_at = Utc::now() - Duration::hours(3); let gateway1 = Gateway { address: address1.clone().into(), gateway_type: GatewayType::WifiIndoor, created_at, - updated_at, - refreshed_at: updated_at, - last_changed_at: updated_at, + inserted_at, + refreshed_at: inserted_at, + last_changed_at: inserted_at, hash: "".to_string(), antenna: None, elevation: None, azimuth: None, location: Some(loc1), - location_changed_at: Some(updated_at), + location_changed_at: Some(inserted_at), location_asserts: Some(1), }; gateway1.insert(&pool).await?; @@ -270,15 +270,15 @@ async fn gateway_stream_info_v2(pool: PgPool) -> anyhow::Result<()> { address: address2.clone().into(), gateway_type: GatewayType::WifiIndoor, created_at, - updated_at, - refreshed_at: updated_at, - last_changed_at: updated_at, + inserted_at, + refreshed_at: inserted_at, + last_changed_at: inserted_at, hash: "".to_string(), antenna: Some(1), elevation: None, azimuth: None, location: Some(loc2), - location_changed_at: Some(updated_at), + location_changed_at: Some(inserted_at), location_asserts: Some(1), }; gateway2.insert(&pool).await?; @@ -287,15 +287,15 @@ async fn gateway_stream_info_v2(pool: PgPool) -> anyhow::Result<()> { address: address3.clone().into(), gateway_type: GatewayType::WifiDataOnly, created_at, - updated_at, - refreshed_at: updated_at, - last_changed_at: updated_at, + inserted_at, + refreshed_at: inserted_at, + last_changed_at: inserted_at, hash: "".to_string(), antenna: Some(1), elevation: Some(2), azimuth: Some(3), location: Some(loc3), - location_changed_at: Some(updated_at), + location_changed_at: Some(inserted_at), location_asserts: Some(1), }; gateway3.insert(&pool).await?; @@ -304,7 +304,7 @@ async fn gateway_stream_info_v2(pool: PgPool) -> anyhow::Result<()> { address: address4.clone().into(), gateway_type: GatewayType::WifiDataOnly, created_at, - updated_at: created_at, + inserted_at: created_at, refreshed_at: created_at, last_changed_at: created_at, hash: "".to_string(), @@ -320,8 +320,8 @@ async fn gateway_stream_info_v2(pool: PgPool) -> anyhow::Result<()> { let (addr, _handle) = spawn_gateway_service(pool.clone(), admin_key.public_key().clone()).await; let mut client = GatewayClient::connect(addr).await?; - let res = - gateway_info_stream_v2(&mut client, &admin_key, &[], updated_at.timestamp() as u64).await?; + let res = gateway_info_stream_v2(&mut client, &admin_key, &[], inserted_at.timestamp() as u64) + .await?; assert_eq!(res.gateways.len(), 3); let gateways = res.gateways; @@ -335,7 +335,7 @@ async fn gateway_stream_info_v2(pool: PgPool) -> anyhow::Result<()> { u64::from_str_radix(&gw1.metadata.clone().unwrap().location, 16).unwrap(), loc1 ); - assert_eq!(gw1.updated_at, updated_at.timestamp() as u64); + assert_eq!(gw1.updated_at, inserted_at.timestamp() as u64); assert_eq!(gw1.metadata.clone().unwrap().deployment_info, None); let gw2 = gateways @@ -347,7 +347,7 @@ async fn gateway_stream_info_v2(pool: PgPool) -> anyhow::Result<()> { u64::from_str_radix(&gw2.metadata.clone().unwrap().location, 16).unwrap(), loc2 ); - assert_eq!(gw2.updated_at, updated_at.timestamp() as u64); + assert_eq!(gw2.updated_at, inserted_at.timestamp() as u64); let deployment_info = gw2.metadata.clone().unwrap().deployment_info.unwrap(); match deployment_info { DeploymentInfo::WifiDeploymentInfo(v) => { @@ -369,7 +369,7 @@ async fn gateway_stream_info_v2(pool: PgPool) -> anyhow::Result<()> { u64::from_str_radix(&gw3.metadata.clone().unwrap().location, 16).unwrap(), loc3 ); - assert_eq!(gw3.updated_at, updated_at.timestamp() as u64); + assert_eq!(gw3.updated_at, inserted_at.timestamp() as u64); let deployment_info = gw3.metadata.clone().unwrap().deployment_info.unwrap(); match deployment_info { DeploymentInfo::WifiDeploymentInfo(v) => { @@ -399,21 +399,21 @@ async fn gateway_info_batch_v1(pool: PgPool) -> anyhow::Result<()> { let loc2 = 631711286145955327_u64; let created_at = Utc::now() - Duration::hours(5); - let updated_at = Utc::now() - Duration::hours(3); + let inserted_at = Utc::now() - Duration::hours(3); let gateway1 = Gateway { address: address1.clone().into(), gateway_type: GatewayType::WifiIndoor, created_at, - updated_at, - refreshed_at: updated_at, - last_changed_at: updated_at, + inserted_at, + refreshed_at: inserted_at, + last_changed_at: inserted_at, hash: "".to_string(), antenna: Some(18), elevation: Some(2), azimuth: Some(161), location: Some(loc1), - location_changed_at: Some(updated_at), + location_changed_at: Some(inserted_at), location_asserts: Some(1), }; gateway1.insert(&pool).await?; @@ -422,7 +422,7 @@ async fn gateway_info_batch_v1(pool: PgPool) -> anyhow::Result<()> { address: address2.clone().into(), gateway_type: GatewayType::WifiDataOnly, created_at, - updated_at: created_at, + inserted_at: created_at, refreshed_at: created_at, last_changed_at: created_at, hash: "".to_string(), @@ -485,21 +485,21 @@ async fn gateway_info_batch_v2(pool: PgPool) -> anyhow::Result<()> { let loc2 = 631711286145955327_u64; let created_at = Utc::now() - Duration::hours(5); - let updated_at = Utc::now() - Duration::hours(3); + let inserted_at = Utc::now() - Duration::hours(3); let gateway1 = Gateway { address: address1.clone().into(), gateway_type: GatewayType::WifiIndoor, created_at, - updated_at, - refreshed_at: updated_at, - last_changed_at: updated_at, + inserted_at, + refreshed_at: inserted_at, + last_changed_at: inserted_at, hash: "".to_string(), antenna: Some(18), elevation: Some(2), azimuth: Some(161), location: Some(loc1), - location_changed_at: Some(updated_at), + location_changed_at: Some(inserted_at), location_asserts: Some(1), }; gateway1.insert(&pool).await?; @@ -508,7 +508,7 @@ async fn gateway_info_batch_v2(pool: PgPool) -> anyhow::Result<()> { address: address2.clone().into(), gateway_type: GatewayType::WifiDataOnly, created_at, - updated_at: created_at, + inserted_at: created_at, refreshed_at: created_at, last_changed_at: created_at, hash: "".to_string(), @@ -594,13 +594,13 @@ async fn gateway_info_batch_v2_updated_at_check(pool: PgPool) -> anyhow::Result< let created_at = Utc::now() - Duration::hours(5); let refreshed_at = Utc::now() - Duration::hours(3); - let updated_at = Utc::now() - Duration::hours(4); + let inserted_at = Utc::now() - Duration::hours(4); let gateway1 = Gateway { address: address1.clone().into(), gateway_type: GatewayType::WifiIndoor, created_at, - updated_at: refreshed_at, + inserted_at: refreshed_at, refreshed_at, last_changed_at: refreshed_at, hash: "".to_string(), @@ -617,7 +617,7 @@ async fn gateway_info_batch_v2_updated_at_check(pool: PgPool) -> anyhow::Result< address: address2.clone().into(), gateway_type: GatewayType::WifiIndoor, created_at, - updated_at: created_at, + inserted_at: created_at, refreshed_at: created_at, last_changed_at: created_at, hash: "".to_string(), @@ -634,15 +634,15 @@ async fn gateway_info_batch_v2_updated_at_check(pool: PgPool) -> anyhow::Result< address: address3.clone().into(), gateway_type: GatewayType::WifiDataOnly, created_at, - updated_at, + inserted_at, refreshed_at, - last_changed_at: updated_at, + last_changed_at: inserted_at, hash: "".to_string(), antenna: Some(18), elevation: Some(2), azimuth: Some(161), location: Some(loc3), - location_changed_at: Some(updated_at), + location_changed_at: Some(inserted_at), location_asserts: Some(1), }; gateway3.insert(&pool).await?; @@ -651,9 +651,9 @@ async fn gateway_info_batch_v2_updated_at_check(pool: PgPool) -> anyhow::Result< address: address4.clone().into(), gateway_type: GatewayType::WifiIndoor, created_at, - updated_at, + inserted_at, refreshed_at: created_at, - last_changed_at: updated_at, + last_changed_at: inserted_at, hash: "".to_string(), antenna: Some(18), elevation: Some(2), @@ -707,7 +707,7 @@ async fn gateway_info_batch_v2_updated_at_check(pool: PgPool) -> anyhow::Result< .find(|v| v.address == address3.to_vec()) .unwrap() .updated_at, - updated_at.timestamp() as u64 + inserted_at.timestamp() as u64 ); Ok(()) @@ -730,7 +730,7 @@ async fn gateway_info_v2(pool: PgPool) -> anyhow::Result<()> { address: address1.clone().into(), gateway_type: GatewayType::WifiIndoor, created_at, - updated_at: refreshed_at, + inserted_at: refreshed_at, refreshed_at, last_changed_at: refreshed_at, hash: "".to_string(), @@ -747,7 +747,7 @@ async fn gateway_info_v2(pool: PgPool) -> anyhow::Result<()> { address: address2.clone().into(), gateway_type: GatewayType::WifiIndoor, created_at, - updated_at: created_at, + inserted_at: created_at, refreshed_at: created_at, last_changed_at: created_at, hash: "".to_string(), @@ -866,14 +866,14 @@ async fn gateway_info_stream_v2( client: &mut GatewayClient, signer: &Keypair, device_types: &[DeviceType], - min_updated_at: u64, + min_inserted_at: u64, ) -> anyhow::Result { let mut req = GatewayInfoStreamReqV2 { batch_size: 10000, signer: signer.public_key().to_vec(), signature: vec![], device_types: device_types.iter().map(|v| DeviceType::into(*v)).collect(), - min_updated_at, + min_updated_at: min_inserted_at, }; req.signature = signer.sign(&req.encode_to_vec()).unwrap(); diff --git a/mobile_config/tests/integrations/gateway_service_v3.rs b/mobile_config/tests/integrations/gateway_service_v3.rs index c0457ec90..1ee5b311e 100644 --- a/mobile_config/tests/integrations/gateway_service_v3.rs +++ b/mobile_config/tests/integrations/gateway_service_v3.rs @@ -29,7 +29,7 @@ async fn gateway_stream_info_v3_basic(pool: PgPool) -> anyhow::Result<()> { address: address1.clone().into(), gateway_type: GatewayType::WifiIndoor, created_at: now, - updated_at: now, + inserted_at: now, refreshed_at: now, last_changed_at: now_plus_10, hash: "".to_string(), @@ -46,7 +46,7 @@ async fn gateway_stream_info_v3_basic(pool: PgPool) -> anyhow::Result<()> { address: address2.clone().into(), gateway_type: GatewayType::WifiOutdoor, created_at: now_plus_10, - updated_at: now_plus_10, + inserted_at: now_plus_10, refreshed_at: now_plus_10, last_changed_at: now_plus_10, hash: "".to_string(), @@ -107,7 +107,7 @@ async fn gateway_stream_info_v3_no_metadata(pool: PgPool) -> anyhow::Result<()> address: address1.clone().into(), gateway_type: GatewayType::WifiIndoor, created_at: now, - updated_at: now, + inserted_at: now, refreshed_at: now, last_changed_at: now_plus_10, hash: "".to_string(), @@ -153,7 +153,7 @@ async fn gateway_stream_info_v3_no_deployment_info(pool: PgPool) -> anyhow::Resu address: address1.clone().into(), gateway_type: GatewayType::WifiIndoor, created_at: now, - updated_at: now, + inserted_at: now, refreshed_at: now, last_changed_at: now_plus_10, hash: "".to_string(), @@ -205,21 +205,21 @@ async fn gateway_stream_info_v3_updated_at(pool: PgPool) -> anyhow::Result<()> { let loc2 = 631711286145955327_u64; let created_at = Utc::now() - Duration::hours(5); - let updated_at = Utc::now() - Duration::hours(3); + let inserted_at = Utc::now() - Duration::hours(3); let gateway1 = Gateway { address: address1.clone().into(), gateway_type: GatewayType::WifiIndoor, created_at, - updated_at, - refreshed_at: updated_at, - last_changed_at: updated_at, + inserted_at, + refreshed_at: inserted_at, + last_changed_at: inserted_at, hash: "".to_string(), antenna: Some(18), elevation: Some(2), azimuth: Some(161), location: Some(loc1), - location_changed_at: Some(updated_at), + location_changed_at: Some(inserted_at), location_asserts: Some(1), }; gateway1.insert(&pool).await?; @@ -228,7 +228,7 @@ async fn gateway_stream_info_v3_updated_at(pool: PgPool) -> anyhow::Result<()> { address: address2.clone().into(), gateway_type: GatewayType::WifiDataOnly, created_at, - updated_at: created_at, + inserted_at: created_at, refreshed_at: created_at, last_changed_at: created_at, hash: "".to_string(), @@ -248,7 +248,7 @@ async fn gateway_stream_info_v3_updated_at(pool: PgPool) -> anyhow::Result<()> { &mut client, &admin_key, &[], - updated_at.timestamp() as u64, + inserted_at.timestamp() as u64, 0, ) .await?; @@ -299,7 +299,7 @@ async fn gateway_stream_info_v3_min_location_changed_at_zero(pool: PgPool) -> an address: address1.clone().into(), gateway_type: GatewayType::WifiIndoor, created_at: now_minus_six, - updated_at: now_minus_six, + inserted_at: now_minus_six, refreshed_at: now_minus_six, last_changed_at: now_minus_three, hash: "".to_string(), @@ -316,7 +316,7 @@ async fn gateway_stream_info_v3_min_location_changed_at_zero(pool: PgPool) -> an address: address2.clone().into(), gateway_type: GatewayType::WifiDataOnly, created_at: now_minus_six, - updated_at: now_minus_six, + inserted_at: now_minus_six, refreshed_at: now_minus_six, last_changed_at: now_minus_three, hash: "".to_string(), @@ -370,7 +370,7 @@ async fn gateway_stream_info_v3_location_changed_at(pool: PgPool) -> anyhow::Res address: address1.clone().into(), gateway_type: GatewayType::WifiIndoor, created_at: now_minus_six, - updated_at: now_minus_six, + inserted_at: now_minus_six, refreshed_at: now, last_changed_at: now_minus_three, hash: "".to_string(), @@ -387,7 +387,7 @@ async fn gateway_stream_info_v3_location_changed_at(pool: PgPool) -> anyhow::Res address: address2.clone().into(), gateway_type: GatewayType::WifiDataOnly, created_at: now_minus_six, - updated_at: now_minus_six, + inserted_at: now_minus_six, refreshed_at: now, last_changed_at: now_minus_three, hash: "".to_string(), @@ -449,7 +449,7 @@ async fn gateway_info_stream_v3( client: &mut GatewayClient, signer: &Keypair, device_types: &[DeviceTypeV2], - min_updated_at: u64, + min_inserted_at: u64, min_location_changed_at: u64, ) -> anyhow::Result { let mut req = GatewayInfoStreamReqV3 { @@ -460,7 +460,7 @@ async fn gateway_info_stream_v3( .iter() .map(|v| DeviceTypeV2::into(*v)) .collect(), - min_updated_at, + min_updated_at: min_inserted_at, min_location_changed_at, }; req.signature = signer.sign(&req.encode_to_vec())?; diff --git a/mobile_config/tests/integrations/main.rs b/mobile_config/tests/integrations/main.rs index 358b16a15..318f93eb7 100644 --- a/mobile_config/tests/integrations/main.rs +++ b/mobile_config/tests/integrations/main.rs @@ -5,3 +5,4 @@ mod gateway_db; mod gateway_service; mod gateway_service_v3; mod gateway_tracker; +mod migrations; diff --git a/mobile_config/tests/integrations/migrations.rs b/mobile_config/tests/integrations/migrations.rs new file mode 100644 index 000000000..12d0adbb6 --- /dev/null +++ b/mobile_config/tests/integrations/migrations.rs @@ -0,0 +1,61 @@ +use crate::common::{self, gateway_db::PreHistoricalGateway, partial_migrator::PartialMigrator}; +use chrono::{Duration, Utc}; +use helium_crypto::PublicKeyBinary; +use mobile_config::gateway::db::{Gateway, GatewayType}; +use sqlx::PgPool; + +#[sqlx::test(migrations = false)] +async fn gateways_historical(pool: PgPool) -> anyhow::Result<()> { + let partial_migrator = PartialMigrator::new(pool.clone(), vec![20251003000000], None).await?; + + partial_migrator.run_partial().await?; + + let address = pk_binary(); + let now = Utc::now(); + let one_min_ago = now - Duration::minutes(1); + + let pre_gw = PreHistoricalGateway { + address: address.clone(), + gateway_type: GatewayType::WifiIndoor, + created_at: one_min_ago, + updated_at: now, + refreshed_at: now, + last_changed_at: now, + hash: "h0".to_string(), + antenna: Some(1), + elevation: Some(2), + azimuth: Some(3), + location: Some(123), + location_changed_at: Some(now), + location_asserts: Some(1), + }; + + pre_gw.insert(&pool).await?; + + partial_migrator.run_skipped().await?; + + let gw = Gateway::get_by_address(&pool, &address) + .await? + .expect("should find gateway"); + + assert!(pre_gw.address == gw.address); + assert!(pre_gw.gateway_type == gw.gateway_type); + assert!(pre_gw.created_at == gw.created_at); + // The real change is updated_at renamed to inserted_at AND inserted_at = created_at; + assert!(pre_gw.created_at == gw.inserted_at); + assert!(pre_gw.refreshed_at == gw.refreshed_at); + assert!(pre_gw.last_changed_at == gw.last_changed_at); + assert!(pre_gw.hash == gw.hash); + assert!(pre_gw.antenna == gw.antenna); + assert!(pre_gw.elevation == gw.elevation); + assert!(pre_gw.azimuth == gw.azimuth); + assert!(pre_gw.location == gw.location); + assert!(pre_gw.location_changed_at == gw.location_changed_at); + assert!(pre_gw.location_asserts == gw.location_asserts); + + Ok(()) +} + +fn pk_binary() -> PublicKeyBinary { + common::make_keypair().public_key().clone().into() +} From 98f8b4f200e7e1679c7ec86d4bf61980c4a7008e Mon Sep 17 00:00:00 2001 From: Macpie Date: Mon, 6 Oct 2025 13:55:39 -0700 Subject: [PATCH 02/33] Update tracker --- mobile_config/src/gateway/db.rs | 84 +++++----- mobile_config/src/gateway/metadata_db.rs | 11 +- mobile_config/src/gateway/tracker.rs | 58 ++++++- .../common/gateway_metadata_db.rs | 152 +++++++++++------- .../tests/integrations/gateway_db.rs | 51 ------ .../tests/integrations/gateway_tracker.rs | 134 +++++++++++---- 6 files changed, 294 insertions(+), 196 deletions(-) diff --git a/mobile_config/src/gateway/db.rs b/mobile_config/src/gateway/db.rs index d721b4e86..6f21ffe0a 100644 --- a/mobile_config/src/gateway/db.rs +++ b/mobile_config/src/gateway/db.rs @@ -143,31 +143,6 @@ impl Gateway { .push_bind(g.location_asserts.map(|v| v as i64)); }); - qb.push( - " ON CONFLICT (address) DO UPDATE SET - gateway_type = EXCLUDED.gateway_type, - created_at = EXCLUDED.created_at, - inserted_at = EXCLUDED.inserted_at, - refreshed_at = EXCLUDED.refreshed_at, - last_changed_at = CASE - WHEN gateways.location IS DISTINCT FROM EXCLUDED.location - OR gateways.hash IS DISTINCT FROM EXCLUDED.hash - THEN EXCLUDED.refreshed_at - ELSE gateways.last_changed_at - END, - hash = EXCLUDED.hash, - antenna = EXCLUDED.antenna, - elevation = EXCLUDED.elevation, - azimuth = EXCLUDED.azimuth, - location = EXCLUDED.location, - location_changed_at = CASE - WHEN gateways.location IS DISTINCT FROM EXCLUDED.location - THEN EXCLUDED.refreshed_at - ELSE gateways.location_changed_at - END, - location_asserts = EXCLUDED.location_asserts", - ); - let res = qb.build().execute(pool).await?; Ok(res.rows_affected()) } @@ -194,29 +169,6 @@ impl Gateway { $1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13 ) - ON CONFLICT (address) - DO UPDATE SET - gateway_type = EXCLUDED.gateway_type, - created_at = EXCLUDED.created_at, - inserted_at = EXCLUDED.inserted_at, - refreshed_at = EXCLUDED.refreshed_at, - last_changed_at = CASE - WHEN gateways.location IS DISTINCT FROM EXCLUDED.location - OR gateways.hash IS DISTINCT FROM EXCLUDED.hash - THEN EXCLUDED.refreshed_at - ELSE gateways.last_changed_at - END, - hash = EXCLUDED.hash, - antenna = EXCLUDED.antenna, - elevation = EXCLUDED.elevation, - azimuth = EXCLUDED.azimuth, - location = EXCLUDED.location, - location_changed_at = CASE - WHEN gateways.location IS DISTINCT FROM EXCLUDED.location - THEN EXCLUDED.refreshed_at - ELSE gateways.location_changed_at - END, - location_asserts = EXCLUDED.location_asserts "#, ) .bind(self.address.as_ref()) @@ -260,6 +212,8 @@ impl Gateway { location_asserts FROM gateways WHERE address = $1 + ORDER BY inserted_at DESC + LIMIT 1 "#, ) .bind(address.as_ref()) @@ -269,6 +223,40 @@ impl Gateway { Ok(gateway) } + pub async fn get_by_addresses<'a>( + db: impl PgExecutor<'a>, + addresses: Vec, + ) -> anyhow::Result> { + let addr_array: Vec> = addresses.iter().map(|a| a.as_ref().to_vec()).collect(); + + let rows = sqlx::query_as::<_, Self>( + r#" + SELECT DISTINCT ON (address) + address, + gateway_type, + created_at, + inserted_at, + refreshed_at, + last_changed_at, + hash, + antenna, + elevation, + azimuth, + location, + location_changed_at, + location_asserts + FROM gateways + WHERE address = ANY($1) + ORDER BY address, inserted_at DESC + "#, + ) + .bind(addr_array) + .fetch_all(db) + .await?; + + Ok(rows) + } + pub fn stream_by_addresses<'a>( db: impl PgExecutor<'a> + 'a, addresses: Vec, diff --git a/mobile_config/src/gateway/metadata_db.rs b/mobile_config/src/gateway/metadata_db.rs index badb7fc9e..983382532 100644 --- a/mobile_config/src/gateway/metadata_db.rs +++ b/mobile_config/src/gateway/metadata_db.rs @@ -119,14 +119,15 @@ impl MobileHotspotInfo { None => (None, None, None), }; + let refreshed_at = self.refreshed_at.unwrap_or_else(Utc::now); + Ok(Some(Gateway { address: self.entity_key.clone(), gateway_type: GatewayType::try_from(self.device_type.clone())?, created_at: self.created_at, inserted_at: Utc::now(), - refreshed_at: self.refreshed_at.unwrap_or_else(Utc::now), - // Updated via SQL query see Gateway::insert - last_changed_at: Utc::now(), + refreshed_at, + last_changed_at: refreshed_at, hash: self.compute_hash(), antenna, elevation, @@ -134,7 +135,7 @@ impl MobileHotspotInfo { location, // Set to refreshed_at when hotspot has a location, None otherwise location_changed_at: if location.is_some() { - Some(self.refreshed_at.unwrap_or_else(Utc::now)) + Some(refreshed_at) } else { None }, @@ -164,7 +165,7 @@ impl sqlx::FromRow<'_, sqlx::postgres::PgRow> for MobileHotspotInfo { ) .map_err(|err| sqlx::Error::Decode(Box::new(err)))?, refreshed_at: row.get::>, &str>("refreshed_at"), - created_at: row.get::, &str>("refreshed_at"), + created_at: row.get::, &str>("created_at"), location: row.get::, &str>("location"), is_full_hotspot: row.get::, &str>("is_full_hotspot"), num_location_asserts: row.get::, &str>("num_location_asserts"), diff --git a/mobile_config/src/gateway/tracker.rs b/mobile_config/src/gateway/tracker.rs index 88503dbb5..579f4d660 100644 --- a/mobile_config/src/gateway/tracker.rs +++ b/mobile_config/src/gateway/tracker.rs @@ -2,7 +2,10 @@ use crate::gateway::{db::Gateway, metadata_db::MobileHotspotInfo}; use futures::{stream::TryChunksError, TryFutureExt}; use futures_util::TryStreamExt; use sqlx::{Pool, Postgres}; -use std::time::{Duration, Instant}; +use std::{ + collections::HashMap, + time::{Duration, Instant}, +}; use task_manager::ManagedTask; const EXECUTE_DURATION_METRIC: &str = @@ -67,11 +70,60 @@ pub async fn execute(pool: &Pool, metadata: &Pool) -> anyhow let total: u64 = MobileHotspotInfo::stream(metadata) .map_err(anyhow::Error::from) - .try_filter_map(|mhi| async move { mhi.to_gateway() }) + .try_filter_map(|mhi| async move { + match mhi.to_gateway() { + Ok(Some(gw)) => Ok(Some(gw)), + Ok(None) => Ok(None), + Err(e) => { + tracing::error!(?e, "error converting gateway"); + Err(e) + } + } + }) .try_chunks(BATCH_SIZE) .map_err(|TryChunksError(_gateways, err)| err) .try_fold(0, |total, batch| async move { - let affected = Gateway::insert_bulk(pool, &batch).await?; + let addresses: Vec<_> = batch.iter().map(|gw| gw.address.clone()).collect(); + let existing_gateways = Gateway::get_by_addresses(pool, addresses).await?; + let mut existing_map = existing_gateways + .into_iter() + .map(|gw| (gw.address.clone(), gw)) + .collect::>(); + + let mut to_insert = Vec::with_capacity(batch.len()); + + for mut gw in batch { + match existing_map.remove(&gw.address) { + None => { + // New gateway + to_insert.push(gw); + } + Some(last_gw) => { + // FYI hash includes location + let loc_changed = gw.location != last_gw.location; + let hash_changed = gw.hash != last_gw.hash; + + gw.last_changed_at = if hash_changed { + gw.refreshed_at + } else { + last_gw.last_changed_at + }; + + gw.location_changed_at = if loc_changed { + Some(gw.refreshed_at) + } else { + last_gw.location_changed_at + }; + + // We only add record if something changed + if hash_changed { + to_insert.push(gw); + } + } + } + } + + let affected = Gateway::insert_bulk(pool, &to_insert).await?; Ok(total + affected) }) .await?; diff --git a/mobile_config/tests/integrations/common/gateway_metadata_db.rs b/mobile_config/tests/integrations/common/gateway_metadata_db.rs index e92d4259a..fc1fe9564 100644 --- a/mobile_config/tests/integrations/common/gateway_metadata_db.rs +++ b/mobile_config/tests/integrations/common/gateway_metadata_db.rs @@ -1,76 +1,114 @@ use bs58; use chrono::{DateTime, Utc}; +use futures::{stream, StreamExt, TryStreamExt}; use helium_crypto::PublicKeyBinary; -use sqlx::PgPool; +use sqlx::{PgPool, Postgres, QueryBuilder}; -#[allow(clippy::too_many_arguments)] -pub async fn insert_gateway( +pub struct GatewayInsert { + pub asset: String, + pub location: Option, + pub device_type: String, + pub key: PublicKeyBinary, + pub created_at: DateTime, + pub refreshed_at: Option>, + pub deployment_info: Option, +} + +pub async fn insert_gateway_bulk( pool: &PgPool, - asset: &str, - location: Option, - device_type: &str, - key: PublicKeyBinary, - created_at: DateTime, - refreshed_at: Option>, - deployment_info: Option<&str>, -) { - insert_mobile_hotspot_infos( - pool, - asset, - location, - device_type, - created_at, - refreshed_at, - deployment_info, - ) - .await; - insert_asset_key(pool, asset, key).await; + gateways: &[GatewayInsert], + chunk_size: usize, +) -> anyhow::Result<()> { + stream::iter(gateways.chunks(chunk_size)) + .map(Ok) // convert chunks to a Result for try_for_each_concurrent + .try_for_each_concurrent(Some(20), |chunk| { + let pool = pool.clone(); + async move { + let mut tx = pool.begin().await?; + + // insert mobile_hotspot_infos + let mut qb = QueryBuilder::::new( + r#" + INSERT INTO mobile_hotspot_infos ( + asset, location, device_type, created_at, + refreshed_at, deployment_info, num_location_asserts + ) + "#, + ); + + qb.push_values(chunk, |mut b, gw| { + let num_locations = if gw.location.is_some() { + Some(1) + } else { + Some(0) + }; + + let device_type_json: serde_json::Value = + serde_json::from_str(&gw.device_type).unwrap(); + let deployment_info_json: serde_json::Value = + serde_json::from_str(&gw.deployment_info.as_deref().unwrap_or("null")) + .unwrap(); + + b.push_bind(&gw.asset) + .push_bind(gw.location) + .push_bind(device_type_json) + .push_bind(gw.created_at) + .push_bind(gw.refreshed_at) + .push_bind(deployment_info_json) + .push_bind(num_locations); + }); + + qb.build().execute(&mut *tx).await?; + + // insert key_to_assets + let mut qb1 = QueryBuilder::::new( + r#" + INSERT INTO key_to_assets ( + asset, entity_key + ) + "#, + ); + + qb1.push_values(chunk, |mut b, gw| { + let b58 = bs58::decode(gw.key.to_string()).into_vec().unwrap(); + b.push_bind(&gw.asset).push_bind(b58); + }); + + qb1.build().execute(&mut *tx).await?; + + tx.commit().await?; + + Ok::<_, anyhow::Error>(()) + } + }) + .await?; + + Ok(()) } -async fn insert_mobile_hotspot_infos( +pub async fn update_gateway( pool: &PgPool, asset: &str, - location: Option, - device_type: &str, - created_at: DateTime, - refreshed_at: Option>, - deployment_info: Option<&str>, -) { - let num_locations = if location.is_some() { Some(1) } else { Some(0) }; + location: i64, + refreshed_at: DateTime, +) -> anyhow::Result<()> { sqlx::query( r#" - INSERT INTO -"mobile_hotspot_infos" ("asset", "location", "device_type", "created_at", "refreshed_at", "deployment_info", "num_location_asserts") - VALUES -($1, $2, $3::jsonb, $4, $5, $6::jsonb, $7); - "#, + UPDATE mobile_hotspot_infos + SET location = $1, + num_location_asserts = $2, + refreshed_at = $3 + WHERE asset = $4 + "#, ) - .bind(asset) .bind(location) - .bind(device_type) - .bind(created_at) + .bind(2) .bind(refreshed_at) - .bind(deployment_info) - .bind(num_locations) - .execute(pool) - .await - .unwrap(); -} - -async fn insert_asset_key(pool: &PgPool, asset: &str, key: PublicKeyBinary) { - let b58 = bs58::decode(key.to_string()).into_vec().unwrap(); - sqlx::query( - r#" - INSERT INTO - "key_to_assets" ("asset", "entity_key") - VALUES ($1, $2); - "#, - ) .bind(asset) - .bind(b58) .execute(pool) - .await - .unwrap(); + .await?; + + Ok(()) } pub async fn create_tables(pool: &PgPool) { diff --git a/mobile_config/tests/integrations/gateway_db.rs b/mobile_config/tests/integrations/gateway_db.rs index 3ba000d78..516df582a 100644 --- a/mobile_config/tests/integrations/gateway_db.rs +++ b/mobile_config/tests/integrations/gateway_db.rs @@ -27,57 +27,6 @@ async fn gateway_insert_and_get_by_address(pool: PgPool) -> anyhow::Result<()> { Ok(()) } -#[sqlx::test] -async fn gateway_upsert_last_changed_at_on_location_or_hash_change( - pool: PgPool, -) -> anyhow::Result<()> { - let addr = pk_binary(); - let t0 = Utc.with_ymd_and_hms(2025, 1, 1, 0, 0, 0).unwrap(); - let t1 = Utc.with_ymd_and_hms(2025, 1, 2, 0, 0, 0).unwrap(); - let t2 = Utc.with_ymd_and_hms(2025, 1, 3, 0, 0, 0).unwrap(); - let t3 = Utc.with_ymd_and_hms(2025, 1, 4, 0, 0, 0).unwrap(); - - // insert baseline - gw(addr.clone(), GatewayType::WifiOutdoor, t0) - .insert(&pool) - .await?; - - // upsert with no change (only timestamps move) - let mut same = gw(addr.clone(), GatewayType::WifiOutdoor, t0); - same.inserted_at = t1; - same.refreshed_at = t1; - same.last_changed_at = t1; // should be ignored by SQL if no change - same.insert(&pool).await?; - - let after_same = Gateway::get_by_address(&pool, &addr).await?.unwrap(); - assert_eq!(after_same.refreshed_at, t1); - assert_eq!(after_same.last_changed_at, t0); // unchanged - - // upsert with location change -> last_changed_at bumps to refreshed_at (t2) - let mut loc = after_same.clone(); - loc.inserted_at = t2; - loc.refreshed_at = t2; - loc.location = Some(456); - loc.insert(&pool).await?; - - let after_loc = Gateway::get_by_address(&pool, &addr).await?.unwrap(); - assert_eq!(after_loc.location, Some(456)); - assert_eq!(after_loc.last_changed_at, t2); - - // upsert with hash change (location same) -> last_changed_at bumps again - let mut h = after_loc.clone(); - h.inserted_at = t3; - h.refreshed_at = t3; - h.hash = "h1".into(); - h.insert(&pool).await?; - - let after_hash = Gateway::get_by_address(&pool, &addr).await?.unwrap(); - assert_eq!(after_hash.hash, "h1"); - assert_eq!(after_hash.last_changed_at, t3); - - Ok(()) -} - #[sqlx::test] async fn gateway_bulk_insert_and_get(pool: PgPool) -> anyhow::Result<()> { let now = Utc::now(); diff --git a/mobile_config/tests/integrations/gateway_tracker.rs b/mobile_config/tests/integrations/gateway_tracker.rs index 79a0e7aa4..384603a3a 100644 --- a/mobile_config/tests/integrations/gateway_tracker.rs +++ b/mobile_config/tests/integrations/gateway_tracker.rs @@ -1,53 +1,123 @@ -use crate::common::{ - gateway_metadata_db::{create_tables, insert_gateway}, - make_keypair, -}; +use crate::common::{gateway_metadata_db, make_keypair}; use chrono::{Timelike, Utc}; use custom_tracing::Settings; use mobile_config::gateway::{ db::{Gateway, GatewayType}, tracker, }; +use rand::{seq::SliceRandom, thread_rng}; use sqlx::PgPool; #[sqlx::test] async fn execute_test(pool: PgPool) -> anyhow::Result<()> { + const TOTAL: usize = 10_000; + custom_tracing::init("mobile_config=debug,info".to_string(), Settings::default()).await?; - let pubkey1 = make_keypair().public_key().clone(); - let hex1 = 631711281837647359_i64; let now = Utc::now() .with_nanosecond(Utc::now().timestamp_subsec_micros() * 1000) .unwrap(); - create_tables(&pool).await; - insert_gateway( - &pool, - "asset1", - Some(hex1), - "\"wifiIndoor\"", - pubkey1.clone().into(), - now, - Some(now), - None, - ) - .await; + // ensure tables exist + gateway_metadata_db::create_tables(&pool).await; + + // Prepare the bulk insert data + let gateways: Vec = (0..TOTAL) + .map(|i| { + let pubkey = make_keypair().public_key().clone(); + let hex_val = 631_711_281_837_647_359_i64 + i as i64; + + gateway_metadata_db::GatewayInsert { + asset: format!("asset{}", i), + location: Some(hex_val), + device_type: "\"wifiIndoor\"".to_string(), + key: pubkey.into(), + created_at: now, + refreshed_at: Some(now), + deployment_info: None, + } + }) + .collect(); + + // Bulk insert all gateways in one shot + gateway_metadata_db::insert_gateway_bulk(&pool, &gateways, 1000).await?; + + tracing::info!("inserted {} gateways, running tracker", TOTAL); + + // now run the tracker execute function tracker::execute(&pool, &pool).await?; - let gateway1 = Gateway::get_by_address(&pool, &pubkey1.clone().into()) - .await? - .expect("asset1 gateway not found"); - - assert_eq!(gateway1.address, pubkey1.clone().into()); - assert_eq!(gateway1.gateway_type, GatewayType::WifiIndoor); - assert_eq!(gateway1.created_at, now); - assert_eq!(gateway1.refreshed_at, now); - assert_eq!(gateway1.antenna, None); - assert_eq!(gateway1.elevation, None); - assert_eq!(gateway1.azimuth, None); - assert_eq!(gateway1.location, Some(hex1 as u64)); - assert_eq!(gateway1.location_changed_at, Some(now)); - assert_eq!(gateway1.location_asserts, Some(1)); + // Check that we have TOTAL gateways in the DB + let total = count_gateways(&pool).await?; + assert_eq!(TOTAL as i64, total); + + // Sample 100 gateways to verify + let mut rng = thread_rng(); + let sample_size = 100; + let sample: Vec<_> = gateways.choose_multiple(&mut rng, sample_size).collect(); + + let new_loc = 0_i64; + let now = Utc::now() + .with_nanosecond(Utc::now().timestamp_subsec_micros() * 1000) + .unwrap(); + + for gw_insert in sample.clone() { + let gateway = Gateway::get_by_address(&pool, &gw_insert.key) + .await? + .expect("gateway not found"); + + assert_eq!(gateway.address, gw_insert.key.clone()); + assert_eq!(gateway.gateway_type, GatewayType::WifiIndoor); + assert_eq!(gateway.created_at, gw_insert.created_at); + assert_eq!(Some(gateway.refreshed_at), gw_insert.refreshed_at); + assert_eq!(Some(gateway.last_changed_at), gw_insert.refreshed_at); + assert_eq!(gateway.antenna, None); + assert_eq!(gateway.elevation, None); + assert_eq!(gateway.azimuth, None); + assert_eq!(gateway.location, gw_insert.location.map(|v| v as u64)); + assert_eq!(gateway.location_changed_at, gw_insert.refreshed_at); // matches logic in tracker + assert_eq!(gateway.location_asserts, gw_insert.location.map(|_| 1)); + + // Update sample gateways + gateway_metadata_db::update_gateway(&pool, &gw_insert.asset, new_loc, now).await?; + } + + // now run the tracker again after updates + tracker::execute(&pool, &pool).await?; + + // We should have TOTAL + sample_size gateways in the DB + let total = count_gateways(&pool).await?; + assert_eq!(TOTAL as i64 + sample_size as i64, total); + + for gw_insert in sample.clone() { + let gateway = Gateway::get_by_address(&pool, &gw_insert.key) + .await? + .expect("gateway not found"); + + assert_eq!(gateway.address, gw_insert.key.clone()); + assert_eq!(gateway.gateway_type, GatewayType::WifiIndoor); + assert_eq!(gateway.created_at, gw_insert.created_at); + assert_eq!(gateway.refreshed_at, now); + assert_eq!(gateway.last_changed_at, now); + assert_eq!(gateway.antenna, None); + assert_eq!(gateway.elevation, None); + assert_eq!(gateway.azimuth, None); + assert_eq!(gateway.location, Some(0)); + assert_eq!(gateway.location_changed_at, Some(now)); + assert_eq!(gateway.location_asserts, Some(2)); + } Ok(()) } + +async fn count_gateways(pool: &PgPool) -> anyhow::Result { + let count: (i64,) = sqlx::query_as( + r#" + SELECT COUNT(*) FROM gateways; + "#, + ) + .fetch_one(pool) + .await?; + + Ok(count.0) +} From 029dd398712ec93102ee62ee5aba1d6662de7fc6 Mon Sep 17 00:00:00 2001 From: Macpie Date: Mon, 6 Oct 2025 16:18:03 -0700 Subject: [PATCH 03/33] Fix gateway DB calls --- mobile_config/src/gateway/db.rs | 62 ++----------- .../tests/integrations/gateway_db.rs | 92 ++----------------- .../tests/integrations/gateway_tracker.rs | 1 + 3 files changed, 13 insertions(+), 142 deletions(-) diff --git a/mobile_config/src/gateway/db.rs b/mobile_config/src/gateway/db.rs index 6f21ffe0a..2ebc4cbbe 100644 --- a/mobile_config/src/gateway/db.rs +++ b/mobile_config/src/gateway/db.rs @@ -196,20 +196,7 @@ impl Gateway { ) -> anyhow::Result> { let gateway = sqlx::query_as::<_, Self>( r#" - SELECT - address, - gateway_type, - created_at, - inserted_at, - refreshed_at, - last_changed_at, - hash, - antenna, - elevation, - azimuth, - location, - location_changed_at, - location_asserts + SELECT * FROM gateways WHERE address = $1 ORDER BY inserted_at DESC @@ -231,20 +218,7 @@ impl Gateway { let rows = sqlx::query_as::<_, Self>( r#" - SELECT DISTINCT ON (address) - address, - gateway_type, - created_at, - inserted_at, - refreshed_at, - last_changed_at, - hash, - antenna, - elevation, - azimuth, - location, - location_changed_at, - location_asserts + SELECT DISTINCT ON (address) * FROM gateways WHERE address = ANY($1) ORDER BY address, inserted_at DESC @@ -266,23 +240,11 @@ impl Gateway { sqlx::query_as::<_, Self>( r#" - SELECT - address, - gateway_type, - created_at, - inserted_at, - refreshed_at, - last_changed_at, - hash, - antenna, - elevation, - azimuth, - location, - location_changed_at, - location_asserts + SELECT DISTINCT ON (address) * FROM gateways WHERE address = ANY($1) AND last_changed_at >= $2 + ORDER BY address, inserted_at DESC "#, ) .bind(addr_array) @@ -300,20 +262,7 @@ impl Gateway { ) -> impl Stream + 'a { sqlx::query_as::<_, Self>( r#" - SELECT - address, - gateway_type, - created_at, - inserted_at, - refreshed_at, - last_changed_at, - hash, - antenna, - elevation, - azimuth, - location, - location_changed_at, - location_asserts + SELECT DISTINCT ON (address) * FROM gateways WHERE gateway_type = ANY($1) AND last_changed_at >= $2 @@ -321,6 +270,7 @@ impl Gateway { $3::timestamptz IS NULL OR (location IS NOT NULL AND location_changed_at >= $3) ) + ORDER BY address, inserted_at DESC "#, ) .bind(types) diff --git a/mobile_config/tests/integrations/gateway_db.rs b/mobile_config/tests/integrations/gateway_db.rs index 516df582a..9c56b102a 100644 --- a/mobile_config/tests/integrations/gateway_db.rs +++ b/mobile_config/tests/integrations/gateway_db.rs @@ -57,87 +57,6 @@ async fn gateway_bulk_insert_and_get(pool: PgPool) -> anyhow::Result<()> { Ok(()) } -#[sqlx::test] -async fn gateway_bulk_upsert_updates_and_change(pool: PgPool) -> anyhow::Result<()> { - // seed two rows at t0 - let t0 = Utc::now(); - let a1 = pk_binary(); - let a2 = pk_binary(); - - let mut g1 = gw(a1.clone(), GatewayType::WifiIndoor, t0); - let mut g2 = gw(a2.clone(), GatewayType::WifiOutdoor, t0); - let _ = Gateway::insert_bulk(&pool, &[g1.clone(), g2.clone()]).await?; - - // upsert at t1: change only timestamps for g1 (no loc/hash change) - // and change location for g2 (should bump last_changed_at) - let t1 = Utc::now(); - - g1.inserted_at = t1; - g1.refreshed_at = t1; - // leave g1.location / g1.hash the same - - g2.inserted_at = t1; - g2.refreshed_at = t1; - g2.location = Some(456); // change => last_changed_at should bump to t1 - // g2.hash unchanged - - let affected = Gateway::insert_bulk(&pool, &[g1.clone(), g2.clone()]).await?; - // 2 rows should be affected (both upserted) - assert_eq!(affected, 2); - - // verify g1: timestamps updated, last_changed_at unchanged (no relevant change) - let got1 = Gateway::get_by_address(&pool, &a1) - .await? - .expect("row should exist"); - assert_eq!(got1.inserted_at, common::nanos_trunc(t1)); - assert_eq!(got1.refreshed_at, common::nanos_trunc(t1)); - assert_eq!( - got1.last_changed_at, - common::nanos_trunc(t0), - "no loc/hash change ⇒ last_changed_at stays t0" - ); - assert_eq!(got1.location, Some(123)); - assert_eq!(got1.hash, "h0"); - - // verify g2: timestamps updated, last_changed_at bumped due to location change - let got2 = Gateway::get_by_address(&pool, &a2) - .await? - .expect("row should exist"); - assert_eq!(got2.inserted_at, common::nanos_trunc(t1)); - assert_eq!(got2.refreshed_at, common::nanos_trunc(t1)); - assert_eq!( - got2.last_changed_at, - common::nanos_trunc(t1), - "location changed ⇒ last_changed_at = refreshed_at" - ); - assert_eq!(got2.location, Some(456)); - assert_eq!(got2.hash, "h0"); - - // second upsert at t2: change hash only for g1, ensure bump - let t2 = Utc::now(); - - g1.inserted_at = t2; - g1.refreshed_at = t2; - g1.hash = "h1".into(); // change ⇒ bump last_changed_at - - let affected2 = Gateway::insert_bulk(&pool, &[g1.clone()]).await?; - assert_eq!(affected2, 1); - - let got1b = Gateway::get_by_address(&pool, &a1) - .await? - .expect("row should exist"); - assert_eq!(got1b.inserted_at, common::nanos_trunc(t2)); - assert_eq!(got1b.refreshed_at, common::nanos_trunc(t2)); - assert_eq!( - got1b.last_changed_at, - common::nanos_trunc(t2), - "hash changed ⇒ last_changed_at = refreshed_at" - ); - assert_eq!(got1b.hash, "h1"); - - Ok(()) -} - #[sqlx::test] async fn stream_by_addresses_filters_by_min_last_changed_at(pool: PgPool) -> anyhow::Result<()> { let a1 = pk_binary(); @@ -161,8 +80,8 @@ async fn stream_by_addresses_filters_by_min_last_changed_at(pool: PgPool) -> any // bump g1.last_changed_at to t2 let mut g1b = g1.clone(); - g1b.hash = "h1".to_string(); - g1b.refreshed_at = t2; + g1b.hash = "x1".to_string(); + g1b.last_changed_at = t2; g1b.insert(&pool).await?; // now we should see g1 only @@ -188,7 +107,8 @@ async fn stream_by_types_filters_by_min_date(pool: PgPool) -> anyhow::Result<()> gw(pk_binary(), GatewayType::WifiOutdoor, t1) .insert(&pool) .await?; - gw(pk_binary(), GatewayType::WifiIndoor, t2) + let key = pk_binary(); + gw(key.clone(), GatewayType::WifiIndoor, t2) .insert(&pool) .await?; @@ -197,7 +117,7 @@ async fn stream_by_types_filters_by_min_date(pool: PgPool) -> anyhow::Result<()> pin_mut!(s); let first = s.next().await.expect("row expected"); assert_eq!(first.gateway_type, GatewayType::WifiIndoor); - assert_eq!(first.created_at, t2); + assert_eq!(first.address, key); assert!(s.next().await.is_none()); Ok(()) @@ -242,7 +162,7 @@ fn gw(address: PublicKeyBinary, gateway_type: GatewayType, t: chrono::DateTime anyhow::Result<()> { + // Tested with 100k const TOTAL: usize = 10_000; custom_tracing::init("mobile_config=debug,info".to_string(), Settings::default()).await?; From 6240c9d84b1dc5a76cee6aa47e363e5c63368cae Mon Sep 17 00:00:00 2001 From: Macpie Date: Mon, 6 Oct 2025 16:23:15 -0700 Subject: [PATCH 04/33] Fix Clippy --- mobile_config/tests/integrations/common/gateway_metadata_db.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mobile_config/tests/integrations/common/gateway_metadata_db.rs b/mobile_config/tests/integrations/common/gateway_metadata_db.rs index fc1fe9564..0d07c77a0 100644 --- a/mobile_config/tests/integrations/common/gateway_metadata_db.rs +++ b/mobile_config/tests/integrations/common/gateway_metadata_db.rs @@ -46,7 +46,7 @@ pub async fn insert_gateway_bulk( let device_type_json: serde_json::Value = serde_json::from_str(&gw.device_type).unwrap(); let deployment_info_json: serde_json::Value = - serde_json::from_str(&gw.deployment_info.as_deref().unwrap_or("null")) + serde_json::from_str(gw.deployment_info.as_deref().unwrap_or("null")) .unwrap(); b.push_bind(&gw.asset) From eb1498f87bac7780d6cb9ea758378cedc8e1504c Mon Sep 17 00:00:00 2001 From: Macpie Date: Tue, 7 Oct 2025 14:53:28 -0700 Subject: [PATCH 05/33] PR comments --- .../20251003000000_gateways_historical.sql | 8 ++- mobile_config/src/gateway/db.rs | 64 +++++++++++++++++-- mobile_config/src/gateway/tracker.rs | 3 +- .../tests/integrations/gateway_db.rs | 4 +- .../tests/integrations/migrations.rs | 8 +-- 5 files changed, 73 insertions(+), 14 deletions(-) diff --git a/mobile_config/migrations/20251003000000_gateways_historical.sql b/mobile_config/migrations/20251003000000_gateways_historical.sql index ada65eee2..996a19b5f 100644 --- a/mobile_config/migrations/20251003000000_gateways_historical.sql +++ b/mobile_config/migrations/20251003000000_gateways_historical.sql @@ -21,4 +21,10 @@ SET NOT NULL; -- 5. Create an index on (address, inserted_at DESC) -CREATE INDEX IF NOT EXISTS gateways_address_inserted_idx ON gateways (address, inserted_at DESC); \ No newline at end of file +CREATE INDEX IF NOT EXISTS gateways_address_inserted_idx ON gateways (address, inserted_at DESC); + +-- 6. Create an PK on (address, inserted_at DESC) +ALTER TABLE + gateways +ADD + CONSTRAINT gateways_pkey PRIMARY KEY (address, inserted_at); \ No newline at end of file diff --git a/mobile_config/src/gateway/db.rs b/mobile_config/src/gateway/db.rs index 2ebc4cbbe..d4e599843 100644 --- a/mobile_config/src/gateway/db.rs +++ b/mobile_config/src/gateway/db.rs @@ -131,7 +131,7 @@ impl Gateway { b.push_bind(g.address.as_ref()) .push_bind(g.gateway_type) .push_bind(g.created_at) - .push_bind(g.inserted_at) + .push_bind(Utc::now()) .push_bind(g.refreshed_at) .push_bind(g.last_changed_at) .push_bind(g.hash.as_str()) @@ -174,7 +174,7 @@ impl Gateway { .bind(self.address.as_ref()) .bind(self.gateway_type) .bind(self.created_at) - .bind(self.inserted_at) + .bind(Utc::now()) .bind(self.refreshed_at) .bind(self.last_changed_at) .bind(self.hash.as_str()) @@ -196,7 +196,20 @@ impl Gateway { ) -> anyhow::Result> { let gateway = sqlx::query_as::<_, Self>( r#" - SELECT * + SELECT + address, + gateway_type, + created_at, + inserted_at, + refreshed_at, + last_changed_at, + hash, + antenna, + elevation, + azimuth, + location, + location_changed_at, + location_asserts FROM gateways WHERE address = $1 ORDER BY inserted_at DESC @@ -218,7 +231,20 @@ impl Gateway { let rows = sqlx::query_as::<_, Self>( r#" - SELECT DISTINCT ON (address) * + SELECT DISTINCT ON (address) + address, + gateway_type, + created_at, + inserted_at, + refreshed_at, + last_changed_at, + hash, + antenna, + elevation, + azimuth, + location, + location_changed_at, + location_asserts FROM gateways WHERE address = ANY($1) ORDER BY address, inserted_at DESC @@ -240,7 +266,20 @@ impl Gateway { sqlx::query_as::<_, Self>( r#" - SELECT DISTINCT ON (address) * + SELECT DISTINCT ON (address) + address, + gateway_type, + created_at, + inserted_at, + refreshed_at, + last_changed_at, + hash, + antenna, + elevation, + azimuth, + location, + location_changed_at, + location_asserts FROM gateways WHERE address = ANY($1) AND last_changed_at >= $2 @@ -262,7 +301,20 @@ impl Gateway { ) -> impl Stream + 'a { sqlx::query_as::<_, Self>( r#" - SELECT DISTINCT ON (address) * + SELECT DISTINCT ON (address) + address, + gateway_type, + created_at, + inserted_at, + refreshed_at, + last_changed_at, + hash, + antenna, + elevation, + azimuth, + location, + location_changed_at, + location_asserts FROM gateways WHERE gateway_type = ANY($1) AND last_changed_at >= $2 diff --git a/mobile_config/src/gateway/tracker.rs b/mobile_config/src/gateway/tracker.rs index 579f4d660..07b14c4d3 100644 --- a/mobile_config/src/gateway/tracker.rs +++ b/mobile_config/src/gateway/tracker.rs @@ -99,10 +99,10 @@ pub async fn execute(pool: &Pool, metadata: &Pool) -> anyhow to_insert.push(gw); } Some(last_gw) => { - // FYI hash includes location let loc_changed = gw.location != last_gw.location; let hash_changed = gw.hash != last_gw.hash; + // FYI hash includes location gw.last_changed_at = if hash_changed { gw.refreshed_at } else { @@ -116,6 +116,7 @@ pub async fn execute(pool: &Pool, metadata: &Pool) -> anyhow }; // We only add record if something changed + // FYI hash includes location if hash_changed { to_insert.push(gw); } diff --git a/mobile_config/tests/integrations/gateway_db.rs b/mobile_config/tests/integrations/gateway_db.rs index 9c56b102a..daae41730 100644 --- a/mobile_config/tests/integrations/gateway_db.rs +++ b/mobile_config/tests/integrations/gateway_db.rs @@ -19,7 +19,7 @@ async fn gateway_insert_and_get_by_address(pool: PgPool) -> anyhow::Result<()> { assert_eq!(gateway.gateway_type, GatewayType::WifiIndoor); assert_eq!(gateway.created_at, common::nanos_trunc(now)); - assert_eq!(gateway.inserted_at, common::nanos_trunc(now)); + assert!(gateway.inserted_at > now); assert_eq!(gateway.refreshed_at, common::nanos_trunc(now)); assert_eq!(gateway.last_changed_at, common::nanos_trunc(now)); // first insert: equals refreshed_at assert_eq!(gateway.location, Some(123)); @@ -47,7 +47,7 @@ async fn gateway_bulk_insert_and_get(pool: PgPool) -> anyhow::Result<()> { .await? .expect("row should exist"); assert_eq!(got.created_at, common::nanos_trunc(now)); - assert_eq!(got.inserted_at, common::nanos_trunc(now)); + assert!(got.inserted_at > now); assert_eq!(got.refreshed_at, common::nanos_trunc(now)); assert_eq!(got.last_changed_at, common::nanos_trunc(now)); assert_eq!(got.location, Some(123)); diff --git a/mobile_config/tests/integrations/migrations.rs b/mobile_config/tests/integrations/migrations.rs index 12d0adbb6..6c5324994 100644 --- a/mobile_config/tests/integrations/migrations.rs +++ b/mobile_config/tests/integrations/migrations.rs @@ -40,11 +40,11 @@ async fn gateways_historical(pool: PgPool) -> anyhow::Result<()> { assert!(pre_gw.address == gw.address); assert!(pre_gw.gateway_type == gw.gateway_type); - assert!(pre_gw.created_at == gw.created_at); + assert!(pre_gw.created_at == common::nanos_trunc(gw.created_at)); // The real change is updated_at renamed to inserted_at AND inserted_at = created_at; - assert!(pre_gw.created_at == gw.inserted_at); - assert!(pre_gw.refreshed_at == gw.refreshed_at); - assert!(pre_gw.last_changed_at == gw.last_changed_at); + assert!(pre_gw.created_at == common::nanos_trunc(gw.inserted_at)); + assert!(pre_gw.refreshed_at == common::nanos_trunc(gw.refreshed_at)); + assert!(pre_gw.last_changed_at == common::nanos_trunc(gw.last_changed_at)); assert!(pre_gw.hash == gw.hash); assert!(pre_gw.antenna == gw.antenna); assert!(pre_gw.elevation == gw.elevation); From e0531afdaf5eeca109a93e010700ca5a5d893c4d Mon Sep 17 00:00:00 2001 From: Macpie Date: Tue, 7 Oct 2025 15:05:11 -0700 Subject: [PATCH 06/33] Add some print to debug --- mobile_config/tests/integrations/migrations.rs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/mobile_config/tests/integrations/migrations.rs b/mobile_config/tests/integrations/migrations.rs index 6c5324994..66c5d6e6b 100644 --- a/mobile_config/tests/integrations/migrations.rs +++ b/mobile_config/tests/integrations/migrations.rs @@ -38,6 +38,9 @@ async fn gateways_historical(pool: PgPool) -> anyhow::Result<()> { .await? .expect("should find gateway"); + println!("pre_gw: {:?}", pre_gw); + println!("gw: {:?}", gw); + assert!(pre_gw.address == gw.address); assert!(pre_gw.gateway_type == gw.gateway_type); assert!(pre_gw.created_at == common::nanos_trunc(gw.created_at)); From 497e0e40312cd0716cfb2372355fe84155cf20a3 Mon Sep 17 00:00:00 2001 From: Macpie Date: Tue, 7 Oct 2025 15:15:26 -0700 Subject: [PATCH 07/33] Fix timestamp check --- mobile_config/tests/integrations/migrations.rs | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/mobile_config/tests/integrations/migrations.rs b/mobile_config/tests/integrations/migrations.rs index 66c5d6e6b..b0cfacd78 100644 --- a/mobile_config/tests/integrations/migrations.rs +++ b/mobile_config/tests/integrations/migrations.rs @@ -43,17 +43,20 @@ async fn gateways_historical(pool: PgPool) -> anyhow::Result<()> { assert!(pre_gw.address == gw.address); assert!(pre_gw.gateway_type == gw.gateway_type); - assert!(pre_gw.created_at == common::nanos_trunc(gw.created_at)); + assert!(common::nanos_trunc(pre_gw.created_at) == common::nanos_trunc(gw.created_at)); // The real change is updated_at renamed to inserted_at AND inserted_at = created_at; - assert!(pre_gw.created_at == common::nanos_trunc(gw.inserted_at)); - assert!(pre_gw.refreshed_at == common::nanos_trunc(gw.refreshed_at)); - assert!(pre_gw.last_changed_at == common::nanos_trunc(gw.last_changed_at)); + assert!(common::nanos_trunc(pre_gw.created_at) == common::nanos_trunc(gw.inserted_at)); + assert!(common::nanos_trunc(pre_gw.refreshed_at) == common::nanos_trunc(gw.refreshed_at)); + assert!(common::nanos_trunc(pre_gw.last_changed_at) == common::nanos_trunc(gw.last_changed_at)); assert!(pre_gw.hash == gw.hash); assert!(pre_gw.antenna == gw.antenna); assert!(pre_gw.elevation == gw.elevation); assert!(pre_gw.azimuth == gw.azimuth); assert!(pre_gw.location == gw.location); - assert!(pre_gw.location_changed_at == gw.location_changed_at); + assert!( + common::nanos_trunc(pre_gw.location_changed_at.unwrap()) + == common::nanos_trunc(gw.location_changed_at.unwrap()) + ); assert!(pre_gw.location_asserts == gw.location_asserts); Ok(()) From ca0c79f10d2818d5f8cc8bb02ff2ca620cdc164a Mon Sep 17 00:00:00 2001 From: Connor McKenzie Date: Fri, 17 Oct 2025 14:25:54 +0100 Subject: [PATCH 08/33] Added new API for retrieving historical gateway info --- file_store/src/traits/msg_verify.rs | 1 + .../20251003000000_gateways_historical.sql | 8 +- mobile_config/src/gateway/db.rs | 42 +++++- mobile_config/src/gateway/service/info.rs | 9 ++ mobile_config/src/gateway/service/mod.rs | 64 +++++++++ .../tests/integrations/gateway_db.rs | 31 +++++ .../tests/integrations/gateway_service.rs | 121 +++++++++++++++++- 7 files changed, 263 insertions(+), 13 deletions(-) diff --git a/file_store/src/traits/msg_verify.rs b/file_store/src/traits/msg_verify.rs index 42e04b0a2..0e2fb1b3d 100644 --- a/file_store/src/traits/msg_verify.rs +++ b/file_store/src/traits/msg_verify.rs @@ -102,6 +102,7 @@ impl_msg_verify!(mobile_config::GatewayInfoStreamResV3, signature); impl_msg_verify!(mobile_config::BoostedHexInfoStreamReqV1, signature); impl_msg_verify!(mobile_config::BoostedHexModifiedInfoStreamReqV1, signature); impl_msg_verify!(mobile_config::BoostedHexInfoStreamResV1, signature); +impl_msg_verify!(mobile_config::GatewayInfoHistoricalReq, signature); impl_msg_verify!(sub_dao::SubDaoEpochRewardInfoReqV1, signature); impl_msg_verify!(sub_dao::SubDaoEpochRewardInfoResV1, signature); impl_msg_verify!(poc_mobile::SubscriberVerifiedMappingEventReqV1, signature); diff --git a/mobile_config/migrations/20251003000000_gateways_historical.sql b/mobile_config/migrations/20251003000000_gateways_historical.sql index 996a19b5f..5fb7aa774 100644 --- a/mobile_config/migrations/20251003000000_gateways_historical.sql +++ b/mobile_config/migrations/20251003000000_gateways_historical.sql @@ -12,13 +12,11 @@ UPDATE SET inserted_at = created_at; --- 4. Ensure inserted_at is NOT NULL +-- 4. Ensure inserted_at is NOT NULL and has a default value of now() ALTER TABLE gateways -ALTER COLUMN - inserted_at -SET - NOT NULL; +ALTER COLUMN inserted_at SET DEFAULT now(), +ALTER COLUMN inserted_at SET NOT NULL; -- 5. Create an index on (address, inserted_at DESC) CREATE INDEX IF NOT EXISTS gateways_address_inserted_idx ON gateways (address, inserted_at DESC); diff --git a/mobile_config/src/gateway/db.rs b/mobile_config/src/gateway/db.rs index d4e599843..994676a8d 100644 --- a/mobile_config/src/gateway/db.rs +++ b/mobile_config/src/gateway/db.rs @@ -114,7 +114,6 @@ impl Gateway { address, gateway_type, created_at, - inserted_at, refreshed_at, last_changed_at, hash, @@ -131,7 +130,6 @@ impl Gateway { b.push_bind(g.address.as_ref()) .push_bind(g.gateway_type) .push_bind(g.created_at) - .push_bind(Utc::now()) .push_bind(g.refreshed_at) .push_bind(g.last_changed_at) .push_bind(g.hash.as_str()) @@ -154,7 +152,6 @@ impl Gateway { address, gateway_type, created_at, - inserted_at, refreshed_at, last_changed_at, hash, @@ -167,14 +164,13 @@ impl Gateway { ) VALUES ( $1, $2, $3, $4, $5, $6, $7, - $8, $9, $10, $11, $12, $13 + $8, $9, $10, $11, $12 ) "#, ) .bind(self.address.as_ref()) .bind(self.gateway_type) .bind(self.created_at) - .bind(Utc::now()) .bind(self.refreshed_at) .bind(self.last_changed_at) .bind(self.hash.as_str()) @@ -257,6 +253,42 @@ impl Gateway { Ok(rows) } + pub async fn get_by_address_and_inserted_at<'a>( + db: impl PgExecutor<'a>, + address: &PublicKeyBinary, + inserted_at_max: &DateTime, + ) -> anyhow::Result> { + let gateway = sqlx::query_as::<_, Self>( + r#" + SELECT + address, + gateway_type, + created_at, + inserted_at, + refreshed_at, + last_changed_at, + hash, + antenna, + elevation, + azimuth, + location, + location_changed_at, + location_asserts + FROM gateways + WHERE address = $1 + AND inserted_at <= $2 + ORDER BY inserted_at DESC + LIMIT 1 + "#, + ) + .bind(address.as_ref()) + .bind(inserted_at_max) + .fetch_optional(db) + .await?; + + Ok(gateway) + } + pub fn stream_by_addresses<'a>( db: impl PgExecutor<'a> + 'a, addresses: Vec, diff --git a/mobile_config/src/gateway/service/info.rs b/mobile_config/src/gateway/service/info.rs index f64828e96..16c8ba973 100644 --- a/mobile_config/src/gateway/service/info.rs +++ b/mobile_config/src/gateway/service/info.rs @@ -453,3 +453,12 @@ pub fn stream_by_types<'a>( Gateway::stream_by_types(db, gateway_types, min_date, None).map(|gateway| gateway.into()) } + +pub async fn get_by_address_and_inserted_at( + db: impl PgExecutor<'_>, + pubkey_bin: &PublicKeyBinary, + inserted_at_max: &DateTime, +) -> anyhow::Result> { + let gateway = Gateway::get_by_address_and_inserted_at(db, pubkey_bin, inserted_at_max).await?; + Ok(gateway.map(|g| g.into())) +} diff --git a/mobile_config/src/gateway/service/mod.rs b/mobile_config/src/gateway/service/mod.rs index 5e65d278e..3696c3f34 100644 --- a/mobile_config/src/gateway/service/mod.rs +++ b/mobile_config/src/gateway/service/mod.rs @@ -15,6 +15,7 @@ use helium_proto::{ self, GatewayInfoBatchReqV1, GatewayInfoReqV1, GatewayInfoResV1, GatewayInfoResV2, GatewayInfoStreamReqV1, GatewayInfoStreamReqV2, GatewayInfoStreamReqV3, GatewayInfoStreamResV1, GatewayInfoStreamResV2, GatewayInfoStreamResV3, GatewayInfoV2, + GatewayInfoHistoricalReq }, Message, }; @@ -63,6 +64,18 @@ impl GatewayService { self.verify_request_signature(&signer, request) } + fn verify_request_signature_for_historical_info(&self, request: &GatewayInfoHistoricalReq) -> Result<(), Status> { + let signer = verify_public_key(&request.signer)?; + let address = verify_public_key(&request.address)?; + + if address == signer && request.verify(&signer).is_ok() { + tracing::debug!(%signer, "self authorized"); + return Ok(()); + } + + self.verify_request_signature(&signer, request) + } + fn sign_response(&self, response: &[u8]) -> Result, Status> { self.signing_key .sign(response) @@ -155,6 +168,57 @@ impl mobile_config::Gateway for GatewayService { ) } + async fn info_historical(&self, request: Request) -> GrpcResult { + let request = request.into_inner(); + telemetry::count_request("gateway", "info-v2"); + custom_tracing::record_b58("pub_key", &request.address); + custom_tracing::record_b58("signer", &request.signer); + + self.verify_request_signature_for_historical_info(&request)?; + + let pubkey: PublicKeyBinary = request.address.into(); + tracing::debug!(pubkey = pubkey.to_string(), "fetching historical gateway info (v2)"); + + let query_time = Utc + .timestamp_opt(request.query_time as i64, 0) + .single() + .ok_or(Status::invalid_argument("Invalid query_time argument"))?; + + info::get_by_address_and_inserted_at(&self.pool, &pubkey, &query_time) + .await + .map_err(|_| { + println!("error fetching historical gateway info (v2)"); + Status::internal("error fetching historical gateway info") + })? + .map_or_else( + || { + telemetry::count_gateway_chain_lookup("not-found"); + println!("Could not find in db"); + Err(Status::not_found(pubkey.to_string())) + }, + |info| { + if info.metadata.is_some() { + telemetry::count_gateway_chain_lookup("asserted"); + } else { + telemetry::count_gateway_chain_lookup("not-asserted"); + }; + + let info: GatewayInfoV2 = info + .try_into() + .map_err(|_| Status::internal("error serializing historical gateway info (v2)"))?; + + let mut res = GatewayInfoResV2 { + info: Some(info), + timestamp: Utc::now().encode_timestamp(), + signer: self.signing_key.public_key().into(), + signature: vec![], + }; + res.signature = self.sign_response(&res.encode_to_vec())?; + Ok(Response::new(res)) + }, + ) + } + // Deprecated type info_batchStream = GrpcStreamResult; async fn info_batch( diff --git a/mobile_config/tests/integrations/gateway_db.rs b/mobile_config/tests/integrations/gateway_db.rs index daae41730..4df7844fa 100644 --- a/mobile_config/tests/integrations/gateway_db.rs +++ b/mobile_config/tests/integrations/gateway_db.rs @@ -27,6 +27,37 @@ async fn gateway_insert_and_get_by_address(pool: PgPool) -> anyhow::Result<()> { Ok(()) } +#[sqlx::test] +async fn gateway_get_by_address_and_inserted_at(pool: PgPool) -> anyhow::Result<()> { + let addr = pk_binary(); + let now = Utc::now(); + + // Insert gateway first time + let gateway = gw(addr.clone(), GatewayType::WifiIndoor, now); + gateway.insert(&pool).await?; + + // Insert gateway second time with different type + let gateway = gw(addr.clone(), GatewayType::WifiDataOnly, now); + gateway.insert(&pool).await?; + + let later = now + chrono::Duration::minutes(10); + + let gateway = Gateway::get_by_address_and_inserted_at(&pool, &addr, &later) + .await? + .expect("gateway should exist"); + + // Assert most recent gateway was returned + assert_eq!(gateway.gateway_type, GatewayType::WifiDataOnly); + assert_eq!(gateway.created_at, common::nanos_trunc(now)); + assert!(gateway.inserted_at > now); + assert_eq!(gateway.refreshed_at, common::nanos_trunc(now)); + assert_eq!(gateway.last_changed_at, common::nanos_trunc(now)); + assert_eq!(gateway.location, Some(123)); + assert_eq!(gateway.hash, "h0"); + + Ok(()) +} + #[sqlx::test] async fn gateway_bulk_insert_and_get(pool: PgPool) -> anyhow::Result<()> { let now = Utc::now(); diff --git a/mobile_config/tests/integrations/gateway_service.rs b/mobile_config/tests/integrations/gateway_service.rs index 839c29e41..f9d132e41 100644 --- a/mobile_config/tests/integrations/gateway_service.rs +++ b/mobile_config/tests/integrations/gateway_service.rs @@ -1,5 +1,5 @@ use crate::common::{make_keypair, spawn_gateway_service}; -use chrono::{Duration, Utc}; +use chrono::{DateTime, Duration, Utc}; use futures::stream::StreamExt; use helium_crypto::{Keypair, PublicKey, Sign}; use helium_proto::services::mobile_config::{ @@ -16,14 +16,14 @@ use mobile_config::{ }; use prost::Message; use sqlx::PgPool; -use std::{sync::Arc, vec}; +use std::{sync::Arc, time, vec}; use tokio::net::TcpListener; use tonic::{transport, Code}; #[sqlx::test] async fn gateway_info_authorization_errors(pool: PgPool) -> anyhow::Result<()> { // NOTE(mj): The information we're requesting does not exist in the DB for - // this test. But we're only interested in Authization Errors. + // this test. But we're only interested in Authorization Errors. let admin_key = make_keypair(); // unlimited access let gw_key = make_keypair(); // access to self @@ -812,6 +812,104 @@ async fn gateway_info_v2(pool: PgPool) -> anyhow::Result<()> { Ok(()) } +#[sqlx::test] +async fn gateway_historical_info(pool: PgPool) -> anyhow::Result<()> { + let admin_key = make_keypair(); + + let address = make_keypair().public_key().clone(); + let loc_original = 631711281837647359_u64; + + let created_at = Utc::now() - Duration::hours(5); + let refreshed_at = Utc::now() - Duration::hours(3); + + let gateway_original = Gateway { + address: address.clone().into(), + gateway_type: GatewayType::WifiIndoor, + created_at, + inserted_at: refreshed_at, + refreshed_at, + last_changed_at: refreshed_at, + hash: "".to_string(), + antenna: Some(18), + elevation: Some(2), + azimuth: Some(161), + location: Some(loc_original), + location_changed_at: Some(refreshed_at), + location_asserts: Some(1), + }; + gateway_original.insert(&pool).await?; + + let query_time_original = Utc::now() + Duration::milliseconds(800); + tokio::time::sleep(time::Duration::from_millis(800)).await; + + let loc_recent = 631711281837647358_u64; + + let gateway_recent = Gateway { + address: address.clone().into(), + gateway_type: GatewayType::WifiIndoor, + created_at, + inserted_at: created_at, + refreshed_at: created_at, + last_changed_at: created_at, + hash: "".to_string(), + antenna: Some(18), + elevation: Some(2), + azimuth: Some(161), + location: Some(loc_recent), + location_changed_at: Some(created_at), + location_asserts: Some(1), + }; + gateway_recent.insert(&pool).await?; + + let (addr, _handle) = spawn_gateway_service(pool.clone(), admin_key.public_key().clone()).await; + let mut client = GatewayClient::connect(addr).await?; + + // Get most recent gateway info + let query_time = Utc::now() + Duration::minutes(10); + let res = info_historical_request(&mut client, &address, &admin_key, &query_time).await; + + let gw_info = res?.info.unwrap(); + assert_eq!(gw_info.address, address.to_vec()); + let deployment_info = gw_info.metadata.clone().unwrap().deployment_info.unwrap(); + match deployment_info { + DeploymentInfo::WifiDeploymentInfo(v) => { + assert_eq!(v.antenna, 18); + assert_eq!(v.azimuth, 161); + assert_eq!(v.elevation, 2); + } + DeploymentInfo::CbrsDeploymentInfo(_) => panic!(), + }; + + // Assert that recent gateway was returned + assert_eq!( + u64::from_str_radix(&gw_info.metadata.clone().unwrap().location, 16).unwrap(), + loc_recent + ); + + // Get original gateway info by using an earlier inserted_at condition + let res = info_historical_request(&mut client, &address, &admin_key, &query_time_original).await; + + let gw_info = res?.info.unwrap(); + assert_eq!(gw_info.address, address.to_vec()); + let deployment_info = gw_info.metadata.clone().unwrap().deployment_info.unwrap(); + match deployment_info { + DeploymentInfo::WifiDeploymentInfo(v) => { + assert_eq!(v.antenna, 18); + assert_eq!(v.azimuth, 161); + assert_eq!(v.elevation, 2); + } + DeploymentInfo::CbrsDeploymentInfo(_) => panic!(), + }; + + // Assert that original gateway was returned + assert_eq!( + u64::from_str_radix(&gw_info.metadata.clone().unwrap().location, 16).unwrap(), + loc_original + ); + + Ok(()) +} + fn make_signed_info_request(address: &PublicKey, signer: &Keypair) -> proto::GatewayInfoReqV1 { let mut req = proto::GatewayInfoReqV1 { address: address.to_vec(), @@ -837,6 +935,23 @@ async fn info_request_v2( Ok(res) } +async fn info_historical_request( + client: &mut GatewayClient, + address: &PublicKey, + signer: &Keypair, + query_time: &DateTime +) -> anyhow::Result { + let mut req = proto::GatewayInfoHistoricalReq { + address: address.to_vec(), + signer: signer.public_key().to_vec(), + signature: vec![], + query_time: query_time.timestamp() as u64, + }; + req.signature = signer.sign(&req.encode_to_vec()).unwrap(); + let res = client.info_historical(req).await?.into_inner(); + Ok(res) +} + async fn gateway_info_stream_v1( client: &mut GatewayClient, signer: &Keypair, From 4dfc96ca02a7f160d130bcd87704b75711e646f4 Mon Sep 17 00:00:00 2001 From: Connor McKenzie Date: Fri, 17 Oct 2025 15:01:11 +0100 Subject: [PATCH 09/33] Add v1 to historical gateway info protobuf --- file_store/src/traits/msg_verify.rs | 2 +- mobile_config/src/gateway/service/mod.rs | 6 +++--- mobile_config/tests/integrations/gateway_service.rs | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/file_store/src/traits/msg_verify.rs b/file_store/src/traits/msg_verify.rs index 0e2fb1b3d..59937268d 100644 --- a/file_store/src/traits/msg_verify.rs +++ b/file_store/src/traits/msg_verify.rs @@ -102,7 +102,7 @@ impl_msg_verify!(mobile_config::GatewayInfoStreamResV3, signature); impl_msg_verify!(mobile_config::BoostedHexInfoStreamReqV1, signature); impl_msg_verify!(mobile_config::BoostedHexModifiedInfoStreamReqV1, signature); impl_msg_verify!(mobile_config::BoostedHexInfoStreamResV1, signature); -impl_msg_verify!(mobile_config::GatewayInfoHistoricalReq, signature); +impl_msg_verify!(mobile_config::GatewayInfoHistoricalReqV1, signature); impl_msg_verify!(sub_dao::SubDaoEpochRewardInfoReqV1, signature); impl_msg_verify!(sub_dao::SubDaoEpochRewardInfoResV1, signature); impl_msg_verify!(poc_mobile::SubscriberVerifiedMappingEventReqV1, signature); diff --git a/mobile_config/src/gateway/service/mod.rs b/mobile_config/src/gateway/service/mod.rs index 3696c3f34..a27ff7a24 100644 --- a/mobile_config/src/gateway/service/mod.rs +++ b/mobile_config/src/gateway/service/mod.rs @@ -15,7 +15,7 @@ use helium_proto::{ self, GatewayInfoBatchReqV1, GatewayInfoReqV1, GatewayInfoResV1, GatewayInfoResV2, GatewayInfoStreamReqV1, GatewayInfoStreamReqV2, GatewayInfoStreamReqV3, GatewayInfoStreamResV1, GatewayInfoStreamResV2, GatewayInfoStreamResV3, GatewayInfoV2, - GatewayInfoHistoricalReq + GatewayInfoHistoricalReqV1 }, Message, }; @@ -64,7 +64,7 @@ impl GatewayService { self.verify_request_signature(&signer, request) } - fn verify_request_signature_for_historical_info(&self, request: &GatewayInfoHistoricalReq) -> Result<(), Status> { + fn verify_request_signature_for_historical_info(&self, request: &GatewayInfoHistoricalReqV1) -> Result<(), Status> { let signer = verify_public_key(&request.signer)?; let address = verify_public_key(&request.address)?; @@ -168,7 +168,7 @@ impl mobile_config::Gateway for GatewayService { ) } - async fn info_historical(&self, request: Request) -> GrpcResult { + async fn info_historical(&self, request: Request) -> GrpcResult { let request = request.into_inner(); telemetry::count_request("gateway", "info-v2"); custom_tracing::record_b58("pub_key", &request.address); diff --git a/mobile_config/tests/integrations/gateway_service.rs b/mobile_config/tests/integrations/gateway_service.rs index f9d132e41..1ebca1f09 100644 --- a/mobile_config/tests/integrations/gateway_service.rs +++ b/mobile_config/tests/integrations/gateway_service.rs @@ -941,7 +941,7 @@ async fn info_historical_request( signer: &Keypair, query_time: &DateTime ) -> anyhow::Result { - let mut req = proto::GatewayInfoHistoricalReq { + let mut req = proto::GatewayInfoHistoricalReqV1 { address: address.to_vec(), signer: signer.public_key().to_vec(), signature: vec![], From e7def30976a236f69b64ce91c285871d96132d71 Mon Sep 17 00:00:00 2001 From: Connor McKenzie Date: Fri, 17 Oct 2025 15:34:28 +0100 Subject: [PATCH 10/33] Refactored gateway service reducing code dupe --- mobile_config/src/gateway/service/mod.rs | 96 +++++++++--------------- 1 file changed, 37 insertions(+), 59 deletions(-) diff --git a/mobile_config/src/gateway/service/mod.rs b/mobile_config/src/gateway/service/mod.rs index a27ff7a24..f506e375f 100644 --- a/mobile_config/src/gateway/service/mod.rs +++ b/mobile_config/src/gateway/service/mod.rs @@ -22,6 +22,7 @@ use helium_proto::{ use sqlx::{Pool, Postgres}; use std::sync::Arc; use tonic::{Request, Response, Status}; +use crate::gateway::service::info::GatewayInfo; pub mod info; pub mod info_v3; @@ -52,21 +53,12 @@ impl GatewayService { Err(Status::permission_denied("unauthorized request signature")) } - fn verify_request_signature_for_info(&self, request: &GatewayInfoReqV1) -> Result<(), Status> { - let signer = verify_public_key(&request.signer)?; - let address = verify_public_key(&request.address)?; - - if address == signer && request.verify(&signer).is_ok() { - tracing::debug!(%signer, "self authorized"); - return Ok(()); - } - - self.verify_request_signature(&signer, request) - } - - fn verify_request_signature_for_historical_info(&self, request: &GatewayInfoHistoricalReqV1) -> Result<(), Status> { - let signer = verify_public_key(&request.signer)?; - let address = verify_public_key(&request.address)?; + fn verify_request_signature_for_info(&self, request: &R, signer: &Vec, address: &Vec) -> Result<(), Status> + where + R: MsgVerify, + { + let signer = verify_public_key(signer)?; + let address = verify_public_key(address)?; if address == signer && request.verify(&signer).is_ok() { tracing::debug!(%signer, "self authorized"); @@ -81,6 +73,30 @@ impl GatewayService { .sign(response) .map_err(|_| Status::internal("response signing error")) } + + fn map_info_v2_response( + &self, + info: GatewayInfo + ) -> GrpcResult { + if info.metadata.is_some() { + telemetry::count_gateway_chain_lookup("asserted"); + } else { + telemetry::count_gateway_chain_lookup("not-asserted"); + }; + + let info: GatewayInfoV2 = info + .try_into() + .map_err(|_| Status::internal("error serializing historical gateway info (v2)"))?; + + let mut res = GatewayInfoResV2 { + info: Some(info), + timestamp: Utc::now().encode_timestamp(), + signer: self.signing_key.public_key().into(), + signature: vec![], + }; + res.signature = self.sign_response(&res.encode_to_vec())?; + Ok(Response::new(res)) + } } #[tonic::async_trait] @@ -92,7 +108,7 @@ impl mobile_config::Gateway for GatewayService { custom_tracing::record_b58("pub_key", &request.address); custom_tracing::record_b58("signer", &request.signer); - self.verify_request_signature_for_info(&request)?; + self.verify_request_signature_for_info(&request, &request.signer, &request.address)?; let pubkey: PublicKeyBinary = request.address.into(); tracing::debug!(pubkey = pubkey.to_string(), "fetching gateway info"); @@ -132,7 +148,7 @@ impl mobile_config::Gateway for GatewayService { custom_tracing::record_b58("pub_key", &request.address); custom_tracing::record_b58("signer", &request.signer); - self.verify_request_signature_for_info(&request)?; + self.verify_request_signature_for_info(&request, &request.signer, &request.address)?; let pubkey: PublicKeyBinary = request.address.into(); tracing::debug!(pubkey = pubkey.to_string(), "fetching gateway info (v2)"); @@ -145,26 +161,7 @@ impl mobile_config::Gateway for GatewayService { telemetry::count_gateway_chain_lookup("not-found"); Err(Status::not_found(pubkey.to_string())) }, - |info| { - if info.metadata.is_some() { - telemetry::count_gateway_chain_lookup("asserted"); - } else { - telemetry::count_gateway_chain_lookup("not-asserted"); - }; - - let info: GatewayInfoV2 = info - .try_into() - .map_err(|_| Status::internal("error serializing gateway info (v2)"))?; - - let mut res = GatewayInfoResV2 { - info: Some(info), - timestamp: Utc::now().encode_timestamp(), - signer: self.signing_key.public_key().into(), - signature: vec![], - }; - res.signature = self.sign_response(&res.encode_to_vec())?; - Ok(Response::new(res)) - }, + |info| self.map_info_v2_response(info), ) } @@ -174,7 +171,7 @@ impl mobile_config::Gateway for GatewayService { custom_tracing::record_b58("pub_key", &request.address); custom_tracing::record_b58("signer", &request.signer); - self.verify_request_signature_for_historical_info(&request)?; + self.verify_request_signature_for_info(&request, &request.signer, &request.address)?; let pubkey: PublicKeyBinary = request.address.into(); tracing::debug!(pubkey = pubkey.to_string(), "fetching historical gateway info (v2)"); @@ -196,26 +193,7 @@ impl mobile_config::Gateway for GatewayService { println!("Could not find in db"); Err(Status::not_found(pubkey.to_string())) }, - |info| { - if info.metadata.is_some() { - telemetry::count_gateway_chain_lookup("asserted"); - } else { - telemetry::count_gateway_chain_lookup("not-asserted"); - }; - - let info: GatewayInfoV2 = info - .try_into() - .map_err(|_| Status::internal("error serializing historical gateway info (v2)"))?; - - let mut res = GatewayInfoResV2 { - info: Some(info), - timestamp: Utc::now().encode_timestamp(), - signer: self.signing_key.public_key().into(), - signature: vec![], - }; - res.signature = self.sign_response(&res.encode_to_vec())?; - Ok(Response::new(res)) - }, + |info| self.map_info_v2_response(info), ) } @@ -522,4 +500,4 @@ where )))) }) .await?) -} +} \ No newline at end of file From bb648435aef59f696652372013c1839af670c3ea Mon Sep 17 00:00:00 2001 From: Connor McKenzie Date: Wed, 22 Oct 2025 11:25:33 +0100 Subject: [PATCH 11/33] Changed proto branch --- Cargo.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index e67d19e14..9f023af23 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -125,10 +125,10 @@ aws-smithy-types-convert = { version = "0.60.9", features = [ url = "2.5.4" ### Protobuf -helium-proto = { git = "https://github.com/helium/proto", branch = "master", features = [ +helium-proto = { git = "https://github.com/helium/proto", branch = "connor/historical", features = [ "services", ] } -beacon = { git = "https://github.com/helium/proto", branch = "master" } +beacon = { git = "https://github.com/helium/proto", branch = "connor/historical" } # Pickup versions from above prost = "*" tonic = { version = "*", features = ["tls-aws-lc", "tls-native-roots"] } From bda0b40d134f65e8b768d5a0b3343393263a1490 Mon Sep 17 00:00:00 2001 From: Connor McKenzie Date: Wed, 22 Oct 2025 11:55:36 +0100 Subject: [PATCH 12/33] Fixed formatting errors --- mobile_config/src/gateway/db.rs | 8 +++--- mobile_config/src/gateway/service/mod.rs | 27 +++++++++---------- .../tests/integrations/gateway_service.rs | 11 +++++--- 3 files changed, 24 insertions(+), 22 deletions(-) diff --git a/mobile_config/src/gateway/db.rs b/mobile_config/src/gateway/db.rs index 994676a8d..7821f752e 100644 --- a/mobile_config/src/gateway/db.rs +++ b/mobile_config/src/gateway/db.rs @@ -281,10 +281,10 @@ impl Gateway { LIMIT 1 "#, ) - .bind(address.as_ref()) - .bind(inserted_at_max) - .fetch_optional(db) - .await?; + .bind(address.as_ref()) + .bind(inserted_at_max) + .fetch_optional(db) + .await?; Ok(gateway) } diff --git a/mobile_config/src/gateway/service/mod.rs b/mobile_config/src/gateway/service/mod.rs index f506e375f..5f88b95de 100644 --- a/mobile_config/src/gateway/service/mod.rs +++ b/mobile_config/src/gateway/service/mod.rs @@ -1,5 +1,5 @@ use crate::{ - gateway::service::{info::DeviceType, info_v3::DeviceTypeV2}, + gateway::service::{info::DeviceType, info_v3::DeviceTypeV2, info::GatewayInfo}, key_cache::KeyCache, telemetry, verify_public_key, GrpcResult, GrpcStreamResult, }; @@ -12,17 +12,16 @@ use futures::{ use helium_crypto::{Keypair, PublicKey, PublicKeyBinary, Sign}; use helium_proto::{ services::mobile_config::{ - self, GatewayInfoBatchReqV1, GatewayInfoReqV1, GatewayInfoResV1, GatewayInfoResV2, - GatewayInfoStreamReqV1, GatewayInfoStreamReqV2, GatewayInfoStreamReqV3, - GatewayInfoStreamResV1, GatewayInfoStreamResV2, GatewayInfoStreamResV3, GatewayInfoV2, - GatewayInfoHistoricalReqV1 + self, GatewayInfoBatchReqV1, GatewayInfoHistoricalReqV1, GatewayInfoReqV1, + GatewayInfoResV1, GatewayInfoResV2, GatewayInfoStreamReqV1, GatewayInfoStreamReqV2, + GatewayInfoStreamReqV3, GatewayInfoStreamResV1, GatewayInfoStreamResV2, + GatewayInfoStreamResV3, GatewayInfoV2, }, Message, }; use sqlx::{Pool, Postgres}; use std::sync::Arc; use tonic::{Request, Response, Status}; -use crate::gateway::service::info::GatewayInfo; pub mod info; pub mod info_v3; @@ -53,7 +52,12 @@ impl GatewayService { Err(Status::permission_denied("unauthorized request signature")) } - fn verify_request_signature_for_info(&self, request: &R, signer: &Vec, address: &Vec) -> Result<(), Status> + fn verify_request_signature_for_info( + &self, + request: &R, + signer: &Vec, + address: &[u8] + ) -> Result<(), Status> where R: MsgVerify, { @@ -74,10 +78,7 @@ impl GatewayService { .map_err(|_| Status::internal("response signing error")) } - fn map_info_v2_response( - &self, - info: GatewayInfo - ) -> GrpcResult { + fn map_info_v2_response(&self, info: GatewayInfo) -> GrpcResult { if info.metadata.is_some() { telemetry::count_gateway_chain_lookup("asserted"); } else { @@ -184,13 +185,11 @@ impl mobile_config::Gateway for GatewayService { info::get_by_address_and_inserted_at(&self.pool, &pubkey, &query_time) .await .map_err(|_| { - println!("error fetching historical gateway info (v2)"); Status::internal("error fetching historical gateway info") })? .map_or_else( || { telemetry::count_gateway_chain_lookup("not-found"); - println!("Could not find in db"); Err(Status::not_found(pubkey.to_string())) }, |info| self.map_info_v2_response(info), @@ -500,4 +499,4 @@ where )))) }) .await?) -} \ No newline at end of file +} diff --git a/mobile_config/tests/integrations/gateway_service.rs b/mobile_config/tests/integrations/gateway_service.rs index 1ebca1f09..ec9ec14e6 100644 --- a/mobile_config/tests/integrations/gateway_service.rs +++ b/mobile_config/tests/integrations/gateway_service.rs @@ -861,12 +861,14 @@ async fn gateway_historical_info(pool: PgPool) -> anyhow::Result<()> { }; gateway_recent.insert(&pool).await?; - let (addr, _handle) = spawn_gateway_service(pool.clone(), admin_key.public_key().clone()).await; + let (addr, _handle) = + spawn_gateway_service(pool.clone(), admin_key.public_key().clone()).await; let mut client = GatewayClient::connect(addr).await?; // Get most recent gateway info let query_time = Utc::now() + Duration::minutes(10); - let res = info_historical_request(&mut client, &address, &admin_key, &query_time).await; + let res = + info_historical_request(&mut client, &address, &admin_key, &query_time).await; let gw_info = res?.info.unwrap(); assert_eq!(gw_info.address, address.to_vec()); @@ -887,7 +889,8 @@ async fn gateway_historical_info(pool: PgPool) -> anyhow::Result<()> { ); // Get original gateway info by using an earlier inserted_at condition - let res = info_historical_request(&mut client, &address, &admin_key, &query_time_original).await; + let res = + info_historical_request(&mut client, &address, &admin_key, &query_time_original).await; let gw_info = res?.info.unwrap(); assert_eq!(gw_info.address, address.to_vec()); @@ -939,7 +942,7 @@ async fn info_historical_request( client: &mut GatewayClient, address: &PublicKey, signer: &Keypair, - query_time: &DateTime + query_time: &DateTime, ) -> anyhow::Result { let mut req = proto::GatewayInfoHistoricalReqV1 { address: address.to_vec(), From 968b6bedba21e8ee80890ab2f1a3027f65e034df Mon Sep 17 00:00:00 2001 From: Connor McKenzie Date: Wed, 22 Oct 2025 13:12:39 +0100 Subject: [PATCH 13/33] Gateway historical info test assertions updated --- .../tests/integrations/gateway_service.rs | 32 +++++++++---------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/mobile_config/tests/integrations/gateway_service.rs b/mobile_config/tests/integrations/gateway_service.rs index ec9ec14e6..d46898983 100644 --- a/mobile_config/tests/integrations/gateway_service.rs +++ b/mobile_config/tests/integrations/gateway_service.rs @@ -816,23 +816,23 @@ async fn gateway_info_v2(pool: PgPool) -> anyhow::Result<()> { async fn gateway_historical_info(pool: PgPool) -> anyhow::Result<()> { let admin_key = make_keypair(); - let address = make_keypair().public_key().clone(); + let address_original = make_keypair().public_key().clone(); let loc_original = 631711281837647359_u64; let created_at = Utc::now() - Duration::hours(5); let refreshed_at = Utc::now() - Duration::hours(3); let gateway_original = Gateway { - address: address.clone().into(), + address: address_original.clone().into(), gateway_type: GatewayType::WifiIndoor, created_at, inserted_at: refreshed_at, refreshed_at, last_changed_at: refreshed_at, hash: "".to_string(), - antenna: Some(18), - elevation: Some(2), - azimuth: Some(161), + antenna: Some(10), + elevation: Some(4), + azimuth: Some(168), location: Some(loc_original), location_changed_at: Some(refreshed_at), location_asserts: Some(1), @@ -842,10 +842,11 @@ async fn gateway_historical_info(pool: PgPool) -> anyhow::Result<()> { let query_time_original = Utc::now() + Duration::milliseconds(800); tokio::time::sleep(time::Duration::from_millis(800)).await; + let address_recent = make_keypair().public_key().clone(); let loc_recent = 631711281837647358_u64; let gateway_recent = Gateway { - address: address.clone().into(), + address: address_recent.clone().into(), gateway_type: GatewayType::WifiIndoor, created_at, inserted_at: created_at, @@ -868,10 +869,11 @@ async fn gateway_historical_info(pool: PgPool) -> anyhow::Result<()> { // Get most recent gateway info let query_time = Utc::now() + Duration::minutes(10); let res = - info_historical_request(&mut client, &address, &admin_key, &query_time).await; + info_historical_request(&mut client, &address_recent, &admin_key, &query_time).await; + // Assert that recent gateway was returned let gw_info = res?.info.unwrap(); - assert_eq!(gw_info.address, address.to_vec()); + assert_eq!(gw_info.address, address_recent.to_vec()); let deployment_info = gw_info.metadata.clone().unwrap().deployment_info.unwrap(); match deployment_info { DeploymentInfo::WifiDeploymentInfo(v) => { @@ -881,8 +883,6 @@ async fn gateway_historical_info(pool: PgPool) -> anyhow::Result<()> { } DeploymentInfo::CbrsDeploymentInfo(_) => panic!(), }; - - // Assert that recent gateway was returned assert_eq!( u64::from_str_radix(&gw_info.metadata.clone().unwrap().location, 16).unwrap(), loc_recent @@ -890,21 +890,21 @@ async fn gateway_historical_info(pool: PgPool) -> anyhow::Result<()> { // Get original gateway info by using an earlier inserted_at condition let res = - info_historical_request(&mut client, &address, &admin_key, &query_time_original).await; + info_historical_request(&mut client, &address_original, &admin_key, &query_time_original).await; + // Assert that original gateway was returned let gw_info = res?.info.unwrap(); - assert_eq!(gw_info.address, address.to_vec()); + assert_eq!(gw_info.address, address_original.to_vec()); let deployment_info = gw_info.metadata.clone().unwrap().deployment_info.unwrap(); match deployment_info { DeploymentInfo::WifiDeploymentInfo(v) => { - assert_eq!(v.antenna, 18); - assert_eq!(v.azimuth, 161); - assert_eq!(v.elevation, 2); + assert_eq!(v.antenna, 10); + assert_eq!(v.azimuth, 168); + assert_eq!(v.elevation, 4); } DeploymentInfo::CbrsDeploymentInfo(_) => panic!(), }; - // Assert that original gateway was returned assert_eq!( u64::from_str_radix(&gw_info.metadata.clone().unwrap().location, 16).unwrap(), loc_original From 507a18d8eb9ecfde77d762ef71bb4850ed6d6d17 Mon Sep 17 00:00:00 2001 From: Connor McKenzie Date: Wed, 22 Oct 2025 13:22:43 +0100 Subject: [PATCH 14/33] Fixed formatting errors --- mobile_config/src/gateway/service/mod.rs | 18 +++++++++++------- .../tests/integrations/gateway_service.rs | 14 ++++++++------ 2 files changed, 19 insertions(+), 13 deletions(-) diff --git a/mobile_config/src/gateway/service/mod.rs b/mobile_config/src/gateway/service/mod.rs index 5f88b95de..07dd0b69f 100644 --- a/mobile_config/src/gateway/service/mod.rs +++ b/mobile_config/src/gateway/service/mod.rs @@ -1,5 +1,5 @@ use crate::{ - gateway::service::{info::DeviceType, info_v3::DeviceTypeV2, info::GatewayInfo}, + gateway::service::{info::DeviceType, info::GatewayInfo, info_v3::DeviceTypeV2}, key_cache::KeyCache, telemetry, verify_public_key, GrpcResult, GrpcStreamResult, }; @@ -56,7 +56,7 @@ impl GatewayService { &self, request: &R, signer: &Vec, - address: &[u8] + address: &[u8], ) -> Result<(), Status> where R: MsgVerify, @@ -166,7 +166,10 @@ impl mobile_config::Gateway for GatewayService { ) } - async fn info_historical(&self, request: Request) -> GrpcResult { + async fn info_historical( + &self, + request: Request, + ) -> GrpcResult { let request = request.into_inner(); telemetry::count_request("gateway", "info-v2"); custom_tracing::record_b58("pub_key", &request.address); @@ -175,7 +178,10 @@ impl mobile_config::Gateway for GatewayService { self.verify_request_signature_for_info(&request, &request.signer, &request.address)?; let pubkey: PublicKeyBinary = request.address.into(); - tracing::debug!(pubkey = pubkey.to_string(), "fetching historical gateway info (v2)"); + tracing::debug!( + pubkey = pubkey.to_string(), + "fetching historical gateway info (v2)" + ); let query_time = Utc .timestamp_opt(request.query_time as i64, 0) @@ -184,9 +190,7 @@ impl mobile_config::Gateway for GatewayService { info::get_by_address_and_inserted_at(&self.pool, &pubkey, &query_time) .await - .map_err(|_| { - Status::internal("error fetching historical gateway info") - })? + .map_err(|_| Status::internal("error fetching historical gateway info"))? .map_or_else( || { telemetry::count_gateway_chain_lookup("not-found"); diff --git a/mobile_config/tests/integrations/gateway_service.rs b/mobile_config/tests/integrations/gateway_service.rs index d46898983..be40ffd98 100644 --- a/mobile_config/tests/integrations/gateway_service.rs +++ b/mobile_config/tests/integrations/gateway_service.rs @@ -862,14 +862,12 @@ async fn gateway_historical_info(pool: PgPool) -> anyhow::Result<()> { }; gateway_recent.insert(&pool).await?; - let (addr, _handle) = - spawn_gateway_service(pool.clone(), admin_key.public_key().clone()).await; + let (addr, _handle) = spawn_gateway_service(pool.clone(), admin_key.public_key().clone()).await; let mut client = GatewayClient::connect(addr).await?; // Get most recent gateway info let query_time = Utc::now() + Duration::minutes(10); - let res = - info_historical_request(&mut client, &address_recent, &admin_key, &query_time).await; + let res = info_historical_request(&mut client, &address_recent, &admin_key, &query_time).await; // Assert that recent gateway was returned let gw_info = res?.info.unwrap(); @@ -889,8 +887,12 @@ async fn gateway_historical_info(pool: PgPool) -> anyhow::Result<()> { ); // Get original gateway info by using an earlier inserted_at condition - let res = - info_historical_request(&mut client, &address_original, &admin_key, &query_time_original).await; + let res = info_historical_request( + &mut client, + &address_original, + &admin_key, + &query_time_original, + ).await; // Assert that original gateway was returned let gw_info = res?.info.unwrap(); From 8c8f3747de993b0b1d22f9e55d41cd0094fc2235 Mon Sep 17 00:00:00 2001 From: Connor McKenzie Date: Wed, 22 Oct 2025 13:25:22 +0100 Subject: [PATCH 15/33] Fixed formatting errors --- mobile_config/tests/integrations/gateway_service.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/mobile_config/tests/integrations/gateway_service.rs b/mobile_config/tests/integrations/gateway_service.rs index be40ffd98..810902ca3 100644 --- a/mobile_config/tests/integrations/gateway_service.rs +++ b/mobile_config/tests/integrations/gateway_service.rs @@ -892,7 +892,8 @@ async fn gateway_historical_info(pool: PgPool) -> anyhow::Result<()> { &address_original, &admin_key, &query_time_original, - ).await; + ) + .await; // Assert that original gateway was returned let gw_info = res?.info.unwrap(); From 9cdf3aff1ec3a536089a15bd47fd91c6e09236a2 Mon Sep 17 00:00:00 2001 From: Connor McKenzie Date: Wed, 22 Oct 2025 13:45:06 +0100 Subject: [PATCH 16/33] Increased sleep in historical info test --- mobile_config/src/gateway/service/mod.rs | 2 +- mobile_config/tests/integrations/gateway_service.rs | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/mobile_config/src/gateway/service/mod.rs b/mobile_config/src/gateway/service/mod.rs index 07dd0b69f..a18cf8ccd 100644 --- a/mobile_config/src/gateway/service/mod.rs +++ b/mobile_config/src/gateway/service/mod.rs @@ -55,7 +55,7 @@ impl GatewayService { fn verify_request_signature_for_info( &self, request: &R, - signer: &Vec, + signer: &[u8], address: &[u8], ) -> Result<(), Status> where diff --git a/mobile_config/tests/integrations/gateway_service.rs b/mobile_config/tests/integrations/gateway_service.rs index 810902ca3..2e720275a 100644 --- a/mobile_config/tests/integrations/gateway_service.rs +++ b/mobile_config/tests/integrations/gateway_service.rs @@ -839,8 +839,8 @@ async fn gateway_historical_info(pool: PgPool) -> anyhow::Result<()> { }; gateway_original.insert(&pool).await?; - let query_time_original = Utc::now() + Duration::milliseconds(800); - tokio::time::sleep(time::Duration::from_millis(800)).await; + let query_time_original = Utc::now() + Duration::milliseconds(1200); + tokio::time::sleep(time::Duration::from_millis(1500)).await; let address_recent = make_keypair().public_key().clone(); let loc_recent = 631711281837647358_u64; From 7f6003d34dc642c0a393c542b1b2f7e74467ed0a Mon Sep 17 00:00:00 2001 From: Connor McKenzie Date: Thu, 23 Oct 2025 12:01:15 +0100 Subject: [PATCH 17/33] Tests cleanup, removed println, changed assert! to assert_eq --- .../common/gateway_metadata_db.rs | 13 ++--- .../integrations/common/partial_migrator.rs | 31 +++++------- .../tests/integrations/gateway_tracker.rs | 11 ++--- .../tests/integrations/migrations.rs | 47 +++++++++++-------- 4 files changed, 48 insertions(+), 54 deletions(-) diff --git a/mobile_config/tests/integrations/common/gateway_metadata_db.rs b/mobile_config/tests/integrations/common/gateway_metadata_db.rs index 0d07c77a0..40ea78a5e 100644 --- a/mobile_config/tests/integrations/common/gateway_metadata_db.rs +++ b/mobile_config/tests/integrations/common/gateway_metadata_db.rs @@ -21,11 +21,9 @@ pub async fn insert_gateway_bulk( ) -> anyhow::Result<()> { stream::iter(gateways.chunks(chunk_size)) .map(Ok) // convert chunks to a Result for try_for_each_concurrent - .try_for_each_concurrent(Some(20), |chunk| { + .try_for_each_concurrent(20, |chunk| { let pool = pool.clone(); async move { - let mut tx = pool.begin().await?; - // insert mobile_hotspot_infos let mut qb = QueryBuilder::::new( r#" @@ -58,7 +56,7 @@ pub async fn insert_gateway_bulk( .push_bind(num_locations); }); - qb.build().execute(&mut *tx).await?; + qb.build().execute(&pool).await?; // insert key_to_assets let mut qb1 = QueryBuilder::::new( @@ -74,9 +72,7 @@ pub async fn insert_gateway_bulk( b.push_bind(&gw.asset).push_bind(b58); }); - qb1.build().execute(&mut *tx).await?; - - tx.commit().await?; + qb1.build().execute(&pool).await?; Ok::<_, anyhow::Error>(()) } @@ -91,6 +87,7 @@ pub async fn update_gateway( asset: &str, location: i64, refreshed_at: DateTime, + num_location_asserts: i32, ) -> anyhow::Result<()> { sqlx::query( r#" @@ -102,7 +99,7 @@ pub async fn update_gateway( "#, ) .bind(location) - .bind(2) + .bind(num_location_asserts) .bind(refreshed_at) .bind(asset) .execute(pool) diff --git a/mobile_config/tests/integrations/common/partial_migrator.rs b/mobile_config/tests/integrations/common/partial_migrator.rs index 3d9c38a8a..3c3b9bacc 100644 --- a/mobile_config/tests/integrations/common/partial_migrator.rs +++ b/mobile_config/tests/integrations/common/partial_migrator.rs @@ -3,33 +3,28 @@ use sqlx::{ migrate::{Migration, Migrator}, PgPool, }; -use std::path::Path; pub struct PartialMigrator { pool: PgPool, versions: Vec, - path: String, + migrator: Migrator, } impl PartialMigrator { - pub async fn new( - pool: PgPool, - versions: Vec, - path: Option, - ) -> anyhow::Result { - let count: (i64,) = sqlx::query_as("SELECT COUNT(*) FROM _sqlx_migrations") + pub async fn new(pool: PgPool, versions: Vec) -> anyhow::Result { + let count: i64 = sqlx::query_scalar("SELECT COUNT(*) FROM _sqlx_migrations") .fetch_one(&pool) .await - .unwrap_or((0,)); + .unwrap_or(0); - if count.0 > 0 { + if count > 0 { anyhow::bail!("PartialMigrator: database already has applied migrations. Did you forget `migrations = false`?"); } Ok(Self { pool, versions, - path: path.unwrap_or_else(|| "./migrations".to_string()), + migrator: sqlx::migrate!(), }) } @@ -41,32 +36,28 @@ impl PartialMigrator { tmp_migrator.run(&self.pool).await?; } - let migrator = Migrator::new(Path::new(&self.path)).await?; - // Mark skipped migrations as applied first - for m in migrator.iter() { + for m in self.migrator.iter() { if self.versions.contains(&m.version) { - println!("⏭️ Skipping migration {} {}", m.version, m.description); + tracing::info!("⏭️ Skipping migration {} {}", m.version, m.description); self.skip_migration(m).await?; } } // Now run the migrator normally - migrator.run(&self.pool).await?; + self.migrator.run(&self.pool).await?; Ok(()) } pub async fn run_skipped(&self) -> anyhow::Result<()> { - let migrator = Migrator::new(Path::new(&self.path)).await?; - - println!("Re applaying skipped migrations... {:?}", self.versions); + tracing::info!("Re applaying skipped migrations... {:?}", self.versions); // Delete skipped migrations first self.delete_skipped().await?; // Now run the migrator normally - migrator.run(&self.pool).await?; + self.migrator.run(&self.pool).await?; Ok(()) } diff --git a/mobile_config/tests/integrations/gateway_tracker.rs b/mobile_config/tests/integrations/gateway_tracker.rs index 82057f97f..bd9db2284 100644 --- a/mobile_config/tests/integrations/gateway_tracker.rs +++ b/mobile_config/tests/integrations/gateway_tracker.rs @@ -1,6 +1,5 @@ use crate::common::{gateway_metadata_db, make_keypair}; use chrono::{Timelike, Utc}; -use custom_tracing::Settings; use mobile_config::gateway::{ db::{Gateway, GatewayType}, tracker, @@ -9,12 +8,10 @@ use rand::{seq::SliceRandom, thread_rng}; use sqlx::PgPool; #[sqlx::test] -async fn execute_test(pool: PgPool) -> anyhow::Result<()> { +async fn gateway_tracker_test(pool: PgPool) -> anyhow::Result<()> { // Tested with 100k const TOTAL: usize = 10_000; - custom_tracing::init("mobile_config=debug,info".to_string(), Settings::default()).await?; - let now = Utc::now() .with_nanosecond(Utc::now().timestamp_subsec_micros() * 1000) .unwrap(); @@ -80,7 +77,7 @@ async fn execute_test(pool: PgPool) -> anyhow::Result<()> { assert_eq!(gateway.location_asserts, gw_insert.location.map(|_| 1)); // Update sample gateways - gateway_metadata_db::update_gateway(&pool, &gw_insert.asset, new_loc, now).await?; + gateway_metadata_db::update_gateway(&pool, &gw_insert.asset, new_loc, now, 2).await?; } // now run the tracker again after updates @@ -112,7 +109,7 @@ async fn execute_test(pool: PgPool) -> anyhow::Result<()> { } async fn count_gateways(pool: &PgPool) -> anyhow::Result { - let count: (i64,) = sqlx::query_as( + let count = sqlx::query_scalar( r#" SELECT COUNT(*) FROM gateways; "#, @@ -120,5 +117,5 @@ async fn count_gateways(pool: &PgPool) -> anyhow::Result { .fetch_one(pool) .await?; - Ok(count.0) + Ok(count) } diff --git a/mobile_config/tests/integrations/migrations.rs b/mobile_config/tests/integrations/migrations.rs index b0cfacd78..d09fb7642 100644 --- a/mobile_config/tests/integrations/migrations.rs +++ b/mobile_config/tests/integrations/migrations.rs @@ -6,7 +6,7 @@ use sqlx::PgPool; #[sqlx::test(migrations = false)] async fn gateways_historical(pool: PgPool) -> anyhow::Result<()> { - let partial_migrator = PartialMigrator::new(pool.clone(), vec![20251003000000], None).await?; + let partial_migrator = PartialMigrator::new(pool.clone(), vec![20251003000000]).await?; partial_migrator.run_partial().await?; @@ -38,26 +38,35 @@ async fn gateways_historical(pool: PgPool) -> anyhow::Result<()> { .await? .expect("should find gateway"); - println!("pre_gw: {:?}", pre_gw); - println!("gw: {:?}", gw); - - assert!(pre_gw.address == gw.address); - assert!(pre_gw.gateway_type == gw.gateway_type); - assert!(common::nanos_trunc(pre_gw.created_at) == common::nanos_trunc(gw.created_at)); + assert_eq!(pre_gw.address, gw.address); + assert_eq!(pre_gw.gateway_type, gw.gateway_type); + assert_eq!( + common::nanos_trunc(pre_gw.created_at), + common::nanos_trunc(gw.created_at) + ); // The real change is updated_at renamed to inserted_at AND inserted_at = created_at; - assert!(common::nanos_trunc(pre_gw.created_at) == common::nanos_trunc(gw.inserted_at)); - assert!(common::nanos_trunc(pre_gw.refreshed_at) == common::nanos_trunc(gw.refreshed_at)); - assert!(common::nanos_trunc(pre_gw.last_changed_at) == common::nanos_trunc(gw.last_changed_at)); - assert!(pre_gw.hash == gw.hash); - assert!(pre_gw.antenna == gw.antenna); - assert!(pre_gw.elevation == gw.elevation); - assert!(pre_gw.azimuth == gw.azimuth); - assert!(pre_gw.location == gw.location); - assert!( - common::nanos_trunc(pre_gw.location_changed_at.unwrap()) - == common::nanos_trunc(gw.location_changed_at.unwrap()) + assert_eq!( + common::nanos_trunc(pre_gw.created_at), + common::nanos_trunc(gw.inserted_at) + ); + assert_eq!( + common::nanos_trunc(pre_gw.refreshed_at), + common::nanos_trunc(gw.refreshed_at) + ); + assert_eq!( + common::nanos_trunc(pre_gw.last_changed_at), + common::nanos_trunc(gw.last_changed_at) + ); + assert_eq!(pre_gw.hash, gw.hash); + assert_eq!(pre_gw.antenna, gw.antenna); + assert_eq!(pre_gw.elevation, gw.elevation); + assert_eq!(pre_gw.azimuth, gw.azimuth); + assert_eq!(pre_gw.location, gw.location); + assert_eq!( + common::nanos_trunc(pre_gw.location_changed_at.unwrap()), + common::nanos_trunc(gw.location_changed_at.unwrap()) ); - assert!(pre_gw.location_asserts == gw.location_asserts); + assert_eq!(pre_gw.location_asserts, gw.location_asserts); Ok(()) } From 01376f0a96237e922d8ef3de5a9b6d39ae086257 Mon Sep 17 00:00:00 2001 From: Connor McKenzie Date: Thu, 23 Oct 2025 21:46:51 +0100 Subject: [PATCH 18/33] Removed sleep from test --- .../tests/integrations/gateway_service.rs | 52 ++++++++++++++----- 1 file changed, 39 insertions(+), 13 deletions(-) diff --git a/mobile_config/tests/integrations/gateway_service.rs b/mobile_config/tests/integrations/gateway_service.rs index 2e720275a..941bfc038 100644 --- a/mobile_config/tests/integrations/gateway_service.rs +++ b/mobile_config/tests/integrations/gateway_service.rs @@ -1,7 +1,7 @@ use crate::common::{make_keypair, spawn_gateway_service}; use chrono::{DateTime, Duration, Utc}; use futures::stream::StreamExt; -use helium_crypto::{Keypair, PublicKey, Sign}; +use helium_crypto::{Keypair, PublicKey, PublicKeyBinary, Sign}; use helium_proto::services::mobile_config::{ self as proto, gateway_metadata_v2::DeploymentInfo, DeviceType, GatewayClient, GatewayInfoStreamReqV1, GatewayInfoStreamReqV2, GatewayInfoStreamResV1, GatewayInfoStreamResV2, @@ -816,14 +816,15 @@ async fn gateway_info_v2(pool: PgPool) -> anyhow::Result<()> { async fn gateway_historical_info(pool: PgPool) -> anyhow::Result<()> { let admin_key = make_keypair(); - let address_original = make_keypair().public_key().clone(); + let address = make_keypair().public_key().clone(); let loc_original = 631711281837647359_u64; + let loc_recent = 631711281837647358_u64; let created_at = Utc::now() - Duration::hours(5); let refreshed_at = Utc::now() - Duration::hours(3); let gateway_original = Gateway { - address: address_original.clone().into(), + address: address.clone().into(), gateway_type: GatewayType::WifiIndoor, created_at, inserted_at: refreshed_at, @@ -839,14 +840,17 @@ async fn gateway_historical_info(pool: PgPool) -> anyhow::Result<()> { }; gateway_original.insert(&pool).await?; - let query_time_original = Utc::now() + Duration::milliseconds(1200); - tokio::time::sleep(time::Duration::from_millis(1500)).await; + let pubkey = address.clone().into(); - let address_recent = make_keypair().public_key().clone(); - let loc_recent = 631711281837647358_u64; + // Change original gateway's inserted_at value to 10 minutes ago + let new_inserted_at = Utc::now() - Duration::minutes(10); + update_gateway_inserted_at(&pool, &pubkey, &new_inserted_at).await?; + + let query_time_original = Utc::now(); + println!("query time original: {:?}", query_time_original); let gateway_recent = Gateway { - address: address_recent.clone().into(), + address: address.clone().into(), gateway_type: GatewayType::WifiIndoor, created_at, inserted_at: created_at, @@ -866,12 +870,13 @@ async fn gateway_historical_info(pool: PgPool) -> anyhow::Result<()> { let mut client = GatewayClient::connect(addr).await?; // Get most recent gateway info - let query_time = Utc::now() + Duration::minutes(10); - let res = info_historical_request(&mut client, &address_recent, &admin_key, &query_time).await; + let query_time_recent = Utc::now() + Duration::minutes(10); + println!("query_time_recent: {:?}", query_time_recent); + let res = info_historical_request(&mut client, &address, &admin_key, &query_time_recent).await; // Assert that recent gateway was returned let gw_info = res?.info.unwrap(); - assert_eq!(gw_info.address, address_recent.to_vec()); + assert_eq!(gw_info.address, address.to_vec()); let deployment_info = gw_info.metadata.clone().unwrap().deployment_info.unwrap(); match deployment_info { DeploymentInfo::WifiDeploymentInfo(v) => { @@ -889,7 +894,7 @@ async fn gateway_historical_info(pool: PgPool) -> anyhow::Result<()> { // Get original gateway info by using an earlier inserted_at condition let res = info_historical_request( &mut client, - &address_original, + &address, &admin_key, &query_time_original, ) @@ -897,7 +902,7 @@ async fn gateway_historical_info(pool: PgPool) -> anyhow::Result<()> { // Assert that original gateway was returned let gw_info = res?.info.unwrap(); - assert_eq!(gw_info.address, address_original.to_vec()); + assert_eq!(gw_info.address, address.to_vec()); let deployment_info = gw_info.metadata.clone().unwrap().deployment_info.unwrap(); match deployment_info { DeploymentInfo::WifiDeploymentInfo(v) => { @@ -1043,3 +1048,24 @@ async fn info_batch_v2( Ok(stream) } + + +async fn update_gateway_inserted_at( + pool: &PgPool, + address: &PublicKeyBinary, + new_inserted_at: &DateTime +) -> anyhow::Result<()> { + sqlx::query( + r#" + UPDATE gateways + SET inserted_at = $1 + WHERE address = $2; + "# + ) + .bind(new_inserted_at) + .bind(address.as_ref()) + .fetch_optional(pool) + .await?; + + Ok(()) +} \ No newline at end of file From 5c7eb381d94d227c8b305a2e98beed7d03c354f6 Mon Sep 17 00:00:00 2001 From: Connor McKenzie Date: Thu, 23 Oct 2025 22:10:21 +0100 Subject: [PATCH 19/33] Updated gateway tracker test name & reduced test size --- .../tests/integrations/gateway_service.rs | 18 ++++++------------ .../tests/integrations/gateway_tracker.rs | 5 ++--- 2 files changed, 8 insertions(+), 15 deletions(-) diff --git a/mobile_config/tests/integrations/gateway_service.rs b/mobile_config/tests/integrations/gateway_service.rs index 941bfc038..bc9efbba3 100644 --- a/mobile_config/tests/integrations/gateway_service.rs +++ b/mobile_config/tests/integrations/gateway_service.rs @@ -16,7 +16,7 @@ use mobile_config::{ }; use prost::Message; use sqlx::PgPool; -use std::{sync::Arc, time, vec}; +use std::{sync::Arc, vec}; use tokio::net::TcpListener; use tonic::{transport, Code}; @@ -892,13 +892,8 @@ async fn gateway_historical_info(pool: PgPool) -> anyhow::Result<()> { ); // Get original gateway info by using an earlier inserted_at condition - let res = info_historical_request( - &mut client, - &address, - &admin_key, - &query_time_original, - ) - .await; + let res = + info_historical_request(&mut client, &address, &admin_key, &query_time_original).await; // Assert that original gateway was returned let gw_info = res?.info.unwrap(); @@ -1049,18 +1044,17 @@ async fn info_batch_v2( Ok(stream) } - async fn update_gateway_inserted_at( pool: &PgPool, address: &PublicKeyBinary, - new_inserted_at: &DateTime + new_inserted_at: &DateTime, ) -> anyhow::Result<()> { sqlx::query( r#" UPDATE gateways SET inserted_at = $1 WHERE address = $2; - "# + "#, ) .bind(new_inserted_at) .bind(address.as_ref()) @@ -1068,4 +1062,4 @@ async fn update_gateway_inserted_at( .await?; Ok(()) -} \ No newline at end of file +} diff --git a/mobile_config/tests/integrations/gateway_tracker.rs b/mobile_config/tests/integrations/gateway_tracker.rs index bd9db2284..c356553ec 100644 --- a/mobile_config/tests/integrations/gateway_tracker.rs +++ b/mobile_config/tests/integrations/gateway_tracker.rs @@ -8,9 +8,8 @@ use rand::{seq::SliceRandom, thread_rng}; use sqlx::PgPool; #[sqlx::test] -async fn gateway_tracker_test(pool: PgPool) -> anyhow::Result<()> { - // Tested with 100k - const TOTAL: usize = 10_000; +async fn test_gateway_tracker_updates_changed_gateways(pool: PgPool) -> anyhow::Result<()> { + const TOTAL: usize = 2_000; let now = Utc::now() .with_nanosecond(Utc::now().timestamp_subsec_micros() * 1000) From 7556b567ebb70c231dfa6ba5148498dba6e772b7 Mon Sep 17 00:00:00 2001 From: Connor McKenzie Date: Thu, 23 Oct 2025 22:43:12 +0100 Subject: [PATCH 20/33] Removed println in tests --- mobile_config/tests/integrations/common/partial_migrator.rs | 2 +- mobile_config/tests/integrations/gateway_service.rs | 4 +--- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/mobile_config/tests/integrations/common/partial_migrator.rs b/mobile_config/tests/integrations/common/partial_migrator.rs index 3c3b9bacc..de90e5788 100644 --- a/mobile_config/tests/integrations/common/partial_migrator.rs +++ b/mobile_config/tests/integrations/common/partial_migrator.rs @@ -51,7 +51,7 @@ impl PartialMigrator { } pub async fn run_skipped(&self) -> anyhow::Result<()> { - tracing::info!("Re applaying skipped migrations... {:?}", self.versions); + tracing::info!("Re applying skipped migrations... {:?}", self.versions); // Delete skipped migrations first self.delete_skipped().await?; diff --git a/mobile_config/tests/integrations/gateway_service.rs b/mobile_config/tests/integrations/gateway_service.rs index bc9efbba3..6b1d51abd 100644 --- a/mobile_config/tests/integrations/gateway_service.rs +++ b/mobile_config/tests/integrations/gateway_service.rs @@ -847,7 +847,6 @@ async fn gateway_historical_info(pool: PgPool) -> anyhow::Result<()> { update_gateway_inserted_at(&pool, &pubkey, &new_inserted_at).await?; let query_time_original = Utc::now(); - println!("query time original: {:?}", query_time_original); let gateway_recent = Gateway { address: address.clone().into(), @@ -871,7 +870,6 @@ async fn gateway_historical_info(pool: PgPool) -> anyhow::Result<()> { // Get most recent gateway info let query_time_recent = Utc::now() + Duration::minutes(10); - println!("query_time_recent: {:?}", query_time_recent); let res = info_historical_request(&mut client, &address, &admin_key, &query_time_recent).await; // Assert that recent gateway was returned @@ -1058,7 +1056,7 @@ async fn update_gateway_inserted_at( ) .bind(new_inserted_at) .bind(address.as_ref()) - .fetch_optional(pool) + .execute(pool) .await?; Ok(()) From f7bec6ab12db99ddb22097b59d3263d80a2d5c55 Mon Sep 17 00:00:00 2001 From: Connor McKenzie Date: Fri, 24 Oct 2025 14:32:57 +0100 Subject: [PATCH 21/33] Add info_historical command to mobile_config_cli --- mobile_config_cli/src/client.rs | 26 ++++++++++++++++++++++++-- mobile_config_cli/src/cmds/gateway.rs | 16 +++++++++++++++- mobile_config_cli/src/cmds/mod.rs | 16 ++++++++++++++++ mobile_config_cli/src/main.rs | 1 + 4 files changed, 56 insertions(+), 3 deletions(-) diff --git a/mobile_config_cli/src/client.rs b/mobile_config_cli/src/client.rs index 7a74a66ab..9fa8cc5a1 100644 --- a/mobile_config_cli/src/client.rs +++ b/mobile_config_cli/src/client.rs @@ -12,8 +12,8 @@ use helium_proto::{ AdminAddKeyReqV1, AdminKeyResV1, AdminRemoveKeyReqV1, AuthorizationListReqV1, AuthorizationListResV1, AuthorizationVerifyReqV1, AuthorizationVerifyResV1, CarrierIncentivePromotionListReqV1, CarrierIncentivePromotionListResV1, EntityVerifyReqV1, - EntityVerifyResV1, GatewayInfoBatchReqV1, GatewayInfoReqV1, GatewayInfoResV2, - GatewayInfoStreamResV2, + EntityVerifyResV1, GatewayInfoBatchReqV1, GatewayInfoHistoricalReqV1, GatewayInfoReqV1, + GatewayInfoResV2, GatewayInfoStreamResV2, }, Message, }; @@ -269,6 +269,27 @@ impl GatewayClient { Ok(stream) } + + pub async fn info_historical( + &mut self, + gateway: &PublicKey, + query_time: u64, + keypair: &Keypair, + ) -> Result { + let mut request = GatewayInfoHistoricalReqV1 { + address: gateway.into(), + query_time, + signer: keypair.public_key().into(), + signature: vec![], + }; + request.signature = request.sign(keypair)?; + let response = self.client.info_historical(request).await?.into_inner(); + response.verify(&self.server_pubkey)?; + let info = response + .info + .ok_or_else(|| anyhow::anyhow!("gateway not found"))?; + GatewayInfo::try_from(info) + } } pub trait MsgSign: Message + std::clone::Clone { @@ -296,6 +317,7 @@ impl_sign!(AuthorizationListReqV1, signature); impl_sign!(EntityVerifyReqV1, signature); impl_sign!(GatewayInfoReqV1, signature); impl_sign!(GatewayInfoBatchReqV1, signature); +impl_sign!(GatewayInfoHistoricalReqV1, signature); impl_sign!(CarrierIncentivePromotionListReqV1, signature); pub trait MsgVerify: Message + std::clone::Clone { diff --git a/mobile_config_cli/src/cmds/gateway.rs b/mobile_config_cli/src/cmds/gateway.rs index 3f74e4a7e..2ec05225b 100644 --- a/mobile_config_cli/src/cmds/gateway.rs +++ b/mobile_config_cli/src/cmds/gateway.rs @@ -1,4 +1,4 @@ -use super::{GetHotspot, GetHotspotBatch, PathBufKeypair}; +use super::{GetHotspot, GetHotspotBatch, GetHotspotHistorical, PathBufKeypair}; use crate::{client, Msg, PrettyJson, Result}; use angry_purple_tiger::AnimalName; use futures::StreamExt; @@ -59,6 +59,20 @@ pub async fn info_batch(args: GetHotspotBatch) -> Result { } } +pub async fn info_historical(args: GetHotspotHistorical) -> Result { + let mut client = client::GatewayClient::new(&args.config_host, &args.config_pubkey).await?; + match client + .info_historical(&args.hotspot, args.query_time, &args.keypair.to_keypair()?) + .await + { + Ok(info) => Msg::ok(info.pretty_json()?), + Err(err) => Msg::err(format!( + "failed to retrieve {} info: {}", + &args.hotspot, err + )), + } +} + impl TryFrom for GatewayInfo { type Error = anyhow::Error; diff --git a/mobile_config_cli/src/cmds/mod.rs b/mobile_config_cli/src/cmds/mod.rs index 65baf823c..bb7e948bc 100644 --- a/mobile_config_cli/src/cmds/mod.rs +++ b/mobile_config_cli/src/cmds/mod.rs @@ -167,6 +167,8 @@ pub enum GatewayCommands { /// Retrieve the on-chain registered info for the batch of hotspots /// requested by list of Public Key Binaries InfoBatch(GetHotspotBatch), + /// Retrieve the on-chain registered info for the hotspot at a timestamp + InfoHistorical(GetHotspotHistorical), } #[derive(Debug, Args)] @@ -195,6 +197,20 @@ pub struct GetHotspotBatch { pub config_pubkey: String, } +#[derive(Debug, Args)] +pub struct GetHotspotHistorical { + #[arg(long)] + pub hotspot: PublicKey, + #[arg(long)] + pub query_time: u64, + #[arg(from_global)] + pub keypair: PathBuf, + #[arg(from_global)] + pub config_host: String, + #[arg(from_global)] + pub config_pubkey: String, +} + #[derive(Debug, Subcommand)] pub enum EnvCommands { /// Make Environment variable to ease use diff --git a/mobile_config_cli/src/main.rs b/mobile_config_cli/src/main.rs index a219dfbdb..c0aabd325 100644 --- a/mobile_config_cli/src/main.rs +++ b/mobile_config_cli/src/main.rs @@ -46,6 +46,7 @@ pub async fn handle_cli(cli: Cli) -> Result { Commands::Gateway { command } => match command { cmds::GatewayCommands::Info(args) => gateway::info(args).await, cmds::GatewayCommands::InfoBatch(args) => gateway::info_batch(args).await, + cmds::GatewayCommands::InfoHistorical(args) => gateway::info_historical(args).await, }, } } From 53078d03efba859ba52da0f82d65016a8067d34d Mon Sep 17 00:00:00 2001 From: Connor McKenzie Date: Fri, 24 Oct 2025 17:12:39 +0100 Subject: [PATCH 22/33] Changed historical info to info_at_timestamp --- file_store/src/traits/msg_verify.rs | 2 +- mobile_config/src/gateway/service/mod.rs | 10 +++++----- mobile_config/tests/integrations/gateway_service.rs | 13 +++++++------ mobile_config_cli/src/client.rs | 10 +++++----- mobile_config_cli/src/cmds/gateway.rs | 6 +++--- mobile_config_cli/src/cmds/mod.rs | 4 ++-- mobile_config_cli/src/main.rs | 2 +- 7 files changed, 24 insertions(+), 23 deletions(-) diff --git a/file_store/src/traits/msg_verify.rs b/file_store/src/traits/msg_verify.rs index 59937268d..526f1e6a9 100644 --- a/file_store/src/traits/msg_verify.rs +++ b/file_store/src/traits/msg_verify.rs @@ -102,7 +102,7 @@ impl_msg_verify!(mobile_config::GatewayInfoStreamResV3, signature); impl_msg_verify!(mobile_config::BoostedHexInfoStreamReqV1, signature); impl_msg_verify!(mobile_config::BoostedHexModifiedInfoStreamReqV1, signature); impl_msg_verify!(mobile_config::BoostedHexInfoStreamResV1, signature); -impl_msg_verify!(mobile_config::GatewayInfoHistoricalReqV1, signature); +impl_msg_verify!(mobile_config::GatewayInfoAtTimestampReqV1, signature); impl_msg_verify!(sub_dao::SubDaoEpochRewardInfoReqV1, signature); impl_msg_verify!(sub_dao::SubDaoEpochRewardInfoResV1, signature); impl_msg_verify!(poc_mobile::SubscriberVerifiedMappingEventReqV1, signature); diff --git a/mobile_config/src/gateway/service/mod.rs b/mobile_config/src/gateway/service/mod.rs index a18cf8ccd..8c8173c2a 100644 --- a/mobile_config/src/gateway/service/mod.rs +++ b/mobile_config/src/gateway/service/mod.rs @@ -12,7 +12,7 @@ use futures::{ use helium_crypto::{Keypair, PublicKey, PublicKeyBinary, Sign}; use helium_proto::{ services::mobile_config::{ - self, GatewayInfoBatchReqV1, GatewayInfoHistoricalReqV1, GatewayInfoReqV1, + self, GatewayInfoAtTimestampReqV1, GatewayInfoBatchReqV1, GatewayInfoReqV1, GatewayInfoResV1, GatewayInfoResV2, GatewayInfoStreamReqV1, GatewayInfoStreamReqV2, GatewayInfoStreamReqV3, GatewayInfoStreamResV1, GatewayInfoStreamResV2, GatewayInfoStreamResV3, GatewayInfoV2, @@ -166,9 +166,9 @@ impl mobile_config::Gateway for GatewayService { ) } - async fn info_historical( + async fn info_at_timestamp( &self, - request: Request, + request: Request, ) -> GrpcResult { let request = request.into_inner(); telemetry::count_request("gateway", "info-v2"); @@ -180,7 +180,7 @@ impl mobile_config::Gateway for GatewayService { let pubkey: PublicKeyBinary = request.address.into(); tracing::debug!( pubkey = pubkey.to_string(), - "fetching historical gateway info (v2)" + "fetching gateway info at timestamp" ); let query_time = Utc @@ -190,7 +190,7 @@ impl mobile_config::Gateway for GatewayService { info::get_by_address_and_inserted_at(&self.pool, &pubkey, &query_time) .await - .map_err(|_| Status::internal("error fetching historical gateway info"))? + .map_err(|_| Status::internal("error fetching gateway info at timestamp"))? .map_or_else( || { telemetry::count_gateway_chain_lookup("not-found"); diff --git a/mobile_config/tests/integrations/gateway_service.rs b/mobile_config/tests/integrations/gateway_service.rs index 6b1d51abd..ddfa8399a 100644 --- a/mobile_config/tests/integrations/gateway_service.rs +++ b/mobile_config/tests/integrations/gateway_service.rs @@ -813,7 +813,7 @@ async fn gateway_info_v2(pool: PgPool) -> anyhow::Result<()> { } #[sqlx::test] -async fn gateway_historical_info(pool: PgPool) -> anyhow::Result<()> { +async fn gateway_info_at_timestamp(pool: PgPool) -> anyhow::Result<()> { let admin_key = make_keypair(); let address = make_keypair().public_key().clone(); @@ -870,7 +870,8 @@ async fn gateway_historical_info(pool: PgPool) -> anyhow::Result<()> { // Get most recent gateway info let query_time_recent = Utc::now() + Duration::minutes(10); - let res = info_historical_request(&mut client, &address, &admin_key, &query_time_recent).await; + let res = + info_at_timestamp_request(&mut client, &address, &admin_key, &query_time_recent).await; // Assert that recent gateway was returned let gw_info = res?.info.unwrap(); @@ -891,7 +892,7 @@ async fn gateway_historical_info(pool: PgPool) -> anyhow::Result<()> { // Get original gateway info by using an earlier inserted_at condition let res = - info_historical_request(&mut client, &address, &admin_key, &query_time_original).await; + info_at_timestamp_request(&mut client, &address, &admin_key, &query_time_original).await; // Assert that original gateway was returned let gw_info = res?.info.unwrap(); @@ -939,20 +940,20 @@ async fn info_request_v2( Ok(res) } -async fn info_historical_request( +async fn info_at_timestamp_request( client: &mut GatewayClient, address: &PublicKey, signer: &Keypair, query_time: &DateTime, ) -> anyhow::Result { - let mut req = proto::GatewayInfoHistoricalReqV1 { + let mut req = proto::GatewayInfoAtTimestampReqV1 { address: address.to_vec(), signer: signer.public_key().to_vec(), signature: vec![], query_time: query_time.timestamp() as u64, }; req.signature = signer.sign(&req.encode_to_vec()).unwrap(); - let res = client.info_historical(req).await?.into_inner(); + let res = client.info_at_timestamp(req).await?.into_inner(); Ok(res) } diff --git a/mobile_config_cli/src/client.rs b/mobile_config_cli/src/client.rs index 9fa8cc5a1..b4c093abb 100644 --- a/mobile_config_cli/src/client.rs +++ b/mobile_config_cli/src/client.rs @@ -12,7 +12,7 @@ use helium_proto::{ AdminAddKeyReqV1, AdminKeyResV1, AdminRemoveKeyReqV1, AuthorizationListReqV1, AuthorizationListResV1, AuthorizationVerifyReqV1, AuthorizationVerifyResV1, CarrierIncentivePromotionListReqV1, CarrierIncentivePromotionListResV1, EntityVerifyReqV1, - EntityVerifyResV1, GatewayInfoBatchReqV1, GatewayInfoHistoricalReqV1, GatewayInfoReqV1, + EntityVerifyResV1, GatewayInfoAtTimestampReqV1, GatewayInfoBatchReqV1, GatewayInfoReqV1, GatewayInfoResV2, GatewayInfoStreamResV2, }, Message, @@ -270,20 +270,20 @@ impl GatewayClient { Ok(stream) } - pub async fn info_historical( + pub async fn info_at_timestamp( &mut self, gateway: &PublicKey, query_time: u64, keypair: &Keypair, ) -> Result { - let mut request = GatewayInfoHistoricalReqV1 { + let mut request = GatewayInfoAtTimestampReqV1 { address: gateway.into(), query_time, signer: keypair.public_key().into(), signature: vec![], }; request.signature = request.sign(keypair)?; - let response = self.client.info_historical(request).await?.into_inner(); + let response = self.client.info_at_timestamp(request).await?.into_inner(); response.verify(&self.server_pubkey)?; let info = response .info @@ -317,7 +317,7 @@ impl_sign!(AuthorizationListReqV1, signature); impl_sign!(EntityVerifyReqV1, signature); impl_sign!(GatewayInfoReqV1, signature); impl_sign!(GatewayInfoBatchReqV1, signature); -impl_sign!(GatewayInfoHistoricalReqV1, signature); +impl_sign!(GatewayInfoAtTimestampReqV1, signature); impl_sign!(CarrierIncentivePromotionListReqV1, signature); pub trait MsgVerify: Message + std::clone::Clone { diff --git a/mobile_config_cli/src/cmds/gateway.rs b/mobile_config_cli/src/cmds/gateway.rs index 2ec05225b..8c45a32ce 100644 --- a/mobile_config_cli/src/cmds/gateway.rs +++ b/mobile_config_cli/src/cmds/gateway.rs @@ -1,4 +1,4 @@ -use super::{GetHotspot, GetHotspotBatch, GetHotspotHistorical, PathBufKeypair}; +use super::{GetHotspot, GetHotspotAtTimestamp, GetHotspotBatch, PathBufKeypair}; use crate::{client, Msg, PrettyJson, Result}; use angry_purple_tiger::AnimalName; use futures::StreamExt; @@ -59,10 +59,10 @@ pub async fn info_batch(args: GetHotspotBatch) -> Result { } } -pub async fn info_historical(args: GetHotspotHistorical) -> Result { +pub async fn info_at_timestamp(args: GetHotspotAtTimestamp) -> Result { let mut client = client::GatewayClient::new(&args.config_host, &args.config_pubkey).await?; match client - .info_historical(&args.hotspot, args.query_time, &args.keypair.to_keypair()?) + .info_at_timestamp(&args.hotspot, args.query_time, &args.keypair.to_keypair()?) .await { Ok(info) => Msg::ok(info.pretty_json()?), diff --git a/mobile_config_cli/src/cmds/mod.rs b/mobile_config_cli/src/cmds/mod.rs index bb7e948bc..0c0808a0c 100644 --- a/mobile_config_cli/src/cmds/mod.rs +++ b/mobile_config_cli/src/cmds/mod.rs @@ -168,7 +168,7 @@ pub enum GatewayCommands { /// requested by list of Public Key Binaries InfoBatch(GetHotspotBatch), /// Retrieve the on-chain registered info for the hotspot at a timestamp - InfoHistorical(GetHotspotHistorical), + InfoAtTimestamp(GetHotspotAtTimestamp), } #[derive(Debug, Args)] @@ -198,7 +198,7 @@ pub struct GetHotspotBatch { } #[derive(Debug, Args)] -pub struct GetHotspotHistorical { +pub struct GetHotspotAtTimestamp { #[arg(long)] pub hotspot: PublicKey, #[arg(long)] diff --git a/mobile_config_cli/src/main.rs b/mobile_config_cli/src/main.rs index c0aabd325..3919055c3 100644 --- a/mobile_config_cli/src/main.rs +++ b/mobile_config_cli/src/main.rs @@ -46,7 +46,7 @@ pub async fn handle_cli(cli: Cli) -> Result { Commands::Gateway { command } => match command { cmds::GatewayCommands::Info(args) => gateway::info(args).await, cmds::GatewayCommands::InfoBatch(args) => gateway::info_batch(args).await, - cmds::GatewayCommands::InfoHistorical(args) => gateway::info_historical(args).await, + cmds::GatewayCommands::InfoAtTimestamp(args) => gateway::info_at_timestamp(args).await, }, } } From e83d7b8552e3878c6d1f34fe7cd08c251cc6836c Mon Sep 17 00:00:00 2001 From: Connor McKenzie Date: Tue, 28 Oct 2025 14:09:07 +0000 Subject: [PATCH 23/33] Update mobile verifiers to use new info_at_timestamp API --- mobile_config/src/gateway/client.rs | 25 +++++++++++-------- mobile_packet_verifier/src/lib.rs | 8 +++++- mobile_verifier/src/heartbeats/mod.rs | 5 +++- mobile_verifier/src/heartbeats/wifi.rs | 2 ++ mobile_verifier/src/lib.rs | 8 +++++- mobile_verifier/src/speedtests.rs | 9 +++++-- .../tests/integrations/boosting_oracles.rs | 2 ++ .../tests/integrations/common/mod.rs | 1 + .../tests/integrations/last_location.rs | 9 +++++++ .../tests/integrations/modeled_coverage.rs | 4 +++ .../tests/integrations/speedtests.rs | 1 + 11 files changed, 59 insertions(+), 15 deletions(-) diff --git a/mobile_config/src/gateway/client.rs b/mobile_config/src/gateway/client.rs index 5c92bedd5..54bfe632b 100644 --- a/mobile_config/src/gateway/client.rs +++ b/mobile_config/src/gateway/client.rs @@ -1,5 +1,6 @@ use crate::client::{call_with_retry, ClientError, Settings}; use crate::gateway::service::info::{GatewayInfo, GatewayInfoStream}; +use chrono::{DateTime, Utc}; use file_store::traits::MsgVerify; use futures::stream::{self, StreamExt}; use helium_crypto::{Keypair, PublicKey, PublicKeyBinary, Sign}; @@ -49,6 +50,7 @@ pub trait GatewayInfoResolver: Clone + Send + Sync + 'static { async fn resolve_gateway_info( &self, address: &PublicKeyBinary, + gateway_query_timestamp: &DateTime, ) -> Result, ClientError>; async fn stream_gateways_info( @@ -62,27 +64,30 @@ impl GatewayInfoResolver for GatewayClient { async fn resolve_gateway_info( &self, address: &PublicKeyBinary, + gateway_query_timestamp: &DateTime, ) -> Result, ClientError> { if let Some(cached_response) = self.cache.get(address).await { return Ok(cached_response.value().clone()); } - let mut request = mobile_config::GatewayInfoReqV1 { + let mut request = mobile_config::GatewayInfoAtTimestampReqV1 { address: address.clone().into(), signer: self.signing_key.public_key().into(), signature: vec![], + query_time: gateway_query_timestamp.clone().timestamp() as u64, }; request.signature = self.signing_key.sign(&request.encode_to_vec())?; tracing::debug!(pubkey = address.to_string(), "fetching gateway info"); - let response = match call_with_retry!(self.client.clone().info_v2(request.clone())) { - Ok(info_res) => { - let response = info_res.into_inner(); - response.verify(&self.config_pubkey)?; - response.info.map(GatewayInfo::try_from).transpose()? - } - Err(status) if status.code() == tonic::Code::NotFound => None, - Err(status) => Err(status)?, - }; + let response = + match call_with_retry!(self.client.clone().info_at_timestamp(request.clone())) { + Ok(info_res) => { + let response = info_res.into_inner(); + response.verify(&self.config_pubkey)?; + response.info.map(GatewayInfo::try_from).transpose()? + } + Err(status) if status.code() == tonic::Code::NotFound => None, + Err(status) => Err(status)?, + }; self.cache .insert(address.clone(), response.clone(), self.cache_ttl) diff --git a/mobile_packet_verifier/src/lib.rs b/mobile_packet_verifier/src/lib.rs index 0a02cd8b9..d96592300 100644 --- a/mobile_packet_verifier/src/lib.rs +++ b/mobile_packet_verifier/src/lib.rs @@ -1,5 +1,6 @@ extern crate tls_init; +use chrono::Utc; use helium_crypto::PublicKeyBinary; use helium_proto::services::mobile_config::NetworkKeyRole; use mobile_config::{ @@ -50,7 +51,12 @@ pub trait MobileConfigResolverExt { #[async_trait::async_trait] impl MobileConfigResolverExt for MobileConfigClients { async fn is_gateway_known(&self, public_key: &PublicKeyBinary) -> bool { - match self.gateway_client.resolve_gateway_info(public_key).await { + let gateway_query_timestamp = Utc::now(); + match self + .gateway_client + .resolve_gateway_info(public_key, &gateway_query_timestamp) + .await + { Ok(res) => res.is_some(), Err(_err) => false, } diff --git a/mobile_verifier/src/heartbeats/mod.rs b/mobile_verifier/src/heartbeats/mod.rs index 3a3e79c2c..50c32b2f6 100644 --- a/mobile_verifier/src/heartbeats/mod.rs +++ b/mobile_verifier/src/heartbeats/mod.rs @@ -296,6 +296,7 @@ impl ValidatedHeartbeat { max_distance_to_coverage: u32, epoch: &Range>, geofence: &impl GeofenceValidator, + gateway_query_timestamp: &DateTime, ) -> anyhow::Result { let Some(coverage_object) = heartbeat.coverage_object else { return Ok(Self::new( @@ -377,7 +378,7 @@ impl ValidatedHeartbeat { } match gateway_info_resolver - .resolve_gateway(&heartbeat.hotspot_key) + .resolve_gateway(&heartbeat.hotspot_key, gateway_query_timestamp) .await? { GatewayResolution::DataOnly => Ok(Self::new( @@ -488,6 +489,7 @@ impl ValidatedHeartbeat { max_distance_to_coverage: u32, epoch: &'a Range>, geofence: &'a impl GeofenceValidator, + gateway_query_timestamp: &'a DateTime, ) -> impl Stream> + 'a { heartbeats.then(move |heartbeat| async move { Self::validate( @@ -498,6 +500,7 @@ impl ValidatedHeartbeat { max_distance_to_coverage, epoch, geofence, + gateway_query_timestamp, ) .await }) diff --git a/mobile_verifier/src/heartbeats/wifi.rs b/mobile_verifier/src/heartbeats/wifi.rs index 0aa5577be..a867834a4 100644 --- a/mobile_verifier/src/heartbeats/wifi.rs +++ b/mobile_verifier/src/heartbeats/wifi.rs @@ -152,6 +152,7 @@ where .into_stream(&mut transaction) .await? .map(Heartbeat::from); + let gateway_query_timestamp = Utc::now(); process_validated_heartbeats( ValidatedHeartbeat::validate_heartbeats( heartbeats, @@ -161,6 +162,7 @@ where self.max_distance_to_coverage, &epoch, &self.geofence, + &gateway_query_timestamp, ), heartbeat_cache, coverage_claim_time_cache, diff --git a/mobile_verifier/src/lib.rs b/mobile_verifier/src/lib.rs index bbdc58c30..2cfb0f1e4 100644 --- a/mobile_verifier/src/lib.rs +++ b/mobile_verifier/src/lib.rs @@ -22,6 +22,7 @@ pub mod unique_connections; pub use settings::Settings; use async_trait::async_trait; +use chrono::{DateTime, Utc}; use mobile_config::client::ClientError; use rust_decimal::Decimal; use solana::SolPubkey; @@ -44,6 +45,7 @@ pub trait GatewayResolver: Clone + Send + Sync + 'static { async fn resolve_gateway( &self, address: &helium_crypto::PublicKeyBinary, + gateway_query_timestamp: &DateTime, ) -> Result; } @@ -52,11 +54,15 @@ impl GatewayResolver for mobile_config::GatewayClient { async fn resolve_gateway( &self, address: &helium_crypto::PublicKeyBinary, + gateway_query_timestamp: &DateTime, ) -> Result { use mobile_config::gateway::client::GatewayInfoResolver; use mobile_config::gateway::service::info::{DeviceType, GatewayInfo}; - match self.resolve_gateway_info(address).await? { + match self + .resolve_gateway_info(address, gateway_query_timestamp) + .await? + { None => Ok(GatewayResolution::GatewayNotFound), Some(GatewayInfo { device_type: DeviceType::WifiDataOnly, diff --git a/mobile_verifier/src/speedtests.rs b/mobile_verifier/src/speedtests.rs index f5106595d..25fb0c57f 100644 --- a/mobile_verifier/src/speedtests.rs +++ b/mobile_verifier/src/speedtests.rs @@ -150,8 +150,12 @@ where tracing::info!("Processing speedtest file {}", file.file_info.key); let mut transaction = self.pool.begin().await?; let mut speedtests = file.into_stream(&mut transaction).await?; + let gateway_query_timestamp = Utc::now(); + while let Some(speedtest_report) = speedtests.next().await { - let result = self.validate_speedtest(&speedtest_report).await?; + let result = self + .validate_speedtest(&speedtest_report, &gateway_query_timestamp) + .await?; if result == SpeedtestResult::SpeedtestValid { save_speedtest(&speedtest_report.report, &mut transaction).await?; let latest_speedtests = get_latest_speedtests_for_pubkey( @@ -176,12 +180,13 @@ where pub async fn validate_speedtest( &self, speedtest: &CellSpeedtestIngestReport, + gateway_query_timestamp: &DateTime, ) -> anyhow::Result { let pubkey = speedtest.report.pubkey.clone(); match self .gateway_info_resolver - .resolve_gateway_info(&pubkey) + .resolve_gateway_info(&pubkey, gateway_query_timestamp) .await? { Some(gw_info) if gw_info.is_data_only() => { diff --git a/mobile_verifier/tests/integrations/boosting_oracles.rs b/mobile_verifier/tests/integrations/boosting_oracles.rs index b3233bffb..ec31a6ca1 100644 --- a/mobile_verifier/tests/integrations/boosting_oracles.rs +++ b/mobile_verifier/tests/integrations/boosting_oracles.rs @@ -478,6 +478,7 @@ async fn test_footfall_and_urbanization_and_landtype_and_service_provider_overri let location_cache = LocationCache::new(&pool); let epoch = start..end; + let gateway_query_timestamp = Utc::now(); let mut heartbeats = pin!(ValidatedHeartbeat::validate_heartbeats( stream::iter(heartbeats.map(Heartbeat::from)), &GatewayClientAllOwnersValid, @@ -486,6 +487,7 @@ async fn test_footfall_and_urbanization_and_landtype_and_service_provider_overri 2000, &epoch, &MockGeofence, + &gateway_query_timestamp, )); let mut transaction = pool.begin().await?; while let Some(heartbeat) = heartbeats.next().await.transpose()? { diff --git a/mobile_verifier/tests/integrations/common/mod.rs b/mobile_verifier/tests/integrations/common/mod.rs index 292e522a4..4615a6d44 100644 --- a/mobile_verifier/tests/integrations/common/mod.rs +++ b/mobile_verifier/tests/integrations/common/mod.rs @@ -216,6 +216,7 @@ impl GatewayResolver for GatewayClientAllOwnersValid { async fn resolve_gateway( &self, _address: &PublicKeyBinary, + _gateway_query_timestamp: &DateTime, ) -> Result { Ok(GatewayResolution::AssertedLocation(0x8c2681a3064d9ff)) } diff --git a/mobile_verifier/tests/integrations/last_location.rs b/mobile_verifier/tests/integrations/last_location.rs index 17912c33c..ab77c0560 100644 --- a/mobile_verifier/tests/integrations/last_location.rs +++ b/mobile_verifier/tests/integrations/last_location.rs @@ -41,6 +41,7 @@ async fn heartbeat_uses_last_good_location_when_invalid_location( let mut transaction = pool.begin().await?; let coverage_object = coverage_object(&hotspot, &mut transaction).await?; transaction.commit().await?; + let gateway_query_timestamp = Utc::now(); let validated_heartbeat_1 = ValidatedHeartbeat::validate( heartbeat(&hotspot, &coverage_object) @@ -52,6 +53,7 @@ async fn heartbeat_uses_last_good_location_when_invalid_location( u32::MAX, &(epoch_start..epoch_end), &MockGeofence, + &gateway_query_timestamp, ) .await?; @@ -70,6 +72,7 @@ async fn heartbeat_uses_last_good_location_when_invalid_location( u32::MAX, &(epoch_start..epoch_end), &MockGeofence, + &gateway_query_timestamp, ) .await?; @@ -103,6 +106,7 @@ async fn heartbeat_will_use_last_good_location_from_db(pool: PgPool) -> anyhow:: let mut transaction = pool.begin().await?; let coverage_object = coverage_object(&hotspot, &mut transaction).await?; transaction.commit().await?; + let gateway_query_timestamp = Utc::now(); let validated_heartbeat_1 = ValidatedHeartbeat::validate( heartbeat(&hotspot, &coverage_object) @@ -114,6 +118,7 @@ async fn heartbeat_will_use_last_good_location_from_db(pool: PgPool) -> anyhow:: u32::MAX, &(epoch_start..epoch_end), &MockGeofence, + &gateway_query_timestamp, ) .await?; @@ -137,6 +142,7 @@ async fn heartbeat_will_use_last_good_location_from_db(pool: PgPool) -> anyhow:: u32::MAX, &(epoch_start..epoch_end), &MockGeofence, + &gateway_query_timestamp, ) .await?; @@ -174,6 +180,7 @@ async fn heartbeat_does_not_use_last_good_location_when_more_than_24_hours( transaction.commit().await?; let location_validation_timestamp = Utc::now(); + let gateway_query_timestamp = Utc::now(); let validated_heartbeat_1 = ValidatedHeartbeat::validate( heartbeat(&hotspot, &coverage_object) @@ -187,6 +194,7 @@ async fn heartbeat_does_not_use_last_good_location_when_more_than_24_hours( u32::MAX, &(epoch_start..epoch_end), &MockGeofence, + &gateway_query_timestamp, ) .await?; @@ -207,6 +215,7 @@ async fn heartbeat_does_not_use_last_good_location_when_more_than_24_hours( u32::MAX, &(epoch_start..epoch_end), &MockGeofence, + &gateway_query_timestamp, ) .await?; diff --git a/mobile_verifier/tests/integrations/modeled_coverage.rs b/mobile_verifier/tests/integrations/modeled_coverage.rs index 9ce9b35ac..9482c3cd2 100644 --- a/mobile_verifier/tests/integrations/modeled_coverage.rs +++ b/mobile_verifier/tests/integrations/modeled_coverage.rs @@ -329,6 +329,7 @@ async fn process_wifi_input( .await?; let mut transaction = pool.begin().await?; + let gateway_query_timestamp = Utc::now(); let mut heartbeats = pin!(ValidatedHeartbeat::validate_heartbeats( stream::iter(heartbeats.map(Heartbeat::from)), &GatewayClientAllOwnersValid, @@ -337,6 +338,7 @@ async fn process_wifi_input( 2000, epoch, &MockGeofence, + &gateway_query_timestamp, )); while let Some(heartbeat) = heartbeats.next().await.transpose()? { let coverage_claim_time = coverage_claim_time_cache @@ -990,6 +992,7 @@ async fn ensure_lower_trust_score_for_distant_heartbeats(pool: PgPool) -> anyhow let max_covered_distance = 5_000; let coverage_object_cache = CoverageObjectCache::new(&pool); let location_cache = LocationCache::new(&pool); + let gateway_query_timestamp = Utc::now(); let mk_heartbeat = |latlng: LatLng| WifiHeartbeatIngestReport { report: WifiHeartbeat { @@ -1014,6 +1017,7 @@ async fn ensure_lower_trust_score_for_distant_heartbeats(pool: PgPool) -> anyhow max_covered_distance, &(DateTime::::MIN_UTC..DateTime::::MAX_UTC), &MockGeofence, + &gateway_query_timestamp, ) }; diff --git a/mobile_verifier/tests/integrations/speedtests.rs b/mobile_verifier/tests/integrations/speedtests.rs index bb386aec0..768f588a2 100644 --- a/mobile_verifier/tests/integrations/speedtests.rs +++ b/mobile_verifier/tests/integrations/speedtests.rs @@ -27,6 +27,7 @@ impl GatewayInfoResolver for MockGatewayInfoResolver { async fn resolve_gateway_info( &self, address: &PublicKeyBinary, + _gateway_query_timestamp: &DateTime, ) -> Result, ClientError> { Ok(Some(GatewayInfo { address: address.clone(), From 924d2d4a9ade0fe96ee415430b242743ea9a0ef2 Mon Sep 17 00:00:00 2001 From: Connor McKenzie Date: Tue, 28 Oct 2025 14:34:44 +0000 Subject: [PATCH 24/33] Revert "Update mobile verifiers to use new info_at_timestamp API" This reverts commit e83d7b8552e3878c6d1f34fe7cd08c251cc6836c. --- mobile_config/src/gateway/client.rs | 25 ++++++++----------- mobile_packet_verifier/src/lib.rs | 8 +----- mobile_verifier/src/heartbeats/mod.rs | 5 +--- mobile_verifier/src/heartbeats/wifi.rs | 2 -- mobile_verifier/src/lib.rs | 8 +----- mobile_verifier/src/speedtests.rs | 9 ++----- .../tests/integrations/boosting_oracles.rs | 2 -- .../tests/integrations/common/mod.rs | 1 - .../tests/integrations/last_location.rs | 9 ------- .../tests/integrations/modeled_coverage.rs | 4 --- .../tests/integrations/speedtests.rs | 1 - 11 files changed, 15 insertions(+), 59 deletions(-) diff --git a/mobile_config/src/gateway/client.rs b/mobile_config/src/gateway/client.rs index 54bfe632b..5c92bedd5 100644 --- a/mobile_config/src/gateway/client.rs +++ b/mobile_config/src/gateway/client.rs @@ -1,6 +1,5 @@ use crate::client::{call_with_retry, ClientError, Settings}; use crate::gateway::service::info::{GatewayInfo, GatewayInfoStream}; -use chrono::{DateTime, Utc}; use file_store::traits::MsgVerify; use futures::stream::{self, StreamExt}; use helium_crypto::{Keypair, PublicKey, PublicKeyBinary, Sign}; @@ -50,7 +49,6 @@ pub trait GatewayInfoResolver: Clone + Send + Sync + 'static { async fn resolve_gateway_info( &self, address: &PublicKeyBinary, - gateway_query_timestamp: &DateTime, ) -> Result, ClientError>; async fn stream_gateways_info( @@ -64,30 +62,27 @@ impl GatewayInfoResolver for GatewayClient { async fn resolve_gateway_info( &self, address: &PublicKeyBinary, - gateway_query_timestamp: &DateTime, ) -> Result, ClientError> { if let Some(cached_response) = self.cache.get(address).await { return Ok(cached_response.value().clone()); } - let mut request = mobile_config::GatewayInfoAtTimestampReqV1 { + let mut request = mobile_config::GatewayInfoReqV1 { address: address.clone().into(), signer: self.signing_key.public_key().into(), signature: vec![], - query_time: gateway_query_timestamp.clone().timestamp() as u64, }; request.signature = self.signing_key.sign(&request.encode_to_vec())?; tracing::debug!(pubkey = address.to_string(), "fetching gateway info"); - let response = - match call_with_retry!(self.client.clone().info_at_timestamp(request.clone())) { - Ok(info_res) => { - let response = info_res.into_inner(); - response.verify(&self.config_pubkey)?; - response.info.map(GatewayInfo::try_from).transpose()? - } - Err(status) if status.code() == tonic::Code::NotFound => None, - Err(status) => Err(status)?, - }; + let response = match call_with_retry!(self.client.clone().info_v2(request.clone())) { + Ok(info_res) => { + let response = info_res.into_inner(); + response.verify(&self.config_pubkey)?; + response.info.map(GatewayInfo::try_from).transpose()? + } + Err(status) if status.code() == tonic::Code::NotFound => None, + Err(status) => Err(status)?, + }; self.cache .insert(address.clone(), response.clone(), self.cache_ttl) diff --git a/mobile_packet_verifier/src/lib.rs b/mobile_packet_verifier/src/lib.rs index d96592300..0a02cd8b9 100644 --- a/mobile_packet_verifier/src/lib.rs +++ b/mobile_packet_verifier/src/lib.rs @@ -1,6 +1,5 @@ extern crate tls_init; -use chrono::Utc; use helium_crypto::PublicKeyBinary; use helium_proto::services::mobile_config::NetworkKeyRole; use mobile_config::{ @@ -51,12 +50,7 @@ pub trait MobileConfigResolverExt { #[async_trait::async_trait] impl MobileConfigResolverExt for MobileConfigClients { async fn is_gateway_known(&self, public_key: &PublicKeyBinary) -> bool { - let gateway_query_timestamp = Utc::now(); - match self - .gateway_client - .resolve_gateway_info(public_key, &gateway_query_timestamp) - .await - { + match self.gateway_client.resolve_gateway_info(public_key).await { Ok(res) => res.is_some(), Err(_err) => false, } diff --git a/mobile_verifier/src/heartbeats/mod.rs b/mobile_verifier/src/heartbeats/mod.rs index 50c32b2f6..3a3e79c2c 100644 --- a/mobile_verifier/src/heartbeats/mod.rs +++ b/mobile_verifier/src/heartbeats/mod.rs @@ -296,7 +296,6 @@ impl ValidatedHeartbeat { max_distance_to_coverage: u32, epoch: &Range>, geofence: &impl GeofenceValidator, - gateway_query_timestamp: &DateTime, ) -> anyhow::Result { let Some(coverage_object) = heartbeat.coverage_object else { return Ok(Self::new( @@ -378,7 +377,7 @@ impl ValidatedHeartbeat { } match gateway_info_resolver - .resolve_gateway(&heartbeat.hotspot_key, gateway_query_timestamp) + .resolve_gateway(&heartbeat.hotspot_key) .await? { GatewayResolution::DataOnly => Ok(Self::new( @@ -489,7 +488,6 @@ impl ValidatedHeartbeat { max_distance_to_coverage: u32, epoch: &'a Range>, geofence: &'a impl GeofenceValidator, - gateway_query_timestamp: &'a DateTime, ) -> impl Stream> + 'a { heartbeats.then(move |heartbeat| async move { Self::validate( @@ -500,7 +498,6 @@ impl ValidatedHeartbeat { max_distance_to_coverage, epoch, geofence, - gateway_query_timestamp, ) .await }) diff --git a/mobile_verifier/src/heartbeats/wifi.rs b/mobile_verifier/src/heartbeats/wifi.rs index a867834a4..0aa5577be 100644 --- a/mobile_verifier/src/heartbeats/wifi.rs +++ b/mobile_verifier/src/heartbeats/wifi.rs @@ -152,7 +152,6 @@ where .into_stream(&mut transaction) .await? .map(Heartbeat::from); - let gateway_query_timestamp = Utc::now(); process_validated_heartbeats( ValidatedHeartbeat::validate_heartbeats( heartbeats, @@ -162,7 +161,6 @@ where self.max_distance_to_coverage, &epoch, &self.geofence, - &gateway_query_timestamp, ), heartbeat_cache, coverage_claim_time_cache, diff --git a/mobile_verifier/src/lib.rs b/mobile_verifier/src/lib.rs index 2cfb0f1e4..bbdc58c30 100644 --- a/mobile_verifier/src/lib.rs +++ b/mobile_verifier/src/lib.rs @@ -22,7 +22,6 @@ pub mod unique_connections; pub use settings::Settings; use async_trait::async_trait; -use chrono::{DateTime, Utc}; use mobile_config::client::ClientError; use rust_decimal::Decimal; use solana::SolPubkey; @@ -45,7 +44,6 @@ pub trait GatewayResolver: Clone + Send + Sync + 'static { async fn resolve_gateway( &self, address: &helium_crypto::PublicKeyBinary, - gateway_query_timestamp: &DateTime, ) -> Result; } @@ -54,15 +52,11 @@ impl GatewayResolver for mobile_config::GatewayClient { async fn resolve_gateway( &self, address: &helium_crypto::PublicKeyBinary, - gateway_query_timestamp: &DateTime, ) -> Result { use mobile_config::gateway::client::GatewayInfoResolver; use mobile_config::gateway::service::info::{DeviceType, GatewayInfo}; - match self - .resolve_gateway_info(address, gateway_query_timestamp) - .await? - { + match self.resolve_gateway_info(address).await? { None => Ok(GatewayResolution::GatewayNotFound), Some(GatewayInfo { device_type: DeviceType::WifiDataOnly, diff --git a/mobile_verifier/src/speedtests.rs b/mobile_verifier/src/speedtests.rs index 25fb0c57f..f5106595d 100644 --- a/mobile_verifier/src/speedtests.rs +++ b/mobile_verifier/src/speedtests.rs @@ -150,12 +150,8 @@ where tracing::info!("Processing speedtest file {}", file.file_info.key); let mut transaction = self.pool.begin().await?; let mut speedtests = file.into_stream(&mut transaction).await?; - let gateway_query_timestamp = Utc::now(); - while let Some(speedtest_report) = speedtests.next().await { - let result = self - .validate_speedtest(&speedtest_report, &gateway_query_timestamp) - .await?; + let result = self.validate_speedtest(&speedtest_report).await?; if result == SpeedtestResult::SpeedtestValid { save_speedtest(&speedtest_report.report, &mut transaction).await?; let latest_speedtests = get_latest_speedtests_for_pubkey( @@ -180,13 +176,12 @@ where pub async fn validate_speedtest( &self, speedtest: &CellSpeedtestIngestReport, - gateway_query_timestamp: &DateTime, ) -> anyhow::Result { let pubkey = speedtest.report.pubkey.clone(); match self .gateway_info_resolver - .resolve_gateway_info(&pubkey, gateway_query_timestamp) + .resolve_gateway_info(&pubkey) .await? { Some(gw_info) if gw_info.is_data_only() => { diff --git a/mobile_verifier/tests/integrations/boosting_oracles.rs b/mobile_verifier/tests/integrations/boosting_oracles.rs index ec31a6ca1..b3233bffb 100644 --- a/mobile_verifier/tests/integrations/boosting_oracles.rs +++ b/mobile_verifier/tests/integrations/boosting_oracles.rs @@ -478,7 +478,6 @@ async fn test_footfall_and_urbanization_and_landtype_and_service_provider_overri let location_cache = LocationCache::new(&pool); let epoch = start..end; - let gateway_query_timestamp = Utc::now(); let mut heartbeats = pin!(ValidatedHeartbeat::validate_heartbeats( stream::iter(heartbeats.map(Heartbeat::from)), &GatewayClientAllOwnersValid, @@ -487,7 +486,6 @@ async fn test_footfall_and_urbanization_and_landtype_and_service_provider_overri 2000, &epoch, &MockGeofence, - &gateway_query_timestamp, )); let mut transaction = pool.begin().await?; while let Some(heartbeat) = heartbeats.next().await.transpose()? { diff --git a/mobile_verifier/tests/integrations/common/mod.rs b/mobile_verifier/tests/integrations/common/mod.rs index 4615a6d44..292e522a4 100644 --- a/mobile_verifier/tests/integrations/common/mod.rs +++ b/mobile_verifier/tests/integrations/common/mod.rs @@ -216,7 +216,6 @@ impl GatewayResolver for GatewayClientAllOwnersValid { async fn resolve_gateway( &self, _address: &PublicKeyBinary, - _gateway_query_timestamp: &DateTime, ) -> Result { Ok(GatewayResolution::AssertedLocation(0x8c2681a3064d9ff)) } diff --git a/mobile_verifier/tests/integrations/last_location.rs b/mobile_verifier/tests/integrations/last_location.rs index ab77c0560..17912c33c 100644 --- a/mobile_verifier/tests/integrations/last_location.rs +++ b/mobile_verifier/tests/integrations/last_location.rs @@ -41,7 +41,6 @@ async fn heartbeat_uses_last_good_location_when_invalid_location( let mut transaction = pool.begin().await?; let coverage_object = coverage_object(&hotspot, &mut transaction).await?; transaction.commit().await?; - let gateway_query_timestamp = Utc::now(); let validated_heartbeat_1 = ValidatedHeartbeat::validate( heartbeat(&hotspot, &coverage_object) @@ -53,7 +52,6 @@ async fn heartbeat_uses_last_good_location_when_invalid_location( u32::MAX, &(epoch_start..epoch_end), &MockGeofence, - &gateway_query_timestamp, ) .await?; @@ -72,7 +70,6 @@ async fn heartbeat_uses_last_good_location_when_invalid_location( u32::MAX, &(epoch_start..epoch_end), &MockGeofence, - &gateway_query_timestamp, ) .await?; @@ -106,7 +103,6 @@ async fn heartbeat_will_use_last_good_location_from_db(pool: PgPool) -> anyhow:: let mut transaction = pool.begin().await?; let coverage_object = coverage_object(&hotspot, &mut transaction).await?; transaction.commit().await?; - let gateway_query_timestamp = Utc::now(); let validated_heartbeat_1 = ValidatedHeartbeat::validate( heartbeat(&hotspot, &coverage_object) @@ -118,7 +114,6 @@ async fn heartbeat_will_use_last_good_location_from_db(pool: PgPool) -> anyhow:: u32::MAX, &(epoch_start..epoch_end), &MockGeofence, - &gateway_query_timestamp, ) .await?; @@ -142,7 +137,6 @@ async fn heartbeat_will_use_last_good_location_from_db(pool: PgPool) -> anyhow:: u32::MAX, &(epoch_start..epoch_end), &MockGeofence, - &gateway_query_timestamp, ) .await?; @@ -180,7 +174,6 @@ async fn heartbeat_does_not_use_last_good_location_when_more_than_24_hours( transaction.commit().await?; let location_validation_timestamp = Utc::now(); - let gateway_query_timestamp = Utc::now(); let validated_heartbeat_1 = ValidatedHeartbeat::validate( heartbeat(&hotspot, &coverage_object) @@ -194,7 +187,6 @@ async fn heartbeat_does_not_use_last_good_location_when_more_than_24_hours( u32::MAX, &(epoch_start..epoch_end), &MockGeofence, - &gateway_query_timestamp, ) .await?; @@ -215,7 +207,6 @@ async fn heartbeat_does_not_use_last_good_location_when_more_than_24_hours( u32::MAX, &(epoch_start..epoch_end), &MockGeofence, - &gateway_query_timestamp, ) .await?; diff --git a/mobile_verifier/tests/integrations/modeled_coverage.rs b/mobile_verifier/tests/integrations/modeled_coverage.rs index 9482c3cd2..9ce9b35ac 100644 --- a/mobile_verifier/tests/integrations/modeled_coverage.rs +++ b/mobile_verifier/tests/integrations/modeled_coverage.rs @@ -329,7 +329,6 @@ async fn process_wifi_input( .await?; let mut transaction = pool.begin().await?; - let gateway_query_timestamp = Utc::now(); let mut heartbeats = pin!(ValidatedHeartbeat::validate_heartbeats( stream::iter(heartbeats.map(Heartbeat::from)), &GatewayClientAllOwnersValid, @@ -338,7 +337,6 @@ async fn process_wifi_input( 2000, epoch, &MockGeofence, - &gateway_query_timestamp, )); while let Some(heartbeat) = heartbeats.next().await.transpose()? { let coverage_claim_time = coverage_claim_time_cache @@ -992,7 +990,6 @@ async fn ensure_lower_trust_score_for_distant_heartbeats(pool: PgPool) -> anyhow let max_covered_distance = 5_000; let coverage_object_cache = CoverageObjectCache::new(&pool); let location_cache = LocationCache::new(&pool); - let gateway_query_timestamp = Utc::now(); let mk_heartbeat = |latlng: LatLng| WifiHeartbeatIngestReport { report: WifiHeartbeat { @@ -1017,7 +1014,6 @@ async fn ensure_lower_trust_score_for_distant_heartbeats(pool: PgPool) -> anyhow max_covered_distance, &(DateTime::::MIN_UTC..DateTime::::MAX_UTC), &MockGeofence, - &gateway_query_timestamp, ) }; diff --git a/mobile_verifier/tests/integrations/speedtests.rs b/mobile_verifier/tests/integrations/speedtests.rs index 768f588a2..bb386aec0 100644 --- a/mobile_verifier/tests/integrations/speedtests.rs +++ b/mobile_verifier/tests/integrations/speedtests.rs @@ -27,7 +27,6 @@ impl GatewayInfoResolver for MockGatewayInfoResolver { async fn resolve_gateway_info( &self, address: &PublicKeyBinary, - _gateway_query_timestamp: &DateTime, ) -> Result, ClientError> { Ok(Some(GatewayInfo { address: address.clone(), From 215cf93d856cf6a6bca0e95f2040bcf2d8261719 Mon Sep 17 00:00:00 2001 From: Connor McKenzie Date: Fri, 14 Nov 2025 13:33:32 +0000 Subject: [PATCH 25/33] Updated metric name --- mobile_config/src/gateway/service/mod.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mobile_config/src/gateway/service/mod.rs b/mobile_config/src/gateway/service/mod.rs index 48ef6d4f0..bdfe707c1 100644 --- a/mobile_config/src/gateway/service/mod.rs +++ b/mobile_config/src/gateway/service/mod.rs @@ -172,7 +172,7 @@ impl mobile_config::Gateway for GatewayService { request: Request, ) -> GrpcResult { let request = request.into_inner(); - telemetry::count_request("gateway", "info-v2"); + telemetry::count_request("gateway", "info-at-timestamp"); custom_tracing::record_b58("pub_key", &request.address); custom_tracing::record_b58("signer", &request.signer); From bd4c153789abb52d1eea977684ce151d5f6e8bd7 Mon Sep 17 00:00:00 2001 From: Connor McKenzie Date: Fri, 14 Nov 2025 14:45:04 +0000 Subject: [PATCH 26/33] Reverted proto branch to master --- Cargo.lock | 10 +++++----- Cargo.toml | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 7d61445c7..25a440e23 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1321,17 +1321,17 @@ checksum = "55248b47b0caf0546f7988906588779981c43bb1bc9d0c44087278f80cdb44ba" [[package]] name = "beacon" version = "0.1.0" -source = "git+https://github.com/helium/proto?branch=master#2217e1a917583ddccb6668a7bd185f3d39bcede0" +source = "git+https://github.com/helium/proto?branch=master#60e0047b6e0e38b8119a055b37a7043cb02dbc82" dependencies = [ - "base64 0.22.1", + "base64 0.21.7", "byteorder", "helium-proto", "prost", - "rand 0.8.5", - "rand_chacha 0.3.1", + "rand 0.7.3", + "rand_chacha 0.2.2", "rust_decimal", "serde", - "sha2 0.10.9", + "sha2 0.9.9", "thiserror 1.0.69", ] diff --git a/Cargo.toml b/Cargo.toml index 55a480b32..3de5c52e5 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -126,10 +126,10 @@ aws-smithy-types-convert = { version = "0.60.9", features = [ url = "2.5.4" ### Protobuf -helium-proto = { git = "https://github.com/helium/proto", branch = "connor/historical", features = [ +helium-proto = { git = "https://github.com/helium/proto", branch = "master", features = [ "services", ] } -beacon = { git = "https://github.com/helium/proto", branch = "connor/historical" } +beacon = { git = "https://github.com/helium/proto", branch = "master" } # Pickup versions from above prost = "*" tonic = { version = "*", features = ["tls-aws-lc", "tls-native-roots"] } From 8263ea856ab6afc07fa6e8135bf4f5bc99809872 Mon Sep 17 00:00:00 2001 From: Connor McKenzie Date: Fri, 14 Nov 2025 15:08:13 +0000 Subject: [PATCH 27/33] Update Cargo.lock --- Cargo.lock | 1013 +++++++++++++++++++++++++--------------------------- 1 file changed, 487 insertions(+), 526 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 418a93826..ceea750a0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -71,9 +71,9 @@ dependencies = [ [[package]] name = "agave-feature-set" -version = "2.3.12" +version = "2.3.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c5117ce634f42ce143891c4d7db3536d5054fc19501ef88e21f353b8580c450" +checksum = "d52a2c365c0245cbb8959de725fc2b44c754b673fdf34c9a7f9d4a25c35a7bf1" dependencies = [ "ahash 0.8.12", "solana-epoch-schedule", @@ -85,9 +85,9 @@ dependencies = [ [[package]] name = "agave-reserved-account-keys" -version = "2.3.12" +version = "2.3.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "437f99adcce3e30218130d4cefbdb1f5810c43b553eb51b452e01dd3edf2c28c" +checksum = "8289c8a8a2ef5aa10ce49a070f360f4e035ee3410b8d8f3580fb39d8cf042581" dependencies = [ "agave-feature-set", "solana-pubkey", @@ -113,7 +113,7 @@ checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" dependencies = [ "cfg-if", "const-random", - "getrandom 0.3.3", + "getrandom 0.3.4", "once_cell", "version_check", "zerocopy", @@ -121,9 +121,9 @@ dependencies = [ [[package]] name = "aho-corasick" -version = "1.1.3" +version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" +checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" dependencies = [ "memchr", ] @@ -402,22 +402,22 @@ dependencies = [ [[package]] name = "anstyle-query" -version = "1.1.4" +version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e231f6134f61b71076a3eab506c379d4f36122f2af15a9ff04415ea4c3339e2" +checksum = "40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadc" dependencies = [ - "windows-sys 0.60.2", + "windows-sys 0.61.2", ] [[package]] name = "anstyle-wincon" -version = "3.0.10" +version = "3.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e0633414522a32ffaac8ac6cc8f748e090c5717661fddeea04219e2344f5f2a" +checksum = "291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747d" dependencies = [ "anstyle", "once_cell_polyfill", - "windows-sys 0.60.2", + "windows-sys 0.61.2", ] [[package]] @@ -619,9 +619,9 @@ dependencies = [ [[package]] name = "async-compression" -version = "0.4.32" +version = "0.4.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a89bce6054c720275ac2432fbba080a66a2106a44a1b804553930ca6909f4e0" +checksum = "93c1f86859c1af3d514fa19e8323147ff10ea98684e6c7b307912509f50e67b2" dependencies = [ "compression-codecs", "compression-core", @@ -676,7 +676,7 @@ checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -722,9 +722,9 @@ checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" [[package]] name = "aws-config" -version = "1.8.8" +version = "1.8.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37cf2b6af2a95a20e266782b4f76f1a5e12bf412a9db2de9c1e9123b9d8c0ad8" +checksum = "1856b1b48b65f71a4dd940b1c0931f9a7b646d4a924b9828ffefc1454714668a" dependencies = [ "aws-credential-types", "aws-runtime", @@ -752,9 +752,9 @@ dependencies = [ [[package]] name = "aws-credential-types" -version = "1.2.8" +version = "1.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "faf26925f4a5b59eb76722b63c2892b1d70d06fa053c72e4a100ec308c1d47bc" +checksum = "86590e57ea40121d47d3f2e131bfd873dea15d78dc2f4604f4734537ad9e56c4" dependencies = [ "aws-smithy-async", "aws-smithy-runtime-api", @@ -764,9 +764,9 @@ dependencies = [ [[package]] name = "aws-lc-rs" -version = "1.14.1" +version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "879b6c89592deb404ba4dc0ae6b58ffd1795c78991cbb5b8bc441c48a070440d" +checksum = "5932a7d9d28b0d2ea34c6b3779d35e3dd6f6345317c34e73438c4f1f29144151" dependencies = [ "aws-lc-sys", "zeroize", @@ -774,16 +774,15 @@ dependencies = [ [[package]] name = "aws-lc-sys" -version = "0.32.2" +version = "0.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2b715a6010afb9e457ca2b7c9d2b9c344baa8baed7b38dc476034c171b32575" +checksum = "1826f2e4cfc2cd19ee53c42fbf68e2f81ec21108e0b7ecf6a71cf062137360fc" dependencies = [ "bindgen", "cc", "cmake", "dunce", "fs_extra", - "libloading", ] [[package]] @@ -805,9 +804,9 @@ dependencies = [ [[package]] name = "aws-runtime" -version = "1.5.12" +version = "1.5.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa006bb32360ed90ac51203feafb9d02e3d21046e1fd3a450a404b90ea73e5d" +checksum = "8fe0fd441565b0b318c76e7206c8d1d0b0166b3e986cf30e890b61feb6192045" dependencies = [ "aws-credential-types", "aws-sigv4", @@ -830,9 +829,9 @@ dependencies = [ [[package]] name = "aws-sdk-s3" -version = "1.108.0" +version = "1.112.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "200be4aed61e3c0669f7268bacb768f283f1c32a7014ce57225e1160be2f6ccb" +checksum = "eee73a27721035c46da0572b390a69fbdb333d0177c24f3d8f7ff952eeb96690" dependencies = [ "aws-credential-types", "aws-runtime", @@ -864,9 +863,9 @@ dependencies = [ [[package]] name = "aws-sdk-sso" -version = "1.86.0" +version = "1.89.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a0abbfab841446cce6e87af853a3ba2cc1bc9afcd3f3550dd556c43d434c86d" +checksum = "a9c1b1af02288f729e95b72bd17988c009aa72e26dcb59b3200f86d7aea726c9" dependencies = [ "aws-credential-types", "aws-runtime", @@ -886,9 +885,9 @@ dependencies = [ [[package]] name = "aws-sdk-ssooidc" -version = "1.88.0" +version = "1.91.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a68d675582afea0e94d38b6ca9c5aaae4ca14f1d36faa6edb19b42e687e70d7" +checksum = "4e8122301558dc7c6c68e878af918880b82ff41897a60c8c4e18e4dc4d93e9f1" dependencies = [ "aws-credential-types", "aws-runtime", @@ -908,9 +907,9 @@ dependencies = [ [[package]] name = "aws-sdk-sts" -version = "1.88.0" +version = "1.92.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d30990923f4f675523c51eb1c0dec9b752fb267b36a61e83cbc219c9d86da715" +checksum = "a0c7808adcff8333eaa76a849e6de926c6ac1a1268b9fd6afe32de9c29ef29d2" dependencies = [ "aws-credential-types", "aws-runtime", @@ -931,9 +930,9 @@ dependencies = [ [[package]] name = "aws-sigv4" -version = "1.3.5" +version = "1.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bffc03068fbb9c8dd5ce1c6fb240678a5cffb86fb2b7b1985c999c4b83c8df68" +checksum = "c35452ec3f001e1f2f6db107b6373f1f48f05ec63ba2c5c9fa91f07dad32af11" dependencies = [ "aws-credential-types", "aws-smithy-eventstream", @@ -970,9 +969,9 @@ dependencies = [ [[package]] name = "aws-smithy-checksums" -version = "0.63.9" +version = "0.63.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "165d8583d8d906e2fb5511d29201d447cc710864f075debcdd9c31c265412806" +checksum = "95bd108f7b3563598e4dc7b62e1388c9982324a2abd622442167012690184591" dependencies = [ "aws-smithy-http", "aws-smithy-types", @@ -990,9 +989,9 @@ dependencies = [ [[package]] name = "aws-smithy-eventstream" -version = "0.60.12" +version = "0.60.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9656b85088f8d9dc7ad40f9a6c7228e1e8447cdf4b046c87e152e0805dea02fa" +checksum = "e29a304f8319781a39808847efb39561351b1bb76e933da7aa90232673638658" dependencies = [ "aws-smithy-types", "bytes", @@ -1001,9 +1000,9 @@ dependencies = [ [[package]] name = "aws-smithy-http" -version = "0.62.4" +version = "0.62.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3feafd437c763db26aa04e0cc7591185d0961e64c61885bece0fb9d50ceac671" +checksum = "445d5d720c99eed0b4aa674ed00d835d9b1427dd73e04adaf2f94c6b2d6f9fca" dependencies = [ "aws-smithy-eventstream", "aws-smithy-runtime-api", @@ -1011,6 +1010,7 @@ dependencies = [ "bytes", "bytes-utils", "futures-core", + "futures-util", "http 0.2.12", "http 1.3.1", "http-body 0.4.6", @@ -1022,9 +1022,9 @@ dependencies = [ [[package]] name = "aws-smithy-http-client" -version = "1.1.3" +version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1053b5e587e6fa40ce5a79ea27957b04ba660baa02b28b7436f64850152234f1" +checksum = "623254723e8dfd535f566ee7b2381645f8981da086b5c4aa26c0c41582bb1d2c" dependencies = [ "aws-smithy-async", "aws-smithy-runtime-api", @@ -1035,14 +1035,14 @@ dependencies = [ "http 1.3.1", "http-body 0.4.6", "hyper 0.14.32", - "hyper 1.7.0", + "hyper 1.8.1", "hyper-rustls 0.24.2", "hyper-rustls 0.27.7", "hyper-util", "pin-project-lite", "rustls 0.21.12", - "rustls 0.23.32", - "rustls-native-certs 0.8.1", + "rustls 0.23.35", + "rustls-native-certs 0.8.2", "rustls-pki-types", "tokio", "tokio-rustls 0.26.4", @@ -1052,9 +1052,9 @@ dependencies = [ [[package]] name = "aws-smithy-json" -version = "0.61.6" +version = "0.61.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cff418fc8ec5cadf8173b10125f05c2e7e1d46771406187b2c878557d4503390" +checksum = "2db31f727935fc63c6eeae8b37b438847639ec330a9161ece694efba257e0c54" dependencies = [ "aws-smithy-types", ] @@ -1080,9 +1080,9 @@ dependencies = [ [[package]] name = "aws-smithy-runtime" -version = "1.9.3" +version = "1.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40ab99739082da5347660c556689256438defae3bcefd66c52b095905730e404" +checksum = "0bbe9d018d646b96c7be063dd07987849862b0e6d07c778aad7d93d1be6c1ef0" dependencies = [ "aws-smithy-async", "aws-smithy-http", @@ -1104,9 +1104,9 @@ dependencies = [ [[package]] name = "aws-smithy-runtime-api" -version = "1.9.1" +version = "1.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3683c5b152d2ad753607179ed71988e8cfd52964443b4f74fd8e552d0bbfeb46" +checksum = "ec7204f9fd94749a7c53b26da1b961b4ac36bf070ef1e0b94bb09f79d4f6c193" dependencies = [ "aws-smithy-async", "aws-smithy-types", @@ -1121,9 +1121,9 @@ dependencies = [ [[package]] name = "aws-smithy-types" -version = "1.3.3" +version = "1.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f5b3a7486f6690ba25952cabf1e7d75e34d69eaff5081904a47bc79074d6457" +checksum = "25f535879a207fce0db74b679cfc3e91a3159c8144d717d55f5832aea9eef46e" dependencies = [ "base64-simd", "bytes", @@ -1157,18 +1157,18 @@ dependencies = [ [[package]] name = "aws-smithy-xml" -version = "0.60.11" +version = "0.60.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9c34127e8c624bc2999f3b657e749c1393bedc9cd97b92a804db8ced4d2e163" +checksum = "eab77cdd036b11056d2a30a7af7b775789fb024bf216acc13884c6c97752ae56" dependencies = [ "xmlparser", ] [[package]] name = "aws-types" -version = "1.3.9" +version = "1.3.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2fd329bf0e901ff3f60425691410c69094dc2a1f34b331f37bfc4e9ac1565a1" +checksum = "d79fb68e3d7fe5d4833ea34dc87d2e97d26d3086cb3da660bb6b1f76d98680b6" dependencies = [ "aws-credential-types", "aws-smithy-async", @@ -1191,7 +1191,7 @@ dependencies = [ "http 1.3.1", "http-body 1.0.1", "http-body-util", - "hyper 1.7.0", + "hyper 1.8.1", "hyper-util", "itoa", "matchit", @@ -1242,9 +1242,9 @@ dependencies = [ [[package]] name = "backon" -version = "1.5.2" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "592277618714fbcecda9a02ba7a8781f319d26532a88553bbacc77ba5d2b3a8d" +checksum = "cffb0e931875b666fc4fcb20fee52e9bbd1ef836fd9e9e04ec21555f9f85f7ef" dependencies = [ "fastrand", "gloo-timers", @@ -1323,15 +1323,15 @@ name = "beacon" version = "0.1.0" source = "git+https://github.com/helium/proto?branch=master#60e0047b6e0e38b8119a055b37a7043cb02dbc82" dependencies = [ - "base64 0.21.7", + "base64 0.22.1", "byteorder", "helium-proto", "prost", - "rand 0.7.3", - "rand_chacha 0.2.2", + "rand 0.8.5", + "rand_chacha 0.3.1", "rust_decimal", "serde", - "sha2 0.9.9", + "sha2 0.10.9", "thiserror 1.0.69", ] @@ -1359,10 +1359,10 @@ version = "0.72.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "993776b509cfb49c750f11b8f07a46fa23e0a1386ffc01fb1e7d343efc387895" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", "cexpr", "clang-sys", - "itertools 0.10.5", + "itertools 0.13.0", "log", "prettyplease", "proc-macro2", @@ -1370,7 +1370,7 @@ dependencies = [ "regex", "rustc-hash 2.1.1", "shlex", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -1396,11 +1396,11 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.9.4" +version = "2.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2261d10cca569e4643e526d8dc2e62e433cc8aba21ab764233731f8d369bf394" +checksum = "812e12b5285cc515a9c72a5c1d3b6d46a19dac5acfef5265968c166106e31dd3" dependencies = [ - "serde", + "serde_core", ] [[package]] @@ -1512,7 +1512,7 @@ dependencies = [ "proc-macro-crate 3.4.0", "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -1623,7 +1623,7 @@ checksum = "f9abbd1bc6865053c427f7198e6af43bfdedc55ab791faed4fbd361d789575ff" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -1634,9 +1634,9 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.10.1" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" +checksum = "b35204fbdc0b3f4446b89fc1ac2cf84a8a68971995d0bf2e925ec7cd960f9cb3" dependencies = [ "serde", ] @@ -1653,12 +1653,11 @@ dependencies = [ [[package]] name = "caps" -version = "0.5.5" +version = "0.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "190baaad529bcfbde9e1a19022c42781bdb6ff9de25721abdb8fd98c0807730b" +checksum = "fd1ddba47aba30b6a889298ad0109c3b8dcb0e8fc993b459daa7067d46f865e0" dependencies = [ "libc", - "thiserror 1.0.69", ] [[package]] @@ -1673,9 +1672,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.2.40" +version = "1.2.46" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1d05d92f4b1fd76aad469d46cdd858ca761576082cd37df81416691e50199fb" +checksum = "b97463e1064cb1b1c1384ad0a0b9c8abd0988e2a91f52606c80ef14aadb63e36" dependencies = [ "find-msvc-tools", "jobserver", @@ -1700,9 +1699,9 @@ dependencies = [ [[package]] name = "cfg-if" -version = "1.0.3" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2fd1289c04a9ea8cb22300a459a72a385d7c73d3259e2ed7dcb2af674838cfa9" +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" [[package]] name = "cfg_aliases" @@ -1718,7 +1717,7 @@ checksum = "45565fc9416b9896014f5732ac776f810ee53a66730c17e4020c3ec064a8f88f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -1758,9 +1757,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.48" +version = "4.5.51" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2134bb3ea021b78629caa971416385309e0131b351b25e01dc16fb54e1b5fae" +checksum = "4c26d721170e0295f191a69bd9a1f93efcdb0aff38684b61ab5750468972e5f5" dependencies = [ "clap_builder", "clap_derive", @@ -1768,9 +1767,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.48" +version = "4.5.51" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2ba64afa3c0a6df7fa517765e31314e983f51dda798ffba27b988194fb65dc9" +checksum = "75835f0c7bf681bfd05abe44e965760fea999a5286c6eb2d59883634fd02011a" dependencies = [ "anstream", "anstyle", @@ -1780,21 +1779,21 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.5.47" +version = "4.5.49" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbfd7eae0b0f1a6e63d4b13c9c478de77c2eb546fba158ad50b4203dc24b9f9c" +checksum = "2a0b5487afeab2deb2ff4e03a807ad1a03ac532ff5a2cee5d86884440c7f7671" dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] name = "clap_lex" -version = "0.7.5" +version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b94f61472cee1439c0b966b47e3aca9ae07e45d070759512cd390ea2bebc6675" +checksum = "a1d728cc89cf3aee9ff92b05e62b19ee65a02b5702cff7d5a377e32c6ae29d8d" [[package]] name = "cmake" @@ -1823,9 +1822,9 @@ dependencies = [ [[package]] name = "compression-codecs" -version = "0.4.31" +version = "0.4.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef8a506ec4b81c460798f572caead636d57d3d7e940f998160f52bd254bf2d23" +checksum = "680dc087785c5230f8e8843e2e57ac7c1c90488b6a91b88caa265410568f441b" dependencies = [ "brotli", "compression-core", @@ -1835,9 +1834,9 @@ dependencies = [ [[package]] name = "compression-core" -version = "0.4.29" +version = "0.4.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e47641d3deaf41fb1538ac1f54735925e275eaf3bf4d55c81b137fba797e5cbb" +checksum = "3a9b614a5787ef0c8802a55766480563cb3a93b435898c422ed2a359cf811582" [[package]] name = "concurrent-queue" @@ -1850,13 +1849,13 @@ dependencies = [ [[package]] name = "config" -version = "0.15.18" +version = "0.15.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "180e549344080374f9b32ed41bf3b6b57885ff6a289367b3dbc10eea8acc1918" +checksum = "b30fa8254caad766fc03cb0ccae691e14bf3bd72bfff27f72802ce729551b3d6" dependencies = [ "pathdiff", "serde_core", - "toml 0.9.7", + "toml 0.9.8", "winnow", ] @@ -2009,15 +2008,15 @@ checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5" [[package]] name = "crc-fast" -version = "1.3.0" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6bf62af4cc77d8fe1c22dde4e721d87f2f54056139d8c412e1366b740305f56f" +checksum = "6ddc2d09feefeee8bd78101665bd8645637828fa9317f9f292496dbbd8c65ff3" dependencies = [ "crc", "digest 0.10.7", - "libc", "rand 0.9.2", "regex", + "rustversion", ] [[package]] @@ -2125,21 +2124,21 @@ dependencies = [ [[package]] name = "csv" -version = "1.3.1" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acdc4883a9c96732e4733212c01447ebd805833b7275a73ca3ee080fd77afdaf" +checksum = "52cd9d68cf7efc6ddfaaee42e7288d3a99d613d4b50f76ce9827ae0c6e14f938" dependencies = [ "csv-core", "itoa", "ryu", - "serde", + "serde_core", ] [[package]] name = "csv-core" -version = "0.1.12" +version = "0.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d02f3b0da4c6504f86e9cd789d8dbafab48c2321be74e9987593de5a894d93d" +checksum = "704a3c26996a80471189265814dbc2c257598b96b8a7feae2d31ace646bb9782" dependencies = [ "memchr", ] @@ -2214,7 +2213,7 @@ checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -2267,7 +2266,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -2281,7 +2280,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -2292,7 +2291,7 @@ checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" dependencies = [ "darling_core 0.20.11", "quote", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -2303,7 +2302,7 @@ checksum = "d38308df82d1080de0afee5d069fa14b0326a88c14f15c5ccda35b4a6c414c81" dependencies = [ "darling_core 0.21.3", "quote", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -2349,14 +2348,14 @@ dependencies = [ name = "denylist" version = "0.1.0" dependencies = [ - "base64 0.21.7", + "base64 0.22.1", "bincode", "bytes", "chrono", "config", "helium-crypto", "humantime-serde", - "reqwest 0.12.23", + "reqwest 0.12.24", "serde", "serde_json", "sha2 0.10.9", @@ -2403,9 +2402,9 @@ dependencies = [ [[package]] name = "deranged" -version = "0.5.4" +version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a41953f86f8a05768a6cda24def994fd2f424b04ec5c719cf89989779f199071" +checksum = "ececcb659e7ba858fb4f10388c250a7252eb0a27373f1a72b8748afdd248e587" dependencies = [ "powerfmt", ] @@ -2445,7 +2444,7 @@ dependencies = [ "darling 0.20.11", "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -2455,7 +2454,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ab63b0e2bf4d5928aff72e83a7dace85d7bba5fe12dcc3c5a572d78caffd3f3c" dependencies = [ "derive_builder_core", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -2499,7 +2498,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -2522,7 +2521,7 @@ checksum = "a6cbae11b3de8fce2a456e8ea3dada226b35fe791f0dc1d360c0941f0bb681f3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -2533,9 +2532,9 @@ checksum = "1aaf95b3e5c8f23aa320147307562d361db0ae0d51242340f558153b4eb2439b" [[package]] name = "dtor" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e58a0764cddb55ab28955347b45be00ade43d4d6f3ba4bf3dc354e4ec9432934" +checksum = "404d02eeb088a82cfd873006cb713fe411306c7d182c344905e101fb1167d301" dependencies = [ "dtor-proc-macro", ] @@ -2722,7 +2721,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" dependencies = [ "libc", - "windows-sys 0.60.2", + "windows-sys 0.61.2", ] [[package]] @@ -2769,7 +2768,7 @@ version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "18c1ddb9231d8554c2d6bdf4cfaabf0c59251658c68b6c95cd52dd0c513a912a" dependencies = [ - "getrandom 0.3.3", + "getrandom 0.3.4", "libm", "rand 0.9.2", "siphasher 1.0.1", @@ -2823,7 +2822,7 @@ dependencies = [ "aws-config", "aws-sdk-s3", "aws-smithy-types-convert", - "base64 0.21.7", + "base64 0.22.1", "bs58", "bytes", "chrono", @@ -2863,7 +2862,7 @@ version = "0.1.0" dependencies = [ "anyhow", "async-trait", - "base64 0.21.7", + "base64 0.22.1", "beacon", "blake3", "bs58", @@ -2900,9 +2899,9 @@ dependencies = [ [[package]] name = "find-msvc-tools" -version = "0.1.3" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0399f9d26e5191ce32c498bebd31e7a3ceabc2745f0ac54af3f335126c3f24b3" +checksum = "3a3076410a55c90011c298b04d0cfa770b00fa04e1e3c97d3f6c9de105a03844" [[package]] name = "five8" @@ -2936,9 +2935,9 @@ checksum = "1d674e81391d1e1ab681a28d99df07927c6d4aa5b027d7da16ba32d1d21ecd99" [[package]] name = "flate2" -version = "1.1.4" +version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc5a4e564e38c699f2880d3fda590bedc2e69f3f84cd48b457bd892ce61d0aa9" +checksum = "bfe33edd8e85a12a67454e37f8c75e730830d83e313556ab9ebf9ee7fbeb3bfb" dependencies = [ "crc32fast", "miniz_oxide", @@ -3104,7 +3103,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -3145,9 +3144,9 @@ dependencies = [ [[package]] name = "generic-array" -version = "0.14.7" +version = "0.14.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +checksum = "4bb6743198531e02858aeaea5398fcc883e71851fcbcb5a2f773e2fb6cb1edf2" dependencies = [ "typenum", "version_check", @@ -3229,15 +3228,15 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.3.3" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4" +checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" dependencies = [ "cfg-if", "js-sys", "libc", "r-efi", - "wasi 0.14.7+wasi-0.2.4", + "wasip2", "wasm-bindgen", ] @@ -3411,6 +3410,12 @@ dependencies = [ "foldhash", ] +[[package]] +name = "hashbrown" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5419bdc4f6a9207fbeba6d11b604d481addf78ecd10c11ad51e76c2f6482748d" + [[package]] name = "hashlink" version = "0.10.0" @@ -3451,7 +3456,7 @@ version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f3ae6081be123db88474f4c5f12f9b0d3d90b9f5ce15171dee64fe92e3cae2dd" dependencies = [ - "base64 0.21.7", + "base64 0.22.1", "bs58", "byteorder", "ed25519-compact", @@ -3471,14 +3476,14 @@ dependencies = [ [[package]] name = "helium-lib" version = "0.2.0" -source = "git+https://github.com/helium/helium-wallet-rs?branch=master#e21e0f688fddeac9e8c8f26a57a55cea0f89ab9a" +source = "git+https://github.com/helium/helium-wallet-rs?branch=master#e1d20673d37df9731dea1ea902ad1f5d139c35ed" dependencies = [ "anchor-client", "anchor-lang", "anchor-spl", "angry-purple-tiger", "async-trait", - "base64 0.21.7", + "base64 0.22.1", "bincode", "bytemuck", "chrono", @@ -3513,7 +3518,7 @@ dependencies = [ [[package]] name = "helium-proto" version = "0.1.0" -source = "git+https://github.com/helium/proto?branch=master#db80ad554e92bde5aaa37b8dce583a8787d1727b" +source = "git+https://github.com/helium/proto?branch=master#60e0047b6e0e38b8119a055b37a7043cb02dbc82" dependencies = [ "bytes", "prost", @@ -3566,9 +3571,9 @@ dependencies = [ [[package]] name = "hex-literal" -version = "1.0.0" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bcaaec4551594c969335c98c903c1397853d4198408ea609190f420500f6be71" +checksum = "e712f64ec3850b98572bffac52e2c6f282b29fe6c5fa6d42334b30be438d95c1" [[package]] name = "hextree" @@ -3627,11 +3632,11 @@ dependencies = [ [[package]] name = "home" -version = "0.5.11" +version = "0.5.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "589533453244b0995c858700322199b2becb13b627df2851f64a2775d024abcf" +checksum = "cc627f471c528ff0c4a49e1d5e60450c8f6461dd6d10ba9dcd3a61d3dff7728d" dependencies = [ - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] @@ -3754,9 +3759,9 @@ dependencies = [ [[package]] name = "hyper" -version = "1.7.0" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb3aa54a13a0dfe7fbe3a59e0c76093041720fdc77b110cc0fc260fafb4dc51e" +checksum = "2ab2d4f250c3d7b1c9fcdff1cece94ea4e2dfbec68614f7b87cb205f24ca9d11" dependencies = [ "atomic-waker", "bytes", @@ -3798,15 +3803,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3c93eb611681b207e1fe55d5a71ecf91572ec8a6705cdb6857f7d8d5242cf58" dependencies = [ "http 1.3.1", - "hyper 1.7.0", + "hyper 1.8.1", "hyper-util", - "rustls 0.23.32", - "rustls-native-certs 0.8.1", + "rustls 0.23.35", + "rustls-native-certs 0.8.2", "rustls-pki-types", "tokio", "tokio-rustls 0.26.4", "tower-service", - "webpki-roots 1.0.2", + "webpki-roots 1.0.4", ] [[package]] @@ -3815,7 +3820,7 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b90d566bffbce6a75bd8b09a05aa8c2cb1fabb6cb348f8840c9e4c90a0d83b0" dependencies = [ - "hyper 1.7.0", + "hyper 1.8.1", "hyper-util", "pin-project-lite", "tokio", @@ -3830,7 +3835,7 @@ checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" dependencies = [ "bytes", "http-body-util", - "hyper 1.7.0", + "hyper 1.8.1", "hyper-util", "native-tls", "tokio", @@ -3840,9 +3845,9 @@ dependencies = [ [[package]] name = "hyper-util" -version = "0.1.17" +version = "0.1.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c6995591a8f1380fcb4ba966a252a4b29188d51d2b89e3a252f5305be65aea8" +checksum = "52e9a2a24dc5c6821e71a7030e1e14b7b632acac55c40e9d2e082c621261bb56" dependencies = [ "base64 0.22.1", "bytes", @@ -3851,12 +3856,12 @@ dependencies = [ "futures-util", "http 1.3.1", "http-body 1.0.1", - "hyper 1.7.0", + "hyper 1.8.1", "ipnet", "libc", "percent-encoding", "pin-project-lite", - "socket2 0.5.10", + "socket2 0.6.1", "tokio", "tower-service", "tracing", @@ -3930,9 +3935,9 @@ dependencies = [ [[package]] name = "icu_collections" -version = "2.0.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "200072f5d0e3614556f94a9930d5dc3e0662a652823904c3a75dc3b0af7fee47" +checksum = "4c6b649701667bbe825c3b7e6388cb521c23d88644678e83c0c4d0a621a34b43" dependencies = [ "displaydoc", "potential_utf", @@ -3943,9 +3948,9 @@ dependencies = [ [[package]] name = "icu_locale_core" -version = "2.0.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0cde2700ccaed3872079a65fb1a78f6c0a36c91570f28755dda67bc8f7d9f00a" +checksum = "edba7861004dd3714265b4db54a3c390e880ab658fec5f7db895fae2046b5bb6" dependencies = [ "displaydoc", "litemap", @@ -3956,11 +3961,10 @@ dependencies = [ [[package]] name = "icu_normalizer" -version = "2.0.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "436880e8e18df4d7bbc06d58432329d6458cc84531f7ac5f024e93deadb37979" +checksum = "5f6c8828b67bf8908d82127b2054ea1b4427ff0230ee9141c54251934ab1b599" dependencies = [ - "displaydoc", "icu_collections", "icu_normalizer_data", "icu_properties", @@ -3971,42 +3975,38 @@ dependencies = [ [[package]] name = "icu_normalizer_data" -version = "2.0.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00210d6893afc98edb752b664b8890f0ef174c8adbb8d0be9710fa66fbbf72d3" +checksum = "7aedcccd01fc5fe81e6b489c15b247b8b0690feb23304303a9e560f37efc560a" [[package]] name = "icu_properties" -version = "2.0.1" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "016c619c1eeb94efb86809b015c58f479963de65bdb6253345c1a1276f22e32b" +checksum = "e93fcd3157766c0c8da2f8cff6ce651a31f0810eaa1c51ec363ef790bbb5fb99" dependencies = [ - "displaydoc", "icu_collections", "icu_locale_core", "icu_properties_data", "icu_provider", - "potential_utf", "zerotrie", "zerovec", ] [[package]] name = "icu_properties_data" -version = "2.0.1" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "298459143998310acd25ffe6810ed544932242d3f07083eee1084d83a71bd632" +checksum = "02845b3647bb045f1100ecd6480ff52f34c35f82d9880e029d329c21d1054899" [[package]] name = "icu_provider" -version = "2.0.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03c80da27b5f4187909049ee2d72f276f0d9f99a42c306bd0131ecfe04d8e5af" +checksum = "85962cf0ce02e1e0a629cc34e7ca3e373ce20dda4c4d7294bbd0bf1fdb59e614" dependencies = [ "displaydoc", "icu_locale_core", - "stable_deref_trait", - "tinystr", "writeable", "yoke", "zerofrom", @@ -4043,12 +4043,12 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.11.4" +version = "2.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b0f83760fb341a774ed326568e19f5a863af4a952def8c39f9ab92fd95b88e5" +checksum = "6717a8d2a5a929a1a2eb43a12812498ed141a0bcfb7e8f7844fbdbe4303bba9f" dependencies = [ "equivalent", - "hashbrown 0.15.5", + "hashbrown 0.16.0", "serde", "serde_core", ] @@ -4071,8 +4071,8 @@ name = "ingest" version = "0.1.0" dependencies = [ "anyhow", - "backon 1.5.2", - "base64 0.21.7", + "backon 1.6.0", + "base64 0.22.1", "bs58", "chrono", "clap", @@ -4136,17 +4136,6 @@ dependencies = [ "generic-array", ] -[[package]] -name = "io-uring" -version = "0.7.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "046fa2d4d00aea763528b4950358d0ead425372445dc8ff86312b3c69ff7727b" -dependencies = [ - "bitflags 2.9.4", - "cfg-if", - "libc", -] - [[package]] name = "iot-config" version = "0.1.0" @@ -4154,7 +4143,7 @@ dependencies = [ "anyhow", "async-trait", "backon 0.5.0", - "base64 0.21.7", + "base64 0.22.1", "bs58", "chrono", "clap", @@ -4239,7 +4228,7 @@ version = "0.1.0" dependencies = [ "anyhow", "async-trait", - "base64 0.21.7", + "base64 0.22.1", "beacon", "blake3", "chrono", @@ -4296,9 +4285,9 @@ checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" [[package]] name = "iri-string" -version = "0.7.8" +version = "0.7.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbc5ebe9c3a1a7a5127f920a418f7585e9e758e911d0466ed004f393b0e380b2" +checksum = "4f867b9d1d896b67beb18518eda36fdb77a32ea590de864f1325b294a6d14397" dependencies = [ "memchr", "serde", @@ -4306,9 +4295,9 @@ dependencies = [ [[package]] name = "is_terminal_polyfill" -version = "1.70.1" +version = "1.70.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" +checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695" [[package]] name = "itertools" @@ -4380,15 +4369,15 @@ version = "0.1.34" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33" dependencies = [ - "getrandom 0.3.3", + "getrandom 0.3.4", "libc", ] [[package]] name = "js-sys" -version = "0.3.81" +version = "0.3.82" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec48937a97411dcb524a265206ccd4c90bb711fca92b2792c407f268825b9305" +checksum = "b011eec8cc36da2aab2d5cff675ec18454fad408585853910a202391cf9f8e65" dependencies = [ "once_cell", "wasm-bindgen", @@ -4562,9 +4551,9 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.176" +version = "0.2.177" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58f929b4d672ea937a23a1ab494143d968337a5f47e56d0815df1e0890ddf174" +checksum = "2874a2af47a2325c2001a6e6fad9b16a53b802102b528163885171cf92b15976" [[package]] name = "libflate" @@ -4588,12 +4577,12 @@ dependencies = [ [[package]] name = "libloading" -version = "0.8.8" +version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07033963ba89ebaf1584d767badaa2e8fcec21aedea6b8c0346d487d49c28667" +checksum = "d7c4b02199fee7c5d21a5ae7d8cfa79a6ef5bb2fc834d6e9058e89c825efdc55" dependencies = [ "cfg-if", - "windows-targets 0.48.5", + "windows-link", ] [[package]] @@ -4608,7 +4597,7 @@ version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "416f7e718bdb06000964960ffa43b4335ad4012ae8b99060261aa4a8088d5ccb" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", "libc", "redox_syscall", ] @@ -4679,9 +4668,9 @@ checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039" [[package]] name = "litemap" -version = "0.8.0" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956" +checksum = "6373607a59f0be73a39b6fe456b8192fcc3585f602af20751600e974dd455e77" [[package]] name = "lock_api" @@ -4808,7 +4797,7 @@ checksum = "2b166dea96003ee2531cf14833efedced545751d800f03535801d833313f8c15" dependencies = [ "base64 0.22.1", "http-body-util", - "hyper 1.7.0", + "hyper 1.8.1", "hyper-rustls 0.27.7", "hyper-util", "indexmap", @@ -4856,7 +4845,7 @@ checksum = "db5b29714e950dbb20d5e6f74f9dcec4edbcc1067bb7f8ed198c097b8c1a818b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -4895,13 +4884,13 @@ dependencies = [ [[package]] name = "mio" -version = "1.0.4" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c" +checksum = "69d83b0086dc8ecf3ce9ae2874b2d1290252e2a30720bea58a5c6639b0092873" dependencies = [ "libc", "wasi 0.11.1+wasi-snapshot-preview1", - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] @@ -4910,7 +4899,7 @@ version = "0.1.0" dependencies = [ "anyhow", "async-trait", - "base64 0.21.7", + "base64 0.22.1", "blake3", "bs58", "chrono", @@ -4966,7 +4955,7 @@ version = "0.1.0" dependencies = [ "angry-purple-tiger", "anyhow", - "base64 0.21.7", + "base64 0.22.1", "clap", "custom-tracing", "dialoguer", @@ -5010,7 +4999,7 @@ dependencies = [ "mobile-config", "poc-metrics", "prost", - "reqwest 0.12.23", + "reqwest 0.12.24", "serde", "serde_json", "sha2 0.10.9", @@ -5034,7 +5023,7 @@ dependencies = [ "async-compression", "async-trait", "aws-local", - "base64 0.21.7", + "base64 0.22.1", "chrono", "clap", "config", @@ -5148,7 +5137,7 @@ version = "0.30.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "74523f3a35e05aba87a1d978330aef40f67b0304ac79c1c00b294c9830543db6" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", "cfg-if", "cfg_aliases", "libc", @@ -5183,7 +5172,7 @@ version = "6.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6205bd8bb1e454ad2e27422015fb5e4f2bcc7e08fa8f27058670d208324a4d2d" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", "filetime", "fsevent-sys", "inotify", @@ -5197,11 +5186,11 @@ dependencies = [ [[package]] name = "nu-ansi-term" -version = "0.50.1" +version = "0.50.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4a28e057d01f97e61255210fcff094d74ed0466038633e95017f5beb68e4399" +checksum = "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5" dependencies = [ - "windows-sys 0.52.0", + "windows-sys 0.61.2", ] [[package]] @@ -5258,11 +5247,10 @@ dependencies = [ [[package]] name = "num-bigint-dig" -version = "0.8.4" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc84195820f291c7697304f3cbdadd1cb7199c0efc917ff5eafd71225c136151" +checksum = "e661dda6640fad38e827a6d4a310ff4763082116fe217f279885c97f511bb0b7" dependencies = [ - "byteorder", "lazy_static", "libm", "num-integer", @@ -5297,7 +5285,7 @@ checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -5354,9 +5342,9 @@ dependencies = [ [[package]] name = "num_enum" -version = "0.7.4" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a973b4e44ce6cad84ce69d797acf9a044532e4184c4f267913d1b546a0727b7a" +checksum = "b1207a7e20ad57b847bbddc6776b968420d38292bbfe2089accff5e19e82454c" dependencies = [ "num_enum_derive", "rustversion", @@ -5364,14 +5352,14 @@ dependencies = [ [[package]] name = "num_enum_derive" -version = "0.7.4" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77e878c846a8abae00dd069496dbe8751b16ac1c3d6bd2a7283a938e8228f90d" +checksum = "ff32365de1b6743cb203b710788263c44a03de03802daf96092f2da4fe6ba4d7" dependencies = [ - "proc-macro-crate 1.1.3", + "proc-macro-crate 3.4.0", "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -5406,9 +5394,9 @@ checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" [[package]] name = "once_cell_polyfill" -version = "1.70.1" +version = "1.70.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4895175b425cb1f87721b59f0f286c2092bd4af812243672510e1ac53e2e0ad" +checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe" [[package]] name = "opaque-debug" @@ -5418,11 +5406,11 @@ checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" [[package]] name = "openssl" -version = "0.10.73" +version = "0.10.75" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8505734d46c8ab1e19a1dce3aef597ad87dcb4c37e7188231769bd6bd51cebf8" +checksum = "08838db121398ad17ab8531ce9de97b244589089e290a384c900cb9ff7434328" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", "cfg-if", "foreign-types", "libc", @@ -5439,7 +5427,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -5450,9 +5438,9 @@ checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" [[package]] name = "openssl-sys" -version = "0.9.109" +version = "0.9.111" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90096e2e47630d78b7d1c20952dc621f957103f8bc2c8359ec81290d75238571" +checksum = "82cab2d520aa75e3c58898289429321eb788c3106963d0dc886ec7a5f4adc321" dependencies = [ "cc", "libc", @@ -5610,7 +5598,7 @@ checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -5667,7 +5655,7 @@ name = "poc-entropy" version = "0.1.0" dependencies = [ "anyhow", - "base64 0.21.7", + "base64 0.22.1", "blake3", "bs58", "chrono", @@ -5706,7 +5694,7 @@ dependencies = [ "futures", "metrics", "metrics-exporter-prometheus", - "reqwest 0.12.23", + "reqwest 0.12.24", "serde", "thiserror 1.0.69", "tokio", @@ -5749,9 +5737,9 @@ checksum = "f84267b20a16ea918e43c6a88433c2d54fa145c92a811b5b047ccbe153674483" [[package]] name = "potential_utf" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84df19adbe5b5a0782edcab45899906947ab039ccf4573713735ee7de1e6b08a" +checksum = "b73949432f5e2a09657003c25bca5e19a0e9c84f8058ca374f49e0ebe605af77" dependencies = [ "zerovec", ] @@ -5778,7 +5766,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" dependencies = [ "proc-macro2", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -5850,7 +5838,7 @@ version = "3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "219cb19e96be00ab2e37d6e299658a0cfa83e52429179969b0f0121b4ac46983" dependencies = [ - "toml_edit 0.23.6", + "toml_edit 0.23.7", ] [[package]] @@ -5879,23 +5867,22 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.101" +version = "1.0.103" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89ae43fd86e4158d6db51ad8e2b80f313af9cc74f5c0e03ccb87de09998732de" +checksum = "5ee95bc4ef87b8d5ba32e8b7714ccc834865276eab0aed5c9958d00ec45f49e8" dependencies = [ "unicode-ident", ] [[package]] name = "proptest" -version = "1.8.0" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2bb0be07becd10686a0bb407298fb425360a5c44a663774406340c59a22de4ce" +checksum = "bee689443a2bd0a16ab0348b52ee43e3b2d1b1f931c8aa5c9f8de4c86fbe8c40" dependencies = [ "bit-set", "bit-vec", - "bitflags 2.9.4", - "lazy_static", + "bitflags 2.10.0", "num-traits", "rand 0.9.2", "rand_chacha 0.9.0", @@ -5923,7 +5910,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ac6c3320f9abac597dcbc668774ef006702672474aad53c6d596b62e487b40b1" dependencies = [ "heck 0.5.0", - "itertools 0.10.5", + "itertools 0.14.0", "log", "multimap", "once_cell", @@ -5934,7 +5921,7 @@ dependencies = [ "pulldown-cmark", "pulldown-cmark-to-cmark", "regex", - "syn 2.0.106", + "syn 2.0.110", "tempfile", ] @@ -5945,10 +5932,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9120690fafc389a67ba3803df527d0ec9cbbc9cc45e4cc20b332996dfb672425" dependencies = [ "anyhow", - "itertools 0.10.5", + "itertools 0.14.0", "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -5986,16 +5973,16 @@ version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e8bbe1a966bd2f362681a44f6edce3c2310ac21e4d5067a6e7ec396297a6ea0" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", "memchr", "unicase", ] [[package]] name = "pulldown-cmark-to-cmark" -version = "21.0.0" +version = "21.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5b6a0769a491a08b31ea5c62494a8f144ee0987d86d670a8af4df1e1b7cde75" +checksum = "8246feae3db61428fd0bb94285c690b460e4517d83152377543ca802357785f1" dependencies = [ "pulldown-cmark", ] @@ -6042,8 +6029,8 @@ dependencies = [ "quinn-proto", "quinn-udp", "rustc-hash 2.1.1", - "rustls 0.23.32", - "socket2 0.5.10", + "rustls 0.23.35", + "socket2 0.6.1", "thiserror 2.0.17", "tokio", "tracing", @@ -6058,12 +6045,12 @@ checksum = "f1906b49b0c3bc04b5fe5d86a77925ae6524a19b816ae38ce1e426255f1d8a31" dependencies = [ "bytes", "fastbloom", - "getrandom 0.3.3", + "getrandom 0.3.4", "lru-slab", "rand 0.9.2", "ring", "rustc-hash 2.1.1", - "rustls 0.23.32", + "rustls 0.23.35", "rustls-pki-types", "rustls-platform-verifier", "slab", @@ -6082,16 +6069,16 @@ dependencies = [ "cfg_aliases", "libc", "once_cell", - "socket2 0.5.10", + "socket2 0.6.1", "tracing", "windows-sys 0.60.2", ] [[package]] name = "quote" -version = "1.0.41" +version = "1.0.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce25767e7b499d1b604768e7cde645d14cc8584231ea6b295e9c9eb22c02e1d1" +checksum = "a338cc41d27e6cc6dce6cefc13a0729dfbb81c262b1f519331575dd80ef3067f" dependencies = [ "proc-macro2", ] @@ -6196,7 +6183,7 @@ version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" dependencies = [ - "getrandom 0.3.3", + "getrandom 0.3.4", ] [[package]] @@ -6232,7 +6219,7 @@ version = "11.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "498cd0dc59d73224351ee52a95fee0f1a617a2eae0e7d9d720cc622c73a54186" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", ] [[package]] @@ -6261,14 +6248,14 @@ version = "0.5.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", ] [[package]] name = "regex" -version = "1.11.3" +version = "1.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b5288124840bee7b386bc413c487869b360b2b4ec421ea56425128692f2a82c" +checksum = "843bc0191f75f3e22651ae5f1e72939ab2f72a4bc30fa80a066bd66edefc24d4" dependencies = [ "aho-corasick", "memchr", @@ -6278,9 +6265,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.11" +version = "0.4.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "833eb9ce86d40ef33cb1306d8accf7bc8ec2bfea4355cbdebb3df68b40925cad" +checksum = "5276caf25ac86c8d810222b3dbb938e512c55c6831a10f3e6ed1c93b84041f1c" dependencies = [ "aho-corasick", "memchr", @@ -6289,15 +6276,15 @@ dependencies = [ [[package]] name = "regex-lite" -version = "0.1.7" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "943f41321c63ef1c92fd763bfe054d2668f7f225a5c29f0105903dc2fc04ba30" +checksum = "8d942b98df5e658f56f20d592c7f868833fe38115e65c33003d8cd224b0155da" [[package]] name = "regex-syntax" -version = "0.8.6" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "caf4aa5b0f434c91fe5c7f1ecb6a5ece2130b02ad2a590589dda5146df959001" +checksum = "7a2d987857b319362043e95f5353c0535c1f58eec5336fdfcf626430af7def58" [[package]] name = "relative-path" @@ -6357,9 +6344,9 @@ dependencies = [ [[package]] name = "reqwest" -version = "0.12.23" +version = "0.12.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d429f34c8092b2d42c7c93cec323bb4adeb7c67698f70839adec842ec10c7ceb" +checksum = "9d0946410b9f7b082a427e4ef5c8ff541a88b357bc6c637c40db3a68ac70a36f" dependencies = [ "async-compression", "base64 0.22.1", @@ -6371,7 +6358,7 @@ dependencies = [ "http 1.3.1", "http-body 1.0.1", "http-body-util", - "hyper 1.7.0", + "hyper 1.8.1", "hyper-rustls 0.27.7", "hyper-tls", "hyper-util", @@ -6381,7 +6368,7 @@ dependencies = [ "percent-encoding", "pin-project-lite", "quinn", - "rustls 0.23.32", + "rustls 0.23.35", "rustls-pki-types", "serde", "serde_json", @@ -6398,7 +6385,7 @@ dependencies = [ "wasm-bindgen", "wasm-bindgen-futures", "web-sys", - "webpki-roots 1.0.2", + "webpki-roots 1.0.4", ] [[package]] @@ -6410,7 +6397,7 @@ dependencies = [ "anyhow", "async-trait", "http 1.3.1", - "reqwest 0.12.23", + "reqwest 0.12.24", "serde", "thiserror 1.0.69", "tower-service", @@ -6435,7 +6422,7 @@ version = "0.1.0" dependencies = [ "anyhow", "async-trait", - "base64 0.21.7", + "base64 0.22.1", "bs58", "chrono", "clap", @@ -6576,13 +6563,13 @@ dependencies = [ [[package]] name = "rsa" -version = "0.9.8" +version = "0.9.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78928ac1ed176a5ca1d17e578a1825f3d81ca54cf41053a592584b020cfd691b" +checksum = "40a0376c50d0358279d9d643e4bf7b7be212f1f4ff1da9070a7b54d22ef75c88" dependencies = [ "const-oid", "digest 0.10.7", - "num-bigint-dig 0.8.4", + "num-bigint-dig 0.8.6", "num-integer", "num-traits", "pkcs1", @@ -6628,15 +6615,15 @@ dependencies = [ "regex", "relative-path", "rustc_version", - "syn 2.0.106", + "syn 2.0.110", "unicode-ident", ] [[package]] name = "rust_decimal" -version = "1.38.0" +version = "1.39.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8975fc98059f365204d635119cf9c5a60ae67b841ed49b5422a9a7e56cdfac0" +checksum = "35affe401787a9bd846712274d97654355d21b2a2c092a3139aabe31e9022282" dependencies = [ "arrayvec", "borsh 1.5.7", @@ -6651,12 +6638,12 @@ dependencies = [ [[package]] name = "rust_decimal_macros" -version = "1.38.0" +version = "1.39.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6dae310b657d2d686616e215c84c3119c675450d64c4b9f9e3467209191c3bcf" +checksum = "ae8c0cb48f413ebe24dc2d148788e0efbe09ba3e011d9277162f2eaf8e1069a3" dependencies = [ "quote", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -6701,11 +6688,11 @@ version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cd15f8a2c5551a84d56efdc1cd049089e409ac19a3072d5037a17fd70719ff3e" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", "errno", "libc", "linux-raw-sys", - "windows-sys 0.60.2", + "windows-sys 0.61.2", ] [[package]] @@ -6722,16 +6709,16 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.32" +version = "0.23.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd3c25631629d034ce7cd9940adc9d45762d46de2b0f57193c4443b92c6d4d40" +checksum = "533f54bc6a7d4f647e46ad909549eda97bf5afc1585190ef692b4286b198bd8f" dependencies = [ "aws-lc-rs", "log", "once_cell", "ring", "rustls-pki-types", - "rustls-webpki 0.103.7", + "rustls-webpki 0.103.8", "subtle", "zeroize", ] @@ -6750,9 +6737,9 @@ dependencies = [ [[package]] name = "rustls-native-certs" -version = "0.8.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fcff2dd52b58a8d98a70243663a0d234c4e2b79235637849d15913394a247d3" +checksum = "9980d917ebb0c0536119ba501e90834767bffc3d60641457fd84a1f3fd337923" dependencies = [ "openssl-probe", "rustls-pki-types", @@ -6771,9 +6758,9 @@ dependencies = [ [[package]] name = "rustls-pki-types" -version = "1.12.0" +version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "229a4a4c221013e7e1f1a043678c5cc39fe5171437c88fb47151a21e6f5b5c79" +checksum = "94182ad936a0c91c324cd46c6511b9510ed16af436d7b5bab34beab0afd55f7a" dependencies = [ "web-time", "zeroize", @@ -6781,23 +6768,23 @@ dependencies = [ [[package]] name = "rustls-platform-verifier" -version = "0.6.1" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be59af91596cac372a6942530653ad0c3a246cdd491aaa9dcaee47f88d67d5a0" +checksum = "1d99feebc72bae7ab76ba994bb5e121b8d83d910ca40b36e0921f53becc41784" dependencies = [ "core-foundation 0.10.1", "core-foundation-sys", "jni", "log", "once_cell", - "rustls 0.23.32", - "rustls-native-certs 0.8.1", + "rustls 0.23.35", + "rustls-native-certs 0.8.2", "rustls-platform-verifier-android", - "rustls-webpki 0.103.7", + "rustls-webpki 0.103.8", "security-framework 3.5.1", "security-framework-sys", "webpki-root-certs", - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] @@ -6818,9 +6805,9 @@ dependencies = [ [[package]] name = "rustls-webpki" -version = "0.103.7" +version = "0.103.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e10b3f4191e8a80e6b43eebabfac91e5dcecebb27a71f04e820c47ec41d314bf" +checksum = "2ffdfa2f5286e2247234e03f680868ac2815974dc39e00ea15adc445d0aafe52" dependencies = [ "aws-lc-rs", "ring", @@ -6925,7 +6912,7 @@ version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", "core-foundation 0.9.4", "core-foundation-sys", "libc", @@ -6938,7 +6925,7 @@ version = "3.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b3297343eaf830f66ede390ea39da1d462b6b0c1b000f420d0a83f898bbbe6ef" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", "core-foundation 0.10.1", "core-foundation-sys", "libc", @@ -7007,7 +6994,7 @@ checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -7042,7 +7029,7 @@ checksum = "175ee3e80ae9982737ca543e96133087cbd9a485eecc3bc4de9c1a37b47ea59c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -7056,9 +7043,9 @@ dependencies = [ [[package]] name = "serde_spanned" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5417783452c2be558477e104686f7de5dae53dba813c28435e0e70f82d9b04ee" +checksum = "e24345aa0fe688594e73770a5f6d1b216508b4f93484c0026d521acd30134392" dependencies = [ "serde_core", ] @@ -7077,9 +7064,9 @@ dependencies = [ [[package]] name = "serde_with" -version = "3.15.0" +version = "3.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6093cd8c01b25262b84927e0f7151692158fab02d961e04c979d3903eba7ecc5" +checksum = "aa66c845eee442168b2c8134fec70ac50dc20e760769c8ba0ad1319ca1959b04" dependencies = [ "serde_core", "serde_with_macros", @@ -7087,14 +7074,14 @@ dependencies = [ [[package]] name = "serde_with_macros" -version = "3.15.0" +version = "3.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7e6c180db0816026a61afa1cff5344fb7ebded7e4d3062772179f2501481c27" +checksum = "b91a903660542fced4e99881aa481bdbaec1634568ee02e0b8bd57c64cb38955" dependencies = [ "darling 0.21.3", "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -7271,12 +7258,12 @@ dependencies = [ [[package]] name = "socket2" -version = "0.6.0" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "233504af464074f9d066d7b5416c5f9b894a5862a6506e306f7b816cdd6f1807" +checksum = "17129e116933cf371d018bb80ae557e889637989d8638274fb25622827b03881" dependencies = [ "libc", - "windows-sys 0.59.0", + "windows-sys 0.60.2", ] [[package]] @@ -7325,9 +7312,9 @@ dependencies = [ [[package]] name = "solana-account-decoder" -version = "2.3.12" +version = "2.3.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26815fb228611d6f75908a979bc148127d4c391aecda0ea58144981320250535" +checksum = "ba71c97fa4d85ce4a1e0e79044ad0406c419382be598c800202903a7688ce71a" dependencies = [ "Inflector", "base64 0.22.1", @@ -7368,9 +7355,9 @@ dependencies = [ [[package]] name = "solana-account-decoder-client-types" -version = "2.3.12" +version = "2.3.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aba51728bba2d7cdb86c92c0e5d3c33e9c98f11defe16d1042861ac732fc99bb" +checksum = "5519e8343325b707f17fbed54fcefb325131b692506d0af9e08a539d15e4f8cf" dependencies = [ "base64 0.22.1", "bs58", @@ -7482,9 +7469,9 @@ dependencies = [ [[package]] name = "solana-client" -version = "2.3.12" +version = "2.3.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7488cc84ebf8bb809dd019d84f069a0b709666ae5b155230e9089bd59ce1d908" +checksum = "cc55d1f263e0be4127daf33378d313ea0977f9ffd3fba50fa544ca26722fc695" dependencies = [ "async-trait", "bincode", @@ -7609,9 +7596,9 @@ dependencies = [ [[package]] name = "solana-connection-cache" -version = "2.3.12" +version = "2.3.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "354714af37a6d26d93416a6b91d95f2a906e21a22d65033ac08cb40e18ef26a7" +checksum = "45c1cff5ebb26aefff52f1a8e476de70ec1683f8cc6e4a8c86b615842d91f436" dependencies = [ "async-trait", "bincode", @@ -7646,9 +7633,9 @@ dependencies = [ [[package]] name = "solana-curve25519" -version = "2.3.12" +version = "2.3.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa77936de1910002e7ad5817e38c3990402c2d8e92517cdd736df51485c76d88" +checksum = "eae4261b9a8613d10e77ac831a8fa60b6fa52b9b103df46d641deff9f9812a23" dependencies = [ "bytemuck", "bytemuck_derive", @@ -7894,9 +7881,9 @@ dependencies = [ [[package]] name = "solana-instruction" -version = "2.3.0" +version = "2.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47298e2ce82876b64f71e9d13a46bc4b9056194e7f9937ad3084385befa50885" +checksum = "bab5682934bd1f65f8d2c16f21cb532526fcc1a09f796e2cacdb091eee5774ad" dependencies = [ "bincode", "borsh 1.5.7", @@ -7905,6 +7892,7 @@ dependencies = [ "num-traits", "serde", "serde_derive", + "serde_json", "solana-define-syscall", "solana-pubkey", "wasm-bindgen", @@ -7916,7 +7904,7 @@ version = "2.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e0e85a6fad5c2d0c4f5b91d34b8ca47118fc593af706e523cdbedf846a954f57" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", "solana-account-info", "solana-instruction", "solana-program-error", @@ -8030,9 +8018,9 @@ dependencies = [ [[package]] name = "solana-measure" -version = "2.3.12" +version = "2.3.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d98d3c9827ce044863fc67b7cbc15c341c27bf6fa9c1070deccd2a4aa7cb801d" +checksum = "11dcd67cd2ae6065e494b64e861e0498d046d95a61cbbf1ae3d58be1ea0f42ed" [[package]] name = "solana-message" @@ -8059,14 +8047,14 @@ dependencies = [ [[package]] name = "solana-metrics" -version = "2.3.12" +version = "2.3.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "062baa36c40a08f413b1f84c8b739649609883af47e1624a85eaf9f90075441e" +checksum = "0375159d8460f423d39e5103dcff6e07796a5ec1850ee1fcfacfd2482a8f34b5" dependencies = [ "crossbeam-channel", "gethostname", "log", - "reqwest 0.12.23", + "reqwest 0.12.24", "solana-cluster-type", "solana-sha256-hasher", "solana-time-utils", @@ -8090,9 +8078,9 @@ checksum = "61515b880c36974053dd499c0510066783f0cc6ac17def0c7ef2a244874cf4a9" [[package]] name = "solana-net-utils" -version = "2.3.12" +version = "2.3.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32867badc4fc61a156bf11373740ce611c1c171c790eda221f3b82d0d0947e9b" +checksum = "d7a9e831d0f09bd92135d48c5bc79071bb59c0537b9459f1b4dec17ecc0558fa" dependencies = [ "anyhow", "bincode", @@ -8158,7 +8146,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "004f2d2daf407b3ec1a1ca5ec34b3ccdfd6866dd2d3c7d0715004a96e4b6d127" dependencies = [ "bincode", - "bitflags 2.9.4", + "bitflags 2.10.0", "cfg_eval", "serde", "serde_derive", @@ -8167,9 +8155,9 @@ dependencies = [ [[package]] name = "solana-perf" -version = "2.3.12" +version = "2.3.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c7b6e57afcee6a5e2aaa0ec66d539148d6fc4c672927479ef1a2685d9976d8a" +checksum = "37192c0be5c222ca49dbc5667288c5a8bb14837051dd98e541ee4dad160a5da9" dependencies = [ "ahash 0.8.12", "bincode", @@ -8406,9 +8394,9 @@ dependencies = [ [[package]] name = "solana-pubsub-client" -version = "2.3.12" +version = "2.3.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86b1fa505f2c24107525b3d1b49a2fbe78f9430cb97e3a0e9957dd215f4b2bdf" +checksum = "d18a7476e1d2e8df5093816afd8fffee94fbb6e442d9be8e6bd3e85f88ce8d5c" dependencies = [ "crossbeam-channel", "futures-util", @@ -8433,9 +8421,9 @@ dependencies = [ [[package]] name = "solana-quic-client" -version = "2.3.12" +version = "2.3.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4dff89c984bb7d1dd0db254c4717fc0364f13c0d54a9c84b389359e60a4475f" +checksum = "44feb5f4a97494459c435aa56de810500cc24e22d0afc632990a8e54a07c05a4" dependencies = [ "async-lock 3.4.1", "async-trait", @@ -8444,7 +8432,7 @@ dependencies = [ "log", "quinn", "quinn-proto", - "rustls 0.23.32", + "rustls 0.23.35", "solana-connection-cache", "solana-keypair", "solana-measure", @@ -8472,9 +8460,9 @@ dependencies = [ [[package]] name = "solana-rayon-threadlimit" -version = "2.3.12" +version = "2.3.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b95e07583c317e5a56681932bb9d05f2b4f1c679d44c36550f32095677e8779f" +checksum = "02cc2a4cae3ef7bb6346b35a60756d2622c297d5fa204f96731db9194c0dc75b" dependencies = [ "num_cpus", ] @@ -8543,9 +8531,9 @@ dependencies = [ [[package]] name = "solana-rpc-client" -version = "2.3.12" +version = "2.3.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7529f262a01dc4ceb0444bcc2103603be071a66d55554690b184ea87bd57d4e" +checksum = "b8d3161ac0918178e674c1f7f1bfac40de3e7ed0383bd65747d63113c156eaeb" dependencies = [ "async-trait", "base64 0.22.1", @@ -8554,7 +8542,7 @@ dependencies = [ "futures", "indicatif", "log", - "reqwest 0.12.23", + "reqwest 0.12.24", "reqwest-middleware", "semver", "serde", @@ -8583,13 +8571,13 @@ dependencies = [ [[package]] name = "solana-rpc-client-api" -version = "2.3.12" +version = "2.3.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21751b079e5fd6726aaae3788472d5a3f036a627dc8b6d4ffcfde1d6459102c3" +checksum = "2dbc138685c79d88a766a8fd825057a74ea7a21e1dd7f8de275ada899540fff7" dependencies = [ "anyhow", "jsonrpc-core", - "reqwest 0.12.23", + "reqwest 0.12.24", "reqwest-middleware", "serde", "serde_derive", @@ -8605,9 +8593,9 @@ dependencies = [ [[package]] name = "solana-rpc-client-nonce-utils" -version = "2.3.12" +version = "2.3.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09da559a19ee6b6bd5ff1f23cd936acbc9e0f92387935235a10dee4d3a13bd71" +checksum = "87f0ee41b9894ff36adebe546a110b899b0d0294b07845d8acdc73822e6af4b0" dependencies = [ "solana-account", "solana-commitment-config", @@ -8622,9 +8610,9 @@ dependencies = [ [[package]] name = "solana-rpc-client-types" -version = "2.3.12" +version = "2.3.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0e1d4088b578c253a412725888333f776de0b52de61cbe1178c43308107e071" +checksum = "8ea428a81729255d895ea47fba9b30fd4dacbfe571a080448121bd0592751676" dependencies = [ "base64 0.22.1", "bs58", @@ -8741,7 +8729,7 @@ dependencies = [ "bs58", "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -8960,9 +8948,9 @@ dependencies = [ [[package]] name = "solana-streamer" -version = "2.3.12" +version = "2.3.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d04674440673451ce3cd7a9f8d82b4de657b9317791df93ddff414a34244c50d" +checksum = "5643516e5206b89dd4bdf67c39815606d835a51a13260e43349abdb92d241b1d" dependencies = [ "async-channel", "bytes", @@ -8982,7 +8970,7 @@ dependencies = [ "quinn", "quinn-proto", "rand 0.8.5", - "rustls 0.23.32", + "rustls 0.23.35", "smallvec", "socket2 0.5.10", "solana-keypair", @@ -9007,9 +8995,9 @@ dependencies = [ [[package]] name = "solana-svm-feature-set" -version = "2.3.12" +version = "2.3.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7fe5a6e173eec22c54806b413f5e383b8b82ca13b1767fa53fd40ec8512e6ee" +checksum = "3f24b836eb4d74ec255217bdbe0f24f64a07adeac31aca61f334f91cd4a3b1d5" [[package]] name = "solana-system-interface" @@ -9091,9 +9079,9 @@ dependencies = [ [[package]] name = "solana-thin-client" -version = "2.3.12" +version = "2.3.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1dda0eb4b4f000fe757da47da51c3e709a606425ac1d17434ea7b7929c20ae67" +checksum = "6c1025715a113e0e2e379b30a6bfe4455770dc0759dabf93f7dbd16646d5acbe" dependencies = [ "bincode", "log", @@ -9126,11 +9114,11 @@ checksum = "6af261afb0e8c39252a04d026e3ea9c405342b08c871a2ad8aa5448e068c784c" [[package]] name = "solana-tls-utils" -version = "2.3.12" +version = "2.3.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33d4f5bebbd0e005fa76427db2630f4558128d1a6c8cff616a3587c8519b14f3" +checksum = "14494aa87a75a883d1abcfee00f1278a28ecc594a2f030084879eb40570728f6" dependencies = [ - "rustls 0.23.32", + "rustls 0.23.35", "solana-keypair", "solana-pubkey", "solana-signer", @@ -9139,9 +9127,9 @@ dependencies = [ [[package]] name = "solana-tpu-client" -version = "2.3.12" +version = "2.3.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22fd3202b4e07e8877179b63fe33c7028aa40e8d9ad63273349b24fe6cc00c65" +checksum = "17895ce70fd1dd93add3fbac87d599954ded93c63fa1c66f702d278d96a6da14" dependencies = [ "async-trait", "bincode", @@ -9200,9 +9188,9 @@ dependencies = [ [[package]] name = "solana-transaction-context" -version = "2.3.12" +version = "2.3.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99b02e4d84d75dc196689f0256234b31a11e3cc97abc22ac71c945e930d1fea1" +checksum = "54a312304361987a85b2ef2293920558e6612876a639dd1309daf6d0d59ef2fe" dependencies = [ "bincode", "serde", @@ -9229,9 +9217,9 @@ dependencies = [ [[package]] name = "solana-transaction-metrics-tracker" -version = "2.3.12" +version = "2.3.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05dd69d3052940dba222063553717462e043c03b81838e286c4ea30250abf66b" +checksum = "03fc4e1b6252dc724f5ee69db6229feb43070b7318651580d2174da8baefb993" dependencies = [ "base64 0.22.1", "bincode", @@ -9245,9 +9233,9 @@ dependencies = [ [[package]] name = "solana-transaction-status" -version = "2.3.12" +version = "2.3.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83755842872c791da19cb05b1f6f021345359edd34320db900612b41ea4c2e2b" +checksum = "135f92f4192cc68900c665becf97fc0a6500ae5a67ff347bf2cbc20ecfefa821" dependencies = [ "Inflector", "agave-reserved-account-keys", @@ -9289,9 +9277,9 @@ dependencies = [ [[package]] name = "solana-transaction-status-client-types" -version = "2.3.12" +version = "2.3.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7000081550c6b23cd6c7d18dfa54f06793b7906d28a038eac46e1d6b72da4750" +checksum = "51f1d7c2387c35850848212244d2b225847666cb52d3bd59a5c409d2c300303d" dependencies = [ "base64 0.22.1", "bincode", @@ -9339,9 +9327,9 @@ dependencies = [ [[package]] name = "solana-udp-client" -version = "2.3.12" +version = "2.3.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84e3da9310584355ef7bf797f24f1b40cc7e0c271585b5de1edae1202abaab7e" +checksum = "2dd36227dd3035ac09a89d4239551d2e3d7d9b177b61ccc7c6d393c3974d0efa" dependencies = [ "async-trait", "solana-connection-cache", @@ -9361,9 +9349,9 @@ checksum = "7bbf6d7a3c0b28dd5335c52c0e9eae49d0ae489a8f324917faf0ded65a812c1d" [[package]] name = "solana-version" -version = "2.3.12" +version = "2.3.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a2c757ffbd2cae2b5486715fde6fe675ce7f98197ccdafd896096dfafc8a680" +checksum = "3324d46c7f7b7f5d34bf7dc71a2883bdc072c7b28ca81d0b2167ecec4cf8da9f" dependencies = [ "agave-feature-set", "rand 0.8.5", @@ -9400,9 +9388,9 @@ dependencies = [ [[package]] name = "solana-zk-sdk" -version = "2.3.12" +version = "2.3.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ffc4ca8e3e26a8f80eb0026adf8af1732863f42739cd2201c40c568ccae360c" +checksum = "97b9fc6ec37d16d0dccff708ed1dd6ea9ba61796700c3bb7c3b401973f10f63b" dependencies = [ "aes-gcm-siv", "base64 0.22.1", @@ -9534,7 +9522,7 @@ checksum = "d9e8418ea6269dcfb01c712f0444d2c75542c04448b480e87de59d2865edc750" dependencies = [ "quote", "spl-discriminator-syn", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -9546,7 +9534,7 @@ dependencies = [ "proc-macro2", "quote", "sha2 0.10.9", - "syn 2.0.106", + "syn 2.0.110", "thiserror 1.0.69", ] @@ -9667,7 +9655,7 @@ dependencies = [ "proc-macro2", "quote", "sha2 0.10.9", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -9679,7 +9667,7 @@ dependencies = [ "proc-macro2", "quote", "sha2 0.10.9", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -10140,7 +10128,7 @@ dependencies = [ "once_cell", "percent-encoding", "rust_decimal", - "rustls 0.23.32", + "rustls 0.23.35", "serde", "serde_json", "sha2 0.10.9", @@ -10164,7 +10152,7 @@ dependencies = [ "quote", "sqlx-core", "sqlx-macros-core", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -10187,7 +10175,7 @@ dependencies = [ "sqlx-mysql", "sqlx-postgres", "sqlx-sqlite", - "syn 2.0.106", + "syn 2.0.110", "tokio", "url", ] @@ -10200,7 +10188,7 @@ checksum = "aa003f0038df784eb8fecbbac13affe3da23b45194bd57dba231c8f48199c526" dependencies = [ "atoi", "base64 0.22.1", - "bitflags 2.9.4", + "bitflags 2.10.0", "byteorder", "bytes", "chrono", @@ -10223,7 +10211,7 @@ dependencies = [ "once_cell", "percent-encoding", "rand 0.8.5", - "rsa 0.9.8", + "rsa 0.9.9", "rust_decimal", "serde", "sha1", @@ -10245,7 +10233,7 @@ checksum = "db58fcd5a53cf07c184b154801ff91347e4c30d17a3562a635ff028ad5deda46" dependencies = [ "atoi", "base64 0.22.1", - "bitflags 2.9.4", + "bitflags 2.10.0", "byteorder", "chrono", "crc", @@ -10305,9 +10293,9 @@ dependencies = [ [[package]] name = "stable_deref_trait" -version = "1.2.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" +checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" [[package]] name = "static_assertions" @@ -10350,7 +10338,7 @@ dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -10372,9 +10360,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.106" +version = "2.0.110" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ede7c438028d4436d71104916910f5bb611972c5cfd7f89b8300a8186e6fada6" +checksum = "a99801b5bd34ede4cf3fc688c5919368fea4e4814a4664359503e6015b280aea" dependencies = [ "proc-macro2", "quote", @@ -10416,7 +10404,7 @@ checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -10473,10 +10461,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2d31c77bdf42a745371d260a26ca7163f1e0924b64afa0b688e61b5a9fa02f16" dependencies = [ "fastrand", - "getrandom 0.3.3", + "getrandom 0.3.4", "once_cell", "rustix", - "windows-sys 0.60.2", + "windows-sys 0.61.2", ] [[package]] @@ -10514,7 +10502,7 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -10525,7 +10513,7 @@ checksum = "3ff15c8ecd7de3849db632e14d18d2571fa09dfc5ed93479bc4485c7a517c913" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -10579,9 +10567,9 @@ dependencies = [ [[package]] name = "tinystr" -version = "0.8.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d4f6d1145dcb577acf783d4e601bc1d76a13337bb54e6233add580b07344c8b" +checksum = "42d3e9c45c09de15d06dd8acf5f4e0e399e85927b7f00711024eb7ae10fa4869" dependencies = [ "displaydoc", "zerovec", @@ -10608,29 +10596,26 @@ version = "0.1.0" dependencies = [ "ctor", "hyper-rustls 0.27.7", - "rustls 0.23.32", - "rustls-webpki 0.103.7", + "rustls 0.23.35", + "rustls-webpki 0.103.8", "tokio-rustls 0.26.4", ] [[package]] name = "tokio" -version = "1.47.1" +version = "1.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89e49afdadebb872d3145a5638b59eb0691ea23e46ca484037cfab3b76b95038" +checksum = "ff360e02eab121e0bc37a2d3b4d4dc622e6eda3a8e5253d5435ecf5bd4c68408" dependencies = [ - "backtrace", "bytes", - "io-uring", "libc", - "mio 1.0.4", + "mio 1.1.0", "parking_lot", "pin-project-lite", "signal-hook-registry", - "slab", - "socket2 0.6.0", + "socket2 0.6.1", "tokio-macros", - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] @@ -10652,13 +10637,13 @@ dependencies = [ [[package]] name = "tokio-macros" -version = "2.5.0" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" +checksum = "af407857209536a95c8e56f8231ef2c2e2aff839b22e07a1ffcbc617e9db9fa5" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -10687,7 +10672,7 @@ version = "0.26.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61" dependencies = [ - "rustls 0.23.32", + "rustls 0.23.35", "tokio", ] @@ -10719,9 +10704,9 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.16" +version = "0.7.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14307c986784f72ef81c89db7d9e28d6ac26d16213b109ea501696195e6e3ce5" +checksum = "2efa149fe76073d6e8fd97ef4f4eca7b67f599660115591483572e406e165594" dependencies = [ "bytes", "futures-core", @@ -10753,13 +10738,13 @@ dependencies = [ [[package]] name = "toml" -version = "0.9.7" +version = "0.9.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00e5e5d9bf2475ac9d4f0d9edab68cc573dc2fd644b0dba36b0c30a92dd9eaa0" +checksum = "f0dc8b1fb61449e27716ec0e1bdf0f6b8f3e8f6b05391e8497b8b6d7804ea6d8" dependencies = [ "serde_core", - "serde_spanned 1.0.2", - "toml_datetime 0.7.2", + "serde_spanned 1.0.3", + "toml_datetime 0.7.3", "toml_parser", "winnow", ] @@ -10775,9 +10760,9 @@ dependencies = [ [[package]] name = "toml_datetime" -version = "0.7.2" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32f1085dec27c2b6632b04c80b3bb1b4300d6495d1e129693bdda7d91e72eec1" +checksum = "f2cdb639ebbc97961c51720f858597f7f24c4fc295327923af55b74c3c724533" dependencies = [ "serde_core", ] @@ -10798,21 +10783,21 @@ dependencies = [ [[package]] name = "toml_edit" -version = "0.23.6" +version = "0.23.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3effe7c0e86fdff4f69cdd2ccc1b96f933e24811c5441d44904e8683e27184b" +checksum = "6485ef6d0d9b5d0ec17244ff7eb05310113c3f316f2d14200d4de56b3cb98f8d" dependencies = [ "indexmap", - "toml_datetime 0.7.2", + "toml_datetime 0.7.3", "toml_parser", "winnow", ] [[package]] name = "toml_parser" -version = "1.0.3" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4cf893c33be71572e0e9aa6dd15e6677937abd686b066eac3f8cd3531688a627" +checksum = "c0cbe268d35bdb4bb5a56a2de88d0ad0eb70af5384a99d648cd4b3d04039800e" dependencies = [ "winnow", ] @@ -10837,13 +10822,13 @@ dependencies = [ "http 1.3.1", "http-body 1.0.1", "http-body-util", - "hyper 1.7.0", + "hyper 1.8.1", "hyper-timeout", "hyper-util", "percent-encoding", "pin-project", - "rustls-native-certs 0.8.1", - "socket2 0.6.0", + "rustls-native-certs 0.8.2", + "socket2 0.6.1", "sync_wrapper 1.0.2", "tokio", "tokio-rustls 0.26.4", @@ -10863,7 +10848,7 @@ dependencies = [ "prettyplease", "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -10888,7 +10873,7 @@ dependencies = [ "prost-build", "prost-types", "quote", - "syn 2.0.106", + "syn 2.0.110", "tempfile", "tonic-build", ] @@ -10933,7 +10918,7 @@ version = "0.6.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "adc82fd73de2a9722ac5da747f12383d2bfdb93591ee6c58486e0097890f05f2" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", "bytes", "futures-util", "http 1.3.1", @@ -10978,7 +10963,7 @@ checksum = "81383ab64e72a7a8b8e13130c49e3dab29def6d0c7d76a03087b3cf71c5c6903" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -11035,7 +11020,7 @@ checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" [[package]] name = "tuktuk-program" version = "0.3.2" -source = "git+https://github.com/helium/tuktuk.git?branch=main#c179599adc2d00a956fd296c11ba779ce87da611" +source = "git+https://github.com/helium/tuktuk.git?branch=main#1f3433984498257b0c05455aaa5855d1e3317cd9" dependencies = [ "anchor-lang", ] @@ -11043,7 +11028,7 @@ dependencies = [ [[package]] name = "tuktuk-sdk" version = "0.3.6" -source = "git+https://github.com/helium/tuktuk.git?branch=main#c179599adc2d00a956fd296c11ba779ce87da611" +source = "git+https://github.com/helium/tuktuk.git?branch=main#1f3433984498257b0c05455aaa5855d1e3317cd9" dependencies = [ "anchor-lang", "async-trait", @@ -11108,7 +11093,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "97fee6b57c6a41524a810daee9286c02d7752c4253064d0b05472833a438f675" dependencies = [ "cfg-if", - "rand 0.7.3", + "rand 0.8.5", "static_assertions", ] @@ -11138,24 +11123,24 @@ checksum = "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885f5e29df5" [[package]] name = "unicode-ident" -version = "1.0.19" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f63a545481291138910575129486daeaf8ac54aee4387fe7906919f7830c7d9d" +checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5" [[package]] name = "unicode-normalization" -version = "0.1.24" +version = "0.1.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5033c97c4262335cded6d6fc3e5c18ab755e1a3dc96376350f3d8e9f009ad956" +checksum = "5fd4f6878c9cb28d874b009da9e8d183b5abc80117c40bbd187a1fde336be6e8" dependencies = [ "tinyvec", ] [[package]] name = "unicode-properties" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e70f2a8b45122e719eb623c01822704c4e0907e7e426a05927e1a1cfff5b75d0" +checksum = "7df058c713841ad818f1dc5d3fd88063241cc61f49f5fbea4b951e8cf5a8d71d" [[package]] name = "unicode-segmentation" @@ -11255,7 +11240,7 @@ version = "1.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2f87b8aa10b915a06587d0dec516c282ff295b475d94abf425d62b57710070a2" dependencies = [ - "getrandom 0.3.3", + "getrandom 0.3.4", "js-sys", "serde", "wasm-bindgen", @@ -11325,15 +11310,6 @@ version = "0.11.1+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" -[[package]] -name = "wasi" -version = "0.14.7+wasi-0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "883478de20367e224c0090af9cf5f9fa85bed63a95c1abf3afc5c083ebc06e8c" -dependencies = [ - "wasip2", -] - [[package]] name = "wasip2" version = "1.0.1+wasi-0.2.4" @@ -11351,9 +11327,9 @@ checksum = "b8dad83b4f25e74f184f64c43b150b91efe7647395b42289f38e50566d82855b" [[package]] name = "wasm-bindgen" -version = "0.2.104" +version = "0.2.105" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1da10c01ae9f1ae40cbfac0bac3b1e724b320abfcf52229f80b547c0d250e2d" +checksum = "da95793dfc411fbbd93f5be7715b0578ec61fe87cb1a42b12eb625caa5c5ea60" dependencies = [ "cfg-if", "once_cell", @@ -11362,25 +11338,11 @@ dependencies = [ "wasm-bindgen-shared", ] -[[package]] -name = "wasm-bindgen-backend" -version = "0.2.104" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "671c9a5a66f49d8a47345ab942e2cb93c7d1d0339065d4f8139c486121b43b19" -dependencies = [ - "bumpalo", - "log", - "proc-macro2", - "quote", - "syn 2.0.106", - "wasm-bindgen-shared", -] - [[package]] name = "wasm-bindgen-futures" -version = "0.4.54" +version = "0.4.55" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e038d41e478cc73bae0ff9b36c60cff1c98b8f38f8d7e8061e79ee63608ac5c" +checksum = "551f88106c6d5e7ccc7cd9a16f312dd3b5d36ea8b4954304657d5dfba115d4a0" dependencies = [ "cfg-if", "js-sys", @@ -11391,9 +11353,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.104" +version = "0.2.105" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ca60477e4c59f5f2986c50191cd972e3a50d8a95603bc9434501cf156a9a119" +checksum = "04264334509e04a7bf8690f2384ef5265f05143a4bff3889ab7a3269adab59c2" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -11401,31 +11363,31 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.104" +version = "0.2.105" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f07d2f20d4da7b26400c9f4a0511e6e0345b040694e8a75bd41d578fa4421d7" +checksum = "420bc339d9f322e562942d52e115d57e950d12d88983a14c79b86859ee6c7ebc" dependencies = [ + "bumpalo", "proc-macro2", "quote", - "syn 2.0.106", - "wasm-bindgen-backend", + "syn 2.0.110", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.104" +version = "0.2.105" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bad67dc8b2a1a6e5448428adec4c3e84c43e561d8c9ee8a9e5aabeb193ec41d1" +checksum = "76f218a38c84bcb33c25ec7059b07847d465ce0e0a76b995e134a45adcb6af76" dependencies = [ "unicode-ident", ] [[package]] name = "web-sys" -version = "0.3.81" +version = "0.3.82" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9367c417a924a74cae129e6a2ae3b47fabb1f8995595ab474029da749a8be120" +checksum = "3a1f95c0d03a47f4ae1f7a64643a6bb97465d9b740f0fa8f90ea33915c99a9a1" dependencies = [ "js-sys", "wasm-bindgen", @@ -11443,9 +11405,9 @@ dependencies = [ [[package]] name = "webpki-root-certs" -version = "1.0.2" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e4ffd8df1c57e87c325000a3d6ef93db75279dc3a231125aac571650f22b12a" +checksum = "ee3e3b5f5e80bc89f30ce8d0343bf4e5f12341c51f3e26cbeecbc7c85443e85b" dependencies = [ "rustls-pki-types", ] @@ -11471,14 +11433,14 @@ version = "0.26.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "521bc38abb08001b01866da9f51eb7c5d647a19260e00054a8c7fd5f9e57f7a9" dependencies = [ - "webpki-roots 1.0.2", + "webpki-roots 1.0.4", ] [[package]] name = "webpki-roots" -version = "1.0.2" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e8983c3ab33d6fb807cfcdad2491c4ea8cbc8ed839181c7dfd9c67c83e261b2" +checksum = "b2878ef029c47c6e8cf779119f20fcf52bde7ad42a731b2a304bc221df17571e" dependencies = [ "rustls-pki-types", ] @@ -11515,7 +11477,7 @@ version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" dependencies = [ - "windows-sys 0.48.0", + "windows-sys 0.61.2", ] [[package]] @@ -11545,7 +11507,7 @@ checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -11556,7 +11518,7 @@ checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -11907,9 +11869,9 @@ checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59" [[package]] name = "writeable" -version = "0.6.1" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb" +checksum = "9edde0db4769d2dc68579893f2306b26c6ecfbe0ef499b013d731b7b9247e0b9" [[package]] name = "wyz" @@ -11962,7 +11924,7 @@ version = "0.7.0" source = "git+https://github.com/helium/xorf-generator?branch=main#0d23ba2dcac2e2823d842566436df406f5ce923c" dependencies = [ "anyhow", - "base64 0.21.7", + "base64 0.22.1", "bincode", "bytes", "clap", @@ -11975,7 +11937,7 @@ dependencies = [ "rand 0.8.5", "serde", "serde_json", - "sha2 0.9.9", + "sha2 0.10.9", "thiserror 1.0.69", "twox-hash", "xorf", @@ -11983,11 +11945,10 @@ dependencies = [ [[package]] name = "yoke" -version = "0.8.0" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f41bb01b8226ef4bfd589436a297c53d118f65921786300e427be8d487695cc" +checksum = "72d6e5c6afb84d73944e5cedb052c4680d5657337201555f9f2a16b7406d4954" dependencies = [ - "serde", "stable_deref_trait", "yoke-derive", "zerofrom", @@ -11995,13 +11956,13 @@ dependencies = [ [[package]] name = "yoke-derive" -version = "0.8.0" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6" +checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.110", "synstructure 0.13.2", ] @@ -12022,7 +11983,7 @@ checksum = "88d2b8d9c68ad2b9e4340d7832716a4d21a22a1154777ad56ea55c51a9cf3831" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -12042,7 +12003,7 @@ checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.110", "synstructure 0.13.2", ] @@ -12063,14 +12024,14 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] name = "zerotrie" -version = "0.2.2" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36f0bbd478583f79edad978b407914f61b2972f5af6fa089686016be8f9af595" +checksum = "2a59c17a5562d507e4b54960e8569ebee33bee890c70aa3fe7b97e85a9fd7851" dependencies = [ "displaydoc", "yoke", @@ -12079,9 +12040,9 @@ dependencies = [ [[package]] name = "zerovec" -version = "0.11.4" +version = "0.11.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7aa2bd55086f1ab526693ecbe444205da57e25f4489879da80635a46d90e73b" +checksum = "6c28719294829477f525be0186d13efa9a3c602f7ec202ca9e353d310fb9a002" dependencies = [ "yoke", "zerofrom", @@ -12090,13 +12051,13 @@ dependencies = [ [[package]] name = "zerovec-derive" -version = "0.11.1" +version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f" +checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] From e0fa60a3a134ebc3963af5ba33d0948b56c78adb Mon Sep 17 00:00:00 2001 From: Connor McKenzie Date: Fri, 14 Nov 2025 15:27:39 +0000 Subject: [PATCH 28/33] Revert "Update Cargo.lock" This reverts commit 8263ea856ab6afc07fa6e8135bf4f5bc99809872. --- Cargo.lock | 1013 +++++++++++++++++++++++++++------------------------- 1 file changed, 526 insertions(+), 487 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index ceea750a0..418a93826 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -71,9 +71,9 @@ dependencies = [ [[package]] name = "agave-feature-set" -version = "2.3.13" +version = "2.3.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d52a2c365c0245cbb8959de725fc2b44c754b673fdf34c9a7f9d4a25c35a7bf1" +checksum = "7c5117ce634f42ce143891c4d7db3536d5054fc19501ef88e21f353b8580c450" dependencies = [ "ahash 0.8.12", "solana-epoch-schedule", @@ -85,9 +85,9 @@ dependencies = [ [[package]] name = "agave-reserved-account-keys" -version = "2.3.13" +version = "2.3.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8289c8a8a2ef5aa10ce49a070f360f4e035ee3410b8d8f3580fb39d8cf042581" +checksum = "437f99adcce3e30218130d4cefbdb1f5810c43b553eb51b452e01dd3edf2c28c" dependencies = [ "agave-feature-set", "solana-pubkey", @@ -113,7 +113,7 @@ checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" dependencies = [ "cfg-if", "const-random", - "getrandom 0.3.4", + "getrandom 0.3.3", "once_cell", "version_check", "zerocopy", @@ -121,9 +121,9 @@ dependencies = [ [[package]] name = "aho-corasick" -version = "1.1.4" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" dependencies = [ "memchr", ] @@ -402,22 +402,22 @@ dependencies = [ [[package]] name = "anstyle-query" -version = "1.1.5" +version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadc" +checksum = "9e231f6134f61b71076a3eab506c379d4f36122f2af15a9ff04415ea4c3339e2" dependencies = [ - "windows-sys 0.61.2", + "windows-sys 0.60.2", ] [[package]] name = "anstyle-wincon" -version = "3.0.11" +version = "3.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747d" +checksum = "3e0633414522a32ffaac8ac6cc8f748e090c5717661fddeea04219e2344f5f2a" dependencies = [ "anstyle", "once_cell_polyfill", - "windows-sys 0.61.2", + "windows-sys 0.60.2", ] [[package]] @@ -619,9 +619,9 @@ dependencies = [ [[package]] name = "async-compression" -version = "0.4.33" +version = "0.4.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93c1f86859c1af3d514fa19e8323147ff10ea98684e6c7b307912509f50e67b2" +checksum = "5a89bce6054c720275ac2432fbba080a66a2106a44a1b804553930ca6909f4e0" dependencies = [ "compression-codecs", "compression-core", @@ -676,7 +676,7 @@ checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.110", + "syn 2.0.106", ] [[package]] @@ -722,9 +722,9 @@ checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" [[package]] name = "aws-config" -version = "1.8.10" +version = "1.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1856b1b48b65f71a4dd940b1c0931f9a7b646d4a924b9828ffefc1454714668a" +checksum = "37cf2b6af2a95a20e266782b4f76f1a5e12bf412a9db2de9c1e9123b9d8c0ad8" dependencies = [ "aws-credential-types", "aws-runtime", @@ -752,9 +752,9 @@ dependencies = [ [[package]] name = "aws-credential-types" -version = "1.2.9" +version = "1.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86590e57ea40121d47d3f2e131bfd873dea15d78dc2f4604f4734537ad9e56c4" +checksum = "faf26925f4a5b59eb76722b63c2892b1d70d06fa053c72e4a100ec308c1d47bc" dependencies = [ "aws-smithy-async", "aws-smithy-runtime-api", @@ -764,9 +764,9 @@ dependencies = [ [[package]] name = "aws-lc-rs" -version = "1.15.0" +version = "1.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5932a7d9d28b0d2ea34c6b3779d35e3dd6f6345317c34e73438c4f1f29144151" +checksum = "879b6c89592deb404ba4dc0ae6b58ffd1795c78991cbb5b8bc441c48a070440d" dependencies = [ "aws-lc-sys", "zeroize", @@ -774,15 +774,16 @@ dependencies = [ [[package]] name = "aws-lc-sys" -version = "0.33.0" +version = "0.32.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1826f2e4cfc2cd19ee53c42fbf68e2f81ec21108e0b7ecf6a71cf062137360fc" +checksum = "a2b715a6010afb9e457ca2b7c9d2b9c344baa8baed7b38dc476034c171b32575" dependencies = [ "bindgen", "cc", "cmake", "dunce", "fs_extra", + "libloading", ] [[package]] @@ -804,9 +805,9 @@ dependencies = [ [[package]] name = "aws-runtime" -version = "1.5.14" +version = "1.5.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fe0fd441565b0b318c76e7206c8d1d0b0166b3e986cf30e890b61feb6192045" +checksum = "bfa006bb32360ed90ac51203feafb9d02e3d21046e1fd3a450a404b90ea73e5d" dependencies = [ "aws-credential-types", "aws-sigv4", @@ -829,9 +830,9 @@ dependencies = [ [[package]] name = "aws-sdk-s3" -version = "1.112.0" +version = "1.108.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eee73a27721035c46da0572b390a69fbdb333d0177c24f3d8f7ff952eeb96690" +checksum = "200be4aed61e3c0669f7268bacb768f283f1c32a7014ce57225e1160be2f6ccb" dependencies = [ "aws-credential-types", "aws-runtime", @@ -863,9 +864,9 @@ dependencies = [ [[package]] name = "aws-sdk-sso" -version = "1.89.0" +version = "1.86.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9c1b1af02288f729e95b72bd17988c009aa72e26dcb59b3200f86d7aea726c9" +checksum = "4a0abbfab841446cce6e87af853a3ba2cc1bc9afcd3f3550dd556c43d434c86d" dependencies = [ "aws-credential-types", "aws-runtime", @@ -885,9 +886,9 @@ dependencies = [ [[package]] name = "aws-sdk-ssooidc" -version = "1.91.0" +version = "1.88.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e8122301558dc7c6c68e878af918880b82ff41897a60c8c4e18e4dc4d93e9f1" +checksum = "9a68d675582afea0e94d38b6ca9c5aaae4ca14f1d36faa6edb19b42e687e70d7" dependencies = [ "aws-credential-types", "aws-runtime", @@ -907,9 +908,9 @@ dependencies = [ [[package]] name = "aws-sdk-sts" -version = "1.92.0" +version = "1.88.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0c7808adcff8333eaa76a849e6de926c6ac1a1268b9fd6afe32de9c29ef29d2" +checksum = "d30990923f4f675523c51eb1c0dec9b752fb267b36a61e83cbc219c9d86da715" dependencies = [ "aws-credential-types", "aws-runtime", @@ -930,9 +931,9 @@ dependencies = [ [[package]] name = "aws-sigv4" -version = "1.3.6" +version = "1.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c35452ec3f001e1f2f6db107b6373f1f48f05ec63ba2c5c9fa91f07dad32af11" +checksum = "bffc03068fbb9c8dd5ce1c6fb240678a5cffb86fb2b7b1985c999c4b83c8df68" dependencies = [ "aws-credential-types", "aws-smithy-eventstream", @@ -969,9 +970,9 @@ dependencies = [ [[package]] name = "aws-smithy-checksums" -version = "0.63.11" +version = "0.63.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95bd108f7b3563598e4dc7b62e1388c9982324a2abd622442167012690184591" +checksum = "165d8583d8d906e2fb5511d29201d447cc710864f075debcdd9c31c265412806" dependencies = [ "aws-smithy-http", "aws-smithy-types", @@ -989,9 +990,9 @@ dependencies = [ [[package]] name = "aws-smithy-eventstream" -version = "0.60.13" +version = "0.60.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e29a304f8319781a39808847efb39561351b1bb76e933da7aa90232673638658" +checksum = "9656b85088f8d9dc7ad40f9a6c7228e1e8447cdf4b046c87e152e0805dea02fa" dependencies = [ "aws-smithy-types", "bytes", @@ -1000,9 +1001,9 @@ dependencies = [ [[package]] name = "aws-smithy-http" -version = "0.62.5" +version = "0.62.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "445d5d720c99eed0b4aa674ed00d835d9b1427dd73e04adaf2f94c6b2d6f9fca" +checksum = "3feafd437c763db26aa04e0cc7591185d0961e64c61885bece0fb9d50ceac671" dependencies = [ "aws-smithy-eventstream", "aws-smithy-runtime-api", @@ -1010,7 +1011,6 @@ dependencies = [ "bytes", "bytes-utils", "futures-core", - "futures-util", "http 0.2.12", "http 1.3.1", "http-body 0.4.6", @@ -1022,9 +1022,9 @@ dependencies = [ [[package]] name = "aws-smithy-http-client" -version = "1.1.4" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "623254723e8dfd535f566ee7b2381645f8981da086b5c4aa26c0c41582bb1d2c" +checksum = "1053b5e587e6fa40ce5a79ea27957b04ba660baa02b28b7436f64850152234f1" dependencies = [ "aws-smithy-async", "aws-smithy-runtime-api", @@ -1035,14 +1035,14 @@ dependencies = [ "http 1.3.1", "http-body 0.4.6", "hyper 0.14.32", - "hyper 1.8.1", + "hyper 1.7.0", "hyper-rustls 0.24.2", "hyper-rustls 0.27.7", "hyper-util", "pin-project-lite", "rustls 0.21.12", - "rustls 0.23.35", - "rustls-native-certs 0.8.2", + "rustls 0.23.32", + "rustls-native-certs 0.8.1", "rustls-pki-types", "tokio", "tokio-rustls 0.26.4", @@ -1052,9 +1052,9 @@ dependencies = [ [[package]] name = "aws-smithy-json" -version = "0.61.7" +version = "0.61.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2db31f727935fc63c6eeae8b37b438847639ec330a9161ece694efba257e0c54" +checksum = "cff418fc8ec5cadf8173b10125f05c2e7e1d46771406187b2c878557d4503390" dependencies = [ "aws-smithy-types", ] @@ -1080,9 +1080,9 @@ dependencies = [ [[package]] name = "aws-smithy-runtime" -version = "1.9.4" +version = "1.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bbe9d018d646b96c7be063dd07987849862b0e6d07c778aad7d93d1be6c1ef0" +checksum = "40ab99739082da5347660c556689256438defae3bcefd66c52b095905730e404" dependencies = [ "aws-smithy-async", "aws-smithy-http", @@ -1104,9 +1104,9 @@ dependencies = [ [[package]] name = "aws-smithy-runtime-api" -version = "1.9.2" +version = "1.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec7204f9fd94749a7c53b26da1b961b4ac36bf070ef1e0b94bb09f79d4f6c193" +checksum = "3683c5b152d2ad753607179ed71988e8cfd52964443b4f74fd8e552d0bbfeb46" dependencies = [ "aws-smithy-async", "aws-smithy-types", @@ -1121,9 +1121,9 @@ dependencies = [ [[package]] name = "aws-smithy-types" -version = "1.3.4" +version = "1.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25f535879a207fce0db74b679cfc3e91a3159c8144d717d55f5832aea9eef46e" +checksum = "9f5b3a7486f6690ba25952cabf1e7d75e34d69eaff5081904a47bc79074d6457" dependencies = [ "base64-simd", "bytes", @@ -1157,18 +1157,18 @@ dependencies = [ [[package]] name = "aws-smithy-xml" -version = "0.60.12" +version = "0.60.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eab77cdd036b11056d2a30a7af7b775789fb024bf216acc13884c6c97752ae56" +checksum = "e9c34127e8c624bc2999f3b657e749c1393bedc9cd97b92a804db8ced4d2e163" dependencies = [ "xmlparser", ] [[package]] name = "aws-types" -version = "1.3.10" +version = "1.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d79fb68e3d7fe5d4833ea34dc87d2e97d26d3086cb3da660bb6b1f76d98680b6" +checksum = "e2fd329bf0e901ff3f60425691410c69094dc2a1f34b331f37bfc4e9ac1565a1" dependencies = [ "aws-credential-types", "aws-smithy-async", @@ -1191,7 +1191,7 @@ dependencies = [ "http 1.3.1", "http-body 1.0.1", "http-body-util", - "hyper 1.8.1", + "hyper 1.7.0", "hyper-util", "itoa", "matchit", @@ -1242,9 +1242,9 @@ dependencies = [ [[package]] name = "backon" -version = "1.6.0" +version = "1.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cffb0e931875b666fc4fcb20fee52e9bbd1ef836fd9e9e04ec21555f9f85f7ef" +checksum = "592277618714fbcecda9a02ba7a8781f319d26532a88553bbacc77ba5d2b3a8d" dependencies = [ "fastrand", "gloo-timers", @@ -1323,15 +1323,15 @@ name = "beacon" version = "0.1.0" source = "git+https://github.com/helium/proto?branch=master#60e0047b6e0e38b8119a055b37a7043cb02dbc82" dependencies = [ - "base64 0.22.1", + "base64 0.21.7", "byteorder", "helium-proto", "prost", - "rand 0.8.5", - "rand_chacha 0.3.1", + "rand 0.7.3", + "rand_chacha 0.2.2", "rust_decimal", "serde", - "sha2 0.10.9", + "sha2 0.9.9", "thiserror 1.0.69", ] @@ -1359,10 +1359,10 @@ version = "0.72.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "993776b509cfb49c750f11b8f07a46fa23e0a1386ffc01fb1e7d343efc387895" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.9.4", "cexpr", "clang-sys", - "itertools 0.13.0", + "itertools 0.10.5", "log", "prettyplease", "proc-macro2", @@ -1370,7 +1370,7 @@ dependencies = [ "regex", "rustc-hash 2.1.1", "shlex", - "syn 2.0.110", + "syn 2.0.106", ] [[package]] @@ -1396,11 +1396,11 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.10.0" +version = "2.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "812e12b5285cc515a9c72a5c1d3b6d46a19dac5acfef5265968c166106e31dd3" +checksum = "2261d10cca569e4643e526d8dc2e62e433cc8aba21ab764233731f8d369bf394" dependencies = [ - "serde_core", + "serde", ] [[package]] @@ -1512,7 +1512,7 @@ dependencies = [ "proc-macro-crate 3.4.0", "proc-macro2", "quote", - "syn 2.0.110", + "syn 2.0.106", ] [[package]] @@ -1623,7 +1623,7 @@ checksum = "f9abbd1bc6865053c427f7198e6af43bfdedc55ab791faed4fbd361d789575ff" dependencies = [ "proc-macro2", "quote", - "syn 2.0.110", + "syn 2.0.106", ] [[package]] @@ -1634,9 +1634,9 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.11.0" +version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b35204fbdc0b3f4446b89fc1ac2cf84a8a68971995d0bf2e925ec7cd960f9cb3" +checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" dependencies = [ "serde", ] @@ -1653,11 +1653,12 @@ dependencies = [ [[package]] name = "caps" -version = "0.5.6" +version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd1ddba47aba30b6a889298ad0109c3b8dcb0e8fc993b459daa7067d46f865e0" +checksum = "190baaad529bcfbde9e1a19022c42781bdb6ff9de25721abdb8fd98c0807730b" dependencies = [ "libc", + "thiserror 1.0.69", ] [[package]] @@ -1672,9 +1673,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.2.46" +version = "1.2.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b97463e1064cb1b1c1384ad0a0b9c8abd0988e2a91f52606c80ef14aadb63e36" +checksum = "e1d05d92f4b1fd76aad469d46cdd858ca761576082cd37df81416691e50199fb" dependencies = [ "find-msvc-tools", "jobserver", @@ -1699,9 +1700,9 @@ dependencies = [ [[package]] name = "cfg-if" -version = "1.0.4" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" +checksum = "2fd1289c04a9ea8cb22300a459a72a385d7c73d3259e2ed7dcb2af674838cfa9" [[package]] name = "cfg_aliases" @@ -1717,7 +1718,7 @@ checksum = "45565fc9416b9896014f5732ac776f810ee53a66730c17e4020c3ec064a8f88f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.110", + "syn 2.0.106", ] [[package]] @@ -1757,9 +1758,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.51" +version = "4.5.48" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c26d721170e0295f191a69bd9a1f93efcdb0aff38684b61ab5750468972e5f5" +checksum = "e2134bb3ea021b78629caa971416385309e0131b351b25e01dc16fb54e1b5fae" dependencies = [ "clap_builder", "clap_derive", @@ -1767,9 +1768,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.51" +version = "4.5.48" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75835f0c7bf681bfd05abe44e965760fea999a5286c6eb2d59883634fd02011a" +checksum = "c2ba64afa3c0a6df7fa517765e31314e983f51dda798ffba27b988194fb65dc9" dependencies = [ "anstream", "anstyle", @@ -1779,21 +1780,21 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.5.49" +version = "4.5.47" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a0b5487afeab2deb2ff4e03a807ad1a03ac532ff5a2cee5d86884440c7f7671" +checksum = "bbfd7eae0b0f1a6e63d4b13c9c478de77c2eb546fba158ad50b4203dc24b9f9c" dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.110", + "syn 2.0.106", ] [[package]] name = "clap_lex" -version = "0.7.6" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1d728cc89cf3aee9ff92b05e62b19ee65a02b5702cff7d5a377e32c6ae29d8d" +checksum = "b94f61472cee1439c0b966b47e3aca9ae07e45d070759512cd390ea2bebc6675" [[package]] name = "cmake" @@ -1822,9 +1823,9 @@ dependencies = [ [[package]] name = "compression-codecs" -version = "0.4.32" +version = "0.4.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "680dc087785c5230f8e8843e2e57ac7c1c90488b6a91b88caa265410568f441b" +checksum = "ef8a506ec4b81c460798f572caead636d57d3d7e940f998160f52bd254bf2d23" dependencies = [ "brotli", "compression-core", @@ -1834,9 +1835,9 @@ dependencies = [ [[package]] name = "compression-core" -version = "0.4.30" +version = "0.4.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a9b614a5787ef0c8802a55766480563cb3a93b435898c422ed2a359cf811582" +checksum = "e47641d3deaf41fb1538ac1f54735925e275eaf3bf4d55c81b137fba797e5cbb" [[package]] name = "concurrent-queue" @@ -1849,13 +1850,13 @@ dependencies = [ [[package]] name = "config" -version = "0.15.19" +version = "0.15.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b30fa8254caad766fc03cb0ccae691e14bf3bd72bfff27f72802ce729551b3d6" +checksum = "180e549344080374f9b32ed41bf3b6b57885ff6a289367b3dbc10eea8acc1918" dependencies = [ "pathdiff", "serde_core", - "toml 0.9.8", + "toml 0.9.7", "winnow", ] @@ -2008,15 +2009,15 @@ checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5" [[package]] name = "crc-fast" -version = "1.6.0" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ddc2d09feefeee8bd78101665bd8645637828fa9317f9f292496dbbd8c65ff3" +checksum = "6bf62af4cc77d8fe1c22dde4e721d87f2f54056139d8c412e1366b740305f56f" dependencies = [ "crc", "digest 0.10.7", + "libc", "rand 0.9.2", "regex", - "rustversion", ] [[package]] @@ -2124,21 +2125,21 @@ dependencies = [ [[package]] name = "csv" -version = "1.4.0" +version = "1.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52cd9d68cf7efc6ddfaaee42e7288d3a99d613d4b50f76ce9827ae0c6e14f938" +checksum = "acdc4883a9c96732e4733212c01447ebd805833b7275a73ca3ee080fd77afdaf" dependencies = [ "csv-core", "itoa", "ryu", - "serde_core", + "serde", ] [[package]] name = "csv-core" -version = "0.1.13" +version = "0.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "704a3c26996a80471189265814dbc2c257598b96b8a7feae2d31ace646bb9782" +checksum = "7d02f3b0da4c6504f86e9cd789d8dbafab48c2321be74e9987593de5a894d93d" dependencies = [ "memchr", ] @@ -2213,7 +2214,7 @@ checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.110", + "syn 2.0.106", ] [[package]] @@ -2266,7 +2267,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn 2.0.110", + "syn 2.0.106", ] [[package]] @@ -2280,7 +2281,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn 2.0.110", + "syn 2.0.106", ] [[package]] @@ -2291,7 +2292,7 @@ checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" dependencies = [ "darling_core 0.20.11", "quote", - "syn 2.0.110", + "syn 2.0.106", ] [[package]] @@ -2302,7 +2303,7 @@ checksum = "d38308df82d1080de0afee5d069fa14b0326a88c14f15c5ccda35b4a6c414c81" dependencies = [ "darling_core 0.21.3", "quote", - "syn 2.0.110", + "syn 2.0.106", ] [[package]] @@ -2348,14 +2349,14 @@ dependencies = [ name = "denylist" version = "0.1.0" dependencies = [ - "base64 0.22.1", + "base64 0.21.7", "bincode", "bytes", "chrono", "config", "helium-crypto", "humantime-serde", - "reqwest 0.12.24", + "reqwest 0.12.23", "serde", "serde_json", "sha2 0.10.9", @@ -2402,9 +2403,9 @@ dependencies = [ [[package]] name = "deranged" -version = "0.5.5" +version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ececcb659e7ba858fb4f10388c250a7252eb0a27373f1a72b8748afdd248e587" +checksum = "a41953f86f8a05768a6cda24def994fd2f424b04ec5c719cf89989779f199071" dependencies = [ "powerfmt", ] @@ -2444,7 +2445,7 @@ dependencies = [ "darling 0.20.11", "proc-macro2", "quote", - "syn 2.0.110", + "syn 2.0.106", ] [[package]] @@ -2454,7 +2455,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ab63b0e2bf4d5928aff72e83a7dace85d7bba5fe12dcc3c5a572d78caffd3f3c" dependencies = [ "derive_builder_core", - "syn 2.0.110", + "syn 2.0.106", ] [[package]] @@ -2498,7 +2499,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.110", + "syn 2.0.106", ] [[package]] @@ -2521,7 +2522,7 @@ checksum = "a6cbae11b3de8fce2a456e8ea3dada226b35fe791f0dc1d360c0941f0bb681f3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.110", + "syn 2.0.106", ] [[package]] @@ -2532,9 +2533,9 @@ checksum = "1aaf95b3e5c8f23aa320147307562d361db0ae0d51242340f558153b4eb2439b" [[package]] name = "dtor" -version = "0.1.1" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "404d02eeb088a82cfd873006cb713fe411306c7d182c344905e101fb1167d301" +checksum = "e58a0764cddb55ab28955347b45be00ade43d4d6f3ba4bf3dc354e4ec9432934" dependencies = [ "dtor-proc-macro", ] @@ -2721,7 +2722,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" dependencies = [ "libc", - "windows-sys 0.61.2", + "windows-sys 0.60.2", ] [[package]] @@ -2768,7 +2769,7 @@ version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "18c1ddb9231d8554c2d6bdf4cfaabf0c59251658c68b6c95cd52dd0c513a912a" dependencies = [ - "getrandom 0.3.4", + "getrandom 0.3.3", "libm", "rand 0.9.2", "siphasher 1.0.1", @@ -2822,7 +2823,7 @@ dependencies = [ "aws-config", "aws-sdk-s3", "aws-smithy-types-convert", - "base64 0.22.1", + "base64 0.21.7", "bs58", "bytes", "chrono", @@ -2862,7 +2863,7 @@ version = "0.1.0" dependencies = [ "anyhow", "async-trait", - "base64 0.22.1", + "base64 0.21.7", "beacon", "blake3", "bs58", @@ -2899,9 +2900,9 @@ dependencies = [ [[package]] name = "find-msvc-tools" -version = "0.1.5" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a3076410a55c90011c298b04d0cfa770b00fa04e1e3c97d3f6c9de105a03844" +checksum = "0399f9d26e5191ce32c498bebd31e7a3ceabc2745f0ac54af3f335126c3f24b3" [[package]] name = "five8" @@ -2935,9 +2936,9 @@ checksum = "1d674e81391d1e1ab681a28d99df07927c6d4aa5b027d7da16ba32d1d21ecd99" [[package]] name = "flate2" -version = "1.1.5" +version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfe33edd8e85a12a67454e37f8c75e730830d83e313556ab9ebf9ee7fbeb3bfb" +checksum = "dc5a4e564e38c699f2880d3fda590bedc2e69f3f84cd48b457bd892ce61d0aa9" dependencies = [ "crc32fast", "miniz_oxide", @@ -3103,7 +3104,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.110", + "syn 2.0.106", ] [[package]] @@ -3144,9 +3145,9 @@ dependencies = [ [[package]] name = "generic-array" -version = "0.14.9" +version = "0.14.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4bb6743198531e02858aeaea5398fcc883e71851fcbcb5a2f773e2fb6cb1edf2" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" dependencies = [ "typenum", "version_check", @@ -3228,15 +3229,15 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.3.4" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" +checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4" dependencies = [ "cfg-if", "js-sys", "libc", "r-efi", - "wasip2", + "wasi 0.14.7+wasi-0.2.4", "wasm-bindgen", ] @@ -3410,12 +3411,6 @@ dependencies = [ "foldhash", ] -[[package]] -name = "hashbrown" -version = "0.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5419bdc4f6a9207fbeba6d11b604d481addf78ecd10c11ad51e76c2f6482748d" - [[package]] name = "hashlink" version = "0.10.0" @@ -3456,7 +3451,7 @@ version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f3ae6081be123db88474f4c5f12f9b0d3d90b9f5ce15171dee64fe92e3cae2dd" dependencies = [ - "base64 0.22.1", + "base64 0.21.7", "bs58", "byteorder", "ed25519-compact", @@ -3476,14 +3471,14 @@ dependencies = [ [[package]] name = "helium-lib" version = "0.2.0" -source = "git+https://github.com/helium/helium-wallet-rs?branch=master#e1d20673d37df9731dea1ea902ad1f5d139c35ed" +source = "git+https://github.com/helium/helium-wallet-rs?branch=master#e21e0f688fddeac9e8c8f26a57a55cea0f89ab9a" dependencies = [ "anchor-client", "anchor-lang", "anchor-spl", "angry-purple-tiger", "async-trait", - "base64 0.22.1", + "base64 0.21.7", "bincode", "bytemuck", "chrono", @@ -3518,7 +3513,7 @@ dependencies = [ [[package]] name = "helium-proto" version = "0.1.0" -source = "git+https://github.com/helium/proto?branch=master#60e0047b6e0e38b8119a055b37a7043cb02dbc82" +source = "git+https://github.com/helium/proto?branch=master#db80ad554e92bde5aaa37b8dce583a8787d1727b" dependencies = [ "bytes", "prost", @@ -3571,9 +3566,9 @@ dependencies = [ [[package]] name = "hex-literal" -version = "1.1.0" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e712f64ec3850b98572bffac52e2c6f282b29fe6c5fa6d42334b30be438d95c1" +checksum = "bcaaec4551594c969335c98c903c1397853d4198408ea609190f420500f6be71" [[package]] name = "hextree" @@ -3632,11 +3627,11 @@ dependencies = [ [[package]] name = "home" -version = "0.5.12" +version = "0.5.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc627f471c528ff0c4a49e1d5e60450c8f6461dd6d10ba9dcd3a61d3dff7728d" +checksum = "589533453244b0995c858700322199b2becb13b627df2851f64a2775d024abcf" dependencies = [ - "windows-sys 0.61.2", + "windows-sys 0.59.0", ] [[package]] @@ -3759,9 +3754,9 @@ dependencies = [ [[package]] name = "hyper" -version = "1.8.1" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ab2d4f250c3d7b1c9fcdff1cece94ea4e2dfbec68614f7b87cb205f24ca9d11" +checksum = "eb3aa54a13a0dfe7fbe3a59e0c76093041720fdc77b110cc0fc260fafb4dc51e" dependencies = [ "atomic-waker", "bytes", @@ -3803,15 +3798,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3c93eb611681b207e1fe55d5a71ecf91572ec8a6705cdb6857f7d8d5242cf58" dependencies = [ "http 1.3.1", - "hyper 1.8.1", + "hyper 1.7.0", "hyper-util", - "rustls 0.23.35", - "rustls-native-certs 0.8.2", + "rustls 0.23.32", + "rustls-native-certs 0.8.1", "rustls-pki-types", "tokio", "tokio-rustls 0.26.4", "tower-service", - "webpki-roots 1.0.4", + "webpki-roots 1.0.2", ] [[package]] @@ -3820,7 +3815,7 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b90d566bffbce6a75bd8b09a05aa8c2cb1fabb6cb348f8840c9e4c90a0d83b0" dependencies = [ - "hyper 1.8.1", + "hyper 1.7.0", "hyper-util", "pin-project-lite", "tokio", @@ -3835,7 +3830,7 @@ checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" dependencies = [ "bytes", "http-body-util", - "hyper 1.8.1", + "hyper 1.7.0", "hyper-util", "native-tls", "tokio", @@ -3845,9 +3840,9 @@ dependencies = [ [[package]] name = "hyper-util" -version = "0.1.18" +version = "0.1.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52e9a2a24dc5c6821e71a7030e1e14b7b632acac55c40e9d2e082c621261bb56" +checksum = "3c6995591a8f1380fcb4ba966a252a4b29188d51d2b89e3a252f5305be65aea8" dependencies = [ "base64 0.22.1", "bytes", @@ -3856,12 +3851,12 @@ dependencies = [ "futures-util", "http 1.3.1", "http-body 1.0.1", - "hyper 1.8.1", + "hyper 1.7.0", "ipnet", "libc", "percent-encoding", "pin-project-lite", - "socket2 0.6.1", + "socket2 0.5.10", "tokio", "tower-service", "tracing", @@ -3935,9 +3930,9 @@ dependencies = [ [[package]] name = "icu_collections" -version = "2.1.1" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c6b649701667bbe825c3b7e6388cb521c23d88644678e83c0c4d0a621a34b43" +checksum = "200072f5d0e3614556f94a9930d5dc3e0662a652823904c3a75dc3b0af7fee47" dependencies = [ "displaydoc", "potential_utf", @@ -3948,9 +3943,9 @@ dependencies = [ [[package]] name = "icu_locale_core" -version = "2.1.1" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edba7861004dd3714265b4db54a3c390e880ab658fec5f7db895fae2046b5bb6" +checksum = "0cde2700ccaed3872079a65fb1a78f6c0a36c91570f28755dda67bc8f7d9f00a" dependencies = [ "displaydoc", "litemap", @@ -3961,10 +3956,11 @@ dependencies = [ [[package]] name = "icu_normalizer" -version = "2.1.1" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f6c8828b67bf8908d82127b2054ea1b4427ff0230ee9141c54251934ab1b599" +checksum = "436880e8e18df4d7bbc06d58432329d6458cc84531f7ac5f024e93deadb37979" dependencies = [ + "displaydoc", "icu_collections", "icu_normalizer_data", "icu_properties", @@ -3975,38 +3971,42 @@ dependencies = [ [[package]] name = "icu_normalizer_data" -version = "2.1.1" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7aedcccd01fc5fe81e6b489c15b247b8b0690feb23304303a9e560f37efc560a" +checksum = "00210d6893afc98edb752b664b8890f0ef174c8adbb8d0be9710fa66fbbf72d3" [[package]] name = "icu_properties" -version = "2.1.1" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e93fcd3157766c0c8da2f8cff6ce651a31f0810eaa1c51ec363ef790bbb5fb99" +checksum = "016c619c1eeb94efb86809b015c58f479963de65bdb6253345c1a1276f22e32b" dependencies = [ + "displaydoc", "icu_collections", "icu_locale_core", "icu_properties_data", "icu_provider", + "potential_utf", "zerotrie", "zerovec", ] [[package]] name = "icu_properties_data" -version = "2.1.1" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02845b3647bb045f1100ecd6480ff52f34c35f82d9880e029d329c21d1054899" +checksum = "298459143998310acd25ffe6810ed544932242d3f07083eee1084d83a71bd632" [[package]] name = "icu_provider" -version = "2.1.1" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85962cf0ce02e1e0a629cc34e7ca3e373ce20dda4c4d7294bbd0bf1fdb59e614" +checksum = "03c80da27b5f4187909049ee2d72f276f0d9f99a42c306bd0131ecfe04d8e5af" dependencies = [ "displaydoc", "icu_locale_core", + "stable_deref_trait", + "tinystr", "writeable", "yoke", "zerofrom", @@ -4043,12 +4043,12 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.12.0" +version = "2.11.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6717a8d2a5a929a1a2eb43a12812498ed141a0bcfb7e8f7844fbdbe4303bba9f" +checksum = "4b0f83760fb341a774ed326568e19f5a863af4a952def8c39f9ab92fd95b88e5" dependencies = [ "equivalent", - "hashbrown 0.16.0", + "hashbrown 0.15.5", "serde", "serde_core", ] @@ -4071,8 +4071,8 @@ name = "ingest" version = "0.1.0" dependencies = [ "anyhow", - "backon 1.6.0", - "base64 0.22.1", + "backon 1.5.2", + "base64 0.21.7", "bs58", "chrono", "clap", @@ -4136,6 +4136,17 @@ dependencies = [ "generic-array", ] +[[package]] +name = "io-uring" +version = "0.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "046fa2d4d00aea763528b4950358d0ead425372445dc8ff86312b3c69ff7727b" +dependencies = [ + "bitflags 2.9.4", + "cfg-if", + "libc", +] + [[package]] name = "iot-config" version = "0.1.0" @@ -4143,7 +4154,7 @@ dependencies = [ "anyhow", "async-trait", "backon 0.5.0", - "base64 0.22.1", + "base64 0.21.7", "bs58", "chrono", "clap", @@ -4228,7 +4239,7 @@ version = "0.1.0" dependencies = [ "anyhow", "async-trait", - "base64 0.22.1", + "base64 0.21.7", "beacon", "blake3", "chrono", @@ -4285,9 +4296,9 @@ checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" [[package]] name = "iri-string" -version = "0.7.9" +version = "0.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f867b9d1d896b67beb18518eda36fdb77a32ea590de864f1325b294a6d14397" +checksum = "dbc5ebe9c3a1a7a5127f920a418f7585e9e758e911d0466ed004f393b0e380b2" dependencies = [ "memchr", "serde", @@ -4295,9 +4306,9 @@ dependencies = [ [[package]] name = "is_terminal_polyfill" -version = "1.70.2" +version = "1.70.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695" +checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" [[package]] name = "itertools" @@ -4369,15 +4380,15 @@ version = "0.1.34" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33" dependencies = [ - "getrandom 0.3.4", + "getrandom 0.3.3", "libc", ] [[package]] name = "js-sys" -version = "0.3.82" +version = "0.3.81" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b011eec8cc36da2aab2d5cff675ec18454fad408585853910a202391cf9f8e65" +checksum = "ec48937a97411dcb524a265206ccd4c90bb711fca92b2792c407f268825b9305" dependencies = [ "once_cell", "wasm-bindgen", @@ -4551,9 +4562,9 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.177" +version = "0.2.176" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2874a2af47a2325c2001a6e6fad9b16a53b802102b528163885171cf92b15976" +checksum = "58f929b4d672ea937a23a1ab494143d968337a5f47e56d0815df1e0890ddf174" [[package]] name = "libflate" @@ -4577,12 +4588,12 @@ dependencies = [ [[package]] name = "libloading" -version = "0.8.9" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7c4b02199fee7c5d21a5ae7d8cfa79a6ef5bb2fc834d6e9058e89c825efdc55" +checksum = "07033963ba89ebaf1584d767badaa2e8fcec21aedea6b8c0346d487d49c28667" dependencies = [ "cfg-if", - "windows-link", + "windows-targets 0.48.5", ] [[package]] @@ -4597,7 +4608,7 @@ version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "416f7e718bdb06000964960ffa43b4335ad4012ae8b99060261aa4a8088d5ccb" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.9.4", "libc", "redox_syscall", ] @@ -4668,9 +4679,9 @@ checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039" [[package]] name = "litemap" -version = "0.8.1" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6373607a59f0be73a39b6fe456b8192fcc3585f602af20751600e974dd455e77" +checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956" [[package]] name = "lock_api" @@ -4797,7 +4808,7 @@ checksum = "2b166dea96003ee2531cf14833efedced545751d800f03535801d833313f8c15" dependencies = [ "base64 0.22.1", "http-body-util", - "hyper 1.8.1", + "hyper 1.7.0", "hyper-rustls 0.27.7", "hyper-util", "indexmap", @@ -4845,7 +4856,7 @@ checksum = "db5b29714e950dbb20d5e6f74f9dcec4edbcc1067bb7f8ed198c097b8c1a818b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.110", + "syn 2.0.106", ] [[package]] @@ -4884,13 +4895,13 @@ dependencies = [ [[package]] name = "mio" -version = "1.1.0" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69d83b0086dc8ecf3ce9ae2874b2d1290252e2a30720bea58a5c6639b0092873" +checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c" dependencies = [ "libc", "wasi 0.11.1+wasi-snapshot-preview1", - "windows-sys 0.61.2", + "windows-sys 0.59.0", ] [[package]] @@ -4899,7 +4910,7 @@ version = "0.1.0" dependencies = [ "anyhow", "async-trait", - "base64 0.22.1", + "base64 0.21.7", "blake3", "bs58", "chrono", @@ -4955,7 +4966,7 @@ version = "0.1.0" dependencies = [ "angry-purple-tiger", "anyhow", - "base64 0.22.1", + "base64 0.21.7", "clap", "custom-tracing", "dialoguer", @@ -4999,7 +5010,7 @@ dependencies = [ "mobile-config", "poc-metrics", "prost", - "reqwest 0.12.24", + "reqwest 0.12.23", "serde", "serde_json", "sha2 0.10.9", @@ -5023,7 +5034,7 @@ dependencies = [ "async-compression", "async-trait", "aws-local", - "base64 0.22.1", + "base64 0.21.7", "chrono", "clap", "config", @@ -5137,7 +5148,7 @@ version = "0.30.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "74523f3a35e05aba87a1d978330aef40f67b0304ac79c1c00b294c9830543db6" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.9.4", "cfg-if", "cfg_aliases", "libc", @@ -5172,7 +5183,7 @@ version = "6.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6205bd8bb1e454ad2e27422015fb5e4f2bcc7e08fa8f27058670d208324a4d2d" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.9.4", "filetime", "fsevent-sys", "inotify", @@ -5186,11 +5197,11 @@ dependencies = [ [[package]] name = "nu-ansi-term" -version = "0.50.3" +version = "0.50.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5" +checksum = "d4a28e057d01f97e61255210fcff094d74ed0466038633e95017f5beb68e4399" dependencies = [ - "windows-sys 0.61.2", + "windows-sys 0.52.0", ] [[package]] @@ -5247,10 +5258,11 @@ dependencies = [ [[package]] name = "num-bigint-dig" -version = "0.8.6" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e661dda6640fad38e827a6d4a310ff4763082116fe217f279885c97f511bb0b7" +checksum = "dc84195820f291c7697304f3cbdadd1cb7199c0efc917ff5eafd71225c136151" dependencies = [ + "byteorder", "lazy_static", "libm", "num-integer", @@ -5285,7 +5297,7 @@ checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" dependencies = [ "proc-macro2", "quote", - "syn 2.0.110", + "syn 2.0.106", ] [[package]] @@ -5342,9 +5354,9 @@ dependencies = [ [[package]] name = "num_enum" -version = "0.7.5" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1207a7e20ad57b847bbddc6776b968420d38292bbfe2089accff5e19e82454c" +checksum = "a973b4e44ce6cad84ce69d797acf9a044532e4184c4f267913d1b546a0727b7a" dependencies = [ "num_enum_derive", "rustversion", @@ -5352,14 +5364,14 @@ dependencies = [ [[package]] name = "num_enum_derive" -version = "0.7.5" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff32365de1b6743cb203b710788263c44a03de03802daf96092f2da4fe6ba4d7" +checksum = "77e878c846a8abae00dd069496dbe8751b16ac1c3d6bd2a7283a938e8228f90d" dependencies = [ - "proc-macro-crate 3.4.0", + "proc-macro-crate 1.1.3", "proc-macro2", "quote", - "syn 2.0.110", + "syn 2.0.106", ] [[package]] @@ -5394,9 +5406,9 @@ checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" [[package]] name = "once_cell_polyfill" -version = "1.70.2" +version = "1.70.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe" +checksum = "a4895175b425cb1f87721b59f0f286c2092bd4af812243672510e1ac53e2e0ad" [[package]] name = "opaque-debug" @@ -5406,11 +5418,11 @@ checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" [[package]] name = "openssl" -version = "0.10.75" +version = "0.10.73" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08838db121398ad17ab8531ce9de97b244589089e290a384c900cb9ff7434328" +checksum = "8505734d46c8ab1e19a1dce3aef597ad87dcb4c37e7188231769bd6bd51cebf8" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.9.4", "cfg-if", "foreign-types", "libc", @@ -5427,7 +5439,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.110", + "syn 2.0.106", ] [[package]] @@ -5438,9 +5450,9 @@ checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" [[package]] name = "openssl-sys" -version = "0.9.111" +version = "0.9.109" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82cab2d520aa75e3c58898289429321eb788c3106963d0dc886ec7a5f4adc321" +checksum = "90096e2e47630d78b7d1c20952dc621f957103f8bc2c8359ec81290d75238571" dependencies = [ "cc", "libc", @@ -5598,7 +5610,7 @@ checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" dependencies = [ "proc-macro2", "quote", - "syn 2.0.110", + "syn 2.0.106", ] [[package]] @@ -5655,7 +5667,7 @@ name = "poc-entropy" version = "0.1.0" dependencies = [ "anyhow", - "base64 0.22.1", + "base64 0.21.7", "blake3", "bs58", "chrono", @@ -5694,7 +5706,7 @@ dependencies = [ "futures", "metrics", "metrics-exporter-prometheus", - "reqwest 0.12.24", + "reqwest 0.12.23", "serde", "thiserror 1.0.69", "tokio", @@ -5737,9 +5749,9 @@ checksum = "f84267b20a16ea918e43c6a88433c2d54fa145c92a811b5b047ccbe153674483" [[package]] name = "potential_utf" -version = "0.1.4" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b73949432f5e2a09657003c25bca5e19a0e9c84f8058ca374f49e0ebe605af77" +checksum = "84df19adbe5b5a0782edcab45899906947ab039ccf4573713735ee7de1e6b08a" dependencies = [ "zerovec", ] @@ -5766,7 +5778,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" dependencies = [ "proc-macro2", - "syn 2.0.110", + "syn 2.0.106", ] [[package]] @@ -5838,7 +5850,7 @@ version = "3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "219cb19e96be00ab2e37d6e299658a0cfa83e52429179969b0f0121b4ac46983" dependencies = [ - "toml_edit 0.23.7", + "toml_edit 0.23.6", ] [[package]] @@ -5867,22 +5879,23 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.103" +version = "1.0.101" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ee95bc4ef87b8d5ba32e8b7714ccc834865276eab0aed5c9958d00ec45f49e8" +checksum = "89ae43fd86e4158d6db51ad8e2b80f313af9cc74f5c0e03ccb87de09998732de" dependencies = [ "unicode-ident", ] [[package]] name = "proptest" -version = "1.9.0" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bee689443a2bd0a16ab0348b52ee43e3b2d1b1f931c8aa5c9f8de4c86fbe8c40" +checksum = "2bb0be07becd10686a0bb407298fb425360a5c44a663774406340c59a22de4ce" dependencies = [ "bit-set", "bit-vec", - "bitflags 2.10.0", + "bitflags 2.9.4", + "lazy_static", "num-traits", "rand 0.9.2", "rand_chacha 0.9.0", @@ -5910,7 +5923,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ac6c3320f9abac597dcbc668774ef006702672474aad53c6d596b62e487b40b1" dependencies = [ "heck 0.5.0", - "itertools 0.14.0", + "itertools 0.10.5", "log", "multimap", "once_cell", @@ -5921,7 +5934,7 @@ dependencies = [ "pulldown-cmark", "pulldown-cmark-to-cmark", "regex", - "syn 2.0.110", + "syn 2.0.106", "tempfile", ] @@ -5932,10 +5945,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9120690fafc389a67ba3803df527d0ec9cbbc9cc45e4cc20b332996dfb672425" dependencies = [ "anyhow", - "itertools 0.14.0", + "itertools 0.10.5", "proc-macro2", "quote", - "syn 2.0.110", + "syn 2.0.106", ] [[package]] @@ -5973,16 +5986,16 @@ version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e8bbe1a966bd2f362681a44f6edce3c2310ac21e4d5067a6e7ec396297a6ea0" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.9.4", "memchr", "unicase", ] [[package]] name = "pulldown-cmark-to-cmark" -version = "21.1.0" +version = "21.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8246feae3db61428fd0bb94285c690b460e4517d83152377543ca802357785f1" +checksum = "e5b6a0769a491a08b31ea5c62494a8f144ee0987d86d670a8af4df1e1b7cde75" dependencies = [ "pulldown-cmark", ] @@ -6029,8 +6042,8 @@ dependencies = [ "quinn-proto", "quinn-udp", "rustc-hash 2.1.1", - "rustls 0.23.35", - "socket2 0.6.1", + "rustls 0.23.32", + "socket2 0.5.10", "thiserror 2.0.17", "tokio", "tracing", @@ -6045,12 +6058,12 @@ checksum = "f1906b49b0c3bc04b5fe5d86a77925ae6524a19b816ae38ce1e426255f1d8a31" dependencies = [ "bytes", "fastbloom", - "getrandom 0.3.4", + "getrandom 0.3.3", "lru-slab", "rand 0.9.2", "ring", "rustc-hash 2.1.1", - "rustls 0.23.35", + "rustls 0.23.32", "rustls-pki-types", "rustls-platform-verifier", "slab", @@ -6069,16 +6082,16 @@ dependencies = [ "cfg_aliases", "libc", "once_cell", - "socket2 0.6.1", + "socket2 0.5.10", "tracing", "windows-sys 0.60.2", ] [[package]] name = "quote" -version = "1.0.42" +version = "1.0.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a338cc41d27e6cc6dce6cefc13a0729dfbb81c262b1f519331575dd80ef3067f" +checksum = "ce25767e7b499d1b604768e7cde645d14cc8584231ea6b295e9c9eb22c02e1d1" dependencies = [ "proc-macro2", ] @@ -6183,7 +6196,7 @@ version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" dependencies = [ - "getrandom 0.3.4", + "getrandom 0.3.3", ] [[package]] @@ -6219,7 +6232,7 @@ version = "11.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "498cd0dc59d73224351ee52a95fee0f1a617a2eae0e7d9d720cc622c73a54186" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.9.4", ] [[package]] @@ -6248,14 +6261,14 @@ version = "0.5.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.9.4", ] [[package]] name = "regex" -version = "1.12.2" +version = "1.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "843bc0191f75f3e22651ae5f1e72939ab2f72a4bc30fa80a066bd66edefc24d4" +checksum = "8b5288124840bee7b386bc413c487869b360b2b4ec421ea56425128692f2a82c" dependencies = [ "aho-corasick", "memchr", @@ -6265,9 +6278,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.13" +version = "0.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5276caf25ac86c8d810222b3dbb938e512c55c6831a10f3e6ed1c93b84041f1c" +checksum = "833eb9ce86d40ef33cb1306d8accf7bc8ec2bfea4355cbdebb3df68b40925cad" dependencies = [ "aho-corasick", "memchr", @@ -6276,15 +6289,15 @@ dependencies = [ [[package]] name = "regex-lite" -version = "0.1.8" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d942b98df5e658f56f20d592c7f868833fe38115e65c33003d8cd224b0155da" +checksum = "943f41321c63ef1c92fd763bfe054d2668f7f225a5c29f0105903dc2fc04ba30" [[package]] name = "regex-syntax" -version = "0.8.8" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a2d987857b319362043e95f5353c0535c1f58eec5336fdfcf626430af7def58" +checksum = "caf4aa5b0f434c91fe5c7f1ecb6a5ece2130b02ad2a590589dda5146df959001" [[package]] name = "relative-path" @@ -6344,9 +6357,9 @@ dependencies = [ [[package]] name = "reqwest" -version = "0.12.24" +version = "0.12.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d0946410b9f7b082a427e4ef5c8ff541a88b357bc6c637c40db3a68ac70a36f" +checksum = "d429f34c8092b2d42c7c93cec323bb4adeb7c67698f70839adec842ec10c7ceb" dependencies = [ "async-compression", "base64 0.22.1", @@ -6358,7 +6371,7 @@ dependencies = [ "http 1.3.1", "http-body 1.0.1", "http-body-util", - "hyper 1.8.1", + "hyper 1.7.0", "hyper-rustls 0.27.7", "hyper-tls", "hyper-util", @@ -6368,7 +6381,7 @@ dependencies = [ "percent-encoding", "pin-project-lite", "quinn", - "rustls 0.23.35", + "rustls 0.23.32", "rustls-pki-types", "serde", "serde_json", @@ -6385,7 +6398,7 @@ dependencies = [ "wasm-bindgen", "wasm-bindgen-futures", "web-sys", - "webpki-roots 1.0.4", + "webpki-roots 1.0.2", ] [[package]] @@ -6397,7 +6410,7 @@ dependencies = [ "anyhow", "async-trait", "http 1.3.1", - "reqwest 0.12.24", + "reqwest 0.12.23", "serde", "thiserror 1.0.69", "tower-service", @@ -6422,7 +6435,7 @@ version = "0.1.0" dependencies = [ "anyhow", "async-trait", - "base64 0.22.1", + "base64 0.21.7", "bs58", "chrono", "clap", @@ -6563,13 +6576,13 @@ dependencies = [ [[package]] name = "rsa" -version = "0.9.9" +version = "0.9.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40a0376c50d0358279d9d643e4bf7b7be212f1f4ff1da9070a7b54d22ef75c88" +checksum = "78928ac1ed176a5ca1d17e578a1825f3d81ca54cf41053a592584b020cfd691b" dependencies = [ "const-oid", "digest 0.10.7", - "num-bigint-dig 0.8.6", + "num-bigint-dig 0.8.4", "num-integer", "num-traits", "pkcs1", @@ -6615,15 +6628,15 @@ dependencies = [ "regex", "relative-path", "rustc_version", - "syn 2.0.110", + "syn 2.0.106", "unicode-ident", ] [[package]] name = "rust_decimal" -version = "1.39.0" +version = "1.38.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35affe401787a9bd846712274d97654355d21b2a2c092a3139aabe31e9022282" +checksum = "c8975fc98059f365204d635119cf9c5a60ae67b841ed49b5422a9a7e56cdfac0" dependencies = [ "arrayvec", "borsh 1.5.7", @@ -6638,12 +6651,12 @@ dependencies = [ [[package]] name = "rust_decimal_macros" -version = "1.39.0" +version = "1.38.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae8c0cb48f413ebe24dc2d148788e0efbe09ba3e011d9277162f2eaf8e1069a3" +checksum = "6dae310b657d2d686616e215c84c3119c675450d64c4b9f9e3467209191c3bcf" dependencies = [ "quote", - "syn 2.0.110", + "syn 2.0.106", ] [[package]] @@ -6688,11 +6701,11 @@ version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cd15f8a2c5551a84d56efdc1cd049089e409ac19a3072d5037a17fd70719ff3e" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.9.4", "errno", "libc", "linux-raw-sys", - "windows-sys 0.61.2", + "windows-sys 0.60.2", ] [[package]] @@ -6709,16 +6722,16 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.35" +version = "0.23.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "533f54bc6a7d4f647e46ad909549eda97bf5afc1585190ef692b4286b198bd8f" +checksum = "cd3c25631629d034ce7cd9940adc9d45762d46de2b0f57193c4443b92c6d4d40" dependencies = [ "aws-lc-rs", "log", "once_cell", "ring", "rustls-pki-types", - "rustls-webpki 0.103.8", + "rustls-webpki 0.103.7", "subtle", "zeroize", ] @@ -6737,9 +6750,9 @@ dependencies = [ [[package]] name = "rustls-native-certs" -version = "0.8.2" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9980d917ebb0c0536119ba501e90834767bffc3d60641457fd84a1f3fd337923" +checksum = "7fcff2dd52b58a8d98a70243663a0d234c4e2b79235637849d15913394a247d3" dependencies = [ "openssl-probe", "rustls-pki-types", @@ -6758,9 +6771,9 @@ dependencies = [ [[package]] name = "rustls-pki-types" -version = "1.13.0" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94182ad936a0c91c324cd46c6511b9510ed16af436d7b5bab34beab0afd55f7a" +checksum = "229a4a4c221013e7e1f1a043678c5cc39fe5171437c88fb47151a21e6f5b5c79" dependencies = [ "web-time", "zeroize", @@ -6768,23 +6781,23 @@ dependencies = [ [[package]] name = "rustls-platform-verifier" -version = "0.6.2" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d99feebc72bae7ab76ba994bb5e121b8d83d910ca40b36e0921f53becc41784" +checksum = "be59af91596cac372a6942530653ad0c3a246cdd491aaa9dcaee47f88d67d5a0" dependencies = [ "core-foundation 0.10.1", "core-foundation-sys", "jni", "log", "once_cell", - "rustls 0.23.35", - "rustls-native-certs 0.8.2", + "rustls 0.23.32", + "rustls-native-certs 0.8.1", "rustls-platform-verifier-android", - "rustls-webpki 0.103.8", + "rustls-webpki 0.103.7", "security-framework 3.5.1", "security-framework-sys", "webpki-root-certs", - "windows-sys 0.61.2", + "windows-sys 0.59.0", ] [[package]] @@ -6805,9 +6818,9 @@ dependencies = [ [[package]] name = "rustls-webpki" -version = "0.103.8" +version = "0.103.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ffdfa2f5286e2247234e03f680868ac2815974dc39e00ea15adc445d0aafe52" +checksum = "e10b3f4191e8a80e6b43eebabfac91e5dcecebb27a71f04e820c47ec41d314bf" dependencies = [ "aws-lc-rs", "ring", @@ -6912,7 +6925,7 @@ version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.9.4", "core-foundation 0.9.4", "core-foundation-sys", "libc", @@ -6925,7 +6938,7 @@ version = "3.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b3297343eaf830f66ede390ea39da1d462b6b0c1b000f420d0a83f898bbbe6ef" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.9.4", "core-foundation 0.10.1", "core-foundation-sys", "libc", @@ -6994,7 +7007,7 @@ checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" dependencies = [ "proc-macro2", "quote", - "syn 2.0.110", + "syn 2.0.106", ] [[package]] @@ -7029,7 +7042,7 @@ checksum = "175ee3e80ae9982737ca543e96133087cbd9a485eecc3bc4de9c1a37b47ea59c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.110", + "syn 2.0.106", ] [[package]] @@ -7043,9 +7056,9 @@ dependencies = [ [[package]] name = "serde_spanned" -version = "1.0.3" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e24345aa0fe688594e73770a5f6d1b216508b4f93484c0026d521acd30134392" +checksum = "5417783452c2be558477e104686f7de5dae53dba813c28435e0e70f82d9b04ee" dependencies = [ "serde_core", ] @@ -7064,9 +7077,9 @@ dependencies = [ [[package]] name = "serde_with" -version = "3.15.1" +version = "3.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa66c845eee442168b2c8134fec70ac50dc20e760769c8ba0ad1319ca1959b04" +checksum = "6093cd8c01b25262b84927e0f7151692158fab02d961e04c979d3903eba7ecc5" dependencies = [ "serde_core", "serde_with_macros", @@ -7074,14 +7087,14 @@ dependencies = [ [[package]] name = "serde_with_macros" -version = "3.15.1" +version = "3.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b91a903660542fced4e99881aa481bdbaec1634568ee02e0b8bd57c64cb38955" +checksum = "a7e6c180db0816026a61afa1cff5344fb7ebded7e4d3062772179f2501481c27" dependencies = [ "darling 0.21.3", "proc-macro2", "quote", - "syn 2.0.110", + "syn 2.0.106", ] [[package]] @@ -7258,12 +7271,12 @@ dependencies = [ [[package]] name = "socket2" -version = "0.6.1" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17129e116933cf371d018bb80ae557e889637989d8638274fb25622827b03881" +checksum = "233504af464074f9d066d7b5416c5f9b894a5862a6506e306f7b816cdd6f1807" dependencies = [ "libc", - "windows-sys 0.60.2", + "windows-sys 0.59.0", ] [[package]] @@ -7312,9 +7325,9 @@ dependencies = [ [[package]] name = "solana-account-decoder" -version = "2.3.13" +version = "2.3.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba71c97fa4d85ce4a1e0e79044ad0406c419382be598c800202903a7688ce71a" +checksum = "26815fb228611d6f75908a979bc148127d4c391aecda0ea58144981320250535" dependencies = [ "Inflector", "base64 0.22.1", @@ -7355,9 +7368,9 @@ dependencies = [ [[package]] name = "solana-account-decoder-client-types" -version = "2.3.13" +version = "2.3.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5519e8343325b707f17fbed54fcefb325131b692506d0af9e08a539d15e4f8cf" +checksum = "aba51728bba2d7cdb86c92c0e5d3c33e9c98f11defe16d1042861ac732fc99bb" dependencies = [ "base64 0.22.1", "bs58", @@ -7469,9 +7482,9 @@ dependencies = [ [[package]] name = "solana-client" -version = "2.3.13" +version = "2.3.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc55d1f263e0be4127daf33378d313ea0977f9ffd3fba50fa544ca26722fc695" +checksum = "7488cc84ebf8bb809dd019d84f069a0b709666ae5b155230e9089bd59ce1d908" dependencies = [ "async-trait", "bincode", @@ -7596,9 +7609,9 @@ dependencies = [ [[package]] name = "solana-connection-cache" -version = "2.3.13" +version = "2.3.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45c1cff5ebb26aefff52f1a8e476de70ec1683f8cc6e4a8c86b615842d91f436" +checksum = "354714af37a6d26d93416a6b91d95f2a906e21a22d65033ac08cb40e18ef26a7" dependencies = [ "async-trait", "bincode", @@ -7633,9 +7646,9 @@ dependencies = [ [[package]] name = "solana-curve25519" -version = "2.3.13" +version = "2.3.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eae4261b9a8613d10e77ac831a8fa60b6fa52b9b103df46d641deff9f9812a23" +checksum = "fa77936de1910002e7ad5817e38c3990402c2d8e92517cdd736df51485c76d88" dependencies = [ "bytemuck", "bytemuck_derive", @@ -7881,9 +7894,9 @@ dependencies = [ [[package]] name = "solana-instruction" -version = "2.3.3" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bab5682934bd1f65f8d2c16f21cb532526fcc1a09f796e2cacdb091eee5774ad" +checksum = "47298e2ce82876b64f71e9d13a46bc4b9056194e7f9937ad3084385befa50885" dependencies = [ "bincode", "borsh 1.5.7", @@ -7892,7 +7905,6 @@ dependencies = [ "num-traits", "serde", "serde_derive", - "serde_json", "solana-define-syscall", "solana-pubkey", "wasm-bindgen", @@ -7904,7 +7916,7 @@ version = "2.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e0e85a6fad5c2d0c4f5b91d34b8ca47118fc593af706e523cdbedf846a954f57" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.9.4", "solana-account-info", "solana-instruction", "solana-program-error", @@ -8018,9 +8030,9 @@ dependencies = [ [[package]] name = "solana-measure" -version = "2.3.13" +version = "2.3.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11dcd67cd2ae6065e494b64e861e0498d046d95a61cbbf1ae3d58be1ea0f42ed" +checksum = "d98d3c9827ce044863fc67b7cbc15c341c27bf6fa9c1070deccd2a4aa7cb801d" [[package]] name = "solana-message" @@ -8047,14 +8059,14 @@ dependencies = [ [[package]] name = "solana-metrics" -version = "2.3.13" +version = "2.3.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0375159d8460f423d39e5103dcff6e07796a5ec1850ee1fcfacfd2482a8f34b5" +checksum = "062baa36c40a08f413b1f84c8b739649609883af47e1624a85eaf9f90075441e" dependencies = [ "crossbeam-channel", "gethostname", "log", - "reqwest 0.12.24", + "reqwest 0.12.23", "solana-cluster-type", "solana-sha256-hasher", "solana-time-utils", @@ -8078,9 +8090,9 @@ checksum = "61515b880c36974053dd499c0510066783f0cc6ac17def0c7ef2a244874cf4a9" [[package]] name = "solana-net-utils" -version = "2.3.13" +version = "2.3.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7a9e831d0f09bd92135d48c5bc79071bb59c0537b9459f1b4dec17ecc0558fa" +checksum = "32867badc4fc61a156bf11373740ce611c1c171c790eda221f3b82d0d0947e9b" dependencies = [ "anyhow", "bincode", @@ -8146,7 +8158,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "004f2d2daf407b3ec1a1ca5ec34b3ccdfd6866dd2d3c7d0715004a96e4b6d127" dependencies = [ "bincode", - "bitflags 2.10.0", + "bitflags 2.9.4", "cfg_eval", "serde", "serde_derive", @@ -8155,9 +8167,9 @@ dependencies = [ [[package]] name = "solana-perf" -version = "2.3.13" +version = "2.3.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37192c0be5c222ca49dbc5667288c5a8bb14837051dd98e541ee4dad160a5da9" +checksum = "7c7b6e57afcee6a5e2aaa0ec66d539148d6fc4c672927479ef1a2685d9976d8a" dependencies = [ "ahash 0.8.12", "bincode", @@ -8394,9 +8406,9 @@ dependencies = [ [[package]] name = "solana-pubsub-client" -version = "2.3.13" +version = "2.3.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d18a7476e1d2e8df5093816afd8fffee94fbb6e442d9be8e6bd3e85f88ce8d5c" +checksum = "86b1fa505f2c24107525b3d1b49a2fbe78f9430cb97e3a0e9957dd215f4b2bdf" dependencies = [ "crossbeam-channel", "futures-util", @@ -8421,9 +8433,9 @@ dependencies = [ [[package]] name = "solana-quic-client" -version = "2.3.13" +version = "2.3.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44feb5f4a97494459c435aa56de810500cc24e22d0afc632990a8e54a07c05a4" +checksum = "a4dff89c984bb7d1dd0db254c4717fc0364f13c0d54a9c84b389359e60a4475f" dependencies = [ "async-lock 3.4.1", "async-trait", @@ -8432,7 +8444,7 @@ dependencies = [ "log", "quinn", "quinn-proto", - "rustls 0.23.35", + "rustls 0.23.32", "solana-connection-cache", "solana-keypair", "solana-measure", @@ -8460,9 +8472,9 @@ dependencies = [ [[package]] name = "solana-rayon-threadlimit" -version = "2.3.13" +version = "2.3.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02cc2a4cae3ef7bb6346b35a60756d2622c297d5fa204f96731db9194c0dc75b" +checksum = "b95e07583c317e5a56681932bb9d05f2b4f1c679d44c36550f32095677e8779f" dependencies = [ "num_cpus", ] @@ -8531,9 +8543,9 @@ dependencies = [ [[package]] name = "solana-rpc-client" -version = "2.3.13" +version = "2.3.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8d3161ac0918178e674c1f7f1bfac40de3e7ed0383bd65747d63113c156eaeb" +checksum = "a7529f262a01dc4ceb0444bcc2103603be071a66d55554690b184ea87bd57d4e" dependencies = [ "async-trait", "base64 0.22.1", @@ -8542,7 +8554,7 @@ dependencies = [ "futures", "indicatif", "log", - "reqwest 0.12.24", + "reqwest 0.12.23", "reqwest-middleware", "semver", "serde", @@ -8571,13 +8583,13 @@ dependencies = [ [[package]] name = "solana-rpc-client-api" -version = "2.3.13" +version = "2.3.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dbc138685c79d88a766a8fd825057a74ea7a21e1dd7f8de275ada899540fff7" +checksum = "21751b079e5fd6726aaae3788472d5a3f036a627dc8b6d4ffcfde1d6459102c3" dependencies = [ "anyhow", "jsonrpc-core", - "reqwest 0.12.24", + "reqwest 0.12.23", "reqwest-middleware", "serde", "serde_derive", @@ -8593,9 +8605,9 @@ dependencies = [ [[package]] name = "solana-rpc-client-nonce-utils" -version = "2.3.13" +version = "2.3.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87f0ee41b9894ff36adebe546a110b899b0d0294b07845d8acdc73822e6af4b0" +checksum = "09da559a19ee6b6bd5ff1f23cd936acbc9e0f92387935235a10dee4d3a13bd71" dependencies = [ "solana-account", "solana-commitment-config", @@ -8610,9 +8622,9 @@ dependencies = [ [[package]] name = "solana-rpc-client-types" -version = "2.3.13" +version = "2.3.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ea428a81729255d895ea47fba9b30fd4dacbfe571a080448121bd0592751676" +checksum = "f0e1d4088b578c253a412725888333f776de0b52de61cbe1178c43308107e071" dependencies = [ "base64 0.22.1", "bs58", @@ -8729,7 +8741,7 @@ dependencies = [ "bs58", "proc-macro2", "quote", - "syn 2.0.110", + "syn 2.0.106", ] [[package]] @@ -8948,9 +8960,9 @@ dependencies = [ [[package]] name = "solana-streamer" -version = "2.3.13" +version = "2.3.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5643516e5206b89dd4bdf67c39815606d835a51a13260e43349abdb92d241b1d" +checksum = "d04674440673451ce3cd7a9f8d82b4de657b9317791df93ddff414a34244c50d" dependencies = [ "async-channel", "bytes", @@ -8970,7 +8982,7 @@ dependencies = [ "quinn", "quinn-proto", "rand 0.8.5", - "rustls 0.23.35", + "rustls 0.23.32", "smallvec", "socket2 0.5.10", "solana-keypair", @@ -8995,9 +9007,9 @@ dependencies = [ [[package]] name = "solana-svm-feature-set" -version = "2.3.13" +version = "2.3.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f24b836eb4d74ec255217bdbe0f24f64a07adeac31aca61f334f91cd4a3b1d5" +checksum = "a7fe5a6e173eec22c54806b413f5e383b8b82ca13b1767fa53fd40ec8512e6ee" [[package]] name = "solana-system-interface" @@ -9079,9 +9091,9 @@ dependencies = [ [[package]] name = "solana-thin-client" -version = "2.3.13" +version = "2.3.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c1025715a113e0e2e379b30a6bfe4455770dc0759dabf93f7dbd16646d5acbe" +checksum = "1dda0eb4b4f000fe757da47da51c3e709a606425ac1d17434ea7b7929c20ae67" dependencies = [ "bincode", "log", @@ -9114,11 +9126,11 @@ checksum = "6af261afb0e8c39252a04d026e3ea9c405342b08c871a2ad8aa5448e068c784c" [[package]] name = "solana-tls-utils" -version = "2.3.13" +version = "2.3.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14494aa87a75a883d1abcfee00f1278a28ecc594a2f030084879eb40570728f6" +checksum = "33d4f5bebbd0e005fa76427db2630f4558128d1a6c8cff616a3587c8519b14f3" dependencies = [ - "rustls 0.23.35", + "rustls 0.23.32", "solana-keypair", "solana-pubkey", "solana-signer", @@ -9127,9 +9139,9 @@ dependencies = [ [[package]] name = "solana-tpu-client" -version = "2.3.13" +version = "2.3.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17895ce70fd1dd93add3fbac87d599954ded93c63fa1c66f702d278d96a6da14" +checksum = "22fd3202b4e07e8877179b63fe33c7028aa40e8d9ad63273349b24fe6cc00c65" dependencies = [ "async-trait", "bincode", @@ -9188,9 +9200,9 @@ dependencies = [ [[package]] name = "solana-transaction-context" -version = "2.3.13" +version = "2.3.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54a312304361987a85b2ef2293920558e6612876a639dd1309daf6d0d59ef2fe" +checksum = "99b02e4d84d75dc196689f0256234b31a11e3cc97abc22ac71c945e930d1fea1" dependencies = [ "bincode", "serde", @@ -9217,9 +9229,9 @@ dependencies = [ [[package]] name = "solana-transaction-metrics-tracker" -version = "2.3.13" +version = "2.3.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03fc4e1b6252dc724f5ee69db6229feb43070b7318651580d2174da8baefb993" +checksum = "05dd69d3052940dba222063553717462e043c03b81838e286c4ea30250abf66b" dependencies = [ "base64 0.22.1", "bincode", @@ -9233,9 +9245,9 @@ dependencies = [ [[package]] name = "solana-transaction-status" -version = "2.3.13" +version = "2.3.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "135f92f4192cc68900c665becf97fc0a6500ae5a67ff347bf2cbc20ecfefa821" +checksum = "83755842872c791da19cb05b1f6f021345359edd34320db900612b41ea4c2e2b" dependencies = [ "Inflector", "agave-reserved-account-keys", @@ -9277,9 +9289,9 @@ dependencies = [ [[package]] name = "solana-transaction-status-client-types" -version = "2.3.13" +version = "2.3.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51f1d7c2387c35850848212244d2b225847666cb52d3bd59a5c409d2c300303d" +checksum = "7000081550c6b23cd6c7d18dfa54f06793b7906d28a038eac46e1d6b72da4750" dependencies = [ "base64 0.22.1", "bincode", @@ -9327,9 +9339,9 @@ dependencies = [ [[package]] name = "solana-udp-client" -version = "2.3.13" +version = "2.3.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dd36227dd3035ac09a89d4239551d2e3d7d9b177b61ccc7c6d393c3974d0efa" +checksum = "84e3da9310584355ef7bf797f24f1b40cc7e0c271585b5de1edae1202abaab7e" dependencies = [ "async-trait", "solana-connection-cache", @@ -9349,9 +9361,9 @@ checksum = "7bbf6d7a3c0b28dd5335c52c0e9eae49d0ae489a8f324917faf0ded65a812c1d" [[package]] name = "solana-version" -version = "2.3.13" +version = "2.3.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3324d46c7f7b7f5d34bf7dc71a2883bdc072c7b28ca81d0b2167ecec4cf8da9f" +checksum = "4a2c757ffbd2cae2b5486715fde6fe675ce7f98197ccdafd896096dfafc8a680" dependencies = [ "agave-feature-set", "rand 0.8.5", @@ -9388,9 +9400,9 @@ dependencies = [ [[package]] name = "solana-zk-sdk" -version = "2.3.13" +version = "2.3.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97b9fc6ec37d16d0dccff708ed1dd6ea9ba61796700c3bb7c3b401973f10f63b" +checksum = "1ffc4ca8e3e26a8f80eb0026adf8af1732863f42739cd2201c40c568ccae360c" dependencies = [ "aes-gcm-siv", "base64 0.22.1", @@ -9522,7 +9534,7 @@ checksum = "d9e8418ea6269dcfb01c712f0444d2c75542c04448b480e87de59d2865edc750" dependencies = [ "quote", "spl-discriminator-syn", - "syn 2.0.110", + "syn 2.0.106", ] [[package]] @@ -9534,7 +9546,7 @@ dependencies = [ "proc-macro2", "quote", "sha2 0.10.9", - "syn 2.0.110", + "syn 2.0.106", "thiserror 1.0.69", ] @@ -9655,7 +9667,7 @@ dependencies = [ "proc-macro2", "quote", "sha2 0.10.9", - "syn 2.0.110", + "syn 2.0.106", ] [[package]] @@ -9667,7 +9679,7 @@ dependencies = [ "proc-macro2", "quote", "sha2 0.10.9", - "syn 2.0.110", + "syn 2.0.106", ] [[package]] @@ -10128,7 +10140,7 @@ dependencies = [ "once_cell", "percent-encoding", "rust_decimal", - "rustls 0.23.35", + "rustls 0.23.32", "serde", "serde_json", "sha2 0.10.9", @@ -10152,7 +10164,7 @@ dependencies = [ "quote", "sqlx-core", "sqlx-macros-core", - "syn 2.0.110", + "syn 2.0.106", ] [[package]] @@ -10175,7 +10187,7 @@ dependencies = [ "sqlx-mysql", "sqlx-postgres", "sqlx-sqlite", - "syn 2.0.110", + "syn 2.0.106", "tokio", "url", ] @@ -10188,7 +10200,7 @@ checksum = "aa003f0038df784eb8fecbbac13affe3da23b45194bd57dba231c8f48199c526" dependencies = [ "atoi", "base64 0.22.1", - "bitflags 2.10.0", + "bitflags 2.9.4", "byteorder", "bytes", "chrono", @@ -10211,7 +10223,7 @@ dependencies = [ "once_cell", "percent-encoding", "rand 0.8.5", - "rsa 0.9.9", + "rsa 0.9.8", "rust_decimal", "serde", "sha1", @@ -10233,7 +10245,7 @@ checksum = "db58fcd5a53cf07c184b154801ff91347e4c30d17a3562a635ff028ad5deda46" dependencies = [ "atoi", "base64 0.22.1", - "bitflags 2.10.0", + "bitflags 2.9.4", "byteorder", "chrono", "crc", @@ -10293,9 +10305,9 @@ dependencies = [ [[package]] name = "stable_deref_trait" -version = "1.2.1" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" [[package]] name = "static_assertions" @@ -10338,7 +10350,7 @@ dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.110", + "syn 2.0.106", ] [[package]] @@ -10360,9 +10372,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.110" +version = "2.0.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a99801b5bd34ede4cf3fc688c5919368fea4e4814a4664359503e6015b280aea" +checksum = "ede7c438028d4436d71104916910f5bb611972c5cfd7f89b8300a8186e6fada6" dependencies = [ "proc-macro2", "quote", @@ -10404,7 +10416,7 @@ checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.110", + "syn 2.0.106", ] [[package]] @@ -10461,10 +10473,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2d31c77bdf42a745371d260a26ca7163f1e0924b64afa0b688e61b5a9fa02f16" dependencies = [ "fastrand", - "getrandom 0.3.4", + "getrandom 0.3.3", "once_cell", "rustix", - "windows-sys 0.61.2", + "windows-sys 0.60.2", ] [[package]] @@ -10502,7 +10514,7 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.110", + "syn 2.0.106", ] [[package]] @@ -10513,7 +10525,7 @@ checksum = "3ff15c8ecd7de3849db632e14d18d2571fa09dfc5ed93479bc4485c7a517c913" dependencies = [ "proc-macro2", "quote", - "syn 2.0.110", + "syn 2.0.106", ] [[package]] @@ -10567,9 +10579,9 @@ dependencies = [ [[package]] name = "tinystr" -version = "0.8.2" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42d3e9c45c09de15d06dd8acf5f4e0e399e85927b7f00711024eb7ae10fa4869" +checksum = "5d4f6d1145dcb577acf783d4e601bc1d76a13337bb54e6233add580b07344c8b" dependencies = [ "displaydoc", "zerovec", @@ -10596,26 +10608,29 @@ version = "0.1.0" dependencies = [ "ctor", "hyper-rustls 0.27.7", - "rustls 0.23.35", - "rustls-webpki 0.103.8", + "rustls 0.23.32", + "rustls-webpki 0.103.7", "tokio-rustls 0.26.4", ] [[package]] name = "tokio" -version = "1.48.0" +version = "1.47.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff360e02eab121e0bc37a2d3b4d4dc622e6eda3a8e5253d5435ecf5bd4c68408" +checksum = "89e49afdadebb872d3145a5638b59eb0691ea23e46ca484037cfab3b76b95038" dependencies = [ + "backtrace", "bytes", + "io-uring", "libc", - "mio 1.1.0", + "mio 1.0.4", "parking_lot", "pin-project-lite", "signal-hook-registry", - "socket2 0.6.1", + "slab", + "socket2 0.6.0", "tokio-macros", - "windows-sys 0.61.2", + "windows-sys 0.59.0", ] [[package]] @@ -10637,13 +10652,13 @@ dependencies = [ [[package]] name = "tokio-macros" -version = "2.6.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af407857209536a95c8e56f8231ef2c2e2aff839b22e07a1ffcbc617e9db9fa5" +checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.110", + "syn 2.0.106", ] [[package]] @@ -10672,7 +10687,7 @@ version = "0.26.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61" dependencies = [ - "rustls 0.23.35", + "rustls 0.23.32", "tokio", ] @@ -10704,9 +10719,9 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.17" +version = "0.7.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2efa149fe76073d6e8fd97ef4f4eca7b67f599660115591483572e406e165594" +checksum = "14307c986784f72ef81c89db7d9e28d6ac26d16213b109ea501696195e6e3ce5" dependencies = [ "bytes", "futures-core", @@ -10738,13 +10753,13 @@ dependencies = [ [[package]] name = "toml" -version = "0.9.8" +version = "0.9.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0dc8b1fb61449e27716ec0e1bdf0f6b8f3e8f6b05391e8497b8b6d7804ea6d8" +checksum = "00e5e5d9bf2475ac9d4f0d9edab68cc573dc2fd644b0dba36b0c30a92dd9eaa0" dependencies = [ "serde_core", - "serde_spanned 1.0.3", - "toml_datetime 0.7.3", + "serde_spanned 1.0.2", + "toml_datetime 0.7.2", "toml_parser", "winnow", ] @@ -10760,9 +10775,9 @@ dependencies = [ [[package]] name = "toml_datetime" -version = "0.7.3" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2cdb639ebbc97961c51720f858597f7f24c4fc295327923af55b74c3c724533" +checksum = "32f1085dec27c2b6632b04c80b3bb1b4300d6495d1e129693bdda7d91e72eec1" dependencies = [ "serde_core", ] @@ -10783,21 +10798,21 @@ dependencies = [ [[package]] name = "toml_edit" -version = "0.23.7" +version = "0.23.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6485ef6d0d9b5d0ec17244ff7eb05310113c3f316f2d14200d4de56b3cb98f8d" +checksum = "f3effe7c0e86fdff4f69cdd2ccc1b96f933e24811c5441d44904e8683e27184b" dependencies = [ "indexmap", - "toml_datetime 0.7.3", + "toml_datetime 0.7.2", "toml_parser", "winnow", ] [[package]] name = "toml_parser" -version = "1.0.4" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0cbe268d35bdb4bb5a56a2de88d0ad0eb70af5384a99d648cd4b3d04039800e" +checksum = "4cf893c33be71572e0e9aa6dd15e6677937abd686b066eac3f8cd3531688a627" dependencies = [ "winnow", ] @@ -10822,13 +10837,13 @@ dependencies = [ "http 1.3.1", "http-body 1.0.1", "http-body-util", - "hyper 1.8.1", + "hyper 1.7.0", "hyper-timeout", "hyper-util", "percent-encoding", "pin-project", - "rustls-native-certs 0.8.2", - "socket2 0.6.1", + "rustls-native-certs 0.8.1", + "socket2 0.6.0", "sync_wrapper 1.0.2", "tokio", "tokio-rustls 0.26.4", @@ -10848,7 +10863,7 @@ dependencies = [ "prettyplease", "proc-macro2", "quote", - "syn 2.0.110", + "syn 2.0.106", ] [[package]] @@ -10873,7 +10888,7 @@ dependencies = [ "prost-build", "prost-types", "quote", - "syn 2.0.110", + "syn 2.0.106", "tempfile", "tonic-build", ] @@ -10918,7 +10933,7 @@ version = "0.6.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "adc82fd73de2a9722ac5da747f12383d2bfdb93591ee6c58486e0097890f05f2" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.9.4", "bytes", "futures-util", "http 1.3.1", @@ -10963,7 +10978,7 @@ checksum = "81383ab64e72a7a8b8e13130c49e3dab29def6d0c7d76a03087b3cf71c5c6903" dependencies = [ "proc-macro2", "quote", - "syn 2.0.110", + "syn 2.0.106", ] [[package]] @@ -11020,7 +11035,7 @@ checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" [[package]] name = "tuktuk-program" version = "0.3.2" -source = "git+https://github.com/helium/tuktuk.git?branch=main#1f3433984498257b0c05455aaa5855d1e3317cd9" +source = "git+https://github.com/helium/tuktuk.git?branch=main#c179599adc2d00a956fd296c11ba779ce87da611" dependencies = [ "anchor-lang", ] @@ -11028,7 +11043,7 @@ dependencies = [ [[package]] name = "tuktuk-sdk" version = "0.3.6" -source = "git+https://github.com/helium/tuktuk.git?branch=main#1f3433984498257b0c05455aaa5855d1e3317cd9" +source = "git+https://github.com/helium/tuktuk.git?branch=main#c179599adc2d00a956fd296c11ba779ce87da611" dependencies = [ "anchor-lang", "async-trait", @@ -11093,7 +11108,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "97fee6b57c6a41524a810daee9286c02d7752c4253064d0b05472833a438f675" dependencies = [ "cfg-if", - "rand 0.8.5", + "rand 0.7.3", "static_assertions", ] @@ -11123,24 +11138,24 @@ checksum = "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885f5e29df5" [[package]] name = "unicode-ident" -version = "1.0.22" +version = "1.0.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5" +checksum = "f63a545481291138910575129486daeaf8ac54aee4387fe7906919f7830c7d9d" [[package]] name = "unicode-normalization" -version = "0.1.25" +version = "0.1.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fd4f6878c9cb28d874b009da9e8d183b5abc80117c40bbd187a1fde336be6e8" +checksum = "5033c97c4262335cded6d6fc3e5c18ab755e1a3dc96376350f3d8e9f009ad956" dependencies = [ "tinyvec", ] [[package]] name = "unicode-properties" -version = "0.1.4" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7df058c713841ad818f1dc5d3fd88063241cc61f49f5fbea4b951e8cf5a8d71d" +checksum = "e70f2a8b45122e719eb623c01822704c4e0907e7e426a05927e1a1cfff5b75d0" [[package]] name = "unicode-segmentation" @@ -11240,7 +11255,7 @@ version = "1.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2f87b8aa10b915a06587d0dec516c282ff295b475d94abf425d62b57710070a2" dependencies = [ - "getrandom 0.3.4", + "getrandom 0.3.3", "js-sys", "serde", "wasm-bindgen", @@ -11310,6 +11325,15 @@ version = "0.11.1+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" +[[package]] +name = "wasi" +version = "0.14.7+wasi-0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "883478de20367e224c0090af9cf5f9fa85bed63a95c1abf3afc5c083ebc06e8c" +dependencies = [ + "wasip2", +] + [[package]] name = "wasip2" version = "1.0.1+wasi-0.2.4" @@ -11327,9 +11351,9 @@ checksum = "b8dad83b4f25e74f184f64c43b150b91efe7647395b42289f38e50566d82855b" [[package]] name = "wasm-bindgen" -version = "0.2.105" +version = "0.2.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da95793dfc411fbbd93f5be7715b0578ec61fe87cb1a42b12eb625caa5c5ea60" +checksum = "c1da10c01ae9f1ae40cbfac0bac3b1e724b320abfcf52229f80b547c0d250e2d" dependencies = [ "cfg-if", "once_cell", @@ -11338,11 +11362,25 @@ dependencies = [ "wasm-bindgen-shared", ] +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.104" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "671c9a5a66f49d8a47345ab942e2cb93c7d1d0339065d4f8139c486121b43b19" +dependencies = [ + "bumpalo", + "log", + "proc-macro2", + "quote", + "syn 2.0.106", + "wasm-bindgen-shared", +] + [[package]] name = "wasm-bindgen-futures" -version = "0.4.55" +version = "0.4.54" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "551f88106c6d5e7ccc7cd9a16f312dd3b5d36ea8b4954304657d5dfba115d4a0" +checksum = "7e038d41e478cc73bae0ff9b36c60cff1c98b8f38f8d7e8061e79ee63608ac5c" dependencies = [ "cfg-if", "js-sys", @@ -11353,9 +11391,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.105" +version = "0.2.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04264334509e04a7bf8690f2384ef5265f05143a4bff3889ab7a3269adab59c2" +checksum = "7ca60477e4c59f5f2986c50191cd972e3a50d8a95603bc9434501cf156a9a119" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -11363,31 +11401,31 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.105" +version = "0.2.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "420bc339d9f322e562942d52e115d57e950d12d88983a14c79b86859ee6c7ebc" +checksum = "9f07d2f20d4da7b26400c9f4a0511e6e0345b040694e8a75bd41d578fa4421d7" dependencies = [ - "bumpalo", "proc-macro2", "quote", - "syn 2.0.110", + "syn 2.0.106", + "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.105" +version = "0.2.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76f218a38c84bcb33c25ec7059b07847d465ce0e0a76b995e134a45adcb6af76" +checksum = "bad67dc8b2a1a6e5448428adec4c3e84c43e561d8c9ee8a9e5aabeb193ec41d1" dependencies = [ "unicode-ident", ] [[package]] name = "web-sys" -version = "0.3.82" +version = "0.3.81" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a1f95c0d03a47f4ae1f7a64643a6bb97465d9b740f0fa8f90ea33915c99a9a1" +checksum = "9367c417a924a74cae129e6a2ae3b47fabb1f8995595ab474029da749a8be120" dependencies = [ "js-sys", "wasm-bindgen", @@ -11405,9 +11443,9 @@ dependencies = [ [[package]] name = "webpki-root-certs" -version = "1.0.4" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee3e3b5f5e80bc89f30ce8d0343bf4e5f12341c51f3e26cbeecbc7c85443e85b" +checksum = "4e4ffd8df1c57e87c325000a3d6ef93db75279dc3a231125aac571650f22b12a" dependencies = [ "rustls-pki-types", ] @@ -11433,14 +11471,14 @@ version = "0.26.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "521bc38abb08001b01866da9f51eb7c5d647a19260e00054a8c7fd5f9e57f7a9" dependencies = [ - "webpki-roots 1.0.4", + "webpki-roots 1.0.2", ] [[package]] name = "webpki-roots" -version = "1.0.4" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2878ef029c47c6e8cf779119f20fcf52bde7ad42a731b2a304bc221df17571e" +checksum = "7e8983c3ab33d6fb807cfcdad2491c4ea8cbc8ed839181c7dfd9c67c83e261b2" dependencies = [ "rustls-pki-types", ] @@ -11477,7 +11515,7 @@ version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" dependencies = [ - "windows-sys 0.61.2", + "windows-sys 0.48.0", ] [[package]] @@ -11507,7 +11545,7 @@ checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" dependencies = [ "proc-macro2", "quote", - "syn 2.0.110", + "syn 2.0.106", ] [[package]] @@ -11518,7 +11556,7 @@ checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" dependencies = [ "proc-macro2", "quote", - "syn 2.0.110", + "syn 2.0.106", ] [[package]] @@ -11869,9 +11907,9 @@ checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59" [[package]] name = "writeable" -version = "0.6.2" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9edde0db4769d2dc68579893f2306b26c6ecfbe0ef499b013d731b7b9247e0b9" +checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb" [[package]] name = "wyz" @@ -11924,7 +11962,7 @@ version = "0.7.0" source = "git+https://github.com/helium/xorf-generator?branch=main#0d23ba2dcac2e2823d842566436df406f5ce923c" dependencies = [ "anyhow", - "base64 0.22.1", + "base64 0.21.7", "bincode", "bytes", "clap", @@ -11937,7 +11975,7 @@ dependencies = [ "rand 0.8.5", "serde", "serde_json", - "sha2 0.10.9", + "sha2 0.9.9", "thiserror 1.0.69", "twox-hash", "xorf", @@ -11945,10 +11983,11 @@ dependencies = [ [[package]] name = "yoke" -version = "0.8.1" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72d6e5c6afb84d73944e5cedb052c4680d5657337201555f9f2a16b7406d4954" +checksum = "5f41bb01b8226ef4bfd589436a297c53d118f65921786300e427be8d487695cc" dependencies = [ + "serde", "stable_deref_trait", "yoke-derive", "zerofrom", @@ -11956,13 +11995,13 @@ dependencies = [ [[package]] name = "yoke-derive" -version = "0.8.1" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d" +checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.110", + "syn 2.0.106", "synstructure 0.13.2", ] @@ -11983,7 +12022,7 @@ checksum = "88d2b8d9c68ad2b9e4340d7832716a4d21a22a1154777ad56ea55c51a9cf3831" dependencies = [ "proc-macro2", "quote", - "syn 2.0.110", + "syn 2.0.106", ] [[package]] @@ -12003,7 +12042,7 @@ checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" dependencies = [ "proc-macro2", "quote", - "syn 2.0.110", + "syn 2.0.106", "synstructure 0.13.2", ] @@ -12024,14 +12063,14 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.110", + "syn 2.0.106", ] [[package]] name = "zerotrie" -version = "0.2.3" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a59c17a5562d507e4b54960e8569ebee33bee890c70aa3fe7b97e85a9fd7851" +checksum = "36f0bbd478583f79edad978b407914f61b2972f5af6fa089686016be8f9af595" dependencies = [ "displaydoc", "yoke", @@ -12040,9 +12079,9 @@ dependencies = [ [[package]] name = "zerovec" -version = "0.11.5" +version = "0.11.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c28719294829477f525be0186d13efa9a3c602f7ec202ca9e353d310fb9a002" +checksum = "e7aa2bd55086f1ab526693ecbe444205da57e25f4489879da80635a46d90e73b" dependencies = [ "yoke", "zerofrom", @@ -12051,13 +12090,13 @@ dependencies = [ [[package]] name = "zerovec-derive" -version = "0.11.2" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3" +checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.110", + "syn 2.0.106", ] [[package]] From 06925c50245828243fb8210816731675c7cfef39 Mon Sep 17 00:00:00 2001 From: Connor McKenzie Date: Fri, 14 Nov 2025 15:29:10 +0000 Subject: [PATCH 29/33] Update helium-proto Cargo.lock --- Cargo.lock | 62 +++++++++++++++++++++++++++--------------------------- 1 file changed, 31 insertions(+), 31 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 418a93826..9feaa530c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1323,15 +1323,15 @@ name = "beacon" version = "0.1.0" source = "git+https://github.com/helium/proto?branch=master#60e0047b6e0e38b8119a055b37a7043cb02dbc82" dependencies = [ - "base64 0.21.7", + "base64 0.22.1", "byteorder", "helium-proto", "prost", - "rand 0.7.3", - "rand_chacha 0.2.2", + "rand 0.8.5", + "rand_chacha 0.3.1", "rust_decimal", "serde", - "sha2 0.9.9", + "sha2 0.10.9", "thiserror 1.0.69", ] @@ -1362,7 +1362,7 @@ dependencies = [ "bitflags 2.9.4", "cexpr", "clang-sys", - "itertools 0.10.5", + "itertools 0.12.1", "log", "prettyplease", "proc-macro2", @@ -2349,7 +2349,7 @@ dependencies = [ name = "denylist" version = "0.1.0" dependencies = [ - "base64 0.21.7", + "base64 0.22.1", "bincode", "bytes", "chrono", @@ -2722,7 +2722,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" dependencies = [ "libc", - "windows-sys 0.60.2", + "windows-sys 0.61.2", ] [[package]] @@ -2823,7 +2823,7 @@ dependencies = [ "aws-config", "aws-sdk-s3", "aws-smithy-types-convert", - "base64 0.21.7", + "base64 0.22.1", "bs58", "bytes", "chrono", @@ -2863,7 +2863,7 @@ version = "0.1.0" dependencies = [ "anyhow", "async-trait", - "base64 0.21.7", + "base64 0.22.1", "beacon", "blake3", "bs58", @@ -3451,7 +3451,7 @@ version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f3ae6081be123db88474f4c5f12f9b0d3d90b9f5ce15171dee64fe92e3cae2dd" dependencies = [ - "base64 0.21.7", + "base64 0.22.1", "bs58", "byteorder", "ed25519-compact", @@ -3478,7 +3478,7 @@ dependencies = [ "anchor-spl", "angry-purple-tiger", "async-trait", - "base64 0.21.7", + "base64 0.22.1", "bincode", "bytemuck", "chrono", @@ -3513,7 +3513,7 @@ dependencies = [ [[package]] name = "helium-proto" version = "0.1.0" -source = "git+https://github.com/helium/proto?branch=master#db80ad554e92bde5aaa37b8dce583a8787d1727b" +source = "git+https://github.com/helium/proto?branch=master#60e0047b6e0e38b8119a055b37a7043cb02dbc82" dependencies = [ "bytes", "prost", @@ -3856,7 +3856,7 @@ dependencies = [ "libc", "percent-encoding", "pin-project-lite", - "socket2 0.5.10", + "socket2 0.6.0", "tokio", "tower-service", "tracing", @@ -4072,7 +4072,7 @@ version = "0.1.0" dependencies = [ "anyhow", "backon 1.5.2", - "base64 0.21.7", + "base64 0.22.1", "bs58", "chrono", "clap", @@ -4154,7 +4154,7 @@ dependencies = [ "anyhow", "async-trait", "backon 0.5.0", - "base64 0.21.7", + "base64 0.22.1", "bs58", "chrono", "clap", @@ -4239,7 +4239,7 @@ version = "0.1.0" dependencies = [ "anyhow", "async-trait", - "base64 0.21.7", + "base64 0.22.1", "beacon", "blake3", "chrono", @@ -4593,7 +4593,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "07033963ba89ebaf1584d767badaa2e8fcec21aedea6b8c0346d487d49c28667" dependencies = [ "cfg-if", - "windows-targets 0.48.5", + "windows-targets 0.53.5", ] [[package]] @@ -4910,7 +4910,7 @@ version = "0.1.0" dependencies = [ "anyhow", "async-trait", - "base64 0.21.7", + "base64 0.22.1", "blake3", "bs58", "chrono", @@ -4966,7 +4966,7 @@ version = "0.1.0" dependencies = [ "angry-purple-tiger", "anyhow", - "base64 0.21.7", + "base64 0.22.1", "clap", "custom-tracing", "dialoguer", @@ -5034,7 +5034,7 @@ dependencies = [ "async-compression", "async-trait", "aws-local", - "base64 0.21.7", + "base64 0.22.1", "chrono", "clap", "config", @@ -5667,7 +5667,7 @@ name = "poc-entropy" version = "0.1.0" dependencies = [ "anyhow", - "base64 0.21.7", + "base64 0.22.1", "blake3", "bs58", "chrono", @@ -5923,7 +5923,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ac6c3320f9abac597dcbc668774ef006702672474aad53c6d596b62e487b40b1" dependencies = [ "heck 0.5.0", - "itertools 0.10.5", + "itertools 0.12.1", "log", "multimap", "once_cell", @@ -5945,7 +5945,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9120690fafc389a67ba3803df527d0ec9cbbc9cc45e4cc20b332996dfb672425" dependencies = [ "anyhow", - "itertools 0.10.5", + "itertools 0.12.1", "proc-macro2", "quote", "syn 2.0.106", @@ -6043,7 +6043,7 @@ dependencies = [ "quinn-udp", "rustc-hash 2.1.1", "rustls 0.23.32", - "socket2 0.5.10", + "socket2 0.6.0", "thiserror 2.0.17", "tokio", "tracing", @@ -6082,7 +6082,7 @@ dependencies = [ "cfg_aliases", "libc", "once_cell", - "socket2 0.5.10", + "socket2 0.6.0", "tracing", "windows-sys 0.60.2", ] @@ -6435,7 +6435,7 @@ version = "0.1.0" dependencies = [ "anyhow", "async-trait", - "base64 0.21.7", + "base64 0.22.1", "bs58", "chrono", "clap", @@ -6705,7 +6705,7 @@ dependencies = [ "errno", "libc", "linux-raw-sys", - "windows-sys 0.60.2", + "windows-sys 0.61.2", ] [[package]] @@ -10476,7 +10476,7 @@ dependencies = [ "getrandom 0.3.3", "once_cell", "rustix", - "windows-sys 0.60.2", + "windows-sys 0.61.2", ] [[package]] @@ -11108,7 +11108,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "97fee6b57c6a41524a810daee9286c02d7752c4253064d0b05472833a438f675" dependencies = [ "cfg-if", - "rand 0.7.3", + "rand 0.8.5", "static_assertions", ] @@ -11962,7 +11962,7 @@ version = "0.7.0" source = "git+https://github.com/helium/xorf-generator?branch=main#0d23ba2dcac2e2823d842566436df406f5ce923c" dependencies = [ "anyhow", - "base64 0.21.7", + "base64 0.22.1", "bincode", "bytes", "clap", @@ -11975,7 +11975,7 @@ dependencies = [ "rand 0.8.5", "serde", "serde_json", - "sha2 0.9.9", + "sha2 0.10.9", "thiserror 1.0.69", "twox-hash", "xorf", From c883981964054cafdcae7b6965ddd665040de67b Mon Sep 17 00:00:00 2001 From: Brian Balser Date: Fri, 14 Nov 2025 12:25:05 -0500 Subject: [PATCH 30/33] Attempt to cleanup runner --- .github/workflows/DockerCI.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.github/workflows/DockerCI.yml b/.github/workflows/DockerCI.yml index 6eaa57830..a0f52ea8a 100644 --- a/.github/workflows/DockerCI.yml +++ b/.github/workflows/DockerCI.yml @@ -18,6 +18,12 @@ jobs: outputs: image_tag: ${{ steps.out.outputs.tag }} steps: + - name: Cleanup Disk + run: | + sudo rm -rf /usr/share/dotnet + sudo rm -rf /opt/ghc + sudo rm -rf /user/local/share/boost + sudo rm -rf "$AGENT_TOOLSDIRECTORY" - name: Checkout Repository uses: actions/checkout@v4 - name: Create Tag From aabfe5620657e71c4a3bdd32aa78d171811d05b0 Mon Sep 17 00:00:00 2001 From: Brian Balser Date: Fri, 14 Nov 2025 12:34:00 -0500 Subject: [PATCH 31/33] another attempt --- .github/workflows/DockerCI.yml | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/.github/workflows/DockerCI.yml b/.github/workflows/DockerCI.yml index a0f52ea8a..95be0eed9 100644 --- a/.github/workflows/DockerCI.yml +++ b/.github/workflows/DockerCI.yml @@ -13,17 +13,21 @@ permissions: packages: write jobs: + cleanup: + runs-on: ubuntu-latest + steps: + - name: Check disk usage + run: df -h + - name: Removed unused Docker images + run: docker system prune -af + - name: Clean up temporary files + run: sudo rm -rf /tmp/* compute-base-build-tag: + needs: cleanup runs-on: ubuntu-latest outputs: image_tag: ${{ steps.out.outputs.tag }} steps: - - name: Cleanup Disk - run: | - sudo rm -rf /usr/share/dotnet - sudo rm -rf /opt/ghc - sudo rm -rf /user/local/share/boost - sudo rm -rf "$AGENT_TOOLSDIRECTORY" - name: Checkout Repository uses: actions/checkout@v4 - name: Create Tag From bc5041b905f3cb139d66cae114308dc46c4db408 Mon Sep 17 00:00:00 2001 From: Brian Balser Date: Fri, 14 Nov 2025 12:40:31 -0500 Subject: [PATCH 32/33] attempt free disk space action --- .github/workflows/DockerCI.yml | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/.github/workflows/DockerCI.yml b/.github/workflows/DockerCI.yml index 95be0eed9..1e93722f0 100644 --- a/.github/workflows/DockerCI.yml +++ b/.github/workflows/DockerCI.yml @@ -13,17 +13,21 @@ permissions: packages: write jobs: - cleanup: + free-disk-space: runs-on: ubuntu-latest steps: - - name: Check disk usage - run: df -h - - name: Removed unused Docker images - run: docker system prune -af - - name: Clean up temporary files - run: sudo rm -rf /tmp/* + - name: Free Disk Space + uses: jlumbroso/free-disk-space@main + with: + tool-cache: true + android: true + dotnet: true + haskell: true + large-packages: true + docker-images: true + swap-storage: true compute-base-build-tag: - needs: cleanup + needs: free-disk-space runs-on: ubuntu-latest outputs: image_tag: ${{ steps.out.outputs.tag }} From fc9eb7294da5f4830e74659bc30b47869fac7410 Mon Sep 17 00:00:00 2001 From: Brian Balser Date: Fri, 14 Nov 2025 13:04:09 -0500 Subject: [PATCH 33/33] Remove cleanup jobs --- .github/workflows/DockerCI.yml | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/.github/workflows/DockerCI.yml b/.github/workflows/DockerCI.yml index 1e93722f0..6eaa57830 100644 --- a/.github/workflows/DockerCI.yml +++ b/.github/workflows/DockerCI.yml @@ -13,21 +13,7 @@ permissions: packages: write jobs: - free-disk-space: - runs-on: ubuntu-latest - steps: - - name: Free Disk Space - uses: jlumbroso/free-disk-space@main - with: - tool-cache: true - android: true - dotnet: true - haskell: true - large-packages: true - docker-images: true - swap-storage: true compute-base-build-tag: - needs: free-disk-space runs-on: ubuntu-latest outputs: image_tag: ${{ steps.out.outputs.tag }}