|
4 | 4 | Result, |
5 | 5 | anyhow, |
6 | 6 | }, |
7 | | - ed25519_dalek::SecretKey, |
8 | 7 | futures_util::{ |
9 | 8 | SinkExt, |
10 | 9 | stream::{ |
@@ -54,14 +53,6 @@ pub struct Config { |
54 | 53 | pub publish_interval_duration: Duration, |
55 | 54 | } |
56 | 55 |
|
57 | | -#[derive(Clone, Deserialize)] |
58 | | -struct PublisherSecretKey(SecretKey); |
59 | | -impl std::fmt::Debug for PublisherSecretKey { |
60 | | - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { |
61 | | - write!(f, "PublisherSecretKey(redacted)") |
62 | | - } |
63 | | -} |
64 | | - |
65 | 56 | fn default_publish_interval() -> Duration { |
66 | 57 | Duration::from_millis(200) |
67 | 58 | } |
@@ -129,16 +120,27 @@ async fn connect_to_relayers( |
129 | 120 | #[derive(Deserialize)] |
130 | 121 | struct SymbolResponse { |
131 | 122 | pub pyth_lazer_id: u32, |
| 123 | + #[serde(rename = "name")] |
132 | 124 | pub _name: String, |
| 125 | + #[serde(rename = "symbol")] |
133 | 126 | pub _symbol: String, |
| 127 | + #[serde(rename = "description")] |
134 | 128 | pub _description: String, |
| 129 | + #[serde(rename = "asset_type")] |
135 | 130 | pub _asset_type: String, |
| 131 | + #[serde(rename = "exponent")] |
136 | 132 | pub _exponent: i16, |
| 133 | + #[serde(rename = "cmc_id")] |
137 | 134 | pub _cmc_id: Option<u32>, |
| 135 | + #[serde(rename = "interval")] |
138 | 136 | pub _interval: Option<String>, |
| 137 | + #[serde(rename = "min_publishers")] |
139 | 138 | pub _min_publishers: u16, |
| 139 | + #[serde(rename = "min_channel")] |
140 | 140 | pub _min_channel: String, |
| 141 | + #[serde(rename = "state")] |
141 | 142 | pub _state: String, |
| 143 | + #[serde(rename = "schedule")] |
142 | 144 | pub _schedule: String, |
143 | 145 | pub hermes_id: Option<String>, |
144 | 146 | } |
@@ -245,11 +247,20 @@ mod lazer_exporter { |
245 | 247 | S: Send + Sync + 'static, |
246 | 248 | { |
247 | 249 | // TODO: Re-fetch on an interval? |
248 | | - let lazer_symbols: HashMap<String, SymbolResponse> = |
| 250 | + let lazer_symbols: HashMap<pyth_sdk::Identifier, SymbolResponse> = |
249 | 251 | match fetch_symbols(&config.history_url).await { |
250 | 252 | Ok(symbols) => symbols |
251 | 253 | .into_iter() |
252 | | - .filter_map(|symbol| symbol.hermes_id.clone().map(|id| (id, symbol))) |
| 254 | + .filter_map(|symbol| { |
| 255 | + let hermes_id = symbol.hermes_id.clone()?; |
| 256 | + match pyth_sdk::Identifier::from_hex(hermes_id.clone()) { |
| 257 | + Ok(id) => Some((id, symbol)), |
| 258 | + Err(e) => { |
| 259 | + tracing::warn!("Failed to parse hermes_id {}: {e:?}", hermes_id); |
| 260 | + None |
| 261 | + } |
| 262 | + } |
| 263 | + }) |
253 | 264 | .collect(), |
254 | 265 | Err(e) => { |
255 | 266 | tracing::error!("Failed to fetch Lazer symbols: {e:?}"); |
@@ -296,7 +307,7 @@ mod lazer_exporter { |
296 | 307 |
|
297 | 308 | // TODO: This read locks and clones local::Store::prices, which may not meet performance needs. |
298 | 309 | for (identifier, price_info) in state.get_all_price_infos().await { |
299 | | - if let Some(symbol) = lazer_symbols.get(&identifier.to_string()) { |
| 310 | + if let Some(symbol) = lazer_symbols.get(&identifier) { |
300 | 311 | let source_timestamp_micros = price_info.timestamp.and_utc().timestamp_micros(); |
301 | 312 | let source_timestamp = MessageField::some(Timestamp { |
302 | 313 | seconds: source_timestamp_micros / 1_000_000, |
@@ -353,7 +364,6 @@ mod lazer_exporter { |
353 | 364 | tracing::error!("Error receiving message from at relayer {relayer_url}: {e:?}"); |
354 | 365 | } |
355 | 366 | None => { |
356 | | - // TODO: Probably still appropriate to return here, but retry in caller. |
357 | 367 | tracing::error!("relayer connection closed"); |
358 | 368 | bail!("relayer connection closed"); |
359 | 369 | } |
|
0 commit comments