|
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