From 0baf4bf9a8488e862660f0d9b555771f489b148c Mon Sep 17 00:00:00 2001 From: Charles Morin Date: Thu, 19 Sep 2024 12:54:59 -0400 Subject: [PATCH 01/10] Added proposer_schedule for active_schedule --- eosmechanics/Cargo.toml | 3 +-- eosmechanics/src/maps.rs | 10 ++++++++-- eosmechanics/substreams.yaml | 2 +- 3 files changed, 10 insertions(+), 5 deletions(-) diff --git a/eosmechanics/Cargo.toml b/eosmechanics/Cargo.toml index 38f66b0..64a0c89 100644 --- a/eosmechanics/Cargo.toml +++ b/eosmechanics/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "eosmechanics" -version = "0.3.6" +version = "0.3.7" authors = ["Denis ", "Fred ", "Charles "] description = "Block Producer Benchmarks" license = "MIT OR Apache-2.0" @@ -17,7 +17,6 @@ crate-type = ["cdylib"] prost = { workspace = true } prost-types = { workspace = true } substreams = { workspace = true } -# substreams-antelope = { workspace = true } substreams-antelope = "0.5" substreams-sink-kv = { workspace = true } substreams-sink-prometheus = { workspace = true } diff --git a/eosmechanics/src/maps.rs b/eosmechanics/src/maps.rs index 0ceaebe..f88268d 100644 --- a/eosmechanics/src/maps.rs +++ b/eosmechanics/src/maps.rs @@ -54,8 +54,14 @@ pub fn map_producer_usage(block: Block) -> Result { #[substreams::handlers::map] pub fn map_schedule_change(block: Block) -> Result { - let active_schedule: Vec = schedule_to_accounts(block.active_schedule_v2.as_ref().unwrap()); - let pending_schedule: Vec = schedule_to_accounts(block.pending_schedule.as_ref().unwrap().schedule_v2.as_ref().unwrap()); + let active_schedule: Vec = match block.proposer_policy.as_ref() { + Some(proposer_policy) => schedule_to_accounts(proposer_policy.proposer_schedule.as_ref().unwrap()), // New + None => schedule_to_accounts(block.active_schedule_v2.as_ref().unwrap()), // Old + }; + let pending_schedule: Vec = match block.pending_schedule.as_ref() { + Some(pending_schedule) => schedule_to_accounts(pending_schedule.schedule_v2.as_ref().unwrap()), // Old + None => vec![], // New ??? + }; // If there is no pending schedule, then there is no schedule change if pending_schedule.is_empty() { diff --git a/eosmechanics/substreams.yaml b/eosmechanics/substreams.yaml index dd30aab..50518a5 100644 --- a/eosmechanics/substreams.yaml +++ b/eosmechanics/substreams.yaml @@ -1,7 +1,7 @@ specVersion: v0.1.0 package: name: eosmechanics - version: v0.3.6 + version: v0.3.7 url: https://github.com/pinax-network/substreams doc: Block Producer Benchmarks From e60b3dcdc03bfaf39e1293d008bf570628cc89d0 Mon Sep 17 00:00:00 2001 From: YaroShkvorets Date: Fri, 20 Sep 2024 16:55:19 -0400 Subject: [PATCH 02/10] add skip_empty_output() --- eosmechanics/src/maps.rs | 6 +++++- eosmechanics/src/sinks.rs | 10 ++++------ 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/eosmechanics/src/maps.rs b/eosmechanics/src/maps.rs index f88268d..9a913b2 100644 --- a/eosmechanics/src/maps.rs +++ b/eosmechanics/src/maps.rs @@ -1,6 +1,6 @@ use std::collections::HashSet; -use substreams::errors::Error; +use substreams::{errors::Error, skip_empty_output}; use substreams_antelope::pb::{Block, ProducerAuthoritySchedule}; use crate::eosmechanics::{ProducerUsage, ScheduleChange}; @@ -29,6 +29,8 @@ use crate::eosmechanics::{ProducerUsage, ScheduleChange}; /// producer. #[substreams::handlers::map] pub fn map_producer_usage(block: Block) -> Result { + skip_empty_output(); + // Producer is found in the block header let producer = block.header.as_ref().unwrap().producer.clone(); @@ -54,6 +56,8 @@ pub fn map_producer_usage(block: Block) -> Result { #[substreams::handlers::map] pub fn map_schedule_change(block: Block) -> Result { + skip_empty_output(); + let active_schedule: Vec = match block.proposer_policy.as_ref() { Some(proposer_policy) => schedule_to_accounts(proposer_policy.proposer_schedule.as_ref().unwrap()), // New None => schedule_to_accounts(block.active_schedule_v2.as_ref().unwrap()), // Old diff --git a/eosmechanics/src/sinks.rs b/eosmechanics/src/sinks.rs index 0a92058..43fa27c 100644 --- a/eosmechanics/src/sinks.rs +++ b/eosmechanics/src/sinks.rs @@ -1,16 +1,14 @@ use std::collections::HashMap; -use substreams::errors::Error; use substreams::log; -use substreams_sink_prometheus::{PrometheusOperations, Counter, Gauge, Histogram, Summary}; +use substreams::{errors::Error, skip_empty_output}; +use substreams_sink_prometheus::{Counter, Gauge, Histogram, PrometheusOperations, Summary}; use crate::eosmechanics::{ProducerUsage, ScheduleChange}; #[substreams::handlers::map] -pub fn prom_out( - producer_usage: ProducerUsage, - schedule_change: ScheduleChange -) -> Result { +pub fn prom_out(producer_usage: ProducerUsage, schedule_change: ScheduleChange) -> Result { + skip_empty_output(); let mut prom_out = PrometheusOperations::default(); let producer = producer_usage.producer.clone(); From 9bda01a1361cd41387932d6424cd5960f71c9564 Mon Sep 17 00:00:00 2001 From: Charles Morin Date: Thu, 10 Oct 2024 10:25:54 -0400 Subject: [PATCH 03/10] eosmechanics: if new block format dont return on empty pending schedule --- eosmechanics/src/maps.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/eosmechanics/src/maps.rs b/eosmechanics/src/maps.rs index 9a913b2..8b1c56f 100644 --- a/eosmechanics/src/maps.rs +++ b/eosmechanics/src/maps.rs @@ -67,8 +67,8 @@ pub fn map_schedule_change(block: Block) -> Result { None => vec![], // New ??? }; - // If there is no pending schedule, then there is no schedule change - if pending_schedule.is_empty() { + // If there is no pending schedule and it's old block format, then there is no schedule change + if pending_schedule.is_empty() && block.proposer_policy.is_none() { return Ok(Default::default()); } From 9ae7aad406f8bbd964ac812ed9c67dc06e3b2875 Mon Sep 17 00:00:00 2001 From: Charles Morin Date: Thu, 10 Oct 2024 10:46:49 -0400 Subject: [PATCH 04/10] eosmechanics: added as_ref --- eosmechanics/src/maps.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/eosmechanics/src/maps.rs b/eosmechanics/src/maps.rs index 8b1c56f..03b17d1 100644 --- a/eosmechanics/src/maps.rs +++ b/eosmechanics/src/maps.rs @@ -1,6 +1,6 @@ use std::collections::HashSet; -use substreams::{errors::Error, skip_empty_output}; +use substreams::{errors::Error, log, skip_empty_output}; use substreams_antelope::pb::{Block, ProducerAuthoritySchedule}; use crate::eosmechanics::{ProducerUsage, ScheduleChange}; @@ -68,7 +68,7 @@ pub fn map_schedule_change(block: Block) -> Result { }; // If there is no pending schedule and it's old block format, then there is no schedule change - if pending_schedule.is_empty() && block.proposer_policy.is_none() { + if pending_schedule.is_empty() && block.proposer_policy.as_ref().is_none() { return Ok(Default::default()); } From c1e02970ddba292577ea32a6298209228b8435bc Mon Sep 17 00:00:00 2001 From: Charles Morin Date: Thu, 10 Oct 2024 10:47:33 -0400 Subject: [PATCH 05/10] eosmechanics: removed unused dep --- eosmechanics/src/maps.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/eosmechanics/src/maps.rs b/eosmechanics/src/maps.rs index 03b17d1..06261d4 100644 --- a/eosmechanics/src/maps.rs +++ b/eosmechanics/src/maps.rs @@ -1,6 +1,6 @@ use std::collections::HashSet; -use substreams::{errors::Error, log, skip_empty_output}; +use substreams::{errors::Error, skip_empty_output}; use substreams_antelope::pb::{Block, ProducerAuthoritySchedule}; use crate::eosmechanics::{ProducerUsage, ScheduleChange}; From e24e0b73ce018e8449816151eb2ae90bdf3d995a Mon Sep 17 00:00:00 2001 From: Charles Morin Date: Thu, 10 Oct 2024 10:56:30 -0400 Subject: [PATCH 06/10] eosmechanics: skips for loop if new block format --- eosmechanics/src/maps.rs | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/eosmechanics/src/maps.rs b/eosmechanics/src/maps.rs index 06261d4..ca7722d 100644 --- a/eosmechanics/src/maps.rs +++ b/eosmechanics/src/maps.rs @@ -67,8 +67,20 @@ pub fn map_schedule_change(block: Block) -> Result { None => vec![], // New ??? }; + // New block format + if !block.proposer_policy.as_ref().is_none() { + return Ok(ScheduleChange { + producer: block.header.as_ref().unwrap().producer.clone(), + schedule_version: block.header.as_ref().unwrap().schedule_version, + active_schedule, + pending_schedule, + add_to_schedule: Default::default(), + remove_from_schedule: Default::default(), + }); + } + // If there is no pending schedule and it's old block format, then there is no schedule change - if pending_schedule.is_empty() && block.proposer_policy.as_ref().is_none() { + if pending_schedule.is_empty() { return Ok(Default::default()); } From c030c599d02ecefc60d7425ab9939580d636f917 Mon Sep 17 00:00:00 2001 From: Charles Morin Date: Thu, 10 Oct 2024 11:30:49 -0400 Subject: [PATCH 07/10] eosmechanics: rolled back to return after loop --- eosmechanics/src/maps.rs | 16 +- gems.blend/src/abi/contract.rs | 150 +++++++++++++++++-- pomelo.bounties/src/abi/contract.rs | 224 +++++++++++++++++++++++++--- sx.stats/src/abi/contract.rs | 106 ++++++++++++- 4 files changed, 443 insertions(+), 53 deletions(-) diff --git a/eosmechanics/src/maps.rs b/eosmechanics/src/maps.rs index ca7722d..4ea33a1 100644 --- a/eosmechanics/src/maps.rs +++ b/eosmechanics/src/maps.rs @@ -64,23 +64,11 @@ pub fn map_schedule_change(block: Block) -> Result { }; let pending_schedule: Vec = match block.pending_schedule.as_ref() { Some(pending_schedule) => schedule_to_accounts(pending_schedule.schedule_v2.as_ref().unwrap()), // Old - None => vec![], // New ??? + None => vec![], // New }; - // New block format - if !block.proposer_policy.as_ref().is_none() { - return Ok(ScheduleChange { - producer: block.header.as_ref().unwrap().producer.clone(), - schedule_version: block.header.as_ref().unwrap().schedule_version, - active_schedule, - pending_schedule, - add_to_schedule: Default::default(), - remove_from_schedule: Default::default(), - }); - } - // If there is no pending schedule and it's old block format, then there is no schedule change - if pending_schedule.is_empty() { + if pending_schedule.is_empty() && block.proposer_policy.as_ref().is_none() { return Ok(Default::default()); } diff --git a/gems.blend/src/abi/contract.rs b/gems.blend/src/abi/contract.rs index 6f378ff..da94a6e 100644 --- a/gems.blend/src/abi/contract.rs +++ b/gems.blend/src/abi/contract.rs @@ -14,11 +14,23 @@ pub mod types { pub start_time: TimePointSec, pub end_time: TimePointSec, } + impl std::str::FromStr for BlendsRow { + type Err = substreams_antelope::Error; + fn from_str(value: &str) -> Result { + substreams_antelope::decoder::decode::(value) + } + } #[derive(Debug, Clone, PartialEq, serde::Deserialize)] #[serde(deny_unknown_fields)] pub struct CollectionsRow { pub collection_names: Vec, } + impl std::str::FromStr for CollectionsRow { + type Err = substreams_antelope::Error; + fn from_str(value: &str) -> Result { + substreams_antelope::decoder::decode::(value) + } + } #[derive(Debug, Clone, PartialEq, serde::Deserialize)] #[serde(deny_unknown_fields)] pub struct ConfigRow { @@ -26,6 +38,12 @@ pub mod types { pub protocol_fee: Uint16, pub fee_account: Name, } + impl std::str::FromStr for ConfigRow { + type Err = substreams_antelope::Error; + fn from_str(value: &str) -> Result { + substreams_antelope::decoder::decode::(value) + } + } #[derive(Debug, Clone, PartialEq, serde::Deserialize)] #[serde(deny_unknown_fields)] pub struct LimitsRow { @@ -35,12 +53,24 @@ pub mod types { #[serde(deserialize_with = "substreams_antelope::decoder::str_or_i64")] pub max_mint_assets: Int64, } + impl std::str::FromStr for LimitsRow { + type Err = substreams_antelope::Error; + fn from_str(value: &str) -> Result { + substreams_antelope::decoder::decode::(value) + } + } #[derive(Debug, Clone, PartialEq, serde::Deserialize)] #[serde(deny_unknown_fields)] pub struct Nft { pub collection_name: Name, pub template_id: Int32, } + impl std::str::FromStr for Nft { + type Err = substreams_antelope::Error; + fn from_str(value: &str) -> Result { + substreams_antelope::decoder::decode::(value) + } + } #[derive(Debug, Clone, PartialEq, serde::Deserialize)] #[serde(deny_unknown_fields)] pub struct NftExtra { @@ -48,12 +78,24 @@ pub mod types { pub template_id: Int32, pub schema_name: Name, } + impl std::str::FromStr for NftExtra { + type Err = substreams_antelope::Error; + fn from_str(value: &str) -> Result { + substreams_antelope::decoder::decode::(value) + } + } #[derive(Debug, Clone, PartialEq, serde::Deserialize)] #[serde(deny_unknown_fields)] pub struct OrdersRow { pub id: Nft, pub quantity: ExtendedAsset, } + impl std::str::FromStr for OrdersRow { + type Err = substreams_antelope::Error; + fn from_str(value: &str) -> Result { + substreams_antelope::decoder::decode::(value) + } + } #[derive(Debug, Clone, PartialEq, serde::Deserialize)] #[serde(deny_unknown_fields)] pub struct RecipesRow { @@ -61,12 +103,24 @@ pub mod types { pub id: Uint64, pub templates: Vec, } + impl std::str::FromStr for RecipesRow { + type Err = substreams_antelope::Error; + fn from_str(value: &str) -> Result { + substreams_antelope::decoder::decode::(value) + } + } #[derive(Debug, Clone, PartialEq, serde::Deserialize)] #[serde(deny_unknown_fields)] pub struct StatusRow { pub counters: Vec, pub last_updated: TimePointSec, } + impl std::str::FromStr for StatusRow { + type Err = substreams_antelope::Error; + fn from_str(value: &str) -> Result { + substreams_antelope::decoder::decode::(value) + } + } } pub mod actions { use substreams_antelope::types::*; @@ -80,12 +134,18 @@ pub mod actions { pub template_id: Int32, pub templates: Vec, } + impl std::str::FromStr for Addrecipe { + type Err = substreams_antelope::Error; + fn from_str(value: &str) -> Result { + substreams_antelope::decoder::decode::(value) + } + } impl substreams_antelope::Action for Addrecipe { const NAME: &'static str = "addrecipe"; fn decode( trace: &substreams_antelope::pb::ActionTrace, ) -> Result { - Ok(decode::(&trace.action.as_ref().unwrap().json_data)?) + decode::(&trace.action.as_ref().unwrap().json_data) } } #[derive(Debug, Clone, PartialEq, serde::Deserialize)] @@ -102,12 +162,18 @@ pub mod actions { pub total_mint: Int32, pub total_burn: Int32, } + impl std::str::FromStr for Blendlog { + type Err = substreams_antelope::Error; + fn from_str(value: &str) -> Result { + substreams_antelope::decoder::decode::(value) + } + } impl substreams_antelope::Action for Blendlog { const NAME: &'static str = "blendlog"; fn decode( trace: &substreams_antelope::pb::ActionTrace, ) -> Result { - Ok(decode::(&trace.action.as_ref().unwrap().json_data)?) + decode::(&trace.action.as_ref().unwrap().json_data) } } #[derive(Debug, Clone, PartialEq, serde::Deserialize)] @@ -116,12 +182,18 @@ pub mod actions { pub owner: Name, pub template_id: Int32, } + impl std::str::FromStr for Cancel { + type Err = substreams_antelope::Error; + fn from_str(value: &str) -> Result { + substreams_antelope::decoder::decode::(value) + } + } impl substreams_antelope::Action for Cancel { const NAME: &'static str = "cancel"; fn decode( trace: &substreams_antelope::pb::ActionTrace, ) -> Result { - Ok(decode::(&trace.action.as_ref().unwrap().json_data)?) + decode::(&trace.action.as_ref().unwrap().json_data) } } #[derive(Debug, Clone, PartialEq, serde::Deserialize)] @@ -130,12 +202,18 @@ pub mod actions { pub collection_name: Name, pub template_id: Int32, } + impl std::str::FromStr for Delblend { + type Err = substreams_antelope::Error; + fn from_str(value: &str) -> Result { + substreams_antelope::decoder::decode::(value) + } + } impl substreams_antelope::Action for Delblend { const NAME: &'static str = "delblend"; fn decode( trace: &substreams_antelope::pb::ActionTrace, ) -> Result { - Ok(decode::(&trace.action.as_ref().unwrap().json_data)?) + decode::(&trace.action.as_ref().unwrap().json_data) } } #[derive(Debug, Clone, PartialEq, serde::Deserialize)] @@ -144,12 +222,18 @@ pub mod actions { pub collection_name: Name, pub template_id: Int32, } + impl std::str::FromStr for Dellimit { + type Err = substreams_antelope::Error; + fn from_str(value: &str) -> Result { + substreams_antelope::decoder::decode::(value) + } + } impl substreams_antelope::Action for Dellimit { const NAME: &'static str = "dellimit"; fn decode( trace: &substreams_antelope::pb::ActionTrace, ) -> Result { - Ok(decode::(&trace.action.as_ref().unwrap().json_data)?) + decode::(&trace.action.as_ref().unwrap().json_data) } } #[derive(Debug, Clone, PartialEq, serde::Deserialize)] @@ -160,12 +244,18 @@ pub mod actions { #[serde(deserialize_with = "substreams_antelope::decoder::str_or_u64")] pub recipe_id: Uint64, } + impl std::str::FromStr for Delrecipe { + type Err = substreams_antelope::Error; + fn from_str(value: &str) -> Result { + substreams_antelope::decoder::decode::(value) + } + } impl substreams_antelope::Action for Delrecipe { const NAME: &'static str = "delrecipe"; fn decode( trace: &substreams_antelope::pb::ActionTrace, ) -> Result { - Ok(decode::(&trace.action.as_ref().unwrap().json_data)?) + decode::(&trace.action.as_ref().unwrap().json_data) } } #[derive(Debug, Clone, PartialEq, serde::Deserialize)] @@ -174,12 +264,18 @@ pub mod actions { pub table: Name, pub scope: Name, } + impl std::str::FromStr for Reset { + type Err = substreams_antelope::Error; + fn from_str(value: &str) -> Result { + substreams_antelope::decoder::decode::(value) + } + } impl substreams_antelope::Action for Reset { const NAME: &'static str = "reset"; fn decode( trace: &substreams_antelope::pb::ActionTrace, ) -> Result { - Ok(decode::(&trace.action.as_ref().unwrap().json_data)?) + decode::(&trace.action.as_ref().unwrap().json_data) } } #[derive(Debug, Clone, PartialEq, serde::Deserialize)] @@ -193,12 +289,18 @@ pub mod actions { pub start_time: TimePointSec, pub end_time: TimePointSec, } + impl std::str::FromStr for Setblend { + type Err = substreams_antelope::Error; + fn from_str(value: &str) -> Result { + substreams_antelope::decoder::decode::(value) + } + } impl substreams_antelope::Action for Setblend { const NAME: &'static str = "setblend"; fn decode( trace: &substreams_antelope::pb::ActionTrace, ) -> Result { - Ok(decode::(&trace.action.as_ref().unwrap().json_data)?) + decode::(&trace.action.as_ref().unwrap().json_data) } } #[derive(Debug, Clone, PartialEq, serde::Deserialize)] @@ -207,12 +309,18 @@ pub mod actions { pub protocol_fee: Uint16, pub fee_account: Name, } + impl std::str::FromStr for Setfee { + type Err = substreams_antelope::Error; + fn from_str(value: &str) -> Result { + substreams_antelope::decoder::decode::(value) + } + } impl substreams_antelope::Action for Setfee { const NAME: &'static str = "setfee"; fn decode( trace: &substreams_antelope::pb::ActionTrace, ) -> Result { - Ok(decode::(&trace.action.as_ref().unwrap().json_data)?) + decode::(&trace.action.as_ref().unwrap().json_data) } } #[derive(Debug, Clone, PartialEq, serde::Deserialize)] @@ -223,12 +331,18 @@ pub mod actions { #[serde(deserialize_with = "substreams_antelope::decoder::str_or_i64")] pub max_mint_assets: Int64, } + impl std::str::FromStr for Setlimit { + type Err = substreams_antelope::Error; + fn from_str(value: &str) -> Result { + substreams_antelope::decoder::decode::(value) + } + } impl substreams_antelope::Action for Setlimit { const NAME: &'static str = "setlimit"; fn decode( trace: &substreams_antelope::pb::ActionTrace, ) -> Result { - Ok(decode::(&trace.action.as_ref().unwrap().json_data)?) + decode::(&trace.action.as_ref().unwrap().json_data) } } #[derive(Debug, Clone, PartialEq, serde::Deserialize)] @@ -239,12 +353,18 @@ pub mod actions { #[serde(deserialize_with = "substreams_antelope::decoder::vec_str_or_u64")] pub recipe_ids: Vec, } + impl std::str::FromStr for Setrecipes { + type Err = substreams_antelope::Error; + fn from_str(value: &str) -> Result { + substreams_antelope::decoder::decode::(value) + } + } impl substreams_antelope::Action for Setrecipes { const NAME: &'static str = "setrecipes"; fn decode( trace: &substreams_antelope::pb::ActionTrace, ) -> Result { - Ok(decode::(&trace.action.as_ref().unwrap().json_data)?) + decode::(&trace.action.as_ref().unwrap().json_data) } } #[derive(Debug, Clone, PartialEq, serde::Deserialize)] @@ -252,12 +372,18 @@ pub mod actions { pub struct Setstatus { pub status: Name, } + impl std::str::FromStr for Setstatus { + type Err = substreams_antelope::Error; + fn from_str(value: &str) -> Result { + substreams_antelope::decoder::decode::(value) + } + } impl substreams_antelope::Action for Setstatus { const NAME: &'static str = "setstatus"; fn decode( trace: &substreams_antelope::pb::ActionTrace, ) -> Result { - Ok(decode::(&trace.action.as_ref().unwrap().json_data)?) + decode::(&trace.action.as_ref().unwrap().json_data) } } } \ No newline at end of file diff --git a/pomelo.bounties/src/abi/contract.rs b/pomelo.bounties/src/abi/contract.rs index fe132a6..26392b5 100644 --- a/pomelo.bounties/src/abi/contract.rs +++ b/pomelo.bounties/src/abi/contract.rs @@ -23,6 +23,12 @@ pub mod types { pub submitted_at: TimePointSec, pub completed_at: TimePointSec, } + impl std::str::FromStr for BountiesRow { + type Err = substreams_antelope::Error; + fn from_str(value: &str) -> Result { + substreams_antelope::decoder::decode::(value) + } + } #[derive(Debug, Clone, PartialEq, serde::Deserialize)] #[serde(deny_unknown_fields)] pub struct ConfigsRow { @@ -33,30 +39,60 @@ pub mod types { pub fee_account: Name, pub metadata_keys: Vec, } + impl std::str::FromStr for ConfigsRow { + type Err = substreams_antelope::Error; + fn from_str(value: &str) -> Result { + substreams_antelope::decoder::decode::(value) + } + } #[derive(Debug, Clone, PartialEq, serde::Deserialize)] #[serde(deny_unknown_fields)] pub struct ExtendedSymbol { pub sym: Symbol, pub contract: Name, } + impl std::str::FromStr for ExtendedSymbol { + type Err = substreams_antelope::Error; + fn from_str(value: &str) -> Result { + substreams_antelope::decoder::decode::(value) + } + } #[derive(Debug, Clone, PartialEq, serde::Deserialize)] #[serde(deny_unknown_fields)] pub struct PairNameAsset { pub first: Name, pub second: Asset, } + impl std::str::FromStr for PairNameAsset { + type Err = substreams_antelope::Error; + fn from_str(value: &str) -> Result { + substreams_antelope::decoder::decode::(value) + } + } #[derive(Debug, Clone, PartialEq, serde::Deserialize)] #[serde(deny_unknown_fields)] pub struct PairNameString { pub first: Name, pub second: String, } + impl std::str::FromStr for PairNameString { + type Err = substreams_antelope::Error; + fn from_str(value: &str) -> Result { + substreams_antelope::decoder::decode::(value) + } + } #[derive(Debug, Clone, PartialEq, serde::Deserialize)] #[serde(deny_unknown_fields)] pub struct StatusRow { pub counters: Vec, pub last_updated: TimePointSec, } + impl std::str::FromStr for StatusRow { + type Err = substreams_antelope::Error; + fn from_str(value: &str) -> Result { + substreams_antelope::decoder::decode::(value) + } + } #[derive(Debug, Clone, PartialEq, serde::Deserialize)] #[serde(deny_unknown_fields)] pub struct TokensRow { @@ -67,6 +103,12 @@ pub mod types { #[serde(deserialize_with = "substreams_antelope::decoder::str_or_u64")] pub oracle_id: Uint64, } + impl std::str::FromStr for TokensRow { + type Err = substreams_antelope::Error; + fn from_str(value: &str) -> Result { + substreams_antelope::decoder::decode::(value) + } + } #[derive(Debug, Clone, PartialEq, serde::Deserialize)] #[serde(deny_unknown_fields)] pub struct TransfersRow { @@ -83,6 +125,12 @@ pub mod types { pub trx_id: Checksum256, pub created_at: TimePointSec, } + impl std::str::FromStr for TransfersRow { + type Err = substreams_antelope::Error; + fn from_str(value: &str) -> Result { + substreams_antelope::decoder::decode::(value) + } + } } pub mod actions { use substreams_antelope::types::*; @@ -95,12 +143,18 @@ pub mod actions { pub bounty_id: Name, pub user_id: Name, } + impl std::str::FromStr for Apply { + type Err = substreams_antelope::Error; + fn from_str(value: &str) -> Result { + substreams_antelope::decoder::decode::(value) + } + } impl substreams_antelope::Action for Apply { const NAME: &'static str = "apply"; fn decode( trace: &substreams_antelope::pb::ActionTrace, ) -> Result { - Ok(decode::(&trace.action.as_ref().unwrap().json_data)?) + decode::(&trace.action.as_ref().unwrap().json_data) } } #[derive(Debug, Clone, PartialEq, serde::Deserialize)] @@ -109,12 +163,18 @@ pub mod actions { pub bounty_id: Name, pub applicant_user_id: Name, } + impl std::str::FromStr for Approve { + type Err = substreams_antelope::Error; + fn from_str(value: &str) -> Result { + substreams_antelope::decoder::decode::(value) + } + } impl substreams_antelope::Action for Approve { const NAME: &'static str = "approve"; fn decode( trace: &substreams_antelope::pb::ActionTrace, ) -> Result { - Ok(decode::(&trace.action.as_ref().unwrap().json_data)?) + decode::(&trace.action.as_ref().unwrap().json_data) } } #[derive(Debug, Clone, PartialEq, serde::Deserialize)] @@ -123,12 +183,18 @@ pub mod actions { pub bounty_id: Name, pub receiver: Name, } + impl std::str::FromStr for Claim { + type Err = substreams_antelope::Error; + fn from_str(value: &str) -> Result { + substreams_antelope::decoder::decode::(value) + } + } impl substreams_antelope::Action for Claim { const NAME: &'static str = "claim"; fn decode( trace: &substreams_antelope::pb::ActionTrace, ) -> Result { - Ok(decode::(&trace.action.as_ref().unwrap().json_data)?) + decode::(&trace.action.as_ref().unwrap().json_data) } } #[derive(Debug, Clone, PartialEq, serde::Deserialize)] @@ -142,12 +208,18 @@ pub mod actions { pub worker_user_id: Name, pub days_since_created: Uint32, } + impl std::str::FromStr for Claimlog { + type Err = substreams_antelope::Error; + fn from_str(value: &str) -> Result { + substreams_antelope::decoder::decode::(value) + } + } impl substreams_antelope::Action for Claimlog { const NAME: &'static str = "claimlog"; fn decode( trace: &substreams_antelope::pb::ActionTrace, ) -> Result { - Ok(decode::(&trace.action.as_ref().unwrap().json_data)?) + decode::(&trace.action.as_ref().unwrap().json_data) } } #[derive(Debug, Clone, PartialEq, serde::Deserialize)] @@ -155,12 +227,18 @@ pub mod actions { pub struct Close { pub bounty_id: Name, } + impl std::str::FromStr for Close { + type Err = substreams_antelope::Error; + fn from_str(value: &str) -> Result { + substreams_antelope::decoder::decode::(value) + } + } impl substreams_antelope::Action for Close { const NAME: &'static str = "close"; fn decode( trace: &substreams_antelope::pb::ActionTrace, ) -> Result { - Ok(decode::(&trace.action.as_ref().unwrap().json_data)?) + decode::(&trace.action.as_ref().unwrap().json_data) } } #[derive(Debug, Clone, PartialEq, serde::Deserialize)] @@ -168,12 +246,18 @@ pub mod actions { pub struct Complete { pub bounty_id: Name, } + impl std::str::FromStr for Complete { + type Err = substreams_antelope::Error; + fn from_str(value: &str) -> Result { + substreams_antelope::decoder::decode::(value) + } + } impl substreams_antelope::Action for Complete { const NAME: &'static str = "complete"; fn decode( trace: &substreams_antelope::pb::ActionTrace, ) -> Result { - Ok(decode::(&trace.action.as_ref().unwrap().json_data)?) + decode::(&trace.action.as_ref().unwrap().json_data) } } #[derive(Debug, Clone, PartialEq, serde::Deserialize)] @@ -184,12 +268,18 @@ pub mod actions { pub accepted_token: SymbolCode, pub bounty_type: Name, } + impl std::str::FromStr for Create { + type Err = substreams_antelope::Error; + fn from_str(value: &str) -> Result { + substreams_antelope::decoder::decode::(value) + } + } impl substreams_antelope::Action for Create { const NAME: &'static str = "create"; fn decode( trace: &substreams_antelope::pb::ActionTrace, ) -> Result { - Ok(decode::(&trace.action.as_ref().unwrap().json_data)?) + decode::(&trace.action.as_ref().unwrap().json_data) } } #[derive(Debug, Clone, PartialEq, serde::Deserialize)] @@ -202,12 +292,18 @@ pub mod actions { pub type_: Name, pub permissions: Name, } + impl std::str::FromStr for Createlog { + type Err = substreams_antelope::Error; + fn from_str(value: &str) -> Result { + substreams_antelope::decoder::decode::(value) + } + } impl substreams_antelope::Action for Createlog { const NAME: &'static str = "createlog"; fn decode( trace: &substreams_antelope::pb::ActionTrace, ) -> Result { - Ok(decode::(&trace.action.as_ref().unwrap().json_data)?) + decode::(&trace.action.as_ref().unwrap().json_data) } } #[derive(Debug, Clone, PartialEq, serde::Deserialize)] @@ -215,12 +311,18 @@ pub mod actions { pub struct Deltoken { pub symcode: SymbolCode, } + impl std::str::FromStr for Deltoken { + type Err = substreams_antelope::Error; + fn from_str(value: &str) -> Result { + substreams_antelope::decoder::decode::(value) + } + } impl substreams_antelope::Action for Deltoken { const NAME: &'static str = "deltoken"; fn decode( trace: &substreams_antelope::pb::ActionTrace, ) -> Result { - Ok(decode::(&trace.action.as_ref().unwrap().json_data)?) + decode::(&trace.action.as_ref().unwrap().json_data) } } #[derive(Debug, Clone, PartialEq, serde::Deserialize)] @@ -228,12 +330,18 @@ pub mod actions { pub struct Deny { pub bounty_id: Name, } + impl std::str::FromStr for Deny { + type Err = substreams_antelope::Error; + fn from_str(value: &str) -> Result { + substreams_antelope::decoder::decode::(value) + } + } impl substreams_antelope::Action for Deny { const NAME: &'static str = "deny"; fn decode( trace: &substreams_antelope::pb::ActionTrace, ) -> Result { - Ok(decode::(&trace.action.as_ref().unwrap().json_data)?) + decode::(&trace.action.as_ref().unwrap().json_data) } } #[derive(Debug, Clone, PartialEq, serde::Deserialize)] @@ -247,12 +355,18 @@ pub mod actions { pub value: Float64, pub memo: String, } + impl std::str::FromStr for Depositlog { + type Err = substreams_antelope::Error; + fn from_str(value: &str) -> Result { + substreams_antelope::decoder::decode::(value) + } + } impl substreams_antelope::Action for Depositlog { const NAME: &'static str = "depositlog"; fn decode( trace: &substreams_antelope::pb::ActionTrace, ) -> Result { - Ok(decode::(&trace.action.as_ref().unwrap().json_data)?) + decode::(&trace.action.as_ref().unwrap().json_data) } } #[derive(Debug, Clone, PartialEq, serde::Deserialize)] @@ -260,12 +374,18 @@ pub mod actions { pub struct Forfeit { pub bounty_id: Name, } + impl std::str::FromStr for Forfeit { + type Err = substreams_antelope::Error; + fn from_str(value: &str) -> Result { + substreams_antelope::decoder::decode::(value) + } + } impl substreams_antelope::Action for Forfeit { const NAME: &'static str = "forfeit"; fn decode( trace: &substreams_antelope::pb::ActionTrace, ) -> Result { - Ok(decode::(&trace.action.as_ref().unwrap().json_data)?) + decode::(&trace.action.as_ref().unwrap().json_data) } } #[derive(Debug, Clone, PartialEq, serde::Deserialize)] @@ -273,12 +393,18 @@ pub mod actions { pub struct Publish { pub bounty_id: Name, } + impl std::str::FromStr for Publish { + type Err = substreams_antelope::Error; + fn from_str(value: &str) -> Result { + substreams_antelope::decoder::decode::(value) + } + } impl substreams_antelope::Action for Publish { const NAME: &'static str = "publish"; fn decode( trace: &substreams_antelope::pb::ActionTrace, ) -> Result { - Ok(decode::(&trace.action.as_ref().unwrap().json_data)?) + decode::(&trace.action.as_ref().unwrap().json_data) } } #[derive(Debug, Clone, PartialEq, serde::Deserialize)] @@ -286,12 +412,18 @@ pub mod actions { pub struct Release { pub bounty_id: Name, } + impl std::str::FromStr for Release { + type Err = substreams_antelope::Error; + fn from_str(value: &str) -> Result { + substreams_antelope::decoder::decode::(value) + } + } impl substreams_antelope::Action for Release { const NAME: &'static str = "release"; fn decode( trace: &substreams_antelope::pb::ActionTrace, ) -> Result { - Ok(decode::(&trace.action.as_ref().unwrap().json_data)?) + decode::(&trace.action.as_ref().unwrap().json_data) } } #[derive(Debug, Clone, PartialEq, serde::Deserialize)] @@ -304,12 +436,18 @@ pub mod actions { pub fee_account: Name, pub metadata_keys: Vec, } + impl std::str::FromStr for Setconfig { + type Err = substreams_antelope::Error; + fn from_str(value: &str) -> Result { + substreams_antelope::decoder::decode::(value) + } + } impl substreams_antelope::Action for Setconfig { const NAME: &'static str = "setconfig"; fn decode( trace: &substreams_antelope::pb::ActionTrace, ) -> Result { - Ok(decode::(&trace.action.as_ref().unwrap().json_data)?) + decode::(&trace.action.as_ref().unwrap().json_data) } } #[derive(Debug, Clone, PartialEq, serde::Deserialize)] @@ -319,12 +457,18 @@ pub mod actions { pub metadata_key: Name, pub metadata_value: String, } + impl std::str::FromStr for Setmetadata { + type Err = substreams_antelope::Error; + fn from_str(value: &str) -> Result { + substreams_antelope::decoder::decode::(value) + } + } impl substreams_antelope::Action for Setmetadata { const NAME: &'static str = "setmetadata"; fn decode( trace: &substreams_antelope::pb::ActionTrace, ) -> Result { - Ok(decode::(&trace.action.as_ref().unwrap().json_data)?) + decode::(&trace.action.as_ref().unwrap().json_data) } } #[derive(Debug, Clone, PartialEq, serde::Deserialize)] @@ -333,12 +477,18 @@ pub mod actions { pub bounty_id: Name, pub state: Name, } + impl std::str::FromStr for Setstate { + type Err = substreams_antelope::Error; + fn from_str(value: &str) -> Result { + substreams_antelope::decoder::decode::(value) + } + } impl substreams_antelope::Action for Setstate { const NAME: &'static str = "setstate"; fn decode( trace: &substreams_antelope::pb::ActionTrace, ) -> Result { - Ok(decode::(&trace.action.as_ref().unwrap().json_data)?) + decode::(&trace.action.as_ref().unwrap().json_data) } } #[derive(Debug, Clone, PartialEq, serde::Deserialize)] @@ -348,12 +498,18 @@ pub mod actions { pub status: Name, pub action: Name, } + impl std::str::FromStr for Statelog { + type Err = substreams_antelope::Error; + fn from_str(value: &str) -> Result { + substreams_antelope::decoder::decode::(value) + } + } impl substreams_antelope::Action for Statelog { const NAME: &'static str = "statelog"; fn decode( trace: &substreams_antelope::pb::ActionTrace, ) -> Result { - Ok(decode::(&trace.action.as_ref().unwrap().json_data)?) + decode::(&trace.action.as_ref().unwrap().json_data) } } #[derive(Debug, Clone, PartialEq, serde::Deserialize)] @@ -367,12 +523,18 @@ pub mod actions { pub submitted_at: TimePointSec, pub completed_at: TimePointSec, } + impl std::str::FromStr for Syncbounty { + type Err = substreams_antelope::Error; + fn from_str(value: &str) -> Result { + substreams_antelope::decoder::decode::(value) + } + } impl substreams_antelope::Action for Syncbounty { const NAME: &'static str = "syncbounty"; fn decode( trace: &substreams_antelope::pb::ActionTrace, ) -> Result { - Ok(decode::(&trace.action.as_ref().unwrap().json_data)?) + decode::(&trace.action.as_ref().unwrap().json_data) } } #[derive(Debug, Clone, PartialEq, serde::Deserialize)] @@ -385,12 +547,18 @@ pub mod actions { #[serde(deserialize_with = "substreams_antelope::decoder::str_or_u64")] pub oracle_id: Uint64, } + impl std::str::FromStr for Token { + type Err = substreams_antelope::Error; + fn from_str(value: &str) -> Result { + substreams_antelope::decoder::decode::(value) + } + } impl substreams_antelope::Action for Token { const NAME: &'static str = "token"; fn decode( trace: &substreams_antelope::pb::ActionTrace, ) -> Result { - Ok(decode::(&trace.action.as_ref().unwrap().json_data)?) + decode::(&trace.action.as_ref().unwrap().json_data) } } #[derive(Debug, Clone, PartialEq, serde::Deserialize)] @@ -399,12 +567,18 @@ pub mod actions { pub bounty_id: Name, pub receiver: Name, } + impl std::str::FromStr for Withdraw { + type Err = substreams_antelope::Error; + fn from_str(value: &str) -> Result { + substreams_antelope::decoder::decode::(value) + } + } impl substreams_antelope::Action for Withdraw { const NAME: &'static str = "withdraw"; fn decode( trace: &substreams_antelope::pb::ActionTrace, ) -> Result { - Ok(decode::(&trace.action.as_ref().unwrap().json_data)?) + decode::(&trace.action.as_ref().unwrap().json_data) } } #[derive(Debug, Clone, PartialEq, serde::Deserialize)] @@ -416,12 +590,18 @@ pub mod actions { pub receiver: Name, pub refund: ExtendedAsset, } + impl std::str::FromStr for Withdrawlog { + type Err = substreams_antelope::Error; + fn from_str(value: &str) -> Result { + substreams_antelope::decoder::decode::(value) + } + } impl substreams_antelope::Action for Withdrawlog { const NAME: &'static str = "withdrawlog"; fn decode( trace: &substreams_antelope::pb::ActionTrace, ) -> Result { - Ok(decode::(&trace.action.as_ref().unwrap().json_data)?) + decode::(&trace.action.as_ref().unwrap().json_data) } } } \ No newline at end of file diff --git a/sx.stats/src/abi/contract.rs b/sx.stats/src/abi/contract.rs index 619755b..4dfc218 100644 --- a/sx.stats/src/abi/contract.rs +++ b/sx.stats/src/abi/contract.rs @@ -13,6 +13,12 @@ pub mod types { pub fees: Vec, pub reserves: Vec, } + impl std::str::FromStr for FlashRow { + type Err = substreams_antelope::Error; + fn from_str(value: &str) -> Result { + substreams_antelope::decoder::decode::(value) + } + } #[derive(Debug, Clone, PartialEq, serde::Deserialize)] #[serde(deny_unknown_fields)] pub struct GatewayRow { @@ -26,6 +32,12 @@ pub mod types { pub savings: Vec, pub fees: Vec, } + impl std::str::FromStr for GatewayRow { + type Err = substreams_antelope::Error; + fn from_str(value: &str) -> Result { + substreams_antelope::decoder::decode::(value) + } + } #[derive(Debug, Clone, PartialEq, serde::Deserialize)] #[serde(deny_unknown_fields)] pub struct PairNameUint64 { @@ -33,24 +45,48 @@ pub mod types { #[serde(deserialize_with = "substreams_antelope::decoder::str_or_u64")] pub value: Uint64, } + impl std::str::FromStr for PairNameUint64 { + type Err = substreams_antelope::Error; + fn from_str(value: &str) -> Result { + substreams_antelope::decoder::decode::(value) + } + } #[derive(Debug, Clone, PartialEq, serde::Deserialize)] #[serde(deny_unknown_fields)] pub struct PairSymbolCodeAsset { pub key: SymbolCode, pub value: Asset, } + impl std::str::FromStr for PairSymbolCodeAsset { + type Err = substreams_antelope::Error; + fn from_str(value: &str) -> Result { + substreams_antelope::decoder::decode::(value) + } + } #[derive(Debug, Clone, PartialEq, serde::Deserialize)] #[serde(deny_unknown_fields)] pub struct PairSymbolCodeFloat64 { pub key: SymbolCode, pub value: Float64, } + impl std::str::FromStr for PairSymbolCodeFloat64 { + type Err = substreams_antelope::Error; + fn from_str(value: &str) -> Result { + substreams_antelope::decoder::decode::(value) + } + } #[derive(Debug, Clone, PartialEq, serde::Deserialize)] #[serde(deny_unknown_fields)] pub struct PairSymbolCodePairUint64Asset { pub key: SymbolCode, pub value: PairUint64Asset, } + impl std::str::FromStr for PairSymbolCodePairUint64Asset { + type Err = substreams_antelope::Error; + fn from_str(value: &str) -> Result { + substreams_antelope::decoder::decode::(value) + } + } #[derive(Debug, Clone, PartialEq, serde::Deserialize)] #[serde(deny_unknown_fields)] pub struct PairSymbolCodeUint64 { @@ -58,6 +94,12 @@ pub mod types { #[serde(deserialize_with = "substreams_antelope::decoder::str_or_u64")] pub value: Uint64, } + impl std::str::FromStr for PairSymbolCodeUint64 { + type Err = substreams_antelope::Error; + fn from_str(value: &str) -> Result { + substreams_antelope::decoder::decode::(value) + } + } #[derive(Debug, Clone, PartialEq, serde::Deserialize)] #[serde(deny_unknown_fields)] pub struct PairUint64Asset { @@ -65,6 +107,12 @@ pub mod types { pub first: Uint64, pub second: Asset, } + impl std::str::FromStr for PairUint64Asset { + type Err = substreams_antelope::Error; + fn from_str(value: &str) -> Result { + substreams_antelope::decoder::decode::(value) + } + } #[derive(Debug, Clone, PartialEq, serde::Deserialize)] #[serde(deny_unknown_fields)] pub struct SpotpricesRow { @@ -73,6 +121,12 @@ pub mod types { pub base: SymbolCode, pub quotes: Vec, } + impl std::str::FromStr for SpotpricesRow { + type Err = substreams_antelope::Error; + fn from_str(value: &str) -> Result { + substreams_antelope::decoder::decode::(value) + } + } #[derive(Debug, Clone, PartialEq, serde::Deserialize)] #[serde(deny_unknown_fields)] pub struct TradesRow { @@ -87,6 +141,12 @@ pub mod types { pub executors: Vec, pub profits: Vec, } + impl std::str::FromStr for TradesRow { + type Err = substreams_antelope::Error; + fn from_str(value: &str) -> Result { + substreams_antelope::decoder::decode::(value) + } + } #[derive(Debug, Clone, PartialEq, serde::Deserialize)] #[serde(deny_unknown_fields)] pub struct VolumeRow { @@ -97,6 +157,12 @@ pub mod types { pub volume: Vec, pub fees: Vec, } + impl std::str::FromStr for VolumeRow { + type Err = substreams_antelope::Error; + fn from_str(value: &str) -> Result { + substreams_antelope::decoder::decode::(value) + } + } } pub mod actions { use substreams_antelope::types::*; @@ -108,12 +174,18 @@ pub mod actions { pub struct Clean { pub contract: Name, } + impl std::str::FromStr for Clean { + type Err = substreams_antelope::Error; + fn from_str(value: &str) -> Result { + substreams_antelope::decoder::decode::(value) + } + } impl substreams_antelope::Action for Clean { const NAME: &'static str = "clean"; fn decode( trace: &substreams_antelope::pb::ActionTrace, ) -> Result { - Ok(decode::(&trace.action.as_ref().unwrap().json_data)?) + decode::(&trace.action.as_ref().unwrap().json_data) } } #[derive(Debug, Clone, PartialEq, serde::Deserialize)] @@ -121,12 +193,18 @@ pub mod actions { pub struct Erase { pub contract: Name, } + impl std::str::FromStr for Erase { + type Err = substreams_antelope::Error; + fn from_str(value: &str) -> Result { + substreams_antelope::decoder::decode::(value) + } + } impl substreams_antelope::Action for Erase { const NAME: &'static str = "erase"; fn decode( trace: &substreams_antelope::pb::ActionTrace, ) -> Result { - Ok(decode::(&trace.action.as_ref().unwrap().json_data)?) + decode::(&trace.action.as_ref().unwrap().json_data) } } #[derive(Debug, Clone, PartialEq, serde::Deserialize)] @@ -140,12 +218,18 @@ pub mod actions { pub savings: Asset, pub fee: Asset, } + impl std::str::FromStr for Gatewaylog { + type Err = substreams_antelope::Error; + fn from_str(value: &str) -> Result { + substreams_antelope::decoder::decode::(value) + } + } impl substreams_antelope::Action for Gatewaylog { const NAME: &'static str = "gatewaylog"; fn decode( trace: &substreams_antelope::pb::ActionTrace, ) -> Result { - Ok(decode::(&trace.action.as_ref().unwrap().json_data)?) + decode::(&trace.action.as_ref().unwrap().json_data) } } #[derive(Debug, Clone, PartialEq, serde::Deserialize)] @@ -157,12 +241,18 @@ pub mod actions { pub amount_out: Asset, pub fee: Asset, } + impl std::str::FromStr for Swaplog { + type Err = substreams_antelope::Error; + fn from_str(value: &str) -> Result { + substreams_antelope::decoder::decode::(value) + } + } impl substreams_antelope::Action for Swaplog { const NAME: &'static str = "swaplog"; fn decode( trace: &substreams_antelope::pb::ActionTrace, ) -> Result { - Ok(decode::(&trace.action.as_ref().unwrap().json_data)?) + decode::(&trace.action.as_ref().unwrap().json_data) } } #[derive(Debug, Clone, PartialEq, serde::Deserialize)] @@ -175,12 +265,18 @@ pub mod actions { pub codes: Vec, pub profit: Asset, } + impl std::str::FromStr for Tradelog { + type Err = substreams_antelope::Error; + fn from_str(value: &str) -> Result { + substreams_antelope::decoder::decode::(value) + } + } impl substreams_antelope::Action for Tradelog { const NAME: &'static str = "tradelog"; fn decode( trace: &substreams_antelope::pb::ActionTrace, ) -> Result { - Ok(decode::(&trace.action.as_ref().unwrap().json_data)?) + decode::(&trace.action.as_ref().unwrap().json_data) } } } \ No newline at end of file From 00b4b98dd17539dd18e4339b133d62c81039c0d3 Mon Sep 17 00:00:00 2001 From: Denis Carriere Date: Thu, 10 Oct 2024 12:02:37 -0400 Subject: [PATCH 08/10] add prometheus spkg as imports --- .gitignore | 1 + eosmechanics/Cargo.toml | 6 +++++- eosmechanics/Makefile | 6 +++--- .../substreams-sink-prometheus-v0.2.0.spkg | Bin 0 -> 110193 bytes eosmechanics/substreams.yaml | 6 +++--- 5 files changed, 12 insertions(+), 7 deletions(-) create mode 100644 eosmechanics/imports/substreams-sink-prometheus-v0.2.0.spkg diff --git a/.gitignore b/.gitignore index 2ffc37f..ec45bc5 100644 --- a/.gitignore +++ b/.gitignore @@ -14,6 +14,7 @@ localblocks rpc-cache localdata *.spkg +!/**/imports/*.spkg ### VisualStudioCode template .vscode/* diff --git a/eosmechanics/Cargo.toml b/eosmechanics/Cargo.toml index 64a0c89..0090bba 100644 --- a/eosmechanics/Cargo.toml +++ b/eosmechanics/Cargo.toml @@ -1,7 +1,11 @@ [package] name = "eosmechanics" version = "0.3.7" -authors = ["Denis ", "Fred ", "Charles "] +authors = [ + "Denis ", + "Fred ", + "Charles ", +] description = "Block Producer Benchmarks" license = "MIT OR Apache-2.0" edition = "2021" diff --git a/eosmechanics/Makefile b/eosmechanics/Makefile index fdc7eac..951967a 100644 --- a/eosmechanics/Makefile +++ b/eosmechanics/Makefile @@ -27,13 +27,13 @@ info: .PHONY: run run: - substreams run -e telos.substreams.pinax.network:443 prom_out -s 273976005 -o jsonl + substreams run ./substreams.yaml -e telos.substreams.pinax.network:443 prom_out -s 273976005 -o jsonl .PHONY: gui gui: - substreams gui -e kylin.substreams.pinax.network:443 prom_out -s 273976005 -t +1000 + substreams gui ./substreams.yaml -e kylin.substreams.pinax.network:443 prom_out -s 273976005 -t +1000 .PHONY: sink sink: - substreams-sink-prometheus run -e eos.substreams.pinax.network:443 https://github.com/pinax-network/substreams/releases/download/eosmechanics-v0.3.5/eosmechanics-v0.3.5.spkg -s 292103130 + substreams-sink-prometheus run -e eos.substreams.pinax.network:443 https://github.com/pinax-network/substreams/releases/download/eosmechanics-v0.3.5/eosmechanics-v0.3.5.spkg -s 292103130 prom_out diff --git a/eosmechanics/imports/substreams-sink-prometheus-v0.2.0.spkg b/eosmechanics/imports/substreams-sink-prometheus-v0.2.0.spkg new file mode 100644 index 0000000000000000000000000000000000000000..8b38ac083ec2683c6199374dd6d60ebc57370c7d GIT binary patch literal 110193 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

xF-Aei_sB>$ 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 literal 0 HcmV?d00001 diff --git a/eosmechanics/substreams.yaml b/eosmechanics/substreams.yaml index 50518a5..5de2510 100644 --- a/eosmechanics/substreams.yaml +++ b/eosmechanics/substreams.yaml @@ -1,12 +1,12 @@ specVersion: v0.1.0 package: name: eosmechanics - version: v0.3.7 + version: v0.4.0 url: https://github.com/pinax-network/substreams doc: Block Producer Benchmarks -# imports: -# prometheus: https://github.com/pinax-network/substreams-sink-prometheus.rs/releases/download/v0.2.0/substreams-sink-prometheus-v0.2.0.spkg +imports: + prometheus: ./imports/substreams-sink-prometheus-v0.2.0.spkg binaries: default: From dbc0f4ee1c8b2eeb3e3f1139d341dba7252caf66 Mon Sep 17 00:00:00 2001 From: Denis Carriere Date: Thu, 10 Oct 2024 12:32:53 -0400 Subject: [PATCH 09/10] remove doc --- eosmechanics/Makefile | 6 +++++- eosmechanics/substreams.yaml | 1 - 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/eosmechanics/Makefile b/eosmechanics/Makefile index 951967a..7ff8590 100644 --- a/eosmechanics/Makefile +++ b/eosmechanics/Makefile @@ -31,7 +31,11 @@ run: .PHONY: gui gui: - substreams gui ./substreams.yaml -e kylin.substreams.pinax.network:443 prom_out -s 273976005 -t +1000 + substreams gui ./substreams.yaml -e eos.substreams.pinax.network:443 prom_out -s 396958039 + +.PHONY: cache +cache: + substreams gui ./substreams.yaml -e eos.substreams.pinax.network:443 prom_out -s 396958039 -t 0 --production-mode .PHONY: sink sink: diff --git a/eosmechanics/substreams.yaml b/eosmechanics/substreams.yaml index 5de2510..760c4a6 100644 --- a/eosmechanics/substreams.yaml +++ b/eosmechanics/substreams.yaml @@ -3,7 +3,6 @@ package: name: eosmechanics version: v0.4.0 url: https://github.com/pinax-network/substreams - doc: Block Producer Benchmarks imports: prometheus: ./imports/substreams-sink-prometheus-v0.2.0.spkg From 1a38ad065614b33b111e72d366bca6d2896cbf10 Mon Sep 17 00:00:00 2001 From: Charles Morin Date: Mon, 21 Oct 2024 15:46:24 -0400 Subject: [PATCH 10/10] Changed cargo package version for eosmechanics --- eosmechanics/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/eosmechanics/Cargo.toml b/eosmechanics/Cargo.toml index 0090bba..5b9de82 100644 --- a/eosmechanics/Cargo.toml +++ b/eosmechanics/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "eosmechanics" -version = "0.3.7" +version = "0.4.0" authors = [ "Denis ", "Fred ",