diff --git a/Cargo.lock b/Cargo.lock index ef9a766f5..f7e80659d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -503,12 +503,45 @@ dependencies = [ "bytes", "fast_chemail", "fnv", + "futures-util", + "handlebars", + "http", + "indexmap 1.9.3", + "mime", + "multer", + "num-traits", + "once_cell", + "pin-project-lite", + "regex", + "serde", + "serde_json", + "serde_urlencoded", + "static_assertions", + "tempfile", + "thiserror", +] + +[[package]] +name = "async-graphql" +version = "6.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1a08c6aae08f17556577c8b6964f9a4e63dab9ebb42c6c27990d48c810292f9" +dependencies = [ + "async-graphql-derive 6.0.4", + "async-graphql-parser 6.0.4", + "async-graphql-value 6.0.4", + "async-stream", + "async-trait", + "base64 0.13.1", + "bytes", + "fast_chemail", + "fnv", "futures-channel", "futures-timer", "futures-util", "handlebars", "http", - "indexmap 1.9.3", + "indexmap 2.0.0", "lru", "mime", "multer", @@ -526,17 +559,18 @@ dependencies = [ [[package]] name = "async-graphql-axum" -version = "5.0.10" +version = "6.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "777d02b4b35c1eb15bb63391f45b4622206fe1199940fa8b4b6136904fae035c" +checksum = "86ec214a63d8f3d5cbc79d9f2c6bf011334f1a57f124d7655169fd18d5dbfbdc" dependencies = [ - "async-graphql 5.0.10", + "async-graphql 6.0.4", "async-trait", "axum 0.6.20", "bytes", "futures-util", - "http-body", "serde_json", + "tokio", + "tokio-stream", "tokio-util", "tower-service", ] @@ -573,6 +607,23 @@ dependencies = [ "thiserror", ] +[[package]] +name = "async-graphql-derive" +version = "6.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37bef462c5729e53970def569499cfcad11e5019f634158d015b75ffbc4609c3" +dependencies = [ + "Inflector", + "async-graphql-parser 6.0.4", + "darling 0.20.3", + "proc-macro-crate", + "proc-macro2", + "quote", + "strum 0.25.0", + "syn 2.0.29", + "thiserror", +] + [[package]] name = "async-graphql-parser" version = "4.0.16" @@ -597,6 +648,18 @@ dependencies = [ "serde_json", ] +[[package]] +name = "async-graphql-parser" +version = "6.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b00b7296259479864a53dd32aa4dfbec8ed4c5d3b8c0337334a076fe0791935" +dependencies = [ + "async-graphql-value 6.0.4", + "pest", + "serde", + "serde_json", +] + [[package]] name = "async-graphql-value" version = "4.0.16" @@ -1608,6 +1671,15 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" +[[package]] +name = "convert_case" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec182b0ca2f35d8fc196cf3404988fd8b8c739a4d270ff118a398feb0cbec1ca" +dependencies = [ + "unicode-segmentation", +] + [[package]] name = "cookie" version = "0.16.2" @@ -2066,6 +2138,7 @@ dependencies = [ "ident_case", "proc-macro2", "quote", + "strsim", "syn 2.0.29", ] @@ -2164,7 +2237,7 @@ version = "0.99.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4fb810d30a7c1953f91334de7244731fc3f3c10d7fe163338a35b9f640960321" dependencies = [ - "convert_case", + "convert_case 0.4.0", "proc-macro2", "quote", "rustc_version", @@ -3250,7 +3323,7 @@ name = "fuel-indexer-api-server" version = "0.20.5" dependencies = [ "anyhow", - "async-graphql 5.0.10", + "async-graphql 6.0.4", "async-graphql-axum", "async-std", "axum 0.6.20", @@ -3311,8 +3384,8 @@ dependencies = [ name = "fuel-indexer-database-types" version = "0.20.5" dependencies = [ - "async-graphql-parser 5.0.10", - "async-graphql-value 5.0.10", + "async-graphql-parser 6.0.4", + "async-graphql-value 6.0.4", "chrono", "fuel-indexer-lib", "fuel-indexer-types", @@ -3339,20 +3412,24 @@ dependencies = [ ] [[package]] -name = "fuel-indexer-graphql-lib" +name = "fuel-indexer-graphql-dyn" version = "0.20.5" dependencies = [ + "anyhow", "assert_matches", - "async-graphql 5.0.10", - "async-graphql-parser 5.0.10", + "async-graphql 6.0.4", + "async-graphql-parser 6.0.4", "async-graphql-value 6.0.4", "async-trait", + "convert_case 0.6.0", "extension-trait", "graphql-parser", "indexmap 2.0.0", "insta", + "lazy_static", + "serde", "serde_json", - "strum 0.25.0", + "thiserror", "tokio", "velcro", ] @@ -3362,7 +3439,7 @@ name = "fuel-indexer-lib" version = "0.20.5" dependencies = [ "anyhow", - "async-graphql-parser 5.0.10", + "async-graphql-parser 6.0.4", "bincode", "clap 3.2.25", "fuel-indexer-types", @@ -4669,6 +4746,7 @@ dependencies = [ "console", "lazy_static", "linked-hash-map", + "ron", "serde", "similar", "yaml-rust", @@ -6276,6 +6354,17 @@ dependencies = [ "librocksdb-sys", ] +[[package]] +name = "ron" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88073939a61e5b7680558e6be56b419e208420c2adb92be54921fa6b72283f1a" +dependencies = [ + "base64 0.13.1", + "bitflags 1.3.2", + "serde", +] + [[package]] name = "rustc-demangle" version = "0.1.23" diff --git a/Cargo.toml b/Cargo.toml index fae024dda..a1ff0ffe7 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -13,7 +13,7 @@ members = [ "packages/fuel-indexer-database/database-types", "packages/fuel-indexer-database/postgres", "packages/fuel-indexer-graphql", - "packages/fuel-indexer-graphql-lib", + "packages/fuel-indexer-graphql-dyn", "packages/fuel-indexer-lib", "packages/fuel-indexer-macros", "packages/fuel-indexer-macros/macro-utils", @@ -39,7 +39,7 @@ default-members = [ "packages/fuel-indexer-database/database-types", "packages/fuel-indexer-database/postgres", "packages/fuel-indexer-graphql", - "packages/fuel-indexer-graphql-lib", + "packages/fuel-indexer-graphql-dyn", "packages/fuel-indexer-lib", "packages/fuel-indexer-macros", "packages/fuel-indexer-metrics", @@ -66,8 +66,10 @@ rust-version = "1.72.0" version = "0.20.5" [workspace.dependencies] -async-graphql-parser = "5.0" -async-graphql-value = "5.0" +async-graphql = "6.0" +async-graphql-parser = "6.0" +async-graphql-value = "6.0" +async-graphql-axum = "6.0" bincode = "1.3" clap = "3.1" forc-index = { version = "0.20.5", path = "./plugins/forc-index" } @@ -77,7 +79,7 @@ fuel-indexer-api-server = { version = "0.20.5", path = "./packages/fuel-indexer- fuel-indexer-database = { version = "0.20.5", path = "./packages/fuel-indexer-database" } fuel-indexer-database-types = { version = "0.20.5", path = "./packages/fuel-indexer-database/database-types" } fuel-indexer-graphql = { version = "0.20.5", path = "./packages/fuel-indexer-graphql" } -fuel-indexer-graphql-lib = { version = "0.20.5", path = "./packages/fuel-indexer-graphql-lib" } +fuel-indexer-graphql-dyn = { version = "0.20.5", path = "./packages/fuel-indexer-graphql-dyn" } fuel-indexer-lib = { version = "0.20.5", path = "./packages/fuel-indexer-lib" } fuel-indexer-macro-utils = { version = "0.20.5", path = "./packages/fuel-indexer-macros/macro-utils" } fuel-indexer-macros = { version = "0.20.5", path = "./packages/fuel-indexer-macros", default-features = false } diff --git a/packages/fuel-indexer-api-server/Cargo.toml b/packages/fuel-indexer-api-server/Cargo.toml index 6bb1cf2f1..2117fe071 100644 --- a/packages/fuel-indexer-api-server/Cargo.toml +++ b/packages/fuel-indexer-api-server/Cargo.toml @@ -15,8 +15,8 @@ path = "src/bin/main.rs" [dependencies] anyhow = "1.0" -async-graphql = "5.0.7" -async-graphql-axum = "5.0.7" +async-graphql = { workspace = true } +async-graphql-axum = { workspace = true } async-std = "1" axum = { version = "0.6", features = ["multipart", "macros"] } clap = { features = ["cargo", "derive", "env"], workspace = true } diff --git a/packages/fuel-indexer-graphql-lib/Cargo.toml b/packages/fuel-indexer-graphql-dyn/Cargo.toml similarity index 51% rename from packages/fuel-indexer-graphql-lib/Cargo.toml rename to packages/fuel-indexer-graphql-dyn/Cargo.toml index 4224ce9df..fad9f7fde 100644 --- a/packages/fuel-indexer-graphql-lib/Cargo.toml +++ b/packages/fuel-indexer-graphql-dyn/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "fuel-indexer-graphql-lib" +name = "fuel-indexer-graphql-dyn" version = { workspace = true } authors = { workspace = true } edition = { workspace = true } @@ -7,27 +7,34 @@ homepage = { workspace = true } license = { workspace = true } repository = { workspace = true } rust-version = { workspace = true } -description = "Fuel Indexer GraphQL Library" +description = "Library for building executable dynamic GraphQL schemas" [features] -default = ["json"] +default = ["json", "testing"] json = ["dep:serde_json"] +testing = ["dep:graphql-parser"] [dependencies] -async-graphql = { version = "5.0", features = ["dynamic-schema", "dataloader"] } -async-graphql-value = "6.0.3" +async-graphql = { workspace = true, features = ["dynamic-schema", "dataloader"] } +async-graphql-value = { workspace = true } async-trait = "0.1.73" extension-trait = "1.0.2" +graphql-parser = { version = "0.4.0", optional = true } indexmap = "2.0.0" serde_json = { workspace = true, optional = true } -strum = { version = "0.25.0", features = ["derive"] } tokio = { workspace = true, features = ["sync"] } +thiserror = { workspace = true } +anyhow = "1.0" +lazy_static = "1.4.0" +convert_case = "0.6.0" +async-graphql-parser = "6.0.4" +serde.workspace = true [dev-dependencies] assert_matches = "1.5.0" -async-graphql-parser = "5.0" +async-graphql-parser = { workspace = true } graphql-parser = "0.4.0" -insta = { version = "1.31.0", features = ["json"] } +insta = { version = "1.31.0", features = ["json", "ron"] } serde_json = { workspace = true } tokio = { workspace = true, features = ["sync", "rt", "macros"] } velcro = "0.5.4" diff --git a/packages/fuel-indexer-graphql-dyn/README.md b/packages/fuel-indexer-graphql-dyn/README.md new file mode 100644 index 000000000..db9e369ea --- /dev/null +++ b/packages/fuel-indexer-graphql-dyn/README.md @@ -0,0 +1,76 @@ +# fuel-indexer-graphql-dyn + +GraphQL Dyn is a library for building executable dynamic GraphQL schemas. + +Dyn has two main parts: the `store::Store` and the `schema::DynSchemaBuilder`. The schema builder is responsible for creating executable `async_graphql_dynamic::dynamic::Schema` instances from a dynamically defined `schema::DynSchemaType`. Built schema executes GraphQL queries by fetching data from the store. The store is responsible for communicating with the underlying data source. + +## Usage + +Users of Dyn will need three things to get started: + +```rs +/// A `store::Store` implementation. +#[async_trait] +impl Store for MyStore { + fn r#type(&self) -> &StoreType { ... } + // + async fn obj_get(&self, id: &Id) -> R> { ... } + async fn obj_get_many(&self, ids: &[Id]) -> R>> { ... } + async fn assoc_get(&self, key: &Key, ...) -> R>> { ... } + async fn assoc_count(&self, key: &Key, ...) -> R { ... } + async fn assoc_range(&self, key: &Key, ...) -> R> { ... } + async fn assoc_time_range(&self, key: &Key, ...) -> R> { ... } +} + +/// A `store::StoreType` constructor. +fn new_store_type(config: &MyConfig) -> StoreType { + let mut store_type = StoreTypeBuilder::default(); + ... + store_type.finish() +} + +/// A `schema::DynSchemaType` constructor. +fn new_schema_type(config: &MyConfig, store_type: &StoreType) -> DynSchemaType { + let mut schema_type = DynSchemaTypeBuilder::new(store_type); + ... + schema_type.finish() +} +``` + +With these implemented, you can create a dynamic schema and execute queries: + +```rs +let store_type = new_store_type(&my_config)?; +let schema_type = new_schema_type(&my_config, &store_type)?; +let store = MyStore::new(&store_type); + +let builder = DynSchemaBuilder::new(&schema_type, Arc::new(Mutex::new(store))); +let schema = builder.finish()?; + +let response = schema.execute(Request::new(r#" + query { + chain(id: "Chain:0") { + name + ... + blocks(first: 10) { + nodes { + number + ... + transactions(first: 10) { + nodes { + index + ... + } + pageInfo { + hasNextPage + hasPreviousPage + startCursor + endCursor + } + } + } + } + } + } +"#)).await; +``` diff --git a/packages/fuel-indexer-graphql-dyn/src/lib.rs b/packages/fuel-indexer-graphql-dyn/src/lib.rs new file mode 100644 index 000000000..43a78a806 --- /dev/null +++ b/packages/fuel-indexer-graphql-dyn/src/lib.rs @@ -0,0 +1,12 @@ +#![allow(clippy::result_unit_err)] + +pub mod schema; +pub mod spec; +pub mod store; +pub mod testing; + +pub(self) mod self_prelude { + pub use anyhow::anyhow; + pub use async_trait::async_trait; + pub use extension_trait::extension_trait; +} diff --git a/packages/fuel-indexer-graphql-dyn/src/schema/connection.rs b/packages/fuel-indexer-graphql-dyn/src/schema/connection.rs new file mode 100644 index 000000000..e8a02878f --- /dev/null +++ b/packages/fuel-indexer-graphql-dyn/src/schema/connection.rs @@ -0,0 +1,35 @@ +use super::node::*; +use super::paging::*; +use super::self_prelude::*; + +#[derive(Clone, PartialEq, Eq)] +pub struct DynConnectionEdge { + pub node_id: DynNodeId, + pub cursor: Cursor, +} + +#[derive(Clone, PartialEq, Eq)] +pub struct DynConnection { + pub total_count: usize, + pub edges: Vec, + pub page_info: DynPageInfo, +} + +impl DynConnectionEdge { + pub fn new( + node_id: &(impl Into + Clone), + cursor: &(impl Into + Clone), + ) -> Self { + Self { + node_id: node_id.clone().into(), + cursor: cursor.clone().into(), + } + } + + pub fn node_id(&self) -> &DynNodeId { + &self.node_id + } + pub fn cursor(&self) -> &Cursor { + &self.cursor + } +} diff --git a/packages/fuel-indexer-graphql-dyn/src/schema/data.rs b/packages/fuel-indexer-graphql-dyn/src/schema/data.rs new file mode 100644 index 000000000..017e3cb92 --- /dev/null +++ b/packages/fuel-indexer-graphql-dyn/src/schema/data.rs @@ -0,0 +1,151 @@ +use super::self_prelude::*; + +#[derive(Clone, Debug, Hash, PartialEq, Eq, Serialize, Deserialize)] +pub enum DynDataTypeId { + // GraphQL types + ID, + String, + Int, + Float, + Boolean, + List(Box), + // Option(Box), + // Fuel types + Unit, + U8, + U16, + U32, + U64, + B256, + Bytes, + Name(Name), +} + +#[derive(Clone, Debug, Serialize, Deserialize)] +pub enum DynDataType { + // GraphQL types + ID, + String, + Int, + Float, + Boolean, + List(Box), + // Option(Box), + // Fuel types + Unit, + U8, + U16, + U32, + U64, + B256, + Bytes, + Object(Name, IndexMap), + Enum(Name, IndexMap), +} + +pub type DynDataFieldId = String; + +#[derive(Clone, Debug, Serialize, Deserialize)] +pub struct DynDataFieldType { + pub name: Name, + pub data_type_id: DynDataTypeId, + pub store_data_field_id: store::DataFieldId, +} + +impl From for DynDataTypeId { + fn from(store_data_type_id: store::DataTypeId) -> Self { + match store_data_type_id { + store::DataTypeId::Unit => Self::Unit, + store::DataTypeId::Bool => Self::Boolean, + store::DataTypeId::U8 => Self::U8, + store::DataTypeId::U16 => Self::U16, + store::DataTypeId::U32 => Self::U32, + store::DataTypeId::U64 => Self::U64, + store::DataTypeId::B256 => Self::B256, + store::DataTypeId::Byte => Self::U8, + store::DataTypeId::Bytes => Self::Bytes, + store::DataTypeId::String => Self::String, + store::DataTypeId::Array(ty) => Self::List(Box::new((*ty).into())), + store::DataTypeId::Name(name) => Self::Name(name), + } + } +} + +impl FromStr for DynDataTypeId { + type Err = (); + fn from_str(str: &str) -> Result { + match str { + // GraphQL types + "ID" => Ok(Self::ID), + "String" => Ok(Self::String), + "Int" => Ok(Self::Int), + "Float" => Ok(Self::Float), + "Boolean" => Ok(Self::Boolean), + // List(Box), + // Option(Box), + // Fuel types + "Unit" => Ok(Self::Unit), + "U8" => Ok(Self::U8), + "U16" => Ok(Self::U16), + "U32" => Ok(Self::U32), + "U64" => Ok(Self::U64), + "B256" => Ok(Self::B256), + "Bytes" => Ok(Self::Bytes), + str => Ok(Self::Name(Name::new_pascal(str))), + } + } +} + +impl std::fmt::Display for DynDataTypeId { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match self { + Self::ID => write!(f, "ID"), + Self::Int => write!(f, "Int"), + Self::Float => write!(f, "Float"), + Self::List(ty) => write!(f, "[{}]", ty), + // Self::Option(ty) => write!(f, "{}", ty), + Self::Unit => write!(f, "Unit"), + Self::Boolean => write!(f, "Boolean"), + Self::U8 => write!(f, "U8"), + Self::U16 => write!(f, "U16"), + Self::U32 => write!(f, "U32"), + Self::U64 => write!(f, "U64"), + Self::B256 => write!(f, "B256"), + Self::Bytes => write!(f, "Bytes"), + Self::String => write!(f, "String"), + Self::Name(str) => write!(f, "{}", str), + } + } +} + +impl DynDataType { + pub fn name(&self) -> Name { + match self { + Self::ID => Name::new_pascal("ID"), + Self::Int => Name::new_pascal("Int"), + Self::Float => Name::new_pascal("Float"), + Self::List(ty) => Name::new_pascal(format!("[{}]", ty.name())), + // Self::Option(ty) => Name::new_pascal(&format!("{}!", ty)), + Self::Unit => Name::new_pascal("Unit"), + Self::Boolean => Name::new_pascal("Boolean"), + Self::U8 => Name::new_pascal("U8"), + Self::U16 => Name::new_pascal("U16"), + Self::U32 => Name::new_pascal("U32"), + Self::U64 => Name::new_pascal("U64"), + Self::B256 => Name::new_pascal("B256"), + Self::Bytes => Name::new_pascal("Bytes"), + Self::String => Name::new_pascal("String"), + Self::Object(name, _) => Name::new_pascal(format!("{}", name)), + Self::Enum(name, _) => Name::new_pascal(format!("{}", name)), + } + } +} + +impl DynDataFieldType { + pub fn data_type_id(&self) -> &DynDataTypeId { + &self.data_type_id + } + pub fn store_id(&self) -> &store::DataFieldId { + &self.store_data_field_id + } +} diff --git a/packages/fuel-indexer-graphql-dyn/src/schema/edge.rs b/packages/fuel-indexer-graphql-dyn/src/schema/edge.rs new file mode 100644 index 000000000..911fa2693 --- /dev/null +++ b/packages/fuel-indexer-graphql-dyn/src/schema/edge.rs @@ -0,0 +1,72 @@ +use super::data::*; +use super::node::*; +use super::self_prelude::*; + +pub type DynEdgeTypeId = store::AssocTypeId; +pub type DynEdgeData = store::Assoc; +pub type DynEdgeTime = store::AssocTime; + +#[derive(Clone, Hash, PartialEq, Eq)] +pub struct DynEdgeId(DynEdgeTypeId, DynNodeId, DynNodeId); + +#[derive(Clone, Debug, Serialize, Deserialize)] +pub struct DynEdgeType { + pub name: Name, + pub tail: DynNodeTypeId, + pub head: DynNodeTypeId, + pub fields: IndexMap, +} + +#[derive(Clone)] +pub struct DynEdge(DynEdgeTypeId, DynNodeId, DynEdgeData); + +impl DynEdgeId { + pub fn new( + type_id: impl Into, + tail_id: impl Into, + head_id: impl Into, + ) -> Self { + Self(type_id.into(), tail_id.into(), head_id.into()) + } +} + +impl DynEdgeType { + pub fn tail_type_id(&self) -> &DynNodeTypeId { + &self.tail + } + pub fn head_type_id(&self) -> &DynNodeTypeId { + &self.head + } + pub fn fields(&self) -> &IndexMap { + &self.fields + } + pub fn field(&self, field_id: &DynDataFieldId) -> Option<&DynDataFieldType> { + self.fields.get(field_id) + } +} + +impl DynEdge { + pub fn new( + type_id: impl Into, + tail_id: impl Into, + data: impl Into, + ) -> Self { + Self(type_id.into(), tail_id.into(), data.into()) + } + + pub fn type_id(&self) -> &DynEdgeTypeId { + &self.0 + } + pub fn tail_id(&self) -> &DynNodeId { + &self.1 + } + pub fn head_id(&self) -> &DynNodeId { + self.2.id() + } + pub fn time(&self) -> &DynEdgeTime { + self.2.time() + } + pub fn data(&self) -> &serde_json::Value { + self.2.data().value() + } +} diff --git a/packages/fuel-indexer-graphql-dyn/src/schema/loader.rs b/packages/fuel-indexer-graphql-dyn/src/schema/loader.rs new file mode 100644 index 000000000..2e551faaa --- /dev/null +++ b/packages/fuel-indexer-graphql-dyn/src/schema/loader.rs @@ -0,0 +1,73 @@ +use super::edge::*; +use super::node::*; +use super::self_prelude::*; + +pub struct DynLoader { + pub store: Arc>, +} + +pub type DynLoaderResult = anyhow::Result; + +#[derive(thiserror::Error, Debug)] +pub enum DynLoaderError { + #[error(transparent)] + DataStore(#[from] store::StoreError), + #[error(transparent)] + Other(#[from] anyhow::Error), +} + +impl DynLoader { + pub fn new(store: Arc>) -> Self { + Self { store } + } + + pub async fn load_node_one( + &self, + id: &DynNodeId, + ) -> DynLoaderResult> { + let store = self.store.lock().await; + let object = store.obj_get(id).await?; + Ok(object.map(|object| DynNode::new(id.clone(), object))) + } + pub async fn load_node_many( + &self, + ids: &[DynNodeId], + ) -> DynLoaderResult>> { + // let ids = ids.iter().map(|id| id.to_string()).collect::>(); + let store = self.store.lock().await; + let objects = store + .obj_get_many(&ids.iter().map(|id| id.to_string()).collect::>()) + .await?; + Ok(objects + .into_iter() + .enumerate() + .map(|(i, object)| object.map(|object| DynNode::new(ids[i].clone(), object))) + .collect()) + } + pub async fn load_node_edge_count( + &self, + id: &DynNodeId, + edge_type_id: &DynEdgeTypeId, + ) -> DynLoaderResult + where + Self: 'static, + { + let store = self.store.lock().await; + let key = store::AssocKey(id.to_string(), edge_type_id.to_string()); + let count = store.assoc_count(&key).await?; + Ok(count) + } + pub async fn load_node_edges( + &self, + id: &DynNodeId, + edge_type_id: &DynEdgeTypeId, + ) -> DynLoaderResult> { + let store = self.store.lock().await; + let key = store::AssocKey(id.to_string(), edge_type_id.to_string()); + let assocs = store.assoc_range(&key, 0, 9999).await?; + Ok(assocs + .into_iter() + .map(|assoc| DynEdge::new(edge_type_id, assoc.id().clone(), assoc)) + .collect()) + } +} diff --git a/packages/fuel-indexer-graphql-dyn/src/schema/mod.rs b/packages/fuel-indexer-graphql-dyn/src/schema/mod.rs new file mode 100644 index 000000000..dc978ecf9 --- /dev/null +++ b/packages/fuel-indexer-graphql-dyn/src/schema/mod.rs @@ -0,0 +1,38 @@ +pub mod connection; +pub mod data; +pub mod edge; +pub mod loader; +pub mod node; +pub mod paging; +pub mod resolver; +pub mod resolver_context; +pub mod schema_builder; +pub mod schema_type; +pub mod schema_type_builder; + +pub(self) mod self_prelude { + pub use super::super::self_prelude::*; + pub use crate::spec::*; + pub use crate::store; + pub use crate::store::Name; + pub use async_graphql::dynamic::*; + pub use indexmap::IndexMap; + pub use serde::{Deserialize, Serialize}; + pub use std::collections::HashMap; + pub use std::fmt; + pub use std::str::FromStr; + pub use std::sync::Arc; + pub use tokio::sync::Mutex; +} + +pub use connection::*; +pub use data::*; +pub use edge::*; +pub use loader::*; +pub use node::*; +pub use paging::*; +pub use resolver::*; +pub use resolver_context::*; +pub use schema_builder::*; +pub use schema_type::*; +pub use schema_type_builder::*; diff --git a/packages/fuel-indexer-graphql-dyn/src/schema/node.rs b/packages/fuel-indexer-graphql-dyn/src/schema/node.rs new file mode 100644 index 000000000..a525bebbb --- /dev/null +++ b/packages/fuel-indexer-graphql-dyn/src/schema/node.rs @@ -0,0 +1,139 @@ +use super::data::*; +use super::edge::*; +use super::self_prelude::*; + +#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq, Hash)] +pub struct DynNodeTypeId { + pub store_id: store::ObjTypeId, +} + +pub type DynNodeId = store::ObjId; + +pub type DynNodeData = store::Obj; + +#[derive(Clone, Debug, Serialize, Deserialize)] +pub struct DynNodeType { + pub name: Name, + pub fields: IndexMap, +} + +#[derive(Clone, Debug, Serialize, Deserialize)] +pub enum DynNodeFieldType { + Data(DynDataFieldType), + Ref(DynNodeRefFieldType), + Connection(DynNodeConnectionFieldType), +} + +#[derive(Clone, Debug, Serialize, Deserialize)] +pub struct DynNodeConnectionFieldType { + pub name: Name, + pub edge_type_id: DynEdgeTypeId, +} + +#[derive(Clone, Debug, Serialize, Deserialize)] +pub struct DynNodeRefFieldType { + pub name: Name, + pub store_id: store::DataFieldId, + pub ref_node_type_id: DynNodeTypeId, +} + +#[derive(Clone, Debug, Serialize, Deserialize)] +pub struct DynNode(DynNodeId, DynNodeData); + +impl From for store::ObjTypeId { + fn from(node_type_id: DynNodeTypeId) -> Self { + node_type_id.store_id + } +} + +impl From for DynNodeTypeId { + fn from(store_type_id: store::ObjTypeId) -> Self { + Self { + store_id: store_type_id, + } + } +} + +impl FromStr for DynNodeTypeId { + type Err = (); + fn from_str(str: &str) -> Result { + Ok(Self { + store_id: store::ObjTypeId::from_str(str).map_err(|_| ())?, + }) + } +} + +impl fmt::Display for DynNodeTypeId { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!(f, "{}", self.store_id) + } +} + +impl DynNodeType { + pub fn fields(&self) -> &IndexMap { + &self.fields + } + pub fn field(&self, field_id: &DynDataFieldId) -> Option<&DynNodeFieldType> { + self.fields.get(field_id) + } +} + +impl DynNodeFieldType { + pub fn name(&self) -> Name { + match self { + Self::Data(data) => data.name.clone(), + Self::Ref(data) => data.name.clone(), + Self::Connection(data) => data.name.clone(), + } + } + + pub fn as_data_field(&self) -> &DynDataFieldType { + match self { + Self::Data(data) => data, + _ => panic!("DynNodeFieldType::as_data: not a data field"), + } + } + pub fn as_ref_field(&self) -> &DynNodeRefFieldType { + match self { + Self::Ref(data) => data, + _ => panic!("DynNodeFieldType::as_ref: not a ref field"), + } + } + pub fn as_connection_field(&self) -> &DynNodeConnectionFieldType { + match self { + Self::Connection(data) => data, + _ => panic!("DynNodeFieldType::as_connection: not a connection field"), + } + } +} + +impl DynNodeConnectionFieldType { + pub fn edge_type_id(&self) -> &DynEdgeTypeId { + &self.edge_type_id + } +} + +impl DynNodeRefFieldType { + pub fn store_id(&self) -> &DynDataFieldId { + &self.store_id + } + pub fn ref_node_type_id(&self) -> &DynNodeTypeId { + &self.ref_node_type_id + } +} + +impl DynNode { + pub fn new(id: impl Into, data: DynNodeData) -> Self { + Self(id.into(), data) + } + + pub fn id(&self) -> &DynNodeId { + &self.0 + } + pub fn type_id(&self) -> DynNodeTypeId { + self.1.type_id().clone().into() + } + pub fn data(&self) -> &serde_json::Value { + self.1.data().value() + } +} diff --git a/packages/fuel-indexer-graphql-dyn/src/schema/paging.rs b/packages/fuel-indexer-graphql-dyn/src/schema/paging.rs new file mode 100644 index 000000000..bb59df2bf --- /dev/null +++ b/packages/fuel-indexer-graphql-dyn/src/schema/paging.rs @@ -0,0 +1,61 @@ +use super::self_prelude::*; + +#[derive(Clone, PartialEq, Eq)] +pub struct DynPageInfo { + pub has_next_page: bool, + pub has_previous_page: bool, + pub start_cursor: Option, + pub end_cursor: Option, +} + +pub struct DynPagingArgs { + pub first: Option, + pub last: Option, + pub before: Option, + pub after: Option, +} + +pub enum DynPagingDirection { + Forward, + Backward, +} + +pub struct DynPaging { + pub direction: DynPagingDirection, + pub count: u64, + pub before: Option, + pub after: Option, +} + +pub type DynPagingResult = anyhow::Result; + +#[derive(thiserror::Error, Debug)] +pub enum DynPagingError { + #[error("Cannot paginate both forward and backward at the same time")] + BothForwardAndBackward, + #[error("Must paginate either forward or backward")] + NoForwardOrBackward, +} + +impl TryFrom for DynPaging { + type Error = DynPagingError; + + fn try_from(args: DynPagingArgs) -> DynPagingResult { + let direction = match (args.first, args.last) { + (Some(_), Some(_)) => Err(DynPagingError::BothForwardAndBackward)?, + (Some(_), None) => DynPagingDirection::Forward, + (None, Some(_)) => DynPagingDirection::Backward, + (None, None) => Err(DynPagingError::NoForwardOrBackward)?, + }; + let count = args + .first + .or(args.last) + .ok_or(DynPagingError::NoForwardOrBackward)?; + Ok(Self { + direction, + count, + before: args.before, + after: args.after, + }) + } +} diff --git a/packages/fuel-indexer-graphql-dyn/src/schema/resolver.rs b/packages/fuel-indexer-graphql-dyn/src/schema/resolver.rs new file mode 100644 index 000000000..b70cdfaee --- /dev/null +++ b/packages/fuel-indexer-graphql-dyn/src/schema/resolver.rs @@ -0,0 +1,450 @@ +use super::connection::*; +use super::data::*; +use super::loader::*; +use super::node::*; +use super::paging::*; +use super::resolver_context::*; +use super::schema_type::*; +use super::self_prelude::*; + +pub struct DynResolver { + schema_type: DynSchemaType, + loader: Arc>, +} + +#[derive(thiserror::Error, Debug)] +pub enum DynResolverError { + #[error(transparent)] + ResolverContext(#[from] DynResolverContextError), + #[error(transparent)] + Loader(#[from] DynLoaderError), + #[error(transparent)] + Other(#[from] anyhow::Error), +} + +pub type DynResolverResult = anyhow::Result; + +pub type DynResolverFn<'a> = + Box) -> FieldFuture<'a> + Send + Sync + 'static>; + +impl DynResolver { + pub fn new(schema_type: &DynSchemaType, loader: Arc>) -> Self { + Self { + schema_type: schema_type.clone(), + loader, + } + } + + pub async fn locked_loader(&self) -> tokio::sync::MutexGuard<'_, DynLoader> { + self.loader.lock().await + } + + // + pub fn resolve_node_id_arg(&self, arg: ValueAccessor) -> DynNodeId { + let id = arg.string().unwrap(); + let (input_type, input_id) = id.split_once(':').unwrap(); + // let node_type = self.get_node_type(input_type.to_string()); + let id = format!("{}:{}", input_type, input_id); + id + } + pub fn resolve_node_impl_id( + &self, + node_type_id: &DynNodeTypeId, + input: &str, + ) -> DynNodeId { + // unimplemented!() + let (input_type, input_id) = input.split_once(':').unwrap(); + let input_type: DynNodeTypeId = input_type.parse().unwrap(); + if &input_type != node_type_id { + panic!("invalid node id: {}", input); + } + let id = format!("{}:{}", input_type, input_id); + id + } + + // Field type methods + // pub fn get_node_data_field_type( + // &self, + // id: &ObjTypeId, + // field_id: &DynamicFieldId, + // ) -> &DynamicObjectTypeDataField { + // let node_type = self.get_node_type(id); + // node_type + // .data + // .iter() + // .find(|field_type| field_type.id() == field_id) + // .unwrap() + // } + // pub fn get_node_ref_field_type( + // &self, + // id: &ObjTypeId, + // field_id: &DynamicFieldId, + // ) -> &DynamicNodeTypeRefField { + // let node_type = self.get_node_type(id); + // node_type + // .ref_fields + // .iter() + // .find(|field_type| field_type.id() == field_id) + // .unwrap() + // } + // pub fn get_node_connection_field_type( + // &self, + // id: &ObjTypeId, + // field_id: &DynamicFieldId, + // ) -> &DynamicNodeTypeConnectionField { + // let node_type = self.get_node_type(id); + // node_type + // .connection_fields + // .iter() + // .find(|field_type| field_type.id() == field_id) + // .unwrap() + // } +} + +impl QueryResolver for DynResolver { + fn resolve_node_by_id(ctx: ResolverContext) -> FieldFuture { + FieldFuture::new(async move { + let resolver = ctx.resolver(); + let id = resolver.resolve_node_id_arg(ctx.args.get("id").unwrap()); + + let loader = resolver.loader.lock().await; + let node = loader.load_node_one(&id).await.unwrap(); + if let Some(node) = node { + let type_id = node.type_id().to_string(); + Ok(Some(FieldValue::owned_any(node.clone()).with_type(type_id))) + } else { + Ok(None) + } + }) + } + fn resolve_nodes_by_id(ctx: ResolverContext) -> FieldFuture { + FieldFuture::new(async move { + let ids = ctx.get_arg_list_nn_node_id_nn("ids")?; + + let resolver = ctx.resolver(); + let loader = resolver.loader.lock().await; + let nodes = loader.load_node_many(ids.as_slice()).await.unwrap(); + let nodes = nodes + .into_iter() + .map(|node| { + if let Some(node) = node { + let type_id = node.type_id().to_string(); + FieldValue::owned_any(node.clone()).with_type(type_id) + } else { + FieldValue::NULL + } + }) + .collect::>(); + Ok(Some(FieldValue::list(nodes))) + }) + } +} + +impl NodeResolver for DynResolver { + fn resolve_id( + ctx: async_graphql::dynamic::ResolverContext, + ) -> async_graphql::dynamic::FieldFuture { + FieldFuture::new(async move { + let parent = ctx.parent_node()?; + + let value: String = parent.id().to_string(); + Ok(Some(FieldValue::value(value))) + }) + } + fn resolve_data(ctx: ResolverContext) -> FieldFuture { + FieldFuture::new(async move { + let parent = ctx.parent_node()?; + let field_name = ctx.field_name(); + + let resolver = ctx.resolver(); + let field_type = resolver + .schema_type + .node_field(&parent.type_id(), &field_name) + .as_data_field(); + + let data_type = resolver.schema_type.data(field_type.data_type_id()); + + let field_value = &parent.data()[field_type.store_id()]; + + match data_type { + DynDataType::ID => { + let value = field_value.as_str().unwrap(); + Ok(Some(FieldValue::value(value))) + } + DynDataType::String => { + let value = field_value.as_str().unwrap(); + Ok(Some(FieldValue::value(value))) + } + DynDataType::Int => { + let value = field_value.as_i64().unwrap(); + Ok(Some(FieldValue::value(value))) + } + DynDataType::Float => { + let value = field_value.as_f64().unwrap(); + Ok(Some(FieldValue::value(value))) + } + DynDataType::List(_ty) => { + todo!(); + } + DynDataType::Unit => Ok(Some(FieldValue::NULL)), + DynDataType::Boolean => { + let value = field_value.as_bool().unwrap(); + Ok(Some(FieldValue::value(value))) + } + DynDataType::U8 => { + let value = field_value.as_u64().unwrap() as u8; + Ok(Some(FieldValue::value(value))) + } + DynDataType::U16 => { + let value = field_value.as_u64().unwrap() as u16; + Ok(Some(FieldValue::value(value))) + } + DynDataType::U32 => { + let value = field_value.as_u64().unwrap() as u32; + Ok(Some(FieldValue::value(value))) + } + DynDataType::U64 => { + let value = field_value.as_u64().unwrap(); + Ok(Some(FieldValue::value(value))) + } + DynDataType::B256 => { + let value = field_value.as_str().unwrap(); + Ok(Some(FieldValue::value(value))) + } + DynDataType::Bytes => { + let value = field_value.as_str().unwrap(); + Ok(Some(FieldValue::value(value))) + } + DynDataType::Object(_name, _fields) => { + todo!() + } + DynDataType::Enum(_name, _variants) => { + todo!() + } + } + }) + } + fn resolve_ref(ctx: ResolverContext) -> FieldFuture { + FieldFuture::new(async move { + let parent = ctx.parent_node()?; + let field_name = ctx.field_name(); + + let resolver = ctx.resolver(); + let field_type = resolver + .schema_type + .node_field(&parent.type_id(), &field_name) + .as_ref_field(); + + let data_field_id = &field_type.store_id; + let id = parent.data().get(data_field_id).ok_or_else(|| { + DynResolverError::Other(anyhow!( + "invalid data field id: {}", + data_field_id + )) + })?; + let id = id.as_str().unwrap(); + let resolver = ctx.resolver(); + let loader = resolver.loader.lock().await; + let node = loader + .load_node_one(&id.to_string()) + .await + .unwrap() + .unwrap(); + Ok(Some(FieldValue::owned_any(node.clone()))) + }) + } + fn resolve_connection(ctx: ResolverContext) -> FieldFuture { + FieldFuture::new(async move { + let parent = ctx.parent_node()?; + let paging = ctx.get_paging()?; + let field_name = ctx.field().name().to_string(); + + let resolver = ctx.resolver(); + let field_type = resolver + .schema_type + .node_field(&parent.type_id(), &field_name) + .as_connection_field(); + + let _node_type = resolver.schema_type.node(&parent.type_id()); + let edge_type_id = field_type.edge_type_id(); + let _edge_type = resolver.schema_type.edge(edge_type_id); + let resolver = ctx.resolver(); + let loader = resolver.loader.lock().await; + + let all_edges = loader + .load_node_edges(parent.id(), edge_type_id) + .await + .unwrap(); + + let mut has_next_page = false; + let mut has_previous_page = false; + let mut edges = all_edges; + match paging.direction { + DynPagingDirection::Forward => { + let DynPaging { + count, + after, + before, + .. + } = paging; + edges = edges + .into_iter() + .skip_while(|edge| match &after { + Some(after) => { + if &edge.time().to_string() == after { + false + } else { + has_previous_page = true; + true + } + } + None => false, + }) + .take_while(|edge| match &before { + Some(before) => { + if &edge.time().to_string() == before { + has_next_page = true; + false + } else { + true + } + } + None => true, + }) + .take(count as usize) + .collect::>(); + } + DynPagingDirection::Backward => { + todo!() + } + } + + let edges = edges + .iter() + .map(|edge| { + DynConnectionEdge::new(edge.head_id(), &edge.time().to_string()) + }) + .collect::>(); + let total_count = edges.len(); + let start_cursor = edges.first().map(|edge| edge.cursor().to_string()); + let end_cursor = edges.last().map(|edge| edge.cursor().to_string()); + let connection = DynConnection { + edges, + total_count, + page_info: DynPageInfo { + has_next_page, + has_previous_page, + start_cursor, + end_cursor, + }, + }; + Ok(Some(FieldValue::owned_any(connection))) + }) + } +} + +impl ConnectionResolver for DynResolver { + fn resolve_total_count(ctx: ResolverContext) -> FieldFuture { + FieldFuture::new(async move { + let parent = ctx.parent::()?; + Ok(Some(FieldValue::value(parent.total_count))) + }) + } + fn resolve_nodes(ctx: ResolverContext) -> FieldFuture { + FieldFuture::new(async move { + let parent = ctx.parent::()?; + let node_ids = parent + .edges + .iter() + .map(|edge| edge.node_id.clone()) + .collect::>(); + let resolver = ctx.resolver(); + let loader = resolver.loader.lock().await; + let nodes = loader.load_node_many(node_ids.as_slice()).await.unwrap(); + let nodes = nodes + .into_iter() + .map(|node| { + if let Some(node) = node { + FieldValue::owned_any(node.clone()) + } else { + FieldValue::NULL + } + }) + .collect::>(); + Ok(Some(FieldValue::list(nodes))) + }) + } + fn resolve_edges(ctx: ResolverContext) -> FieldFuture { + FieldFuture::new(async move { + let parent = ctx.parent::()?; + let edges = parent + .edges + .iter() + .map(|edge| FieldValue::owned_any(edge.clone())) + .collect::>(); + Ok(Some(FieldValue::list(edges))) + }) + } + fn resolve_page_info(ctx: ResolverContext) -> FieldFuture { + FieldFuture::new(async move { + let parent = ctx.parent::()?; + Ok(Some(FieldValue::owned_any(parent.page_info.clone()))) + }) + } +} + +impl ConnectionEdgeResolver for DynResolver { + fn resolve_node(ctx: ResolverContext) -> FieldFuture { + FieldFuture::new(async move { + let parent = ctx.parent::()?; + let id = &parent.node_id; + let resolver = ctx.resolver(); + let loader = resolver.loader.lock().await; + let node = loader.load_node_one(id).await.unwrap().unwrap(); + Ok(Some(FieldValue::owned_any(node.clone()))) + }) + } + fn resolve_cursor(ctx: ResolverContext) -> FieldFuture { + FieldFuture::new(async move { + let parent = ctx.parent::()?; + Ok(Some(FieldValue::value(parent.cursor.clone()))) + }) + } +} + +impl PageInfoResolver for DynResolver { + fn resolve_has_next_page( + ctx: async_graphql::dynamic::ResolverContext, + ) -> async_graphql::dynamic::FieldFuture { + FieldFuture::new(async move { + let parent = ctx.parent::()?; + Ok(Some(FieldValue::value(parent.has_next_page))) + }) + } + fn resolve_has_previous_page(ctx: ResolverContext) -> FieldFuture { + FieldFuture::new(async move { + let parent = ctx.parent::()?; + Ok(Some(FieldValue::value(parent.has_previous_page))) + }) + } + fn resolve_start_cursor(ctx: ResolverContext) -> FieldFuture { + FieldFuture::new(async move { + let parent = ctx.parent::()?; + if let Some(start_cursor) = &parent.start_cursor { + Ok(Some(FieldValue::value(start_cursor.clone()))) + } else { + Ok(None) + } + }) + } + fn resolve_end_cursor(ctx: ResolverContext) -> FieldFuture { + FieldFuture::new(async move { + let parent = ctx.parent::()?; + if let Some(end_cursor) = &parent.end_cursor { + Ok(Some(FieldValue::value(end_cursor.clone()))) + } else { + Ok(None) + } + }) + } +} diff --git a/packages/fuel-indexer-graphql-dyn/src/schema/resolver_context.rs b/packages/fuel-indexer-graphql-dyn/src/schema/resolver_context.rs new file mode 100644 index 000000000..2a7055928 --- /dev/null +++ b/packages/fuel-indexer-graphql-dyn/src/schema/resolver_context.rs @@ -0,0 +1,153 @@ +use super::node::*; +use super::paging::*; +use super::resolver::*; +use super::self_prelude::*; + +#[derive(thiserror::Error, Debug)] +pub enum DynResolverContextError { + #[error("Failed to parse argument {0} as NodeId: {1}")] + NodeIdParse(String, String), + #[error("Missing argument: {0}")] + MissingArgument(String), + #[error(transparent)] + Paging(#[from] DynPagingError), + #[error(transparent)] + Other(#[from] anyhow::Error), +} + +pub type DynResolverContextResult = anyhow::Result; + +type Error = DynResolverContextError; +type Result = DynResolverContextResult; + +#[extension_trait] +pub impl<'a> DynResolverContext<'a> for ResolverContext<'a> { + fn resolver(&self) -> &DynResolver { + self.data::().unwrap() + } + fn parent(&self) -> Result<&T> { + self.parent_value.try_downcast_ref::().map_err(|_| { + Error::Other(anyhow::anyhow!( + "failed to downcast parent value to {}", + std::any::type_name::() + )) + }) + } + fn parent_node(&self) -> Result<&DynNode> { + self.parent::() + } + fn field_name(&self) -> String { + self.path_node.unwrap().field_name().to_string() + } + + // Argument getter methods + fn get_arg(&self, name: &str) -> Option { + self.args.get(name) + } + fn get_arg_u64(&self, name: &str) -> Result> { + self.args + .get(name) + .map(|arg| { + arg.u64().map_err(|_e| { + Error::Other(anyhow::anyhow!( + "Failed to get argument {} as u64", + name + )) + }) + }) + .transpose() + } + fn get_arg_string(&self, name: &str) -> Result> { + self.args + .get(name) + .map(|arg| { + arg.string().map_err(|_e| { + Error::Other(anyhow::anyhow!( + "Failed to get argument {} as string", + name + )) + }) + }) + .transpose() + } + // fn get_arg_node_id(&self, name: &str) -> Result> { + // self.args + // .get(name) + // .map(|arg| { + // arg.node_id().map_err(|_e| { + // Error::Other(anyhow::anyhow!( + // "Failed to get argument {} as NodeId", + // name + // )) + // }) + // }) + // .transpose() + // } + fn get_arg_object(&self, name: &str) -> Result> { + self.args + .get(name) + .map(|arg| { + arg.object().map_err(|_e| { + Error::Other(anyhow::anyhow!( + "Failed to get argument {} as object", + name + )) + }) + }) + .transpose() + } + fn get_arg_nn(&self, name: &str) -> Result { + self.get_arg(name) + .ok_or_else(|| Error::MissingArgument(name.into())) + } + fn get_arg_string_nn(&self, name: &str) -> Result<&str> { + self.get_arg_string(name)? + .ok_or_else(|| Error::MissingArgument(name.into())) + } + // fn get_arg_node_id_nn(&self, name: &str) -> Result { + // self.get_arg_node_id(name)? + // .ok_or_else(|| Error::MissingArgument(name.into())) + // } + fn get_arg_list_nn_string_nn(&self, name: &str) -> Result> { + self.get_arg_nn(name)? + .list() + .map_err(|_e| { + Error::Other(anyhow::anyhow!("Failed to get argument {} as List", name)) + })? + .iter() + .map(|id| { + id.string() + .map_err(|_e| { + Error::Other(anyhow::anyhow!( + "Failed to get argument {} as String", + name + )) + }) + .map(ToString::to_string) + }) + .collect() + } + fn get_arg_list_nn_node_id_nn(&self, _name: &str) -> Result> { + unimplemented!() + // self.get_arg_list_nn_string_nn(name)? + // .iter() + // .map(|id| { + // id.parse() + // .map_err(|_e| Error::NodeIdParse(name.to_string(), id.clone())) + // }) + // .collect() + } + fn get_paging(&self) -> Result { + let first = self.get_arg_u64("first")?; + let after = self.get_arg_string("after")?.map(ToString::to_string); + let last = self.get_arg_u64("last")?; + let before = self.get_arg_string("before")?.map(ToString::to_string); + let args = DynPagingArgs { + first, + after, + last, + before, + }; + Ok(DynPaging::try_from(args)?) + } +} diff --git a/packages/fuel-indexer-graphql-dyn/src/schema/schema_builder.rs b/packages/fuel-indexer-graphql-dyn/src/schema/schema_builder.rs new file mode 100644 index 000000000..7f82b9624 --- /dev/null +++ b/packages/fuel-indexer-graphql-dyn/src/schema/schema_builder.rs @@ -0,0 +1,175 @@ +use super::data::*; +use super::loader::*; +use super::node::*; +use super::resolver::*; +use super::resolver_context::*; +use super::schema_type::*; +use super::self_prelude::*; + +pub struct DynSchemaBuilder { + schema: SchemaBuilder, + query: Object, +} + +impl Default for DynSchemaBuilder { + fn default() -> Self { + let mut schema = Schema::build(TypeRef::QUERY, None, None); + schema = schema + .register(Object::new_page_info::()) + .register(Interface::new_node()); + let query = Object::new_query::(); + Self { schema, query } + } +} + +impl DynSchemaBuilder { + pub fn new(schema_type: &DynSchemaType, store: Arc>) -> Self { + let loader = DynLoader::new(store); + let resolver = DynResolver::new(&schema_type, Arc::new(Mutex::new(loader))); + let DynSchemaBuilder { + mut schema, + mut query, + } = DynSchemaBuilder::default(); + + for (_data_type_id, data_type) in &schema_type.data { + match data_type { + // GraphQL types + DynDataType::ID + | DynDataType::String + | DynDataType::Int + | DynDataType::Float + | DynDataType::Boolean + | DynDataType::List(_) => continue, + // Fuel types + DynDataType::Unit + | DynDataType::U8 + | DynDataType::U16 + | DynDataType::U32 + | DynDataType::U64 + | DynDataType::B256 + | DynDataType::Bytes => { + let scalar = Scalar::new(data_type.name().to_pascal_string()); + schema = schema.register(scalar); + } + DynDataType::Object(name, fields) => { + let mut object = Object::new(name.to_pascal_string()); + + for (_field_id, field_type) in fields { + object = object.field(Field::new( + field_type.name.to_camel_string(), + TypeRef::named_nn(field_type.data_type_id().to_string()), + |_ctx| todo!(), + )) + } + + schema = schema.register(object); + } + DynDataType::Enum(name, variants) => { + if variants + .iter() + .any(|(_, variant)| variant.data_type_id != DynDataTypeId::Unit) + { + let mut union = Union::new(name.to_pascal_string()); + + for (_variant_id, variant_type) in variants { + union = + union.possible_type(variant_type.name.to_pascal_string()) + } + + schema = schema.register(union); + } else { + let mut r#enum = Enum::new(name.to_pascal_string()); + + for (_variant_id, variant_type) in variants { + r#enum = r#enum + .item(EnumItem::new(variant_type.name.to_pascal_string())) + } + + schema = schema.register(r#enum); + } + } + } + } + + for (_node_type_id, node_type) in &schema_type.node { + let mut node = + Object::new_node::(&node_type.name.to_pascal_string()); + + for (_field_id, field_type) in &node_type.fields { + match field_type { + DynNodeFieldType::Data(field_type) => { + node = node.data_field::( + field_type.name.to_camel_string(), + TypeRef::named_nn(field_type.data_type_id().to_string()), + ); + } + DynNodeFieldType::Ref(field_type) => { + node = node.ref_field::( + field_type.name.to_camel_string(), + TypeRef::named_nn(field_type.ref_node_type_id.to_string()), + ); + } + DynNodeFieldType::Connection(field_type) => { + node = node.connection_field::( + field_type.name.to_camel_string(), + TypeRef::named_nn(TypeRef::connection( + field_type.edge_type_id(), + )), + ); + } + } + } + + schema = schema.register(node); + } + + for (edge_type_id, edge_type) in &schema_type.edge { + let connection = Object::new_connection::( + edge_type_id.clone(), + edge_type.head_type_id().clone(), + ); + let connection_edge = Object::new_connection_edge::( + edge_type_id.clone(), + TypeRef::node(edge_type.head_type_id().clone()), + ); + + schema = schema.register(connection).register(connection_edge); + } + + schema = schema.data(resolver); + + for (_node_type_id, node_type) in &schema_type.node { + query = query.field( + Field::new( + node_type.name.to_camel_string(), + TypeRef::named(TypeRef::node(node_type.name.to_pascal_string())), + move |ctx| { + FieldFuture::new(async move { + let id = ctx.get_arg_string_nn("id")?; + + let resolver = ctx.resolver(); + let loader = resolver.locked_loader().await; + let node = + loader.load_node_one(&id.to_string()).await.unwrap(); + if let Some(node) = node { + // Ok(Some(FieldValue::value(node.clone()))) + Ok(Some(FieldValue::owned_any(node.clone()))) + } else { + Ok(None) + } + }) + }, + ) + .node_by_id_arguments(), + ); + } + + Self { schema, query } + } + + pub fn finish(self) -> Result { + let Self { schema, query } = self; + let schema = schema.register(query); + Ok(schema.finish().unwrap()) + } +} diff --git a/packages/fuel-indexer-graphql-dyn/src/schema/schema_type.rs b/packages/fuel-indexer-graphql-dyn/src/schema/schema_type.rs new file mode 100644 index 000000000..22215fd70 --- /dev/null +++ b/packages/fuel-indexer-graphql-dyn/src/schema/schema_type.rs @@ -0,0 +1,61 @@ +use super::data::*; +use super::edge::*; +use super::node::*; +use super::self_prelude::*; + +#[derive(Clone, Debug, Serialize, Deserialize, Default)] +pub struct DynSchemaType { + pub data: IndexMap, + pub node: IndexMap, + pub edge: IndexMap, +} + +impl DynSchemaType { + pub fn data(&self, id: &DynDataTypeId) -> &DynDataType { + match id { + DynDataTypeId::ID => Some(&DynDataType::ID), + DynDataTypeId::Name(name) => self.data.values().find(|data_type| { + dbg!(&data_type.name(), name); + data_type.name() == *name + }), + _ => self.data.get(id), + } + .unwrap_or_else(|| { + panic!("DynamicSchemaType::data_type: data type {:?} not found", id) + }) + } + pub fn node(&self, id: &DynNodeTypeId) -> &DynNodeType { + self.node.get(id).unwrap_or_else(|| { + panic!("DynamicSchemaType::node_type: node type {:?} not found", id) + }) + } + pub fn node_field( + &self, + id: &DynNodeTypeId, + field_id: &DynDataFieldId, + ) -> &DynNodeFieldType { + self.node(id).fields.get(field_id).unwrap_or_else(|| { + panic!( + "DynamicSchemaType::node_field: field {:?} not found", + field_id + ) + }) + } + pub fn edge(&self, id: &DynEdgeTypeId) -> &DynEdgeType { + self.edge.get(id).unwrap_or_else(|| { + panic!("DynamicSchemaType::edge_type: edge type {:?} not found", id) + }) + } + pub fn edge_field( + &self, + id: &DynEdgeTypeId, + field_id: &DynDataFieldId, + ) -> &DynDataFieldType { + self.edge(id).fields.get(field_id).unwrap_or_else(|| { + panic!( + "DynamicSchemaType::edge_field: field {:?} not found", + field_id + ) + }) + } +} diff --git a/packages/fuel-indexer-graphql-dyn/src/schema/schema_type_builder.rs b/packages/fuel-indexer-graphql-dyn/src/schema/schema_type_builder.rs new file mode 100644 index 000000000..45c2094ac --- /dev/null +++ b/packages/fuel-indexer-graphql-dyn/src/schema/schema_type_builder.rs @@ -0,0 +1,420 @@ +use super::data::*; +use super::edge::*; +use super::node::*; +use super::schema_type::*; +use super::self_prelude::*; + +#[derive(Clone, Debug, Serialize, Deserialize)] +pub struct DynSchemaTypeBuilder { + pub store: store::StoreType, + pub data: IndexMap, + pub node: IndexMap, + pub edge: IndexMap, +} + +#[derive(Clone, Debug, Serialize, Deserialize)] +pub enum DynDataTypeBuilder { + Object(DynObjectTypeBuilder), + Enum(DynEnumTypeBuilder), +} + +#[derive(Clone, Debug, Serialize, Deserialize)] +pub struct DynObjectTypeBuilder { + pub name: Name, + pub fields: IndexMap, +} + +#[derive(Clone, Debug, Serialize, Deserialize)] +pub struct DynEnumTypeBuilder { + pub name: Name, + pub variants: IndexMap, +} + +#[derive(Clone, Debug, Serialize, Deserialize)] +pub struct DynNodeTypeBuilder { + pub name: Name, + pub fields: IndexMap, +} + +#[derive(Clone, Debug, Serialize, Deserialize)] +pub enum DynNodeFieldTypeBuilder { + Data(DynDataFieldType), + Ref(DynNodeRefFieldType), + Connection(DynNodeConnectionFieldType), +} + +#[derive(Clone, Debug, Serialize, Deserialize)] +pub struct DynEdgeTypeBuilder { + pub name: Name, + pub tail: DynNodeTypeId, + pub head: DynNodeTypeId, + pub fields: IndexMap, +} + +impl DynSchemaTypeBuilder { + pub fn new(store_type: &store::StoreType) -> Self { + Self { + store: store_type.clone(), + data: Default::default(), + node: Default::default(), + edge: Default::default(), + } + .define_store_types() + } + + pub(super) fn define_store_types(mut self) -> Self { + let store = self.store.clone(); + for (_store_id, data) in &store.data { + use store::DataType::*; + match data { + Unit | Bool | U8 | U16 | U32 | U64 | B256 | Byte | Bytes | String => {} + Array(_id) => { + todo!() + } + Composite(name, fields) => { + let builder = self.define_object(name.to_pascal_string()); + for (field_id, field) in fields { + let field_type_id: DynDataTypeId = field.type_id.clone().into(); + builder.fields.insert( + field_id.clone(), + DynDataFieldType { + name: field.name.clone(), + data_type_id: field_type_id, + store_data_field_id: field_id.clone(), + }, + ); + } + } + Enum(name, variants) => { + let builder = self.define_enum(name.to_pascal_string()); + for (field_id, field) in variants { + let field_type_id: DynDataTypeId = field.type_id.clone().into(); + builder.variants.insert( + field_id.clone(), + DynDataFieldType { + name: field.name.clone(), + data_type_id: field_type_id, + store_data_field_id: field_id.clone(), + }, + ); + } + } + } + } + for (id, obj) in &store.obj { + let (_, node) = self.define_node(id); + for (field_id, field) in &obj.fields { + let field_type_id: DynDataTypeId = field.type_id.clone().into(); + node.define_data(field.name.clone(), field_id, field_type_id) + } + } + for (id, assoc) in &store.assoc { + let tail = assoc.tail.clone(); + let tail: DynNodeTypeId = tail.into(); + let head = assoc.head.clone(); + let head: DynNodeTypeId = head.into(); + let (_, edge) = self.define_edge(id, tail, head); + for (field_id, field) in &assoc.fields { + let field_type_id: DynDataTypeId = field.type_id.clone().into(); + edge.define_data(field.name.clone(), field_id, field_type_id) + } + } + self + } + pub fn define_enum(&mut self, name: impl Into) -> &mut DynEnumTypeBuilder { + let name = Name::new_pascal(name); + let id = DynDataTypeId::Name(name.clone()); + match self + .data + .entry(id) + .or_insert(DynDataTypeBuilder::Enum(DynEnumTypeBuilder::new(name))) + { + DynDataTypeBuilder::Enum(builder) => builder, + _ => unreachable!(), + } + } + pub fn define_object( + &mut self, + name: impl Into, + ) -> &mut DynObjectTypeBuilder { + let name = Name::new_pascal(name); + let id = DynDataTypeId::Name(name.clone()); + match self + .data + .entry(id) + .or_insert(DynDataTypeBuilder::Object(DynObjectTypeBuilder::new(name))) + { + DynDataTypeBuilder::Object(builder) => builder, + _ => unreachable!(), + } + } + pub fn define_node( + &mut self, + name: impl Into, + ) -> (DynNodeTypeId, &mut DynNodeTypeBuilder) { + let name = Name::new_pascal(name); + let id: DynNodeTypeId = name.to_pascal_string().into(); + ( + id.clone(), + self.node + .entry(id) + .or_insert_with(|| DynNodeTypeBuilder::new(name)), + ) + } + pub fn define_edge( + &mut self, + name: impl Into, + tail_type_id: impl Into, + head_type_id: impl Into, + ) -> (DynEdgeTypeId, &mut DynEdgeTypeBuilder) { + let name = Name::new_pascal(name); + let id: DynEdgeTypeId = name.to_pascal_string(); + ( + id.clone(), + self.edge.entry(id).or_insert_with(|| { + DynEdgeTypeBuilder::new(name, tail_type_id, head_type_id) + }), + ) + } + + pub fn finish(self) -> Result { + let mut data_types: IndexMap = Default::default(); + let mut node_types: IndexMap = Default::default(); + let mut edge_types: IndexMap = Default::default(); + + { + use DynDataType::*; + data_types.insert(DynDataTypeId::Unit, Unit); + data_types.insert(DynDataTypeId::Boolean, Boolean); + data_types.insert(DynDataTypeId::U8, U8); + data_types.insert(DynDataTypeId::U16, U16); + data_types.insert(DynDataTypeId::U32, U32); + data_types.insert(DynDataTypeId::U64, U64); + data_types.insert(DynDataTypeId::B256, B256); + data_types.insert(DynDataTypeId::Bytes, Bytes); + data_types.insert(DynDataTypeId::String, String); + } + + for (_id, data) in self.data { + let id = data.id(); + data_types.insert( + id, + match data { + DynDataTypeBuilder::Object(builder) => builder.finish().unwrap(), + DynDataTypeBuilder::Enum(builder) => builder.finish().unwrap(), + }, + ); + } + for (id, builder) in self.node { + let name = builder.name; + let mut fields: IndexMap = + Default::default(); + + for (field_id, field) in builder.fields { + match field { + DynNodeFieldType::Data(data_field) => { + fields.insert( + field_id.clone(), + DynNodeFieldType::Data(DynDataFieldType { + name: data_field.name.clone(), + data_type_id: data_field.data_type_id().clone(), + store_data_field_id: data_field + .store_data_field_id + .clone(), + }), + ); + } + DynNodeFieldType::Ref(ref_field) => { + fields.insert( + field_id.clone(), + DynNodeFieldType::Ref(DynNodeRefFieldType { + name: ref_field.name.clone(), + store_id: ref_field.store_id.clone(), + ref_node_type_id: ref_field.ref_node_type_id.clone(), + }), + ); + } + DynNodeFieldType::Connection(connection_field) => { + fields.insert( + field_id, + DynNodeFieldType::Connection(DynNodeConnectionFieldType { + name: connection_field.name.clone(), + edge_type_id: connection_field.edge_type_id.clone(), + }), + ); + } + } + } + + node_types.insert(id, DynNodeType { name, fields }); + } + for (id, builder) in self.edge { + let name = builder.name; + let tail_type_id = builder.tail.clone(); + let head_type_id = builder.head.clone(); + + let mut fields: IndexMap = + Default::default(); + for (field_name, field_type) in builder.fields { + let field_id = field_name.clone(); + fields.insert( + field_id, + DynDataFieldType { + name: field_type.name.clone(), + data_type_id: field_type.data_type_id().clone(), + store_data_field_id: field_type.store_data_field_id.clone(), + }, + ); + } + + edge_types.insert( + id, + DynEdgeType { + name, + tail: tail_type_id, + head: head_type_id, + fields, + }, + ); + } + + Ok(DynSchemaType { + data: data_types, + node: node_types, + edge: edge_types, + }) + } +} + +impl DynObjectTypeBuilder { + pub fn new(name: Name) -> Self { + Self { + name, + fields: Default::default(), + } + } + + pub fn finish(self) -> Result { + let name = self.name; + let fields = self + .fields + .into_iter() + .map(|(id, field)| (id, field)) + .collect(); + Ok(DynDataType::Object(name, fields)) + } +} + +impl DynEnumTypeBuilder { + pub fn new(name: Name) -> Self { + Self { + name, + variants: Default::default(), + } + } + + pub fn finish(self) -> Result { + let name = self.name; + let variants = self + .variants + .into_iter() + .map(|(id, field)| (id, field)) + .collect(); + Ok(DynDataType::Enum(name, variants)) + } +} + +impl DynDataTypeBuilder { + pub fn id(&self) -> DynDataTypeId { + match self { + Self::Object(DynObjectTypeBuilder { name, fields: _ }) => { + DynDataTypeId::Name(Name::new_pascal(format!("{}", name))) + } + Self::Enum(DynEnumTypeBuilder { name, variants: _ }) => { + DynDataTypeId::Name(Name::new_pascal(format!("{}", name))) + } + } + } +} + +impl DynNodeTypeBuilder { + pub fn new(name: Name) -> Self { + Self { + name, + fields: Default::default(), + } + } + + pub fn define_data( + &mut self, + name: Name, + data_field_id: impl Into, + data_type_id: impl Into, + ) { + let id = name.to_camel_string(); + let field = DynDataFieldType { + name, + data_type_id: data_type_id.into(), + store_data_field_id: data_field_id.into(), + }; + self.fields.insert(id, DynNodeFieldType::Data(field)); + } + pub fn define_ref( + &mut self, + name: impl Into, + data_field_id: impl Into, + node_type_id: &DynNodeTypeId, + ) { + let name = Name::new_camel(name); + let id = name.to_camel_string(); + let field = DynNodeRefFieldType { + name, + store_id: data_field_id.into(), + ref_node_type_id: node_type_id.clone(), + }; + self.fields.insert(id, DynNodeFieldType::Ref(field)); + } + pub fn define_connection( + &mut self, + name: impl Into, + edge_type_id: impl Into, + ) { + let name = Name::new_camel(name); + let id = name.to_camel_string(); + let field = DynNodeConnectionFieldType { + name, + edge_type_id: edge_type_id.into(), + }; + self.fields.insert(id, DynNodeFieldType::Connection(field)); + } +} + +impl DynEdgeTypeBuilder { + pub fn new( + name: Name, + tail: impl Into, + head: impl Into, + ) -> Self { + Self { + name, + tail: tail.into(), + head: head.into(), + fields: Default::default(), + } + } + + pub fn define_data( + &mut self, + name: Name, + data_field_id: impl Into, + data_type_id: impl Into, + ) { + let id = name.to_camel_string(); + let field = DynDataFieldType { + name, + data_type_id: data_type_id.into(), + store_data_field_id: data_field_id.into(), + }; + self.fields.insert(id, field); + } +} diff --git a/packages/fuel-indexer-graphql-lib/src/spec/connection.rs b/packages/fuel-indexer-graphql-dyn/src/spec/connection.rs similarity index 58% rename from packages/fuel-indexer-graphql-lib/src/spec/connection.rs rename to packages/fuel-indexer-graphql-dyn/src/spec/connection.rs index bf00230f0..0af0c49b4 100644 --- a/packages/fuel-indexer-graphql-lib/src/spec/connection.rs +++ b/packages/fuel-indexer-graphql-dyn/src/spec/connection.rs @@ -4,23 +4,27 @@ use super::node::*; use super::paging::*; -use super::prelude::*; +use super::self_prelude::*; #[extension_trait] pub impl ConnectionTypeRef for TypeRef { - fn edge(node_name: impl Into) -> String { - format!("{}Edge", node_name.into()) - } fn connection(node_name: impl Into) -> String { format!("{}Connection", node_name.into()) } + fn connection_edge(node_name: impl Into) -> String { + format!("{}Edge", node_name.into()) + } } #[extension_trait] -pub impl ConnectionObject for Object { - fn new_connection(node_name: impl Into) -> Self { +pub impl ConnectionObject for Object { + fn new_connection( + edge_name: impl Into, + node_name: impl Into, + ) -> Self { + let edge_name = edge_name.into(); let node_name = node_name.into(); - Self::new(TypeRef::connection(node_name.clone())) + Self::new(TypeRef::connection(&edge_name)) .field(Field::new( "totalCount", TypeRef::named_nn(TypeRef::INT), @@ -28,12 +32,12 @@ pub impl ConnectionObject for Object { )) .field(Field::new( "nodes", - TypeRef::named_nn_list_nn(node_name.clone()), + TypeRef::named_nn_list_nn(node_name), Resolver::resolve_nodes, )) .field(Field::new( "edges", - TypeRef::named_nn_list_nn(TypeRef::edge(node_name)), + TypeRef::named_nn_list_nn(TypeRef::connection_edge(&edge_name)), Resolver::resolve_edges, )) .field(Field::new( @@ -52,9 +56,12 @@ pub trait ConnectionResolver: Send + Sync + 'static { } #[extension_trait] -pub impl EdgeObject for Object { - fn new_edge(name: impl Into, head_name: impl Into) -> Self { - Self::new(TypeRef::edge(name)) +pub impl ConnectionEdgeObject for Object { + fn new_connection_edge( + name: impl Into, + head_name: impl Into, + ) -> Self { + Self::new(TypeRef::connection_edge(name)) .field(Field::new( "node", TypeRef::named_nn(TypeRef::node(head_name)), @@ -68,35 +75,16 @@ pub impl EdgeObject for Object { } } -pub trait EdgeResolver: Send + Sync + 'static { +pub trait ConnectionEdgeResolver: Send + Sync + 'static { fn resolve_node(ctx: ResolverContext) -> FieldFuture; fn resolve_cursor(ctx: ResolverContext) -> FieldFuture; } #[extension_trait] -pub impl FieldConnectionExt for Field { +pub impl ConnectionField for Field { /// Add connection arguments to a field. /// See: https://relay.dev/graphql/connections.htm#sec-Arguments fn connection_arguments(self) -> Self { - // Forward pagination arguments - self.argument( - InputValue::new("first", TypeRef::named(TypeRef::INT)).description( - "Paginate forward, returning the given amount of edges at most.", - ), - ) - .argument( - InputValue::new("after", TypeRef::named(TypeRef::CURSOR)) - .description("Return edges after the given cursor."), - ) - // Backward pagination arguments - .argument( - InputValue::new("last", TypeRef::named(TypeRef::INT)).description( - "Paginate backward, returning the given amount of edges at most.", - ), - ) - .argument( - InputValue::new("before", TypeRef::named(TypeRef::CURSOR)) - .description("Return edges before the given cursor."), - ) + self.pagination_arguments() } } diff --git a/packages/fuel-indexer-graphql-lib/src/spec/mod.rs b/packages/fuel-indexer-graphql-dyn/src/spec/mod.rs similarity index 91% rename from packages/fuel-indexer-graphql-lib/src/spec/mod.rs rename to packages/fuel-indexer-graphql-dyn/src/spec/mod.rs index a3e776fd3..ef893dd1e 100644 --- a/packages/fuel-indexer-graphql-lib/src/spec/mod.rs +++ b/packages/fuel-indexer-graphql-dyn/src/spec/mod.rs @@ -14,14 +14,13 @@ pub mod node; pub mod paging; pub mod query; +pub(self) mod self_prelude { + pub use super::super::self_prelude::*; + pub use async_graphql::dynamic::*; + pub use std::{hash::Hash, str::FromStr}; +} + pub use connection::*; pub use node::*; pub use paging::*; pub use query::*; - -pub(self) mod prelude { - pub use crate::prelude::*; - pub use crate::util::*; - pub use async_graphql::dynamic::*; - pub use std::{hash::Hash, str::FromStr}; -} diff --git a/packages/fuel-indexer-graphql-lib/src/spec/node.rs b/packages/fuel-indexer-graphql-dyn/src/spec/node.rs similarity index 71% rename from packages/fuel-indexer-graphql-lib/src/spec/node.rs rename to packages/fuel-indexer-graphql-dyn/src/spec/node.rs index b55a1cbb8..011802394 100644 --- a/packages/fuel-indexer-graphql-lib/src/spec/node.rs +++ b/packages/fuel-indexer-graphql-dyn/src/spec/node.rs @@ -2,7 +2,7 @@ //! See: https://graphql.org/learn/global-object-identification/#node-interface use super::connection::*; -use super::prelude::*; +use super::self_prelude::*; #[extension_trait] pub impl NodeTypeRef for TypeRef { @@ -21,8 +21,8 @@ pub impl NodeInterface for Interface { } #[extension_trait] -pub impl NodeObject for Object { - fn new_node(name: impl Into) -> Self { +pub impl NodeObject for Object { + fn new_node(name: impl Into) -> Self { Self::new(TypeRef::node(name)) .implement(TypeRef::NODE) .field(Field::new( @@ -32,13 +32,25 @@ pub impl NodeObject for Object { )) } - fn data_field(self, name: impl Into, ty: impl Into) -> Self { + fn data_field( + self, + name: impl Into, + ty: impl Into, + ) -> Self { self.field(Field::new(name, ty, Resolver::resolve_data)) } - fn ref_field(self, name: impl Into, ty: impl Into) -> Self { + fn ref_field( + self, + name: impl Into, + ty: impl Into, + ) -> Self { self.field(Field::new(name, ty, Resolver::resolve_ref)) } - fn connection_field(self, name: impl Into, ty: impl Into) -> Self { + fn connection_field( + self, + name: impl Into, + ty: impl Into, + ) -> Self { self.field( Field::new(name, ty, Resolver::resolve_connection).connection_arguments(), ) diff --git a/packages/fuel-indexer-graphql-dyn/src/spec/paging.rs b/packages/fuel-indexer-graphql-dyn/src/spec/paging.rs new file mode 100644 index 000000000..d4fdceb2d --- /dev/null +++ b/packages/fuel-indexer-graphql-dyn/src/spec/paging.rs @@ -0,0 +1,81 @@ +//! `async_graphql::dynamic` extensions for handling pagination. +//! See: https://graphql.org/learn/pagination/ + +use super::self_prelude::*; + +pub type Cursor = String; + +#[extension_trait] +pub impl PagingTypeRef for TypeRef { + const CURSOR: &'static str = "String"; + const PAGE_INFO: &'static str = "PageInfo"; +} + +#[extension_trait] +pub impl PagingField for Field { + fn pagination_arguments(self) -> Self { + self.forward_pagination_arguments() + .backward_pagination_arguments() + } + /// Add forward pagination arguments to a field. + /// See: https://relay.dev/graphql/connections.htm#sec-Forward-pagination-arguments + fn forward_pagination_arguments(self) -> Self { + self.argument( + InputValue::new("first", TypeRef::named(TypeRef::INT)).description( + "Paginate forward, returning the given amount of edges at most.", + ), + ) + .argument( + InputValue::new("after", TypeRef::named(TypeRef::CURSOR)) + .description("Return edges after the given cursor."), + ) + } + /// Add backward pagination arguments to a field. + /// See: https://relay.dev/graphql/connections.htm#sec-Backward-pagination-arguments + fn backward_pagination_arguments(self) -> Self { + self.argument( + InputValue::new("last", TypeRef::named(TypeRef::INT)).description( + "Paginate backward, returning the given amount of edges at most.", + ), + ) + .argument( + InputValue::new("before", TypeRef::named(TypeRef::CURSOR)) + .description("Return edges before the given cursor."), + ) + } +} + +/// See: https://relay.dev/graphql/connections.htm#sec-PageInfo +#[extension_trait] +pub impl PageInfoObject for Object { + fn new_page_info() -> Self { + Self::new(TypeRef::PAGE_INFO) + .field(Field::new( + "hasNextPage", + TypeRef::named_nn(TypeRef::BOOLEAN), + Resolver::resolve_has_next_page, + )) + .field(Field::new( + "hasPreviousPage", + TypeRef::named_nn(TypeRef::BOOLEAN), + Resolver::resolve_has_previous_page, + )) + .field(Field::new( + "startCursor", + TypeRef::named(TypeRef::CURSOR), + Resolver::resolve_start_cursor, + )) + .field(Field::new( + "endCursor", + TypeRef::named(TypeRef::CURSOR), + Resolver::resolve_end_cursor, + )) + } +} + +pub trait PageInfoResolver: Send + Sync + 'static { + fn resolve_has_next_page(ctx: ResolverContext) -> FieldFuture; + fn resolve_has_previous_page(ctx: ResolverContext) -> FieldFuture; + fn resolve_start_cursor(ctx: ResolverContext) -> FieldFuture; + fn resolve_end_cursor(ctx: ResolverContext) -> FieldFuture; +} diff --git a/packages/fuel-indexer-graphql-lib/src/spec/query.rs b/packages/fuel-indexer-graphql-dyn/src/spec/query.rs similarity index 78% rename from packages/fuel-indexer-graphql-lib/src/spec/query.rs rename to packages/fuel-indexer-graphql-dyn/src/spec/query.rs index 7597dd9e1..c71523a01 100644 --- a/packages/fuel-indexer-graphql-lib/src/spec/query.rs +++ b/packages/fuel-indexer-graphql-dyn/src/spec/query.rs @@ -3,7 +3,7 @@ //! See: https://relay.dev/graphql/connections.htm#sec-Connection-Types use super::node::*; -use super::prelude::*; +use super::self_prelude::*; #[extension_trait] pub impl QueryTypeRef for TypeRef { @@ -11,16 +11,15 @@ pub impl QueryTypeRef for TypeRef { } #[extension_trait] -pub impl QueryObject for Object { - fn new_query() -> Self { - let mut object = Self::new(TypeRef::QUERY); - object = QueryObject::::node_by_id_field(object); - object = QueryObject::::node_by_ids_field(object); - object +pub impl QueryObject for Object { + fn new_query() -> Self { + Self::new(TypeRef::QUERY) + .node_by_id_field::() + .node_by_ids_field::() } /// See: https://graphql.org/learn/global-object-identification/#node-root-field - fn node_by_id_field(self) -> Self { + fn node_by_id_field(self) -> Self { self.field( Field::new( "node", @@ -31,12 +30,12 @@ pub impl QueryObject for Object { ) } /// See: https://graphql.org/learn/global-object-identification/#plural-identifying-root-fields - fn node_by_ids_field(self) -> Self { + fn node_by_ids_field(self) -> Self { self.field( Field::new( "nodes", TypeRef::named_list_nn(TypeRef::NODE), - Resolver::resolve_node_by_ids, + Resolver::resolve_nodes_by_id, ) .node_by_ids_arguments(), ) @@ -45,7 +44,7 @@ pub impl QueryObject for Object { pub trait QueryResolver: Send + Sync + 'static { fn resolve_node_by_id(ctx: ResolverContext) -> FieldFuture; - fn resolve_node_by_ids(ctx: ResolverContext) -> FieldFuture; + fn resolve_nodes_by_id(ctx: ResolverContext) -> FieldFuture; } #[extension_trait] diff --git a/packages/fuel-indexer-graphql-dyn/src/store/assoc.rs b/packages/fuel-indexer-graphql-dyn/src/store/assoc.rs new file mode 100644 index 000000000..c1960e16d --- /dev/null +++ b/packages/fuel-indexer-graphql-dyn/src/store/assoc.rs @@ -0,0 +1,24 @@ +use super::assoc_type::*; +use super::data::*; +use super::obj::*; +use super::self_prelude::*; + +pub type AssocTime = u64; + +#[derive(Clone, Debug, Serialize, Deserialize, Hash, PartialEq, Eq)] +pub struct AssocKey(pub ObjId, pub AssocTypeId); + +#[derive(Clone, Debug, Serialize, Deserialize)] +pub struct Assoc(pub ObjId, pub AssocTime, pub Data); + +impl Assoc { + pub fn id(&self) -> &ObjId { + &self.0 + } + pub fn time(&self) -> &AssocTime { + &self.1 + } + pub fn data(&self) -> &Data { + &self.2 + } +} diff --git a/packages/fuel-indexer-graphql-dyn/src/store/assoc_type.rs b/packages/fuel-indexer-graphql-dyn/src/store/assoc_type.rs new file mode 100644 index 000000000..c38fec640 --- /dev/null +++ b/packages/fuel-indexer-graphql-dyn/src/store/assoc_type.rs @@ -0,0 +1,14 @@ +use super::data_type::*; +use super::meta::*; +use super::obj_type::*; +use super::self_prelude::*; + +pub type AssocTypeId = String; + +#[derive(Clone, Debug, Serialize, Deserialize)] +pub struct AssocType { + pub name: Name, + pub tail: ObjTypeId, + pub head: ObjTypeId, + pub fields: IndexMap, +} diff --git a/packages/fuel-indexer-graphql-dyn/src/store/data.rs b/packages/fuel-indexer-graphql-dyn/src/store/data.rs new file mode 100644 index 000000000..eddf97187 --- /dev/null +++ b/packages/fuel-indexer-graphql-dyn/src/store/data.rs @@ -0,0 +1,25 @@ +use super::data_type::*; +use super::self_prelude::*; + +#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq)] +pub enum Data { + Json(serde_json::Value), +} + +impl Data { + pub fn r#type(&self) -> &DataTypeId { + todo!() + } + + pub fn value(&self) -> &serde_json::Value { + match self { + Self::Json(json) => json, + } + } +} + +impl From for Data { + fn from(value: serde_json::Value) -> Self { + Self::Json(value) + } +} diff --git a/packages/fuel-indexer-graphql-dyn/src/store/data_type.rs b/packages/fuel-indexer-graphql-dyn/src/store/data_type.rs new file mode 100644 index 000000000..87600db09 --- /dev/null +++ b/packages/fuel-indexer-graphql-dyn/src/store/data_type.rs @@ -0,0 +1,107 @@ +use super::meta::*; +use super::self_prelude::*; + +#[derive(Clone, Debug, Serialize, Deserialize, Hash, PartialEq, Eq, PartialOrd, Ord)] +pub enum DataTypeId { + Unit, + Bool, + U8, + U16, + U32, + U64, + B256, + Byte, + Bytes, + String, + Array(Box), + Name(Name), +} + +#[derive(Clone, Debug, Serialize, Deserialize)] +pub enum DataType { + Unit, + Bool, + U8, + U16, + U32, + U64, + B256, + Byte, + Bytes, + String, + Array(Box), + Composite(Name, IndexMap), + Enum(Name, IndexMap), +} + +pub type DataFieldId = String; + +#[derive(Clone, Debug, Serialize, Deserialize)] +pub struct DataFieldType { + pub name: Name, + pub type_id: DataTypeId, +} + +impl DataType { + pub fn name(&self) -> Name { + match self { + Self::Unit => Name::new_pascal("Unit"), + Self::Bool => Name::new_pascal("Boolean"), + Self::U8 => Name::new_pascal("U8"), + Self::U16 => Name::new_pascal("U16"), + Self::U32 => Name::new_pascal("U32"), + Self::U64 => Name::new_pascal("U64"), + Self::B256 => Name::new_pascal("B256"), + Self::Byte => Name::new_pascal("Byte"), + Self::Bytes => Name::new_pascal("Bytes"), + Self::String => Name::new_pascal("String"), + Self::Array(ty) => Name::new_pascal(format!("[{}]", ty)), + Self::Composite(name, _) => name.clone(), + Self::Enum(name, _) => name.clone(), + } + } +} + +impl FromStr for DataTypeId { + type Err = anyhow::Error; + fn from_str(str: &str) -> anyhow::Result { + match str { + "Unit" => Ok(Self::Unit), + "Boolean" => Ok(Self::Bool), + "U8" => Ok(Self::U8), + "U16" => Ok(Self::U16), + "U32" => Ok(Self::U32), + "U64" => Ok(Self::U64), + "B256" => Ok(Self::B256), + "Byte" => Ok(Self::Byte), + "Bytes" => Ok(Self::Bytes), + "String" => Ok(Self::String), + str if str.starts_with("Array__") => { + todo!() + } + str => { + let name = str.to_string(); + Ok(Self::Name(Name::new_pascal(name))) + } + } + } +} + +impl std::fmt::Display for DataTypeId { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match self { + Self::Unit => write!(f, "Unit"), + Self::Bool => write!(f, "Boolean"), + Self::U8 => write!(f, "U8"), + Self::U16 => write!(f, "U16"), + Self::U32 => write!(f, "U32"), + Self::U64 => write!(f, "U64"), + Self::B256 => write!(f, "B256"), + Self::Byte => write!(f, "Byte"), + Self::Bytes => write!(f, "Bytes"), + Self::String => write!(f, "String"), + Self::Array(ty) => write!(f, "[{}]", ty), + Self::Name(id) => write!(f, "{}", id), + } + } +} diff --git a/packages/fuel-indexer-graphql-dyn/src/store/meta.rs b/packages/fuel-indexer-graphql-dyn/src/store/meta.rs new file mode 100644 index 000000000..75c65a453 --- /dev/null +++ b/packages/fuel-indexer-graphql-dyn/src/store/meta.rs @@ -0,0 +1,48 @@ +use super::self_prelude::*; +use convert_case::{Case, Casing, StateConverter}; + +#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq, PartialOrd, Ord, Hash)] +pub enum Name { + Pascal(String), + Snake(String), + Camel(String), +} + +impl Name { + pub fn new_pascal(name: impl Into) -> Self { + Self::Pascal(name.into()) + } + pub fn new_snake(name: impl Into) -> Self { + Self::Snake(name.into()) + } + pub fn new_camel(name: impl Into) -> Self { + Self::Camel(name.into()) + } + + pub fn to_converter(&self) -> StateConverter { + match self { + Name::Pascal(name) => name.from_case(Case::Pascal), + Name::Snake(name) => name.from_case(Case::Snake), + Name::Camel(name) => name.from_case(Case::Camel), + } + } + pub fn to_pascal_string(&self) -> String { + self.to_converter().to_case(Case::Pascal) + } + pub fn to_snake_string(&self) -> String { + self.to_converter().to_case(Case::Snake) + } + pub fn to_camel_string(&self) -> String { + self.to_converter().to_case(Case::Camel) + } +} + +impl fmt::Display for Name { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match self { + Name::Pascal(name) => write!(f, "{}", name), + Name::Snake(name) => write!(f, "{}", name), + Name::Camel(name) => write!(f, "{}", name), + } + } +} diff --git a/packages/fuel-indexer-graphql-dyn/src/store/mod.rs b/packages/fuel-indexer-graphql-dyn/src/store/mod.rs new file mode 100644 index 000000000..916aa3bc3 --- /dev/null +++ b/packages/fuel-indexer-graphql-dyn/src/store/mod.rs @@ -0,0 +1,30 @@ +pub mod assoc; +pub mod assoc_type; +pub mod data; +pub mod data_type; +pub mod meta; +pub mod obj; +pub mod obj_type; +#[allow(clippy::module_inception)] +pub mod store; +pub mod store_type; +pub mod store_type_builder; + +pub(self) mod self_prelude { + pub use super::super::self_prelude::*; + pub use indexmap::IndexMap; + pub use serde::{Deserialize, Serialize}; + pub use std::fmt; + pub use std::str::FromStr; +} + +pub use assoc::*; +pub use assoc_type::*; +pub use data::*; +pub use data_type::*; +pub use meta::*; +pub use obj::*; +pub use obj_type::*; +pub use store::*; +pub use store_type::*; +pub use store_type_builder::*; diff --git a/packages/fuel-indexer-graphql-dyn/src/store/obj.rs b/packages/fuel-indexer-graphql-dyn/src/store/obj.rs new file mode 100644 index 000000000..60506f75d --- /dev/null +++ b/packages/fuel-indexer-graphql-dyn/src/store/obj.rs @@ -0,0 +1,21 @@ +use super::data::*; +use super::obj_type::*; +use super::self_prelude::*; + +pub type ObjId = String; + +#[derive(Clone, Debug, Serialize, Deserialize)] +pub struct Obj(pub ObjTypeId, pub Data); + +impl Obj { + pub fn new(obj_type_id: ObjTypeId, data: Data) -> Self { + Self(obj_type_id, data) + } + + pub fn type_id(&self) -> &ObjTypeId { + &self.0 + } + pub fn data(&self) -> &Data { + &self.1 + } +} diff --git a/packages/fuel-indexer-graphql-dyn/src/store/obj_type.rs b/packages/fuel-indexer-graphql-dyn/src/store/obj_type.rs new file mode 100644 index 000000000..db7395bc9 --- /dev/null +++ b/packages/fuel-indexer-graphql-dyn/src/store/obj_type.rs @@ -0,0 +1,11 @@ +use super::data_type::*; +use super::meta::*; +use super::self_prelude::*; + +pub type ObjTypeId = String; + +#[derive(Clone, Debug, Serialize, Deserialize)] +pub struct ObjType { + pub name: Name, + pub fields: IndexMap, +} diff --git a/packages/fuel-indexer-graphql-dyn/src/store/store.rs b/packages/fuel-indexer-graphql-dyn/src/store/store.rs new file mode 100644 index 000000000..028732959 --- /dev/null +++ b/packages/fuel-indexer-graphql-dyn/src/store/store.rs @@ -0,0 +1,51 @@ +use super::assoc::*; +use super::obj::*; +use super::self_prelude::*; +use super::store_type::*; + +type Result = anyhow::Result; + +/// See: https://research.facebook.com/publications/tao-facebooks-distributed-data-store-for-the-social-graph/ +#[async_trait] +pub trait Store: Send + Sync { + /// Returns the type of the store. + fn r#type(&self) -> &StoreType; + // + /// Gets a single object by its ID. + async fn obj_get(&self, id: &ObjId) -> Result>; + /// Gets objects by their IDs. + async fn obj_get_many(&self, ids: &[ObjId]) -> Result>>; + // Gets associations of an object by their head IDs. + async fn assoc_get( + &self, + key: &AssocKey, + ids: &[ObjId], + high: Option, + low: Option, + ) -> Result>>; + // Gets the count of associations an object has. + async fn assoc_count(&self, key: &AssocKey) -> Result; + // Gets associations of an object. + async fn assoc_range( + &self, + key: &AssocKey, + offset: u64, + limit: u64, + ) -> Result>; + // Gets associations of an object in the given time range. + async fn assoc_time_range( + &self, + key: &AssocKey, + high: AssocTime, + low: AssocTime, + limit: u64, + ) -> Result>; +} + +pub type StoreResult = anyhow::Result; + +#[derive(thiserror::Error, Debug)] +pub enum StoreError { + #[error(transparent)] + Other(#[from] anyhow::Error), +} diff --git a/packages/fuel-indexer-graphql-dyn/src/store/store_type.rs b/packages/fuel-indexer-graphql-dyn/src/store/store_type.rs new file mode 100644 index 000000000..02e71e04d --- /dev/null +++ b/packages/fuel-indexer-graphql-dyn/src/store/store_type.rs @@ -0,0 +1,23 @@ +use super::assoc_type::*; +use super::data_type::*; +use super::obj_type::*; +use super::self_prelude::*; + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct StoreType { + pub data: IndexMap, + pub obj: IndexMap, + pub assoc: IndexMap, +} + +impl StoreType { + pub fn data_type(&self, id: &DataTypeId) -> &DataType { + self.data.get(id).unwrap() + } + pub fn obj_type(&self, id: &ObjTypeId) -> &ObjType { + self.obj.get(id).unwrap() + } + pub fn assoc_type(&self, id: &AssocTypeId) -> &AssocType { + self.assoc.get(id).unwrap() + } +} diff --git a/packages/fuel-indexer-graphql-dyn/src/store/store_type_builder.rs b/packages/fuel-indexer-graphql-dyn/src/store/store_type_builder.rs new file mode 100644 index 000000000..0a154c51f --- /dev/null +++ b/packages/fuel-indexer-graphql-dyn/src/store/store_type_builder.rs @@ -0,0 +1,324 @@ +use super::assoc_type::*; +use super::data_type::*; +use super::meta::*; +use super::obj_type::*; +use super::self_prelude::*; +use super::store_type::*; + +#[derive(Debug, Clone, Serialize, Deserialize, Default)] +pub struct StoreTypeBuilder { + pub data: IndexMap, + pub obj: IndexMap, + pub assoc: IndexMap, +} + +#[derive(Clone, Debug, Serialize, Deserialize)] +pub enum DataTypeBuilder { + Composite(StructTypeBuilder), + Enum(EnumTypeBuilder), +} + +#[derive(Clone, Debug, Serialize, Deserialize)] +pub struct StructTypeBuilder { + pub name: Name, + pub fields: IndexMap, +} + +#[derive(Clone, Debug, Serialize, Deserialize)] +pub struct EnumTypeBuilder { + pub name: Name, + pub variants: IndexMap, +} + +#[derive(Clone, Debug, Serialize, Deserialize)] +pub struct ObjTypeBuilder { + pub name: Name, + pub fields: IndexMap, +} + +#[derive(Clone, Debug, Serialize, Deserialize)] +pub struct AssocTypeBuilder { + pub name: Name, + pub tail: ObjTypeId, + pub head: ObjTypeId, + pub fields: IndexMap, +} + +impl StoreTypeBuilder { + pub fn data( + &mut self, + name: impl Into, + ) -> (DataTypeId, &mut DataTypeBuilder) { + let name = Name::new_pascal(name); + self.data + .iter_mut() + .find(|(_, data)| data.name() == name) + .map(|(id, data)| (id.clone(), data)) + .unwrap_or_else(|| panic!("Data not found: {}", name)) + } + pub fn obj(&mut self, name: impl Into) -> (ObjTypeId, &mut ObjTypeBuilder) { + let name = Name::new_pascal(name); + self.obj + .values_mut() + .find(|obj| obj.name == name) + .map(|obj| (obj.name.to_snake_string(), obj)) + .unwrap_or_else(|| panic!("Obj not found: {}", name)) + } + pub fn assoc( + &mut self, + tail: &ObjTypeId, + verb: impl Into, + head: &ObjTypeId, + ) -> (AssocTypeId, &mut AssocTypeBuilder) { + let verb = verb.into(); + let name = format!("{}{}{}", tail, verb, head); + let name = Name::new_pascal(name); + self.assoc + .values_mut() + .find(|assoc| assoc.name == name) + .map(|assoc| (assoc.name.to_snake_string(), assoc)) + .unwrap_or_else(|| panic!("Assoc not found: {}", name)) + } + + pub fn define_enum( + &mut self, + name: impl Into, + ) -> (DataTypeId, &mut EnumTypeBuilder) { + let name = Name::new_pascal(name); + let id = DataTypeId::Name(name.clone()); + + let builder = self + .data + .entry(id.clone()) + .or_insert_with(|| DataTypeBuilder::Enum(EnumTypeBuilder::new(name))); + match builder { + DataTypeBuilder::Enum(builder) => (id, builder), + _ => panic!("Expected enum type builder"), + } + } + pub fn define_composite( + &mut self, + name: impl Into, + ) -> (DataTypeId, &mut StructTypeBuilder) { + let name = Name::new_pascal(name); + let id = DataTypeId::Name(name.clone()); + + let builder = self + .data + .entry(id.clone()) + .or_insert_with(|| DataTypeBuilder::Composite(StructTypeBuilder::new(name))); + match builder { + DataTypeBuilder::Composite(builder) => (id, builder), + _ => panic!("Expected enum type builder"), + } + } + pub fn define_obj( + &mut self, + name: impl Into, + ) -> (ObjTypeId, &mut ObjTypeBuilder) { + let name = name.into(); + let id = name.clone(); + ( + id.clone(), + self.obj + .entry(id) + .or_insert_with(|| ObjTypeBuilder::new(name)), + ) + } + pub fn define_assoc( + &mut self, + tail: &ObjTypeId, + verb: impl Into, + head: &ObjTypeId, + ) -> (ObjTypeId, &mut AssocTypeBuilder) { + let verb = verb.into(); + let name = Name::new_pascal(format!("{}{}{}", tail, verb, head)); + let id = name.to_pascal_string(); + ( + id.clone(), + self.assoc + .entry(id) + .or_insert_with(|| AssocTypeBuilder::new(&name, tail, head)), + ) + } + + pub fn finish(self) -> Result { + let mut data_types: IndexMap = Default::default(); + let mut obj_types: IndexMap = Default::default(); + let mut assoc_types: IndexMap = Default::default(); + + { + use DataType::*; + data_types.insert(DataTypeId::Unit, Unit); + data_types.insert(DataTypeId::Bool, Bool); + data_types.insert(DataTypeId::U8, U8); + data_types.insert(DataTypeId::U16, U16); + data_types.insert(DataTypeId::U32, U32); + data_types.insert(DataTypeId::U64, U64); + data_types.insert(DataTypeId::B256, B256); + data_types.insert(DataTypeId::Byte, Byte); + data_types.insert(DataTypeId::Bytes, Bytes); + data_types.insert(DataTypeId::String, String); + } + + for (id, builder) in self.data { + data_types.insert(id, builder.finish().unwrap()); + } + for (id, builder) in self.obj { + let name = builder.name; + let mut fields: IndexMap = Default::default(); + + for (field_name, type_id) in builder.fields { + fields.insert(field_name.clone(), type_id.clone()); + } + + obj_types.insert(id, ObjType { name, fields }); + } + for (id, builder) in self.assoc { + let name = builder.name; + let tail = builder.tail; + let head = builder.head; + let mut fields: IndexMap = Default::default(); + + for (field_name, type_id) in builder.fields { + fields.insert(field_name.clone(), type_id.clone()); + } + + assoc_types.insert( + id, + AssocType { + name, + tail, + head, + fields, + }, + ); + } + + Ok(StoreType { + data: data_types, + obj: obj_types, + assoc: assoc_types, + }) + } +} + +impl DataTypeBuilder { + pub fn name(&self) -> Name { + match self { + Self::Composite(builder) => builder.name.clone(), + Self::Enum(builder) => builder.name.clone(), + } + } +} + +impl StructTypeBuilder { + pub fn new(name: Name) -> Self { + Self { + name, + fields: Default::default(), + } + } + + pub fn define_field(&mut self, name: impl Into, type_id: &DataTypeId) { + let name = Name::new_snake(name); + let id = name.to_snake_string(); + self.fields.insert( + id, + DataFieldType { + name, + type_id: type_id.clone(), + }, + ); + } +} + +impl EnumTypeBuilder { + pub fn new(name: Name) -> Self { + Self { + name, + variants: Default::default(), + } + } + + pub fn define_variant(&mut self, name: impl Into, type_id: &DataTypeId) { + let name = Name::new_pascal(name); + let id = name.to_snake_string(); + self.variants.insert( + id, + DataFieldType { + name, + type_id: type_id.clone(), + }, + ); + } +} + +impl DataTypeBuilder { + pub fn finish(self) -> Result { + match self { + Self::Composite(builder) => { + let mut fields: IndexMap = Default::default(); + for (field_name, field_type) in builder.fields { + fields.insert(field_name, field_type); + } + Ok(DataType::Composite(builder.name, fields)) + } + Self::Enum(builder) => { + let mut variants: IndexMap = Default::default(); + for (variant_name, variant_type) in builder.variants { + variants.insert(variant_name, variant_type); + } + Ok(DataType::Enum(builder.name, variants)) + } + } + } +} + +impl ObjTypeBuilder { + pub fn new(name: String) -> Self { + let name = Name::new_pascal(name); + Self { + name, + fields: Default::default(), + } + } + + pub fn define_field(&mut self, name: impl Into, type_id: &DataTypeId) { + let name = Name::new_snake(name); + let id = name.to_snake_string(); + self.fields.insert( + id, + DataFieldType { + name, + type_id: type_id.clone(), + }, + ); + } +} + +impl AssocTypeBuilder { + pub fn new(name: &Name, tail: &ObjTypeId, head: &ObjTypeId) -> Self { + let name = name.clone(); + let tail = tail.clone(); + let head = head.clone(); + Self { + name, + tail, + head, + fields: Default::default(), + } + } + + pub fn define_field(&mut self, name: impl Into, type_id: &DataTypeId) { + let name = Name::new_snake(name); + let id = name.to_snake_string(); + self.fields.insert( + id, + DataFieldType { + name, + type_id: type_id.clone(), + }, + ); + } +} diff --git a/packages/fuel-indexer-graphql-dyn/src/testing/mod.rs b/packages/fuel-indexer-graphql-dyn/src/testing/mod.rs new file mode 100644 index 000000000..4a2103044 --- /dev/null +++ b/packages/fuel-indexer-graphql-dyn/src/testing/mod.rs @@ -0,0 +1,22 @@ +pub mod schema; +pub mod schema_type; +pub mod store; +pub mod store_type; + +pub(self) mod self_prelude { + pub use super::super::self_prelude::*; + pub use indexmap::IndexMap; + pub use lazy_static::lazy_static; + pub use serde_json::json; + pub use std::sync::Arc; + pub use tokio::sync::Mutex; +} + +pub use schema::*; +pub use schema_type::*; +pub use store::*; +pub use store_type::*; + +pub mod prelude { + pub use super::*; +} diff --git a/packages/fuel-indexer-graphql-dyn/src/testing/schema.rs b/packages/fuel-indexer-graphql-dyn/src/testing/schema.rs new file mode 100644 index 000000000..8e0f5b6ac --- /dev/null +++ b/packages/fuel-indexer-graphql-dyn/src/testing/schema.rs @@ -0,0 +1,43 @@ +use super::schema_type::*; +use super::self_prelude::*; +use super::store::*; +use crate::schema::*; + +use async_graphql::dynamic::*; +use graphql_parser::{parse_schema, Style}; + +#[extension_trait] +pub impl TestSchema for Schema { + fn build_test() -> DynSchemaBuilder { + let store = new_test_store().unwrap(); + let schema_type = new_test_schema_type(&store.r#type).unwrap(); + DynSchemaBuilder::new(&schema_type, Arc::new(Mutex::new(store))) + } + + fn pretty_sdl(&self) -> String { + let sdl = self.sdl(); + let ugly = parse_schema::<&str>(&sdl).unwrap(); + ugly.format(&Style::default()) + } +} + +#[cfg(test)] +mod tests { + use assert_matches::assert_matches; + use insta::assert_snapshot; + + use super::*; + + #[tokio::test] + async fn sdl() { + // Build the schema + let schema = Schema::build_test(); + let schema = schema.finish(); + assert_matches!(schema, Ok(_)); + let schema = schema.unwrap(); + + // Print the schema + let text = schema.pretty_sdl(); + assert_snapshot!(text); + } +} diff --git a/packages/fuel-indexer-graphql-dyn/src/testing/schema_type.rs b/packages/fuel-indexer-graphql-dyn/src/testing/schema_type.rs new file mode 100644 index 000000000..d5caa2bdb --- /dev/null +++ b/packages/fuel-indexer-graphql-dyn/src/testing/schema_type.rs @@ -0,0 +1,46 @@ +use crate::schema::*; +use crate::store::*; + +pub fn new_test_schema_type(store_type: &StoreType) -> Result { + let mut schema_type = DynSchemaTypeBuilder::new(store_type); + + let (chain_id, chain) = schema_type.define_node("Chain"); + chain.define_connection("blocks", "ChainHasBlock"); + chain.define_connection("transactions", "ChainHasTransaction"); + + let (block_id, block) = schema_type.define_node("Block"); + block.define_ref("chain", "chain_id", &chain_id); + block.define_connection("transactions", "BlockHasTransaction"); + + let (_transaction_id, transaction) = schema_type.define_node("Transaction"); + transaction.define_ref("chain", "chain_id", &chain_id); + transaction.define_ref("block", "block_hash", &block_id); + + let _chain_has_block = schema_type.define_edge( + "ChainHasBlock", + "Chain".to_string(), + "Block".to_string(), + ); + let _chain_has_transaction = schema_type.define_edge( + "ChainHasTransaction", + "Chain".to_string(), + "Transaction".to_string(), + ); + let _block_has_transaction = schema_type.define_edge( + "BlockHasTransaction", + "Block".to_string(), + "Transaction".to_string(), + ); + + schema_type.finish() +} + +#[test] +fn test_schema_type() { + use crate::testing::prelude::*; + use insta::*; + + let store_type = new_test_store_type().unwrap(); + let schema_type = new_test_schema_type(&store_type).unwrap(); + assert_ron_snapshot!(schema_type); +} diff --git a/packages/fuel-indexer-graphql-dyn/src/testing/snapshots/fuel_indexer_graphql_dyn__testing__schema__tests__sdl.snap b/packages/fuel-indexer-graphql-dyn/src/testing/snapshots/fuel_indexer_graphql_dyn__testing__schema__tests__sdl.snap new file mode 100644 index 000000000..5c8f4ebe4 --- /dev/null +++ b/packages/fuel-indexer-graphql-dyn/src/testing/snapshots/fuel_indexer_graphql_dyn__testing__schema__tests__sdl.snap @@ -0,0 +1,127 @@ +--- +source: packages/fuel-indexer-graphql-dyn/src/testing/schema.rs +expression: text +--- +scalar B256 + +type Block implements Node { + id: ID! + number: U64! + hash: B256! + parentHash: B256! + chain: Chain! + transactions(first: Int, after: String, last: Int, before: String): BlockHasTransactionConnection! +} + +type BlockHasTransactionConnection { + totalCount: Int! + nodes: [Transaction!]! + edges: [BlockHasTransactionEdge!]! + pageInfo: PageInfo! +} + +type BlockHasTransactionEdge { + node: Transaction! + cursor: String! +} + +scalar Bytes + +type CallReceiptData { + param1: U64! + param2: U64! +} + +type Chain implements Node { + id: ID! + number: U64! + blocks(first: Int, after: String, last: Int, before: String): ChainHasBlockConnection! + transactions(first: Int, after: String, last: Int, before: String): ChainHasTransactionConnection! +} + +type ChainHasBlockConnection { + totalCount: Int! + nodes: [Block!]! + edges: [ChainHasBlockEdge!]! + pageInfo: PageInfo! +} + +type ChainHasBlockEdge { + node: Block! + cursor: String! +} + +type ChainHasTransactionConnection { + totalCount: Int! + nodes: [Transaction!]! + edges: [ChainHasTransactionEdge!]! + pageInfo: PageInfo! +} + +type ChainHasTransactionEdge { + node: Transaction! + cursor: String! +} + +interface Node { + id: ID! +} + +type PageInfo { + hasNextPage: Boolean! + hasPreviousPage: Boolean! + startCursor: String + endCursor: String +} + +type Query { + node(id: ID!): Node + nodes(ids: [ID!]!): [Node]! + chain(id: ID!): Chain + block(id: ID!): Block + transaction(id: ID!): Transaction + receipt(id: ID!): Receipt +} + +type Receipt implements Node { + id: ID! + type: ReceiptType! + data: ReceiptData! +} + +union ReceiptData = CallReceiptData | ReturnReceiptData + +enum ReceiptType { + CallReceipt + ReturnReceipt +} + +type ReturnReceiptData { + val: U64! +} + +type Transaction implements Node { + id: ID! + index: U64! + hash: B256! + gasLimit: U64! + gasPrice: U64! + blockHash: B256! + chain: Chain! + block: Block! +} + +scalar U16 + +scalar U32 + +scalar U64 + +scalar U8 + +scalar Unit + +schema { + query: Query +} + diff --git a/packages/fuel-indexer-graphql-dyn/src/testing/snapshots/fuel_indexer_graphql_dyn__testing__schema_type__schema_type.snap b/packages/fuel-indexer-graphql-dyn/src/testing/snapshots/fuel_indexer_graphql_dyn__testing__schema_type__schema_type.snap new file mode 100644 index 000000000..170de82ed --- /dev/null +++ b/packages/fuel-indexer-graphql-dyn/src/testing/snapshots/fuel_indexer_graphql_dyn__testing__schema_type__schema_type.snap @@ -0,0 +1,210 @@ +--- +source: packages/fuel-indexer-graphql-dyn/src/testing/schema_type.rs +expression: schema_type +--- +DynSchemaType( + data: { + Unit: Unit, + Boolean: Boolean, + U8: U8, + U16: U16, + U32: U32, + U64: U64, + B256: B256, + Bytes: Bytes, + String: String, + Name(Pascal("CallReceiptData")): Object(Pascal("CallReceiptData"), { + "param1": DynDataFieldType( + name: Snake("param1"), + data_type_id: U64, + store_data_field_id: "param1", + ), + "param2": DynDataFieldType( + name: Snake("param2"), + data_type_id: U64, + store_data_field_id: "param2", + ), + }), + Name(Pascal("ReturnReceiptData")): Object(Pascal("ReturnReceiptData"), { + "val": DynDataFieldType( + name: Snake("val"), + data_type_id: U64, + store_data_field_id: "val", + ), + }), + Name(Pascal("ReceiptType")): Enum(Pascal("ReceiptType"), { + "call_receipt": DynDataFieldType( + name: Pascal("CallReceipt"), + data_type_id: Unit, + store_data_field_id: "call_receipt", + ), + "return_receipt": DynDataFieldType( + name: Pascal("ReturnReceipt"), + data_type_id: Unit, + store_data_field_id: "return_receipt", + ), + }), + Name(Pascal("ReceiptData")): Enum(Pascal("ReceiptData"), { + "call_receipt_data": DynDataFieldType( + name: Pascal("CallReceiptData"), + data_type_id: Name(Pascal("CallReceiptData")), + store_data_field_id: "call_receipt_data", + ), + "return_receipt_data": DynDataFieldType( + name: Pascal("ReturnReceiptData"), + data_type_id: Name(Pascal("ReturnReceiptData")), + store_data_field_id: "return_receipt_data", + ), + }), + }, + node: { + DynNodeTypeId( + store_id: "Chain", + ): DynNodeType( + name: Pascal("Chain"), + fields: { + "number": Data(DynDataFieldType( + name: Snake("number"), + data_type_id: U64, + store_data_field_id: "number", + )), + "blocks": Connection(DynNodeConnectionFieldType( + name: Camel("blocks"), + edge_type_id: "ChainHasBlock", + )), + "transactions": Connection(DynNodeConnectionFieldType( + name: Camel("transactions"), + edge_type_id: "ChainHasTransaction", + )), + }, + ), + DynNodeTypeId( + store_id: "Block", + ): DynNodeType( + name: Pascal("Block"), + fields: { + "number": Data(DynDataFieldType( + name: Snake("number"), + data_type_id: U64, + store_data_field_id: "number", + )), + "hash": Data(DynDataFieldType( + name: Snake("hash"), + data_type_id: B256, + store_data_field_id: "hash", + )), + "parentHash": Data(DynDataFieldType( + name: Snake("parent_hash"), + data_type_id: B256, + store_data_field_id: "parent_hash", + )), + "chain": Ref(DynNodeRefFieldType( + name: Camel("chain"), + store_id: "chain_id", + ref_node_type_id: DynNodeTypeId( + store_id: "Chain", + ), + )), + "transactions": Connection(DynNodeConnectionFieldType( + name: Camel("transactions"), + edge_type_id: "BlockHasTransaction", + )), + }, + ), + DynNodeTypeId( + store_id: "Transaction", + ): DynNodeType( + name: Pascal("Transaction"), + fields: { + "index": Data(DynDataFieldType( + name: Snake("index"), + data_type_id: U64, + store_data_field_id: "index", + )), + "hash": Data(DynDataFieldType( + name: Snake("hash"), + data_type_id: B256, + store_data_field_id: "hash", + )), + "gasLimit": Data(DynDataFieldType( + name: Snake("gas_limit"), + data_type_id: U64, + store_data_field_id: "gas_limit", + )), + "gasPrice": Data(DynDataFieldType( + name: Snake("gas_price"), + data_type_id: U64, + store_data_field_id: "gas_price", + )), + "blockHash": Data(DynDataFieldType( + name: Snake("block_hash"), + data_type_id: B256, + store_data_field_id: "block_hash", + )), + "chain": Ref(DynNodeRefFieldType( + name: Camel("chain"), + store_id: "chain_id", + ref_node_type_id: DynNodeTypeId( + store_id: "Chain", + ), + )), + "block": Ref(DynNodeRefFieldType( + name: Camel("block"), + store_id: "block_hash", + ref_node_type_id: DynNodeTypeId( + store_id: "Block", + ), + )), + }, + ), + DynNodeTypeId( + store_id: "Receipt", + ): DynNodeType( + name: Pascal("Receipt"), + fields: { + "type": Data(DynDataFieldType( + name: Snake("type"), + data_type_id: Name(Pascal("ReceiptType")), + store_data_field_id: "type", + )), + "data": Data(DynDataFieldType( + name: Snake("data"), + data_type_id: Name(Pascal("ReceiptData")), + store_data_field_id: "data", + )), + }, + ), + }, + edge: { + "ChainHasBlock": DynEdgeType( + name: Pascal("ChainHasBlock"), + tail: DynNodeTypeId( + store_id: "Chain", + ), + head: DynNodeTypeId( + store_id: "Block", + ), + fields: {}, + ), + "ChainHasTransaction": DynEdgeType( + name: Pascal("ChainHasTransaction"), + tail: DynNodeTypeId( + store_id: "Chain", + ), + head: DynNodeTypeId( + store_id: "Transaction", + ), + fields: {}, + ), + "BlockHasTransaction": DynEdgeType( + name: Pascal("BlockHasTransaction"), + tail: DynNodeTypeId( + store_id: "Block", + ), + head: DynNodeTypeId( + store_id: "Transaction", + ), + fields: {}, + ), + }, +) diff --git a/packages/fuel-indexer-graphql-dyn/src/testing/snapshots/fuel_indexer_graphql_dyn__testing__store__store.snap b/packages/fuel-indexer-graphql-dyn/src/testing/snapshots/fuel_indexer_graphql_dyn__testing__store__store.snap new file mode 100644 index 000000000..393bd281f --- /dev/null +++ b/packages/fuel-indexer-graphql-dyn/src/testing/snapshots/fuel_indexer_graphql_dyn__testing__store__store.snap @@ -0,0 +1,29729 @@ +--- +source: packages/fuel-indexer-graphql-dyn/src/testing/store.rs +expression: store +--- +TestStore { + type: StoreType { + data: { + Unit: Unit, + Bool: Bool, + U8: U8, + U16: U16, + U32: U32, + U64: U64, + B256: B256, + Byte: Byte, + Bytes: Bytes, + String: String, + Name( + Pascal( + "CallReceiptData", + ), + ): Composite( + Pascal( + "CallReceiptData", + ), + { + "param1": DataFieldType { + name: Snake( + "param1", + ), + type_id: U64, + }, + "param2": DataFieldType { + name: Snake( + "param2", + ), + type_id: U64, + }, + }, + ), + Name( + Pascal( + "ReturnReceiptData", + ), + ): Composite( + Pascal( + "ReturnReceiptData", + ), + { + "val": DataFieldType { + name: Snake( + "val", + ), + type_id: U64, + }, + }, + ), + Name( + Pascal( + "ReceiptType", + ), + ): Enum( + Pascal( + "ReceiptType", + ), + { + "call_receipt": DataFieldType { + name: Pascal( + "CallReceipt", + ), + type_id: Unit, + }, + "return_receipt": DataFieldType { + name: Pascal( + "ReturnReceipt", + ), + type_id: Unit, + }, + }, + ), + Name( + Pascal( + "ReceiptData", + ), + ): Enum( + Pascal( + "ReceiptData", + ), + { + "call_receipt_data": DataFieldType { + name: Pascal( + "CallReceiptData", + ), + type_id: Name( + Pascal( + "CallReceiptData", + ), + ), + }, + "return_receipt_data": DataFieldType { + name: Pascal( + "ReturnReceiptData", + ), + type_id: Name( + Pascal( + "ReturnReceiptData", + ), + ), + }, + }, + ), + }, + obj: { + "Chain": ObjType { + name: Pascal( + "Chain", + ), + fields: { + "number": DataFieldType { + name: Snake( + "number", + ), + type_id: U64, + }, + }, + }, + "Block": ObjType { + name: Pascal( + "Block", + ), + fields: { + "number": DataFieldType { + name: Snake( + "number", + ), + type_id: U64, + }, + "hash": DataFieldType { + name: Snake( + "hash", + ), + type_id: B256, + }, + "parent_hash": DataFieldType { + name: Snake( + "parent_hash", + ), + type_id: B256, + }, + }, + }, + "Transaction": ObjType { + name: Pascal( + "Transaction", + ), + fields: { + "index": DataFieldType { + name: Snake( + "index", + ), + type_id: U64, + }, + "hash": DataFieldType { + name: Snake( + "hash", + ), + type_id: B256, + }, + "gas_limit": DataFieldType { + name: Snake( + "gas_limit", + ), + type_id: U64, + }, + "gas_price": DataFieldType { + name: Snake( + "gas_price", + ), + type_id: U64, + }, + "block_hash": DataFieldType { + name: Snake( + "block_hash", + ), + type_id: B256, + }, + }, + }, + "Receipt": ObjType { + name: Pascal( + "Receipt", + ), + fields: { + "type": DataFieldType { + name: Snake( + "type", + ), + type_id: Name( + Pascal( + "ReceiptType", + ), + ), + }, + "data": DataFieldType { + name: Snake( + "data", + ), + type_id: Name( + Pascal( + "ReceiptData", + ), + ), + }, + }, + }, + }, + assoc: { + "ChainHasBlock": AssocType { + name: Pascal( + "ChainHasBlock", + ), + tail: "Chain", + head: "Block", + fields: {}, + }, + "ChainHasTransaction": AssocType { + name: Pascal( + "ChainHasTransaction", + ), + tail: "Chain", + head: "Transaction", + fields: {}, + }, + "BlockHasTransaction": AssocType { + name: Pascal( + "BlockHasTransaction", + ), + tail: "Block", + head: "Transaction", + fields: {}, + }, + }, + }, + obj_map: { + "Chain:0": Obj( + "Chain", + Json( + Object { + "display_name": String("Chain #0"), + }, + ), + ), + "Block:0-0": Obj( + "Block", + Json( + Object { + "chain_id": String("Chain:0"), + "hash": String("0x00"), + "number": Number(0), + "parent_hash": String("0x00"), + }, + ), + ), + "Transaction:0-0-0": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:0"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(0), + }, + ), + ), + "Transaction:0-0-1": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:0"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(1), + }, + ), + ), + "Transaction:0-0-2": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:0"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(2), + }, + ), + ), + "Transaction:0-0-3": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:0"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(3), + }, + ), + ), + "Transaction:0-0-4": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:0"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(4), + }, + ), + ), + "Transaction:0-0-5": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:0"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(5), + }, + ), + ), + "Transaction:0-0-6": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:0"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(6), + }, + ), + ), + "Transaction:0-0-7": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:0"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(7), + }, + ), + ), + "Transaction:0-0-8": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:0"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(8), + }, + ), + ), + "Transaction:0-0-9": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:0"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(9), + }, + ), + ), + "Block:0-1": Obj( + "Block", + Json( + Object { + "chain_id": String("Chain:0"), + "hash": String("0x00"), + "number": Number(1), + "parent_hash": String("0x00"), + }, + ), + ), + "Transaction:0-1-0": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:0"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(0), + }, + ), + ), + "Transaction:0-1-1": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:0"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(1), + }, + ), + ), + "Transaction:0-1-2": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:0"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(2), + }, + ), + ), + "Transaction:0-1-3": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:0"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(3), + }, + ), + ), + "Transaction:0-1-4": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:0"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(4), + }, + ), + ), + "Transaction:0-1-5": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:0"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(5), + }, + ), + ), + "Transaction:0-1-6": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:0"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(6), + }, + ), + ), + "Transaction:0-1-7": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:0"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(7), + }, + ), + ), + "Transaction:0-1-8": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:0"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(8), + }, + ), + ), + "Transaction:0-1-9": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:0"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(9), + }, + ), + ), + "Block:0-2": Obj( + "Block", + Json( + Object { + "chain_id": String("Chain:0"), + "hash": String("0x00"), + "number": Number(2), + "parent_hash": String("0x00"), + }, + ), + ), + "Transaction:0-2-0": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:0"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(0), + }, + ), + ), + "Transaction:0-2-1": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:0"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(1), + }, + ), + ), + "Transaction:0-2-2": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:0"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(2), + }, + ), + ), + "Transaction:0-2-3": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:0"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(3), + }, + ), + ), + "Transaction:0-2-4": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:0"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(4), + }, + ), + ), + "Transaction:0-2-5": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:0"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(5), + }, + ), + ), + "Transaction:0-2-6": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:0"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(6), + }, + ), + ), + "Transaction:0-2-7": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:0"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(7), + }, + ), + ), + "Transaction:0-2-8": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:0"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(8), + }, + ), + ), + "Transaction:0-2-9": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:0"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(9), + }, + ), + ), + "Block:0-3": Obj( + "Block", + Json( + Object { + "chain_id": String("Chain:0"), + "hash": String("0x00"), + "number": Number(3), + "parent_hash": String("0x00"), + }, + ), + ), + "Transaction:0-3-0": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:0"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(0), + }, + ), + ), + "Transaction:0-3-1": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:0"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(1), + }, + ), + ), + "Transaction:0-3-2": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:0"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(2), + }, + ), + ), + "Transaction:0-3-3": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:0"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(3), + }, + ), + ), + "Transaction:0-3-4": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:0"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(4), + }, + ), + ), + "Transaction:0-3-5": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:0"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(5), + }, + ), + ), + "Transaction:0-3-6": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:0"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(6), + }, + ), + ), + "Transaction:0-3-7": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:0"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(7), + }, + ), + ), + "Transaction:0-3-8": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:0"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(8), + }, + ), + ), + "Transaction:0-3-9": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:0"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(9), + }, + ), + ), + "Block:0-4": Obj( + "Block", + Json( + Object { + "chain_id": String("Chain:0"), + "hash": String("0x00"), + "number": Number(4), + "parent_hash": String("0x00"), + }, + ), + ), + "Transaction:0-4-0": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:0"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(0), + }, + ), + ), + "Transaction:0-4-1": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:0"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(1), + }, + ), + ), + "Transaction:0-4-2": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:0"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(2), + }, + ), + ), + "Transaction:0-4-3": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:0"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(3), + }, + ), + ), + "Transaction:0-4-4": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:0"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(4), + }, + ), + ), + "Transaction:0-4-5": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:0"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(5), + }, + ), + ), + "Transaction:0-4-6": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:0"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(6), + }, + ), + ), + "Transaction:0-4-7": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:0"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(7), + }, + ), + ), + "Transaction:0-4-8": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:0"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(8), + }, + ), + ), + "Transaction:0-4-9": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:0"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(9), + }, + ), + ), + "Block:0-5": Obj( + "Block", + Json( + Object { + "chain_id": String("Chain:0"), + "hash": String("0x00"), + "number": Number(5), + "parent_hash": String("0x00"), + }, + ), + ), + "Transaction:0-5-0": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:0"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(0), + }, + ), + ), + "Transaction:0-5-1": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:0"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(1), + }, + ), + ), + "Transaction:0-5-2": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:0"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(2), + }, + ), + ), + "Transaction:0-5-3": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:0"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(3), + }, + ), + ), + "Transaction:0-5-4": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:0"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(4), + }, + ), + ), + "Transaction:0-5-5": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:0"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(5), + }, + ), + ), + "Transaction:0-5-6": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:0"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(6), + }, + ), + ), + "Transaction:0-5-7": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:0"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(7), + }, + ), + ), + "Transaction:0-5-8": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:0"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(8), + }, + ), + ), + "Transaction:0-5-9": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:0"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(9), + }, + ), + ), + "Block:0-6": Obj( + "Block", + Json( + Object { + "chain_id": String("Chain:0"), + "hash": String("0x00"), + "number": Number(6), + "parent_hash": String("0x00"), + }, + ), + ), + "Transaction:0-6-0": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:0"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(0), + }, + ), + ), + "Transaction:0-6-1": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:0"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(1), + }, + ), + ), + "Transaction:0-6-2": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:0"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(2), + }, + ), + ), + "Transaction:0-6-3": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:0"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(3), + }, + ), + ), + "Transaction:0-6-4": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:0"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(4), + }, + ), + ), + "Transaction:0-6-5": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:0"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(5), + }, + ), + ), + "Transaction:0-6-6": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:0"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(6), + }, + ), + ), + "Transaction:0-6-7": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:0"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(7), + }, + ), + ), + "Transaction:0-6-8": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:0"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(8), + }, + ), + ), + "Transaction:0-6-9": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:0"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(9), + }, + ), + ), + "Block:0-7": Obj( + "Block", + Json( + Object { + "chain_id": String("Chain:0"), + "hash": String("0x00"), + "number": Number(7), + "parent_hash": String("0x00"), + }, + ), + ), + "Transaction:0-7-0": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:0"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(0), + }, + ), + ), + "Transaction:0-7-1": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:0"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(1), + }, + ), + ), + "Transaction:0-7-2": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:0"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(2), + }, + ), + ), + "Transaction:0-7-3": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:0"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(3), + }, + ), + ), + "Transaction:0-7-4": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:0"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(4), + }, + ), + ), + "Transaction:0-7-5": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:0"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(5), + }, + ), + ), + "Transaction:0-7-6": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:0"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(6), + }, + ), + ), + "Transaction:0-7-7": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:0"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(7), + }, + ), + ), + "Transaction:0-7-8": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:0"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(8), + }, + ), + ), + "Transaction:0-7-9": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:0"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(9), + }, + ), + ), + "Block:0-8": Obj( + "Block", + Json( + Object { + "chain_id": String("Chain:0"), + "hash": String("0x00"), + "number": Number(8), + "parent_hash": String("0x00"), + }, + ), + ), + "Transaction:0-8-0": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:0"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(0), + }, + ), + ), + "Transaction:0-8-1": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:0"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(1), + }, + ), + ), + "Transaction:0-8-2": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:0"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(2), + }, + ), + ), + "Transaction:0-8-3": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:0"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(3), + }, + ), + ), + "Transaction:0-8-4": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:0"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(4), + }, + ), + ), + "Transaction:0-8-5": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:0"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(5), + }, + ), + ), + "Transaction:0-8-6": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:0"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(6), + }, + ), + ), + "Transaction:0-8-7": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:0"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(7), + }, + ), + ), + "Transaction:0-8-8": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:0"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(8), + }, + ), + ), + "Transaction:0-8-9": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:0"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(9), + }, + ), + ), + "Block:0-9": Obj( + "Block", + Json( + Object { + "chain_id": String("Chain:0"), + "hash": String("0x00"), + "number": Number(9), + "parent_hash": String("0x00"), + }, + ), + ), + "Transaction:0-9-0": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:0"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(0), + }, + ), + ), + "Transaction:0-9-1": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:0"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(1), + }, + ), + ), + "Transaction:0-9-2": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:0"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(2), + }, + ), + ), + "Transaction:0-9-3": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:0"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(3), + }, + ), + ), + "Transaction:0-9-4": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:0"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(4), + }, + ), + ), + "Transaction:0-9-5": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:0"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(5), + }, + ), + ), + "Transaction:0-9-6": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:0"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(6), + }, + ), + ), + "Transaction:0-9-7": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:0"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(7), + }, + ), + ), + "Transaction:0-9-8": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:0"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(8), + }, + ), + ), + "Transaction:0-9-9": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:0"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(9), + }, + ), + ), + "Chain:1": Obj( + "Chain", + Json( + Object { + "display_name": String("Chain #1"), + }, + ), + ), + "Block:1-0": Obj( + "Block", + Json( + Object { + "chain_id": String("Chain:1"), + "hash": String("0x00"), + "number": Number(0), + "parent_hash": String("0x00"), + }, + ), + ), + "Transaction:1-0-0": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:1"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(0), + }, + ), + ), + "Transaction:1-0-1": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:1"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(1), + }, + ), + ), + "Transaction:1-0-2": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:1"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(2), + }, + ), + ), + "Transaction:1-0-3": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:1"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(3), + }, + ), + ), + "Transaction:1-0-4": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:1"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(4), + }, + ), + ), + "Transaction:1-0-5": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:1"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(5), + }, + ), + ), + "Transaction:1-0-6": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:1"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(6), + }, + ), + ), + "Transaction:1-0-7": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:1"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(7), + }, + ), + ), + "Transaction:1-0-8": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:1"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(8), + }, + ), + ), + "Transaction:1-0-9": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:1"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(9), + }, + ), + ), + "Block:1-1": Obj( + "Block", + Json( + Object { + "chain_id": String("Chain:1"), + "hash": String("0x00"), + "number": Number(1), + "parent_hash": String("0x00"), + }, + ), + ), + "Transaction:1-1-0": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:1"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(0), + }, + ), + ), + "Transaction:1-1-1": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:1"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(1), + }, + ), + ), + "Transaction:1-1-2": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:1"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(2), + }, + ), + ), + "Transaction:1-1-3": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:1"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(3), + }, + ), + ), + "Transaction:1-1-4": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:1"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(4), + }, + ), + ), + "Transaction:1-1-5": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:1"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(5), + }, + ), + ), + "Transaction:1-1-6": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:1"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(6), + }, + ), + ), + "Transaction:1-1-7": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:1"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(7), + }, + ), + ), + "Transaction:1-1-8": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:1"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(8), + }, + ), + ), + "Transaction:1-1-9": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:1"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(9), + }, + ), + ), + "Block:1-2": Obj( + "Block", + Json( + Object { + "chain_id": String("Chain:1"), + "hash": String("0x00"), + "number": Number(2), + "parent_hash": String("0x00"), + }, + ), + ), + "Transaction:1-2-0": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:1"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(0), + }, + ), + ), + "Transaction:1-2-1": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:1"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(1), + }, + ), + ), + "Transaction:1-2-2": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:1"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(2), + }, + ), + ), + "Transaction:1-2-3": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:1"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(3), + }, + ), + ), + "Transaction:1-2-4": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:1"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(4), + }, + ), + ), + "Transaction:1-2-5": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:1"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(5), + }, + ), + ), + "Transaction:1-2-6": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:1"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(6), + }, + ), + ), + "Transaction:1-2-7": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:1"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(7), + }, + ), + ), + "Transaction:1-2-8": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:1"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(8), + }, + ), + ), + "Transaction:1-2-9": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:1"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(9), + }, + ), + ), + "Block:1-3": Obj( + "Block", + Json( + Object { + "chain_id": String("Chain:1"), + "hash": String("0x00"), + "number": Number(3), + "parent_hash": String("0x00"), + }, + ), + ), + "Transaction:1-3-0": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:1"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(0), + }, + ), + ), + "Transaction:1-3-1": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:1"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(1), + }, + ), + ), + "Transaction:1-3-2": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:1"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(2), + }, + ), + ), + "Transaction:1-3-3": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:1"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(3), + }, + ), + ), + "Transaction:1-3-4": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:1"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(4), + }, + ), + ), + "Transaction:1-3-5": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:1"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(5), + }, + ), + ), + "Transaction:1-3-6": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:1"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(6), + }, + ), + ), + "Transaction:1-3-7": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:1"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(7), + }, + ), + ), + "Transaction:1-3-8": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:1"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(8), + }, + ), + ), + "Transaction:1-3-9": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:1"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(9), + }, + ), + ), + "Block:1-4": Obj( + "Block", + Json( + Object { + "chain_id": String("Chain:1"), + "hash": String("0x00"), + "number": Number(4), + "parent_hash": String("0x00"), + }, + ), + ), + "Transaction:1-4-0": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:1"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(0), + }, + ), + ), + "Transaction:1-4-1": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:1"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(1), + }, + ), + ), + "Transaction:1-4-2": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:1"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(2), + }, + ), + ), + "Transaction:1-4-3": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:1"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(3), + }, + ), + ), + "Transaction:1-4-4": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:1"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(4), + }, + ), + ), + "Transaction:1-4-5": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:1"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(5), + }, + ), + ), + "Transaction:1-4-6": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:1"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(6), + }, + ), + ), + "Transaction:1-4-7": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:1"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(7), + }, + ), + ), + "Transaction:1-4-8": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:1"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(8), + }, + ), + ), + "Transaction:1-4-9": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:1"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(9), + }, + ), + ), + "Block:1-5": Obj( + "Block", + Json( + Object { + "chain_id": String("Chain:1"), + "hash": String("0x00"), + "number": Number(5), + "parent_hash": String("0x00"), + }, + ), + ), + "Transaction:1-5-0": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:1"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(0), + }, + ), + ), + "Transaction:1-5-1": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:1"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(1), + }, + ), + ), + "Transaction:1-5-2": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:1"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(2), + }, + ), + ), + "Transaction:1-5-3": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:1"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(3), + }, + ), + ), + "Transaction:1-5-4": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:1"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(4), + }, + ), + ), + "Transaction:1-5-5": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:1"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(5), + }, + ), + ), + "Transaction:1-5-6": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:1"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(6), + }, + ), + ), + "Transaction:1-5-7": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:1"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(7), + }, + ), + ), + "Transaction:1-5-8": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:1"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(8), + }, + ), + ), + "Transaction:1-5-9": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:1"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(9), + }, + ), + ), + "Block:1-6": Obj( + "Block", + Json( + Object { + "chain_id": String("Chain:1"), + "hash": String("0x00"), + "number": Number(6), + "parent_hash": String("0x00"), + }, + ), + ), + "Transaction:1-6-0": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:1"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(0), + }, + ), + ), + "Transaction:1-6-1": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:1"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(1), + }, + ), + ), + "Transaction:1-6-2": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:1"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(2), + }, + ), + ), + "Transaction:1-6-3": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:1"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(3), + }, + ), + ), + "Transaction:1-6-4": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:1"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(4), + }, + ), + ), + "Transaction:1-6-5": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:1"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(5), + }, + ), + ), + "Transaction:1-6-6": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:1"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(6), + }, + ), + ), + "Transaction:1-6-7": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:1"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(7), + }, + ), + ), + "Transaction:1-6-8": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:1"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(8), + }, + ), + ), + "Transaction:1-6-9": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:1"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(9), + }, + ), + ), + "Block:1-7": Obj( + "Block", + Json( + Object { + "chain_id": String("Chain:1"), + "hash": String("0x00"), + "number": Number(7), + "parent_hash": String("0x00"), + }, + ), + ), + "Transaction:1-7-0": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:1"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(0), + }, + ), + ), + "Transaction:1-7-1": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:1"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(1), + }, + ), + ), + "Transaction:1-7-2": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:1"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(2), + }, + ), + ), + "Transaction:1-7-3": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:1"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(3), + }, + ), + ), + "Transaction:1-7-4": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:1"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(4), + }, + ), + ), + "Transaction:1-7-5": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:1"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(5), + }, + ), + ), + "Transaction:1-7-6": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:1"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(6), + }, + ), + ), + "Transaction:1-7-7": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:1"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(7), + }, + ), + ), + "Transaction:1-7-8": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:1"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(8), + }, + ), + ), + "Transaction:1-7-9": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:1"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(9), + }, + ), + ), + "Block:1-8": Obj( + "Block", + Json( + Object { + "chain_id": String("Chain:1"), + "hash": String("0x00"), + "number": Number(8), + "parent_hash": String("0x00"), + }, + ), + ), + "Transaction:1-8-0": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:1"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(0), + }, + ), + ), + "Transaction:1-8-1": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:1"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(1), + }, + ), + ), + "Transaction:1-8-2": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:1"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(2), + }, + ), + ), + "Transaction:1-8-3": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:1"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(3), + }, + ), + ), + "Transaction:1-8-4": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:1"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(4), + }, + ), + ), + "Transaction:1-8-5": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:1"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(5), + }, + ), + ), + "Transaction:1-8-6": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:1"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(6), + }, + ), + ), + "Transaction:1-8-7": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:1"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(7), + }, + ), + ), + "Transaction:1-8-8": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:1"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(8), + }, + ), + ), + "Transaction:1-8-9": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:1"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(9), + }, + ), + ), + "Block:1-9": Obj( + "Block", + Json( + Object { + "chain_id": String("Chain:1"), + "hash": String("0x00"), + "number": Number(9), + "parent_hash": String("0x00"), + }, + ), + ), + "Transaction:1-9-0": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:1"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(0), + }, + ), + ), + "Transaction:1-9-1": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:1"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(1), + }, + ), + ), + "Transaction:1-9-2": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:1"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(2), + }, + ), + ), + "Transaction:1-9-3": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:1"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(3), + }, + ), + ), + "Transaction:1-9-4": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:1"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(4), + }, + ), + ), + "Transaction:1-9-5": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:1"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(5), + }, + ), + ), + "Transaction:1-9-6": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:1"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(6), + }, + ), + ), + "Transaction:1-9-7": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:1"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(7), + }, + ), + ), + "Transaction:1-9-8": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:1"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(8), + }, + ), + ), + "Transaction:1-9-9": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:1"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(9), + }, + ), + ), + "Chain:2": Obj( + "Chain", + Json( + Object { + "display_name": String("Chain #2"), + }, + ), + ), + "Block:2-0": Obj( + "Block", + Json( + Object { + "chain_id": String("Chain:2"), + "hash": String("0x00"), + "number": Number(0), + "parent_hash": String("0x00"), + }, + ), + ), + "Transaction:2-0-0": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:2"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(0), + }, + ), + ), + "Transaction:2-0-1": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:2"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(1), + }, + ), + ), + "Transaction:2-0-2": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:2"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(2), + }, + ), + ), + "Transaction:2-0-3": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:2"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(3), + }, + ), + ), + "Transaction:2-0-4": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:2"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(4), + }, + ), + ), + "Transaction:2-0-5": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:2"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(5), + }, + ), + ), + "Transaction:2-0-6": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:2"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(6), + }, + ), + ), + "Transaction:2-0-7": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:2"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(7), + }, + ), + ), + "Transaction:2-0-8": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:2"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(8), + }, + ), + ), + "Transaction:2-0-9": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:2"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(9), + }, + ), + ), + "Block:2-1": Obj( + "Block", + Json( + Object { + "chain_id": String("Chain:2"), + "hash": String("0x00"), + "number": Number(1), + "parent_hash": String("0x00"), + }, + ), + ), + "Transaction:2-1-0": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:2"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(0), + }, + ), + ), + "Transaction:2-1-1": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:2"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(1), + }, + ), + ), + "Transaction:2-1-2": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:2"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(2), + }, + ), + ), + "Transaction:2-1-3": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:2"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(3), + }, + ), + ), + "Transaction:2-1-4": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:2"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(4), + }, + ), + ), + "Transaction:2-1-5": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:2"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(5), + }, + ), + ), + "Transaction:2-1-6": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:2"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(6), + }, + ), + ), + "Transaction:2-1-7": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:2"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(7), + }, + ), + ), + "Transaction:2-1-8": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:2"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(8), + }, + ), + ), + "Transaction:2-1-9": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:2"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(9), + }, + ), + ), + "Block:2-2": Obj( + "Block", + Json( + Object { + "chain_id": String("Chain:2"), + "hash": String("0x00"), + "number": Number(2), + "parent_hash": String("0x00"), + }, + ), + ), + "Transaction:2-2-0": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:2"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(0), + }, + ), + ), + "Transaction:2-2-1": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:2"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(1), + }, + ), + ), + "Transaction:2-2-2": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:2"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(2), + }, + ), + ), + "Transaction:2-2-3": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:2"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(3), + }, + ), + ), + "Transaction:2-2-4": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:2"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(4), + }, + ), + ), + "Transaction:2-2-5": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:2"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(5), + }, + ), + ), + "Transaction:2-2-6": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:2"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(6), + }, + ), + ), + "Transaction:2-2-7": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:2"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(7), + }, + ), + ), + "Transaction:2-2-8": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:2"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(8), + }, + ), + ), + "Transaction:2-2-9": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:2"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(9), + }, + ), + ), + "Block:2-3": Obj( + "Block", + Json( + Object { + "chain_id": String("Chain:2"), + "hash": String("0x00"), + "number": Number(3), + "parent_hash": String("0x00"), + }, + ), + ), + "Transaction:2-3-0": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:2"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(0), + }, + ), + ), + "Transaction:2-3-1": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:2"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(1), + }, + ), + ), + "Transaction:2-3-2": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:2"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(2), + }, + ), + ), + "Transaction:2-3-3": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:2"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(3), + }, + ), + ), + "Transaction:2-3-4": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:2"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(4), + }, + ), + ), + "Transaction:2-3-5": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:2"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(5), + }, + ), + ), + "Transaction:2-3-6": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:2"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(6), + }, + ), + ), + "Transaction:2-3-7": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:2"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(7), + }, + ), + ), + "Transaction:2-3-8": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:2"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(8), + }, + ), + ), + "Transaction:2-3-9": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:2"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(9), + }, + ), + ), + "Block:2-4": Obj( + "Block", + Json( + Object { + "chain_id": String("Chain:2"), + "hash": String("0x00"), + "number": Number(4), + "parent_hash": String("0x00"), + }, + ), + ), + "Transaction:2-4-0": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:2"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(0), + }, + ), + ), + "Transaction:2-4-1": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:2"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(1), + }, + ), + ), + "Transaction:2-4-2": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:2"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(2), + }, + ), + ), + "Transaction:2-4-3": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:2"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(3), + }, + ), + ), + "Transaction:2-4-4": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:2"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(4), + }, + ), + ), + "Transaction:2-4-5": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:2"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(5), + }, + ), + ), + "Transaction:2-4-6": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:2"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(6), + }, + ), + ), + "Transaction:2-4-7": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:2"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(7), + }, + ), + ), + "Transaction:2-4-8": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:2"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(8), + }, + ), + ), + "Transaction:2-4-9": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:2"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(9), + }, + ), + ), + "Block:2-5": Obj( + "Block", + Json( + Object { + "chain_id": String("Chain:2"), + "hash": String("0x00"), + "number": Number(5), + "parent_hash": String("0x00"), + }, + ), + ), + "Transaction:2-5-0": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:2"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(0), + }, + ), + ), + "Transaction:2-5-1": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:2"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(1), + }, + ), + ), + "Transaction:2-5-2": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:2"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(2), + }, + ), + ), + "Transaction:2-5-3": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:2"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(3), + }, + ), + ), + "Transaction:2-5-4": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:2"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(4), + }, + ), + ), + "Transaction:2-5-5": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:2"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(5), + }, + ), + ), + "Transaction:2-5-6": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:2"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(6), + }, + ), + ), + "Transaction:2-5-7": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:2"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(7), + }, + ), + ), + "Transaction:2-5-8": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:2"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(8), + }, + ), + ), + "Transaction:2-5-9": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:2"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(9), + }, + ), + ), + "Block:2-6": Obj( + "Block", + Json( + Object { + "chain_id": String("Chain:2"), + "hash": String("0x00"), + "number": Number(6), + "parent_hash": String("0x00"), + }, + ), + ), + "Transaction:2-6-0": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:2"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(0), + }, + ), + ), + "Transaction:2-6-1": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:2"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(1), + }, + ), + ), + "Transaction:2-6-2": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:2"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(2), + }, + ), + ), + "Transaction:2-6-3": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:2"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(3), + }, + ), + ), + "Transaction:2-6-4": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:2"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(4), + }, + ), + ), + "Transaction:2-6-5": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:2"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(5), + }, + ), + ), + "Transaction:2-6-6": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:2"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(6), + }, + ), + ), + "Transaction:2-6-7": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:2"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(7), + }, + ), + ), + "Transaction:2-6-8": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:2"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(8), + }, + ), + ), + "Transaction:2-6-9": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:2"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(9), + }, + ), + ), + "Block:2-7": Obj( + "Block", + Json( + Object { + "chain_id": String("Chain:2"), + "hash": String("0x00"), + "number": Number(7), + "parent_hash": String("0x00"), + }, + ), + ), + "Transaction:2-7-0": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:2"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(0), + }, + ), + ), + "Transaction:2-7-1": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:2"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(1), + }, + ), + ), + "Transaction:2-7-2": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:2"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(2), + }, + ), + ), + "Transaction:2-7-3": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:2"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(3), + }, + ), + ), + "Transaction:2-7-4": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:2"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(4), + }, + ), + ), + "Transaction:2-7-5": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:2"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(5), + }, + ), + ), + "Transaction:2-7-6": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:2"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(6), + }, + ), + ), + "Transaction:2-7-7": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:2"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(7), + }, + ), + ), + "Transaction:2-7-8": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:2"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(8), + }, + ), + ), + "Transaction:2-7-9": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:2"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(9), + }, + ), + ), + "Block:2-8": Obj( + "Block", + Json( + Object { + "chain_id": String("Chain:2"), + "hash": String("0x00"), + "number": Number(8), + "parent_hash": String("0x00"), + }, + ), + ), + "Transaction:2-8-0": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:2"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(0), + }, + ), + ), + "Transaction:2-8-1": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:2"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(1), + }, + ), + ), + "Transaction:2-8-2": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:2"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(2), + }, + ), + ), + "Transaction:2-8-3": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:2"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(3), + }, + ), + ), + "Transaction:2-8-4": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:2"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(4), + }, + ), + ), + "Transaction:2-8-5": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:2"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(5), + }, + ), + ), + "Transaction:2-8-6": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:2"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(6), + }, + ), + ), + "Transaction:2-8-7": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:2"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(7), + }, + ), + ), + "Transaction:2-8-8": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:2"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(8), + }, + ), + ), + "Transaction:2-8-9": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:2"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(9), + }, + ), + ), + "Block:2-9": Obj( + "Block", + Json( + Object { + "chain_id": String("Chain:2"), + "hash": String("0x00"), + "number": Number(9), + "parent_hash": String("0x00"), + }, + ), + ), + "Transaction:2-9-0": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:2"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(0), + }, + ), + ), + "Transaction:2-9-1": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:2"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(1), + }, + ), + ), + "Transaction:2-9-2": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:2"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(2), + }, + ), + ), + "Transaction:2-9-3": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:2"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(3), + }, + ), + ), + "Transaction:2-9-4": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:2"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(4), + }, + ), + ), + "Transaction:2-9-5": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:2"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(5), + }, + ), + ), + "Transaction:2-9-6": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:2"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(6), + }, + ), + ), + "Transaction:2-9-7": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:2"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(7), + }, + ), + ), + "Transaction:2-9-8": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:2"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(8), + }, + ), + ), + "Transaction:2-9-9": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:2"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(9), + }, + ), + ), + "Chain:3": Obj( + "Chain", + Json( + Object { + "display_name": String("Chain #3"), + }, + ), + ), + "Block:3-0": Obj( + "Block", + Json( + Object { + "chain_id": String("Chain:3"), + "hash": String("0x00"), + "number": Number(0), + "parent_hash": String("0x00"), + }, + ), + ), + "Transaction:3-0-0": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:3"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(0), + }, + ), + ), + "Transaction:3-0-1": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:3"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(1), + }, + ), + ), + "Transaction:3-0-2": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:3"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(2), + }, + ), + ), + "Transaction:3-0-3": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:3"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(3), + }, + ), + ), + "Transaction:3-0-4": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:3"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(4), + }, + ), + ), + "Transaction:3-0-5": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:3"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(5), + }, + ), + ), + "Transaction:3-0-6": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:3"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(6), + }, + ), + ), + "Transaction:3-0-7": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:3"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(7), + }, + ), + ), + "Transaction:3-0-8": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:3"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(8), + }, + ), + ), + "Transaction:3-0-9": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:3"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(9), + }, + ), + ), + "Block:3-1": Obj( + "Block", + Json( + Object { + "chain_id": String("Chain:3"), + "hash": String("0x00"), + "number": Number(1), + "parent_hash": String("0x00"), + }, + ), + ), + "Transaction:3-1-0": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:3"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(0), + }, + ), + ), + "Transaction:3-1-1": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:3"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(1), + }, + ), + ), + "Transaction:3-1-2": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:3"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(2), + }, + ), + ), + "Transaction:3-1-3": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:3"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(3), + }, + ), + ), + "Transaction:3-1-4": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:3"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(4), + }, + ), + ), + "Transaction:3-1-5": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:3"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(5), + }, + ), + ), + "Transaction:3-1-6": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:3"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(6), + }, + ), + ), + "Transaction:3-1-7": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:3"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(7), + }, + ), + ), + "Transaction:3-1-8": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:3"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(8), + }, + ), + ), + "Transaction:3-1-9": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:3"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(9), + }, + ), + ), + "Block:3-2": Obj( + "Block", + Json( + Object { + "chain_id": String("Chain:3"), + "hash": String("0x00"), + "number": Number(2), + "parent_hash": String("0x00"), + }, + ), + ), + "Transaction:3-2-0": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:3"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(0), + }, + ), + ), + "Transaction:3-2-1": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:3"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(1), + }, + ), + ), + "Transaction:3-2-2": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:3"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(2), + }, + ), + ), + "Transaction:3-2-3": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:3"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(3), + }, + ), + ), + "Transaction:3-2-4": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:3"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(4), + }, + ), + ), + "Transaction:3-2-5": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:3"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(5), + }, + ), + ), + "Transaction:3-2-6": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:3"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(6), + }, + ), + ), + "Transaction:3-2-7": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:3"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(7), + }, + ), + ), + "Transaction:3-2-8": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:3"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(8), + }, + ), + ), + "Transaction:3-2-9": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:3"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(9), + }, + ), + ), + "Block:3-3": Obj( + "Block", + Json( + Object { + "chain_id": String("Chain:3"), + "hash": String("0x00"), + "number": Number(3), + "parent_hash": String("0x00"), + }, + ), + ), + "Transaction:3-3-0": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:3"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(0), + }, + ), + ), + "Transaction:3-3-1": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:3"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(1), + }, + ), + ), + "Transaction:3-3-2": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:3"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(2), + }, + ), + ), + "Transaction:3-3-3": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:3"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(3), + }, + ), + ), + "Transaction:3-3-4": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:3"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(4), + }, + ), + ), + "Transaction:3-3-5": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:3"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(5), + }, + ), + ), + "Transaction:3-3-6": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:3"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(6), + }, + ), + ), + "Transaction:3-3-7": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:3"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(7), + }, + ), + ), + "Transaction:3-3-8": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:3"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(8), + }, + ), + ), + "Transaction:3-3-9": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:3"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(9), + }, + ), + ), + "Block:3-4": Obj( + "Block", + Json( + Object { + "chain_id": String("Chain:3"), + "hash": String("0x00"), + "number": Number(4), + "parent_hash": String("0x00"), + }, + ), + ), + "Transaction:3-4-0": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:3"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(0), + }, + ), + ), + "Transaction:3-4-1": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:3"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(1), + }, + ), + ), + "Transaction:3-4-2": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:3"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(2), + }, + ), + ), + "Transaction:3-4-3": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:3"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(3), + }, + ), + ), + "Transaction:3-4-4": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:3"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(4), + }, + ), + ), + "Transaction:3-4-5": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:3"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(5), + }, + ), + ), + "Transaction:3-4-6": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:3"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(6), + }, + ), + ), + "Transaction:3-4-7": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:3"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(7), + }, + ), + ), + "Transaction:3-4-8": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:3"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(8), + }, + ), + ), + "Transaction:3-4-9": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:3"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(9), + }, + ), + ), + "Block:3-5": Obj( + "Block", + Json( + Object { + "chain_id": String("Chain:3"), + "hash": String("0x00"), + "number": Number(5), + "parent_hash": String("0x00"), + }, + ), + ), + "Transaction:3-5-0": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:3"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(0), + }, + ), + ), + "Transaction:3-5-1": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:3"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(1), + }, + ), + ), + "Transaction:3-5-2": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:3"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(2), + }, + ), + ), + "Transaction:3-5-3": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:3"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(3), + }, + ), + ), + "Transaction:3-5-4": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:3"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(4), + }, + ), + ), + "Transaction:3-5-5": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:3"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(5), + }, + ), + ), + "Transaction:3-5-6": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:3"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(6), + }, + ), + ), + "Transaction:3-5-7": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:3"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(7), + }, + ), + ), + "Transaction:3-5-8": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:3"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(8), + }, + ), + ), + "Transaction:3-5-9": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:3"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(9), + }, + ), + ), + "Block:3-6": Obj( + "Block", + Json( + Object { + "chain_id": String("Chain:3"), + "hash": String("0x00"), + "number": Number(6), + "parent_hash": String("0x00"), + }, + ), + ), + "Transaction:3-6-0": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:3"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(0), + }, + ), + ), + "Transaction:3-6-1": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:3"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(1), + }, + ), + ), + "Transaction:3-6-2": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:3"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(2), + }, + ), + ), + "Transaction:3-6-3": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:3"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(3), + }, + ), + ), + "Transaction:3-6-4": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:3"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(4), + }, + ), + ), + "Transaction:3-6-5": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:3"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(5), + }, + ), + ), + "Transaction:3-6-6": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:3"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(6), + }, + ), + ), + "Transaction:3-6-7": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:3"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(7), + }, + ), + ), + "Transaction:3-6-8": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:3"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(8), + }, + ), + ), + "Transaction:3-6-9": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:3"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(9), + }, + ), + ), + "Block:3-7": Obj( + "Block", + Json( + Object { + "chain_id": String("Chain:3"), + "hash": String("0x00"), + "number": Number(7), + "parent_hash": String("0x00"), + }, + ), + ), + "Transaction:3-7-0": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:3"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(0), + }, + ), + ), + "Transaction:3-7-1": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:3"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(1), + }, + ), + ), + "Transaction:3-7-2": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:3"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(2), + }, + ), + ), + "Transaction:3-7-3": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:3"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(3), + }, + ), + ), + "Transaction:3-7-4": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:3"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(4), + }, + ), + ), + "Transaction:3-7-5": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:3"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(5), + }, + ), + ), + "Transaction:3-7-6": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:3"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(6), + }, + ), + ), + "Transaction:3-7-7": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:3"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(7), + }, + ), + ), + "Transaction:3-7-8": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:3"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(8), + }, + ), + ), + "Transaction:3-7-9": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:3"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(9), + }, + ), + ), + "Block:3-8": Obj( + "Block", + Json( + Object { + "chain_id": String("Chain:3"), + "hash": String("0x00"), + "number": Number(8), + "parent_hash": String("0x00"), + }, + ), + ), + "Transaction:3-8-0": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:3"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(0), + }, + ), + ), + "Transaction:3-8-1": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:3"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(1), + }, + ), + ), + "Transaction:3-8-2": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:3"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(2), + }, + ), + ), + "Transaction:3-8-3": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:3"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(3), + }, + ), + ), + "Transaction:3-8-4": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:3"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(4), + }, + ), + ), + "Transaction:3-8-5": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:3"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(5), + }, + ), + ), + "Transaction:3-8-6": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:3"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(6), + }, + ), + ), + "Transaction:3-8-7": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:3"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(7), + }, + ), + ), + "Transaction:3-8-8": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:3"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(8), + }, + ), + ), + "Transaction:3-8-9": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:3"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(9), + }, + ), + ), + "Block:3-9": Obj( + "Block", + Json( + Object { + "chain_id": String("Chain:3"), + "hash": String("0x00"), + "number": Number(9), + "parent_hash": String("0x00"), + }, + ), + ), + "Transaction:3-9-0": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:3"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(0), + }, + ), + ), + "Transaction:3-9-1": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:3"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(1), + }, + ), + ), + "Transaction:3-9-2": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:3"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(2), + }, + ), + ), + "Transaction:3-9-3": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:3"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(3), + }, + ), + ), + "Transaction:3-9-4": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:3"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(4), + }, + ), + ), + "Transaction:3-9-5": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:3"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(5), + }, + ), + ), + "Transaction:3-9-6": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:3"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(6), + }, + ), + ), + "Transaction:3-9-7": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:3"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(7), + }, + ), + ), + "Transaction:3-9-8": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:3"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(8), + }, + ), + ), + "Transaction:3-9-9": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:3"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(9), + }, + ), + ), + "Chain:4": Obj( + "Chain", + Json( + Object { + "display_name": String("Chain #4"), + }, + ), + ), + "Block:4-0": Obj( + "Block", + Json( + Object { + "chain_id": String("Chain:4"), + "hash": String("0x00"), + "number": Number(0), + "parent_hash": String("0x00"), + }, + ), + ), + "Transaction:4-0-0": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:4"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(0), + }, + ), + ), + "Transaction:4-0-1": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:4"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(1), + }, + ), + ), + "Transaction:4-0-2": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:4"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(2), + }, + ), + ), + "Transaction:4-0-3": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:4"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(3), + }, + ), + ), + "Transaction:4-0-4": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:4"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(4), + }, + ), + ), + "Transaction:4-0-5": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:4"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(5), + }, + ), + ), + "Transaction:4-0-6": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:4"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(6), + }, + ), + ), + "Transaction:4-0-7": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:4"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(7), + }, + ), + ), + "Transaction:4-0-8": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:4"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(8), + }, + ), + ), + "Transaction:4-0-9": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:4"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(9), + }, + ), + ), + "Block:4-1": Obj( + "Block", + Json( + Object { + "chain_id": String("Chain:4"), + "hash": String("0x00"), + "number": Number(1), + "parent_hash": String("0x00"), + }, + ), + ), + "Transaction:4-1-0": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:4"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(0), + }, + ), + ), + "Transaction:4-1-1": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:4"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(1), + }, + ), + ), + "Transaction:4-1-2": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:4"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(2), + }, + ), + ), + "Transaction:4-1-3": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:4"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(3), + }, + ), + ), + "Transaction:4-1-4": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:4"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(4), + }, + ), + ), + "Transaction:4-1-5": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:4"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(5), + }, + ), + ), + "Transaction:4-1-6": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:4"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(6), + }, + ), + ), + "Transaction:4-1-7": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:4"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(7), + }, + ), + ), + "Transaction:4-1-8": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:4"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(8), + }, + ), + ), + "Transaction:4-1-9": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:4"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(9), + }, + ), + ), + "Block:4-2": Obj( + "Block", + Json( + Object { + "chain_id": String("Chain:4"), + "hash": String("0x00"), + "number": Number(2), + "parent_hash": String("0x00"), + }, + ), + ), + "Transaction:4-2-0": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:4"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(0), + }, + ), + ), + "Transaction:4-2-1": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:4"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(1), + }, + ), + ), + "Transaction:4-2-2": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:4"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(2), + }, + ), + ), + "Transaction:4-2-3": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:4"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(3), + }, + ), + ), + "Transaction:4-2-4": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:4"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(4), + }, + ), + ), + "Transaction:4-2-5": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:4"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(5), + }, + ), + ), + "Transaction:4-2-6": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:4"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(6), + }, + ), + ), + "Transaction:4-2-7": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:4"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(7), + }, + ), + ), + "Transaction:4-2-8": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:4"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(8), + }, + ), + ), + "Transaction:4-2-9": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:4"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(9), + }, + ), + ), + "Block:4-3": Obj( + "Block", + Json( + Object { + "chain_id": String("Chain:4"), + "hash": String("0x00"), + "number": Number(3), + "parent_hash": String("0x00"), + }, + ), + ), + "Transaction:4-3-0": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:4"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(0), + }, + ), + ), + "Transaction:4-3-1": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:4"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(1), + }, + ), + ), + "Transaction:4-3-2": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:4"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(2), + }, + ), + ), + "Transaction:4-3-3": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:4"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(3), + }, + ), + ), + "Transaction:4-3-4": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:4"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(4), + }, + ), + ), + "Transaction:4-3-5": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:4"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(5), + }, + ), + ), + "Transaction:4-3-6": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:4"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(6), + }, + ), + ), + "Transaction:4-3-7": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:4"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(7), + }, + ), + ), + "Transaction:4-3-8": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:4"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(8), + }, + ), + ), + "Transaction:4-3-9": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:4"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(9), + }, + ), + ), + "Block:4-4": Obj( + "Block", + Json( + Object { + "chain_id": String("Chain:4"), + "hash": String("0x00"), + "number": Number(4), + "parent_hash": String("0x00"), + }, + ), + ), + "Transaction:4-4-0": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:4"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(0), + }, + ), + ), + "Transaction:4-4-1": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:4"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(1), + }, + ), + ), + "Transaction:4-4-2": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:4"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(2), + }, + ), + ), + "Transaction:4-4-3": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:4"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(3), + }, + ), + ), + "Transaction:4-4-4": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:4"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(4), + }, + ), + ), + "Transaction:4-4-5": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:4"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(5), + }, + ), + ), + "Transaction:4-4-6": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:4"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(6), + }, + ), + ), + "Transaction:4-4-7": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:4"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(7), + }, + ), + ), + "Transaction:4-4-8": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:4"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(8), + }, + ), + ), + "Transaction:4-4-9": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:4"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(9), + }, + ), + ), + "Block:4-5": Obj( + "Block", + Json( + Object { + "chain_id": String("Chain:4"), + "hash": String("0x00"), + "number": Number(5), + "parent_hash": String("0x00"), + }, + ), + ), + "Transaction:4-5-0": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:4"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(0), + }, + ), + ), + "Transaction:4-5-1": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:4"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(1), + }, + ), + ), + "Transaction:4-5-2": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:4"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(2), + }, + ), + ), + "Transaction:4-5-3": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:4"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(3), + }, + ), + ), + "Transaction:4-5-4": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:4"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(4), + }, + ), + ), + "Transaction:4-5-5": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:4"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(5), + }, + ), + ), + "Transaction:4-5-6": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:4"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(6), + }, + ), + ), + "Transaction:4-5-7": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:4"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(7), + }, + ), + ), + "Transaction:4-5-8": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:4"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(8), + }, + ), + ), + "Transaction:4-5-9": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:4"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(9), + }, + ), + ), + "Block:4-6": Obj( + "Block", + Json( + Object { + "chain_id": String("Chain:4"), + "hash": String("0x00"), + "number": Number(6), + "parent_hash": String("0x00"), + }, + ), + ), + "Transaction:4-6-0": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:4"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(0), + }, + ), + ), + "Transaction:4-6-1": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:4"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(1), + }, + ), + ), + "Transaction:4-6-2": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:4"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(2), + }, + ), + ), + "Transaction:4-6-3": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:4"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(3), + }, + ), + ), + "Transaction:4-6-4": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:4"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(4), + }, + ), + ), + "Transaction:4-6-5": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:4"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(5), + }, + ), + ), + "Transaction:4-6-6": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:4"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(6), + }, + ), + ), + "Transaction:4-6-7": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:4"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(7), + }, + ), + ), + "Transaction:4-6-8": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:4"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(8), + }, + ), + ), + "Transaction:4-6-9": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:4"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(9), + }, + ), + ), + "Block:4-7": Obj( + "Block", + Json( + Object { + "chain_id": String("Chain:4"), + "hash": String("0x00"), + "number": Number(7), + "parent_hash": String("0x00"), + }, + ), + ), + "Transaction:4-7-0": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:4"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(0), + }, + ), + ), + "Transaction:4-7-1": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:4"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(1), + }, + ), + ), + "Transaction:4-7-2": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:4"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(2), + }, + ), + ), + "Transaction:4-7-3": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:4"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(3), + }, + ), + ), + "Transaction:4-7-4": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:4"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(4), + }, + ), + ), + "Transaction:4-7-5": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:4"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(5), + }, + ), + ), + "Transaction:4-7-6": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:4"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(6), + }, + ), + ), + "Transaction:4-7-7": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:4"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(7), + }, + ), + ), + "Transaction:4-7-8": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:4"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(8), + }, + ), + ), + "Transaction:4-7-9": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:4"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(9), + }, + ), + ), + "Block:4-8": Obj( + "Block", + Json( + Object { + "chain_id": String("Chain:4"), + "hash": String("0x00"), + "number": Number(8), + "parent_hash": String("0x00"), + }, + ), + ), + "Transaction:4-8-0": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:4"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(0), + }, + ), + ), + "Transaction:4-8-1": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:4"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(1), + }, + ), + ), + "Transaction:4-8-2": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:4"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(2), + }, + ), + ), + "Transaction:4-8-3": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:4"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(3), + }, + ), + ), + "Transaction:4-8-4": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:4"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(4), + }, + ), + ), + "Transaction:4-8-5": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:4"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(5), + }, + ), + ), + "Transaction:4-8-6": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:4"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(6), + }, + ), + ), + "Transaction:4-8-7": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:4"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(7), + }, + ), + ), + "Transaction:4-8-8": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:4"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(8), + }, + ), + ), + "Transaction:4-8-9": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:4"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(9), + }, + ), + ), + "Block:4-9": Obj( + "Block", + Json( + Object { + "chain_id": String("Chain:4"), + "hash": String("0x00"), + "number": Number(9), + "parent_hash": String("0x00"), + }, + ), + ), + "Transaction:4-9-0": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:4"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(0), + }, + ), + ), + "Transaction:4-9-1": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:4"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(1), + }, + ), + ), + "Transaction:4-9-2": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:4"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(2), + }, + ), + ), + "Transaction:4-9-3": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:4"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(3), + }, + ), + ), + "Transaction:4-9-4": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:4"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(4), + }, + ), + ), + "Transaction:4-9-5": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:4"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(5), + }, + ), + ), + "Transaction:4-9-6": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:4"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(6), + }, + ), + ), + "Transaction:4-9-7": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:4"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(7), + }, + ), + ), + "Transaction:4-9-8": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:4"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(8), + }, + ), + ), + "Transaction:4-9-9": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:4"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(9), + }, + ), + ), + "Chain:5": Obj( + "Chain", + Json( + Object { + "display_name": String("Chain #5"), + }, + ), + ), + "Block:5-0": Obj( + "Block", + Json( + Object { + "chain_id": String("Chain:5"), + "hash": String("0x00"), + "number": Number(0), + "parent_hash": String("0x00"), + }, + ), + ), + "Transaction:5-0-0": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:5"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(0), + }, + ), + ), + "Transaction:5-0-1": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:5"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(1), + }, + ), + ), + "Transaction:5-0-2": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:5"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(2), + }, + ), + ), + "Transaction:5-0-3": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:5"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(3), + }, + ), + ), + "Transaction:5-0-4": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:5"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(4), + }, + ), + ), + "Transaction:5-0-5": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:5"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(5), + }, + ), + ), + "Transaction:5-0-6": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:5"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(6), + }, + ), + ), + "Transaction:5-0-7": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:5"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(7), + }, + ), + ), + "Transaction:5-0-8": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:5"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(8), + }, + ), + ), + "Transaction:5-0-9": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:5"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(9), + }, + ), + ), + "Block:5-1": Obj( + "Block", + Json( + Object { + "chain_id": String("Chain:5"), + "hash": String("0x00"), + "number": Number(1), + "parent_hash": String("0x00"), + }, + ), + ), + "Transaction:5-1-0": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:5"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(0), + }, + ), + ), + "Transaction:5-1-1": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:5"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(1), + }, + ), + ), + "Transaction:5-1-2": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:5"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(2), + }, + ), + ), + "Transaction:5-1-3": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:5"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(3), + }, + ), + ), + "Transaction:5-1-4": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:5"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(4), + }, + ), + ), + "Transaction:5-1-5": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:5"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(5), + }, + ), + ), + "Transaction:5-1-6": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:5"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(6), + }, + ), + ), + "Transaction:5-1-7": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:5"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(7), + }, + ), + ), + "Transaction:5-1-8": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:5"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(8), + }, + ), + ), + "Transaction:5-1-9": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:5"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(9), + }, + ), + ), + "Block:5-2": Obj( + "Block", + Json( + Object { + "chain_id": String("Chain:5"), + "hash": String("0x00"), + "number": Number(2), + "parent_hash": String("0x00"), + }, + ), + ), + "Transaction:5-2-0": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:5"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(0), + }, + ), + ), + "Transaction:5-2-1": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:5"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(1), + }, + ), + ), + "Transaction:5-2-2": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:5"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(2), + }, + ), + ), + "Transaction:5-2-3": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:5"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(3), + }, + ), + ), + "Transaction:5-2-4": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:5"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(4), + }, + ), + ), + "Transaction:5-2-5": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:5"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(5), + }, + ), + ), + "Transaction:5-2-6": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:5"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(6), + }, + ), + ), + "Transaction:5-2-7": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:5"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(7), + }, + ), + ), + "Transaction:5-2-8": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:5"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(8), + }, + ), + ), + "Transaction:5-2-9": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:5"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(9), + }, + ), + ), + "Block:5-3": Obj( + "Block", + Json( + Object { + "chain_id": String("Chain:5"), + "hash": String("0x00"), + "number": Number(3), + "parent_hash": String("0x00"), + }, + ), + ), + "Transaction:5-3-0": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:5"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(0), + }, + ), + ), + "Transaction:5-3-1": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:5"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(1), + }, + ), + ), + "Transaction:5-3-2": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:5"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(2), + }, + ), + ), + "Transaction:5-3-3": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:5"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(3), + }, + ), + ), + "Transaction:5-3-4": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:5"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(4), + }, + ), + ), + "Transaction:5-3-5": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:5"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(5), + }, + ), + ), + "Transaction:5-3-6": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:5"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(6), + }, + ), + ), + "Transaction:5-3-7": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:5"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(7), + }, + ), + ), + "Transaction:5-3-8": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:5"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(8), + }, + ), + ), + "Transaction:5-3-9": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:5"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(9), + }, + ), + ), + "Block:5-4": Obj( + "Block", + Json( + Object { + "chain_id": String("Chain:5"), + "hash": String("0x00"), + "number": Number(4), + "parent_hash": String("0x00"), + }, + ), + ), + "Transaction:5-4-0": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:5"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(0), + }, + ), + ), + "Transaction:5-4-1": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:5"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(1), + }, + ), + ), + "Transaction:5-4-2": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:5"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(2), + }, + ), + ), + "Transaction:5-4-3": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:5"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(3), + }, + ), + ), + "Transaction:5-4-4": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:5"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(4), + }, + ), + ), + "Transaction:5-4-5": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:5"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(5), + }, + ), + ), + "Transaction:5-4-6": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:5"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(6), + }, + ), + ), + "Transaction:5-4-7": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:5"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(7), + }, + ), + ), + "Transaction:5-4-8": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:5"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(8), + }, + ), + ), + "Transaction:5-4-9": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:5"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(9), + }, + ), + ), + "Block:5-5": Obj( + "Block", + Json( + Object { + "chain_id": String("Chain:5"), + "hash": String("0x00"), + "number": Number(5), + "parent_hash": String("0x00"), + }, + ), + ), + "Transaction:5-5-0": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:5"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(0), + }, + ), + ), + "Transaction:5-5-1": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:5"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(1), + }, + ), + ), + "Transaction:5-5-2": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:5"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(2), + }, + ), + ), + "Transaction:5-5-3": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:5"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(3), + }, + ), + ), + "Transaction:5-5-4": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:5"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(4), + }, + ), + ), + "Transaction:5-5-5": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:5"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(5), + }, + ), + ), + "Transaction:5-5-6": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:5"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(6), + }, + ), + ), + "Transaction:5-5-7": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:5"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(7), + }, + ), + ), + "Transaction:5-5-8": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:5"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(8), + }, + ), + ), + "Transaction:5-5-9": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:5"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(9), + }, + ), + ), + "Block:5-6": Obj( + "Block", + Json( + Object { + "chain_id": String("Chain:5"), + "hash": String("0x00"), + "number": Number(6), + "parent_hash": String("0x00"), + }, + ), + ), + "Transaction:5-6-0": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:5"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(0), + }, + ), + ), + "Transaction:5-6-1": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:5"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(1), + }, + ), + ), + "Transaction:5-6-2": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:5"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(2), + }, + ), + ), + "Transaction:5-6-3": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:5"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(3), + }, + ), + ), + "Transaction:5-6-4": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:5"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(4), + }, + ), + ), + "Transaction:5-6-5": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:5"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(5), + }, + ), + ), + "Transaction:5-6-6": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:5"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(6), + }, + ), + ), + "Transaction:5-6-7": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:5"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(7), + }, + ), + ), + "Transaction:5-6-8": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:5"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(8), + }, + ), + ), + "Transaction:5-6-9": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:5"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(9), + }, + ), + ), + "Block:5-7": Obj( + "Block", + Json( + Object { + "chain_id": String("Chain:5"), + "hash": String("0x00"), + "number": Number(7), + "parent_hash": String("0x00"), + }, + ), + ), + "Transaction:5-7-0": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:5"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(0), + }, + ), + ), + "Transaction:5-7-1": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:5"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(1), + }, + ), + ), + "Transaction:5-7-2": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:5"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(2), + }, + ), + ), + "Transaction:5-7-3": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:5"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(3), + }, + ), + ), + "Transaction:5-7-4": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:5"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(4), + }, + ), + ), + "Transaction:5-7-5": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:5"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(5), + }, + ), + ), + "Transaction:5-7-6": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:5"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(6), + }, + ), + ), + "Transaction:5-7-7": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:5"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(7), + }, + ), + ), + "Transaction:5-7-8": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:5"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(8), + }, + ), + ), + "Transaction:5-7-9": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:5"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(9), + }, + ), + ), + "Block:5-8": Obj( + "Block", + Json( + Object { + "chain_id": String("Chain:5"), + "hash": String("0x00"), + "number": Number(8), + "parent_hash": String("0x00"), + }, + ), + ), + "Transaction:5-8-0": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:5"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(0), + }, + ), + ), + "Transaction:5-8-1": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:5"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(1), + }, + ), + ), + "Transaction:5-8-2": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:5"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(2), + }, + ), + ), + "Transaction:5-8-3": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:5"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(3), + }, + ), + ), + "Transaction:5-8-4": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:5"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(4), + }, + ), + ), + "Transaction:5-8-5": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:5"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(5), + }, + ), + ), + "Transaction:5-8-6": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:5"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(6), + }, + ), + ), + "Transaction:5-8-7": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:5"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(7), + }, + ), + ), + "Transaction:5-8-8": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:5"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(8), + }, + ), + ), + "Transaction:5-8-9": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:5"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(9), + }, + ), + ), + "Block:5-9": Obj( + "Block", + Json( + Object { + "chain_id": String("Chain:5"), + "hash": String("0x00"), + "number": Number(9), + "parent_hash": String("0x00"), + }, + ), + ), + "Transaction:5-9-0": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:5"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(0), + }, + ), + ), + "Transaction:5-9-1": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:5"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(1), + }, + ), + ), + "Transaction:5-9-2": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:5"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(2), + }, + ), + ), + "Transaction:5-9-3": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:5"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(3), + }, + ), + ), + "Transaction:5-9-4": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:5"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(4), + }, + ), + ), + "Transaction:5-9-5": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:5"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(5), + }, + ), + ), + "Transaction:5-9-6": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:5"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(6), + }, + ), + ), + "Transaction:5-9-7": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:5"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(7), + }, + ), + ), + "Transaction:5-9-8": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:5"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(8), + }, + ), + ), + "Transaction:5-9-9": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:5"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(9), + }, + ), + ), + "Chain:6": Obj( + "Chain", + Json( + Object { + "display_name": String("Chain #6"), + }, + ), + ), + "Block:6-0": Obj( + "Block", + Json( + Object { + "chain_id": String("Chain:6"), + "hash": String("0x00"), + "number": Number(0), + "parent_hash": String("0x00"), + }, + ), + ), + "Transaction:6-0-0": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:6"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(0), + }, + ), + ), + "Transaction:6-0-1": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:6"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(1), + }, + ), + ), + "Transaction:6-0-2": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:6"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(2), + }, + ), + ), + "Transaction:6-0-3": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:6"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(3), + }, + ), + ), + "Transaction:6-0-4": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:6"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(4), + }, + ), + ), + "Transaction:6-0-5": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:6"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(5), + }, + ), + ), + "Transaction:6-0-6": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:6"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(6), + }, + ), + ), + "Transaction:6-0-7": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:6"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(7), + }, + ), + ), + "Transaction:6-0-8": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:6"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(8), + }, + ), + ), + "Transaction:6-0-9": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:6"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(9), + }, + ), + ), + "Block:6-1": Obj( + "Block", + Json( + Object { + "chain_id": String("Chain:6"), + "hash": String("0x00"), + "number": Number(1), + "parent_hash": String("0x00"), + }, + ), + ), + "Transaction:6-1-0": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:6"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(0), + }, + ), + ), + "Transaction:6-1-1": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:6"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(1), + }, + ), + ), + "Transaction:6-1-2": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:6"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(2), + }, + ), + ), + "Transaction:6-1-3": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:6"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(3), + }, + ), + ), + "Transaction:6-1-4": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:6"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(4), + }, + ), + ), + "Transaction:6-1-5": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:6"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(5), + }, + ), + ), + "Transaction:6-1-6": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:6"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(6), + }, + ), + ), + "Transaction:6-1-7": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:6"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(7), + }, + ), + ), + "Transaction:6-1-8": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:6"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(8), + }, + ), + ), + "Transaction:6-1-9": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:6"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(9), + }, + ), + ), + "Block:6-2": Obj( + "Block", + Json( + Object { + "chain_id": String("Chain:6"), + "hash": String("0x00"), + "number": Number(2), + "parent_hash": String("0x00"), + }, + ), + ), + "Transaction:6-2-0": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:6"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(0), + }, + ), + ), + "Transaction:6-2-1": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:6"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(1), + }, + ), + ), + "Transaction:6-2-2": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:6"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(2), + }, + ), + ), + "Transaction:6-2-3": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:6"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(3), + }, + ), + ), + "Transaction:6-2-4": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:6"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(4), + }, + ), + ), + "Transaction:6-2-5": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:6"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(5), + }, + ), + ), + "Transaction:6-2-6": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:6"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(6), + }, + ), + ), + "Transaction:6-2-7": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:6"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(7), + }, + ), + ), + "Transaction:6-2-8": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:6"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(8), + }, + ), + ), + "Transaction:6-2-9": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:6"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(9), + }, + ), + ), + "Block:6-3": Obj( + "Block", + Json( + Object { + "chain_id": String("Chain:6"), + "hash": String("0x00"), + "number": Number(3), + "parent_hash": String("0x00"), + }, + ), + ), + "Transaction:6-3-0": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:6"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(0), + }, + ), + ), + "Transaction:6-3-1": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:6"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(1), + }, + ), + ), + "Transaction:6-3-2": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:6"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(2), + }, + ), + ), + "Transaction:6-3-3": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:6"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(3), + }, + ), + ), + "Transaction:6-3-4": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:6"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(4), + }, + ), + ), + "Transaction:6-3-5": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:6"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(5), + }, + ), + ), + "Transaction:6-3-6": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:6"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(6), + }, + ), + ), + "Transaction:6-3-7": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:6"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(7), + }, + ), + ), + "Transaction:6-3-8": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:6"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(8), + }, + ), + ), + "Transaction:6-3-9": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:6"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(9), + }, + ), + ), + "Block:6-4": Obj( + "Block", + Json( + Object { + "chain_id": String("Chain:6"), + "hash": String("0x00"), + "number": Number(4), + "parent_hash": String("0x00"), + }, + ), + ), + "Transaction:6-4-0": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:6"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(0), + }, + ), + ), + "Transaction:6-4-1": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:6"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(1), + }, + ), + ), + "Transaction:6-4-2": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:6"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(2), + }, + ), + ), + "Transaction:6-4-3": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:6"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(3), + }, + ), + ), + "Transaction:6-4-4": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:6"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(4), + }, + ), + ), + "Transaction:6-4-5": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:6"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(5), + }, + ), + ), + "Transaction:6-4-6": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:6"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(6), + }, + ), + ), + "Transaction:6-4-7": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:6"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(7), + }, + ), + ), + "Transaction:6-4-8": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:6"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(8), + }, + ), + ), + "Transaction:6-4-9": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:6"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(9), + }, + ), + ), + "Block:6-5": Obj( + "Block", + Json( + Object { + "chain_id": String("Chain:6"), + "hash": String("0x00"), + "number": Number(5), + "parent_hash": String("0x00"), + }, + ), + ), + "Transaction:6-5-0": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:6"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(0), + }, + ), + ), + "Transaction:6-5-1": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:6"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(1), + }, + ), + ), + "Transaction:6-5-2": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:6"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(2), + }, + ), + ), + "Transaction:6-5-3": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:6"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(3), + }, + ), + ), + "Transaction:6-5-4": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:6"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(4), + }, + ), + ), + "Transaction:6-5-5": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:6"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(5), + }, + ), + ), + "Transaction:6-5-6": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:6"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(6), + }, + ), + ), + "Transaction:6-5-7": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:6"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(7), + }, + ), + ), + "Transaction:6-5-8": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:6"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(8), + }, + ), + ), + "Transaction:6-5-9": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:6"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(9), + }, + ), + ), + "Block:6-6": Obj( + "Block", + Json( + Object { + "chain_id": String("Chain:6"), + "hash": String("0x00"), + "number": Number(6), + "parent_hash": String("0x00"), + }, + ), + ), + "Transaction:6-6-0": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:6"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(0), + }, + ), + ), + "Transaction:6-6-1": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:6"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(1), + }, + ), + ), + "Transaction:6-6-2": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:6"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(2), + }, + ), + ), + "Transaction:6-6-3": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:6"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(3), + }, + ), + ), + "Transaction:6-6-4": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:6"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(4), + }, + ), + ), + "Transaction:6-6-5": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:6"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(5), + }, + ), + ), + "Transaction:6-6-6": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:6"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(6), + }, + ), + ), + "Transaction:6-6-7": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:6"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(7), + }, + ), + ), + "Transaction:6-6-8": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:6"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(8), + }, + ), + ), + "Transaction:6-6-9": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:6"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(9), + }, + ), + ), + "Block:6-7": Obj( + "Block", + Json( + Object { + "chain_id": String("Chain:6"), + "hash": String("0x00"), + "number": Number(7), + "parent_hash": String("0x00"), + }, + ), + ), + "Transaction:6-7-0": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:6"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(0), + }, + ), + ), + "Transaction:6-7-1": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:6"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(1), + }, + ), + ), + "Transaction:6-7-2": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:6"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(2), + }, + ), + ), + "Transaction:6-7-3": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:6"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(3), + }, + ), + ), + "Transaction:6-7-4": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:6"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(4), + }, + ), + ), + "Transaction:6-7-5": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:6"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(5), + }, + ), + ), + "Transaction:6-7-6": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:6"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(6), + }, + ), + ), + "Transaction:6-7-7": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:6"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(7), + }, + ), + ), + "Transaction:6-7-8": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:6"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(8), + }, + ), + ), + "Transaction:6-7-9": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:6"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(9), + }, + ), + ), + "Block:6-8": Obj( + "Block", + Json( + Object { + "chain_id": String("Chain:6"), + "hash": String("0x00"), + "number": Number(8), + "parent_hash": String("0x00"), + }, + ), + ), + "Transaction:6-8-0": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:6"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(0), + }, + ), + ), + "Transaction:6-8-1": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:6"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(1), + }, + ), + ), + "Transaction:6-8-2": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:6"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(2), + }, + ), + ), + "Transaction:6-8-3": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:6"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(3), + }, + ), + ), + "Transaction:6-8-4": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:6"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(4), + }, + ), + ), + "Transaction:6-8-5": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:6"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(5), + }, + ), + ), + "Transaction:6-8-6": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:6"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(6), + }, + ), + ), + "Transaction:6-8-7": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:6"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(7), + }, + ), + ), + "Transaction:6-8-8": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:6"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(8), + }, + ), + ), + "Transaction:6-8-9": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:6"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(9), + }, + ), + ), + "Block:6-9": Obj( + "Block", + Json( + Object { + "chain_id": String("Chain:6"), + "hash": String("0x00"), + "number": Number(9), + "parent_hash": String("0x00"), + }, + ), + ), + "Transaction:6-9-0": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:6"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(0), + }, + ), + ), + "Transaction:6-9-1": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:6"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(1), + }, + ), + ), + "Transaction:6-9-2": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:6"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(2), + }, + ), + ), + "Transaction:6-9-3": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:6"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(3), + }, + ), + ), + "Transaction:6-9-4": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:6"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(4), + }, + ), + ), + "Transaction:6-9-5": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:6"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(5), + }, + ), + ), + "Transaction:6-9-6": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:6"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(6), + }, + ), + ), + "Transaction:6-9-7": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:6"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(7), + }, + ), + ), + "Transaction:6-9-8": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:6"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(8), + }, + ), + ), + "Transaction:6-9-9": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:6"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(9), + }, + ), + ), + "Chain:7": Obj( + "Chain", + Json( + Object { + "display_name": String("Chain #7"), + }, + ), + ), + "Block:7-0": Obj( + "Block", + Json( + Object { + "chain_id": String("Chain:7"), + "hash": String("0x00"), + "number": Number(0), + "parent_hash": String("0x00"), + }, + ), + ), + "Transaction:7-0-0": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:7"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(0), + }, + ), + ), + "Transaction:7-0-1": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:7"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(1), + }, + ), + ), + "Transaction:7-0-2": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:7"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(2), + }, + ), + ), + "Transaction:7-0-3": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:7"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(3), + }, + ), + ), + "Transaction:7-0-4": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:7"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(4), + }, + ), + ), + "Transaction:7-0-5": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:7"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(5), + }, + ), + ), + "Transaction:7-0-6": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:7"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(6), + }, + ), + ), + "Transaction:7-0-7": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:7"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(7), + }, + ), + ), + "Transaction:7-0-8": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:7"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(8), + }, + ), + ), + "Transaction:7-0-9": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:7"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(9), + }, + ), + ), + "Block:7-1": Obj( + "Block", + Json( + Object { + "chain_id": String("Chain:7"), + "hash": String("0x00"), + "number": Number(1), + "parent_hash": String("0x00"), + }, + ), + ), + "Transaction:7-1-0": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:7"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(0), + }, + ), + ), + "Transaction:7-1-1": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:7"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(1), + }, + ), + ), + "Transaction:7-1-2": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:7"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(2), + }, + ), + ), + "Transaction:7-1-3": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:7"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(3), + }, + ), + ), + "Transaction:7-1-4": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:7"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(4), + }, + ), + ), + "Transaction:7-1-5": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:7"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(5), + }, + ), + ), + "Transaction:7-1-6": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:7"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(6), + }, + ), + ), + "Transaction:7-1-7": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:7"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(7), + }, + ), + ), + "Transaction:7-1-8": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:7"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(8), + }, + ), + ), + "Transaction:7-1-9": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:7"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(9), + }, + ), + ), + "Block:7-2": Obj( + "Block", + Json( + Object { + "chain_id": String("Chain:7"), + "hash": String("0x00"), + "number": Number(2), + "parent_hash": String("0x00"), + }, + ), + ), + "Transaction:7-2-0": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:7"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(0), + }, + ), + ), + "Transaction:7-2-1": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:7"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(1), + }, + ), + ), + "Transaction:7-2-2": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:7"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(2), + }, + ), + ), + "Transaction:7-2-3": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:7"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(3), + }, + ), + ), + "Transaction:7-2-4": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:7"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(4), + }, + ), + ), + "Transaction:7-2-5": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:7"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(5), + }, + ), + ), + "Transaction:7-2-6": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:7"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(6), + }, + ), + ), + "Transaction:7-2-7": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:7"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(7), + }, + ), + ), + "Transaction:7-2-8": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:7"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(8), + }, + ), + ), + "Transaction:7-2-9": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:7"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(9), + }, + ), + ), + "Block:7-3": Obj( + "Block", + Json( + Object { + "chain_id": String("Chain:7"), + "hash": String("0x00"), + "number": Number(3), + "parent_hash": String("0x00"), + }, + ), + ), + "Transaction:7-3-0": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:7"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(0), + }, + ), + ), + "Transaction:7-3-1": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:7"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(1), + }, + ), + ), + "Transaction:7-3-2": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:7"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(2), + }, + ), + ), + "Transaction:7-3-3": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:7"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(3), + }, + ), + ), + "Transaction:7-3-4": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:7"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(4), + }, + ), + ), + "Transaction:7-3-5": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:7"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(5), + }, + ), + ), + "Transaction:7-3-6": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:7"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(6), + }, + ), + ), + "Transaction:7-3-7": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:7"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(7), + }, + ), + ), + "Transaction:7-3-8": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:7"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(8), + }, + ), + ), + "Transaction:7-3-9": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:7"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(9), + }, + ), + ), + "Block:7-4": Obj( + "Block", + Json( + Object { + "chain_id": String("Chain:7"), + "hash": String("0x00"), + "number": Number(4), + "parent_hash": String("0x00"), + }, + ), + ), + "Transaction:7-4-0": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:7"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(0), + }, + ), + ), + "Transaction:7-4-1": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:7"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(1), + }, + ), + ), + "Transaction:7-4-2": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:7"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(2), + }, + ), + ), + "Transaction:7-4-3": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:7"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(3), + }, + ), + ), + "Transaction:7-4-4": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:7"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(4), + }, + ), + ), + "Transaction:7-4-5": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:7"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(5), + }, + ), + ), + "Transaction:7-4-6": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:7"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(6), + }, + ), + ), + "Transaction:7-4-7": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:7"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(7), + }, + ), + ), + "Transaction:7-4-8": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:7"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(8), + }, + ), + ), + "Transaction:7-4-9": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:7"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(9), + }, + ), + ), + "Block:7-5": Obj( + "Block", + Json( + Object { + "chain_id": String("Chain:7"), + "hash": String("0x00"), + "number": Number(5), + "parent_hash": String("0x00"), + }, + ), + ), + "Transaction:7-5-0": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:7"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(0), + }, + ), + ), + "Transaction:7-5-1": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:7"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(1), + }, + ), + ), + "Transaction:7-5-2": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:7"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(2), + }, + ), + ), + "Transaction:7-5-3": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:7"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(3), + }, + ), + ), + "Transaction:7-5-4": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:7"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(4), + }, + ), + ), + "Transaction:7-5-5": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:7"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(5), + }, + ), + ), + "Transaction:7-5-6": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:7"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(6), + }, + ), + ), + "Transaction:7-5-7": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:7"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(7), + }, + ), + ), + "Transaction:7-5-8": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:7"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(8), + }, + ), + ), + "Transaction:7-5-9": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:7"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(9), + }, + ), + ), + "Block:7-6": Obj( + "Block", + Json( + Object { + "chain_id": String("Chain:7"), + "hash": String("0x00"), + "number": Number(6), + "parent_hash": String("0x00"), + }, + ), + ), + "Transaction:7-6-0": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:7"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(0), + }, + ), + ), + "Transaction:7-6-1": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:7"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(1), + }, + ), + ), + "Transaction:7-6-2": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:7"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(2), + }, + ), + ), + "Transaction:7-6-3": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:7"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(3), + }, + ), + ), + "Transaction:7-6-4": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:7"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(4), + }, + ), + ), + "Transaction:7-6-5": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:7"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(5), + }, + ), + ), + "Transaction:7-6-6": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:7"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(6), + }, + ), + ), + "Transaction:7-6-7": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:7"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(7), + }, + ), + ), + "Transaction:7-6-8": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:7"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(8), + }, + ), + ), + "Transaction:7-6-9": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:7"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(9), + }, + ), + ), + "Block:7-7": Obj( + "Block", + Json( + Object { + "chain_id": String("Chain:7"), + "hash": String("0x00"), + "number": Number(7), + "parent_hash": String("0x00"), + }, + ), + ), + "Transaction:7-7-0": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:7"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(0), + }, + ), + ), + "Transaction:7-7-1": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:7"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(1), + }, + ), + ), + "Transaction:7-7-2": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:7"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(2), + }, + ), + ), + "Transaction:7-7-3": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:7"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(3), + }, + ), + ), + "Transaction:7-7-4": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:7"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(4), + }, + ), + ), + "Transaction:7-7-5": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:7"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(5), + }, + ), + ), + "Transaction:7-7-6": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:7"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(6), + }, + ), + ), + "Transaction:7-7-7": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:7"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(7), + }, + ), + ), + "Transaction:7-7-8": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:7"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(8), + }, + ), + ), + "Transaction:7-7-9": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:7"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(9), + }, + ), + ), + "Block:7-8": Obj( + "Block", + Json( + Object { + "chain_id": String("Chain:7"), + "hash": String("0x00"), + "number": Number(8), + "parent_hash": String("0x00"), + }, + ), + ), + "Transaction:7-8-0": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:7"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(0), + }, + ), + ), + "Transaction:7-8-1": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:7"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(1), + }, + ), + ), + "Transaction:7-8-2": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:7"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(2), + }, + ), + ), + "Transaction:7-8-3": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:7"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(3), + }, + ), + ), + "Transaction:7-8-4": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:7"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(4), + }, + ), + ), + "Transaction:7-8-5": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:7"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(5), + }, + ), + ), + "Transaction:7-8-6": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:7"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(6), + }, + ), + ), + "Transaction:7-8-7": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:7"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(7), + }, + ), + ), + "Transaction:7-8-8": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:7"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(8), + }, + ), + ), + "Transaction:7-8-9": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:7"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(9), + }, + ), + ), + "Block:7-9": Obj( + "Block", + Json( + Object { + "chain_id": String("Chain:7"), + "hash": String("0x00"), + "number": Number(9), + "parent_hash": String("0x00"), + }, + ), + ), + "Transaction:7-9-0": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:7"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(0), + }, + ), + ), + "Transaction:7-9-1": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:7"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(1), + }, + ), + ), + "Transaction:7-9-2": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:7"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(2), + }, + ), + ), + "Transaction:7-9-3": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:7"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(3), + }, + ), + ), + "Transaction:7-9-4": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:7"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(4), + }, + ), + ), + "Transaction:7-9-5": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:7"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(5), + }, + ), + ), + "Transaction:7-9-6": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:7"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(6), + }, + ), + ), + "Transaction:7-9-7": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:7"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(7), + }, + ), + ), + "Transaction:7-9-8": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:7"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(8), + }, + ), + ), + "Transaction:7-9-9": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:7"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(9), + }, + ), + ), + "Chain:8": Obj( + "Chain", + Json( + Object { + "display_name": String("Chain #8"), + }, + ), + ), + "Block:8-0": Obj( + "Block", + Json( + Object { + "chain_id": String("Chain:8"), + "hash": String("0x00"), + "number": Number(0), + "parent_hash": String("0x00"), + }, + ), + ), + "Transaction:8-0-0": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:8"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(0), + }, + ), + ), + "Transaction:8-0-1": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:8"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(1), + }, + ), + ), + "Transaction:8-0-2": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:8"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(2), + }, + ), + ), + "Transaction:8-0-3": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:8"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(3), + }, + ), + ), + "Transaction:8-0-4": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:8"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(4), + }, + ), + ), + "Transaction:8-0-5": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:8"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(5), + }, + ), + ), + "Transaction:8-0-6": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:8"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(6), + }, + ), + ), + "Transaction:8-0-7": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:8"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(7), + }, + ), + ), + "Transaction:8-0-8": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:8"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(8), + }, + ), + ), + "Transaction:8-0-9": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:8"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(9), + }, + ), + ), + "Block:8-1": Obj( + "Block", + Json( + Object { + "chain_id": String("Chain:8"), + "hash": String("0x00"), + "number": Number(1), + "parent_hash": String("0x00"), + }, + ), + ), + "Transaction:8-1-0": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:8"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(0), + }, + ), + ), + "Transaction:8-1-1": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:8"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(1), + }, + ), + ), + "Transaction:8-1-2": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:8"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(2), + }, + ), + ), + "Transaction:8-1-3": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:8"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(3), + }, + ), + ), + "Transaction:8-1-4": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:8"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(4), + }, + ), + ), + "Transaction:8-1-5": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:8"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(5), + }, + ), + ), + "Transaction:8-1-6": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:8"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(6), + }, + ), + ), + "Transaction:8-1-7": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:8"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(7), + }, + ), + ), + "Transaction:8-1-8": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:8"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(8), + }, + ), + ), + "Transaction:8-1-9": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:8"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(9), + }, + ), + ), + "Block:8-2": Obj( + "Block", + Json( + Object { + "chain_id": String("Chain:8"), + "hash": String("0x00"), + "number": Number(2), + "parent_hash": String("0x00"), + }, + ), + ), + "Transaction:8-2-0": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:8"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(0), + }, + ), + ), + "Transaction:8-2-1": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:8"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(1), + }, + ), + ), + "Transaction:8-2-2": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:8"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(2), + }, + ), + ), + "Transaction:8-2-3": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:8"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(3), + }, + ), + ), + "Transaction:8-2-4": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:8"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(4), + }, + ), + ), + "Transaction:8-2-5": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:8"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(5), + }, + ), + ), + "Transaction:8-2-6": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:8"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(6), + }, + ), + ), + "Transaction:8-2-7": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:8"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(7), + }, + ), + ), + "Transaction:8-2-8": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:8"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(8), + }, + ), + ), + "Transaction:8-2-9": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:8"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(9), + }, + ), + ), + "Block:8-3": Obj( + "Block", + Json( + Object { + "chain_id": String("Chain:8"), + "hash": String("0x00"), + "number": Number(3), + "parent_hash": String("0x00"), + }, + ), + ), + "Transaction:8-3-0": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:8"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(0), + }, + ), + ), + "Transaction:8-3-1": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:8"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(1), + }, + ), + ), + "Transaction:8-3-2": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:8"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(2), + }, + ), + ), + "Transaction:8-3-3": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:8"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(3), + }, + ), + ), + "Transaction:8-3-4": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:8"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(4), + }, + ), + ), + "Transaction:8-3-5": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:8"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(5), + }, + ), + ), + "Transaction:8-3-6": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:8"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(6), + }, + ), + ), + "Transaction:8-3-7": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:8"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(7), + }, + ), + ), + "Transaction:8-3-8": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:8"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(8), + }, + ), + ), + "Transaction:8-3-9": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:8"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(9), + }, + ), + ), + "Block:8-4": Obj( + "Block", + Json( + Object { + "chain_id": String("Chain:8"), + "hash": String("0x00"), + "number": Number(4), + "parent_hash": String("0x00"), + }, + ), + ), + "Transaction:8-4-0": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:8"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(0), + }, + ), + ), + "Transaction:8-4-1": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:8"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(1), + }, + ), + ), + "Transaction:8-4-2": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:8"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(2), + }, + ), + ), + "Transaction:8-4-3": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:8"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(3), + }, + ), + ), + "Transaction:8-4-4": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:8"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(4), + }, + ), + ), + "Transaction:8-4-5": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:8"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(5), + }, + ), + ), + "Transaction:8-4-6": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:8"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(6), + }, + ), + ), + "Transaction:8-4-7": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:8"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(7), + }, + ), + ), + "Transaction:8-4-8": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:8"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(8), + }, + ), + ), + "Transaction:8-4-9": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:8"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(9), + }, + ), + ), + "Block:8-5": Obj( + "Block", + Json( + Object { + "chain_id": String("Chain:8"), + "hash": String("0x00"), + "number": Number(5), + "parent_hash": String("0x00"), + }, + ), + ), + "Transaction:8-5-0": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:8"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(0), + }, + ), + ), + "Transaction:8-5-1": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:8"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(1), + }, + ), + ), + "Transaction:8-5-2": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:8"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(2), + }, + ), + ), + "Transaction:8-5-3": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:8"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(3), + }, + ), + ), + "Transaction:8-5-4": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:8"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(4), + }, + ), + ), + "Transaction:8-5-5": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:8"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(5), + }, + ), + ), + "Transaction:8-5-6": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:8"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(6), + }, + ), + ), + "Transaction:8-5-7": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:8"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(7), + }, + ), + ), + "Transaction:8-5-8": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:8"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(8), + }, + ), + ), + "Transaction:8-5-9": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:8"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(9), + }, + ), + ), + "Block:8-6": Obj( + "Block", + Json( + Object { + "chain_id": String("Chain:8"), + "hash": String("0x00"), + "number": Number(6), + "parent_hash": String("0x00"), + }, + ), + ), + "Transaction:8-6-0": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:8"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(0), + }, + ), + ), + "Transaction:8-6-1": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:8"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(1), + }, + ), + ), + "Transaction:8-6-2": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:8"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(2), + }, + ), + ), + "Transaction:8-6-3": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:8"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(3), + }, + ), + ), + "Transaction:8-6-4": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:8"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(4), + }, + ), + ), + "Transaction:8-6-5": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:8"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(5), + }, + ), + ), + "Transaction:8-6-6": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:8"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(6), + }, + ), + ), + "Transaction:8-6-7": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:8"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(7), + }, + ), + ), + "Transaction:8-6-8": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:8"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(8), + }, + ), + ), + "Transaction:8-6-9": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:8"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(9), + }, + ), + ), + "Block:8-7": Obj( + "Block", + Json( + Object { + "chain_id": String("Chain:8"), + "hash": String("0x00"), + "number": Number(7), + "parent_hash": String("0x00"), + }, + ), + ), + "Transaction:8-7-0": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:8"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(0), + }, + ), + ), + "Transaction:8-7-1": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:8"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(1), + }, + ), + ), + "Transaction:8-7-2": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:8"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(2), + }, + ), + ), + "Transaction:8-7-3": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:8"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(3), + }, + ), + ), + "Transaction:8-7-4": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:8"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(4), + }, + ), + ), + "Transaction:8-7-5": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:8"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(5), + }, + ), + ), + "Transaction:8-7-6": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:8"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(6), + }, + ), + ), + "Transaction:8-7-7": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:8"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(7), + }, + ), + ), + "Transaction:8-7-8": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:8"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(8), + }, + ), + ), + "Transaction:8-7-9": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:8"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(9), + }, + ), + ), + "Block:8-8": Obj( + "Block", + Json( + Object { + "chain_id": String("Chain:8"), + "hash": String("0x00"), + "number": Number(8), + "parent_hash": String("0x00"), + }, + ), + ), + "Transaction:8-8-0": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:8"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(0), + }, + ), + ), + "Transaction:8-8-1": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:8"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(1), + }, + ), + ), + "Transaction:8-8-2": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:8"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(2), + }, + ), + ), + "Transaction:8-8-3": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:8"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(3), + }, + ), + ), + "Transaction:8-8-4": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:8"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(4), + }, + ), + ), + "Transaction:8-8-5": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:8"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(5), + }, + ), + ), + "Transaction:8-8-6": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:8"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(6), + }, + ), + ), + "Transaction:8-8-7": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:8"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(7), + }, + ), + ), + "Transaction:8-8-8": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:8"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(8), + }, + ), + ), + "Transaction:8-8-9": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:8"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(9), + }, + ), + ), + "Block:8-9": Obj( + "Block", + Json( + Object { + "chain_id": String("Chain:8"), + "hash": String("0x00"), + "number": Number(9), + "parent_hash": String("0x00"), + }, + ), + ), + "Transaction:8-9-0": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:8"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(0), + }, + ), + ), + "Transaction:8-9-1": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:8"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(1), + }, + ), + ), + "Transaction:8-9-2": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:8"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(2), + }, + ), + ), + "Transaction:8-9-3": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:8"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(3), + }, + ), + ), + "Transaction:8-9-4": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:8"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(4), + }, + ), + ), + "Transaction:8-9-5": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:8"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(5), + }, + ), + ), + "Transaction:8-9-6": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:8"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(6), + }, + ), + ), + "Transaction:8-9-7": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:8"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(7), + }, + ), + ), + "Transaction:8-9-8": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:8"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(8), + }, + ), + ), + "Transaction:8-9-9": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:8"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(9), + }, + ), + ), + "Chain:9": Obj( + "Chain", + Json( + Object { + "display_name": String("Chain #9"), + }, + ), + ), + "Block:9-0": Obj( + "Block", + Json( + Object { + "chain_id": String("Chain:9"), + "hash": String("0x00"), + "number": Number(0), + "parent_hash": String("0x00"), + }, + ), + ), + "Transaction:9-0-0": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:9"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(0), + }, + ), + ), + "Transaction:9-0-1": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:9"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(1), + }, + ), + ), + "Transaction:9-0-2": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:9"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(2), + }, + ), + ), + "Transaction:9-0-3": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:9"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(3), + }, + ), + ), + "Transaction:9-0-4": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:9"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(4), + }, + ), + ), + "Transaction:9-0-5": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:9"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(5), + }, + ), + ), + "Transaction:9-0-6": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:9"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(6), + }, + ), + ), + "Transaction:9-0-7": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:9"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(7), + }, + ), + ), + "Transaction:9-0-8": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:9"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(8), + }, + ), + ), + "Transaction:9-0-9": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:9"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(9), + }, + ), + ), + "Block:9-1": Obj( + "Block", + Json( + Object { + "chain_id": String("Chain:9"), + "hash": String("0x00"), + "number": Number(1), + "parent_hash": String("0x00"), + }, + ), + ), + "Transaction:9-1-0": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:9"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(0), + }, + ), + ), + "Transaction:9-1-1": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:9"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(1), + }, + ), + ), + "Transaction:9-1-2": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:9"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(2), + }, + ), + ), + "Transaction:9-1-3": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:9"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(3), + }, + ), + ), + "Transaction:9-1-4": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:9"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(4), + }, + ), + ), + "Transaction:9-1-5": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:9"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(5), + }, + ), + ), + "Transaction:9-1-6": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:9"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(6), + }, + ), + ), + "Transaction:9-1-7": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:9"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(7), + }, + ), + ), + "Transaction:9-1-8": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:9"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(8), + }, + ), + ), + "Transaction:9-1-9": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:9"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(9), + }, + ), + ), + "Block:9-2": Obj( + "Block", + Json( + Object { + "chain_id": String("Chain:9"), + "hash": String("0x00"), + "number": Number(2), + "parent_hash": String("0x00"), + }, + ), + ), + "Transaction:9-2-0": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:9"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(0), + }, + ), + ), + "Transaction:9-2-1": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:9"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(1), + }, + ), + ), + "Transaction:9-2-2": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:9"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(2), + }, + ), + ), + "Transaction:9-2-3": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:9"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(3), + }, + ), + ), + "Transaction:9-2-4": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:9"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(4), + }, + ), + ), + "Transaction:9-2-5": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:9"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(5), + }, + ), + ), + "Transaction:9-2-6": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:9"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(6), + }, + ), + ), + "Transaction:9-2-7": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:9"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(7), + }, + ), + ), + "Transaction:9-2-8": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:9"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(8), + }, + ), + ), + "Transaction:9-2-9": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:9"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(9), + }, + ), + ), + "Block:9-3": Obj( + "Block", + Json( + Object { + "chain_id": String("Chain:9"), + "hash": String("0x00"), + "number": Number(3), + "parent_hash": String("0x00"), + }, + ), + ), + "Transaction:9-3-0": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:9"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(0), + }, + ), + ), + "Transaction:9-3-1": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:9"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(1), + }, + ), + ), + "Transaction:9-3-2": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:9"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(2), + }, + ), + ), + "Transaction:9-3-3": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:9"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(3), + }, + ), + ), + "Transaction:9-3-4": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:9"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(4), + }, + ), + ), + "Transaction:9-3-5": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:9"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(5), + }, + ), + ), + "Transaction:9-3-6": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:9"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(6), + }, + ), + ), + "Transaction:9-3-7": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:9"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(7), + }, + ), + ), + "Transaction:9-3-8": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:9"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(8), + }, + ), + ), + "Transaction:9-3-9": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:9"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(9), + }, + ), + ), + "Block:9-4": Obj( + "Block", + Json( + Object { + "chain_id": String("Chain:9"), + "hash": String("0x00"), + "number": Number(4), + "parent_hash": String("0x00"), + }, + ), + ), + "Transaction:9-4-0": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:9"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(0), + }, + ), + ), + "Transaction:9-4-1": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:9"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(1), + }, + ), + ), + "Transaction:9-4-2": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:9"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(2), + }, + ), + ), + "Transaction:9-4-3": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:9"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(3), + }, + ), + ), + "Transaction:9-4-4": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:9"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(4), + }, + ), + ), + "Transaction:9-4-5": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:9"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(5), + }, + ), + ), + "Transaction:9-4-6": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:9"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(6), + }, + ), + ), + "Transaction:9-4-7": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:9"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(7), + }, + ), + ), + "Transaction:9-4-8": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:9"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(8), + }, + ), + ), + "Transaction:9-4-9": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:9"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(9), + }, + ), + ), + "Block:9-5": Obj( + "Block", + Json( + Object { + "chain_id": String("Chain:9"), + "hash": String("0x00"), + "number": Number(5), + "parent_hash": String("0x00"), + }, + ), + ), + "Transaction:9-5-0": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:9"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(0), + }, + ), + ), + "Transaction:9-5-1": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:9"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(1), + }, + ), + ), + "Transaction:9-5-2": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:9"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(2), + }, + ), + ), + "Transaction:9-5-3": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:9"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(3), + }, + ), + ), + "Transaction:9-5-4": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:9"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(4), + }, + ), + ), + "Transaction:9-5-5": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:9"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(5), + }, + ), + ), + "Transaction:9-5-6": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:9"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(6), + }, + ), + ), + "Transaction:9-5-7": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:9"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(7), + }, + ), + ), + "Transaction:9-5-8": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:9"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(8), + }, + ), + ), + "Transaction:9-5-9": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:9"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(9), + }, + ), + ), + "Block:9-6": Obj( + "Block", + Json( + Object { + "chain_id": String("Chain:9"), + "hash": String("0x00"), + "number": Number(6), + "parent_hash": String("0x00"), + }, + ), + ), + "Transaction:9-6-0": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:9"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(0), + }, + ), + ), + "Transaction:9-6-1": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:9"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(1), + }, + ), + ), + "Transaction:9-6-2": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:9"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(2), + }, + ), + ), + "Transaction:9-6-3": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:9"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(3), + }, + ), + ), + "Transaction:9-6-4": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:9"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(4), + }, + ), + ), + "Transaction:9-6-5": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:9"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(5), + }, + ), + ), + "Transaction:9-6-6": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:9"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(6), + }, + ), + ), + "Transaction:9-6-7": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:9"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(7), + }, + ), + ), + "Transaction:9-6-8": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:9"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(8), + }, + ), + ), + "Transaction:9-6-9": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:9"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(9), + }, + ), + ), + "Block:9-7": Obj( + "Block", + Json( + Object { + "chain_id": String("Chain:9"), + "hash": String("0x00"), + "number": Number(7), + "parent_hash": String("0x00"), + }, + ), + ), + "Transaction:9-7-0": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:9"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(0), + }, + ), + ), + "Transaction:9-7-1": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:9"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(1), + }, + ), + ), + "Transaction:9-7-2": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:9"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(2), + }, + ), + ), + "Transaction:9-7-3": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:9"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(3), + }, + ), + ), + "Transaction:9-7-4": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:9"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(4), + }, + ), + ), + "Transaction:9-7-5": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:9"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(5), + }, + ), + ), + "Transaction:9-7-6": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:9"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(6), + }, + ), + ), + "Transaction:9-7-7": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:9"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(7), + }, + ), + ), + "Transaction:9-7-8": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:9"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(8), + }, + ), + ), + "Transaction:9-7-9": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:9"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(9), + }, + ), + ), + "Block:9-8": Obj( + "Block", + Json( + Object { + "chain_id": String("Chain:9"), + "hash": String("0x00"), + "number": Number(8), + "parent_hash": String("0x00"), + }, + ), + ), + "Transaction:9-8-0": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:9"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(0), + }, + ), + ), + "Transaction:9-8-1": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:9"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(1), + }, + ), + ), + "Transaction:9-8-2": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:9"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(2), + }, + ), + ), + "Transaction:9-8-3": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:9"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(3), + }, + ), + ), + "Transaction:9-8-4": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:9"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(4), + }, + ), + ), + "Transaction:9-8-5": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:9"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(5), + }, + ), + ), + "Transaction:9-8-6": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:9"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(6), + }, + ), + ), + "Transaction:9-8-7": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:9"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(7), + }, + ), + ), + "Transaction:9-8-8": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:9"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(8), + }, + ), + ), + "Transaction:9-8-9": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:9"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(9), + }, + ), + ), + "Block:9-9": Obj( + "Block", + Json( + Object { + "chain_id": String("Chain:9"), + "hash": String("0x00"), + "number": Number(9), + "parent_hash": String("0x00"), + }, + ), + ), + "Transaction:9-9-0": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:9"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(0), + }, + ), + ), + "Transaction:9-9-1": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:9"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(1), + }, + ), + ), + "Transaction:9-9-2": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:9"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(2), + }, + ), + ), + "Transaction:9-9-3": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:9"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(3), + }, + ), + ), + "Transaction:9-9-4": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:9"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(4), + }, + ), + ), + "Transaction:9-9-5": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:9"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(5), + }, + ), + ), + "Transaction:9-9-6": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:9"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(6), + }, + ), + ), + "Transaction:9-9-7": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:9"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(7), + }, + ), + ), + "Transaction:9-9-8": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:9"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(8), + }, + ), + ), + "Transaction:9-9-9": Obj( + "Transaction", + Json( + Object { + "block_hash": String("0"), + "chain_id": String("Chain:9"), + "gas_limit": Number(32423), + "gas_price": Number(12312), + "hash": String("0x00"), + "index": Number(9), + }, + ), + ), + }, + assoc_map: { + AssocKey( + "Chain:0", + "ChainHasBlock", + ): [ + Assoc( + "Block:0-0", + 0, + Json( + Null, + ), + ), + Assoc( + "Block:0-1", + 21, + Json( + Null, + ), + ), + Assoc( + "Block:0-2", + 42, + Json( + Null, + ), + ), + Assoc( + "Block:0-3", + 63, + Json( + Null, + ), + ), + Assoc( + "Block:0-4", + 84, + Json( + Null, + ), + ), + Assoc( + "Block:0-5", + 105, + Json( + Null, + ), + ), + Assoc( + "Block:0-6", + 126, + Json( + Null, + ), + ), + Assoc( + "Block:0-7", + 147, + Json( + Null, + ), + ), + Assoc( + "Block:0-8", + 168, + Json( + Null, + ), + ), + Assoc( + "Block:0-9", + 189, + Json( + Null, + ), + ), + ], + AssocKey( + "Block:0-0", + "BlockHasTransaction", + ): [ + Assoc( + "Transaction:0-0-0", + 1, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-0-1", + 3, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-0-2", + 5, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-0-3", + 7, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-0-4", + 9, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-0-5", + 11, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-0-6", + 13, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-0-7", + 15, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-0-8", + 17, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-0-9", + 19, + Json( + Null, + ), + ), + ], + AssocKey( + "Chain:0", + "ChainHasTransaction", + ): [ + Assoc( + "Transaction:0-0-0", + 2, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-0-1", + 4, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-0-2", + 6, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-0-3", + 8, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-0-4", + 10, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-0-5", + 12, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-0-6", + 14, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-0-7", + 16, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-0-8", + 18, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-0-9", + 20, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-1-0", + 23, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-1-1", + 25, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-1-2", + 27, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-1-3", + 29, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-1-4", + 31, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-1-5", + 33, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-1-6", + 35, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-1-7", + 37, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-1-8", + 39, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-1-9", + 41, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-2-0", + 44, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-2-1", + 46, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-2-2", + 48, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-2-3", + 50, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-2-4", + 52, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-2-5", + 54, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-2-6", + 56, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-2-7", + 58, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-2-8", + 60, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-2-9", + 62, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-3-0", + 65, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-3-1", + 67, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-3-2", + 69, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-3-3", + 71, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-3-4", + 73, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-3-5", + 75, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-3-6", + 77, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-3-7", + 79, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-3-8", + 81, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-3-9", + 83, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-4-0", + 86, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-4-1", + 88, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-4-2", + 90, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-4-3", + 92, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-4-4", + 94, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-4-5", + 96, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-4-6", + 98, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-4-7", + 100, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-4-8", + 102, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-4-9", + 104, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-5-0", + 107, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-5-1", + 109, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-5-2", + 111, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-5-3", + 113, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-5-4", + 115, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-5-5", + 117, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-5-6", + 119, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-5-7", + 121, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-5-8", + 123, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-5-9", + 125, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-6-0", + 128, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-6-1", + 130, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-6-2", + 132, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-6-3", + 134, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-6-4", + 136, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-6-5", + 138, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-6-6", + 140, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-6-7", + 142, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-6-8", + 144, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-6-9", + 146, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-7-0", + 149, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-7-1", + 151, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-7-2", + 153, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-7-3", + 155, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-7-4", + 157, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-7-5", + 159, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-7-6", + 161, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-7-7", + 163, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-7-8", + 165, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-7-9", + 167, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-8-0", + 170, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-8-1", + 172, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-8-2", + 174, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-8-3", + 176, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-8-4", + 178, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-8-5", + 180, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-8-6", + 182, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-8-7", + 184, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-8-8", + 186, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-8-9", + 188, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-9-0", + 191, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-9-1", + 193, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-9-2", + 195, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-9-3", + 197, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-9-4", + 199, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-9-5", + 201, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-9-6", + 203, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-9-7", + 205, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-9-8", + 207, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-9-9", + 209, + Json( + Null, + ), + ), + ], + AssocKey( + "Block:0-1", + "BlockHasTransaction", + ): [ + Assoc( + "Transaction:0-1-0", + 22, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-1-1", + 24, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-1-2", + 26, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-1-3", + 28, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-1-4", + 30, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-1-5", + 32, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-1-6", + 34, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-1-7", + 36, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-1-8", + 38, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-1-9", + 40, + Json( + Null, + ), + ), + ], + AssocKey( + "Block:0-2", + "BlockHasTransaction", + ): [ + Assoc( + "Transaction:0-2-0", + 43, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-2-1", + 45, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-2-2", + 47, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-2-3", + 49, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-2-4", + 51, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-2-5", + 53, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-2-6", + 55, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-2-7", + 57, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-2-8", + 59, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-2-9", + 61, + Json( + Null, + ), + ), + ], + AssocKey( + "Block:0-3", + "BlockHasTransaction", + ): [ + Assoc( + "Transaction:0-3-0", + 64, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-3-1", + 66, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-3-2", + 68, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-3-3", + 70, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-3-4", + 72, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-3-5", + 74, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-3-6", + 76, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-3-7", + 78, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-3-8", + 80, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-3-9", + 82, + Json( + Null, + ), + ), + ], + AssocKey( + "Block:0-4", + "BlockHasTransaction", + ): [ + Assoc( + "Transaction:0-4-0", + 85, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-4-1", + 87, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-4-2", + 89, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-4-3", + 91, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-4-4", + 93, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-4-5", + 95, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-4-6", + 97, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-4-7", + 99, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-4-8", + 101, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-4-9", + 103, + Json( + Null, + ), + ), + ], + AssocKey( + "Block:0-5", + "BlockHasTransaction", + ): [ + Assoc( + "Transaction:0-5-0", + 106, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-5-1", + 108, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-5-2", + 110, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-5-3", + 112, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-5-4", + 114, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-5-5", + 116, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-5-6", + 118, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-5-7", + 120, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-5-8", + 122, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-5-9", + 124, + Json( + Null, + ), + ), + ], + AssocKey( + "Block:0-6", + "BlockHasTransaction", + ): [ + Assoc( + "Transaction:0-6-0", + 127, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-6-1", + 129, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-6-2", + 131, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-6-3", + 133, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-6-4", + 135, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-6-5", + 137, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-6-6", + 139, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-6-7", + 141, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-6-8", + 143, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-6-9", + 145, + Json( + Null, + ), + ), + ], + AssocKey( + "Block:0-7", + "BlockHasTransaction", + ): [ + Assoc( + "Transaction:0-7-0", + 148, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-7-1", + 150, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-7-2", + 152, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-7-3", + 154, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-7-4", + 156, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-7-5", + 158, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-7-6", + 160, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-7-7", + 162, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-7-8", + 164, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-7-9", + 166, + Json( + Null, + ), + ), + ], + AssocKey( + "Block:0-8", + "BlockHasTransaction", + ): [ + Assoc( + "Transaction:0-8-0", + 169, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-8-1", + 171, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-8-2", + 173, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-8-3", + 175, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-8-4", + 177, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-8-5", + 179, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-8-6", + 181, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-8-7", + 183, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-8-8", + 185, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-8-9", + 187, + Json( + Null, + ), + ), + ], + AssocKey( + "Block:0-9", + "BlockHasTransaction", + ): [ + Assoc( + "Transaction:0-9-0", + 190, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-9-1", + 192, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-9-2", + 194, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-9-3", + 196, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-9-4", + 198, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-9-5", + 200, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-9-6", + 202, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-9-7", + 204, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-9-8", + 206, + Json( + Null, + ), + ), + Assoc( + "Transaction:0-9-9", + 208, + Json( + Null, + ), + ), + ], + AssocKey( + "Chain:1", + "ChainHasBlock", + ): [ + Assoc( + "Block:1-0", + 210, + Json( + Null, + ), + ), + Assoc( + "Block:1-1", + 231, + Json( + Null, + ), + ), + Assoc( + "Block:1-2", + 252, + Json( + Null, + ), + ), + Assoc( + "Block:1-3", + 273, + Json( + Null, + ), + ), + Assoc( + "Block:1-4", + 294, + Json( + Null, + ), + ), + Assoc( + "Block:1-5", + 315, + Json( + Null, + ), + ), + Assoc( + "Block:1-6", + 336, + Json( + Null, + ), + ), + Assoc( + "Block:1-7", + 357, + Json( + Null, + ), + ), + Assoc( + "Block:1-8", + 378, + Json( + Null, + ), + ), + Assoc( + "Block:1-9", + 399, + Json( + Null, + ), + ), + ], + AssocKey( + "Block:1-0", + "BlockHasTransaction", + ): [ + Assoc( + "Transaction:1-0-0", + 211, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-0-1", + 213, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-0-2", + 215, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-0-3", + 217, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-0-4", + 219, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-0-5", + 221, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-0-6", + 223, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-0-7", + 225, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-0-8", + 227, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-0-9", + 229, + Json( + Null, + ), + ), + ], + AssocKey( + "Chain:1", + "ChainHasTransaction", + ): [ + Assoc( + "Transaction:1-0-0", + 212, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-0-1", + 214, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-0-2", + 216, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-0-3", + 218, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-0-4", + 220, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-0-5", + 222, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-0-6", + 224, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-0-7", + 226, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-0-8", + 228, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-0-9", + 230, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-1-0", + 233, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-1-1", + 235, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-1-2", + 237, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-1-3", + 239, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-1-4", + 241, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-1-5", + 243, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-1-6", + 245, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-1-7", + 247, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-1-8", + 249, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-1-9", + 251, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-2-0", + 254, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-2-1", + 256, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-2-2", + 258, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-2-3", + 260, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-2-4", + 262, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-2-5", + 264, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-2-6", + 266, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-2-7", + 268, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-2-8", + 270, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-2-9", + 272, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-3-0", + 275, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-3-1", + 277, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-3-2", + 279, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-3-3", + 281, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-3-4", + 283, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-3-5", + 285, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-3-6", + 287, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-3-7", + 289, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-3-8", + 291, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-3-9", + 293, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-4-0", + 296, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-4-1", + 298, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-4-2", + 300, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-4-3", + 302, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-4-4", + 304, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-4-5", + 306, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-4-6", + 308, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-4-7", + 310, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-4-8", + 312, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-4-9", + 314, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-5-0", + 317, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-5-1", + 319, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-5-2", + 321, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-5-3", + 323, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-5-4", + 325, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-5-5", + 327, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-5-6", + 329, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-5-7", + 331, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-5-8", + 333, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-5-9", + 335, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-6-0", + 338, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-6-1", + 340, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-6-2", + 342, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-6-3", + 344, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-6-4", + 346, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-6-5", + 348, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-6-6", + 350, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-6-7", + 352, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-6-8", + 354, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-6-9", + 356, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-7-0", + 359, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-7-1", + 361, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-7-2", + 363, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-7-3", + 365, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-7-4", + 367, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-7-5", + 369, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-7-6", + 371, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-7-7", + 373, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-7-8", + 375, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-7-9", + 377, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-8-0", + 380, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-8-1", + 382, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-8-2", + 384, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-8-3", + 386, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-8-4", + 388, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-8-5", + 390, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-8-6", + 392, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-8-7", + 394, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-8-8", + 396, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-8-9", + 398, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-9-0", + 401, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-9-1", + 403, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-9-2", + 405, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-9-3", + 407, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-9-4", + 409, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-9-5", + 411, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-9-6", + 413, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-9-7", + 415, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-9-8", + 417, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-9-9", + 419, + Json( + Null, + ), + ), + ], + AssocKey( + "Block:1-1", + "BlockHasTransaction", + ): [ + Assoc( + "Transaction:1-1-0", + 232, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-1-1", + 234, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-1-2", + 236, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-1-3", + 238, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-1-4", + 240, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-1-5", + 242, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-1-6", + 244, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-1-7", + 246, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-1-8", + 248, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-1-9", + 250, + Json( + Null, + ), + ), + ], + AssocKey( + "Block:1-2", + "BlockHasTransaction", + ): [ + Assoc( + "Transaction:1-2-0", + 253, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-2-1", + 255, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-2-2", + 257, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-2-3", + 259, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-2-4", + 261, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-2-5", + 263, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-2-6", + 265, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-2-7", + 267, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-2-8", + 269, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-2-9", + 271, + Json( + Null, + ), + ), + ], + AssocKey( + "Block:1-3", + "BlockHasTransaction", + ): [ + Assoc( + "Transaction:1-3-0", + 274, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-3-1", + 276, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-3-2", + 278, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-3-3", + 280, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-3-4", + 282, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-3-5", + 284, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-3-6", + 286, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-3-7", + 288, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-3-8", + 290, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-3-9", + 292, + Json( + Null, + ), + ), + ], + AssocKey( + "Block:1-4", + "BlockHasTransaction", + ): [ + Assoc( + "Transaction:1-4-0", + 295, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-4-1", + 297, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-4-2", + 299, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-4-3", + 301, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-4-4", + 303, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-4-5", + 305, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-4-6", + 307, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-4-7", + 309, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-4-8", + 311, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-4-9", + 313, + Json( + Null, + ), + ), + ], + AssocKey( + "Block:1-5", + "BlockHasTransaction", + ): [ + Assoc( + "Transaction:1-5-0", + 316, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-5-1", + 318, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-5-2", + 320, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-5-3", + 322, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-5-4", + 324, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-5-5", + 326, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-5-6", + 328, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-5-7", + 330, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-5-8", + 332, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-5-9", + 334, + Json( + Null, + ), + ), + ], + AssocKey( + "Block:1-6", + "BlockHasTransaction", + ): [ + Assoc( + "Transaction:1-6-0", + 337, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-6-1", + 339, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-6-2", + 341, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-6-3", + 343, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-6-4", + 345, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-6-5", + 347, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-6-6", + 349, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-6-7", + 351, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-6-8", + 353, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-6-9", + 355, + Json( + Null, + ), + ), + ], + AssocKey( + "Block:1-7", + "BlockHasTransaction", + ): [ + Assoc( + "Transaction:1-7-0", + 358, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-7-1", + 360, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-7-2", + 362, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-7-3", + 364, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-7-4", + 366, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-7-5", + 368, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-7-6", + 370, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-7-7", + 372, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-7-8", + 374, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-7-9", + 376, + Json( + Null, + ), + ), + ], + AssocKey( + "Block:1-8", + "BlockHasTransaction", + ): [ + Assoc( + "Transaction:1-8-0", + 379, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-8-1", + 381, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-8-2", + 383, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-8-3", + 385, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-8-4", + 387, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-8-5", + 389, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-8-6", + 391, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-8-7", + 393, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-8-8", + 395, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-8-9", + 397, + Json( + Null, + ), + ), + ], + AssocKey( + "Block:1-9", + "BlockHasTransaction", + ): [ + Assoc( + "Transaction:1-9-0", + 400, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-9-1", + 402, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-9-2", + 404, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-9-3", + 406, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-9-4", + 408, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-9-5", + 410, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-9-6", + 412, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-9-7", + 414, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-9-8", + 416, + Json( + Null, + ), + ), + Assoc( + "Transaction:1-9-9", + 418, + Json( + Null, + ), + ), + ], + AssocKey( + "Chain:2", + "ChainHasBlock", + ): [ + Assoc( + "Block:2-0", + 420, + Json( + Null, + ), + ), + Assoc( + "Block:2-1", + 441, + Json( + Null, + ), + ), + Assoc( + "Block:2-2", + 462, + Json( + Null, + ), + ), + Assoc( + "Block:2-3", + 483, + Json( + Null, + ), + ), + Assoc( + "Block:2-4", + 504, + Json( + Null, + ), + ), + Assoc( + "Block:2-5", + 525, + Json( + Null, + ), + ), + Assoc( + "Block:2-6", + 546, + Json( + Null, + ), + ), + Assoc( + "Block:2-7", + 567, + Json( + Null, + ), + ), + Assoc( + "Block:2-8", + 588, + Json( + Null, + ), + ), + Assoc( + "Block:2-9", + 609, + Json( + Null, + ), + ), + ], + AssocKey( + "Block:2-0", + "BlockHasTransaction", + ): [ + Assoc( + "Transaction:2-0-0", + 421, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-0-1", + 423, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-0-2", + 425, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-0-3", + 427, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-0-4", + 429, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-0-5", + 431, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-0-6", + 433, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-0-7", + 435, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-0-8", + 437, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-0-9", + 439, + Json( + Null, + ), + ), + ], + AssocKey( + "Chain:2", + "ChainHasTransaction", + ): [ + Assoc( + "Transaction:2-0-0", + 422, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-0-1", + 424, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-0-2", + 426, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-0-3", + 428, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-0-4", + 430, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-0-5", + 432, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-0-6", + 434, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-0-7", + 436, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-0-8", + 438, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-0-9", + 440, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-1-0", + 443, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-1-1", + 445, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-1-2", + 447, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-1-3", + 449, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-1-4", + 451, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-1-5", + 453, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-1-6", + 455, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-1-7", + 457, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-1-8", + 459, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-1-9", + 461, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-2-0", + 464, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-2-1", + 466, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-2-2", + 468, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-2-3", + 470, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-2-4", + 472, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-2-5", + 474, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-2-6", + 476, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-2-7", + 478, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-2-8", + 480, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-2-9", + 482, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-3-0", + 485, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-3-1", + 487, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-3-2", + 489, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-3-3", + 491, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-3-4", + 493, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-3-5", + 495, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-3-6", + 497, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-3-7", + 499, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-3-8", + 501, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-3-9", + 503, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-4-0", + 506, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-4-1", + 508, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-4-2", + 510, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-4-3", + 512, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-4-4", + 514, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-4-5", + 516, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-4-6", + 518, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-4-7", + 520, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-4-8", + 522, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-4-9", + 524, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-5-0", + 527, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-5-1", + 529, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-5-2", + 531, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-5-3", + 533, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-5-4", + 535, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-5-5", + 537, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-5-6", + 539, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-5-7", + 541, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-5-8", + 543, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-5-9", + 545, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-6-0", + 548, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-6-1", + 550, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-6-2", + 552, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-6-3", + 554, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-6-4", + 556, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-6-5", + 558, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-6-6", + 560, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-6-7", + 562, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-6-8", + 564, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-6-9", + 566, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-7-0", + 569, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-7-1", + 571, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-7-2", + 573, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-7-3", + 575, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-7-4", + 577, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-7-5", + 579, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-7-6", + 581, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-7-7", + 583, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-7-8", + 585, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-7-9", + 587, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-8-0", + 590, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-8-1", + 592, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-8-2", + 594, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-8-3", + 596, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-8-4", + 598, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-8-5", + 600, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-8-6", + 602, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-8-7", + 604, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-8-8", + 606, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-8-9", + 608, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-9-0", + 611, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-9-1", + 613, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-9-2", + 615, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-9-3", + 617, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-9-4", + 619, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-9-5", + 621, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-9-6", + 623, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-9-7", + 625, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-9-8", + 627, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-9-9", + 629, + Json( + Null, + ), + ), + ], + AssocKey( + "Block:2-1", + "BlockHasTransaction", + ): [ + Assoc( + "Transaction:2-1-0", + 442, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-1-1", + 444, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-1-2", + 446, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-1-3", + 448, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-1-4", + 450, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-1-5", + 452, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-1-6", + 454, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-1-7", + 456, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-1-8", + 458, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-1-9", + 460, + Json( + Null, + ), + ), + ], + AssocKey( + "Block:2-2", + "BlockHasTransaction", + ): [ + Assoc( + "Transaction:2-2-0", + 463, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-2-1", + 465, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-2-2", + 467, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-2-3", + 469, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-2-4", + 471, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-2-5", + 473, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-2-6", + 475, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-2-7", + 477, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-2-8", + 479, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-2-9", + 481, + Json( + Null, + ), + ), + ], + AssocKey( + "Block:2-3", + "BlockHasTransaction", + ): [ + Assoc( + "Transaction:2-3-0", + 484, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-3-1", + 486, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-3-2", + 488, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-3-3", + 490, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-3-4", + 492, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-3-5", + 494, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-3-6", + 496, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-3-7", + 498, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-3-8", + 500, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-3-9", + 502, + Json( + Null, + ), + ), + ], + AssocKey( + "Block:2-4", + "BlockHasTransaction", + ): [ + Assoc( + "Transaction:2-4-0", + 505, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-4-1", + 507, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-4-2", + 509, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-4-3", + 511, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-4-4", + 513, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-4-5", + 515, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-4-6", + 517, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-4-7", + 519, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-4-8", + 521, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-4-9", + 523, + Json( + Null, + ), + ), + ], + AssocKey( + "Block:2-5", + "BlockHasTransaction", + ): [ + Assoc( + "Transaction:2-5-0", + 526, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-5-1", + 528, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-5-2", + 530, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-5-3", + 532, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-5-4", + 534, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-5-5", + 536, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-5-6", + 538, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-5-7", + 540, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-5-8", + 542, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-5-9", + 544, + Json( + Null, + ), + ), + ], + AssocKey( + "Block:2-6", + "BlockHasTransaction", + ): [ + Assoc( + "Transaction:2-6-0", + 547, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-6-1", + 549, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-6-2", + 551, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-6-3", + 553, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-6-4", + 555, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-6-5", + 557, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-6-6", + 559, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-6-7", + 561, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-6-8", + 563, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-6-9", + 565, + Json( + Null, + ), + ), + ], + AssocKey( + "Block:2-7", + "BlockHasTransaction", + ): [ + Assoc( + "Transaction:2-7-0", + 568, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-7-1", + 570, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-7-2", + 572, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-7-3", + 574, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-7-4", + 576, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-7-5", + 578, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-7-6", + 580, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-7-7", + 582, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-7-8", + 584, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-7-9", + 586, + Json( + Null, + ), + ), + ], + AssocKey( + "Block:2-8", + "BlockHasTransaction", + ): [ + Assoc( + "Transaction:2-8-0", + 589, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-8-1", + 591, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-8-2", + 593, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-8-3", + 595, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-8-4", + 597, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-8-5", + 599, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-8-6", + 601, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-8-7", + 603, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-8-8", + 605, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-8-9", + 607, + Json( + Null, + ), + ), + ], + AssocKey( + "Block:2-9", + "BlockHasTransaction", + ): [ + Assoc( + "Transaction:2-9-0", + 610, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-9-1", + 612, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-9-2", + 614, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-9-3", + 616, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-9-4", + 618, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-9-5", + 620, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-9-6", + 622, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-9-7", + 624, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-9-8", + 626, + Json( + Null, + ), + ), + Assoc( + "Transaction:2-9-9", + 628, + Json( + Null, + ), + ), + ], + AssocKey( + "Chain:3", + "ChainHasBlock", + ): [ + Assoc( + "Block:3-0", + 630, + Json( + Null, + ), + ), + Assoc( + "Block:3-1", + 651, + Json( + Null, + ), + ), + Assoc( + "Block:3-2", + 672, + Json( + Null, + ), + ), + Assoc( + "Block:3-3", + 693, + Json( + Null, + ), + ), + Assoc( + "Block:3-4", + 714, + Json( + Null, + ), + ), + Assoc( + "Block:3-5", + 735, + Json( + Null, + ), + ), + Assoc( + "Block:3-6", + 756, + Json( + Null, + ), + ), + Assoc( + "Block:3-7", + 777, + Json( + Null, + ), + ), + Assoc( + "Block:3-8", + 798, + Json( + Null, + ), + ), + Assoc( + "Block:3-9", + 819, + Json( + Null, + ), + ), + ], + AssocKey( + "Block:3-0", + "BlockHasTransaction", + ): [ + Assoc( + "Transaction:3-0-0", + 631, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-0-1", + 633, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-0-2", + 635, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-0-3", + 637, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-0-4", + 639, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-0-5", + 641, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-0-6", + 643, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-0-7", + 645, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-0-8", + 647, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-0-9", + 649, + Json( + Null, + ), + ), + ], + AssocKey( + "Chain:3", + "ChainHasTransaction", + ): [ + Assoc( + "Transaction:3-0-0", + 632, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-0-1", + 634, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-0-2", + 636, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-0-3", + 638, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-0-4", + 640, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-0-5", + 642, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-0-6", + 644, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-0-7", + 646, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-0-8", + 648, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-0-9", + 650, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-1-0", + 653, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-1-1", + 655, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-1-2", + 657, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-1-3", + 659, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-1-4", + 661, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-1-5", + 663, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-1-6", + 665, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-1-7", + 667, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-1-8", + 669, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-1-9", + 671, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-2-0", + 674, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-2-1", + 676, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-2-2", + 678, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-2-3", + 680, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-2-4", + 682, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-2-5", + 684, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-2-6", + 686, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-2-7", + 688, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-2-8", + 690, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-2-9", + 692, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-3-0", + 695, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-3-1", + 697, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-3-2", + 699, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-3-3", + 701, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-3-4", + 703, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-3-5", + 705, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-3-6", + 707, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-3-7", + 709, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-3-8", + 711, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-3-9", + 713, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-4-0", + 716, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-4-1", + 718, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-4-2", + 720, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-4-3", + 722, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-4-4", + 724, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-4-5", + 726, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-4-6", + 728, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-4-7", + 730, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-4-8", + 732, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-4-9", + 734, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-5-0", + 737, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-5-1", + 739, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-5-2", + 741, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-5-3", + 743, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-5-4", + 745, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-5-5", + 747, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-5-6", + 749, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-5-7", + 751, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-5-8", + 753, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-5-9", + 755, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-6-0", + 758, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-6-1", + 760, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-6-2", + 762, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-6-3", + 764, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-6-4", + 766, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-6-5", + 768, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-6-6", + 770, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-6-7", + 772, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-6-8", + 774, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-6-9", + 776, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-7-0", + 779, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-7-1", + 781, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-7-2", + 783, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-7-3", + 785, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-7-4", + 787, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-7-5", + 789, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-7-6", + 791, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-7-7", + 793, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-7-8", + 795, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-7-9", + 797, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-8-0", + 800, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-8-1", + 802, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-8-2", + 804, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-8-3", + 806, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-8-4", + 808, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-8-5", + 810, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-8-6", + 812, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-8-7", + 814, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-8-8", + 816, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-8-9", + 818, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-9-0", + 821, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-9-1", + 823, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-9-2", + 825, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-9-3", + 827, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-9-4", + 829, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-9-5", + 831, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-9-6", + 833, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-9-7", + 835, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-9-8", + 837, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-9-9", + 839, + Json( + Null, + ), + ), + ], + AssocKey( + "Block:3-1", + "BlockHasTransaction", + ): [ + Assoc( + "Transaction:3-1-0", + 652, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-1-1", + 654, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-1-2", + 656, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-1-3", + 658, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-1-4", + 660, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-1-5", + 662, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-1-6", + 664, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-1-7", + 666, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-1-8", + 668, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-1-9", + 670, + Json( + Null, + ), + ), + ], + AssocKey( + "Block:3-2", + "BlockHasTransaction", + ): [ + Assoc( + "Transaction:3-2-0", + 673, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-2-1", + 675, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-2-2", + 677, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-2-3", + 679, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-2-4", + 681, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-2-5", + 683, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-2-6", + 685, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-2-7", + 687, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-2-8", + 689, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-2-9", + 691, + Json( + Null, + ), + ), + ], + AssocKey( + "Block:3-3", + "BlockHasTransaction", + ): [ + Assoc( + "Transaction:3-3-0", + 694, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-3-1", + 696, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-3-2", + 698, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-3-3", + 700, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-3-4", + 702, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-3-5", + 704, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-3-6", + 706, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-3-7", + 708, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-3-8", + 710, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-3-9", + 712, + Json( + Null, + ), + ), + ], + AssocKey( + "Block:3-4", + "BlockHasTransaction", + ): [ + Assoc( + "Transaction:3-4-0", + 715, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-4-1", + 717, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-4-2", + 719, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-4-3", + 721, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-4-4", + 723, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-4-5", + 725, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-4-6", + 727, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-4-7", + 729, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-4-8", + 731, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-4-9", + 733, + Json( + Null, + ), + ), + ], + AssocKey( + "Block:3-5", + "BlockHasTransaction", + ): [ + Assoc( + "Transaction:3-5-0", + 736, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-5-1", + 738, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-5-2", + 740, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-5-3", + 742, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-5-4", + 744, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-5-5", + 746, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-5-6", + 748, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-5-7", + 750, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-5-8", + 752, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-5-9", + 754, + Json( + Null, + ), + ), + ], + AssocKey( + "Block:3-6", + "BlockHasTransaction", + ): [ + Assoc( + "Transaction:3-6-0", + 757, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-6-1", + 759, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-6-2", + 761, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-6-3", + 763, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-6-4", + 765, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-6-5", + 767, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-6-6", + 769, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-6-7", + 771, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-6-8", + 773, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-6-9", + 775, + Json( + Null, + ), + ), + ], + AssocKey( + "Block:3-7", + "BlockHasTransaction", + ): [ + Assoc( + "Transaction:3-7-0", + 778, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-7-1", + 780, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-7-2", + 782, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-7-3", + 784, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-7-4", + 786, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-7-5", + 788, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-7-6", + 790, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-7-7", + 792, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-7-8", + 794, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-7-9", + 796, + Json( + Null, + ), + ), + ], + AssocKey( + "Block:3-8", + "BlockHasTransaction", + ): [ + Assoc( + "Transaction:3-8-0", + 799, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-8-1", + 801, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-8-2", + 803, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-8-3", + 805, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-8-4", + 807, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-8-5", + 809, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-8-6", + 811, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-8-7", + 813, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-8-8", + 815, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-8-9", + 817, + Json( + Null, + ), + ), + ], + AssocKey( + "Block:3-9", + "BlockHasTransaction", + ): [ + Assoc( + "Transaction:3-9-0", + 820, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-9-1", + 822, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-9-2", + 824, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-9-3", + 826, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-9-4", + 828, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-9-5", + 830, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-9-6", + 832, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-9-7", + 834, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-9-8", + 836, + Json( + Null, + ), + ), + Assoc( + "Transaction:3-9-9", + 838, + Json( + Null, + ), + ), + ], + AssocKey( + "Chain:4", + "ChainHasBlock", + ): [ + Assoc( + "Block:4-0", + 840, + Json( + Null, + ), + ), + Assoc( + "Block:4-1", + 861, + Json( + Null, + ), + ), + Assoc( + "Block:4-2", + 882, + Json( + Null, + ), + ), + Assoc( + "Block:4-3", + 903, + Json( + Null, + ), + ), + Assoc( + "Block:4-4", + 924, + Json( + Null, + ), + ), + Assoc( + "Block:4-5", + 945, + Json( + Null, + ), + ), + Assoc( + "Block:4-6", + 966, + Json( + Null, + ), + ), + Assoc( + "Block:4-7", + 987, + Json( + Null, + ), + ), + Assoc( + "Block:4-8", + 1008, + Json( + Null, + ), + ), + Assoc( + "Block:4-9", + 1029, + Json( + Null, + ), + ), + ], + AssocKey( + "Block:4-0", + "BlockHasTransaction", + ): [ + Assoc( + "Transaction:4-0-0", + 841, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-0-1", + 843, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-0-2", + 845, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-0-3", + 847, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-0-4", + 849, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-0-5", + 851, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-0-6", + 853, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-0-7", + 855, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-0-8", + 857, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-0-9", + 859, + Json( + Null, + ), + ), + ], + AssocKey( + "Chain:4", + "ChainHasTransaction", + ): [ + Assoc( + "Transaction:4-0-0", + 842, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-0-1", + 844, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-0-2", + 846, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-0-3", + 848, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-0-4", + 850, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-0-5", + 852, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-0-6", + 854, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-0-7", + 856, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-0-8", + 858, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-0-9", + 860, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-1-0", + 863, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-1-1", + 865, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-1-2", + 867, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-1-3", + 869, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-1-4", + 871, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-1-5", + 873, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-1-6", + 875, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-1-7", + 877, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-1-8", + 879, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-1-9", + 881, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-2-0", + 884, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-2-1", + 886, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-2-2", + 888, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-2-3", + 890, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-2-4", + 892, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-2-5", + 894, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-2-6", + 896, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-2-7", + 898, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-2-8", + 900, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-2-9", + 902, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-3-0", + 905, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-3-1", + 907, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-3-2", + 909, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-3-3", + 911, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-3-4", + 913, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-3-5", + 915, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-3-6", + 917, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-3-7", + 919, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-3-8", + 921, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-3-9", + 923, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-4-0", + 926, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-4-1", + 928, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-4-2", + 930, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-4-3", + 932, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-4-4", + 934, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-4-5", + 936, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-4-6", + 938, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-4-7", + 940, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-4-8", + 942, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-4-9", + 944, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-5-0", + 947, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-5-1", + 949, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-5-2", + 951, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-5-3", + 953, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-5-4", + 955, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-5-5", + 957, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-5-6", + 959, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-5-7", + 961, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-5-8", + 963, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-5-9", + 965, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-6-0", + 968, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-6-1", + 970, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-6-2", + 972, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-6-3", + 974, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-6-4", + 976, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-6-5", + 978, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-6-6", + 980, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-6-7", + 982, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-6-8", + 984, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-6-9", + 986, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-7-0", + 989, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-7-1", + 991, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-7-2", + 993, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-7-3", + 995, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-7-4", + 997, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-7-5", + 999, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-7-6", + 1001, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-7-7", + 1003, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-7-8", + 1005, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-7-9", + 1007, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-8-0", + 1010, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-8-1", + 1012, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-8-2", + 1014, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-8-3", + 1016, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-8-4", + 1018, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-8-5", + 1020, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-8-6", + 1022, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-8-7", + 1024, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-8-8", + 1026, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-8-9", + 1028, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-9-0", + 1031, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-9-1", + 1033, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-9-2", + 1035, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-9-3", + 1037, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-9-4", + 1039, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-9-5", + 1041, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-9-6", + 1043, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-9-7", + 1045, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-9-8", + 1047, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-9-9", + 1049, + Json( + Null, + ), + ), + ], + AssocKey( + "Block:4-1", + "BlockHasTransaction", + ): [ + Assoc( + "Transaction:4-1-0", + 862, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-1-1", + 864, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-1-2", + 866, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-1-3", + 868, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-1-4", + 870, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-1-5", + 872, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-1-6", + 874, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-1-7", + 876, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-1-8", + 878, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-1-9", + 880, + Json( + Null, + ), + ), + ], + AssocKey( + "Block:4-2", + "BlockHasTransaction", + ): [ + Assoc( + "Transaction:4-2-0", + 883, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-2-1", + 885, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-2-2", + 887, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-2-3", + 889, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-2-4", + 891, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-2-5", + 893, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-2-6", + 895, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-2-7", + 897, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-2-8", + 899, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-2-9", + 901, + Json( + Null, + ), + ), + ], + AssocKey( + "Block:4-3", + "BlockHasTransaction", + ): [ + Assoc( + "Transaction:4-3-0", + 904, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-3-1", + 906, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-3-2", + 908, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-3-3", + 910, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-3-4", + 912, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-3-5", + 914, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-3-6", + 916, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-3-7", + 918, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-3-8", + 920, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-3-9", + 922, + Json( + Null, + ), + ), + ], + AssocKey( + "Block:4-4", + "BlockHasTransaction", + ): [ + Assoc( + "Transaction:4-4-0", + 925, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-4-1", + 927, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-4-2", + 929, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-4-3", + 931, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-4-4", + 933, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-4-5", + 935, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-4-6", + 937, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-4-7", + 939, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-4-8", + 941, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-4-9", + 943, + Json( + Null, + ), + ), + ], + AssocKey( + "Block:4-5", + "BlockHasTransaction", + ): [ + Assoc( + "Transaction:4-5-0", + 946, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-5-1", + 948, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-5-2", + 950, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-5-3", + 952, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-5-4", + 954, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-5-5", + 956, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-5-6", + 958, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-5-7", + 960, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-5-8", + 962, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-5-9", + 964, + Json( + Null, + ), + ), + ], + AssocKey( + "Block:4-6", + "BlockHasTransaction", + ): [ + Assoc( + "Transaction:4-6-0", + 967, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-6-1", + 969, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-6-2", + 971, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-6-3", + 973, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-6-4", + 975, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-6-5", + 977, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-6-6", + 979, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-6-7", + 981, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-6-8", + 983, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-6-9", + 985, + Json( + Null, + ), + ), + ], + AssocKey( + "Block:4-7", + "BlockHasTransaction", + ): [ + Assoc( + "Transaction:4-7-0", + 988, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-7-1", + 990, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-7-2", + 992, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-7-3", + 994, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-7-4", + 996, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-7-5", + 998, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-7-6", + 1000, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-7-7", + 1002, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-7-8", + 1004, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-7-9", + 1006, + Json( + Null, + ), + ), + ], + AssocKey( + "Block:4-8", + "BlockHasTransaction", + ): [ + Assoc( + "Transaction:4-8-0", + 1009, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-8-1", + 1011, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-8-2", + 1013, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-8-3", + 1015, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-8-4", + 1017, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-8-5", + 1019, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-8-6", + 1021, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-8-7", + 1023, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-8-8", + 1025, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-8-9", + 1027, + Json( + Null, + ), + ), + ], + AssocKey( + "Block:4-9", + "BlockHasTransaction", + ): [ + Assoc( + "Transaction:4-9-0", + 1030, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-9-1", + 1032, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-9-2", + 1034, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-9-3", + 1036, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-9-4", + 1038, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-9-5", + 1040, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-9-6", + 1042, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-9-7", + 1044, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-9-8", + 1046, + Json( + Null, + ), + ), + Assoc( + "Transaction:4-9-9", + 1048, + Json( + Null, + ), + ), + ], + AssocKey( + "Chain:5", + "ChainHasBlock", + ): [ + Assoc( + "Block:5-0", + 1050, + Json( + Null, + ), + ), + Assoc( + "Block:5-1", + 1071, + Json( + Null, + ), + ), + Assoc( + "Block:5-2", + 1092, + Json( + Null, + ), + ), + Assoc( + "Block:5-3", + 1113, + Json( + Null, + ), + ), + Assoc( + "Block:5-4", + 1134, + Json( + Null, + ), + ), + Assoc( + "Block:5-5", + 1155, + Json( + Null, + ), + ), + Assoc( + "Block:5-6", + 1176, + Json( + Null, + ), + ), + Assoc( + "Block:5-7", + 1197, + Json( + Null, + ), + ), + Assoc( + "Block:5-8", + 1218, + Json( + Null, + ), + ), + Assoc( + "Block:5-9", + 1239, + Json( + Null, + ), + ), + ], + AssocKey( + "Block:5-0", + "BlockHasTransaction", + ): [ + Assoc( + "Transaction:5-0-0", + 1051, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-0-1", + 1053, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-0-2", + 1055, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-0-3", + 1057, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-0-4", + 1059, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-0-5", + 1061, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-0-6", + 1063, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-0-7", + 1065, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-0-8", + 1067, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-0-9", + 1069, + Json( + Null, + ), + ), + ], + AssocKey( + "Chain:5", + "ChainHasTransaction", + ): [ + Assoc( + "Transaction:5-0-0", + 1052, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-0-1", + 1054, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-0-2", + 1056, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-0-3", + 1058, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-0-4", + 1060, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-0-5", + 1062, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-0-6", + 1064, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-0-7", + 1066, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-0-8", + 1068, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-0-9", + 1070, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-1-0", + 1073, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-1-1", + 1075, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-1-2", + 1077, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-1-3", + 1079, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-1-4", + 1081, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-1-5", + 1083, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-1-6", + 1085, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-1-7", + 1087, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-1-8", + 1089, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-1-9", + 1091, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-2-0", + 1094, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-2-1", + 1096, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-2-2", + 1098, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-2-3", + 1100, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-2-4", + 1102, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-2-5", + 1104, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-2-6", + 1106, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-2-7", + 1108, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-2-8", + 1110, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-2-9", + 1112, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-3-0", + 1115, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-3-1", + 1117, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-3-2", + 1119, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-3-3", + 1121, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-3-4", + 1123, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-3-5", + 1125, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-3-6", + 1127, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-3-7", + 1129, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-3-8", + 1131, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-3-9", + 1133, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-4-0", + 1136, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-4-1", + 1138, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-4-2", + 1140, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-4-3", + 1142, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-4-4", + 1144, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-4-5", + 1146, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-4-6", + 1148, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-4-7", + 1150, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-4-8", + 1152, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-4-9", + 1154, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-5-0", + 1157, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-5-1", + 1159, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-5-2", + 1161, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-5-3", + 1163, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-5-4", + 1165, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-5-5", + 1167, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-5-6", + 1169, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-5-7", + 1171, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-5-8", + 1173, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-5-9", + 1175, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-6-0", + 1178, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-6-1", + 1180, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-6-2", + 1182, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-6-3", + 1184, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-6-4", + 1186, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-6-5", + 1188, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-6-6", + 1190, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-6-7", + 1192, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-6-8", + 1194, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-6-9", + 1196, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-7-0", + 1199, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-7-1", + 1201, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-7-2", + 1203, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-7-3", + 1205, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-7-4", + 1207, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-7-5", + 1209, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-7-6", + 1211, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-7-7", + 1213, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-7-8", + 1215, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-7-9", + 1217, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-8-0", + 1220, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-8-1", + 1222, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-8-2", + 1224, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-8-3", + 1226, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-8-4", + 1228, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-8-5", + 1230, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-8-6", + 1232, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-8-7", + 1234, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-8-8", + 1236, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-8-9", + 1238, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-9-0", + 1241, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-9-1", + 1243, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-9-2", + 1245, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-9-3", + 1247, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-9-4", + 1249, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-9-5", + 1251, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-9-6", + 1253, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-9-7", + 1255, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-9-8", + 1257, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-9-9", + 1259, + Json( + Null, + ), + ), + ], + AssocKey( + "Block:5-1", + "BlockHasTransaction", + ): [ + Assoc( + "Transaction:5-1-0", + 1072, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-1-1", + 1074, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-1-2", + 1076, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-1-3", + 1078, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-1-4", + 1080, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-1-5", + 1082, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-1-6", + 1084, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-1-7", + 1086, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-1-8", + 1088, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-1-9", + 1090, + Json( + Null, + ), + ), + ], + AssocKey( + "Block:5-2", + "BlockHasTransaction", + ): [ + Assoc( + "Transaction:5-2-0", + 1093, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-2-1", + 1095, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-2-2", + 1097, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-2-3", + 1099, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-2-4", + 1101, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-2-5", + 1103, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-2-6", + 1105, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-2-7", + 1107, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-2-8", + 1109, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-2-9", + 1111, + Json( + Null, + ), + ), + ], + AssocKey( + "Block:5-3", + "BlockHasTransaction", + ): [ + Assoc( + "Transaction:5-3-0", + 1114, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-3-1", + 1116, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-3-2", + 1118, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-3-3", + 1120, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-3-4", + 1122, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-3-5", + 1124, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-3-6", + 1126, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-3-7", + 1128, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-3-8", + 1130, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-3-9", + 1132, + Json( + Null, + ), + ), + ], + AssocKey( + "Block:5-4", + "BlockHasTransaction", + ): [ + Assoc( + "Transaction:5-4-0", + 1135, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-4-1", + 1137, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-4-2", + 1139, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-4-3", + 1141, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-4-4", + 1143, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-4-5", + 1145, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-4-6", + 1147, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-4-7", + 1149, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-4-8", + 1151, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-4-9", + 1153, + Json( + Null, + ), + ), + ], + AssocKey( + "Block:5-5", + "BlockHasTransaction", + ): [ + Assoc( + "Transaction:5-5-0", + 1156, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-5-1", + 1158, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-5-2", + 1160, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-5-3", + 1162, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-5-4", + 1164, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-5-5", + 1166, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-5-6", + 1168, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-5-7", + 1170, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-5-8", + 1172, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-5-9", + 1174, + Json( + Null, + ), + ), + ], + AssocKey( + "Block:5-6", + "BlockHasTransaction", + ): [ + Assoc( + "Transaction:5-6-0", + 1177, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-6-1", + 1179, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-6-2", + 1181, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-6-3", + 1183, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-6-4", + 1185, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-6-5", + 1187, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-6-6", + 1189, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-6-7", + 1191, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-6-8", + 1193, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-6-9", + 1195, + Json( + Null, + ), + ), + ], + AssocKey( + "Block:5-7", + "BlockHasTransaction", + ): [ + Assoc( + "Transaction:5-7-0", + 1198, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-7-1", + 1200, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-7-2", + 1202, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-7-3", + 1204, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-7-4", + 1206, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-7-5", + 1208, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-7-6", + 1210, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-7-7", + 1212, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-7-8", + 1214, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-7-9", + 1216, + Json( + Null, + ), + ), + ], + AssocKey( + "Block:5-8", + "BlockHasTransaction", + ): [ + Assoc( + "Transaction:5-8-0", + 1219, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-8-1", + 1221, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-8-2", + 1223, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-8-3", + 1225, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-8-4", + 1227, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-8-5", + 1229, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-8-6", + 1231, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-8-7", + 1233, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-8-8", + 1235, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-8-9", + 1237, + Json( + Null, + ), + ), + ], + AssocKey( + "Block:5-9", + "BlockHasTransaction", + ): [ + Assoc( + "Transaction:5-9-0", + 1240, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-9-1", + 1242, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-9-2", + 1244, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-9-3", + 1246, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-9-4", + 1248, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-9-5", + 1250, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-9-6", + 1252, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-9-7", + 1254, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-9-8", + 1256, + Json( + Null, + ), + ), + Assoc( + "Transaction:5-9-9", + 1258, + Json( + Null, + ), + ), + ], + AssocKey( + "Chain:6", + "ChainHasBlock", + ): [ + Assoc( + "Block:6-0", + 1260, + Json( + Null, + ), + ), + Assoc( + "Block:6-1", + 1281, + Json( + Null, + ), + ), + Assoc( + "Block:6-2", + 1302, + Json( + Null, + ), + ), + Assoc( + "Block:6-3", + 1323, + Json( + Null, + ), + ), + Assoc( + "Block:6-4", + 1344, + Json( + Null, + ), + ), + Assoc( + "Block:6-5", + 1365, + Json( + Null, + ), + ), + Assoc( + "Block:6-6", + 1386, + Json( + Null, + ), + ), + Assoc( + "Block:6-7", + 1407, + Json( + Null, + ), + ), + Assoc( + "Block:6-8", + 1428, + Json( + Null, + ), + ), + Assoc( + "Block:6-9", + 1449, + Json( + Null, + ), + ), + ], + AssocKey( + "Block:6-0", + "BlockHasTransaction", + ): [ + Assoc( + "Transaction:6-0-0", + 1261, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-0-1", + 1263, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-0-2", + 1265, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-0-3", + 1267, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-0-4", + 1269, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-0-5", + 1271, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-0-6", + 1273, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-0-7", + 1275, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-0-8", + 1277, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-0-9", + 1279, + Json( + Null, + ), + ), + ], + AssocKey( + "Chain:6", + "ChainHasTransaction", + ): [ + Assoc( + "Transaction:6-0-0", + 1262, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-0-1", + 1264, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-0-2", + 1266, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-0-3", + 1268, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-0-4", + 1270, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-0-5", + 1272, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-0-6", + 1274, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-0-7", + 1276, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-0-8", + 1278, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-0-9", + 1280, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-1-0", + 1283, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-1-1", + 1285, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-1-2", + 1287, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-1-3", + 1289, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-1-4", + 1291, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-1-5", + 1293, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-1-6", + 1295, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-1-7", + 1297, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-1-8", + 1299, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-1-9", + 1301, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-2-0", + 1304, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-2-1", + 1306, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-2-2", + 1308, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-2-3", + 1310, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-2-4", + 1312, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-2-5", + 1314, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-2-6", + 1316, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-2-7", + 1318, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-2-8", + 1320, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-2-9", + 1322, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-3-0", + 1325, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-3-1", + 1327, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-3-2", + 1329, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-3-3", + 1331, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-3-4", + 1333, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-3-5", + 1335, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-3-6", + 1337, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-3-7", + 1339, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-3-8", + 1341, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-3-9", + 1343, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-4-0", + 1346, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-4-1", + 1348, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-4-2", + 1350, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-4-3", + 1352, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-4-4", + 1354, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-4-5", + 1356, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-4-6", + 1358, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-4-7", + 1360, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-4-8", + 1362, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-4-9", + 1364, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-5-0", + 1367, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-5-1", + 1369, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-5-2", + 1371, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-5-3", + 1373, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-5-4", + 1375, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-5-5", + 1377, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-5-6", + 1379, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-5-7", + 1381, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-5-8", + 1383, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-5-9", + 1385, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-6-0", + 1388, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-6-1", + 1390, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-6-2", + 1392, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-6-3", + 1394, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-6-4", + 1396, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-6-5", + 1398, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-6-6", + 1400, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-6-7", + 1402, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-6-8", + 1404, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-6-9", + 1406, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-7-0", + 1409, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-7-1", + 1411, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-7-2", + 1413, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-7-3", + 1415, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-7-4", + 1417, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-7-5", + 1419, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-7-6", + 1421, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-7-7", + 1423, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-7-8", + 1425, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-7-9", + 1427, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-8-0", + 1430, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-8-1", + 1432, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-8-2", + 1434, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-8-3", + 1436, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-8-4", + 1438, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-8-5", + 1440, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-8-6", + 1442, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-8-7", + 1444, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-8-8", + 1446, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-8-9", + 1448, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-9-0", + 1451, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-9-1", + 1453, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-9-2", + 1455, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-9-3", + 1457, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-9-4", + 1459, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-9-5", + 1461, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-9-6", + 1463, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-9-7", + 1465, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-9-8", + 1467, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-9-9", + 1469, + Json( + Null, + ), + ), + ], + AssocKey( + "Block:6-1", + "BlockHasTransaction", + ): [ + Assoc( + "Transaction:6-1-0", + 1282, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-1-1", + 1284, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-1-2", + 1286, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-1-3", + 1288, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-1-4", + 1290, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-1-5", + 1292, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-1-6", + 1294, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-1-7", + 1296, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-1-8", + 1298, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-1-9", + 1300, + Json( + Null, + ), + ), + ], + AssocKey( + "Block:6-2", + "BlockHasTransaction", + ): [ + Assoc( + "Transaction:6-2-0", + 1303, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-2-1", + 1305, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-2-2", + 1307, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-2-3", + 1309, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-2-4", + 1311, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-2-5", + 1313, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-2-6", + 1315, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-2-7", + 1317, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-2-8", + 1319, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-2-9", + 1321, + Json( + Null, + ), + ), + ], + AssocKey( + "Block:6-3", + "BlockHasTransaction", + ): [ + Assoc( + "Transaction:6-3-0", + 1324, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-3-1", + 1326, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-3-2", + 1328, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-3-3", + 1330, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-3-4", + 1332, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-3-5", + 1334, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-3-6", + 1336, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-3-7", + 1338, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-3-8", + 1340, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-3-9", + 1342, + Json( + Null, + ), + ), + ], + AssocKey( + "Block:6-4", + "BlockHasTransaction", + ): [ + Assoc( + "Transaction:6-4-0", + 1345, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-4-1", + 1347, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-4-2", + 1349, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-4-3", + 1351, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-4-4", + 1353, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-4-5", + 1355, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-4-6", + 1357, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-4-7", + 1359, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-4-8", + 1361, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-4-9", + 1363, + Json( + Null, + ), + ), + ], + AssocKey( + "Block:6-5", + "BlockHasTransaction", + ): [ + Assoc( + "Transaction:6-5-0", + 1366, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-5-1", + 1368, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-5-2", + 1370, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-5-3", + 1372, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-5-4", + 1374, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-5-5", + 1376, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-5-6", + 1378, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-5-7", + 1380, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-5-8", + 1382, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-5-9", + 1384, + Json( + Null, + ), + ), + ], + AssocKey( + "Block:6-6", + "BlockHasTransaction", + ): [ + Assoc( + "Transaction:6-6-0", + 1387, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-6-1", + 1389, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-6-2", + 1391, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-6-3", + 1393, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-6-4", + 1395, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-6-5", + 1397, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-6-6", + 1399, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-6-7", + 1401, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-6-8", + 1403, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-6-9", + 1405, + Json( + Null, + ), + ), + ], + AssocKey( + "Block:6-7", + "BlockHasTransaction", + ): [ + Assoc( + "Transaction:6-7-0", + 1408, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-7-1", + 1410, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-7-2", + 1412, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-7-3", + 1414, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-7-4", + 1416, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-7-5", + 1418, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-7-6", + 1420, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-7-7", + 1422, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-7-8", + 1424, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-7-9", + 1426, + Json( + Null, + ), + ), + ], + AssocKey( + "Block:6-8", + "BlockHasTransaction", + ): [ + Assoc( + "Transaction:6-8-0", + 1429, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-8-1", + 1431, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-8-2", + 1433, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-8-3", + 1435, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-8-4", + 1437, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-8-5", + 1439, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-8-6", + 1441, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-8-7", + 1443, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-8-8", + 1445, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-8-9", + 1447, + Json( + Null, + ), + ), + ], + AssocKey( + "Block:6-9", + "BlockHasTransaction", + ): [ + Assoc( + "Transaction:6-9-0", + 1450, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-9-1", + 1452, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-9-2", + 1454, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-9-3", + 1456, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-9-4", + 1458, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-9-5", + 1460, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-9-6", + 1462, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-9-7", + 1464, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-9-8", + 1466, + Json( + Null, + ), + ), + Assoc( + "Transaction:6-9-9", + 1468, + Json( + Null, + ), + ), + ], + AssocKey( + "Chain:7", + "ChainHasBlock", + ): [ + Assoc( + "Block:7-0", + 1470, + Json( + Null, + ), + ), + Assoc( + "Block:7-1", + 1491, + Json( + Null, + ), + ), + Assoc( + "Block:7-2", + 1512, + Json( + Null, + ), + ), + Assoc( + "Block:7-3", + 1533, + Json( + Null, + ), + ), + Assoc( + "Block:7-4", + 1554, + Json( + Null, + ), + ), + Assoc( + "Block:7-5", + 1575, + Json( + Null, + ), + ), + Assoc( + "Block:7-6", + 1596, + Json( + Null, + ), + ), + Assoc( + "Block:7-7", + 1617, + Json( + Null, + ), + ), + Assoc( + "Block:7-8", + 1638, + Json( + Null, + ), + ), + Assoc( + "Block:7-9", + 1659, + Json( + Null, + ), + ), + ], + AssocKey( + "Block:7-0", + "BlockHasTransaction", + ): [ + Assoc( + "Transaction:7-0-0", + 1471, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-0-1", + 1473, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-0-2", + 1475, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-0-3", + 1477, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-0-4", + 1479, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-0-5", + 1481, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-0-6", + 1483, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-0-7", + 1485, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-0-8", + 1487, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-0-9", + 1489, + Json( + Null, + ), + ), + ], + AssocKey( + "Chain:7", + "ChainHasTransaction", + ): [ + Assoc( + "Transaction:7-0-0", + 1472, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-0-1", + 1474, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-0-2", + 1476, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-0-3", + 1478, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-0-4", + 1480, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-0-5", + 1482, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-0-6", + 1484, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-0-7", + 1486, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-0-8", + 1488, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-0-9", + 1490, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-1-0", + 1493, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-1-1", + 1495, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-1-2", + 1497, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-1-3", + 1499, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-1-4", + 1501, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-1-5", + 1503, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-1-6", + 1505, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-1-7", + 1507, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-1-8", + 1509, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-1-9", + 1511, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-2-0", + 1514, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-2-1", + 1516, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-2-2", + 1518, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-2-3", + 1520, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-2-4", + 1522, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-2-5", + 1524, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-2-6", + 1526, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-2-7", + 1528, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-2-8", + 1530, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-2-9", + 1532, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-3-0", + 1535, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-3-1", + 1537, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-3-2", + 1539, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-3-3", + 1541, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-3-4", + 1543, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-3-5", + 1545, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-3-6", + 1547, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-3-7", + 1549, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-3-8", + 1551, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-3-9", + 1553, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-4-0", + 1556, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-4-1", + 1558, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-4-2", + 1560, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-4-3", + 1562, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-4-4", + 1564, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-4-5", + 1566, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-4-6", + 1568, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-4-7", + 1570, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-4-8", + 1572, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-4-9", + 1574, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-5-0", + 1577, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-5-1", + 1579, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-5-2", + 1581, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-5-3", + 1583, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-5-4", + 1585, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-5-5", + 1587, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-5-6", + 1589, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-5-7", + 1591, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-5-8", + 1593, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-5-9", + 1595, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-6-0", + 1598, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-6-1", + 1600, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-6-2", + 1602, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-6-3", + 1604, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-6-4", + 1606, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-6-5", + 1608, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-6-6", + 1610, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-6-7", + 1612, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-6-8", + 1614, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-6-9", + 1616, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-7-0", + 1619, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-7-1", + 1621, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-7-2", + 1623, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-7-3", + 1625, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-7-4", + 1627, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-7-5", + 1629, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-7-6", + 1631, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-7-7", + 1633, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-7-8", + 1635, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-7-9", + 1637, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-8-0", + 1640, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-8-1", + 1642, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-8-2", + 1644, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-8-3", + 1646, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-8-4", + 1648, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-8-5", + 1650, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-8-6", + 1652, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-8-7", + 1654, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-8-8", + 1656, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-8-9", + 1658, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-9-0", + 1661, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-9-1", + 1663, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-9-2", + 1665, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-9-3", + 1667, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-9-4", + 1669, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-9-5", + 1671, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-9-6", + 1673, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-9-7", + 1675, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-9-8", + 1677, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-9-9", + 1679, + Json( + Null, + ), + ), + ], + AssocKey( + "Block:7-1", + "BlockHasTransaction", + ): [ + Assoc( + "Transaction:7-1-0", + 1492, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-1-1", + 1494, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-1-2", + 1496, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-1-3", + 1498, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-1-4", + 1500, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-1-5", + 1502, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-1-6", + 1504, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-1-7", + 1506, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-1-8", + 1508, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-1-9", + 1510, + Json( + Null, + ), + ), + ], + AssocKey( + "Block:7-2", + "BlockHasTransaction", + ): [ + Assoc( + "Transaction:7-2-0", + 1513, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-2-1", + 1515, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-2-2", + 1517, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-2-3", + 1519, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-2-4", + 1521, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-2-5", + 1523, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-2-6", + 1525, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-2-7", + 1527, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-2-8", + 1529, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-2-9", + 1531, + Json( + Null, + ), + ), + ], + AssocKey( + "Block:7-3", + "BlockHasTransaction", + ): [ + Assoc( + "Transaction:7-3-0", + 1534, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-3-1", + 1536, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-3-2", + 1538, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-3-3", + 1540, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-3-4", + 1542, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-3-5", + 1544, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-3-6", + 1546, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-3-7", + 1548, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-3-8", + 1550, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-3-9", + 1552, + Json( + Null, + ), + ), + ], + AssocKey( + "Block:7-4", + "BlockHasTransaction", + ): [ + Assoc( + "Transaction:7-4-0", + 1555, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-4-1", + 1557, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-4-2", + 1559, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-4-3", + 1561, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-4-4", + 1563, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-4-5", + 1565, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-4-6", + 1567, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-4-7", + 1569, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-4-8", + 1571, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-4-9", + 1573, + Json( + Null, + ), + ), + ], + AssocKey( + "Block:7-5", + "BlockHasTransaction", + ): [ + Assoc( + "Transaction:7-5-0", + 1576, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-5-1", + 1578, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-5-2", + 1580, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-5-3", + 1582, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-5-4", + 1584, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-5-5", + 1586, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-5-6", + 1588, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-5-7", + 1590, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-5-8", + 1592, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-5-9", + 1594, + Json( + Null, + ), + ), + ], + AssocKey( + "Block:7-6", + "BlockHasTransaction", + ): [ + Assoc( + "Transaction:7-6-0", + 1597, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-6-1", + 1599, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-6-2", + 1601, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-6-3", + 1603, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-6-4", + 1605, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-6-5", + 1607, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-6-6", + 1609, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-6-7", + 1611, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-6-8", + 1613, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-6-9", + 1615, + Json( + Null, + ), + ), + ], + AssocKey( + "Block:7-7", + "BlockHasTransaction", + ): [ + Assoc( + "Transaction:7-7-0", + 1618, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-7-1", + 1620, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-7-2", + 1622, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-7-3", + 1624, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-7-4", + 1626, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-7-5", + 1628, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-7-6", + 1630, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-7-7", + 1632, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-7-8", + 1634, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-7-9", + 1636, + Json( + Null, + ), + ), + ], + AssocKey( + "Block:7-8", + "BlockHasTransaction", + ): [ + Assoc( + "Transaction:7-8-0", + 1639, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-8-1", + 1641, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-8-2", + 1643, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-8-3", + 1645, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-8-4", + 1647, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-8-5", + 1649, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-8-6", + 1651, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-8-7", + 1653, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-8-8", + 1655, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-8-9", + 1657, + Json( + Null, + ), + ), + ], + AssocKey( + "Block:7-9", + "BlockHasTransaction", + ): [ + Assoc( + "Transaction:7-9-0", + 1660, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-9-1", + 1662, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-9-2", + 1664, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-9-3", + 1666, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-9-4", + 1668, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-9-5", + 1670, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-9-6", + 1672, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-9-7", + 1674, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-9-8", + 1676, + Json( + Null, + ), + ), + Assoc( + "Transaction:7-9-9", + 1678, + Json( + Null, + ), + ), + ], + AssocKey( + "Chain:8", + "ChainHasBlock", + ): [ + Assoc( + "Block:8-0", + 1680, + Json( + Null, + ), + ), + Assoc( + "Block:8-1", + 1701, + Json( + Null, + ), + ), + Assoc( + "Block:8-2", + 1722, + Json( + Null, + ), + ), + Assoc( + "Block:8-3", + 1743, + Json( + Null, + ), + ), + Assoc( + "Block:8-4", + 1764, + Json( + Null, + ), + ), + Assoc( + "Block:8-5", + 1785, + Json( + Null, + ), + ), + Assoc( + "Block:8-6", + 1806, + Json( + Null, + ), + ), + Assoc( + "Block:8-7", + 1827, + Json( + Null, + ), + ), + Assoc( + "Block:8-8", + 1848, + Json( + Null, + ), + ), + Assoc( + "Block:8-9", + 1869, + Json( + Null, + ), + ), + ], + AssocKey( + "Block:8-0", + "BlockHasTransaction", + ): [ + Assoc( + "Transaction:8-0-0", + 1681, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-0-1", + 1683, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-0-2", + 1685, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-0-3", + 1687, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-0-4", + 1689, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-0-5", + 1691, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-0-6", + 1693, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-0-7", + 1695, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-0-8", + 1697, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-0-9", + 1699, + Json( + Null, + ), + ), + ], + AssocKey( + "Chain:8", + "ChainHasTransaction", + ): [ + Assoc( + "Transaction:8-0-0", + 1682, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-0-1", + 1684, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-0-2", + 1686, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-0-3", + 1688, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-0-4", + 1690, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-0-5", + 1692, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-0-6", + 1694, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-0-7", + 1696, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-0-8", + 1698, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-0-9", + 1700, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-1-0", + 1703, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-1-1", + 1705, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-1-2", + 1707, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-1-3", + 1709, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-1-4", + 1711, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-1-5", + 1713, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-1-6", + 1715, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-1-7", + 1717, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-1-8", + 1719, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-1-9", + 1721, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-2-0", + 1724, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-2-1", + 1726, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-2-2", + 1728, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-2-3", + 1730, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-2-4", + 1732, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-2-5", + 1734, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-2-6", + 1736, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-2-7", + 1738, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-2-8", + 1740, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-2-9", + 1742, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-3-0", + 1745, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-3-1", + 1747, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-3-2", + 1749, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-3-3", + 1751, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-3-4", + 1753, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-3-5", + 1755, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-3-6", + 1757, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-3-7", + 1759, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-3-8", + 1761, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-3-9", + 1763, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-4-0", + 1766, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-4-1", + 1768, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-4-2", + 1770, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-4-3", + 1772, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-4-4", + 1774, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-4-5", + 1776, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-4-6", + 1778, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-4-7", + 1780, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-4-8", + 1782, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-4-9", + 1784, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-5-0", + 1787, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-5-1", + 1789, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-5-2", + 1791, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-5-3", + 1793, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-5-4", + 1795, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-5-5", + 1797, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-5-6", + 1799, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-5-7", + 1801, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-5-8", + 1803, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-5-9", + 1805, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-6-0", + 1808, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-6-1", + 1810, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-6-2", + 1812, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-6-3", + 1814, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-6-4", + 1816, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-6-5", + 1818, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-6-6", + 1820, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-6-7", + 1822, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-6-8", + 1824, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-6-9", + 1826, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-7-0", + 1829, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-7-1", + 1831, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-7-2", + 1833, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-7-3", + 1835, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-7-4", + 1837, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-7-5", + 1839, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-7-6", + 1841, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-7-7", + 1843, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-7-8", + 1845, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-7-9", + 1847, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-8-0", + 1850, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-8-1", + 1852, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-8-2", + 1854, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-8-3", + 1856, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-8-4", + 1858, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-8-5", + 1860, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-8-6", + 1862, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-8-7", + 1864, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-8-8", + 1866, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-8-9", + 1868, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-9-0", + 1871, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-9-1", + 1873, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-9-2", + 1875, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-9-3", + 1877, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-9-4", + 1879, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-9-5", + 1881, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-9-6", + 1883, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-9-7", + 1885, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-9-8", + 1887, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-9-9", + 1889, + Json( + Null, + ), + ), + ], + AssocKey( + "Block:8-1", + "BlockHasTransaction", + ): [ + Assoc( + "Transaction:8-1-0", + 1702, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-1-1", + 1704, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-1-2", + 1706, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-1-3", + 1708, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-1-4", + 1710, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-1-5", + 1712, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-1-6", + 1714, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-1-7", + 1716, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-1-8", + 1718, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-1-9", + 1720, + Json( + Null, + ), + ), + ], + AssocKey( + "Block:8-2", + "BlockHasTransaction", + ): [ + Assoc( + "Transaction:8-2-0", + 1723, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-2-1", + 1725, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-2-2", + 1727, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-2-3", + 1729, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-2-4", + 1731, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-2-5", + 1733, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-2-6", + 1735, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-2-7", + 1737, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-2-8", + 1739, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-2-9", + 1741, + Json( + Null, + ), + ), + ], + AssocKey( + "Block:8-3", + "BlockHasTransaction", + ): [ + Assoc( + "Transaction:8-3-0", + 1744, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-3-1", + 1746, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-3-2", + 1748, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-3-3", + 1750, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-3-4", + 1752, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-3-5", + 1754, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-3-6", + 1756, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-3-7", + 1758, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-3-8", + 1760, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-3-9", + 1762, + Json( + Null, + ), + ), + ], + AssocKey( + "Block:8-4", + "BlockHasTransaction", + ): [ + Assoc( + "Transaction:8-4-0", + 1765, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-4-1", + 1767, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-4-2", + 1769, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-4-3", + 1771, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-4-4", + 1773, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-4-5", + 1775, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-4-6", + 1777, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-4-7", + 1779, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-4-8", + 1781, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-4-9", + 1783, + Json( + Null, + ), + ), + ], + AssocKey( + "Block:8-5", + "BlockHasTransaction", + ): [ + Assoc( + "Transaction:8-5-0", + 1786, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-5-1", + 1788, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-5-2", + 1790, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-5-3", + 1792, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-5-4", + 1794, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-5-5", + 1796, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-5-6", + 1798, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-5-7", + 1800, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-5-8", + 1802, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-5-9", + 1804, + Json( + Null, + ), + ), + ], + AssocKey( + "Block:8-6", + "BlockHasTransaction", + ): [ + Assoc( + "Transaction:8-6-0", + 1807, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-6-1", + 1809, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-6-2", + 1811, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-6-3", + 1813, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-6-4", + 1815, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-6-5", + 1817, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-6-6", + 1819, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-6-7", + 1821, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-6-8", + 1823, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-6-9", + 1825, + Json( + Null, + ), + ), + ], + AssocKey( + "Block:8-7", + "BlockHasTransaction", + ): [ + Assoc( + "Transaction:8-7-0", + 1828, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-7-1", + 1830, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-7-2", + 1832, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-7-3", + 1834, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-7-4", + 1836, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-7-5", + 1838, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-7-6", + 1840, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-7-7", + 1842, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-7-8", + 1844, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-7-9", + 1846, + Json( + Null, + ), + ), + ], + AssocKey( + "Block:8-8", + "BlockHasTransaction", + ): [ + Assoc( + "Transaction:8-8-0", + 1849, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-8-1", + 1851, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-8-2", + 1853, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-8-3", + 1855, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-8-4", + 1857, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-8-5", + 1859, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-8-6", + 1861, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-8-7", + 1863, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-8-8", + 1865, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-8-9", + 1867, + Json( + Null, + ), + ), + ], + AssocKey( + "Block:8-9", + "BlockHasTransaction", + ): [ + Assoc( + "Transaction:8-9-0", + 1870, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-9-1", + 1872, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-9-2", + 1874, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-9-3", + 1876, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-9-4", + 1878, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-9-5", + 1880, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-9-6", + 1882, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-9-7", + 1884, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-9-8", + 1886, + Json( + Null, + ), + ), + Assoc( + "Transaction:8-9-9", + 1888, + Json( + Null, + ), + ), + ], + AssocKey( + "Chain:9", + "ChainHasBlock", + ): [ + Assoc( + "Block:9-0", + 1890, + Json( + Null, + ), + ), + Assoc( + "Block:9-1", + 1911, + Json( + Null, + ), + ), + Assoc( + "Block:9-2", + 1932, + Json( + Null, + ), + ), + Assoc( + "Block:9-3", + 1953, + Json( + Null, + ), + ), + Assoc( + "Block:9-4", + 1974, + Json( + Null, + ), + ), + Assoc( + "Block:9-5", + 1995, + Json( + Null, + ), + ), + Assoc( + "Block:9-6", + 2016, + Json( + Null, + ), + ), + Assoc( + "Block:9-7", + 2037, + Json( + Null, + ), + ), + Assoc( + "Block:9-8", + 2058, + Json( + Null, + ), + ), + Assoc( + "Block:9-9", + 2079, + Json( + Null, + ), + ), + ], + AssocKey( + "Block:9-0", + "BlockHasTransaction", + ): [ + Assoc( + "Transaction:9-0-0", + 1891, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-0-1", + 1893, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-0-2", + 1895, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-0-3", + 1897, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-0-4", + 1899, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-0-5", + 1901, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-0-6", + 1903, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-0-7", + 1905, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-0-8", + 1907, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-0-9", + 1909, + Json( + Null, + ), + ), + ], + AssocKey( + "Chain:9", + "ChainHasTransaction", + ): [ + Assoc( + "Transaction:9-0-0", + 1892, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-0-1", + 1894, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-0-2", + 1896, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-0-3", + 1898, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-0-4", + 1900, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-0-5", + 1902, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-0-6", + 1904, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-0-7", + 1906, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-0-8", + 1908, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-0-9", + 1910, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-1-0", + 1913, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-1-1", + 1915, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-1-2", + 1917, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-1-3", + 1919, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-1-4", + 1921, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-1-5", + 1923, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-1-6", + 1925, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-1-7", + 1927, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-1-8", + 1929, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-1-9", + 1931, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-2-0", + 1934, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-2-1", + 1936, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-2-2", + 1938, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-2-3", + 1940, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-2-4", + 1942, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-2-5", + 1944, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-2-6", + 1946, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-2-7", + 1948, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-2-8", + 1950, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-2-9", + 1952, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-3-0", + 1955, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-3-1", + 1957, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-3-2", + 1959, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-3-3", + 1961, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-3-4", + 1963, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-3-5", + 1965, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-3-6", + 1967, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-3-7", + 1969, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-3-8", + 1971, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-3-9", + 1973, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-4-0", + 1976, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-4-1", + 1978, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-4-2", + 1980, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-4-3", + 1982, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-4-4", + 1984, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-4-5", + 1986, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-4-6", + 1988, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-4-7", + 1990, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-4-8", + 1992, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-4-9", + 1994, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-5-0", + 1997, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-5-1", + 1999, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-5-2", + 2001, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-5-3", + 2003, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-5-4", + 2005, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-5-5", + 2007, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-5-6", + 2009, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-5-7", + 2011, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-5-8", + 2013, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-5-9", + 2015, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-6-0", + 2018, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-6-1", + 2020, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-6-2", + 2022, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-6-3", + 2024, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-6-4", + 2026, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-6-5", + 2028, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-6-6", + 2030, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-6-7", + 2032, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-6-8", + 2034, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-6-9", + 2036, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-7-0", + 2039, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-7-1", + 2041, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-7-2", + 2043, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-7-3", + 2045, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-7-4", + 2047, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-7-5", + 2049, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-7-6", + 2051, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-7-7", + 2053, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-7-8", + 2055, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-7-9", + 2057, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-8-0", + 2060, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-8-1", + 2062, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-8-2", + 2064, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-8-3", + 2066, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-8-4", + 2068, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-8-5", + 2070, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-8-6", + 2072, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-8-7", + 2074, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-8-8", + 2076, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-8-9", + 2078, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-9-0", + 2081, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-9-1", + 2083, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-9-2", + 2085, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-9-3", + 2087, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-9-4", + 2089, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-9-5", + 2091, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-9-6", + 2093, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-9-7", + 2095, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-9-8", + 2097, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-9-9", + 2099, + Json( + Null, + ), + ), + ], + AssocKey( + "Block:9-1", + "BlockHasTransaction", + ): [ + Assoc( + "Transaction:9-1-0", + 1912, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-1-1", + 1914, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-1-2", + 1916, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-1-3", + 1918, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-1-4", + 1920, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-1-5", + 1922, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-1-6", + 1924, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-1-7", + 1926, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-1-8", + 1928, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-1-9", + 1930, + Json( + Null, + ), + ), + ], + AssocKey( + "Block:9-2", + "BlockHasTransaction", + ): [ + Assoc( + "Transaction:9-2-0", + 1933, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-2-1", + 1935, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-2-2", + 1937, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-2-3", + 1939, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-2-4", + 1941, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-2-5", + 1943, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-2-6", + 1945, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-2-7", + 1947, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-2-8", + 1949, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-2-9", + 1951, + Json( + Null, + ), + ), + ], + AssocKey( + "Block:9-3", + "BlockHasTransaction", + ): [ + Assoc( + "Transaction:9-3-0", + 1954, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-3-1", + 1956, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-3-2", + 1958, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-3-3", + 1960, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-3-4", + 1962, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-3-5", + 1964, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-3-6", + 1966, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-3-7", + 1968, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-3-8", + 1970, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-3-9", + 1972, + Json( + Null, + ), + ), + ], + AssocKey( + "Block:9-4", + "BlockHasTransaction", + ): [ + Assoc( + "Transaction:9-4-0", + 1975, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-4-1", + 1977, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-4-2", + 1979, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-4-3", + 1981, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-4-4", + 1983, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-4-5", + 1985, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-4-6", + 1987, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-4-7", + 1989, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-4-8", + 1991, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-4-9", + 1993, + Json( + Null, + ), + ), + ], + AssocKey( + "Block:9-5", + "BlockHasTransaction", + ): [ + Assoc( + "Transaction:9-5-0", + 1996, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-5-1", + 1998, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-5-2", + 2000, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-5-3", + 2002, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-5-4", + 2004, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-5-5", + 2006, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-5-6", + 2008, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-5-7", + 2010, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-5-8", + 2012, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-5-9", + 2014, + Json( + Null, + ), + ), + ], + AssocKey( + "Block:9-6", + "BlockHasTransaction", + ): [ + Assoc( + "Transaction:9-6-0", + 2017, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-6-1", + 2019, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-6-2", + 2021, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-6-3", + 2023, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-6-4", + 2025, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-6-5", + 2027, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-6-6", + 2029, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-6-7", + 2031, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-6-8", + 2033, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-6-9", + 2035, + Json( + Null, + ), + ), + ], + AssocKey( + "Block:9-7", + "BlockHasTransaction", + ): [ + Assoc( + "Transaction:9-7-0", + 2038, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-7-1", + 2040, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-7-2", + 2042, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-7-3", + 2044, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-7-4", + 2046, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-7-5", + 2048, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-7-6", + 2050, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-7-7", + 2052, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-7-8", + 2054, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-7-9", + 2056, + Json( + Null, + ), + ), + ], + AssocKey( + "Block:9-8", + "BlockHasTransaction", + ): [ + Assoc( + "Transaction:9-8-0", + 2059, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-8-1", + 2061, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-8-2", + 2063, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-8-3", + 2065, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-8-4", + 2067, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-8-5", + 2069, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-8-6", + 2071, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-8-7", + 2073, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-8-8", + 2075, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-8-9", + 2077, + Json( + Null, + ), + ), + ], + AssocKey( + "Block:9-9", + "BlockHasTransaction", + ): [ + Assoc( + "Transaction:9-9-0", + 2080, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-9-1", + 2082, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-9-2", + 2084, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-9-3", + 2086, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-9-4", + 2088, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-9-5", + 2090, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-9-6", + 2092, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-9-7", + 2094, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-9-8", + 2096, + Json( + Null, + ), + ), + Assoc( + "Transaction:9-9-9", + 2098, + Json( + Null, + ), + ), + ], + }, + time: 2100, +} diff --git a/packages/fuel-indexer-graphql-dyn/src/testing/snapshots/fuel_indexer_graphql_dyn__testing__store_type__store_type.snap b/packages/fuel-indexer-graphql-dyn/src/testing/snapshots/fuel_indexer_graphql_dyn__testing__store_type__store_type.snap new file mode 100644 index 000000000..15dad6f9d --- /dev/null +++ b/packages/fuel-indexer-graphql-dyn/src/testing/snapshots/fuel_indexer_graphql_dyn__testing__store_type__store_type.snap @@ -0,0 +1,140 @@ +--- +source: packages/fuel-indexer-graphql-dyn/src/testing/store_type.rs +expression: store_type +--- +StoreType( + data: { + Unit: Unit, + Bool: Bool, + U8: U8, + U16: U16, + U32: U32, + U64: U64, + B256: B256, + Byte: Byte, + Bytes: Bytes, + String: String, + Name(Pascal("CallReceiptData")): Composite(Pascal("CallReceiptData"), { + "param1": DataFieldType( + name: Snake("param1"), + type_id: U64, + ), + "param2": DataFieldType( + name: Snake("param2"), + type_id: U64, + ), + }), + Name(Pascal("ReturnReceiptData")): Composite(Pascal("ReturnReceiptData"), { + "val": DataFieldType( + name: Snake("val"), + type_id: U64, + ), + }), + Name(Pascal("ReceiptType")): Enum(Pascal("ReceiptType"), { + "call_receipt": DataFieldType( + name: Pascal("CallReceipt"), + type_id: Unit, + ), + "return_receipt": DataFieldType( + name: Pascal("ReturnReceipt"), + type_id: Unit, + ), + }), + Name(Pascal("ReceiptData")): Enum(Pascal("ReceiptData"), { + "call_receipt_data": DataFieldType( + name: Pascal("CallReceiptData"), + type_id: Name(Pascal("CallReceiptData")), + ), + "return_receipt_data": DataFieldType( + name: Pascal("ReturnReceiptData"), + type_id: Name(Pascal("ReturnReceiptData")), + ), + }), + }, + obj: { + "Chain": ObjType( + name: Pascal("Chain"), + fields: { + "number": DataFieldType( + name: Snake("number"), + type_id: U64, + ), + }, + ), + "Block": ObjType( + name: Pascal("Block"), + fields: { + "number": DataFieldType( + name: Snake("number"), + type_id: U64, + ), + "hash": DataFieldType( + name: Snake("hash"), + type_id: B256, + ), + "parent_hash": DataFieldType( + name: Snake("parent_hash"), + type_id: B256, + ), + }, + ), + "Transaction": ObjType( + name: Pascal("Transaction"), + fields: { + "index": DataFieldType( + name: Snake("index"), + type_id: U64, + ), + "hash": DataFieldType( + name: Snake("hash"), + type_id: B256, + ), + "gas_limit": DataFieldType( + name: Snake("gas_limit"), + type_id: U64, + ), + "gas_price": DataFieldType( + name: Snake("gas_price"), + type_id: U64, + ), + "block_hash": DataFieldType( + name: Snake("block_hash"), + type_id: B256, + ), + }, + ), + "Receipt": ObjType( + name: Pascal("Receipt"), + fields: { + "type": DataFieldType( + name: Snake("type"), + type_id: Name(Pascal("ReceiptType")), + ), + "data": DataFieldType( + name: Snake("data"), + type_id: Name(Pascal("ReceiptData")), + ), + }, + ), + }, + assoc: { + "ChainHasBlock": AssocType( + name: Pascal("ChainHasBlock"), + tail: "Chain", + head: "Block", + fields: {}, + ), + "ChainHasTransaction": AssocType( + name: Pascal("ChainHasTransaction"), + tail: "Chain", + head: "Transaction", + fields: {}, + ), + "BlockHasTransaction": AssocType( + name: Pascal("BlockHasTransaction"), + tail: "Block", + head: "Transaction", + fields: {}, + ), + }, +) diff --git a/packages/fuel-indexer-graphql-dyn/src/testing/store.rs b/packages/fuel-indexer-graphql-dyn/src/testing/store.rs new file mode 100644 index 000000000..e4c064c4b --- /dev/null +++ b/packages/fuel-indexer-graphql-dyn/src/testing/store.rs @@ -0,0 +1,188 @@ +use super::self_prelude::*; +use super::store_type::*; +use crate::store::*; + +#[derive(Clone, Debug)] +pub struct TestStore { + pub r#type: StoreType, + pub obj_map: IndexMap, + pub assoc_map: IndexMap>, + pub time: AssocTime, +} + +pub fn new_test_store() -> Result { + let store_type = new_test_store_type().unwrap(); + let mut store = TestStore::new(store_type); + for (chain_idx, chain_id) in (0..10).map(|i| format!("Chain:{}", i)).enumerate() { + store.obj_add( + "Chain", + &chain_id, + json!({ + "display_name": format!("Chain #{}", chain_idx), + }), + ); + for (block_idx, block_id) in (0..10) + .map(|i| format!("Block:{}-{}", chain_idx, i)) + .enumerate() + { + store.obj_add( + "Block", + &block_id, + json!({ + "number": block_idx, + "hash": "0x00", + "parent_hash": "0x00", + "chain_id": &chain_id, + }), + ); + store.assoc_add("Chain", "Has", "Block", &chain_id, &block_id, json!(null)); + for (transaction_idx, transaction_id) in (0..10) + .map(|i| format!("Transaction:{}-{}-{}", chain_idx, block_idx, i)) + .enumerate() + { + store.obj_add( + "Transaction", + &transaction_id, + json!({ + "index": transaction_idx, + "hash": "0x00", + "block_hash": "0", + "gas_price": 12312, + "gas_limit": 32423, + "chain_id": &chain_id, + }), + ); + store.assoc_add( + "Block", + "Has", + "Transaction", + &block_id, + &transaction_id, + json!(null), + ); + store.assoc_add( + "Chain", + "Has", + "Transaction", + &chain_id, + &transaction_id, + json!(null), + ); + } + } + } + Ok(store) +} + +impl TestStore { + pub fn new(r#type: StoreType) -> Self { + Self { + r#type, + obj_map: IndexMap::new(), + assoc_map: IndexMap::new(), + time: 0, + } + } + + pub fn obj_add( + &mut self, + type_id: impl Into, + id: impl Into, + data: impl Into, + ) { + let id = id.into(); + let type_id = type_id.into(); + let data = data.into(); + + let object = Obj(type_id, data); + self.obj_map.insert(id, object); + } + pub fn assoc_add( + &mut self, + tail_type_id: impl Into, + verb: impl Into, + head_type_id: impl Into, + tail_id: impl Into, + head_id: impl Into, + data: impl Into, + ) { + let tail_type_id = tail_type_id.into(); + let head_type_id = head_type_id.into(); + let type_id = format!( + "{}{}{}", + tail_type_id.clone(), + verb.into(), + head_type_id.clone() + ); + let tail_id = tail_id.into(); + let head_id = head_id.into(); + let data = data.into(); + + let key = AssocKey(tail_id, type_id); + let assoc = Assoc(head_id, self.time, data); + self.time += 1; + self.assoc_map + .entry(key) + .or_insert_with(Vec::new) + .push(assoc); + } +} + +#[async_trait] +impl Store for TestStore { + fn r#type(&self) -> &StoreType { + &self.r#type + } + + async fn obj_get(&self, id: &ObjId) -> StoreResult> { + Ok(self.obj_map.get(id).cloned()) + } + async fn obj_get_many(&self, ids: &[ObjId]) -> StoreResult>> { + Ok(ids.iter().map(|id| self.obj_map.get(id).cloned()).collect()) + } + async fn assoc_get( + &self, + _key: &AssocKey, + _ids: &[ObjId], + _high: Option, + _low: Option, + ) -> StoreResult>> { + todo!() + } + async fn assoc_count(&self, _key: &AssocKey) -> StoreResult { + todo!() + } + async fn assoc_range( + &self, + key: &AssocKey, + offset: u64, + limit: u64, + ) -> StoreResult> { + Ok(self + .assoc_map + .get(key) + .cloned() + .unwrap_or_default() + .into_iter() + .skip(offset as usize) + .take(limit as usize) + .collect()) + } + async fn assoc_time_range( + &self, + _key: &AssocKey, + _high: AssocTime, + _low: AssocTime, + _limit: u64, + ) -> StoreResult> { + todo!() + } +} + +#[test] +fn test_store() { + use insta::*; + + let store = new_test_store().unwrap(); + assert_debug_snapshot!(store); +} diff --git a/packages/fuel-indexer-graphql-dyn/src/testing/store_type.rs b/packages/fuel-indexer-graphql-dyn/src/testing/store_type.rs new file mode 100644 index 000000000..fba179284 --- /dev/null +++ b/packages/fuel-indexer-graphql-dyn/src/testing/store_type.rs @@ -0,0 +1,55 @@ +use crate::store::*; + +pub fn new_test_store_type() -> Result { + let mut store_type = StoreTypeBuilder::default(); + + let (call_receipt, data) = store_type.define_composite("CallReceiptData"); + data.define_field("param1", &DataTypeId::U64); + data.define_field("param2", &DataTypeId::U64); + + let (return_receipt, data) = store_type.define_composite("ReturnReceiptData"); + data.define_field("val", &DataTypeId::U64); + + let (receipt_type, data) = store_type.define_enum("ReceiptType"); + data.define_variant("CallReceipt", &DataTypeId::Unit); + data.define_variant("ReturnReceipt", &DataTypeId::Unit); + + let (receipt_data, data) = store_type.define_enum("ReceiptData"); + data.define_variant("CallReceiptData", &call_receipt); + data.define_variant("ReturnReceiptData", &return_receipt); + + let (chain, obj) = store_type.define_obj("Chain"); + obj.define_field("number", &DataTypeId::U64); + + let (block, obj) = store_type.define_obj("Block"); + obj.define_field("number", &DataTypeId::U64); + obj.define_field("hash", &DataTypeId::B256); + obj.define_field("parent_hash", &DataTypeId::B256); + + let (transaction, obj) = store_type.define_obj("Transaction"); + obj.define_field("index", &DataTypeId::U64); + obj.define_field("hash", &DataTypeId::B256); + obj.define_field("gas_limit", &DataTypeId::U64); + obj.define_field("gas_price", &DataTypeId::U64); + obj.define_field("block_hash", &DataTypeId::B256); + + let (_receipt, obj) = store_type.define_obj("Receipt"); + obj.define_field("type", &receipt_type); + obj.define_field("data", &receipt_data); + + let (_chain_has_block, _assoc) = store_type.define_assoc(&chain, "Has", &block); + let (_chain_has_transaction, _assoc) = + store_type.define_assoc(&chain, "Has", &transaction); + let (_block_has_transaction, _assoc) = + store_type.define_assoc(&block, "Has", &transaction); + + store_type.finish() +} + +#[test] +fn test_store_type() { + use insta::*; + + let store_type = new_test_store_type().unwrap(); + assert_ron_snapshot!(store_type); +} diff --git a/packages/fuel-indexer-graphql-dyn/tests/dynamic_connection.rs b/packages/fuel-indexer-graphql-dyn/tests/dynamic_connection.rs new file mode 100644 index 000000000..9da61c9ad --- /dev/null +++ b/packages/fuel-indexer-graphql-dyn/tests/dynamic_connection.rs @@ -0,0 +1,54 @@ +pub use async_graphql::dynamic::Schema; +pub use async_graphql::Request; +use fuel_indexer_graphql_dyn::testing::prelude::*; +use insta::*; + +#[tokio::test] +async fn test() { + let schema = Schema::build_test(); + let schema = schema.finish().unwrap(); + + // Execute a query + let response = schema + .execute(Request::new( + r#" + query { + chain(id: "Chain:0") { + a: transactions(first: 1) { + edges { + node { + id + } + cursor + } + pageInfo { + hasNextPage + hasPreviousPage + startCursor + endCursor + } + } + b: transactions(first: 1) { + edges { + node { + id + } + cursor + } + pageInfo { + hasNextPage + hasPreviousPage + startCursor + endCursor + } + } + } + } + "#, + )) + .await + .into_result() + .unwrap(); + + assert_json_snapshot!(response.data); +} diff --git a/packages/fuel-indexer-graphql-dyn/tests/dynamic_data.rs b/packages/fuel-indexer-graphql-dyn/tests/dynamic_data.rs new file mode 100644 index 000000000..8f7ac3be0 --- /dev/null +++ b/packages/fuel-indexer-graphql-dyn/tests/dynamic_data.rs @@ -0,0 +1,44 @@ +use async_graphql::dynamic::Schema; +use async_graphql::Request; +use fuel_indexer_graphql_dyn::testing::prelude::*; +use insta::*; + +#[tokio::test] +async fn test() { + let schema = Schema::build_test(); + let schema = schema.finish().unwrap(); + + // Execute a query + let response = schema + .execute(Request::new( + r#" + query { + transaction(id: "Transaction:0-0-0") { + id + index + hash + gasPrice + gasLimit + blockHash + } + } + "#, + )) + .await + .into_result() + .unwrap(); + + assert_json_snapshot!(response.data, @r###" + { + "transaction": { + "id": "Transaction:0-0-0", + "index": 0, + "hash": "0x00", + "gasPrice": 12312, + "gasLimit": 32423, + "blockHash": "0" + } + } + "### + ); +} diff --git a/packages/fuel-indexer-graphql-dyn/tests/dynamic_nested.rs b/packages/fuel-indexer-graphql-dyn/tests/dynamic_nested.rs new file mode 100644 index 000000000..75dfdae67 --- /dev/null +++ b/packages/fuel-indexer-graphql-dyn/tests/dynamic_nested.rs @@ -0,0 +1,80 @@ +use async_graphql::dynamic::Schema; +use async_graphql::Request; +use fuel_indexer_graphql_dyn::testing::prelude::*; +use insta::*; + +#[tokio::test] +async fn test() { + let schema = Schema::build_test(); + let schema = schema.finish().unwrap(); + + // Execute a query + let response = schema + .execute(Request::new( + r#" + query { + node(id: "Transaction:0-0-0") { + id + ... on Transaction { + transactionId: id + index + hash + chain { + id + blocks(first: 1) { + totalCount + edges { + node { + id + } + cursor + } + pageInfo { + hasNextPage + hasPreviousPage + startCursor + endCursor + } + } + } + } + } + } + "#, + )) + .await + .into_result() + .unwrap(); + + assert_json_snapshot!(response.data, @r###" + { + "node": { + "id": "Transaction:0-0-0", + "transactionId": "Transaction:0-0-0", + "index": 0, + "hash": "0x00", + "chain": { + "id": "Chain:0", + "blocks": { + "totalCount": 1, + "edges": [ + { + "node": { + "id": "Block:0-0" + }, + "cursor": "0" + } + ], + "pageInfo": { + "hasNextPage": false, + "hasPreviousPage": false, + "startCursor": "0", + "endCursor": "0" + } + } + } + } + } + "### + ); +} diff --git a/packages/fuel-indexer-graphql-dyn/tests/dynamic_query.rs b/packages/fuel-indexer-graphql-dyn/tests/dynamic_query.rs new file mode 100644 index 000000000..98e132e74 --- /dev/null +++ b/packages/fuel-indexer-graphql-dyn/tests/dynamic_query.rs @@ -0,0 +1,78 @@ +use assert_matches::*; +use async_graphql::dynamic::Schema; +use async_graphql::Request; +use async_graphql_value::ConstValue; +use fuel_indexer_graphql_dyn::testing::prelude::*; + +use insta::*; + +#[tokio::test] +async fn test() { + let schema = Schema::build_test(); + let schema = schema.finish().unwrap(); + + // Execute a query + let response = schema + .execute(Request::new( + r#" + query { + transaction(id: "Transaction:0-0-0") { + id + } + chain(id: "Chain:0") { + transactions(first: 1) { + nodes { + id + } + } + } + } + "#, + )) + .await + .into_result() + .unwrap(); + + assert_json_snapshot!(response.data); + + assert_matches!(response.data, ConstValue::Object(_)); + if let ConstValue::Object(query_fields) = response.data { + assert_eq!(query_fields.len(), 2); + + assert_matches!(query_fields.get("transaction"), Some(ConstValue::Object(_))); + if let Some(ConstValue::Object(transaction_fields)) = + query_fields.get("transaction") + { + assert_eq!(transaction_fields.len(), 1); + let id_field = transaction_fields.get("id"); + assert_matches!(id_field, Some(ConstValue::String(_))); + if let Some(ConstValue::String(id)) = id_field { + assert_eq!(id, "Transaction:0-0-0"); + } + } + + assert_matches!(query_fields.get("chain"), Some(ConstValue::Object(_))); + if let Some(ConstValue::Object(chain_fields)) = query_fields.get("chain") { + assert_eq!(chain_fields.len(), 1); + let transactions_field = chain_fields.get("transactions"); + assert_matches!(transactions_field, Some(ConstValue::Object(_))); + if let Some(ConstValue::Object(transactions_fields)) = transactions_field { + assert_eq!(transactions_fields.len(), 1); + let nodes_field = transactions_fields.get("nodes"); + assert_matches!(nodes_field, Some(ConstValue::List(_))); + if let Some(ConstValue::List(nodes)) = nodes_field { + assert_eq!(nodes.len(), 1); + assert_matches!(nodes.get(0), Some(ConstValue::Object(_))); + if let Some(ConstValue::Object(node_fields)) = nodes.get(0) { + assert_eq!(node_fields.len(), 1); + let id_field = node_fields.get("id"); + assert_matches!(id_field, Some(ConstValue::String(_))); + if let Some(ConstValue::String(id)) = id_field { + assert_eq!(id, "Transaction:0-0-0"); + } + } + } + } + } + } +} diff --git a/packages/fuel-indexer-graphql-dyn/tests/snapshots/dynamic_connection__test.snap b/packages/fuel-indexer-graphql-dyn/tests/snapshots/dynamic_connection__test.snap new file mode 100644 index 000000000..7536ab4b0 --- /dev/null +++ b/packages/fuel-indexer-graphql-dyn/tests/snapshots/dynamic_connection__test.snap @@ -0,0 +1,40 @@ +--- +source: packages/fuel-indexer-graphql-dyn/tests/dynamic_connection.rs +expression: response.data +--- +{ + "chain": { + "a": { + "edges": [ + { + "node": { + "id": "Transaction:0-0-0" + }, + "cursor": "2" + } + ], + "pageInfo": { + "hasNextPage": false, + "hasPreviousPage": false, + "startCursor": "2", + "endCursor": "2" + } + }, + "b": { + "edges": [ + { + "node": { + "id": "Transaction:0-0-0" + }, + "cursor": "2" + } + ], + "pageInfo": { + "hasNextPage": false, + "hasPreviousPage": false, + "startCursor": "2", + "endCursor": "2" + } + } + } +} diff --git a/packages/fuel-indexer-graphql-dyn/tests/snapshots/dynamic_query__test.snap b/packages/fuel-indexer-graphql-dyn/tests/snapshots/dynamic_query__test.snap new file mode 100644 index 000000000..8cbc56666 --- /dev/null +++ b/packages/fuel-indexer-graphql-dyn/tests/snapshots/dynamic_query__test.snap @@ -0,0 +1,18 @@ +--- +source: packages/fuel-indexer-graphql-dyn/tests/dynamic_query.rs +expression: response.data +--- +{ + "transaction": { + "id": "Transaction:0-0-0" + }, + "chain": { + "transactions": { + "nodes": [ + { + "id": "Transaction:0-0-0" + } + ] + } + } +} diff --git a/packages/fuel-indexer-graphql-lib/src/dynamic/connection.rs b/packages/fuel-indexer-graphql-lib/src/dynamic/connection.rs deleted file mode 100644 index c00c64df2..000000000 --- a/packages/fuel-indexer-graphql-lib/src/dynamic/connection.rs +++ /dev/null @@ -1,19 +0,0 @@ -//! `async_graphql::dynamic` extensions for handling GraphQL connections. -//! See: https://graphql.org/learn/pagination/#end-of-list-counts-and-connections -//! See: https://relay.dev/graphql/connections.htm#sec-Connection-Types - -use super::node::*; -use super::paging::*; - -#[derive(Clone, PartialEq, Eq)] -pub struct DynamicConnectionEdge { - pub node_id: DynamicNodeId, - pub cursor: DynamicCursor, -} - -#[derive(Clone, PartialEq, Eq)] -pub struct DynamicConnection { - pub total_count: usize, - pub edges: Vec, - pub page_info: DynamicPageInfo, -} diff --git a/packages/fuel-indexer-graphql-lib/src/dynamic/data.rs b/packages/fuel-indexer-graphql-lib/src/dynamic/data.rs deleted file mode 100644 index 227664920..000000000 --- a/packages/fuel-indexer-graphql-lib/src/dynamic/data.rs +++ /dev/null @@ -1,51 +0,0 @@ -use super::prelude::*; - -#[derive(Clone, Hash, PartialEq, Eq, Debug, EnumString, strum::Display)] -pub enum DynamicDataType { - Int, - String, - // TODO: Implement remaining types -} - -pub type DynamicData = serde_json::Value; - -pub type DynamicFieldId = String; - -#[derive(Clone, Hash, PartialEq, Eq)] -pub struct DynamicDataField(DynamicFieldId, DynamicDataType); -impl DynamicDataField { - pub fn new(name: impl Into, data_type: impl Into) -> Self { - Self(name.into(), data_type.into()) - } - - pub fn id(&self) -> &DynamicFieldId { - &self.0 - } - pub fn data_type(&self) -> &DynamicDataType { - &self.1 - } -} - -#[derive(Clone)] -pub struct DynamicDataFieldResolver { - pub data_field: DynamicDataField, -} -impl DynamicDataFieldResolver { - pub fn new(data_field: DynamicDataField) -> Self { - Self { data_field } - } - - pub fn resolve(self, data: &DynamicData) -> Option { - let value = data.get(self.data_field.id()).unwrap(); - match self.data_field.data_type() { - DynamicDataType::String => { - let value: String = value.as_str().unwrap().to_string(); - Some(FieldValue::value(value)) - } - DynamicDataType::Int => { - let value: i32 = value.as_i64().unwrap() as i32; - Some(FieldValue::value(value)) - } - } - } -} diff --git a/packages/fuel-indexer-graphql-lib/src/dynamic/edge.rs b/packages/fuel-indexer-graphql-lib/src/dynamic/edge.rs deleted file mode 100644 index ce6ecd12f..000000000 --- a/packages/fuel-indexer-graphql-lib/src/dynamic/edge.rs +++ /dev/null @@ -1,63 +0,0 @@ -//! `async_graphql::dynamic` extensions for handling GraphQL connections. -//! See: https://graphql.org/learn/pagination/#end-of-list-counts-and-connections -//! See: https://relay.dev/graphql/connections.htm#sec-Connection-Types - -use super::node::*; -use super::prelude::*; - -pub type DynamicEdgeTypeId = String; - -#[derive(Clone, Hash, PartialEq, Eq)] -pub struct DynamicEdgeId(DynamicEdgeTypeId, DynamicNodeLocalId, DynamicNodeLocalId); -impl DynamicEdgeId { - pub fn new( - type_id: impl Into, - tail_local_id: impl Into, - head_local_id: impl Into, - ) -> Self { - Self(type_id.into(), tail_local_id.into(), head_local_id.into()) - } -} -impl From for String { - fn from(id: DynamicEdgeId) -> String { - format!("{}:{}:{}", id.0, id.1, id.2) - } -} - -pub type DynamicEdgeData = serde_json::Value; - -#[derive(Clone, PartialEq, Eq)] -pub struct DynamicEdge( - DynamicEdgeTypeId, - DynamicNodeLocalId, - DynamicNodeLocalId, - DynamicEdgeData, -); -impl DynamicEdge { - pub fn new( - id: impl Into, - tail_local_id: impl Into, - head_local_id: impl Into, - data: impl Into, - ) -> Self { - Self( - id.into(), - tail_local_id.into(), - head_local_id.into(), - data.into(), - ) - } - - pub fn type_id(&self) -> &DynamicEdgeTypeId { - &self.0 - } - pub fn tail_local_id(&self) -> &DynamicNodeLocalId { - &self.1 - } - pub fn head_local_id(&self) -> &DynamicNodeLocalId { - &self.2 - } - pub fn data(&self) -> &DynamicEdgeData { - &self.3 - } -} diff --git a/packages/fuel-indexer-graphql-lib/src/dynamic/loader.rs b/packages/fuel-indexer-graphql-lib/src/dynamic/loader.rs deleted file mode 100644 index 5635749fe..000000000 --- a/packages/fuel-indexer-graphql-lib/src/dynamic/loader.rs +++ /dev/null @@ -1,76 +0,0 @@ -use super::edge::*; -use super::node::*; -use super::prelude::*; - -#[async_trait] -pub trait DynamicLoader: Send + Sync + 'static { - async fn load_node_by_id( - &self, - id: &DynamicNodeId, - ) -> Result, ()>; - async fn load_nodes_by_id( - &self, - ids: &[DynamicNodeId], - ) -> Result>, ()>; - async fn load_edges( - &self, - type_id: &DynamicEdgeTypeId, - tail_local_id: &DynamicNodeLocalId, - ) -> Result, ()>; -} - -pub struct TestLoader { - pub nodes: HashMap, - pub edges: HashMap<(DynamicEdgeTypeId, DynamicNodeLocalId), DynamicEdge>, -} -impl TestLoader { - pub fn new(nodes: Vec, edges: Vec) -> Self { - let nodes = nodes - .into_iter() - .map(|node| (node.id(), node)) - .collect::>(); - let edges = edges - .into_iter() - .map(|edge| ((edge.type_id().clone(), edge.tail_local_id().clone()), edge)) - .collect::>(); - Self { nodes, edges } - } -} - -#[async_trait] -impl DynamicLoader for TestLoader { - async fn load_node_by_id( - &self, - id: &DynamicNodeId, - ) -> Result, ()> { - let node = self.nodes.get(id); - Ok(node.cloned()) - } - - async fn load_nodes_by_id( - &self, - ids: &[DynamicNodeId], - ) -> Result>, ()> { - let mut nodes = Vec::new(); - for id in ids { - let node = self.load_node_by_id(id).await?; - nodes.push(node); - } - Ok(nodes) - } - - async fn load_edges( - &self, - type_id: &DynamicEdgeTypeId, - tail_local_id: &DynamicNodeLocalId, - ) -> Result, ()> { - let edges = self - .edges - .iter() - .filter(|(id, _edge)| id.0 == *type_id && id.1 == *tail_local_id) - .map(|(_, edge)| edge) - .cloned() - .collect(); - Ok(edges) - } -} diff --git a/packages/fuel-indexer-graphql-lib/src/dynamic/mod.rs b/packages/fuel-indexer-graphql-lib/src/dynamic/mod.rs deleted file mode 100644 index fa574e2d3..000000000 --- a/packages/fuel-indexer-graphql-lib/src/dynamic/mod.rs +++ /dev/null @@ -1,27 +0,0 @@ -pub mod connection; -pub mod data; -pub mod edge; -pub mod loader; -pub mod node; -pub mod paging; -pub mod resolver; - -pub use connection::*; -pub use data::*; -pub use edge::*; -pub use loader::*; -pub use node::*; -pub use paging::*; -pub use resolver::*; - -pub(self) mod prelude { - pub use crate::prelude::*; - pub use crate::spec::*; - pub use crate::util::*; - pub use async_graphql::dynamic::*; - pub use std::collections::HashMap; - pub use std::hash::Hash; - pub use std::str::FromStr; - pub use std::sync::Arc; - pub use strum::EnumString; -} diff --git a/packages/fuel-indexer-graphql-lib/src/dynamic/node.rs b/packages/fuel-indexer-graphql-lib/src/dynamic/node.rs deleted file mode 100644 index 1d08aca79..000000000 --- a/packages/fuel-indexer-graphql-lib/src/dynamic/node.rs +++ /dev/null @@ -1,128 +0,0 @@ -//! `async_graphql::dynamic` extensions for handling GraphQL nodes. -//! See: https://graphql.org/learn/global-object-identification/#node-interface - -use super::data::*; -use super::prelude::*; -use super::resolver::*; - -pub type DynamicNodeLocalId = String; - -pub type DynamicNodeTypeId = String; - -#[derive(Clone, Hash, PartialEq, Eq, Debug)] -pub struct DynamicNodeId(DynamicNodeTypeId, DynamicNodeLocalId); -impl DynamicNodeId { - pub fn new( - type_id: impl Into, - local_id: impl Into, - ) -> Self { - Self(type_id.into(), local_id.into()) - } -} -impl DynamicNodeId { - pub fn type_id(&self) -> &DynamicNodeTypeId { - &self.0 - } - pub fn local_id(&self) -> &DynamicNodeLocalId { - &self.1 - } -} -impl FromStr for DynamicNodeId { - type Err = (); - fn from_str(s: &str) -> Result { - let mut split = s.splitn(2, ':'); - let type_id = split.next().unwrap().parse().unwrap(); - let local_id = split.next().unwrap().to_string(); - Ok(Self(type_id, local_id)) - } -} -impl From for String { - fn from(id: DynamicNodeId) -> String { - format!("{}:{}", id.type_id(), id.local_id()) - } -} - -#[derive(Clone, PartialEq, Eq)] -pub struct DynamicNode(DynamicNodeTypeId, DynamicNodeLocalId, DynamicData); -impl DynamicNode { - pub fn new( - type_id: impl Into, - local_id: impl Into, - data: impl Into, - ) -> Self { - Self(type_id.into(), local_id.into(), data.into()) - } - - pub fn id(&self) -> DynamicNodeId { - DynamicNodeId::new(self.type_id(), self.local_id()) - } - pub fn type_id(&self) -> &DynamicNodeTypeId { - &self.0 - } - pub fn local_id(&self) -> &DynamicNodeLocalId { - &self.1 - } - pub fn data(&self) -> &DynamicData { - &self.2 - } -} - -#[derive(Clone, Hash, PartialEq, Eq)] -pub struct DynamicConnectionField { - pub id: DynamicFieldId, - pub ref_node_type_id: DynamicNodeTypeId, -} - -#[derive(Clone, Hash, PartialEq, Eq)] -pub struct DynamicRefField { - pub id: DynamicFieldId, - pub data_field_id: DynamicFieldId, - pub ref_node_type_id: DynamicNodeTypeId, -} - -#[derive(Clone, PartialEq, Eq)] -pub struct DynamicNodeType { - pub id: DynamicNodeTypeId, - pub data_fields: Vec, - pub ref_fields: Vec, - pub connection_fields: Vec, -} - -impl From for Object { - fn from(value: DynamicNodeType) -> Self { - let name = TypeRef::node(value.id.clone()); - - let mut object = >::new_node(&name); - - // Add data fields - for data_field in &value.data_fields { - object = >::data_field( - object, - data_field.id(), - TypeRef::named_nn(data_field.data_type().to_string()), - ); - } - - // Add ref fields - for ref_field in &value.ref_fields { - object = >::ref_field( - object, - ref_field.id.clone(), - TypeRef::named_nn(ref_field.ref_node_type_id.to_string()), - ); - } - - // Add connection fields - for connection_field in &value.connection_fields { - object = >::connection_field( - object, - connection_field.id.clone(), - TypeRef::named_nn(TypeRef::connection( - connection_field.ref_node_type_id.clone(), - )), - ); - } - - object - } -} diff --git a/packages/fuel-indexer-graphql-lib/src/dynamic/paging.rs b/packages/fuel-indexer-graphql-lib/src/dynamic/paging.rs deleted file mode 100644 index e09bfe812..000000000 --- a/packages/fuel-indexer-graphql-lib/src/dynamic/paging.rs +++ /dev/null @@ -1,11 +0,0 @@ -use super::prelude::*; - -pub type DynamicCursor = Cursor; - -#[derive(Clone, PartialEq, Eq)] -pub struct DynamicPageInfo { - pub has_next_page: bool, - pub has_previous_page: bool, - pub start_cursor: Option, - pub end_cursor: Option, -} diff --git a/packages/fuel-indexer-graphql-lib/src/dynamic/resolver.rs b/packages/fuel-indexer-graphql-lib/src/dynamic/resolver.rs deleted file mode 100644 index 8ab2a92f4..000000000 --- a/packages/fuel-indexer-graphql-lib/src/dynamic/resolver.rs +++ /dev/null @@ -1,310 +0,0 @@ -use super::connection::*; -use super::data::*; -use super::loader::*; -use super::node::*; -use super::paging::*; -use super::prelude::*; -use std::sync::Arc; -use tokio::sync::Mutex; - -pub struct DynamicResolver { - pub node_types: HashMap, - pub loader: Arc>, -} -impl DynamicResolver { - pub fn new( - node_types: Vec, - loader: Arc>, - ) -> Self { - let node_types = node_types - .into_iter() - .map(|node_type| (node_type.id.clone(), node_type)) - .collect::>(); - Self { node_types, loader } - } -} - -impl QueryResolver for DynamicResolver { - fn resolve_node_by_id(ctx: ResolverContext) -> FieldFuture { - FieldFuture::new(async move { - let resolver = ctx.data_unchecked::(); - let id = ctx.args.get("id").unwrap(); - let id = id.string().unwrap(); - let id: DynamicNodeId = id.parse().unwrap(); - let loader = resolver.loader.lock().await; - let node = loader.load_node_by_id(&id).await.unwrap(); - if let Some(node) = node { - let type_id = node.type_id().clone(); - Ok(Some(FieldValue::owned_any(node.clone()).with_type(type_id))) - } else { - Ok(None) - } - }) - } - fn resolve_node_by_ids(ctx: ResolverContext) -> FieldFuture { - FieldFuture::new(async move { - let resolver = ctx.data_unchecked::(); - let ids = ctx.args.get("ids").unwrap(); - let ids = ids.list().unwrap(); - let ids = ids - .iter() - .map(|id| id.string().unwrap().parse()) - .collect::, _>>() - .unwrap(); - let loader = resolver.loader.lock().await; - let nodes = loader.load_nodes_by_id(ids.as_slice()).await.unwrap(); - let nodes = nodes - .into_iter() - .map(|node| { - if let Some(node) = node { - let type_id = node.type_id().clone(); - FieldValue::owned_any(node.clone()).with_type(type_id) - } else { - FieldValue::NULL - } - }) - .collect::>(); - Ok(Some(FieldValue::list(nodes))) - }) - } -} - -impl NodeResolver for DynamicResolver { - fn resolve_id( - ctx: async_graphql::dynamic::ResolverContext, - ) -> async_graphql::dynamic::FieldFuture { - FieldFuture::new(async move { - let parent = ctx.parent_value.try_downcast_ref::()?; - let value: String = parent.id().into(); - Ok(Some(FieldValue::value(value))) - }) - } - fn resolve_data(ctx: ResolverContext) -> FieldFuture { - FieldFuture::new(async move { - let parent = ctx.parent_value.try_downcast_ref::()?; - let path_node = ctx.path_node.unwrap(); - let field_name = path_node.field_name(); - let resolver = ctx.data_unchecked::(); - let node_type = resolver.node_types.get(parent.type_id()).unwrap(); - let field_type = node_type - .data_fields - .iter() - .find(|field_type| field_type.id() == field_name) - .unwrap(); - match field_type.data_type() { - DynamicDataType::String => { - let value = parent.data()[field_name].as_str().unwrap(); - Ok(Some(FieldValue::value(value))) - } - DynamicDataType::Int => { - let value = parent.data()[field_name].as_i64().unwrap(); - Ok(Some(FieldValue::value(value))) - } - } - }) - } - fn resolve_ref(ctx: ResolverContext) -> FieldFuture { - FieldFuture::new(async move { - let parent = ctx.parent_value.try_downcast_ref::()?; - let path_node = ctx.path_node.unwrap(); - let field_name = path_node.field_name(); - let resolver = ctx.data_unchecked::(); - let node_type = resolver.node_types.get(parent.type_id()).unwrap(); - let field_type = node_type - .ref_fields - .iter() - .find(|field_type| field_type.id == field_name) - .unwrap(); - let data_field_id = &field_type.data_field_id; - let local_id = parent.data()[data_field_id].as_str().unwrap(); - let id = DynamicNodeId::new(field_type.ref_node_type_id.clone(), local_id); - let resolver = ctx.data_unchecked::(); - let loader = resolver.loader.lock().await; - let node = loader.load_node_by_id(&id).await.unwrap().unwrap(); - Ok(Some(FieldValue::owned_any(node.clone()))) - }) - } - fn resolve_connection(ctx: ResolverContext) -> FieldFuture { - FieldFuture::new(async move { - let parent = ctx.parent_value.try_downcast_ref::()?; - let path_node = ctx.path_node.unwrap(); - let field_name = path_node.field_name(); - let resolver = ctx.data_unchecked::(); - let node_type = resolver.node_types.get(parent.type_id()).unwrap(); - let field_type = node_type - .connection_fields - .iter() - .find(|field_type| field_type.id == field_name) - .unwrap(); - let resolver = ctx.data_unchecked::(); - match (node_type.id.as_str(), field_type.ref_node_type_id.as_str()) { - ("Chain", "Block") => { - let loader = resolver.loader.lock().await; - let edges = loader - .load_edges(&"ChainHasBlock".to_string(), parent.local_id()) - .await - .unwrap(); - let edges = edges - .iter() - .map(|edge| DynamicConnectionEdge { - node_id: DynamicNodeId::new("Block", edge.head_local_id()), - cursor: "".to_string(), - }) - .collect::>(); - let total_count = edges.len(); - let connection = DynamicConnection { - edges, - total_count, - page_info: DynamicPageInfo { - has_next_page: false, - has_previous_page: false, - start_cursor: None, - end_cursor: None, - }, - }; - Ok(Some(FieldValue::owned_any(connection))) - } - ("Chain", "Transaction") => { - let loader = resolver.loader.lock().await; - let edges = loader - .load_edges(&"ChainHasTransaction".to_string(), parent.local_id()) - .await - .unwrap(); - let edges = edges - .iter() - .map(|edge| DynamicConnectionEdge { - node_id: DynamicNodeId::new( - "Transaction", - edge.head_local_id(), - ), - cursor: "".to_string(), - }) - .collect::>(); - let total_count = edges.len(); - let connection = DynamicConnection { - edges, - total_count, - page_info: DynamicPageInfo { - has_next_page: false, - has_previous_page: false, - start_cursor: None, - end_cursor: None, - }, - }; - Ok(Some(FieldValue::owned_any(connection))) - } - _ => unreachable!(), - } - }) - } -} - -impl ConnectionResolver for DynamicResolver { - fn resolve_total_count(ctx: ResolverContext) -> FieldFuture { - FieldFuture::new(async move { - let parent = ctx.parent_value.try_downcast_ref::()?; - Ok(Some(FieldValue::value(parent.total_count))) - }) - } - fn resolve_nodes(ctx: ResolverContext) -> FieldFuture { - FieldFuture::new(async move { - let parent = ctx.parent_value.try_downcast_ref::()?; - let node_ids = parent - .edges - .iter() - .map(|edge| edge.node_id.clone()) - .collect::>(); - let resolver = ctx.data_unchecked::(); - let loader = resolver.loader.lock().await; - let nodes = loader.load_nodes_by_id(node_ids.as_slice()).await.unwrap(); - let nodes = nodes - .into_iter() - .map(|node| { - if let Some(node) = node { - FieldValue::owned_any(node.clone()) - } else { - FieldValue::NULL - } - }) - .collect::>(); - Ok(Some(FieldValue::list(nodes))) - }) - } - fn resolve_edges(ctx: ResolverContext) -> FieldFuture { - FieldFuture::new(async move { - let parent = ctx.parent_value.try_downcast_ref::()?; - let edges = parent - .edges - .iter() - .map(|edge| FieldValue::owned_any(edge.clone())) - .collect::>(); - Ok(Some(FieldValue::list(edges))) - }) - } - fn resolve_page_info(ctx: ResolverContext) -> FieldFuture { - FieldFuture::new(async move { - let parent = ctx.parent_value.try_downcast_ref::()?; - Ok(Some(FieldValue::owned_any(parent.page_info.clone()))) - }) - } -} - -impl EdgeResolver for DynamicResolver { - fn resolve_node(ctx: ResolverContext) -> FieldFuture { - FieldFuture::new(async move { - let parent = ctx - .parent_value - .try_downcast_ref::()?; - let id = &parent.node_id; - let resolver = ctx.data_unchecked::(); - let loader = resolver.loader.lock().await; - let node = loader.load_node_by_id(id).await.unwrap().unwrap(); - Ok(Some(FieldValue::owned_any(node.clone()))) - }) - } - fn resolve_cursor(ctx: ResolverContext) -> FieldFuture { - FieldFuture::new(async move { - let parent = ctx - .parent_value - .try_downcast_ref::()?; - Ok(Some(FieldValue::value(parent.cursor.clone()))) - }) - } -} - -impl PageInfoResolver for DynamicResolver { - fn resolve_has_next_page( - ctx: async_graphql::dynamic::ResolverContext, - ) -> async_graphql::dynamic::FieldFuture { - FieldFuture::new(async move { - let parent = ctx.parent_value.try_downcast_ref::()?; - Ok(Some(FieldValue::value(parent.has_next_page))) - }) - } - fn resolve_has_previous_page(ctx: ResolverContext) -> FieldFuture { - FieldFuture::new(async move { - let parent = ctx.parent_value.try_downcast_ref::()?; - Ok(Some(FieldValue::value(parent.has_previous_page))) - }) - } - fn resolve_start_cursor(ctx: ResolverContext) -> FieldFuture { - FieldFuture::new(async move { - let parent = ctx.parent_value.try_downcast_ref::()?; - if let Some(start_cursor) = &parent.start_cursor { - Ok(Some(FieldValue::value(start_cursor.clone()))) - } else { - Ok(None) - } - }) - } - fn resolve_end_cursor(ctx: ResolverContext) -> FieldFuture { - FieldFuture::new(async move { - let parent = ctx.parent_value.try_downcast_ref::()?; - if let Some(end_cursor) = &parent.end_cursor { - Ok(Some(FieldValue::value(end_cursor.clone()))) - } else { - Ok(None) - } - }) - } -} diff --git a/packages/fuel-indexer-graphql-lib/src/json_resolver.rs b/packages/fuel-indexer-graphql-lib/src/json_resolver.rs deleted file mode 100644 index fe2382cc6..000000000 --- a/packages/fuel-indexer-graphql-lib/src/json_resolver.rs +++ /dev/null @@ -1,180 +0,0 @@ -use std::collections::HashMap; - -pub use crate::spec::*; - -use crate::spec::PageInfoResolver; - -pub(self) mod prelude { - pub use crate::spec::*; - pub use async_graphql::dynamic::*; - pub use serde_json::Value as JsonValue; -} - -use prelude::*; - -pub struct Node(pub String, pub JsonValue); -impl Node { - pub fn id(&self) -> &str { - &self.0 - } - pub fn type_id(&self) -> &str { - self.id().split(':').next().unwrap() - } - pub fn local_id(&self) -> &str { - self.id().split(':').nth(1).unwrap() - } - pub fn data(&self) -> &JsonValue { - &self.1 - } - - pub fn to_field_value(&self) -> FieldValue { - FieldValue::borrowed_any(self) - } - pub fn to_typed_field_value(&self) -> FieldValue { - let type_id = self.type_id().to_string(); - FieldValue::borrowed_any(self).with_type(type_id) - } -} - -pub struct JsonResolver { - pub nodes: HashMap, -} -impl JsonResolver { - pub fn new(nodes: Vec) -> Self { - let nodes = nodes - .into_iter() - .map(|node| (node.id().to_string(), node)) - .collect::>(); - Self { nodes } - } -} - -impl QueryResolver for JsonResolver { - fn resolve_node_by_id(ctx: ResolverContext) -> FieldFuture { - FieldFuture::new(async move { - let resolver = ctx.data_unchecked::(); - let id = ctx.args.get("id").unwrap(); - let id = id.string().unwrap(); - let node = resolver.nodes.get(id); - if let Some(node) = node { - Ok(Some(node.to_typed_field_value())) - } else { - Ok(None) - } - }) - } - fn resolve_node_by_ids(ctx: ResolverContext) -> FieldFuture { - FieldFuture::new(async move { - let resolver = ctx.data_unchecked::(); - let ids = ctx.args.get("ids").unwrap(); - let ids = ids.list().unwrap(); - let ids = ids - .iter() - .map(|id| id.string().unwrap().to_string()) - .collect::>(); - let nodes = ids - .iter() - .map(|id| { - let node = resolver.nodes.get(id).unwrap(); - node.to_typed_field_value() - }) - .collect::>(); - Ok(Some(FieldValue::list(nodes))) - }) - } -} - -impl NodeResolver for JsonResolver { - fn resolve_id( - ctx: async_graphql::dynamic::ResolverContext, - ) -> async_graphql::dynamic::FieldFuture { - FieldFuture::new(async move { - let parent = ctx.parent_value.try_downcast_ref::()?; - Ok(Some(FieldValue::value(parent.id()))) - }) - } - fn resolve_data(ctx: ResolverContext) -> FieldFuture { - FieldFuture::new(async move { - let parent = ctx.parent_value.try_downcast_ref::()?; - let path_node = ctx.path_node.unwrap(); - let field_name = path_node.field_name(); - let value = parent.data()[field_name].as_str().unwrap(); - Ok(Some(FieldValue::value(value))) - }) - } - fn resolve_ref(ctx: ResolverContext) -> FieldFuture { - FieldFuture::new(async move { - let parent = ctx.parent_value.try_downcast_ref::()?; - let path_node = ctx.path_node.unwrap(); - let field_name = path_node.field_name(); - let id = parent.data()[field_name].as_str().unwrap(); - let resolver = ctx.data_unchecked::(); - let node = resolver.nodes.get(id).unwrap(); - Ok(Some(node.to_field_value())) - }) - } - fn resolve_connection(_ctx: ResolverContext) -> FieldFuture { - unimplemented!() - } -} - -impl ConnectionResolver for JsonResolver { - fn resolve_total_count(_ctx: ResolverContext) -> FieldFuture { - unimplemented!() - } - fn resolve_nodes(_ctx: ResolverContext) -> FieldFuture { - unimplemented!() - } - fn resolve_edges(_ctx: ResolverContext) -> FieldFuture { - unimplemented!() - } - fn resolve_page_info(_ctx: ResolverContext) -> FieldFuture { - unimplemented!() - } -} - -impl EdgeResolver for JsonResolver { - fn resolve_node(_ctx: ResolverContext) -> FieldFuture { - unimplemented!() - } - fn resolve_cursor(_ctx: ResolverContext) -> FieldFuture { - unimplemented!() - } -} - -impl PageInfoResolver for JsonResolver { - fn resolve_has_next_page( - ctx: async_graphql::dynamic::ResolverContext, - ) -> async_graphql::dynamic::FieldFuture { - FieldFuture::new(async move { - let parent = ctx.parent_value.try_downcast_ref::()?; - Ok(Some(FieldValue::value( - parent["has_next_page"].as_bool().unwrap(), - ))) - }) - } - fn resolve_has_previous_page(ctx: ResolverContext) -> FieldFuture { - FieldFuture::new(async move { - let parent = ctx.parent_value.try_downcast_ref::()?; - Ok(Some(FieldValue::value( - parent["has_previous_page"].as_bool().unwrap(), - ))) - }) - } - fn resolve_start_cursor(ctx: ResolverContext) -> FieldFuture { - FieldFuture::new(async move { - let parent = ctx.parent_value.try_downcast_ref::()?; - Ok(Some(FieldValue::value( - parent["start_cursor"].as_str().unwrap(), - ))) - }) - } - fn resolve_end_cursor(ctx: ResolverContext) -> FieldFuture { - FieldFuture::new(async move { - let parent = ctx.parent_value.try_downcast_ref::()?; - Ok(Some(FieldValue::value( - parent["end_cursor"].as_str().unwrap(), - ))) - }) - } -} diff --git a/packages/fuel-indexer-graphql-lib/src/lib.rs b/packages/fuel-indexer-graphql-lib/src/lib.rs deleted file mode 100644 index 82ad644cb..000000000 --- a/packages/fuel-indexer-graphql-lib/src/lib.rs +++ /dev/null @@ -1,12 +0,0 @@ -pub mod dynamic; -#[cfg(feature = "json")] -pub mod json_resolver; -pub mod spec; -#[cfg(test)] -pub mod test; -pub mod util; - -pub(self) mod prelude { - pub use async_trait::async_trait; - pub use extension_trait::extension_trait; -} diff --git a/packages/fuel-indexer-graphql-lib/src/spec/paging.rs b/packages/fuel-indexer-graphql-lib/src/spec/paging.rs deleted file mode 100644 index 9c5b974c7..000000000 --- a/packages/fuel-indexer-graphql-lib/src/spec/paging.rs +++ /dev/null @@ -1,47 +0,0 @@ -//! `async_graphql::dynamic` extensions for handling pagination. -//! See: https://graphql.org/learn/pagination/ - -use super::prelude::*; - -pub type Cursor = String; - -#[extension_trait] -pub impl PagingTypeRef for TypeRef { - const CURSOR: &'static str = "String"; - const PAGE_INFO: &'static str = "PageInfo"; -} - -/// See: https://relay.dev/graphql/connections.htm#sec-PageInfo -#[extension_trait] -pub impl PageInfoObject for Object { - fn new_page_info() -> Self { - Self::new(TypeRef::PAGE_INFO) - .field(Field::new( - "hasNextPage", - TypeRef::named_nn(TypeRef::BOOLEAN), - Resolver::resolve_has_next_page, - )) - .field(Field::new( - "hasPreviousPage", - TypeRef::named_nn(TypeRef::BOOLEAN), - Resolver::resolve_has_previous_page, - )) - .field(Field::new( - "startCursor", - TypeRef::named(TypeRef::CURSOR), - Resolver::resolve_start_cursor, - )) - .field(Field::new( - "endCursor", - TypeRef::named(TypeRef::CURSOR), - Resolver::resolve_end_cursor, - )) - } -} - -pub trait PageInfoResolver: Send + Sync + 'static { - fn resolve_has_next_page(ctx: ResolverContext) -> FieldFuture; - fn resolve_has_previous_page(ctx: ResolverContext) -> FieldFuture; - fn resolve_start_cursor(ctx: ResolverContext) -> FieldFuture; - fn resolve_end_cursor(ctx: ResolverContext) -> FieldFuture; -} diff --git a/packages/fuel-indexer-graphql-lib/src/test.rs b/packages/fuel-indexer-graphql-lib/src/test.rs deleted file mode 100644 index 76f0bb12f..000000000 --- a/packages/fuel-indexer-graphql-lib/src/test.rs +++ /dev/null @@ -1,40 +0,0 @@ -pub mod prelude { - pub use super::util::*; - pub use assert_matches::*; - pub use async_graphql::dynamic::*; - pub use async_graphql::{Request, Response, ServerError}; - pub use async_trait::async_trait; - pub use extension_trait::extension_trait; - pub use graphql_parser::*; - pub use insta::*; - pub use serde_json::{json, Value as JsonValue}; - pub use velcro::hash_map; -} - -pub mod util { - pub use super::prelude::*; - - pub async fn execute_query( - schema: &Schema, - query: impl Into, - root_value: Option>, - ) -> Result> { - let request = Request::new(query); - let request = if let Some(root_value) = root_value { - request.root_value(root_value) - } else { - request.into() - }; - let response = schema.execute(request).await; - response.into_result() - } - - #[extension_trait] - pub impl TestSchema for Schema { - fn pretty_sdl(&self) -> String { - let sdl = self.sdl(); - let ugly = parse_schema::<&str>(&sdl).unwrap(); - ugly.format(&Style::default()) - } - } -} diff --git a/packages/fuel-indexer-graphql-lib/src/util.rs b/packages/fuel-indexer-graphql-lib/src/util.rs deleted file mode 100644 index 8a0834f3a..000000000 --- a/packages/fuel-indexer-graphql-lib/src/util.rs +++ /dev/null @@ -1,21 +0,0 @@ -//! Utilities for `async_graphql::dynamic` - -use super::prelude::*; -use async_graphql::dynamic::*; - -#[extension_trait] -pub impl<'a> ResolverContextUtilExt<'a> for ResolverContext<'a> { - fn parent_value(&self) -> &'a T - where - T: 'static, - { - self.parent_value - .try_downcast_ref::() - .unwrap_or_else(|_| { - panic!( - "Parent value casting failed. Expected: {}", - std::any::type_name::() - ) - }) - } -} diff --git a/packages/fuel-indexer-graphql-lib/tests/dynamic.rs b/packages/fuel-indexer-graphql-lib/tests/dynamic.rs deleted file mode 100644 index 676a5e72c..000000000 --- a/packages/fuel-indexer-graphql-lib/tests/dynamic.rs +++ /dev/null @@ -1,222 +0,0 @@ -mod test; - -use crate::test::prelude::*; -use fuel_indexer_graphql_lib::dynamic::*; -use fuel_indexer_graphql_lib::spec::*; -use std::sync::Arc; -use std::vec; -use tokio::sync::Mutex; - -#[tokio::test] -async fn test() { - let chain_type = DynamicNodeType { - id: DynamicNodeTypeId::from("Chain"), - data_fields: vec![DynamicDataField::new("dummy", DynamicDataType::Int)], - ref_fields: vec![], - connection_fields: vec![ - DynamicConnectionField { - id: DynamicFieldId::from("blocks"), - ref_node_type_id: DynamicNodeTypeId::from("Block"), - }, - DynamicConnectionField { - id: DynamicFieldId::from("transactions"), - ref_node_type_id: DynamicNodeTypeId::from("Transaction"), - }, - ], - }; - let block_type = DynamicNodeType { - id: DynamicNodeTypeId::from("Block"), - data_fields: vec![ - DynamicDataField::new("number", DynamicDataType::Int), - DynamicDataField::new("hash", DynamicDataType::String), - DynamicDataField::new("parent_hash", DynamicDataType::String), - ], - ref_fields: vec![ - DynamicRefField { - id: DynamicFieldId::from("chain"), - data_field_id: DynamicFieldId::from("chain_id"), - ref_node_type_id: DynamicNodeTypeId::from("Chain"), - }, - DynamicRefField { - id: DynamicFieldId::from("parent"), - data_field_id: DynamicFieldId::from("parent_hash"), - ref_node_type_id: DynamicNodeTypeId::from("Block"), - }, - ], - connection_fields: vec![ - DynamicConnectionField { - id: DynamicFieldId::from("blocks"), - ref_node_type_id: DynamicNodeTypeId::from("Block"), - }, - DynamicConnectionField { - id: DynamicFieldId::from("transactions"), - ref_node_type_id: DynamicNodeTypeId::from("Transaction"), - }, - ], - }; - let transaction_type = DynamicNodeType { - id: DynamicNodeTypeId::from("Transaction"), - data_fields: vec![ - DynamicDataField::new("index", DynamicDataType::Int), - DynamicDataField::new("hash", DynamicDataType::String), - DynamicDataField::new("block_hash", DynamicDataType::String), - ], - ref_fields: vec![ - DynamicRefField { - id: DynamicFieldId::from("chain"), - data_field_id: DynamicFieldId::from("chain_id"), - ref_node_type_id: DynamicNodeTypeId::from("Chain"), - }, - DynamicRefField { - id: DynamicFieldId::from("block"), - data_field_id: DynamicFieldId::from("block_hash"), - ref_node_type_id: DynamicNodeTypeId::from("Block"), - }, - ], - connection_fields: vec![], - }; - - let chain: Object = chain_type.clone().into(); - let block: Object = block_type.clone().into(); - let transaction: Object = transaction_type.clone().into(); - let block_connection = >::new_connection( - TypeRef::node("Block"), - ); - let block_edge = >::new_edge( - "Block", - TypeRef::node("Block"), - ); - let transaction_connection = - >::new_connection(TypeRef::node( - "Transaction", - )); - let transaction_edge = >::new_edge( - "Transaction", - TypeRef::node("Transaction"), - ); - let mut schema = Schema::build(TypeRef::QUERY, None, None) - .register(>::new_page_info()) - .register(::new_node()) - .register(chain) - .register(block) - .register(transaction) - .register(block_connection) - .register(block_edge) - .register(transaction_connection) - .register(transaction_edge); - - let nodes = vec![ - DynamicNode::new( - DynamicNodeTypeId::from("Chain"), - DynamicNodeLocalId::from("0"), - json!({ - "id": "0", - "dummy": "0x00", - }), - ), - DynamicNode::new( - DynamicNodeTypeId::from("Block"), - DynamicNodeLocalId::from("0"), - json!({ - "id": "0", - "chain_id": "0", - "number": "0x00", - "hash": "0x00", - "parent_hash": "0x00", - }), - ), - DynamicNode::new( - DynamicNodeTypeId::from("Transaction"), - DynamicNodeLocalId::from("0"), - json!({ - "id": "0", - "chain_id": "0", - "index": 0, - "hash": "0x00", - "block_hash": "0", - }), - ), - ]; - let loader = TestLoader::new( - nodes, - vec![ - DynamicEdge::new( - "ChainHasBlock", - "0".to_string(), - "0".to_string(), - JsonValue::Null, - ), - DynamicEdge::new( - "ChainHasTransaction", - "0".to_string(), - "0".to_string(), - JsonValue::Null, - ), - ], - ); - let resolver = DynamicResolver::new( - vec![chain_type, block_type, transaction_type], - Arc::new(Mutex::new(loader)), - ); - schema = schema.data(resolver); - - let query = >::new_query(); - - schema = schema.register(query); - - let schema = schema.finish().unwrap(); - - // Execute a query - let response = execute_query( - &schema, - r#" - query { - node(id: "Transaction:0") { - id - ... on Transaction { - transactionId: id - index - hash - chain { - id - blocks(first: 1) { - edges { - node { - id - } - } - } - } - } - } - } - "#, - None, - ) - .await - .unwrap(); - - assert_json_snapshot!(response.data, @r###" - { - "node": { - "id": "Transaction:0", - "transactionId": "Transaction:0", - "index": 0, - "hash": "0x00", - "chain": { - "id": "Chain:0", - "blocks": { - "edges": [ - { - "node": { - "id": "Block:0" - } - } - ] - } - } - } - } - "### - ); -} diff --git a/packages/fuel-indexer-graphql-lib/tests/snapshots/spec__sdl-2.snap b/packages/fuel-indexer-graphql-lib/tests/snapshots/spec__sdl-2.snap deleted file mode 100644 index 384bc28bf..000000000 --- a/packages/fuel-indexer-graphql-lib/tests/snapshots/spec__sdl-2.snap +++ /dev/null @@ -1,36 +0,0 @@ ---- -source: packages/fuel-indexer-graphql-lib/tests/spec.rs -expression: text ---- -type Block implements Node { - id: ID! - number: Int! - hash: String! -} - -interface Node { - id: ID! -} - -type PageInfo { - hasNextPage: Boolean! - hasPreviousPage: Boolean! - startCursor: String - endCursor: String -} - -type Query { - node(id: ID!): Node - nodes(ids: [ID!]!): [Node]! -} - -type Transaction implements Node { - id: ID! - index: Int! - hash: String! -} - -schema { - query: Query -} - diff --git a/packages/fuel-indexer-graphql-lib/tests/snapshots/spec__sdl.snap b/packages/fuel-indexer-graphql-lib/tests/snapshots/spec__sdl.snap deleted file mode 100644 index b316bad28..000000000 --- a/packages/fuel-indexer-graphql-lib/tests/snapshots/spec__sdl.snap +++ /dev/null @@ -1,41 +0,0 @@ ---- -source: packages/fuel-indexer-graphql-lib/tests/spec.rs -expression: text ---- -type Block implements Node { - id: ID! - number: Int! - hash: String! - chain: Chain! -} - -type Chain implements Node { - id: ID! -} - -interface Node { - id: ID! -} - -type PageInfo { - hasNextPage: Boolean! - hasPreviousPage: Boolean! - startCursor: String - endCursor: String -} - -type Query { - node(id: ID!): Node - nodes(ids: [ID!]!): [Node]! -} - -type Transaction implements Node { - id: ID! - index: Int! - hash: String! -} - -schema { - query: Query -} - diff --git a/packages/fuel-indexer-graphql-lib/tests/spec.rs b/packages/fuel-indexer-graphql-lib/tests/spec.rs deleted file mode 100644 index 6de5502fc..000000000 --- a/packages/fuel-indexer-graphql-lib/tests/spec.rs +++ /dev/null @@ -1,127 +0,0 @@ -mod test; - -use crate::test::prelude::*; -use fuel_indexer_graphql_lib::json_resolver::*; - -fn build_schema() -> SchemaBuilder { - let mut schema = Schema::build(TypeRef::QUERY, None, None) - .register(>::new_page_info()) - .register(::new_node()); - let query = >::new_query(); - - // Some nodes - let chain = >::new_node("Chain"); - let mut block = NodeObject::::new_node("Block"); - block = >::data_field( - block, - "number", - TypeRef::named_nn(TypeRef::INT), - ); - block = >::data_field( - block, - "hash", - TypeRef::named_nn(TypeRef::STRING), - ); - block = >::ref_field( - block, - "chain", - TypeRef::named_nn(TypeRef::node("Chain")), - ); - let mut transaction = >::new_node("Transaction"); - transaction = >::data_field( - transaction, - "index", - TypeRef::named_nn(TypeRef::INT), - ); - transaction = >::data_field( - transaction, - "hash", - TypeRef::named_nn(TypeRef::STRING), - ); - - schema = schema - .register(chain) - .register(block) - .register(transaction) - .register(query); - - schema -} - -#[tokio::test] -async fn resolve() { - // Build the schema - let mut schema = build_schema(); - let resolver = JsonResolver::new(vec![ - Node( - "Chain:0".to_string(), - json!({ - "type": "Chain", - "id": "Chain:0", - "dummy": "0x00", - }), - ), - Node( - "Block:0".to_string(), - json!({ - "type": "Block", - "id": "Block:0", - "number": "0x00", - "hash": "0x00", - "chainId": "0", - "chain": "Chain:0", - }), - ), - ]); - schema = schema.data(resolver); - let schema = schema.finish(); - assert_matches!(schema, Ok(_)); - let schema = schema.unwrap(); - - // Execute a query - let response = execute_query( - &schema, - r#" - query { - node(id: "Block:0") { - id - ... on Block { - hash - chain { - id - } - } - } - } - "#, - None, - ) - .await - .unwrap(); - - assert_json_snapshot!(response.data, @r###" - { - "node": { - "id": "Block:0", - "hash": "0x00", - "chain": { - "id": "Chain:0" - } - } - } - "### - ); -} - -#[tokio::test] -async fn sdl() { - // Build the schema - let schema = build_schema(); - let schema = schema.finish(); - assert_matches!(schema, Ok(_)); - let schema = schema.unwrap(); - - // Print the schema - let text = schema.pretty_sdl(); - assert_snapshot!(text); -} diff --git a/packages/fuel-indexer-graphql-lib/tests/test/mod.rs b/packages/fuel-indexer-graphql-lib/tests/test/mod.rs deleted file mode 100644 index 5c7e6a6b0..000000000 --- a/packages/fuel-indexer-graphql-lib/tests/test/mod.rs +++ /dev/null @@ -1,3 +0,0 @@ -#[path = "../../src/test.rs"] -mod src_test; -pub use src_test::*;