From 58ad13fd98a86f23f572e3eb064c0539b603acc9 Mon Sep 17 00:00:00 2001 From: Ammar Arif Date: Sat, 3 Aug 2024 04:15:29 +0800 Subject: [PATCH 01/10] bump metrics dependencies (#2251) --- .github/workflows/ci.yml | 3 + Cargo.lock | 213 +++++++++++++++++----- Cargo.toml | 2 +- crates/metrics/Cargo.toml | 8 +- crates/metrics/src/prometheus_exporter.rs | 12 +- 5 files changed, 179 insertions(+), 59 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 19b59273e9..b8e2ea5dbd 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -73,6 +73,9 @@ jobs: - uses: arduino/setup-protoc@v2 with: repo-token: ${{ secrets.github_token }} + - uses: ilammy/setup-nasm@v1 + with: + version: "2.15.05" - run: cargo build --target x86_64-pc-windows-msvc --bins # This job is used to ensure the built katana image doesn't depend on any diff --git a/Cargo.lock b/Cargo.lock index e10bca624f..af8d7465d9 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1550,6 +1550,33 @@ version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" +[[package]] +name = "aws-lc-rs" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ae74d9bd0a7530e8afd1770739ad34b36838829d6ad61818f9230f683f5ad77" +dependencies = [ + "aws-lc-sys", + "mirai-annotations", + "paste", + "zeroize", +] + +[[package]] +name = "aws-lc-sys" +version = "0.20.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f0e249228c6ad2d240c2dc94b714d711629d52bad946075d8e9b2f5391f0703" +dependencies = [ + "bindgen 0.69.4", + "cc", + "cmake", + "dunce", + "fs_extra", + "libc", + "paste", +] + [[package]] name = "axum" version = "0.6.20" @@ -1764,12 +1791,15 @@ dependencies = [ "itertools 0.12.1", "lazy_static", "lazycell", + "log", + "prettyplease 0.2.20", "proc-macro2", "quote", "regex", "rustc-hash", "shlex", "syn 2.0.71", + "which 4.4.2", ] [[package]] @@ -3368,6 +3398,15 @@ version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cbd0f76e066e64fdc5631e3bb46381254deab9ef1158292f27c8c57e3bf3fe59" +[[package]] +name = "cmake" +version = "0.1.50" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a31c789563b815f77f4250caee12365734369f942439b7defd71e18a48197130" +dependencies = [ + "cc", +] + [[package]] name = "cobs" version = "0.2.3" @@ -6312,6 +6351,25 @@ dependencies = [ "tracing", ] +[[package]] +name = "h2" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa82e28a107a8cc405f0839610bdc9b15f1e25ec7d696aa5cf173edbcb1486ab" +dependencies = [ + "atomic-waker", + "bytes", + "fnv", + "futures-core", + "futures-sink", + "http 1.1.0", + "indexmap 2.2.6", + "slab", + "tokio", + "tokio-util", + "tracing", +] + [[package]] name = "half" version = "2.4.1" @@ -6645,7 +6703,7 @@ dependencies = [ "futures-channel", "futures-core", "futures-util", - "h2", + "h2 0.3.26", "http 0.2.12", "http-body 0.4.6", "httparse", @@ -6668,9 +6726,11 @@ dependencies = [ "bytes", "futures-channel", "futures-util", + "h2 0.4.5", "http 1.1.0", "http-body 1.0.1", "httparse", + "httpdate", "itoa", "pin-project-lite", "smallvec", @@ -6712,7 +6772,7 @@ dependencies = [ "hyper 0.14.30", "log", "rustls 0.20.9", - "rustls-native-certs", + "rustls-native-certs 0.6.3", "tokio", "tokio-rustls 0.23.4", ] @@ -6728,7 +6788,7 @@ dependencies = [ "hyper 0.14.30", "log", "rustls 0.21.12", - "rustls-native-certs", + "rustls-native-certs 0.6.3", "tokio", "tokio-rustls 0.24.1", "webpki-roots 0.25.4", @@ -6744,7 +6804,9 @@ dependencies = [ "http 1.1.0", "hyper 1.4.1", "hyper-util", + "log", "rustls 0.23.11", + "rustls-native-certs 0.7.1", "rustls-pki-types", "tokio", "tokio-rustls 0.26.0", @@ -7413,7 +7475,7 @@ dependencies = [ "jsonrpsee-core 0.16.3", "jsonrpsee-types 0.16.3", "pin-project", - "rustls-native-certs", + "rustls-native-certs 0.6.3", "soketto", "thiserror", "tokio", @@ -7433,7 +7495,7 @@ dependencies = [ "http 0.2.12", "jsonrpsee-core 0.20.3", "pin-project", - "rustls-native-certs", + "rustls-native-certs 0.6.3", "soketto", "thiserror", "tokio", @@ -8931,24 +8993,26 @@ dependencies = [ [[package]] name = "metrics" -version = "0.21.1" +version = "0.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fde3af1a009ed76a778cb84fdef9e7dbbdf5775ae3e4cc1f434a6a307f6f76c5" +checksum = "884adb57038347dfbaf2d5065887b6cf4312330dc8e94bc30a1a839bd79d3261" dependencies = [ "ahash 0.8.11", - "metrics-macros", "portable-atomic", ] [[package]] name = "metrics-exporter-prometheus" -version = "0.12.2" +version = "0.15.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d4fa7ce7c4862db464a37b0b31d89bca874562f034bd7993895572783d02950" +checksum = "b4f0c8427b39666bf970460908b213ec09b3b350f20c0c2eabcbba51704a08e6" dependencies = [ - "base64 0.21.7", - "hyper 0.14.30", - "indexmap 1.9.3", + "base64 0.22.1", + "http-body-util", + "hyper 1.4.1", + "hyper-rustls 0.27.2", + "hyper-util", + "indexmap 2.2.6", "ipnet", "metrics", "metrics-util", @@ -8958,22 +9022,11 @@ dependencies = [ "tracing", ] -[[package]] -name = "metrics-macros" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38b4faf00617defe497754acde3024865bc143d44a86799b24e191ecff91354f" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.71", -] - [[package]] name = "metrics-process" -version = "1.0.14" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6aa2a67e2580fbeba4d5a96e659945981e700a383b4cea1432e0cfc18f58c5da" +checksum = "cb524e5438255eaa8aa74214d5a62713b77b2c3c6e3c0bbeee65cfd9a58948ba" dependencies = [ "libproc", "mach2", @@ -8981,23 +9034,23 @@ dependencies = [ "once_cell", "procfs", "rlimit", - "windows 0.52.0", + "windows 0.57.0", ] [[package]] name = "metrics-util" -version = "0.15.1" +version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4de2ed6e491ed114b40b732e4d1659a9d53992ebd87490c44a6ffe23739d973e" +checksum = "4259040465c955f9f2f1a4a8a16dc46726169bca0f88e8fb2dbeced487c3e828" dependencies = [ "aho-corasick", "crossbeam-epoch", "crossbeam-utils", - "hashbrown 0.13.1", - "indexmap 1.9.3", + "hashbrown 0.14.5", + "indexmap 2.2.6", "metrics", "num_cpus", - "ordered-float 3.9.2", + "ordered-float 4.2.2", "quanta", "radix_trie", "sketches-ddsketch", @@ -9056,6 +9109,12 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "mirai-annotations" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9be0862c1b3f26a88803c4a49de6889c10e608b3ee9344e6ef5b45fb37ad3d1" + [[package]] name = "monch" version = "0.5.0" @@ -9727,9 +9786,9 @@ dependencies = [ [[package]] name = "ordered-float" -version = "3.9.2" +version = "4.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1e1c390732d15f1d48471625cd92d154e66db2c56645e29a9cd26f4699f72dc" +checksum = "4a91171844676f8c7990ce64959210cd2eaef32c2612c50f9fae9f8aaa6065a6" dependencies = [ "num-traits 0.2.19", ] @@ -10667,13 +10726,12 @@ dependencies = [ [[package]] name = "quanta" -version = "0.11.1" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a17e662a7a8291a865152364c20c7abc5e60486ab2001e8ec10b24862de0b9ab" +checksum = "8e5167a477619228a0b284fac2674e3c388cba90631d7b7de620e6f1fcd08da5" dependencies = [ "crossbeam-utils", "libc", - "mach2", "once_cell", "raw-cpuid", "wasi", @@ -10901,11 +10959,11 @@ dependencies = [ [[package]] name = "raw-cpuid" -version = "10.7.0" +version = "11.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c297679cb867470fa8c9f67dbba74a78d78e3e98d7cf2b08d6d71540f797332" +checksum = "cb9ee317cfe3fbd54b36a511efc1edd42e216903c9cd575e686dd68a2ba90d8d" dependencies = [ - "bitflags 1.3.2", + "bitflags 2.6.0", ] [[package]] @@ -11071,7 +11129,7 @@ dependencies = [ "encoding_rs", "futures-core", "futures-util", - "h2", + "h2 0.3.26", "http 0.2.12", "http-body 0.4.6", "hyper 0.14.30", @@ -11086,7 +11144,7 @@ dependencies = [ "percent-encoding", "pin-project-lite", "rustls 0.21.12", - "rustls-native-certs", + "rustls-native-certs 0.6.3", "rustls-pemfile 1.0.4", "serde", "serde_json", @@ -11204,8 +11262,8 @@ dependencies = [ [[package]] name = "reth-metrics-derive" -version = "0.2.0-beta.4" -source = "git+https://github.com/paradigmxyz/reth.git?tag=v0.2.0-beta.4#c04dbe6e9bd05be5da3a5d541adbf76166c14a08" +version = "1.0.3" +source = "git+https://github.com/paradigmxyz/reth.git?tag=v1.0.3#390f30aadebcdd509e72cc04327c3b854de076a6" dependencies = [ "once_cell", "proc-macro2", @@ -11638,6 +11696,8 @@ version = "0.23.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4828ea528154ae444e5a642dbb7d5623354030dc9822b83fd9bb79683c7399d0" dependencies = [ + "aws-lc-rs", + "log", "once_cell", "ring 0.17.8", "rustls-pki-types", @@ -11658,6 +11718,19 @@ dependencies = [ "security-framework", ] +[[package]] +name = "rustls-native-certs" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a88d6d420651b496bdd98684116959239430022a115c1240e6c3993be0b15fba" +dependencies = [ + "openssl-probe", + "rustls-pemfile 2.1.2", + "rustls-pki-types", + "schannel", + "security-framework", +] + [[package]] name = "rustls-pemfile" version = "1.0.4" @@ -11699,6 +11772,7 @@ version = "0.102.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f9a6fccd794a42c2c105b513a2f62bc3fd8f3ba57a4593677ceb0bd035164d78" dependencies = [ + "aws-lc-rs", "ring 0.17.8", "rustls-pki-types", "untrusted 0.9.0", @@ -14222,7 +14296,7 @@ dependencies = [ "axum", "base64 0.21.7", "bytes", - "h2", + "h2 0.3.26", "http 0.2.12", "http-body 0.4.6", "hyper 0.14.30", @@ -15704,11 +15778,11 @@ dependencies = [ [[package]] name = "windows" -version = "0.52.0" +version = "0.57.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e48a53791691ab099e5e2ad123536d0fff50652600abaf43bbf952894110d0be" +checksum = "12342cb4d8e3b046f3d80effd474a7a02447231330ef77d71daa6fbc40681143" dependencies = [ - "windows-core 0.52.0", + "windows-core 0.57.0", "windows-targets 0.52.6", ] @@ -15730,6 +15804,49 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "windows-core" +version = "0.57.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2ed2439a290666cd67ecce2b0ffaad89c2a56b976b736e6ece670297897832d" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-result", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-implement" +version = "0.57.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9107ddc059d5b6fbfbffdfa7a7fe3e22a226def0b2608f72e9d552763d3e1ad7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.71", +] + +[[package]] +name = "windows-interface" +version = "0.57.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29bee4b38ea3cde66011baa44dba677c432a78593e202392d1e9070cf2a7fca7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.71", +] + +[[package]] +name = "windows-result" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e383302e8ec8515204254685643de10811af0ed97ea37210dc26fb0032647f8" +dependencies = [ + "windows-targets 0.52.6", +] + [[package]] name = "windows-sys" version = "0.45.0" diff --git a/Cargo.toml b/Cargo.toml index 6ee030c337..2043125a0d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -161,7 +161,7 @@ itertools = "0.12.1" jsonrpsee = { version = "0.16.2", default-features = false } lazy_static = "1.4.0" log = "0.4.21" -metrics = "0.21.1" +metrics = "0.23.0" num-traits = { version = "0.2", default-features = false } once_cell = "1.0" parking_lot = "0.12.1" diff --git a/crates/metrics/Cargo.toml b/crates/metrics/Cargo.toml index 92fda92b98..3a8818c217 100644 --- a/crates/metrics/Cargo.toml +++ b/crates/metrics/Cargo.toml @@ -13,11 +13,11 @@ tokio.workspace = true tracing.workspace = true # Metrics -metrics-exporter-prometheus = "0.12.1" -metrics-process = "=1.0.14" -metrics-util = "0.15.0" metrics.workspace = true -reth-metrics-derive = { git = "https://github.com/paradigmxyz/reth.git", tag = "v0.2.0-beta.4" } +metrics-exporter-prometheus = "0.15.3" +metrics-process = "2.1.0" +metrics-util = "0.17.0" +reth-metrics-derive = { git = "https://github.com/paradigmxyz/reth.git", tag = "v1.0.3" } [target.'cfg(not(windows))'.dependencies] jemalloc-ctl = { version = "0.5.0", optional = true } diff --git a/crates/metrics/src/prometheus_exporter.rs b/crates/metrics/src/prometheus_exporter.rs index 19b8e29529..17a170f0e4 100644 --- a/crates/metrics/src/prometheus_exporter.rs +++ b/crates/metrics/src/prometheus_exporter.rs @@ -121,7 +121,7 @@ fn collect_memory_stats() { "Read jemalloc.stats.active." ) }) { - gauge!("jemalloc.active", value as f64); + gauge!("jemalloc.active").increment(value as f64); } if let Ok(value) = stats::allocated::read().map_err(|error| { @@ -131,7 +131,7 @@ fn collect_memory_stats() { "Read jemalloc.stats.allocated." ) }) { - gauge!("jemalloc.allocated", value as f64); + gauge!("jemalloc.allocated").increment(value as f64); } if let Ok(value) = stats::mapped::read().map_err(|error| { @@ -141,7 +141,7 @@ fn collect_memory_stats() { "Read jemalloc.stats.mapped." ) }) { - gauge!("jemalloc.mapped", value as f64); + gauge!("jemalloc.mapped").increment(value as f64); } if let Ok(value) = stats::metadata::read().map_err(|error| { @@ -151,7 +151,7 @@ fn collect_memory_stats() { "Read jemalloc.stats.metadata." ) }) { - gauge!("jemalloc.metadata", value as f64); + gauge!("jemalloc.metadata").increment(value as f64); } if let Ok(value) = stats::resident::read().map_err(|error| { @@ -161,7 +161,7 @@ fn collect_memory_stats() { "Read jemalloc.stats.resident." ) }) { - gauge!("jemalloc.resident", value as f64); + gauge!("jemalloc.resident").increment(value as f64); } if let Ok(value) = stats::retained::read().map_err(|error| { @@ -171,7 +171,7 @@ fn collect_memory_stats() { "Read jemalloc.stats.retained." ) }) { - gauge!("jemalloc.retained", value as f64); + gauge!("jemalloc.retained").increment(value as f64); } } From e1c9597cd06143b34e47976e861a0b208b1eb505 Mon Sep 17 00:00:00 2001 From: glihm Date: Fri, 2 Aug 2024 16:37:54 -0600 Subject: [PATCH 02/10] devcontainer: bump to 1.80 --- .devcontainer/Dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile index 471f71cf32..ef9a9a324d 100644 --- a/.devcontainer/Dockerfile +++ b/.devcontainer/Dockerfile @@ -26,7 +26,7 @@ ENV LLVM_SYS_170_PREFIX=/usr/lib/llvm-17 ENV TABLEGEN_170_PREFIX=/usr/lib/llvm-17 # To allow independent workflow of the container, the rust-toolchain is explicitely given. -RUN echo "1.79.0" > rust_toolchain_version +RUN echo "1.80.0" > rust_toolchain_version # Install cargo-binstall RUN curl -L --proto '=https' --tlsv1.2 -sSf https://raw.githubusercontent.com/cargo-bins/cargo-binstall/main/install-from-binstall-release.sh | bash @@ -37,7 +37,7 @@ RUN rustup toolchain install $(cat rust_toolchain_version) && \ rustup component add rustfmt RUN rustup toolchain install nightly && \ - rustup component add rustfmt --toolchain nightly + rustup component add rustfmt clippy --toolchain nightly RUN rustup target add x86_64-pc-windows-msvc && \ rustup target add wasm32-unknown-unknown From 9834932365efade1585176af0c017815542c9457 Mon Sep 17 00:00:00 2001 From: lambda-0x <0xlambda@protonmail.com> Date: Sun, 4 Aug 2024 09:54:05 +0530 Subject: [PATCH 03/10] fix(torii): only retrieve metadata for world (#2252) * fix: only retrieve metadata for world * update comment --- crates/torii/core/src/processors/metadata_update.rs | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/crates/torii/core/src/processors/metadata_update.rs b/crates/torii/core/src/processors/metadata_update.rs index a25d02f535..9bfea3e905 100644 --- a/crates/torii/core/src/processors/metadata_update.rs +++ b/crates/torii/core/src/processors/metadata_update.rs @@ -4,7 +4,7 @@ use anyhow::{Error, Result}; use async_trait::async_trait; use base64::engine::general_purpose; use base64::Engine as _; -use cainome::cairo_serde::{ByteArray, CairoSerde}; +use cainome::cairo_serde::{ByteArray, CairoSerde, Zeroable}; use dojo_world::contracts::world::WorldContractReader; use dojo_world::metadata::{Uri, WorldMetadata}; use reqwest::Client; @@ -68,9 +68,13 @@ where let db = db.clone(); let resource = *resource; - tokio::spawn(async move { - try_retrieve(db, resource, uri_str).await; - }); + + // Only retrieve metadata for the World contract. + if resource.is_zero() { + tokio::spawn(async move { + try_retrieve(db, resource, uri_str).await; + }); + } Ok(()) } From 8349b02986682bb07b365ec854fd0fdcd0d8d2c4 Mon Sep 17 00:00:00 2001 From: glihm Date: Mon, 5 Aug 2024 14:00:21 -0400 Subject: [PATCH 04/10] feat: add --tag to dojoup (#2265) --- dojoup/dojoup | 42 ++++++++++++++++++++++++++++++++++++------ 1 file changed, 36 insertions(+), 6 deletions(-) diff --git a/dojoup/dojoup b/dojoup/dojoup index bf9c0d999f..b122f1fec7 100755 --- a/dojoup/dojoup +++ b/dojoup/dojoup @@ -26,6 +26,7 @@ main() { -r|--repo) shift; DOJOUP_REPO=$1;; -b|--branch) shift; DOJOUP_BRANCH=$1;; + -t|--tag) shift; DOJOUP_USER_TAG=$1;; -v|--version) shift; DOJOUP_VERSION=$1;; -p|--path) shift; DOJOUP_LOCAL_REPO=$1;; -P|--pr) shift; DOJOUP_PR=$1;; @@ -41,17 +42,20 @@ main() { esac; shift done - if [ -n "$DOJOUP_BRANCH" ] || [ -n "$DOJOUP_PR" ] || [ -n "$DOJOUP_COMMIT" ] || [ -n "$DOJOUP_LOCAL_REPO" ] || [ -n "$DOJOUP_REPO" ]; then + if [ -n "$DOJOUP_BRANCH" ] || [ -n "$DOJOUP_USER_TAG" ] || [ -n "$DOJOUP_PR" ] || [ -n "$DOJOUP_COMMIT" ] || [ -n "$DOJOUP_LOCAL_REPO" ] || [ -n "$DOJOUP_REPO" ]; then if ! command -v rustc &> /dev/null; then err "Rust is required for building from source. Please install Rust from https://www.rust-lang.org/tools/install." fi fi - if [ -n "$DOJOUP_PR" ]; then - if [ -z "$DOJOUP_BRANCH" ]; then + REMOTE_OPTION=$(check_exclusive_options DOJOUP_BRANCH DOJOUP_USER_TAG DOJOUP_PR) + + if [ -n "$REMOTE_OPTION" ]; then + if [ "$REMOTE_OPTION" = "DOJOUP_PR" ]; then + say "Using $REMOTE_OPTION: $DOJOUP_PR" DOJOUP_BRANCH="refs/pull/$DOJOUP_PR/head" else - err "can't use --pr and --branch at the same time" + say "Using $REMOTE_OPTION: ${!REMOTE_OPTION}" fi fi @@ -89,7 +93,13 @@ main() { # Install by downloading binaries if [[ "$DOJOUP_REPO" == "dojoengine/dojo" && -z "$DOJOUP_BRANCH" && -z "$DOJOUP_COMMIT" ]]; then DOJOUP_VERSION=${DOJOUP_VERSION-stable} - DOJOUP_TAG=$DOJOUP_VERSION + + if [ -n "$DOJOUP_USER_TAG" ]; then + DOJOUP_TAG=$DOJOUP_USER_TAG + DOJOUP_VERSION=$DOJOUP_USER_TAG + else + DOJOUP_TAG=$DOJOUP_VERSION + fi # Normalize versions (handle channels, versions without v prefix if [[ "$DOJOUP_VERSION" == "stable" ]]; then @@ -156,7 +166,7 @@ main() { echo $BIN_ARCHIVE_URL # Display message only if version is not mentioned by user. - if [ ! -n "$DOJOUP_USER_VERSION" ]; then + if [ ! -n "$DOJOUP_USER_VERSION" ] && [ ! -n "$DOJOUP_USER_TAG" ]; then say "downloading latest dojo" fi @@ -322,6 +332,26 @@ download() { fi } +# Function to check mutual exclusivity of options. +check_exclusive_options() { + local options=("$@") + local count=0 + local set_option="" + + for option in "${options[@]}"; do + if [ -n "${!option}" ]; then + ((count++)) + set_option="$option" + fi + done + + if [ "$count" -gt 1 ]; then + err "only one of ${options[*]} can be specified" + elif [ "$count" -eq 1 ]; then + echo "$set_option" + fi +} + # Welcome message printed after having installed Dojo. welcome_msg() { dojo='\033[1;34m' From 705ebad22543e3146af416b84cf6e7d25e9842e4 Mon Sep 17 00:00:00 2001 From: glihm Date: Mon, 5 Aug 2024 14:17:32 -0400 Subject: [PATCH 05/10] feat: stabilize cairo to `2.7.0` (#2257) * bump to cairo 2.7.0 stable * chore: bump blockifier * add missing feature * fix: ensure every project is using cairo 2.7.0 * fix: fix tests and clippy * fix: fmt * devcontainer: add clippy in nightly toolchain to match rustfmt * ci: adjust devcontainter image * ci: use 2.7.0 stable * fix: update clippy version * fix: fix tests * fix: fix tests --------- Co-authored-by: Ammar Arif --- .github/workflows/ci.yml | 18 +- .tool-versions | 2 +- Cargo.lock | 194 +++-- Cargo.toml | 48 +- crates/benches/src/deployer.rs | 2 +- crates/common/src/parse.rs | 2 +- .../src/plugins/typescript_v2/mod.rs | 1 - crates/dojo-core/Scarb.toml | 6 +- crates/dojo-lang/Scarb.toml | 2 +- crates/dojo-lang/src/contract.rs | 2 +- .../compiler_cairo/Scarb.lock | 2 +- .../compiler_cairo/Scarb.toml | 2 +- .../manifests/dev/base/dojo-world.toml | 4 +- crates/dojo-lang/src/model.rs | 5 +- crates/dojo-lang/src/plugin_test_data/system | 762 +++++++++--------- crates/dojo-lang/src/print.rs | 2 + crates/dojo-world/abigen/src/main.rs | 6 +- crates/katana/cairo/Cargo.toml | 16 +- .../katana/storage/codecs/derive/Cargo.toml | 3 + .../storage/db/src/abstraction/cursor.rs | 3 +- crates/saya/core/src/lib.rs | 2 +- crates/sozo/ops/src/tests/model.rs | 4 +- crates/sozo/ops/src/utils.rs | 4 +- crates/torii/core/src/sql.rs | 2 +- crates/torii/types-test/Scarb.lock | 4 +- crates/torii/types-test/Scarb.toml | 4 +- examples/spawn-and-move/Scarb.lock | 4 +- examples/spawn-and-move/Scarb.toml | 6 +- .../dojo_examples-actions-40b6994c.toml | 4 +- .../manifests/dev/base/dojo-world.toml | 4 +- .../models/dojo_examples-Moves-2e2accba.toml | 4 +- .../manifests/dev/deployment/manifest.json | 24 +- .../manifests/dev/deployment/manifest.toml | 24 +- .../dojo_examples-actions-40b6994c.toml | 4 +- .../manifests/release/base/dojo-world.toml | 4 +- .../models/dojo_examples-Moves-2e2accba.toml | 4 +- rust-toolchain.toml | 2 +- scripts/clippy.sh | 2 +- 38 files changed, 612 insertions(+), 576 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index b8e2ea5dbd..f5e7fe51af 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -31,7 +31,7 @@ jobs: needs: ensure-docker runs-on: ubuntu-latest-32-cores container: - image: ghcr.io/dojoengine/dojo-dev:v1.0.0-alpha.4 + image: ghcr.io/dojoengine/dojo-dev:e1c9597 steps: - uses: actions/checkout@v3 - uses: Swatinem/rust-cache@v2 @@ -52,7 +52,7 @@ jobs: ensure-wasm: runs-on: ubuntu-latest container: - image: ghcr.io/dojoengine/dojo-dev:v1.0.0-alpha.4 + image: ghcr.io/dojoengine/dojo-dev:e1c9597 steps: - uses: actions/checkout@v3 - uses: Swatinem/rust-cache@v2 @@ -106,7 +106,7 @@ jobs: - uses: actions/checkout@v3 - uses: software-mansion/setup-scarb@v1 with: - scarb-version: "2.7.0-rc.3" + scarb-version: "2.7.0" - run: | scarb --manifest-path examples/spawn-and-move/Scarb.toml fmt --check scarb --manifest-path crates/dojo-core/Scarb.toml fmt --check @@ -115,7 +115,7 @@ jobs: needs: build runs-on: ubuntu-latest container: - image: ghcr.io/dojoengine/dojo-dev:v1.0.0-alpha.4 + image: ghcr.io/dojoengine/dojo-dev:e1c9597 steps: - uses: actions/download-artifact@v4 with: @@ -130,7 +130,7 @@ jobs: needs: build runs-on: ubuntu-latest container: - image: ghcr.io/dojoengine/dojo-dev:v1.0.0-alpha.4 + image: ghcr.io/dojoengine/dojo-dev:e1c9597 steps: - uses: actions/download-artifact@v4 with: @@ -144,7 +144,7 @@ jobs: dojo-world-bindings-check: runs-on: ubuntu-latest container: - image: ghcr.io/dojoengine/dojo-dev:v1.0.0-alpha.4 + image: ghcr.io/dojoengine/dojo-dev:e1c9597 steps: - uses: actions/checkout@v3 - uses: Swatinem/rust-cache@v2 @@ -153,7 +153,7 @@ jobs: clippy: runs-on: ubuntu-latest-4-cores container: - image: ghcr.io/dojoengine/dojo-dev:v1.0.0-alpha.4 + image: ghcr.io/dojoengine/dojo-dev:e1c9597 steps: - uses: actions/checkout@v3 - uses: Swatinem/rust-cache@v2 @@ -162,7 +162,7 @@ jobs: fmt: runs-on: ubuntu-latest container: - image: ghcr.io/dojoengine/dojo-dev:v1.0.0-alpha.4 + image: ghcr.io/dojoengine/dojo-dev:e1c9597 steps: - uses: actions/checkout@v3 - uses: Swatinem/rust-cache@v2 @@ -171,7 +171,7 @@ jobs: docs: runs-on: ubuntu-latest container: - image: ghcr.io/dojoengine/dojo-dev:v1.0.0-alpha.4 + image: ghcr.io/dojoengine/dojo-dev:e1c9597 steps: - uses: actions/checkout@v3 - uses: Swatinem/rust-cache@v2 diff --git a/.tool-versions b/.tool-versions index 6f986cedae..045dc3e7cc 100644 --- a/.tool-versions +++ b/.tool-versions @@ -1 +1 @@ -scarb 2.7.0-rc.3 +scarb 2.7.0 diff --git a/Cargo.lock b/Cargo.lock index af8d7465d9..c6b78eec2b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1883,7 +1883,7 @@ dependencies = [ [[package]] name = "blockifier" version = "0.8.0-dev.2" -source = "git+https://github.com/dojoengine/blockifier?branch=cairo-2.7#24029ba460e6a4304f5ca59dacd3cabd7bc34212" +source = "git+https://github.com/dojoengine/blockifier?branch=cairo-2.7#5e6e47ea47eeca12316d4a0e3394f38aa4870c71" dependencies = [ "anyhow", "ark-ec", @@ -2357,9 +2357,9 @@ dependencies = [ [[package]] name = "cairo-lang-casm" -version = "2.7.0-rc.3" +version = "2.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5abf875e93f696e783412d3f2a7c6f66e94e07c30b01559380b4d0707dc0050e" +checksum = "4a43421bf72645b3a562d264747166d6f093e960a69dfa38b67bb3209e370366" dependencies = [ "cairo-lang-utils", "indoc 2.0.5", @@ -2371,9 +2371,9 @@ dependencies = [ [[package]] name = "cairo-lang-compiler" -version = "2.7.0-rc.3" +version = "2.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f135e1768e199e88b04f824e34b9411ff49fc31970e77cbf5c6f448170441d18" +checksum = "24242af537265add372896d9ab0678c86a68d3484281fbeb6d8a9d4d5bacf7c8" dependencies = [ "anyhow", "cairo-lang-defs", @@ -2395,18 +2395,18 @@ dependencies = [ [[package]] name = "cairo-lang-debug" -version = "2.7.0-rc.3" +version = "2.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87e2bf0a6caf1e54938bc67ca082cbeb5385969784bfb1109c187ca9dc5e1806" +checksum = "2d28f38e1c62fed15a4de9f3c95741d6b24ef2a9e67a2b88a047eb6ea7de992e" dependencies = [ "cairo-lang-utils", ] [[package]] name = "cairo-lang-defs" -version = "2.7.0-rc.3" +version = "2.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c65bb0e855afeb88d11585605f836bd0cd444375b234103e87342df2c91aba1b" +checksum = "712206b7be3fb1a33e50e1c30aa8502b4a461155fd93ad26213d0d8b242cb08d" dependencies = [ "cairo-lang-debug", "cairo-lang-diagnostics", @@ -2421,9 +2421,9 @@ dependencies = [ [[package]] name = "cairo-lang-diagnostics" -version = "2.7.0-rc.3" +version = "2.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab96083f60a077d300d0b89bd4b9c31731c95f5db355a11c4657ee25f3acc198" +checksum = "9a3c8dc2bff2411fbf602d80a83b719e6e3955c1c5d767ec18b295fc92e8616a" dependencies = [ "cairo-lang-debug", "cairo-lang-filesystem", @@ -2433,9 +2433,9 @@ dependencies = [ [[package]] name = "cairo-lang-doc" -version = "2.7.0-rc.3" +version = "2.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16d3e20d492fea3ede67eb6f5fbf77a4128ea533bbfcaf84744c9f53c6906115" +checksum = "e04a82d79c36047fe17f6d299053f35eb2b17c023f516730ca8c3945f046e02a" dependencies = [ "cairo-lang-defs", "cairo-lang-formatter", @@ -2448,9 +2448,9 @@ dependencies = [ [[package]] name = "cairo-lang-eq-solver" -version = "2.7.0-rc.3" +version = "2.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3bf2aaa50fa5b15070b2bf02c60a62f917f9aa1ff6dedf5a2627ecafe8e33cfa" +checksum = "eaa8ac24c97770739f5a78d630b8515273c8b9f4aff34e1f88b988fac50340de" dependencies = [ "cairo-lang-utils", "good_lp", @@ -2458,9 +2458,9 @@ dependencies = [ [[package]] name = "cairo-lang-filesystem" -version = "2.7.0-rc.3" +version = "2.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8094bcf7e44204c2fc2f10760e7e2e5769a6267cba5d8a303c0331dd480d5663" +checksum = "4596331565fe61d10a0a6a03ace2b9d0ba93f03ee12a8450fe9252a6fee770f3" dependencies = [ "cairo-lang-debug", "cairo-lang-utils", @@ -2472,9 +2472,9 @@ dependencies = [ [[package]] name = "cairo-lang-formatter" -version = "2.7.0-rc.3" +version = "2.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a1d92f1163b3b0e22e6392d22f7a275b9e64ab453f32b8b62bb1aeedbe73e04" +checksum = "69b8eb08e511d6e6df51370cdc7d85f0de9a38c8b14a15762665c60c2df6d32d" dependencies = [ "anyhow", "cairo-lang-diagnostics", @@ -2493,9 +2493,9 @@ dependencies = [ [[package]] name = "cairo-lang-language-server" -version = "2.7.0-rc.3" +version = "2.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c464561703124297cd1983932ee72997b3e9517c387480fb69d6ed7e18c63115" +checksum = "32ce4ba948a52a088144071d2555d4383bf7f45ddfadecf99d0ef138f1718abc" dependencies = [ "anyhow", "cairo-lang-compiler", @@ -2527,9 +2527,9 @@ dependencies = [ [[package]] name = "cairo-lang-lowering" -version = "2.7.0-rc.3" +version = "2.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25eb629a773c07c2863717d1711fd3ecc17807c1fc094bb90cccac56061056a4" +checksum = "6d535dc591513875b39b799270df21db10540033fd7710917760c22fc063a4ae" dependencies = [ "cairo-lang-debug", "cairo-lang-defs", @@ -2552,8 +2552,8 @@ dependencies = [ [[package]] name = "cairo-lang-macro" -version = "0.0.1" -source = "git+https://github.com/software-mansion/scarb?tag=v2.7.0-rc.4#88bf93564b905336e6f34e0243e30ce7ce8859ec" +version = "0.1.0" +source = "git+https://github.com/software-mansion/scarb?tag=v2.7.0#e9a2b8716daf7388bfab5e4b0a2656e1b0c02d4d" dependencies = [ "cairo-lang-macro-attributes", "cairo-lang-macro-stable", @@ -2562,24 +2562,26 @@ dependencies = [ [[package]] name = "cairo-lang-macro-attributes" -version = "0.0.1" -source = "git+https://github.com/software-mansion/scarb?tag=v2.7.0-rc.4#88bf93564b905336e6f34e0243e30ce7ce8859ec" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e32e958decd95ae122ee64daa26721da2f76e83231047f947fd9cdc5d3c90cc6" dependencies = [ "quote", - "scarb-stable-hash", + "scarb-stable-hash 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "syn 2.0.71", ] [[package]] name = "cairo-lang-macro-stable" version = "1.0.0" -source = "git+https://github.com/software-mansion/scarb?tag=v2.7.0-rc.4#88bf93564b905336e6f34e0243e30ce7ce8859ec" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c49906d6b1c215e5814be7c5c65ecf2328898b335bee8c2409ec07cfb5530daf" [[package]] name = "cairo-lang-parser" -version = "2.7.0-rc.3" +version = "2.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff7b1d7af8e1bff971b8b9bbce796650a57de93dfb092bc0c17c2f85d915de6e" +checksum = "73019d5873715964f428ff10467efb607d6dc007ae164a21547bf20d9b5dcc72" dependencies = [ "cairo-lang-diagnostics", "cairo-lang-filesystem", @@ -2597,9 +2599,9 @@ dependencies = [ [[package]] name = "cairo-lang-plugins" -version = "2.7.0-rc.3" +version = "2.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7eccf06d643d155a72057dc93c40cf34dabe11e8c629dbf3111c528a3d750a66" +checksum = "96e52fca18bc696011a47a4ded0dc00e2e0ac7c81a8052eddd4ad546c46b818e" dependencies = [ "cairo-lang-defs", "cairo-lang-diagnostics", @@ -2616,9 +2618,9 @@ dependencies = [ [[package]] name = "cairo-lang-proc-macros" -version = "2.7.0-rc.3" +version = "2.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffa10434f9ce0828e8d77f3a13ae2f878da453345b14d54a66de3e196c0e4674" +checksum = "3d55dcf98a6e1a03e0b36129fad4253f9e6666a1746ab9c075d212ba68a4e9c1" dependencies = [ "cairo-lang-debug", "quote", @@ -2627,9 +2629,9 @@ dependencies = [ [[package]] name = "cairo-lang-project" -version = "2.7.0-rc.3" +version = "2.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4882d2263fb7c95dbab0c3b5578d8c0e2417fd680df8cc61aa50321b6a5a40d" +checksum = "e3ddb432e5199a65e37bab97ef6322afabd60e0e638ada31178d9c23d237219d" dependencies = [ "cairo-lang-filesystem", "cairo-lang-utils", @@ -2641,9 +2643,9 @@ dependencies = [ [[package]] name = "cairo-lang-runner" -version = "2.7.0-rc.3" +version = "2.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01ab7b0e0640adaed21b9d9b9b94b3edf7f7ab95514b1dd40c679317a33dabea" +checksum = "ef5bbbabd509ce88abc67436973d3377e099269dbd14578fa84fce884a74fa23" dependencies = [ "ark-ff 0.4.2", "ark-secp256k1", @@ -2672,9 +2674,9 @@ dependencies = [ [[package]] name = "cairo-lang-semantic" -version = "2.7.0-rc.3" +version = "2.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ba49614f98322e1ccda33265f8193f66cbd88eff23b0deb94db981aa0666650" +checksum = "393325820207491a7475269e98163e0db7e85e4b215f4d801ca537ce1cd6daa7" dependencies = [ "cairo-lang-debug", "cairo-lang-defs", @@ -2699,9 +2701,9 @@ dependencies = [ [[package]] name = "cairo-lang-sierra" -version = "2.7.0-rc.3" +version = "2.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81a41d56c6afebdbe2c5ffb4e216f60b07391c29c91fccf0a60790817f49ba68" +checksum = "918fb0611203fb8cdd1fcdb434f395a59e0ebb0db64b11a0e15bfbfb03552821" dependencies = [ "anyhow", "cairo-lang-utils", @@ -2727,9 +2729,9 @@ dependencies = [ [[package]] name = "cairo-lang-sierra-ap-change" -version = "2.7.0-rc.3" +version = "2.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "667050b93db661ebce0b33c92ce44abffebde37c5645e4761722ad3c49a1c34f" +checksum = "7fa1834ec729e89fcbd00df03f2a64a18515fcf07eb18dfef39afe020a10955d" dependencies = [ "cairo-lang-eq-solver", "cairo-lang-sierra", @@ -2743,9 +2745,9 @@ dependencies = [ [[package]] name = "cairo-lang-sierra-gas" -version = "2.7.0-rc.3" +version = "2.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27fcbf81e8ed4efe7e9c30bbdfa8074b9af01a5e16154999dd9527baba27f1fb" +checksum = "6b00927d39f910dd5ae1047cef9b46b2ee11617d33d290f875bc00dfc7e3d992" dependencies = [ "cairo-lang-eq-solver", "cairo-lang-sierra", @@ -2759,9 +2761,9 @@ dependencies = [ [[package]] name = "cairo-lang-sierra-generator" -version = "2.7.0-rc.3" +version = "2.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "058c05d10913a130fb21964f0bf1a37b05eafcf2f50a73cd4aa3e11da7e4cfc7" +checksum = "7620a6a7becf5997093a83d289a5e3b3162bc8fd031ad75df82a5bc04f8cc954" dependencies = [ "cairo-lang-debug", "cairo-lang-defs", @@ -2784,9 +2786,9 @@ dependencies = [ [[package]] name = "cairo-lang-sierra-to-casm" -version = "2.7.0-rc.3" +version = "2.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8607cc5cf16f3a930ad4b3799e986b0ca36ada2c0da1dd6bd2ef35cbb1eb9e74" +checksum = "67bd155770abf91d4290a31b0c0a1fb393ecee85eb0af40c16893b4601eff4d6" dependencies = [ "assert_matches", "cairo-lang-casm", @@ -2805,9 +2807,9 @@ dependencies = [ [[package]] name = "cairo-lang-sierra-type-size" -version = "2.7.0-rc.3" +version = "2.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "224624b1e279b3eea7693680f577335e66e6dd5fbfbd2576f4a7d0b5d697f61d" +checksum = "fbae9458999da692c272501678b6cfec358a6bcadb54921bf35d21afdcd91251" dependencies = [ "cairo-lang-sierra", "cairo-lang-utils", @@ -2815,9 +2817,9 @@ dependencies = [ [[package]] name = "cairo-lang-starknet" -version = "2.7.0-rc.3" +version = "2.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81a54ebea4ea990a33a2158ecdf46ffb3cb1af8fff6a79c3dd310c6a9ed43e82" +checksum = "f242d889180386d35935597f9d1cac07d4f3d60bd0f10558660ae4a77da701b6" dependencies = [ "anyhow", "cairo-lang-compiler", @@ -2846,9 +2848,9 @@ dependencies = [ [[package]] name = "cairo-lang-starknet-classes" -version = "2.7.0-rc.3" +version = "2.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bb66ae799e1963318e1bab782848f53797787c396dfd590be539f3f12d56ac4" +checksum = "aa17b313f46fcf7ff4de32b86c250eaf584d1e2c8e37ed16db155b221721e735" dependencies = [ "cairo-lang-casm", "cairo-lang-sierra", @@ -2870,9 +2872,9 @@ dependencies = [ [[package]] name = "cairo-lang-syntax" -version = "2.7.0-rc.3" +version = "2.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e673dc1058a8639c094a330a701e8902cbd34defe659a3d95bcf6c3f3de249d" +checksum = "0d0ca518ed7c3674d9b62470f7482f4b07553eb3a02d83e0ae61bd6b5ecb4ec8" dependencies = [ "cairo-lang-debug", "cairo-lang-filesystem", @@ -2886,9 +2888,9 @@ dependencies = [ [[package]] name = "cairo-lang-syntax-codegen" -version = "2.7.0-rc.3" +version = "2.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d0dd466dbac4263573b81b83e22534285da30a4e7c15b888407fbb33d8accb9" +checksum = "7f12bdff5c265edb5a76084bfde2bc8270a7fdaf16ac58aa0d54ea6a20c29023" dependencies = [ "genco", "xshell", @@ -2896,9 +2898,9 @@ dependencies = [ [[package]] name = "cairo-lang-test-plugin" -version = "2.7.0-rc.3" +version = "2.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e85792aa84336a5861f08f40849b52747f55abad53ba0378bfb868b2ea01821" +checksum = "20b526ea053b930222352027b3259be44fb3cd3b25106e2b1fbc815526423650" dependencies = [ "anyhow", "cairo-lang-compiler", @@ -2924,9 +2926,9 @@ dependencies = [ [[package]] name = "cairo-lang-test-runner" -version = "2.7.0-rc.3" +version = "2.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1f537b362e80c63fec19a79d081dfd3be2051da4eda5f879e45c0f5eb241c6b" +checksum = "d44caf2f6ef96ba7653037a7f419d941158f5bf35f2802986986352a02354eb6" dependencies = [ "anyhow", "cairo-lang-compiler", @@ -2947,9 +2949,9 @@ dependencies = [ [[package]] name = "cairo-lang-test-utils" -version = "2.7.0-rc.3" +version = "2.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09431da22acc1cf081b1802b73ff484bdc75ca1cd5ad6fa9b84fba8753b2e08f" +checksum = "e6a2365bd502a657437f9d0d665e32e017054d0effdbecb1dda776bfcc11235d" dependencies = [ "cairo-lang-formatter", "cairo-lang-utils", @@ -2960,9 +2962,9 @@ dependencies = [ [[package]] name = "cairo-lang-utils" -version = "2.7.0-rc.3" +version = "2.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97498c08958be8d569c16982cac431d785adc3effdfa6d0775c65aec578dfd91" +checksum = "8bd5c8c127b9362a12ffb9dede38e792c81b4ded5a98b448baec157b745f47d1" dependencies = [ "env_logger 0.11.3", "hashbrown 0.14.5", @@ -2998,9 +3000,9 @@ dependencies = [ [[package]] name = "cairo-vm" -version = "1.0.0-rc5" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e09134ea1e0be6c1fbd330f0945df0512fa70944fd0b3ecc2f74a6008f01e9da" +checksum = "94a9ff830d1c79b41b146c69ddbf60cfc3765b92fabb5d5126908bdc1b1a9232" dependencies = [ "anyhow", "bincode 2.0.0-rc.3", @@ -3747,7 +3749,7 @@ dependencies = [ [[package]] name = "create-output-dir" version = "1.0.0" -source = "git+https://github.com/software-mansion/scarb?tag=v2.7.0-rc.4#88bf93564b905336e6f34e0243e30ce7ce8859ec" +source = "git+https://github.com/software-mansion/scarb?tag=v2.7.0#e9a2b8716daf7388bfab5e4b0a2656e1b0c02d4d" dependencies = [ "anyhow", "core-foundation", @@ -4249,6 +4251,19 @@ dependencies = [ "syn 2.0.71", ] +[[package]] +name = "dialoguer" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "658bce805d770f407bc62102fca7c2c64ceef2fbcb2b8bd19d2765ce093980de" +dependencies = [ + "console", + "shell-words", + "tempfile", + "thiserror", + "zeroize", +] + [[package]] name = "diff" version = "0.1.13" @@ -8229,9 +8244,9 @@ checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c" [[package]] name = "libloading" -version = "0.8.4" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e310b3a6b5907f99202fcdb4960ff45b93735d7c7d96b760fcff8db2dc0e103d" +checksum = "4979f22fdb869068da03c9f7528f8297c6fd2606bc3a4affe42e6a823fdb8da4" dependencies = [ "cfg-if", "windows-targets 0.52.6", @@ -11956,8 +11971,8 @@ dependencies = [ [[package]] name = "scarb" -version = "2.7.0-rc.4" -source = "git+https://github.com/software-mansion/scarb?tag=v2.7.0-rc.4#88bf93564b905336e6f34e0243e30ce7ce8859ec" +version = "2.7.0" +source = "git+https://github.com/software-mansion/scarb?tag=v2.7.0#e9a2b8716daf7388bfab5e4b0a2656e1b0c02d4d" dependencies = [ "anyhow", "async-trait", @@ -11985,6 +12000,7 @@ dependencies = [ "data-encoding", "deno_task_shell", "derive_builder 0.20.0", + "dialoguer", "directories", "dunce", "fs4", @@ -12005,8 +12021,8 @@ dependencies = [ "redb", "reqwest 0.11.27", "scarb-build-metadata", - "scarb-metadata 1.12.0 (git+https://github.com/software-mansion/scarb?tag=v2.7.0-rc.4)", - "scarb-stable-hash", + "scarb-metadata 1.12.0 (git+https://github.com/software-mansion/scarb?tag=v2.7.0)", + "scarb-stable-hash 1.0.0 (git+https://github.com/software-mansion/scarb?tag=v2.7.0)", "scarb-ui", "semver 1.0.23", "serde", @@ -12035,8 +12051,8 @@ dependencies = [ [[package]] name = "scarb-build-metadata" -version = "2.7.0-rc.4" -source = "git+https://github.com/software-mansion/scarb?tag=v2.7.0-rc.4#88bf93564b905336e6f34e0243e30ce7ce8859ec" +version = "2.7.0" +source = "git+https://github.com/software-mansion/scarb?tag=v2.7.0#e9a2b8716daf7388bfab5e4b0a2656e1b0c02d4d" dependencies = [ "cargo_metadata", ] @@ -12057,7 +12073,7 @@ dependencies = [ [[package]] name = "scarb-metadata" version = "1.12.0" -source = "git+https://github.com/software-mansion/scarb?tag=v2.7.0-rc.4#88bf93564b905336e6f34e0243e30ce7ce8859ec" +source = "git+https://github.com/software-mansion/scarb?tag=v2.7.0#e9a2b8716daf7388bfab5e4b0a2656e1b0c02d4d" dependencies = [ "camino", "derive_builder 0.20.0", @@ -12070,7 +12086,17 @@ dependencies = [ [[package]] name = "scarb-stable-hash" version = "1.0.0" -source = "git+https://github.com/software-mansion/scarb?tag=v2.7.0-rc.4#88bf93564b905336e6f34e0243e30ce7ce8859ec" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1902536b23a05dd165d3992865870aaf1b0650317767cbf171ed2ca5903732a9" +dependencies = [ + "data-encoding", + "xxhash-rust", +] + +[[package]] +name = "scarb-stable-hash" +version = "1.0.0" +source = "git+https://github.com/software-mansion/scarb?tag=v2.7.0#e9a2b8716daf7388bfab5e4b0a2656e1b0c02d4d" dependencies = [ "data-encoding", "xxhash-rust", @@ -12079,14 +12105,14 @@ dependencies = [ [[package]] name = "scarb-ui" version = "0.1.5" -source = "git+https://github.com/software-mansion/scarb?tag=v2.7.0-rc.4#88bf93564b905336e6f34e0243e30ce7ce8859ec" +source = "git+https://github.com/software-mansion/scarb?tag=v2.7.0#e9a2b8716daf7388bfab5e4b0a2656e1b0c02d4d" dependencies = [ "anyhow", "camino", "clap", "console", "indicatif", - "scarb-metadata 1.12.0 (git+https://github.com/software-mansion/scarb?tag=v2.7.0-rc.4)", + "scarb-metadata 1.12.0 (git+https://github.com/software-mansion/scarb?tag=v2.7.0)", "serde", "serde_json", "tracing-core", diff --git a/Cargo.toml b/Cargo.toml index 2043125a0d..e98f4df435 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -117,28 +117,28 @@ auto_impl = "1.2.0" base64 = "0.21.2" bigdecimal = "0.4.1" bytes = "1.6" -cairo-lang-compiler = "2.7.0-rc.3" -cairo-lang-debug = "2.7.0-rc.3" -cairo-lang-defs = "2.7.0-rc.3" -cairo-lang-diagnostics = "2.7.0-rc.3" -cairo-lang-filesystem = "2.7.0-rc.3" -cairo-lang-formatter = "2.7.0-rc.3" -cairo-lang-language-server = "2.7.0-rc.3" -cairo-lang-lowering = "2.7.0-rc.3" -cairo-lang-parser = "2.7.0-rc.3" -cairo-lang-plugins = { version = "2.7.0-rc.3", features = [ "testing" ] } -cairo-lang-project = "2.7.0-rc.3" -cairo-lang-semantic = "2.7.0-rc.3" -cairo-lang-sierra = "2.7.0-rc.3" -cairo-lang-sierra-generator = "2.7.0-rc.3" -cairo-lang-sierra-to-casm = "2.7.0-rc.3" -cairo-lang-starknet = "2.7.0-rc.3" -cairo-lang-starknet-classes = "2.7.0-rc.3" -cairo-lang-syntax = "2.7.0-rc.3" -cairo-lang-test-plugin = "2.7.0-rc.3" -cairo-lang-test-runner = "2.7.0-rc.3" -cairo-lang-test-utils = "2.7.0-rc.3" -cairo-lang-utils = "2.7.0-rc.3" +cairo-lang-compiler = "2.7.0" +cairo-lang-debug = "2.7.0" +cairo-lang-defs = "2.7.0" +cairo-lang-diagnostics = "2.7.0" +cairo-lang-filesystem = "2.7.0" +cairo-lang-formatter = "2.7.0" +cairo-lang-language-server = "2.7.0" +cairo-lang-lowering = "2.7.0" +cairo-lang-parser = "2.7.0" +cairo-lang-plugins = { version = "2.7.0", features = [ "testing" ] } +cairo-lang-project = "2.7.0" +cairo-lang-semantic = "2.7.0" +cairo-lang-sierra = "2.7.0" +cairo-lang-sierra-generator = "2.7.0" +cairo-lang-sierra-to-casm = "2.7.0" +cairo-lang-starknet = "2.7.0" +cairo-lang-starknet-classes = "2.7.0" +cairo-lang-syntax = "2.7.0" +cairo-lang-test-plugin = "2.7.0" +cairo-lang-test-runner = "2.7.0" +cairo-lang-test-utils = "2.7.0" +cairo-lang-utils = "2.7.0" cairo-proof-parser = { git = "https://github.com/cartridge-gg/cairo-proof-parser", branch = "v0.3.0/new-felt" } cairo-vm = "1.0.0-rc4" camino = { version = "1.1.2", features = [ "serde1" ] } @@ -174,8 +174,8 @@ rpassword = "7.2.0" rstest = "0.18.2" rstest_reuse = "0.6.0" salsa = "0.16.1" -scarb = { git = "https://github.com/software-mansion/scarb", tag = "v2.7.0-rc.4" } -scarb-ui = { git = "https://github.com/software-mansion/scarb", tag = "v2.7.0-rc.4" } +scarb = { git = "https://github.com/software-mansion/scarb", tag = "v2.7.0" } +scarb-ui = { git = "https://github.com/software-mansion/scarb", tag = "v2.7.0" } semver = "1.0.5" serde = { version = "1.0", features = [ "derive" ] } serde_json = { version = "1.0", features = [ "arbitrary_precision" ] } diff --git a/crates/benches/src/deployer.rs b/crates/benches/src/deployer.rs index ad4db203a1..d13c4e5ad3 100644 --- a/crates/benches/src/deployer.rs +++ b/crates/benches/src/deployer.rs @@ -57,7 +57,7 @@ async fn deploy_contract(runner: &KatanaRunner, manifest_and_script: (&str, &str let out = Command::new("bash") .arg(manifest_and_script.1) - .env("RPC_URL", &runner.endpoint()) + .env("RPC_URL", runner.endpoint()) .output() .await .context("failed to start script subprocess")?; diff --git a/crates/common/src/parse.rs b/crates/common/src/parse.rs index a58d0c3d0c..5e74057d30 100644 --- a/crates/common/src/parse.rs +++ b/crates/common/src/parse.rs @@ -24,7 +24,7 @@ pub enum SocketAddressParsingError { /// The following formats are checked: /// /// - If the value can be parsed as a `u16` or starts with `:` it is considered a port, and the -/// hostname is set to `localhost`. +/// hostname is set to `localhost`. /// - If the value contains `:` it is assumed to be the format `:` /// - Otherwise it is assumed to be a hostname /// diff --git a/crates/dojo-bindgen/src/plugins/typescript_v2/mod.rs b/crates/dojo-bindgen/src/plugins/typescript_v2/mod.rs index 07d3ff6272..553fd46602 100644 --- a/crates/dojo-bindgen/src/plugins/typescript_v2/mod.rs +++ b/crates/dojo-bindgen/src/plugins/typescript_v2/mod.rs @@ -454,7 +454,6 @@ function convertQueryToToriiClause(query: Query): Clause | undefined {{ for field in &token.inners { let mapped = TypeScriptV2Plugin::map_type(&field.token); - format!("{}: {};", field.name, mapped); native_fields.push(format!("{}: {};", field.name, mapped)); } diff --git a/crates/dojo-core/Scarb.toml b/crates/dojo-core/Scarb.toml index 562a957280..168c57e743 100644 --- a/crates/dojo-core/Scarb.toml +++ b/crates/dojo-core/Scarb.toml @@ -1,15 +1,15 @@ [package] -cairo-version = "2.7.0-rc.3" +cairo-version = "2.7.0" edition = "2024_07" description = "The Dojo Core library for autonomous worlds." name = "dojo" -version = "0.7.3" +version = "1.0.0-alpha.4" [dependencies] # Rev points to support for Cairo 2.7.0-rc.3 without any tag yet. Should be # updated once a release is cut with `2.7.0-rc.3` support in it. dojo_plugin = { git = "https://github.com/dojoengine/dojo", rev = "71b1f1a4" } -starknet = "=2.7.0-rc.3" +starknet = "=2.7.0" [lib] diff --git a/crates/dojo-lang/Scarb.toml b/crates/dojo-lang/Scarb.toml index 5f93257a6a..11db8dff61 100644 --- a/crates/dojo-lang/Scarb.toml +++ b/crates/dojo-lang/Scarb.toml @@ -1,5 +1,5 @@ [package] name = "dojo_plugin" -version = "0.7.3" +version = "1.0.0-alpha.4" [cairo-plugin] diff --git a/crates/dojo-lang/src/contract.rs b/crates/dojo-lang/src/contract.rs index 03644daf56..ef33519f92 100644 --- a/crates/dojo-lang/src/contract.rs +++ b/crates/dojo-lang/src/contract.rs @@ -646,7 +646,7 @@ fn get_contract_namespace( /// /// Returns: /// * A [`ContractParameters`] object containing all the dojo::contract parameters with their -/// default values if not set in the code. +/// default values if not set in the code. fn get_parameters( db: &dyn SyntaxGroup, module_ast: &ast::ItemModule, diff --git a/crates/dojo-lang/src/manifest_test_data/compiler_cairo/Scarb.lock b/crates/dojo-lang/src/manifest_test_data/compiler_cairo/Scarb.lock index d4194cb946..aef7bfa970 100644 --- a/crates/dojo-lang/src/manifest_test_data/compiler_cairo/Scarb.lock +++ b/crates/dojo-lang/src/manifest_test_data/compiler_cairo/Scarb.lock @@ -10,7 +10,7 @@ dependencies = [ [[package]] name = "dojo" -version = "0.7.3" +version = "1.0.0-alpha.4" dependencies = [ "dojo_plugin", ] diff --git a/crates/dojo-lang/src/manifest_test_data/compiler_cairo/Scarb.toml b/crates/dojo-lang/src/manifest_test_data/compiler_cairo/Scarb.toml index 009677738f..444fc1b420 100644 --- a/crates/dojo-lang/src/manifest_test_data/compiler_cairo/Scarb.toml +++ b/crates/dojo-lang/src/manifest_test_data/compiler_cairo/Scarb.toml @@ -2,7 +2,7 @@ name = "compiler_cairo" version = "0.1.0" edition = "2024_07" -cairo-version = "2.7.0-rc.3" +cairo-version = "2.7.0" # See more keys and their definitions at https://docs.swmansion.com/scarb/docs/reference/manifest.html diff --git a/crates/dojo-lang/src/manifest_test_data/compiler_cairo/manifests/dev/base/dojo-world.toml b/crates/dojo-lang/src/manifest_test_data/compiler_cairo/manifests/dev/base/dojo-world.toml index 59d4719031..5ebf245a91 100644 --- a/crates/dojo-lang/src/manifest_test_data/compiler_cairo/manifests/dev/base/dojo-world.toml +++ b/crates/dojo-lang/src/manifest_test_data/compiler_cairo/manifests/dev/base/dojo-world.toml @@ -1,6 +1,6 @@ kind = "Class" -class_hash = "0x2178527e9556d1aa21d3c2961d28f9114fcfed81b4c3674ed591c50ce46cc9d" -original_class_hash = "0x2178527e9556d1aa21d3c2961d28f9114fcfed81b4c3674ed591c50ce46cc9d" +class_hash = "0x14287624e97e0312d4e680e19071efce983810e909b32afc54cd9c8031f4c1c" +original_class_hash = "0x14287624e97e0312d4e680e19071efce983810e909b32afc54cd9c8031f4c1c" abi = "manifests/dev/base/abis/dojo-world.json" tag = "dojo-world" manifest_name = "dojo-world" diff --git a/crates/dojo-lang/src/model.rs b/crates/dojo-lang/src/model.rs index 3de4909d5f..600f1fc87f 100644 --- a/crates/dojo-lang/src/model.rs +++ b/crates/dojo-lang/src/model.rs @@ -118,8 +118,8 @@ fn get_model_namespace( /// * diagnostics: vector of compiler diagnostics. /// /// Returns: -/// * A [`ModelParameters`] object containing all the dojo::model parameters with their -/// default values if not set in the code. +/// * A [`ModelParameters`] object containing all the dojo::model parameters with their default +/// values if not set in the code. fn get_model_parameters( db: &dyn SyntaxGroup, struct_ast: ItemStruct, @@ -198,6 +198,7 @@ fn get_model_parameters( /// Parameters: /// * db: The semantic database. /// * struct_ast: The AST of the model struct. +/// /// Returns: /// * A RewriteNode containing the generated code. pub fn handle_model_struct( diff --git a/crates/dojo-lang/src/plugin_test_data/system b/crates/dojo-lang/src/plugin_test_data/system index 94e8878240..4b42963654 100644 --- a/crates/dojo-lang/src/plugin_test_data/system +++ b/crates/dojo-lang/src/plugin_test_data/system @@ -605,38 +605,41 @@ pub struct Storage { } #[derive(Drop, Copy)] -pub struct ComponentStorageBase { +pub struct StorageStorageBase { } -#[derive(Drop, Copy)] -pub struct ComponentStorageBaseMut { -} -impl StorageBaseImpl of starknet::storage::StorageBaseTrait> { - type BaseType = ComponentStorageBase; - type BaseMutType = ComponentStorageBaseMut; - fn storage_base(self: @ComponentState) -> ComponentStorageBase { - ComponentStorageBase { +impl StorageStorageImpl of starknet::storage::StorageTrait { + type BaseType = StorageStorageBase; + fn storage(self: starknet::storage::FlattenedStorage) -> StorageStorageBase { + StorageStorageBase { } } - fn storage_base_mut(ref self: ComponentState) -> ComponentStorageBaseMut { - ComponentStorageBaseMut { +} +#[derive(Drop, Copy)] +pub struct StorageStorageBaseMut { +} +impl StorageStorageMutImpl of starknet::storage::StorageTraitMut { + type BaseType = StorageStorageBaseMut; + fn storage_mut(self: starknet::storage::FlattenedStorage>) -> StorageStorageBaseMut { + StorageStorageBaseMut { } } } + pub struct ComponentState { } impl ComponentStateDrop of Drop> {} impl ComponentStateDeref of core::ops::SnapshotDeref> { - type Target = ComponentStorageBase; - fn snapshot_deref(self: @ComponentState) -> ComponentStorageBase { - self.storage_base() + type Target = starknet::storage::FlattenedStorage; + fn snapshot_deref(self: @ComponentState) -> starknet::storage::FlattenedStorage { + starknet::storage::FlattenedStorage {} } } impl ComponentStateDerefMut of core::ops::DerefMut> { - type Target = ComponentStorageBaseMut; - fn deref_mut(ref self: ComponentState) -> ComponentStorageBaseMut { - self.storage_base_mut() + type Target = starknet::storage::FlattenedStorage> ; + fn deref_mut(ref self: ComponentState) -> starknet::storage::FlattenedStorage> { + starknet::storage::FlattenedStorage {} } } pub fn unsafe_new_component_state() -> ComponentState { @@ -673,10 +676,10 @@ impl EventIsEvent of starknet::Event { Option::None } } -impl ComponentStorageBaseDrop of core::traits::Drop::; -impl ComponentStorageBaseCopy of core::traits::Copy::; -impl ComponentStorageBaseMutDrop of core::traits::Drop::; -impl ComponentStorageBaseMutCopy of core::traits::Copy::; +impl StorageStorageBaseDrop of core::traits::Drop::; +impl StorageStorageBaseCopy of core::traits::Copy::; +impl StorageStorageBaseMutDrop of core::traits::Drop::; +impl StorageStorageBaseMutCopy of core::traits::Copy::; } #[starknet::component] @@ -691,38 +694,41 @@ pub struct Storage { } #[derive(Drop, Copy)] -pub struct ComponentStorageBase { +pub struct StorageStorageBase { } -#[derive(Drop, Copy)] -pub struct ComponentStorageBaseMut { -} -impl StorageBaseImpl of starknet::storage::StorageBaseTrait> { - type BaseType = ComponentStorageBase; - type BaseMutType = ComponentStorageBaseMut; - fn storage_base(self: @ComponentState) -> ComponentStorageBase { - ComponentStorageBase { +impl StorageStorageImpl of starknet::storage::StorageTrait { + type BaseType = StorageStorageBase; + fn storage(self: starknet::storage::FlattenedStorage) -> StorageStorageBase { + StorageStorageBase { } } - fn storage_base_mut(ref self: ComponentState) -> ComponentStorageBaseMut { - ComponentStorageBaseMut { +} +#[derive(Drop, Copy)] +pub struct StorageStorageBaseMut { +} +impl StorageStorageMutImpl of starknet::storage::StorageTraitMut { + type BaseType = StorageStorageBaseMut; + fn storage_mut(self: starknet::storage::FlattenedStorage>) -> StorageStorageBaseMut { + StorageStorageBaseMut { } } } + pub struct ComponentState { } impl ComponentStateDrop of Drop> {} impl ComponentStateDeref of core::ops::SnapshotDeref> { - type Target = ComponentStorageBase; - fn snapshot_deref(self: @ComponentState) -> ComponentStorageBase { - self.storage_base() + type Target = starknet::storage::FlattenedStorage; + fn snapshot_deref(self: @ComponentState) -> starknet::storage::FlattenedStorage { + starknet::storage::FlattenedStorage {} } } impl ComponentStateDerefMut of core::ops::DerefMut> { - type Target = ComponentStorageBaseMut; - fn deref_mut(ref self: ComponentState) -> ComponentStorageBaseMut { - self.storage_base_mut() + type Target = starknet::storage::FlattenedStorage> ; + fn deref_mut(ref self: ComponentState) -> starknet::storage::FlattenedStorage> { + starknet::storage::FlattenedStorage {} } } pub fn unsafe_new_component_state() -> ComponentState { @@ -759,10 +765,10 @@ impl EventIsEvent of starknet::Event { Option::None } } -impl ComponentStorageBaseDrop of core::traits::Drop::; -impl ComponentStorageBaseCopy of core::traits::Copy::; -impl ComponentStorageBaseMutDrop of core::traits::Drop::; -impl ComponentStorageBaseMutCopy of core::traits::Copy::; +impl StorageStorageBaseDrop of core::traits::Drop::; +impl StorageStorageBaseCopy of core::traits::Copy::; +impl StorageStorageBaseMutDrop of core::traits::Drop::; +impl StorageStorageBaseMutCopy of core::traits::Copy::; } #[dojo::contract] @@ -1788,17 +1794,17 @@ impl StoreIEmptyTraitDispatcher of starknet::Store:: { } #[derive(Drop, Copy)] -struct IEmptyTraitDispatcherSubPointers { - contract_address: starknet::storage::StoragePointer, +pub struct IEmptyTraitDispatcherSubPointers { + pub contract_address: starknet::storage::StoragePointer, } impl IEmptyTraitDispatcherSubPointersImpl of starknet::storage::SubPointers { -type SubPointersType = IEmptyTraitDispatcherSubPointers; - fn sub_pointers(self: starknet::storage::StoragePointer) -> IEmptyTraitDispatcherSubPointers { - let base_address = self.address; - let mut current_offset = self.offset; + type SubPointersType = IEmptyTraitDispatcherSubPointers; + fn sub_pointers(self: starknet::storage::StoragePointer) -> IEmptyTraitDispatcherSubPointers { + let base_address = self.__storage_pointer_address__; + let mut current_offset = self.__storage_pointer_offset__; let contract_address_value = starknet::storage::StoragePointer { - address: base_address, - offset: current_offset, + __storage_pointer_address__: base_address, + __storage_pointer_offset__: current_offset, }; IEmptyTraitDispatcherSubPointers { contract_address: contract_address_value, @@ -1806,19 +1812,19 @@ type SubPointersType = IEmptyTraitDispatcherSubPointers; } } #[derive(Drop, Copy)] -struct MutableIEmptyTraitDispatcherSubPointers { - contract_address: starknet::storage::StoragePointer>, -} -impl MutableIEmptyTraitDispatcherSubPointersImpl of starknet::storage::MutableSubPointers { -type SubPointersType = MutableIEmptyTraitDispatcherSubPointers; - fn sub_pointers_mut(self: starknet::storage::StoragePointer>) -> MutableIEmptyTraitDispatcherSubPointers { - let base_address = self.address; - let mut current_offset = self.offset; +pub struct IEmptyTraitDispatcherSubPointersMut { + pub contract_address: starknet::storage::StoragePointer>, +} +impl IEmptyTraitDispatcherSubPointersMutImpl of starknet::storage::SubPointersMut { + type SubPointersType = IEmptyTraitDispatcherSubPointersMut; + fn sub_pointers_mut(self: starknet::storage::StoragePointer>) -> IEmptyTraitDispatcherSubPointersMut { + let base_address = self.__storage_pointer_address__; + let mut current_offset = self.__storage_pointer_offset__; let contract_address_value = starknet::storage::StoragePointer { - address: base_address, - offset: current_offset, + __storage_pointer_address__: base_address, + __storage_pointer_offset__: current_offset, }; - MutableIEmptyTraitDispatcherSubPointers { + IEmptyTraitDispatcherSubPointersMut { contract_address: contract_address_value, } } @@ -1868,17 +1874,17 @@ impl StoreIEmptyTraitLibraryDispatcher of starknet::Store::, +pub struct IEmptyTraitLibraryDispatcherSubPointers { + pub class_hash: starknet::storage::StoragePointer, } impl IEmptyTraitLibraryDispatcherSubPointersImpl of starknet::storage::SubPointers { -type SubPointersType = IEmptyTraitLibraryDispatcherSubPointers; - fn sub_pointers(self: starknet::storage::StoragePointer) -> IEmptyTraitLibraryDispatcherSubPointers { - let base_address = self.address; - let mut current_offset = self.offset; + type SubPointersType = IEmptyTraitLibraryDispatcherSubPointers; + fn sub_pointers(self: starknet::storage::StoragePointer) -> IEmptyTraitLibraryDispatcherSubPointers { + let base_address = self.__storage_pointer_address__; + let mut current_offset = self.__storage_pointer_offset__; let class_hash_value = starknet::storage::StoragePointer { - address: base_address, - offset: current_offset, + __storage_pointer_address__: base_address, + __storage_pointer_offset__: current_offset, }; IEmptyTraitLibraryDispatcherSubPointers { class_hash: class_hash_value, @@ -1886,19 +1892,19 @@ type SubPointersType = IEmptyTraitLibraryDispatcherSubPointers; } } #[derive(Drop, Copy)] -struct MutableIEmptyTraitLibraryDispatcherSubPointers { - class_hash: starknet::storage::StoragePointer>, -} -impl MutableIEmptyTraitLibraryDispatcherSubPointersImpl of starknet::storage::MutableSubPointers { -type SubPointersType = MutableIEmptyTraitLibraryDispatcherSubPointers; - fn sub_pointers_mut(self: starknet::storage::StoragePointer>) -> MutableIEmptyTraitLibraryDispatcherSubPointers { - let base_address = self.address; - let mut current_offset = self.offset; +pub struct IEmptyTraitLibraryDispatcherSubPointersMut { + pub class_hash: starknet::storage::StoragePointer>, +} +impl IEmptyTraitLibraryDispatcherSubPointersMutImpl of starknet::storage::SubPointersMut { + type SubPointersType = IEmptyTraitLibraryDispatcherSubPointersMut; + fn sub_pointers_mut(self: starknet::storage::StoragePointer>) -> IEmptyTraitLibraryDispatcherSubPointersMut { + let base_address = self.__storage_pointer_address__; + let mut current_offset = self.__storage_pointer_offset__; let class_hash_value = starknet::storage::StoragePointer { - address: base_address, - offset: current_offset, + __storage_pointer_address__: base_address, + __storage_pointer_offset__: current_offset, }; - MutableIEmptyTraitLibraryDispatcherSubPointers { + IEmptyTraitLibraryDispatcherSubPointersMut { class_hash: class_hash_value, } } @@ -1948,17 +1954,17 @@ impl StoreIEmptyTraitSafeLibraryDispatcher of starknet::Store::, +pub struct IEmptyTraitSafeLibraryDispatcherSubPointers { + pub class_hash: starknet::storage::StoragePointer, } impl IEmptyTraitSafeLibraryDispatcherSubPointersImpl of starknet::storage::SubPointers { -type SubPointersType = IEmptyTraitSafeLibraryDispatcherSubPointers; - fn sub_pointers(self: starknet::storage::StoragePointer) -> IEmptyTraitSafeLibraryDispatcherSubPointers { - let base_address = self.address; - let mut current_offset = self.offset; + type SubPointersType = IEmptyTraitSafeLibraryDispatcherSubPointers; + fn sub_pointers(self: starknet::storage::StoragePointer) -> IEmptyTraitSafeLibraryDispatcherSubPointers { + let base_address = self.__storage_pointer_address__; + let mut current_offset = self.__storage_pointer_offset__; let class_hash_value = starknet::storage::StoragePointer { - address: base_address, - offset: current_offset, + __storage_pointer_address__: base_address, + __storage_pointer_offset__: current_offset, }; IEmptyTraitSafeLibraryDispatcherSubPointers { class_hash: class_hash_value, @@ -1966,19 +1972,19 @@ type SubPointersType = IEmptyTraitSafeLibraryDispatcherSubPointers; } } #[derive(Drop, Copy)] -struct MutableIEmptyTraitSafeLibraryDispatcherSubPointers { - class_hash: starknet::storage::StoragePointer>, -} -impl MutableIEmptyTraitSafeLibraryDispatcherSubPointersImpl of starknet::storage::MutableSubPointers { -type SubPointersType = MutableIEmptyTraitSafeLibraryDispatcherSubPointers; - fn sub_pointers_mut(self: starknet::storage::StoragePointer>) -> MutableIEmptyTraitSafeLibraryDispatcherSubPointers { - let base_address = self.address; - let mut current_offset = self.offset; +pub struct IEmptyTraitSafeLibraryDispatcherSubPointersMut { + pub class_hash: starknet::storage::StoragePointer>, +} +impl IEmptyTraitSafeLibraryDispatcherSubPointersMutImpl of starknet::storage::SubPointersMut { + type SubPointersType = IEmptyTraitSafeLibraryDispatcherSubPointersMut; + fn sub_pointers_mut(self: starknet::storage::StoragePointer>) -> IEmptyTraitSafeLibraryDispatcherSubPointersMut { + let base_address = self.__storage_pointer_address__; + let mut current_offset = self.__storage_pointer_offset__; let class_hash_value = starknet::storage::StoragePointer { - address: base_address, - offset: current_offset, + __storage_pointer_address__: base_address, + __storage_pointer_offset__: current_offset, }; - MutableIEmptyTraitSafeLibraryDispatcherSubPointers { + IEmptyTraitSafeLibraryDispatcherSubPointersMut { class_hash: class_hash_value, } } @@ -2028,17 +2034,17 @@ impl StoreIEmptyTraitSafeDispatcher of starknet::Store::, +pub struct IEmptyTraitSafeDispatcherSubPointers { + pub contract_address: starknet::storage::StoragePointer, } impl IEmptyTraitSafeDispatcherSubPointersImpl of starknet::storage::SubPointers { -type SubPointersType = IEmptyTraitSafeDispatcherSubPointers; - fn sub_pointers(self: starknet::storage::StoragePointer) -> IEmptyTraitSafeDispatcherSubPointers { - let base_address = self.address; - let mut current_offset = self.offset; + type SubPointersType = IEmptyTraitSafeDispatcherSubPointers; + fn sub_pointers(self: starknet::storage::StoragePointer) -> IEmptyTraitSafeDispatcherSubPointers { + let base_address = self.__storage_pointer_address__; + let mut current_offset = self.__storage_pointer_offset__; let contract_address_value = starknet::storage::StoragePointer { - address: base_address, - offset: current_offset, + __storage_pointer_address__: base_address, + __storage_pointer_offset__: current_offset, }; IEmptyTraitSafeDispatcherSubPointers { contract_address: contract_address_value, @@ -2046,19 +2052,19 @@ type SubPointersType = IEmptyTraitSafeDispatcherSubPointers; } } #[derive(Drop, Copy)] -struct MutableIEmptyTraitSafeDispatcherSubPointers { - contract_address: starknet::storage::StoragePointer>, -} -impl MutableIEmptyTraitSafeDispatcherSubPointersImpl of starknet::storage::MutableSubPointers { -type SubPointersType = MutableIEmptyTraitSafeDispatcherSubPointers; - fn sub_pointers_mut(self: starknet::storage::StoragePointer>) -> MutableIEmptyTraitSafeDispatcherSubPointers { - let base_address = self.address; - let mut current_offset = self.offset; +pub struct IEmptyTraitSafeDispatcherSubPointersMut { + pub contract_address: starknet::storage::StoragePointer>, +} +impl IEmptyTraitSafeDispatcherSubPointersMutImpl of starknet::storage::SubPointersMut { + type SubPointersType = IEmptyTraitSafeDispatcherSubPointersMut; + fn sub_pointers_mut(self: starknet::storage::StoragePointer>) -> IEmptyTraitSafeDispatcherSubPointersMut { + let base_address = self.__storage_pointer_address__; + let mut current_offset = self.__storage_pointer_offset__; let contract_address_value = starknet::storage::StoragePointer { - address: base_address, - offset: current_offset, + __storage_pointer_address__: base_address, + __storage_pointer_offset__: current_offset, }; - MutableIEmptyTraitSafeDispatcherSubPointers { + IEmptyTraitSafeDispatcherSubPointersMut { contract_address: contract_address_value, } } @@ -2108,17 +2114,17 @@ impl StoreIFaultyTraitDispatcher of starknet::Store:: { } #[derive(Drop, Copy)] -struct IFaultyTraitDispatcherSubPointers { - contract_address: starknet::storage::StoragePointer, +pub struct IFaultyTraitDispatcherSubPointers { + pub contract_address: starknet::storage::StoragePointer, } impl IFaultyTraitDispatcherSubPointersImpl of starknet::storage::SubPointers { -type SubPointersType = IFaultyTraitDispatcherSubPointers; - fn sub_pointers(self: starknet::storage::StoragePointer) -> IFaultyTraitDispatcherSubPointers { - let base_address = self.address; - let mut current_offset = self.offset; + type SubPointersType = IFaultyTraitDispatcherSubPointers; + fn sub_pointers(self: starknet::storage::StoragePointer) -> IFaultyTraitDispatcherSubPointers { + let base_address = self.__storage_pointer_address__; + let mut current_offset = self.__storage_pointer_offset__; let contract_address_value = starknet::storage::StoragePointer { - address: base_address, - offset: current_offset, + __storage_pointer_address__: base_address, + __storage_pointer_offset__: current_offset, }; IFaultyTraitDispatcherSubPointers { contract_address: contract_address_value, @@ -2126,19 +2132,19 @@ type SubPointersType = IFaultyTraitDispatcherSubPointers; } } #[derive(Drop, Copy)] -struct MutableIFaultyTraitDispatcherSubPointers { - contract_address: starknet::storage::StoragePointer>, -} -impl MutableIFaultyTraitDispatcherSubPointersImpl of starknet::storage::MutableSubPointers { -type SubPointersType = MutableIFaultyTraitDispatcherSubPointers; - fn sub_pointers_mut(self: starknet::storage::StoragePointer>) -> MutableIFaultyTraitDispatcherSubPointers { - let base_address = self.address; - let mut current_offset = self.offset; +pub struct IFaultyTraitDispatcherSubPointersMut { + pub contract_address: starknet::storage::StoragePointer>, +} +impl IFaultyTraitDispatcherSubPointersMutImpl of starknet::storage::SubPointersMut { + type SubPointersType = IFaultyTraitDispatcherSubPointersMut; + fn sub_pointers_mut(self: starknet::storage::StoragePointer>) -> IFaultyTraitDispatcherSubPointersMut { + let base_address = self.__storage_pointer_address__; + let mut current_offset = self.__storage_pointer_offset__; let contract_address_value = starknet::storage::StoragePointer { - address: base_address, - offset: current_offset, + __storage_pointer_address__: base_address, + __storage_pointer_offset__: current_offset, }; - MutableIFaultyTraitDispatcherSubPointers { + IFaultyTraitDispatcherSubPointersMut { contract_address: contract_address_value, } } @@ -2188,17 +2194,17 @@ impl StoreIFaultyTraitLibraryDispatcher of starknet::Store::, +pub struct IFaultyTraitLibraryDispatcherSubPointers { + pub class_hash: starknet::storage::StoragePointer, } impl IFaultyTraitLibraryDispatcherSubPointersImpl of starknet::storage::SubPointers { -type SubPointersType = IFaultyTraitLibraryDispatcherSubPointers; - fn sub_pointers(self: starknet::storage::StoragePointer) -> IFaultyTraitLibraryDispatcherSubPointers { - let base_address = self.address; - let mut current_offset = self.offset; + type SubPointersType = IFaultyTraitLibraryDispatcherSubPointers; + fn sub_pointers(self: starknet::storage::StoragePointer) -> IFaultyTraitLibraryDispatcherSubPointers { + let base_address = self.__storage_pointer_address__; + let mut current_offset = self.__storage_pointer_offset__; let class_hash_value = starknet::storage::StoragePointer { - address: base_address, - offset: current_offset, + __storage_pointer_address__: base_address, + __storage_pointer_offset__: current_offset, }; IFaultyTraitLibraryDispatcherSubPointers { class_hash: class_hash_value, @@ -2206,19 +2212,19 @@ type SubPointersType = IFaultyTraitLibraryDispatcherSubPointers; } } #[derive(Drop, Copy)] -struct MutableIFaultyTraitLibraryDispatcherSubPointers { - class_hash: starknet::storage::StoragePointer>, -} -impl MutableIFaultyTraitLibraryDispatcherSubPointersImpl of starknet::storage::MutableSubPointers { -type SubPointersType = MutableIFaultyTraitLibraryDispatcherSubPointers; - fn sub_pointers_mut(self: starknet::storage::StoragePointer>) -> MutableIFaultyTraitLibraryDispatcherSubPointers { - let base_address = self.address; - let mut current_offset = self.offset; +pub struct IFaultyTraitLibraryDispatcherSubPointersMut { + pub class_hash: starknet::storage::StoragePointer>, +} +impl IFaultyTraitLibraryDispatcherSubPointersMutImpl of starknet::storage::SubPointersMut { + type SubPointersType = IFaultyTraitLibraryDispatcherSubPointersMut; + fn sub_pointers_mut(self: starknet::storage::StoragePointer>) -> IFaultyTraitLibraryDispatcherSubPointersMut { + let base_address = self.__storage_pointer_address__; + let mut current_offset = self.__storage_pointer_offset__; let class_hash_value = starknet::storage::StoragePointer { - address: base_address, - offset: current_offset, + __storage_pointer_address__: base_address, + __storage_pointer_offset__: current_offset, }; - MutableIFaultyTraitLibraryDispatcherSubPointers { + IFaultyTraitLibraryDispatcherSubPointersMut { class_hash: class_hash_value, } } @@ -2268,17 +2274,17 @@ impl StoreIFaultyTraitSafeLibraryDispatcher of starknet::Store::, +pub struct IFaultyTraitSafeLibraryDispatcherSubPointers { + pub class_hash: starknet::storage::StoragePointer, } impl IFaultyTraitSafeLibraryDispatcherSubPointersImpl of starknet::storage::SubPointers { -type SubPointersType = IFaultyTraitSafeLibraryDispatcherSubPointers; - fn sub_pointers(self: starknet::storage::StoragePointer) -> IFaultyTraitSafeLibraryDispatcherSubPointers { - let base_address = self.address; - let mut current_offset = self.offset; + type SubPointersType = IFaultyTraitSafeLibraryDispatcherSubPointers; + fn sub_pointers(self: starknet::storage::StoragePointer) -> IFaultyTraitSafeLibraryDispatcherSubPointers { + let base_address = self.__storage_pointer_address__; + let mut current_offset = self.__storage_pointer_offset__; let class_hash_value = starknet::storage::StoragePointer { - address: base_address, - offset: current_offset, + __storage_pointer_address__: base_address, + __storage_pointer_offset__: current_offset, }; IFaultyTraitSafeLibraryDispatcherSubPointers { class_hash: class_hash_value, @@ -2286,19 +2292,19 @@ type SubPointersType = IFaultyTraitSafeLibraryDispatcherSubPointers; } } #[derive(Drop, Copy)] -struct MutableIFaultyTraitSafeLibraryDispatcherSubPointers { - class_hash: starknet::storage::StoragePointer>, -} -impl MutableIFaultyTraitSafeLibraryDispatcherSubPointersImpl of starknet::storage::MutableSubPointers { -type SubPointersType = MutableIFaultyTraitSafeLibraryDispatcherSubPointers; - fn sub_pointers_mut(self: starknet::storage::StoragePointer>) -> MutableIFaultyTraitSafeLibraryDispatcherSubPointers { - let base_address = self.address; - let mut current_offset = self.offset; +pub struct IFaultyTraitSafeLibraryDispatcherSubPointersMut { + pub class_hash: starknet::storage::StoragePointer>, +} +impl IFaultyTraitSafeLibraryDispatcherSubPointersMutImpl of starknet::storage::SubPointersMut { + type SubPointersType = IFaultyTraitSafeLibraryDispatcherSubPointersMut; + fn sub_pointers_mut(self: starknet::storage::StoragePointer>) -> IFaultyTraitSafeLibraryDispatcherSubPointersMut { + let base_address = self.__storage_pointer_address__; + let mut current_offset = self.__storage_pointer_offset__; let class_hash_value = starknet::storage::StoragePointer { - address: base_address, - offset: current_offset, + __storage_pointer_address__: base_address, + __storage_pointer_offset__: current_offset, }; - MutableIFaultyTraitSafeLibraryDispatcherSubPointers { + IFaultyTraitSafeLibraryDispatcherSubPointersMut { class_hash: class_hash_value, } } @@ -2348,17 +2354,17 @@ impl StoreIFaultyTraitSafeDispatcher of starknet::Store::, +pub struct IFaultyTraitSafeDispatcherSubPointers { + pub contract_address: starknet::storage::StoragePointer, } impl IFaultyTraitSafeDispatcherSubPointersImpl of starknet::storage::SubPointers { -type SubPointersType = IFaultyTraitSafeDispatcherSubPointers; - fn sub_pointers(self: starknet::storage::StoragePointer) -> IFaultyTraitSafeDispatcherSubPointers { - let base_address = self.address; - let mut current_offset = self.offset; + type SubPointersType = IFaultyTraitSafeDispatcherSubPointers; + fn sub_pointers(self: starknet::storage::StoragePointer) -> IFaultyTraitSafeDispatcherSubPointers { + let base_address = self.__storage_pointer_address__; + let mut current_offset = self.__storage_pointer_offset__; let contract_address_value = starknet::storage::StoragePointer { - address: base_address, - offset: current_offset, + __storage_pointer_address__: base_address, + __storage_pointer_offset__: current_offset, }; IFaultyTraitSafeDispatcherSubPointers { contract_address: contract_address_value, @@ -2366,19 +2372,19 @@ type SubPointersType = IFaultyTraitSafeDispatcherSubPointers; } } #[derive(Drop, Copy)] -struct MutableIFaultyTraitSafeDispatcherSubPointers { - contract_address: starknet::storage::StoragePointer>, -} -impl MutableIFaultyTraitSafeDispatcherSubPointersImpl of starknet::storage::MutableSubPointers { -type SubPointersType = MutableIFaultyTraitSafeDispatcherSubPointers; - fn sub_pointers_mut(self: starknet::storage::StoragePointer>) -> MutableIFaultyTraitSafeDispatcherSubPointers { - let base_address = self.address; - let mut current_offset = self.offset; +pub struct IFaultyTraitSafeDispatcherSubPointersMut { + pub contract_address: starknet::storage::StoragePointer>, +} +impl IFaultyTraitSafeDispatcherSubPointersMutImpl of starknet::storage::SubPointersMut { + type SubPointersType = IFaultyTraitSafeDispatcherSubPointersMut; + fn sub_pointers_mut(self: starknet::storage::StoragePointer>) -> IFaultyTraitSafeDispatcherSubPointersMut { + let base_address = self.__storage_pointer_address__; + let mut current_offset = self.__storage_pointer_offset__; let contract_address_value = starknet::storage::StoragePointer { - address: base_address, - offset: current_offset, + __storage_pointer_address__: base_address, + __storage_pointer_offset__: current_offset, }; - MutableIFaultyTraitSafeDispatcherSubPointers { + IFaultyTraitSafeDispatcherSubPointersMut { contract_address: contract_address_value, } } @@ -2428,17 +2434,17 @@ impl StoreINominalTraitDispatcher of starknet::Store:: } #[derive(Drop, Copy)] -struct INominalTraitDispatcherSubPointers { - contract_address: starknet::storage::StoragePointer, +pub struct INominalTraitDispatcherSubPointers { + pub contract_address: starknet::storage::StoragePointer, } impl INominalTraitDispatcherSubPointersImpl of starknet::storage::SubPointers { -type SubPointersType = INominalTraitDispatcherSubPointers; - fn sub_pointers(self: starknet::storage::StoragePointer) -> INominalTraitDispatcherSubPointers { - let base_address = self.address; - let mut current_offset = self.offset; + type SubPointersType = INominalTraitDispatcherSubPointers; + fn sub_pointers(self: starknet::storage::StoragePointer) -> INominalTraitDispatcherSubPointers { + let base_address = self.__storage_pointer_address__; + let mut current_offset = self.__storage_pointer_offset__; let contract_address_value = starknet::storage::StoragePointer { - address: base_address, - offset: current_offset, + __storage_pointer_address__: base_address, + __storage_pointer_offset__: current_offset, }; INominalTraitDispatcherSubPointers { contract_address: contract_address_value, @@ -2446,19 +2452,19 @@ type SubPointersType = INominalTraitDispatcherSubPointers; } } #[derive(Drop, Copy)] -struct MutableINominalTraitDispatcherSubPointers { - contract_address: starknet::storage::StoragePointer>, -} -impl MutableINominalTraitDispatcherSubPointersImpl of starknet::storage::MutableSubPointers { -type SubPointersType = MutableINominalTraitDispatcherSubPointers; - fn sub_pointers_mut(self: starknet::storage::StoragePointer>) -> MutableINominalTraitDispatcherSubPointers { - let base_address = self.address; - let mut current_offset = self.offset; +pub struct INominalTraitDispatcherSubPointersMut { + pub contract_address: starknet::storage::StoragePointer>, +} +impl INominalTraitDispatcherSubPointersMutImpl of starknet::storage::SubPointersMut { + type SubPointersType = INominalTraitDispatcherSubPointersMut; + fn sub_pointers_mut(self: starknet::storage::StoragePointer>) -> INominalTraitDispatcherSubPointersMut { + let base_address = self.__storage_pointer_address__; + let mut current_offset = self.__storage_pointer_offset__; let contract_address_value = starknet::storage::StoragePointer { - address: base_address, - offset: current_offset, + __storage_pointer_address__: base_address, + __storage_pointer_offset__: current_offset, }; - MutableINominalTraitDispatcherSubPointers { + INominalTraitDispatcherSubPointersMut { contract_address: contract_address_value, } } @@ -2508,17 +2514,17 @@ impl StoreINominalTraitLibraryDispatcher of starknet::Store::, +pub struct INominalTraitLibraryDispatcherSubPointers { + pub class_hash: starknet::storage::StoragePointer, } impl INominalTraitLibraryDispatcherSubPointersImpl of starknet::storage::SubPointers { -type SubPointersType = INominalTraitLibraryDispatcherSubPointers; - fn sub_pointers(self: starknet::storage::StoragePointer) -> INominalTraitLibraryDispatcherSubPointers { - let base_address = self.address; - let mut current_offset = self.offset; + type SubPointersType = INominalTraitLibraryDispatcherSubPointers; + fn sub_pointers(self: starknet::storage::StoragePointer) -> INominalTraitLibraryDispatcherSubPointers { + let base_address = self.__storage_pointer_address__; + let mut current_offset = self.__storage_pointer_offset__; let class_hash_value = starknet::storage::StoragePointer { - address: base_address, - offset: current_offset, + __storage_pointer_address__: base_address, + __storage_pointer_offset__: current_offset, }; INominalTraitLibraryDispatcherSubPointers { class_hash: class_hash_value, @@ -2526,19 +2532,19 @@ type SubPointersType = INominalTraitLibraryDispatcherSubPointers; } } #[derive(Drop, Copy)] -struct MutableINominalTraitLibraryDispatcherSubPointers { - class_hash: starknet::storage::StoragePointer>, -} -impl MutableINominalTraitLibraryDispatcherSubPointersImpl of starknet::storage::MutableSubPointers { -type SubPointersType = MutableINominalTraitLibraryDispatcherSubPointers; - fn sub_pointers_mut(self: starknet::storage::StoragePointer>) -> MutableINominalTraitLibraryDispatcherSubPointers { - let base_address = self.address; - let mut current_offset = self.offset; +pub struct INominalTraitLibraryDispatcherSubPointersMut { + pub class_hash: starknet::storage::StoragePointer>, +} +impl INominalTraitLibraryDispatcherSubPointersMutImpl of starknet::storage::SubPointersMut { + type SubPointersType = INominalTraitLibraryDispatcherSubPointersMut; + fn sub_pointers_mut(self: starknet::storage::StoragePointer>) -> INominalTraitLibraryDispatcherSubPointersMut { + let base_address = self.__storage_pointer_address__; + let mut current_offset = self.__storage_pointer_offset__; let class_hash_value = starknet::storage::StoragePointer { - address: base_address, - offset: current_offset, + __storage_pointer_address__: base_address, + __storage_pointer_offset__: current_offset, }; - MutableINominalTraitLibraryDispatcherSubPointers { + INominalTraitLibraryDispatcherSubPointersMut { class_hash: class_hash_value, } } @@ -2588,17 +2594,17 @@ impl StoreINominalTraitSafeLibraryDispatcher of starknet::Store::, +pub struct INominalTraitSafeLibraryDispatcherSubPointers { + pub class_hash: starknet::storage::StoragePointer, } impl INominalTraitSafeLibraryDispatcherSubPointersImpl of starknet::storage::SubPointers { -type SubPointersType = INominalTraitSafeLibraryDispatcherSubPointers; - fn sub_pointers(self: starknet::storage::StoragePointer) -> INominalTraitSafeLibraryDispatcherSubPointers { - let base_address = self.address; - let mut current_offset = self.offset; + type SubPointersType = INominalTraitSafeLibraryDispatcherSubPointers; + fn sub_pointers(self: starknet::storage::StoragePointer) -> INominalTraitSafeLibraryDispatcherSubPointers { + let base_address = self.__storage_pointer_address__; + let mut current_offset = self.__storage_pointer_offset__; let class_hash_value = starknet::storage::StoragePointer { - address: base_address, - offset: current_offset, + __storage_pointer_address__: base_address, + __storage_pointer_offset__: current_offset, }; INominalTraitSafeLibraryDispatcherSubPointers { class_hash: class_hash_value, @@ -2606,19 +2612,19 @@ type SubPointersType = INominalTraitSafeLibraryDispatcherSubPointers; } } #[derive(Drop, Copy)] -struct MutableINominalTraitSafeLibraryDispatcherSubPointers { - class_hash: starknet::storage::StoragePointer>, -} -impl MutableINominalTraitSafeLibraryDispatcherSubPointersImpl of starknet::storage::MutableSubPointers { -type SubPointersType = MutableINominalTraitSafeLibraryDispatcherSubPointers; - fn sub_pointers_mut(self: starknet::storage::StoragePointer>) -> MutableINominalTraitSafeLibraryDispatcherSubPointers { - let base_address = self.address; - let mut current_offset = self.offset; +pub struct INominalTraitSafeLibraryDispatcherSubPointersMut { + pub class_hash: starknet::storage::StoragePointer>, +} +impl INominalTraitSafeLibraryDispatcherSubPointersMutImpl of starknet::storage::SubPointersMut { + type SubPointersType = INominalTraitSafeLibraryDispatcherSubPointersMut; + fn sub_pointers_mut(self: starknet::storage::StoragePointer>) -> INominalTraitSafeLibraryDispatcherSubPointersMut { + let base_address = self.__storage_pointer_address__; + let mut current_offset = self.__storage_pointer_offset__; let class_hash_value = starknet::storage::StoragePointer { - address: base_address, - offset: current_offset, + __storage_pointer_address__: base_address, + __storage_pointer_offset__: current_offset, }; - MutableINominalTraitSafeLibraryDispatcherSubPointers { + INominalTraitSafeLibraryDispatcherSubPointersMut { class_hash: class_hash_value, } } @@ -2668,17 +2674,17 @@ impl StoreINominalTraitSafeDispatcher of starknet::Store::, +pub struct INominalTraitSafeDispatcherSubPointers { + pub contract_address: starknet::storage::StoragePointer, } impl INominalTraitSafeDispatcherSubPointersImpl of starknet::storage::SubPointers { -type SubPointersType = INominalTraitSafeDispatcherSubPointers; - fn sub_pointers(self: starknet::storage::StoragePointer) -> INominalTraitSafeDispatcherSubPointers { - let base_address = self.address; - let mut current_offset = self.offset; + type SubPointersType = INominalTraitSafeDispatcherSubPointers; + fn sub_pointers(self: starknet::storage::StoragePointer) -> INominalTraitSafeDispatcherSubPointers { + let base_address = self.__storage_pointer_address__; + let mut current_offset = self.__storage_pointer_offset__; let contract_address_value = starknet::storage::StoragePointer { - address: base_address, - offset: current_offset, + __storage_pointer_address__: base_address, + __storage_pointer_offset__: current_offset, }; INominalTraitSafeDispatcherSubPointers { contract_address: contract_address_value, @@ -2686,19 +2692,19 @@ type SubPointersType = INominalTraitSafeDispatcherSubPointers; } } #[derive(Drop, Copy)] -struct MutableINominalTraitSafeDispatcherSubPointers { - contract_address: starknet::storage::StoragePointer>, -} -impl MutableINominalTraitSafeDispatcherSubPointersImpl of starknet::storage::MutableSubPointers { -type SubPointersType = MutableINominalTraitSafeDispatcherSubPointers; - fn sub_pointers_mut(self: starknet::storage::StoragePointer>) -> MutableINominalTraitSafeDispatcherSubPointers { - let base_address = self.address; - let mut current_offset = self.offset; +pub struct INominalTraitSafeDispatcherSubPointersMut { + pub contract_address: starknet::storage::StoragePointer>, +} +impl INominalTraitSafeDispatcherSubPointersMutImpl of starknet::storage::SubPointersMut { + type SubPointersType = INominalTraitSafeDispatcherSubPointersMut; + fn sub_pointers_mut(self: starknet::storage::StoragePointer>) -> INominalTraitSafeDispatcherSubPointersMut { + let base_address = self.__storage_pointer_address__; + let mut current_offset = self.__storage_pointer_offset__; let contract_address_value = starknet::storage::StoragePointer { - address: base_address, - offset: current_offset, + __storage_pointer_address__: base_address, + __storage_pointer_offset__: current_offset, }; - MutableINominalTraitSafeDispatcherSubPointers { + INominalTraitSafeDispatcherSubPointersMut { contract_address: contract_address_value, } } @@ -2748,17 +2754,17 @@ impl StoreIFaultyTraitDispatcher of starknet::Store:: { } #[derive(Drop, Copy)] -struct IFaultyTraitDispatcherSubPointers { - contract_address: starknet::storage::StoragePointer, +pub struct IFaultyTraitDispatcherSubPointers { + pub contract_address: starknet::storage::StoragePointer, } impl IFaultyTraitDispatcherSubPointersImpl of starknet::storage::SubPointers { -type SubPointersType = IFaultyTraitDispatcherSubPointers; - fn sub_pointers(self: starknet::storage::StoragePointer) -> IFaultyTraitDispatcherSubPointers { - let base_address = self.address; - let mut current_offset = self.offset; + type SubPointersType = IFaultyTraitDispatcherSubPointers; + fn sub_pointers(self: starknet::storage::StoragePointer) -> IFaultyTraitDispatcherSubPointers { + let base_address = self.__storage_pointer_address__; + let mut current_offset = self.__storage_pointer_offset__; let contract_address_value = starknet::storage::StoragePointer { - address: base_address, - offset: current_offset, + __storage_pointer_address__: base_address, + __storage_pointer_offset__: current_offset, }; IFaultyTraitDispatcherSubPointers { contract_address: contract_address_value, @@ -2766,19 +2772,19 @@ type SubPointersType = IFaultyTraitDispatcherSubPointers; } } #[derive(Drop, Copy)] -struct MutableIFaultyTraitDispatcherSubPointers { - contract_address: starknet::storage::StoragePointer>, -} -impl MutableIFaultyTraitDispatcherSubPointersImpl of starknet::storage::MutableSubPointers { -type SubPointersType = MutableIFaultyTraitDispatcherSubPointers; - fn sub_pointers_mut(self: starknet::storage::StoragePointer>) -> MutableIFaultyTraitDispatcherSubPointers { - let base_address = self.address; - let mut current_offset = self.offset; +pub struct IFaultyTraitDispatcherSubPointersMut { + pub contract_address: starknet::storage::StoragePointer>, +} +impl IFaultyTraitDispatcherSubPointersMutImpl of starknet::storage::SubPointersMut { + type SubPointersType = IFaultyTraitDispatcherSubPointersMut; + fn sub_pointers_mut(self: starknet::storage::StoragePointer>) -> IFaultyTraitDispatcherSubPointersMut { + let base_address = self.__storage_pointer_address__; + let mut current_offset = self.__storage_pointer_offset__; let contract_address_value = starknet::storage::StoragePointer { - address: base_address, - offset: current_offset, + __storage_pointer_address__: base_address, + __storage_pointer_offset__: current_offset, }; - MutableIFaultyTraitDispatcherSubPointers { + IFaultyTraitDispatcherSubPointersMut { contract_address: contract_address_value, } } @@ -2828,17 +2834,17 @@ impl StoreIFaultyTraitLibraryDispatcher of starknet::Store::, +pub struct IFaultyTraitLibraryDispatcherSubPointers { + pub class_hash: starknet::storage::StoragePointer, } impl IFaultyTraitLibraryDispatcherSubPointersImpl of starknet::storage::SubPointers { -type SubPointersType = IFaultyTraitLibraryDispatcherSubPointers; - fn sub_pointers(self: starknet::storage::StoragePointer) -> IFaultyTraitLibraryDispatcherSubPointers { - let base_address = self.address; - let mut current_offset = self.offset; + type SubPointersType = IFaultyTraitLibraryDispatcherSubPointers; + fn sub_pointers(self: starknet::storage::StoragePointer) -> IFaultyTraitLibraryDispatcherSubPointers { + let base_address = self.__storage_pointer_address__; + let mut current_offset = self.__storage_pointer_offset__; let class_hash_value = starknet::storage::StoragePointer { - address: base_address, - offset: current_offset, + __storage_pointer_address__: base_address, + __storage_pointer_offset__: current_offset, }; IFaultyTraitLibraryDispatcherSubPointers { class_hash: class_hash_value, @@ -2846,19 +2852,19 @@ type SubPointersType = IFaultyTraitLibraryDispatcherSubPointers; } } #[derive(Drop, Copy)] -struct MutableIFaultyTraitLibraryDispatcherSubPointers { - class_hash: starknet::storage::StoragePointer>, -} -impl MutableIFaultyTraitLibraryDispatcherSubPointersImpl of starknet::storage::MutableSubPointers { -type SubPointersType = MutableIFaultyTraitLibraryDispatcherSubPointers; - fn sub_pointers_mut(self: starknet::storage::StoragePointer>) -> MutableIFaultyTraitLibraryDispatcherSubPointers { - let base_address = self.address; - let mut current_offset = self.offset; +pub struct IFaultyTraitLibraryDispatcherSubPointersMut { + pub class_hash: starknet::storage::StoragePointer>, +} +impl IFaultyTraitLibraryDispatcherSubPointersMutImpl of starknet::storage::SubPointersMut { + type SubPointersType = IFaultyTraitLibraryDispatcherSubPointersMut; + fn sub_pointers_mut(self: starknet::storage::StoragePointer>) -> IFaultyTraitLibraryDispatcherSubPointersMut { + let base_address = self.__storage_pointer_address__; + let mut current_offset = self.__storage_pointer_offset__; let class_hash_value = starknet::storage::StoragePointer { - address: base_address, - offset: current_offset, + __storage_pointer_address__: base_address, + __storage_pointer_offset__: current_offset, }; - MutableIFaultyTraitLibraryDispatcherSubPointers { + IFaultyTraitLibraryDispatcherSubPointersMut { class_hash: class_hash_value, } } @@ -2908,17 +2914,17 @@ impl StoreIFaultyTraitSafeLibraryDispatcher of starknet::Store::, +pub struct IFaultyTraitSafeLibraryDispatcherSubPointers { + pub class_hash: starknet::storage::StoragePointer, } impl IFaultyTraitSafeLibraryDispatcherSubPointersImpl of starknet::storage::SubPointers { -type SubPointersType = IFaultyTraitSafeLibraryDispatcherSubPointers; - fn sub_pointers(self: starknet::storage::StoragePointer) -> IFaultyTraitSafeLibraryDispatcherSubPointers { - let base_address = self.address; - let mut current_offset = self.offset; + type SubPointersType = IFaultyTraitSafeLibraryDispatcherSubPointers; + fn sub_pointers(self: starknet::storage::StoragePointer) -> IFaultyTraitSafeLibraryDispatcherSubPointers { + let base_address = self.__storage_pointer_address__; + let mut current_offset = self.__storage_pointer_offset__; let class_hash_value = starknet::storage::StoragePointer { - address: base_address, - offset: current_offset, + __storage_pointer_address__: base_address, + __storage_pointer_offset__: current_offset, }; IFaultyTraitSafeLibraryDispatcherSubPointers { class_hash: class_hash_value, @@ -2926,19 +2932,19 @@ type SubPointersType = IFaultyTraitSafeLibraryDispatcherSubPointers; } } #[derive(Drop, Copy)] -struct MutableIFaultyTraitSafeLibraryDispatcherSubPointers { - class_hash: starknet::storage::StoragePointer>, -} -impl MutableIFaultyTraitSafeLibraryDispatcherSubPointersImpl of starknet::storage::MutableSubPointers { -type SubPointersType = MutableIFaultyTraitSafeLibraryDispatcherSubPointers; - fn sub_pointers_mut(self: starknet::storage::StoragePointer>) -> MutableIFaultyTraitSafeLibraryDispatcherSubPointers { - let base_address = self.address; - let mut current_offset = self.offset; +pub struct IFaultyTraitSafeLibraryDispatcherSubPointersMut { + pub class_hash: starknet::storage::StoragePointer>, +} +impl IFaultyTraitSafeLibraryDispatcherSubPointersMutImpl of starknet::storage::SubPointersMut { + type SubPointersType = IFaultyTraitSafeLibraryDispatcherSubPointersMut; + fn sub_pointers_mut(self: starknet::storage::StoragePointer>) -> IFaultyTraitSafeLibraryDispatcherSubPointersMut { + let base_address = self.__storage_pointer_address__; + let mut current_offset = self.__storage_pointer_offset__; let class_hash_value = starknet::storage::StoragePointer { - address: base_address, - offset: current_offset, + __storage_pointer_address__: base_address, + __storage_pointer_offset__: current_offset, }; - MutableIFaultyTraitSafeLibraryDispatcherSubPointers { + IFaultyTraitSafeLibraryDispatcherSubPointersMut { class_hash: class_hash_value, } } @@ -2988,17 +2994,17 @@ impl StoreIFaultyTraitSafeDispatcher of starknet::Store::, +pub struct IFaultyTraitSafeDispatcherSubPointers { + pub contract_address: starknet::storage::StoragePointer, } impl IFaultyTraitSafeDispatcherSubPointersImpl of starknet::storage::SubPointers { -type SubPointersType = IFaultyTraitSafeDispatcherSubPointers; - fn sub_pointers(self: starknet::storage::StoragePointer) -> IFaultyTraitSafeDispatcherSubPointers { - let base_address = self.address; - let mut current_offset = self.offset; + type SubPointersType = IFaultyTraitSafeDispatcherSubPointers; + fn sub_pointers(self: starknet::storage::StoragePointer) -> IFaultyTraitSafeDispatcherSubPointers { + let base_address = self.__storage_pointer_address__; + let mut current_offset = self.__storage_pointer_offset__; let contract_address_value = starknet::storage::StoragePointer { - address: base_address, - offset: current_offset, + __storage_pointer_address__: base_address, + __storage_pointer_offset__: current_offset, }; IFaultyTraitSafeDispatcherSubPointers { contract_address: contract_address_value, @@ -3006,84 +3012,84 @@ type SubPointersType = IFaultyTraitSafeDispatcherSubPointers; } } #[derive(Drop, Copy)] -struct MutableIFaultyTraitSafeDispatcherSubPointers { - contract_address: starknet::storage::StoragePointer>, -} -impl MutableIFaultyTraitSafeDispatcherSubPointersImpl of starknet::storage::MutableSubPointers { -type SubPointersType = MutableIFaultyTraitSafeDispatcherSubPointers; - fn sub_pointers_mut(self: starknet::storage::StoragePointer>) -> MutableIFaultyTraitSafeDispatcherSubPointers { - let base_address = self.address; - let mut current_offset = self.offset; +pub struct IFaultyTraitSafeDispatcherSubPointersMut { + pub contract_address: starknet::storage::StoragePointer>, +} +impl IFaultyTraitSafeDispatcherSubPointersMutImpl of starknet::storage::SubPointersMut { + type SubPointersType = IFaultyTraitSafeDispatcherSubPointersMut; + fn sub_pointers_mut(self: starknet::storage::StoragePointer>) -> IFaultyTraitSafeDispatcherSubPointersMut { + let base_address = self.__storage_pointer_address__; + let mut current_offset = self.__storage_pointer_offset__; let contract_address_value = starknet::storage::StoragePointer { - address: base_address, - offset: current_offset, + __storage_pointer_address__: base_address, + __storage_pointer_offset__: current_offset, }; - MutableIFaultyTraitSafeDispatcherSubPointers { + IFaultyTraitSafeDispatcherSubPointersMut { contract_address: contract_address_value, } } } impl IEmptyTraitDispatcherSubPointersDrop of core::traits::Drop::; impl IEmptyTraitDispatcherSubPointersCopy of core::traits::Copy::; -impl MutableIEmptyTraitDispatcherSubPointersDrop of core::traits::Drop::; -impl MutableIEmptyTraitDispatcherSubPointersCopy of core::traits::Copy::; +impl IEmptyTraitDispatcherSubPointersMutDrop of core::traits::Drop::; +impl IEmptyTraitDispatcherSubPointersMutCopy of core::traits::Copy::; impl IEmptyTraitLibraryDispatcherSubPointersDrop of core::traits::Drop::; impl IEmptyTraitLibraryDispatcherSubPointersCopy of core::traits::Copy::; -impl MutableIEmptyTraitLibraryDispatcherSubPointersDrop of core::traits::Drop::; -impl MutableIEmptyTraitLibraryDispatcherSubPointersCopy of core::traits::Copy::; +impl IEmptyTraitLibraryDispatcherSubPointersMutDrop of core::traits::Drop::; +impl IEmptyTraitLibraryDispatcherSubPointersMutCopy of core::traits::Copy::; impl IEmptyTraitSafeLibraryDispatcherSubPointersDrop of core::traits::Drop::; impl IEmptyTraitSafeLibraryDispatcherSubPointersCopy of core::traits::Copy::; -impl MutableIEmptyTraitSafeLibraryDispatcherSubPointersDrop of core::traits::Drop::; -impl MutableIEmptyTraitSafeLibraryDispatcherSubPointersCopy of core::traits::Copy::; +impl IEmptyTraitSafeLibraryDispatcherSubPointersMutDrop of core::traits::Drop::; +impl IEmptyTraitSafeLibraryDispatcherSubPointersMutCopy of core::traits::Copy::; impl IEmptyTraitSafeDispatcherSubPointersDrop of core::traits::Drop::; impl IEmptyTraitSafeDispatcherSubPointersCopy of core::traits::Copy::; -impl MutableIEmptyTraitSafeDispatcherSubPointersDrop of core::traits::Drop::; -impl MutableIEmptyTraitSafeDispatcherSubPointersCopy of core::traits::Copy::; +impl IEmptyTraitSafeDispatcherSubPointersMutDrop of core::traits::Drop::; +impl IEmptyTraitSafeDispatcherSubPointersMutCopy of core::traits::Copy::; impl IFaultyTraitDispatcherSubPointersDrop of core::traits::Drop::; impl IFaultyTraitDispatcherSubPointersCopy of core::traits::Copy::; -impl MutableIFaultyTraitDispatcherSubPointersDrop of core::traits::Drop::; -impl MutableIFaultyTraitDispatcherSubPointersCopy of core::traits::Copy::; +impl IFaultyTraitDispatcherSubPointersMutDrop of core::traits::Drop::; +impl IFaultyTraitDispatcherSubPointersMutCopy of core::traits::Copy::; impl IFaultyTraitLibraryDispatcherSubPointersDrop of core::traits::Drop::; impl IFaultyTraitLibraryDispatcherSubPointersCopy of core::traits::Copy::; -impl MutableIFaultyTraitLibraryDispatcherSubPointersDrop of core::traits::Drop::; -impl MutableIFaultyTraitLibraryDispatcherSubPointersCopy of core::traits::Copy::; +impl IFaultyTraitLibraryDispatcherSubPointersMutDrop of core::traits::Drop::; +impl IFaultyTraitLibraryDispatcherSubPointersMutCopy of core::traits::Copy::; impl IFaultyTraitSafeLibraryDispatcherSubPointersDrop of core::traits::Drop::; impl IFaultyTraitSafeLibraryDispatcherSubPointersCopy of core::traits::Copy::; -impl MutableIFaultyTraitSafeLibraryDispatcherSubPointersDrop of core::traits::Drop::; -impl MutableIFaultyTraitSafeLibraryDispatcherSubPointersCopy of core::traits::Copy::; +impl IFaultyTraitSafeLibraryDispatcherSubPointersMutDrop of core::traits::Drop::; +impl IFaultyTraitSafeLibraryDispatcherSubPointersMutCopy of core::traits::Copy::; impl IFaultyTraitSafeDispatcherSubPointersDrop of core::traits::Drop::; impl IFaultyTraitSafeDispatcherSubPointersCopy of core::traits::Copy::; -impl MutableIFaultyTraitSafeDispatcherSubPointersDrop of core::traits::Drop::; -impl MutableIFaultyTraitSafeDispatcherSubPointersCopy of core::traits::Copy::; +impl IFaultyTraitSafeDispatcherSubPointersMutDrop of core::traits::Drop::; +impl IFaultyTraitSafeDispatcherSubPointersMutCopy of core::traits::Copy::; impl INominalTraitDispatcherSubPointersDrop of core::traits::Drop::; impl INominalTraitDispatcherSubPointersCopy of core::traits::Copy::; -impl MutableINominalTraitDispatcherSubPointersDrop of core::traits::Drop::; -impl MutableINominalTraitDispatcherSubPointersCopy of core::traits::Copy::; +impl INominalTraitDispatcherSubPointersMutDrop of core::traits::Drop::; +impl INominalTraitDispatcherSubPointersMutCopy of core::traits::Copy::; impl INominalTraitLibraryDispatcherSubPointersDrop of core::traits::Drop::; impl INominalTraitLibraryDispatcherSubPointersCopy of core::traits::Copy::; -impl MutableINominalTraitLibraryDispatcherSubPointersDrop of core::traits::Drop::; -impl MutableINominalTraitLibraryDispatcherSubPointersCopy of core::traits::Copy::; +impl INominalTraitLibraryDispatcherSubPointersMutDrop of core::traits::Drop::; +impl INominalTraitLibraryDispatcherSubPointersMutCopy of core::traits::Copy::; impl INominalTraitSafeLibraryDispatcherSubPointersDrop of core::traits::Drop::; impl INominalTraitSafeLibraryDispatcherSubPointersCopy of core::traits::Copy::; -impl MutableINominalTraitSafeLibraryDispatcherSubPointersDrop of core::traits::Drop::; -impl MutableINominalTraitSafeLibraryDispatcherSubPointersCopy of core::traits::Copy::; +impl INominalTraitSafeLibraryDispatcherSubPointersMutDrop of core::traits::Drop::; +impl INominalTraitSafeLibraryDispatcherSubPointersMutCopy of core::traits::Copy::; impl INominalTraitSafeDispatcherSubPointersDrop of core::traits::Drop::; impl INominalTraitSafeDispatcherSubPointersCopy of core::traits::Copy::; -impl MutableINominalTraitSafeDispatcherSubPointersDrop of core::traits::Drop::; -impl MutableINominalTraitSafeDispatcherSubPointersCopy of core::traits::Copy::; +impl INominalTraitSafeDispatcherSubPointersMutDrop of core::traits::Drop::; +impl INominalTraitSafeDispatcherSubPointersMutCopy of core::traits::Copy::; impl IFaultyTraitDispatcherSubPointersDrop of core::traits::Drop::; impl IFaultyTraitDispatcherSubPointersCopy of core::traits::Copy::; -impl MutableIFaultyTraitDispatcherSubPointersDrop of core::traits::Drop::; -impl MutableIFaultyTraitDispatcherSubPointersCopy of core::traits::Copy::; +impl IFaultyTraitDispatcherSubPointersMutDrop of core::traits::Drop::; +impl IFaultyTraitDispatcherSubPointersMutCopy of core::traits::Copy::; impl IFaultyTraitLibraryDispatcherSubPointersDrop of core::traits::Drop::; impl IFaultyTraitLibraryDispatcherSubPointersCopy of core::traits::Copy::; -impl MutableIFaultyTraitLibraryDispatcherSubPointersDrop of core::traits::Drop::; -impl MutableIFaultyTraitLibraryDispatcherSubPointersCopy of core::traits::Copy::; +impl IFaultyTraitLibraryDispatcherSubPointersMutDrop of core::traits::Drop::; +impl IFaultyTraitLibraryDispatcherSubPointersMutCopy of core::traits::Copy::; impl IFaultyTraitSafeLibraryDispatcherSubPointersDrop of core::traits::Drop::; impl IFaultyTraitSafeLibraryDispatcherSubPointersCopy of core::traits::Copy::; -impl MutableIFaultyTraitSafeLibraryDispatcherSubPointersDrop of core::traits::Drop::; -impl MutableIFaultyTraitSafeLibraryDispatcherSubPointersCopy of core::traits::Copy::; +impl IFaultyTraitSafeLibraryDispatcherSubPointersMutDrop of core::traits::Drop::; +impl IFaultyTraitSafeLibraryDispatcherSubPointersMutCopy of core::traits::Copy::; impl IFaultyTraitSafeDispatcherSubPointersDrop of core::traits::Drop::; impl IFaultyTraitSafeDispatcherSubPointersCopy of core::traits::Copy::; -impl MutableIFaultyTraitSafeDispatcherSubPointersDrop of core::traits::Drop::; -impl MutableIFaultyTraitSafeDispatcherSubPointersCopy of core::traits::Copy::; +impl IFaultyTraitSafeDispatcherSubPointersMutDrop of core::traits::Drop::; +impl IFaultyTraitSafeDispatcherSubPointersMutCopy of core::traits::Copy::; diff --git a/crates/dojo-lang/src/print.rs b/crates/dojo-lang/src/print.rs index 168adb79d7..999adf2622 100644 --- a/crates/dojo-lang/src/print.rs +++ b/crates/dojo-lang/src/print.rs @@ -8,6 +8,7 @@ use cairo_lang_utils::unordered_hash_map::UnorderedHashMap; /// Parameters: /// * db: The semantic database. /// * struct_ast: The AST of the model struct. +/// /// Returns: /// * A RewriteNode containing the generated code. pub fn handle_print_struct(db: &dyn SyntaxGroup, struct_ast: ItemStruct) -> RewriteNode { @@ -47,6 +48,7 @@ impl $type_name$StructPrintImpl of core::debug::PrintTrait<$type_name$> { /// Parameters: /// * db: The semantic database. /// * enum_ast: The AST of the model enum. +/// /// Returns: /// * A RewriteNode containing the generated code. pub fn handle_print_enum(db: &dyn SyntaxGroup, enum_ast: ItemEnum) -> RewriteNode { diff --git a/crates/dojo-world/abigen/src/main.rs b/crates/dojo-world/abigen/src/main.rs index da004fad1c..ff73010dfd 100644 --- a/crates/dojo-world/abigen/src/main.rs +++ b/crates/dojo-world/abigen/src/main.rs @@ -104,13 +104,13 @@ fn compile_dojo_core() { file, r#" [package] -cairo-version = "2.7.0-rc.3" +cairo-version = "2.7.0" edition = "2024_07" name = "dojo" -version = "0.7.3" +version = "1.0.0-alpha.4" [dependencies] -starknet = "2.7.0-rc.3" +starknet = "2.7.0" [[target.starknet-contract]] sierra = true diff --git a/crates/katana/cairo/Cargo.toml b/crates/katana/cairo/Cargo.toml index bffe6ce8c0..edb56a3dea 100644 --- a/crates/katana/cairo/Cargo.toml +++ b/crates/katana/cairo/Cargo.toml @@ -10,12 +10,12 @@ version.workspace = true # Use from git instead of crates.io registry so that the workspace patches aren't applied. [dependencies] -cairo-lang-casm = "2.7.0-rc.1" -cairo-lang-runner = "2.7.0-rc.1" -cairo-lang-sierra = "2.7.0-rc.1" -cairo-lang-sierra-to-casm = "2.7.0-rc.1" -cairo-lang-starknet = "2.7.0-rc.1" -cairo-lang-starknet-classes = "2.7.0-rc.1" -cairo-lang-utils = "2.7.0-rc.1" -cairo-vm = "1.0.0-rc3" +cairo-lang-casm = "2.7.0" +cairo-lang-runner = "2.7.0" +cairo-lang-sierra = "2.7.0" +cairo-lang-sierra-to-casm = "2.7.0" +cairo-lang-starknet = "2.7.0" +cairo-lang-starknet-classes = "2.7.0" +cairo-lang-utils = "2.7.0" +cairo-vm = "1.0.0" starknet_api = "0.13.0-dev.9" diff --git a/crates/katana/storage/codecs/derive/Cargo.toml b/crates/katana/storage/codecs/derive/Cargo.toml index fc00c230ee..986d362e50 100644 --- a/crates/katana/storage/codecs/derive/Cargo.toml +++ b/crates/katana/storage/codecs/derive/Cargo.toml @@ -16,3 +16,6 @@ syn = { version = "2.0.41", features = [ "extra-traits", "full" ] } [package.metadata.cargo-udeps.ignore] normal = [ "serde" ] + +[features] +postcard = [ ] diff --git a/crates/katana/storage/db/src/abstraction/cursor.rs b/crates/katana/storage/db/src/abstraction/cursor.rs index 252d4a9d30..185e1fecfc 100644 --- a/crates/katana/storage/db/src/abstraction/cursor.rs +++ b/crates/katana/storage/db/src/abstraction/cursor.rs @@ -81,8 +81,7 @@ pub trait DbDupSortCursor: DbCursor { /// - Some(key), Some(subkey): a `key` item whose data is >= than `subkey` /// - Some(key), None: first item of a specified `key` /// - None, Some(subkey): like first case, but in the first key - /// - None, None: first item in the table - /// of a DUPSORT table. + /// - None, None: first item in the table of a DUPSORT table. fn walk_dup( &mut self, key: Option, diff --git a/crates/saya/core/src/lib.rs b/crates/saya/core/src/lib.rs index 408294650c..1b25b579e3 100644 --- a/crates/saya/core/src/lib.rs +++ b/crates/saya/core/src/lib.rs @@ -274,7 +274,7 @@ impl Saya { /// * `prove_scheduler` - A parallel prove scheduler. /// * `block_number` - The block number. /// * `block_info` - The block to process, along with the state roots of the previous block and - /// the genesis block. + /// the genesis block. fn process_block( &mut self, prove_scheduler: &mut Scheduler, diff --git a/crates/sozo/ops/src/tests/model.rs b/crates/sozo/ops/src/tests/model.rs index fb7da33f5e..e42f5aeda2 100644 --- a/crates/sozo/ops/src/tests/model.rs +++ b/crates/sozo/ops/src/tests/model.rs @@ -25,7 +25,7 @@ async fn test_model_ops() { ) .await .unwrap(), - Felt::from_hex("0x61fa996f7cf8412bb5aca7d4bd4fd9eca806a92e5007e87d23f638b6774ed40") + Felt::from_hex("0x2bfdf50f9ec0670b52065947e6ce2e1ebb39d54d19da1b65411b6d58bb04e79") .unwrap() ); @@ -37,7 +37,7 @@ async fn test_model_ops() { ) .await .unwrap(), - Felt::from_hex("0x4eddd8563a17c7d256b35e3cb0decdfcdfe122dd72593ebc572cfc535941ac2") + Felt::from_hex("0x59d2704cd3ce6ea22ae73b0c68e100b80e1f85ac4d4be5cbc66f6f8b9f1c268") .unwrap() ); diff --git a/crates/sozo/ops/src/utils.rs b/crates/sozo/ops/src/utils.rs index 83bdf458a2..a52deaa022 100644 --- a/crates/sozo/ops/src/utils.rs +++ b/crates/sozo/ops/src/utils.rs @@ -114,8 +114,8 @@ where /// /// # Arguments /// -/// * `block_str` - a string representing a block ID. It could be a -/// block hash starting with 0x, a block number, 'pending' or 'latest'. +/// * `block_str` - a string representing a block ID. It could be a block hash starting with 0x, a +/// block number, 'pending' or 'latest'. /// /// # Returns /// diff --git a/crates/torii/core/src/sql.rs b/crates/torii/core/src/sql.rs index 776f3754ea..9be96211fc 100644 --- a/crates/torii/core/src/sql.rs +++ b/crates/torii/core/src/sql.rs @@ -127,7 +127,7 @@ impl Sql { executed_at=EXCLUDED.executed_at RETURNING *"; let model_registered: ModelRegistered = sqlx::query_as(insert_models) // this is temporary until the model hash is precomputed - .bind(&format!("{:#x}", selector)) + .bind(format!("{:#x}", selector)) .bind(namespace) .bind(model.name()) .bind(format!("{class_hash:#x}")) diff --git a/crates/torii/types-test/Scarb.lock b/crates/torii/types-test/Scarb.lock index ba40a5e915..dc899a1de1 100644 --- a/crates/torii/types-test/Scarb.lock +++ b/crates/torii/types-test/Scarb.lock @@ -3,7 +3,7 @@ version = 1 [[package]] name = "dojo" -version = "0.7.3" +version = "1.0.0-alpha.4" dependencies = [ "dojo_plugin", ] @@ -15,7 +15,7 @@ source = "git+https://github.com/dojoengine/dojo?rev=71b1f1a4#71b1f1a467534cbeeb [[package]] name = "types_test" -version = "0.7.3" +version = "1.0.0-alpha.4" dependencies = [ "dojo", ] diff --git a/crates/torii/types-test/Scarb.toml b/crates/torii/types-test/Scarb.toml index 3c0e2d505f..78a72a2884 100644 --- a/crates/torii/types-test/Scarb.toml +++ b/crates/torii/types-test/Scarb.toml @@ -1,8 +1,8 @@ [package] -cairo-version = "=2.7.0-rc.3" +cairo-version = "=2.7.0" edition = "2024_07" name = "types_test" -version = "0.7.3" +version = "1.0.0-alpha.4" [cairo] sierra-replace-ids = true diff --git a/examples/spawn-and-move/Scarb.lock b/examples/spawn-and-move/Scarb.lock index 5b6d7916bc..a5f10a3aae 100644 --- a/examples/spawn-and-move/Scarb.lock +++ b/examples/spawn-and-move/Scarb.lock @@ -17,14 +17,14 @@ dependencies = [ [[package]] name = "dojo" -version = "0.7.3" +version = "1.0.0-alpha.4" dependencies = [ "dojo_plugin", ] [[package]] name = "dojo_examples" -version = "0.7.3" +version = "1.0.0-alpha.4" dependencies = [ "armory", "bestiary", diff --git a/examples/spawn-and-move/Scarb.toml b/examples/spawn-and-move/Scarb.toml index 4489b63feb..e91c6eab41 100644 --- a/examples/spawn-and-move/Scarb.toml +++ b/examples/spawn-and-move/Scarb.toml @@ -1,7 +1,7 @@ [package] -cairo-version = "=2.7.0-rc.3" +cairo-version = "=2.7.0" name = "dojo_examples" -version = "0.7.3" +version = "1.0.0-alpha.4" # Use the prelude with the less imports as possible # from corelib. edition = "2024_07" @@ -40,7 +40,7 @@ rpc_url = "http://localhost:5050/" # Default account for katana with seed = 0 account_address = "0x6162896d1d7ab204c7ccac6dd5f8e9e7c25ecd5ae4fcb4ad32e57786bb46e03" private_key = "0x1800000000300000180000000000030000000000003006001800006600" -world_address = "0x25e74888e786245ec7aa93d846b2cc9e4b49a5244209860bbf4b384f654521b" +world_address = "0x2f6f0512832a8820173edb8e1adac28b7edc78bb3b6f038614adf4377b694c5" [profile.release.tool.dojo] # for more info on how `merge-strategy` works see: diff --git a/examples/spawn-and-move/manifests/dev/base/contracts/dojo_examples-actions-40b6994c.toml b/examples/spawn-and-move/manifests/dev/base/contracts/dojo_examples-actions-40b6994c.toml index d6647ceeca..73cca5ec1b 100644 --- a/examples/spawn-and-move/manifests/dev/base/contracts/dojo_examples-actions-40b6994c.toml +++ b/examples/spawn-and-move/manifests/dev/base/contracts/dojo_examples-actions-40b6994c.toml @@ -1,6 +1,6 @@ kind = "DojoContract" -class_hash = "0x2a8de224c28cae3049e23b352e7fce6f26cc99884331e5f2a6aea261398a27a" -original_class_hash = "0x2a8de224c28cae3049e23b352e7fce6f26cc99884331e5f2a6aea261398a27a" +class_hash = "0xc0a5037a6fdc0b374b270ca5e9f3bd76200d73d01f409749b7006b3cd6c03d" +original_class_hash = "0xc0a5037a6fdc0b374b270ca5e9f3bd76200d73d01f409749b7006b3cd6c03d" base_class_hash = "0x0" abi = "manifests/dev/base/abis/contracts/dojo_examples-actions-40b6994c.json" reads = [] diff --git a/examples/spawn-and-move/manifests/dev/base/dojo-world.toml b/examples/spawn-and-move/manifests/dev/base/dojo-world.toml index 59d4719031..5ebf245a91 100644 --- a/examples/spawn-and-move/manifests/dev/base/dojo-world.toml +++ b/examples/spawn-and-move/manifests/dev/base/dojo-world.toml @@ -1,6 +1,6 @@ kind = "Class" -class_hash = "0x2178527e9556d1aa21d3c2961d28f9114fcfed81b4c3674ed591c50ce46cc9d" -original_class_hash = "0x2178527e9556d1aa21d3c2961d28f9114fcfed81b4c3674ed591c50ce46cc9d" +class_hash = "0x14287624e97e0312d4e680e19071efce983810e909b32afc54cd9c8031f4c1c" +original_class_hash = "0x14287624e97e0312d4e680e19071efce983810e909b32afc54cd9c8031f4c1c" abi = "manifests/dev/base/abis/dojo-world.json" tag = "dojo-world" manifest_name = "dojo-world" diff --git a/examples/spawn-and-move/manifests/dev/base/models/dojo_examples-Moves-2e2accba.toml b/examples/spawn-and-move/manifests/dev/base/models/dojo_examples-Moves-2e2accba.toml index 9396b8ee6f..2007e33243 100644 --- a/examples/spawn-and-move/manifests/dev/base/models/dojo_examples-Moves-2e2accba.toml +++ b/examples/spawn-and-move/manifests/dev/base/models/dojo_examples-Moves-2e2accba.toml @@ -1,6 +1,6 @@ kind = "DojoModel" -class_hash = "0x61fa996f7cf8412bb5aca7d4bd4fd9eca806a92e5007e87d23f638b6774ed40" -original_class_hash = "0x61fa996f7cf8412bb5aca7d4bd4fd9eca806a92e5007e87d23f638b6774ed40" +class_hash = "0x2bfdf50f9ec0670b52065947e6ce2e1ebb39d54d19da1b65411b6d58bb04e79" +original_class_hash = "0x2bfdf50f9ec0670b52065947e6ce2e1ebb39d54d19da1b65411b6d58bb04e79" abi = "manifests/dev/base/abis/models/dojo_examples-Moves-2e2accba.json" tag = "dojo_examples-Moves" manifest_name = "dojo_examples-Moves-2e2accba" diff --git a/examples/spawn-and-move/manifests/dev/deployment/manifest.json b/examples/spawn-and-move/manifests/dev/deployment/manifest.json index c7d42bb7df..a1672d6fc0 100644 --- a/examples/spawn-and-move/manifests/dev/deployment/manifest.json +++ b/examples/spawn-and-move/manifests/dev/deployment/manifest.json @@ -1,8 +1,8 @@ { "world": { "kind": "WorldContract", - "class_hash": "0x2178527e9556d1aa21d3c2961d28f9114fcfed81b4c3674ed591c50ce46cc9d", - "original_class_hash": "0x2178527e9556d1aa21d3c2961d28f9114fcfed81b4c3674ed591c50ce46cc9d", + "class_hash": "0x14287624e97e0312d4e680e19071efce983810e909b32afc54cd9c8031f4c1c", + "original_class_hash": "0x14287624e97e0312d4e680e19071efce983810e909b32afc54cd9c8031f4c1c", "abi": [ { "type": "impl", @@ -1221,8 +1221,8 @@ ] } ], - "address": "0x25e74888e786245ec7aa93d846b2cc9e4b49a5244209860bbf4b384f654521b", - "transaction_hash": "0x1606f5a86180d90027d33915cf0d62e117f778f8837df3c1375af3d3bc2951e", + "address": "0x2f6f0512832a8820173edb8e1adac28b7edc78bb3b6f038614adf4377b694c5", + "transaction_hash": "0x22c5e928ee07543e0eef5aae78ded9902d7d8647f76d46d743be2f2661ebab7", "block_number": 3, "seed": "dojo_examples", "metadata": { @@ -1242,9 +1242,9 @@ "contracts": [ { "kind": "DojoContract", - "address": "0x24d926d75cd84104c3bd24f0f79e95c273d6a99ed449f3c8b83114857020332", - "class_hash": "0x2a8de224c28cae3049e23b352e7fce6f26cc99884331e5f2a6aea261398a27a", - "original_class_hash": "0x2a8de224c28cae3049e23b352e7fce6f26cc99884331e5f2a6aea261398a27a", + "address": "0x66221f204a50d51e28d03bc1578bc1845371cd0f0932666b507cd9721c183ec", + "class_hash": "0xc0a5037a6fdc0b374b270ca5e9f3bd76200d73d01f409749b7006b3cd6c03d", + "original_class_hash": "0xc0a5037a6fdc0b374b270ca5e9f3bd76200d73d01f409749b7006b3cd6c03d", "base_class_hash": "0x2427dd10a58850ac9a5ca6ce04b7771b05330fd18f2e481831ad903b969e6b2", "abi": [ { @@ -1691,7 +1691,7 @@ }, { "kind": "DojoContract", - "address": "0x31a348061c348eb84d7d9f1658244432170822cdb1a97a586805b565c168bcf", + "address": "0x71e9522f412f3458a3508d0449f8f3a4e1662da382c86393b3abb193d2968b5", "class_hash": "0x45ad5a298db270a9c3ee439b7a7a008e3219b70937cfaa144589866442f3908", "original_class_hash": "0x45ad5a298db270a9c3ee439b7a7a008e3219b70937cfaa144589866442f3908", "base_class_hash": "0x2427dd10a58850ac9a5ca6ce04b7771b05330fd18f2e481831ad903b969e6b2", @@ -1928,7 +1928,7 @@ }, { "kind": "DojoContract", - "address": "0x4aee4238ae328cfe7ad116057e3e9ef083b75f13c1914a8f93ef32549ebe808", + "address": "0x33a28bd8c06940892f49b8d9211ddc5165ec9316087c1fa563e56152f95d429", "class_hash": "0x3daab1621bba5f43f0d84f8f68ee7a5dfa4d83f98f746e2e9dcd3a848233e35", "original_class_hash": "0x3daab1621bba5f43f0d84f8f68ee7a5dfa4d83f98f746e2e9dcd3a848233e35", "base_class_hash": "0x2427dd10a58850ac9a5ca6ce04b7771b05330fd18f2e481831ad903b969e6b2", @@ -2147,7 +2147,7 @@ }, { "kind": "DojoContract", - "address": "0x1c6c32fc58a703d08ba0080ebf840e9c8021e86c37b239d28ce1a4576709ddc", + "address": "0x4de3cf22c1348202eaf06464aa308d1cbe8e6fea755ce4f0598a00d0e860886", "class_hash": "0x647fc1b2d2e902e6304e127b36995d8f57fe45c38e38e15d8860db508dbf24a", "original_class_hash": "0x647fc1b2d2e902e6304e127b36995d8f57fe45c38e38e15d8860db508dbf24a", "base_class_hash": "0x2427dd10a58850ac9a5ca6ce04b7771b05330fd18f2e481831ad903b969e6b2", @@ -4159,8 +4159,8 @@ "key": false } ], - "class_hash": "0x61fa996f7cf8412bb5aca7d4bd4fd9eca806a92e5007e87d23f638b6774ed40", - "original_class_hash": "0x61fa996f7cf8412bb5aca7d4bd4fd9eca806a92e5007e87d23f638b6774ed40", + "class_hash": "0x2bfdf50f9ec0670b52065947e6ce2e1ebb39d54d19da1b65411b6d58bb04e79", + "original_class_hash": "0x2bfdf50f9ec0670b52065947e6ce2e1ebb39d54d19da1b65411b6d58bb04e79", "abi": [ { "type": "impl", diff --git a/examples/spawn-and-move/manifests/dev/deployment/manifest.toml b/examples/spawn-and-move/manifests/dev/deployment/manifest.toml index 064976b859..abfba40d43 100644 --- a/examples/spawn-and-move/manifests/dev/deployment/manifest.toml +++ b/examples/spawn-and-move/manifests/dev/deployment/manifest.toml @@ -1,10 +1,10 @@ [world] kind = "WorldContract" -class_hash = "0x2178527e9556d1aa21d3c2961d28f9114fcfed81b4c3674ed591c50ce46cc9d" -original_class_hash = "0x2178527e9556d1aa21d3c2961d28f9114fcfed81b4c3674ed591c50ce46cc9d" +class_hash = "0x14287624e97e0312d4e680e19071efce983810e909b32afc54cd9c8031f4c1c" +original_class_hash = "0x14287624e97e0312d4e680e19071efce983810e909b32afc54cd9c8031f4c1c" abi = "manifests/dev/deployment/abis/dojo-world.json" -address = "0x25e74888e786245ec7aa93d846b2cc9e4b49a5244209860bbf4b384f654521b" -transaction_hash = "0x1606f5a86180d90027d33915cf0d62e117f778f8837df3c1375af3d3bc2951e" +address = "0x2f6f0512832a8820173edb8e1adac28b7edc78bb3b6f038614adf4377b694c5" +transaction_hash = "0x22c5e928ee07543e0eef5aae78ded9902d7d8647f76d46d743be2f2661ebab7" block_number = 3 seed = "dojo_examples" manifest_name = "dojo-world" @@ -23,9 +23,9 @@ manifest_name = "dojo-base" [[contracts]] kind = "DojoContract" -address = "0x24d926d75cd84104c3bd24f0f79e95c273d6a99ed449f3c8b83114857020332" -class_hash = "0x2a8de224c28cae3049e23b352e7fce6f26cc99884331e5f2a6aea261398a27a" -original_class_hash = "0x2a8de224c28cae3049e23b352e7fce6f26cc99884331e5f2a6aea261398a27a" +address = "0x66221f204a50d51e28d03bc1578bc1845371cd0f0932666b507cd9721c183ec" +class_hash = "0xc0a5037a6fdc0b374b270ca5e9f3bd76200d73d01f409749b7006b3cd6c03d" +original_class_hash = "0xc0a5037a6fdc0b374b270ca5e9f3bd76200d73d01f409749b7006b3cd6c03d" base_class_hash = "0x2427dd10a58850ac9a5ca6ce04b7771b05330fd18f2e481831ad903b969e6b2" abi = "manifests/dev/deployment/abis/contracts/dojo_examples-actions-40b6994c.json" reads = [] @@ -40,7 +40,7 @@ manifest_name = "dojo_examples-actions-40b6994c" [[contracts]] kind = "DojoContract" -address = "0x31a348061c348eb84d7d9f1658244432170822cdb1a97a586805b565c168bcf" +address = "0x71e9522f412f3458a3508d0449f8f3a4e1662da382c86393b3abb193d2968b5" class_hash = "0x45ad5a298db270a9c3ee439b7a7a008e3219b70937cfaa144589866442f3908" original_class_hash = "0x45ad5a298db270a9c3ee439b7a7a008e3219b70937cfaa144589866442f3908" base_class_hash = "0x2427dd10a58850ac9a5ca6ce04b7771b05330fd18f2e481831ad903b969e6b2" @@ -54,7 +54,7 @@ manifest_name = "dojo_examples-dungeon-6620e0e6" [[contracts]] kind = "DojoContract" -address = "0x4aee4238ae328cfe7ad116057e3e9ef083b75f13c1914a8f93ef32549ebe808" +address = "0x33a28bd8c06940892f49b8d9211ddc5165ec9316087c1fa563e56152f95d429" class_hash = "0x3daab1621bba5f43f0d84f8f68ee7a5dfa4d83f98f746e2e9dcd3a848233e35" original_class_hash = "0x3daab1621bba5f43f0d84f8f68ee7a5dfa4d83f98f746e2e9dcd3a848233e35" base_class_hash = "0x2427dd10a58850ac9a5ca6ce04b7771b05330fd18f2e481831ad903b969e6b2" @@ -68,7 +68,7 @@ manifest_name = "dojo_examples-mock_token-31599eb2" [[contracts]] kind = "DojoContract" -address = "0x1c6c32fc58a703d08ba0080ebf840e9c8021e86c37b239d28ce1a4576709ddc" +address = "0x4de3cf22c1348202eaf06464aa308d1cbe8e6fea755ce4f0598a00d0e860886" class_hash = "0x647fc1b2d2e902e6304e127b36995d8f57fe45c38e38e15d8860db508dbf24a" original_class_hash = "0x647fc1b2d2e902e6304e127b36995d8f57fe45c38e38e15d8860db508dbf24a" base_class_hash = "0x2427dd10a58850ac9a5ca6ce04b7771b05330fd18f2e481831ad903b969e6b2" @@ -173,8 +173,8 @@ key = false [[models]] kind = "DojoModel" -class_hash = "0x61fa996f7cf8412bb5aca7d4bd4fd9eca806a92e5007e87d23f638b6774ed40" -original_class_hash = "0x61fa996f7cf8412bb5aca7d4bd4fd9eca806a92e5007e87d23f638b6774ed40" +class_hash = "0x2bfdf50f9ec0670b52065947e6ce2e1ebb39d54d19da1b65411b6d58bb04e79" +original_class_hash = "0x2bfdf50f9ec0670b52065947e6ce2e1ebb39d54d19da1b65411b6d58bb04e79" abi = "manifests/dev/deployment/abis/models/dojo_examples-Moves-2e2accba.json" tag = "dojo_examples-Moves" manifest_name = "dojo_examples-Moves-2e2accba" diff --git a/examples/spawn-and-move/manifests/release/base/contracts/dojo_examples-actions-40b6994c.toml b/examples/spawn-and-move/manifests/release/base/contracts/dojo_examples-actions-40b6994c.toml index a12c96a2e4..2392bc9866 100644 --- a/examples/spawn-and-move/manifests/release/base/contracts/dojo_examples-actions-40b6994c.toml +++ b/examples/spawn-and-move/manifests/release/base/contracts/dojo_examples-actions-40b6994c.toml @@ -1,6 +1,6 @@ kind = "DojoContract" -class_hash = "0x2a8de224c28cae3049e23b352e7fce6f26cc99884331e5f2a6aea261398a27a" -original_class_hash = "0x2a8de224c28cae3049e23b352e7fce6f26cc99884331e5f2a6aea261398a27a" +class_hash = "0xc0a5037a6fdc0b374b270ca5e9f3bd76200d73d01f409749b7006b3cd6c03d" +original_class_hash = "0xc0a5037a6fdc0b374b270ca5e9f3bd76200d73d01f409749b7006b3cd6c03d" base_class_hash = "0x0" abi = "manifests/release/base/abis/contracts/dojo_examples-actions-40b6994c.json" reads = [] diff --git a/examples/spawn-and-move/manifests/release/base/dojo-world.toml b/examples/spawn-and-move/manifests/release/base/dojo-world.toml index cc1f0eda6a..f00a10eef7 100644 --- a/examples/spawn-and-move/manifests/release/base/dojo-world.toml +++ b/examples/spawn-and-move/manifests/release/base/dojo-world.toml @@ -1,6 +1,6 @@ kind = "Class" -class_hash = "0x2178527e9556d1aa21d3c2961d28f9114fcfed81b4c3674ed591c50ce46cc9d" -original_class_hash = "0x2178527e9556d1aa21d3c2961d28f9114fcfed81b4c3674ed591c50ce46cc9d" +class_hash = "0x14287624e97e0312d4e680e19071efce983810e909b32afc54cd9c8031f4c1c" +original_class_hash = "0x14287624e97e0312d4e680e19071efce983810e909b32afc54cd9c8031f4c1c" abi = "manifests/release/base/abis/dojo-world.json" tag = "dojo-world" manifest_name = "dojo-world" diff --git a/examples/spawn-and-move/manifests/release/base/models/dojo_examples-Moves-2e2accba.toml b/examples/spawn-and-move/manifests/release/base/models/dojo_examples-Moves-2e2accba.toml index a633e865bf..4642d2d1b9 100644 --- a/examples/spawn-and-move/manifests/release/base/models/dojo_examples-Moves-2e2accba.toml +++ b/examples/spawn-and-move/manifests/release/base/models/dojo_examples-Moves-2e2accba.toml @@ -1,6 +1,6 @@ kind = "DojoModel" -class_hash = "0x61fa996f7cf8412bb5aca7d4bd4fd9eca806a92e5007e87d23f638b6774ed40" -original_class_hash = "0x61fa996f7cf8412bb5aca7d4bd4fd9eca806a92e5007e87d23f638b6774ed40" +class_hash = "0x2bfdf50f9ec0670b52065947e6ce2e1ebb39d54d19da1b65411b6d58bb04e79" +original_class_hash = "0x2bfdf50f9ec0670b52065947e6ce2e1ebb39d54d19da1b65411b6d58bb04e79" abi = "manifests/release/base/abis/models/dojo_examples-Moves-2e2accba.json" tag = "dojo_examples-Moves" manifest_name = "dojo_examples-Moves-2e2accba" diff --git a/rust-toolchain.toml b/rust-toolchain.toml index 628740b12f..4d2dee853e 100644 --- a/rust-toolchain.toml +++ b/rust-toolchain.toml @@ -1,2 +1,2 @@ [toolchain] -channel = "1.79.0" +channel = "1.80.0" diff --git a/scripts/clippy.sh b/scripts/clippy.sh index c3e1a2e3d1..9fe1fb49d2 100755 --- a/scripts/clippy.sh +++ b/scripts/clippy.sh @@ -8,7 +8,7 @@ set -x set -o pipefail run_clippy() { - cargo clippy --all-targets "$@" -- -D warnings -D future-incompatible -D nonstandard-style -D rust-2018-idioms -D unused -D missing-debug-implementations + cargo +nightly clippy --all-targets "$@" -- -D warnings -D future-incompatible -D nonstandard-style -D rust-2018-idioms -D unused -D missing-debug-implementations } run_clippy --all-features --workspace --exclude katana --exclude katana-executor From bd5b146fb9d39e0878bae8340f218b08d94aa026 Mon Sep 17 00:00:00 2001 From: Ammar Arif Date: Tue, 6 Aug 2024 02:40:26 +0800 Subject: [PATCH 06/10] katana: database metrics (#2258) --- Cargo.lock | 6 +- bin/katana/Cargo.toml | 3 +- bin/katana/src/cli/node.rs | 15 +- bin/torii/src/main.rs | 1 + crates/dojo-test-utils/src/sequencer.rs | 1 + crates/katana/core/src/backend/mod.rs | 4 +- crates/katana/core/src/backend/storage.rs | 16 +- crates/katana/node/Cargo.toml | 2 + crates/katana/node/src/lib.rs | 32 +- crates/katana/rpc/rpc/src/config.rs | 3 + crates/katana/storage/db/Cargo.toml | 6 +- crates/katana/storage/db/src/mdbx/mod.rs | 61 +- crates/metrics/src/lib.rs | 8 + crates/metrics/src/prometheus_exporter.rs | 12 +- monitoring/grafana/katana.json | 3015 +++++++++++++-------- 15 files changed, 1977 insertions(+), 1208 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index c6b78eec2b..fe58f736fe 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -7758,7 +7758,6 @@ dependencies = [ "comfy-table", "common 1.0.0-alpha.4", "console", - "dojo-metrics", "katana-core", "katana-db", "katana-node", @@ -7851,7 +7850,9 @@ version = "1.0.0-alpha.4" dependencies = [ "anyhow", "criterion", + "dojo-metrics", "katana-primitives", + "metrics", "page_size", "parking_lot 0.12.3", "postcard", @@ -7862,6 +7863,7 @@ dependencies = [ "starknet 0.11.0", "tempfile", "thiserror", + "tracing", ] [[package]] @@ -7895,9 +7897,11 @@ name = "katana-node" version = "1.0.0-alpha.4" dependencies = [ "anyhow", + "dojo-metrics", "hyper 0.14.30", "jsonrpsee 0.16.3", "katana-core", + "katana-db", "katana-executor", "katana-primitives", "katana-provider", diff --git a/bin/katana/Cargo.toml b/bin/katana/Cargo.toml index be674483c8..707472b16f 100644 --- a/bin/katana/Cargo.toml +++ b/bin/katana/Cargo.toml @@ -21,7 +21,6 @@ clap.workspace = true clap_complete.workspace = true common.workspace = true console.workspace = true -dojo-metrics.workspace = true serde_json.workspace = true shellexpand = "3.1.0" tokio.workspace = true @@ -37,7 +36,7 @@ assert_matches.workspace = true [features] default = [ "jemalloc", "messaging", "slot" ] -jemalloc = [ "dojo-metrics/jemalloc" ] +jemalloc = [] messaging = [ "katana-node/messaging" ] slot = [ "dep:katana-slot-controller", "katana-primitives/slot" ] starknet-messaging = [ "katana-node/starknet-messaging" ] diff --git a/bin/katana/src/cli/node.rs b/bin/katana/src/cli/node.rs index a014551897..1cbb001db9 100644 --- a/bin/katana/src/cli/node.rs +++ b/bin/katana/src/cli/node.rs @@ -18,7 +18,6 @@ use anyhow::{Context, Result}; use clap::{Args, Parser}; use common::parse::parse_socket_address; use console::Style; -use dojo_metrics::{metrics_process, prometheus_exporter}; use katana_core::backend::config::{Environment, StarknetConfig}; use katana_core::constants::{ DEFAULT_ETH_L1_GAS_PRICE, DEFAULT_INVOKE_MAX_STEPS, DEFAULT_SEQUENCER_ADDRESS, @@ -226,19 +225,6 @@ impl NodeArgs { let sequencer_config = self.sequencer_config(); let starknet_config = self.starknet_config()?; - // TODO: move to katana-node - if let Some(listen_addr) = self.metrics { - let prometheus_handle = prometheus_exporter::install_recorder("katana")?; - - info!(target: LOG_TARGET, addr = %listen_addr, "Starting metrics endpoint."); - prometheus_exporter::serve( - listen_addr, - prometheus_handle, - metrics_process::Collector::default(), - ) - .await?; - } - // build the node and start it let (rpc_handle, backend) = katana_node::start(server_config, sequencer_config, starknet_config).await?; @@ -293,6 +279,7 @@ impl NodeArgs { ServerConfig { apis, + metrics: self.metrics, port: self.server.port, host: self.server.host.clone().unwrap_or("0.0.0.0".into()), max_connections: self.server.max_connections, diff --git a/bin/torii/src/main.rs b/bin/torii/src/main.rs index d9035fc612..9c33114056 100644 --- a/bin/torii/src/main.rs +++ b/bin/torii/src/main.rs @@ -249,6 +249,7 @@ async fn main() -> anyhow::Result<()> { listen_addr, prometheus_handle, metrics_process::Collector::default(), + Vec::new(), ) .await?; } diff --git a/crates/dojo-test-utils/src/sequencer.rs b/crates/dojo-test-utils/src/sequencer.rs index 398f652b90..334eab9a08 100644 --- a/crates/dojo-test-utils/src/sequencer.rs +++ b/crates/dojo-test-utils/src/sequencer.rs @@ -38,6 +38,7 @@ impl TestSequencer { pub async fn start(config: SequencerConfig, starknet_config: StarknetConfig) -> Self { let server_config = ServerConfig { port: 0, + metrics: None, host: "127.0.0.1".into(), max_connections: 100, allowed_origins: None, diff --git a/crates/katana/core/src/backend/mod.rs b/crates/katana/core/src/backend/mod.rs index b7d096298c..05d352e247 100644 --- a/crates/katana/core/src/backend/mod.rs +++ b/crates/katana/core/src/backend/mod.rs @@ -104,8 +104,8 @@ impl Backend { config.env.chain_id = forked_chain_id.into(); blockchain } else if let Some(db_path) = &config.db_dir { - Blockchain::new_with_db(db_path, &config.genesis) - .expect("able to create blockchain from db") + let db = katana_db::init_db(db_path).expect("failed to initialize db"); + Blockchain::new_with_db(db, &config.genesis).expect("able to create blockchain from db") } else { Blockchain::new_with_genesis(InMemoryProvider::new(), &config.genesis) .expect("able to create blockchain from genesis block") diff --git a/crates/katana/core/src/backend/storage.rs b/crates/katana/core/src/backend/storage.rs index 29060bfae6..031e5c865f 100644 --- a/crates/katana/core/src/backend/storage.rs +++ b/crates/katana/core/src/backend/storage.rs @@ -1,7 +1,5 @@ -use std::path::Path; - use anyhow::{anyhow, Result}; -use katana_db::init_db; +use katana_db::mdbx::DbEnv; use katana_primitives::block::{BlockHash, FinalityStatus, SealedBlockWithStatus}; use katana_primitives::genesis::Genesis; use katana_primitives::state::StateUpdatesWithDeclaredClasses; @@ -98,10 +96,8 @@ impl Blockchain { } /// Creates a new [Blockchain] from a database at `path` and `genesis` state. - pub fn new_with_db(db_path: impl AsRef, genesis: &Genesis) -> Result { - let db = init_db(db_path)?; - let provider = DbProvider::new(db); - Self::new_with_genesis(provider, genesis) + pub fn new_with_db(db: DbEnv, genesis: &Genesis) -> Result { + Self::new_with_genesis(DbProvider::new(db), genesis) } /// Builds a new blockchain with a forked block. @@ -251,7 +247,8 @@ mod tests { let genesis = Genesis::default(); { - let blockchain = Blockchain::new_with_db(&db_path, &genesis) + let db = katana_db::init_db(&db_path).expect("Failed to init database"); + let blockchain = Blockchain::new_with_db(db, &genesis) .expect("Failed to create db-backed blockchain storage"); blockchain @@ -297,7 +294,8 @@ mod tests { // re open the db and assert the state is the same and not overwritten { - let blockchain = Blockchain::new_with_db(&db_path, &genesis) + let db = katana_db::init_db(db_path).expect("Failed to init database"); + let blockchain = Blockchain::new_with_db(db, &genesis) .expect("Failed to create db-backed blockchain storage"); // assert genesis state is correct diff --git a/crates/katana/node/Cargo.toml b/crates/katana/node/Cargo.toml index dd99f0802e..d148211cf3 100644 --- a/crates/katana/node/Cargo.toml +++ b/crates/katana/node/Cargo.toml @@ -7,6 +7,7 @@ version.workspace = true [dependencies] katana-core.workspace = true +katana-db.workspace = true katana-executor.workspace = true katana-primitives.workspace = true katana-provider.workspace = true @@ -14,6 +15,7 @@ katana-rpc.workspace = true katana-rpc-api.workspace = true anyhow.workspace = true +dojo-metrics.workspace = true hyper.workspace = true jsonrpsee.workspace = true num-traits.workspace = true diff --git a/crates/katana/node/src/lib.rs b/crates/katana/node/src/lib.rs index c13ae512c1..a0b2dab737 100644 --- a/crates/katana/node/src/lib.rs +++ b/crates/katana/node/src/lib.rs @@ -5,6 +5,7 @@ use std::sync::Arc; use std::time::Duration; use anyhow::Result; +use dojo_metrics::{metrics_process, prometheus_exporter, Report}; use hyper::{Method, Uri}; use jsonrpsee::server::middleware::proxy_get_request::ProxyGetRequestLayer; use jsonrpsee::server::{AllowHosts, ServerBuilder, ServerHandle}; @@ -46,7 +47,7 @@ use starknet::core::utils::parse_cairo_short_string; use starknet::providers::jsonrpc::HttpTransport; use starknet::providers::{JsonRpcClient, Provider}; use tower_http::cors::{AllowOrigin, CorsLayer}; -use tracing::trace; +use tracing::{info, trace}; /// Build the core Katana components from the given configurations and start running the node. // TODO: placeholder until we implement a dedicated class that encapsulate building the node @@ -86,7 +87,7 @@ pub async fn start( // --- build backend - let blockchain = if let Some(forked_url) = &starknet_config.fork_rpc_url { + let (blockchain, db) = if let Some(forked_url) = &starknet_config.fork_rpc_url { let provider = Arc::new(JsonRpcClient::new(HttpTransport::new(forked_url.clone()))); let forked_chain_id = provider.chain_id().await.unwrap(); @@ -132,11 +133,13 @@ pub async fn start( )?; starknet_config.env.chain_id = forked_chain_id.into(); - blockchain + + (blockchain, None) } else if let Some(db_path) = &starknet_config.db_dir { - Blockchain::new_with_db(db_path, &starknet_config.genesis)? + let db = katana_db::init_db(db_path)?; + (Blockchain::new_with_db(db.clone(), &starknet_config.genesis)?, Some(db)) } else { - Blockchain::new_with_genesis(InMemoryProvider::new(), &starknet_config.genesis)? + (Blockchain::new_with_genesis(InMemoryProvider::new(), &starknet_config.genesis)?, None) }; let chain_id = starknet_config.env.chain_id; @@ -166,6 +169,25 @@ pub async fn start( BlockProducer::instant(Arc::clone(&backend)) }; + // --- build metrics service + + // Metrics recorder must be initialized before calling any of the metrics macros, in order for + // it to be registered. + if let Some(addr) = server_config.metrics { + let prometheus_handle = prometheus_exporter::install_recorder("katana")?; + let db = db.unwrap(); + + prometheus_exporter::serve( + addr, + prometheus_handle, + metrics_process::Collector::default(), + vec![Box::new(db) as Box], + ) + .await?; + + info!(%addr, "Metrics endpoint started."); + } + // --- build messaging service #[cfg(feature = "messaging")] diff --git a/crates/katana/rpc/rpc/src/config.rs b/crates/katana/rpc/rpc/src/config.rs index 5a88af1bb9..ac7cd0b822 100644 --- a/crates/katana/rpc/rpc/src/config.rs +++ b/crates/katana/rpc/rpc/src/config.rs @@ -1,3 +1,5 @@ +use std::net::SocketAddr; + use katana_rpc_api::ApiKind; #[derive(Debug, Clone)] @@ -7,6 +9,7 @@ pub struct ServerConfig { pub max_connections: u32, pub allowed_origins: Option>, pub apis: Vec, + pub metrics: Option, } impl ServerConfig { diff --git a/crates/katana/storage/db/Cargo.toml b/crates/katana/storage/db/Cargo.toml index a5d7d32508..ce6aaf883b 100644 --- a/crates/katana/storage/db/Cargo.toml +++ b/crates/katana/storage/db/Cargo.toml @@ -10,14 +10,16 @@ version.workspace = true katana-primitives = { workspace = true } anyhow.workspace = true +dojo-metrics.workspace = true +metrics.workspace = true page_size = "0.6.0" parking_lot.workspace = true +roaring = { version = "0.10.3", features = [ "serde" ] } serde.workspace = true serde_json.workspace = true tempfile = { workspace = true, optional = true } thiserror.workspace = true - -roaring = { version = "0.10.3", features = [ "serde" ] } +tracing.workspace = true # codecs [dependencies.postcard] diff --git a/crates/katana/storage/db/src/mdbx/mod.rs b/crates/katana/storage/db/src/mdbx/mod.rs index ea9b2d2a67..9948f506b3 100644 --- a/crates/katana/storage/db/src/mdbx/mod.rs +++ b/crates/katana/storage/db/src/mdbx/mod.rs @@ -9,8 +9,11 @@ pub mod tx; use std::collections::HashMap; use std::path::Path; +use dojo_metrics::metrics::gauge; pub use libmdbx; use libmdbx::{DatabaseFlags, EnvironmentFlags, Geometry, Mode, PageSize, SyncMode, RO, RW}; +use metrics::{describe_gauge, Label}; +use tracing::error; use self::stats::{Stats, TableStat}; use self::tx::Tx; @@ -35,7 +38,7 @@ pub enum DbEnvKind { } /// Wrapper for `libmdbx-sys` environment. -#[derive(Debug)] +#[derive(Debug, Clone)] pub struct DbEnv(libmdbx::Environment); impl DbEnv { @@ -70,7 +73,7 @@ impl DbEnv { }) .set_max_readers(DEFAULT_MAX_READERS); - Ok(DbEnv(builder.open(path.as_ref()).map_err(DatabaseError::OpenEnv)?)) + Ok(DbEnv(builder.open(path.as_ref()).map_err(DatabaseError::OpenEnv)?).with_metrics()) } /// Creates all the defined tables in [`Tables`], if necessary. @@ -90,6 +93,14 @@ impl DbEnv { Ok(()) } + + fn with_metrics(self) -> Self { + describe_gauge!("db.table_size", metrics::Unit::Bytes, "Total size of the table"); + describe_gauge!("db.table_pages", metrics::Unit::Count, "Number of pages in the table"); + describe_gauge!("db.table_entries", metrics::Unit::Count, "Number of entries in the table"); + describe_gauge!("db.freelist", metrics::Unit::Bytes, "Size of the database freelist"); + self + } } impl Database for DbEnv { @@ -122,6 +133,52 @@ impl Database for DbEnv { } } +impl dojo_metrics::Report for DbEnv { + fn report(&self) { + match self.stats() { + Ok(stats) => { + let mut pgsize = 0; + + for (table, stat) in stats.table_stats() { + gauge!("db.table_size", vec![Label::new("table", *table)]) + .set(stat.total_size() as f64); + + gauge!( + "db.table_pages", + vec![Label::new("table", *table), Label::new("type", "leaf")] + ) + .set(stat.leaf_pages() as f64); + + gauge!( + "db.table_pages", + vec![Label::new("table", *table), Label::new("type", "branch")] + ) + .set(stat.branch_pages() as f64); + + gauge!( + "db.table_pages", + vec![Label::new("table", *table), Label::new("type", "overflow")] + ) + .set(stat.overflow_pages() as f64); + + gauge!("db.table_entries", vec![Label::new("table", *table)]) + .set(stat.entries() as f64); + + if pgsize == 0 { + pgsize = stat.page_size() as usize; + } + } + + gauge!("db.freelist").set((stats.freelist() * pgsize) as f64); + } + + Err(error) => { + error!(%error, "Failed to read database stats."); + } + } + } +} + #[cfg(any(test, feature = "test-utils"))] pub mod test_utils { use std::path::Path; diff --git a/crates/metrics/src/lib.rs b/crates/metrics/src/lib.rs index 4a3a43cea9..c9dc3209a1 100644 --- a/crates/metrics/src/lib.rs +++ b/crates/metrics/src/lib.rs @@ -13,3 +13,11 @@ pub use reth_metrics_derive::Metrics; #[cfg(all(feature = "jemalloc", unix))] #[global_allocator] static ALLOC: jemallocator::Jemalloc = jemallocator::Jemalloc; + +/// A helper trait for reporting metrics. +/// +/// This is meant for types that require a specific trigger to register their metrics. +pub trait Report: Send + Sync { + /// Report the metrics. + fn report(&self); +} diff --git a/crates/metrics/src/prometheus_exporter.rs b/crates/metrics/src/prometheus_exporter.rs index 17a170f0e4..a84f9a9e55 100644 --- a/crates/metrics/src/prometheus_exporter.rs +++ b/crates/metrics/src/prometheus_exporter.rs @@ -12,6 +12,8 @@ use metrics::{describe_gauge, gauge}; use metrics_exporter_prometheus::{PrometheusBuilder, PrometheusHandle}; use metrics_util::layers::{PrefixLayer, Stack}; +use crate::Report; + pub(crate) const LOG_TARGET: &str = "metrics::prometheus_exporter"; pub(crate) trait Hook: Fn() + Send + Sync {} @@ -39,11 +41,19 @@ pub async fn serve( listen_addr: SocketAddr, handle: PrometheusHandle, process: metrics_process::Collector, + reports: Vec>, ) -> Result<()> { // Clone `process` to move it into the hook and use the original `process` for describe below. let cloned_process = process.clone(); - let hooks: Vec>> = + + let mut hooks: Vec>> = vec![Box::new(move || cloned_process.collect()), Box::new(collect_memory_stats)]; + + let report_hooks = + reports.into_iter().map(|r| Box::new(move || r.report()) as Box>); + + hooks.extend(report_hooks); + serve_with_hooks(listen_addr, handle, hooks).await?; process.describe(); diff --git a/monitoring/grafana/katana.json b/monitoring/grafana/katana.json index 1e85a36de3..db272bae15 100644 --- a/monitoring/grafana/katana.json +++ b/monitoring/grafana/katana.json @@ -1,1171 +1,1846 @@ { - "annotations": { - "list": [ - { - "builtIn": 1, - "datasource": { - "type": "grafana", - "uid": "-- Grafana --" - }, - "enable": true, - "hide": true, - "iconColor": "rgba(0, 211, 255, 1)", - "name": "Annotations & Alerts", - "target": { - "limit": 100, - "matchAny": false, - "tags": [], - "type": "dashboard" - }, - "type": "dashboard" - } - ] - }, - "editable": true, - "fiscalYearStartMonth": 0, - "graphTooltip": 0, - "id": 2, - "links": [], - "liveNow": false, - "panels": [ - { - "collapsed": false, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 0 - }, - "id": 122, - "panels": [], - "title": "Execution", - "type": "row" - }, - { - "datasource": { - "type": "prometheus", - "uid": "cdh4g2kxwgx6od" - }, - "description": "The total amount of L1 gas that has been processed", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "Total gas", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "smooth", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 1 - }, - "id": 121, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "mode": "single", - "sort": "none" - } - }, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "cdh4g2kxwgx6od" - }, - "disableTextWrap": false, - "editorMode": "builder", - "expr": "katana_block_producer_l1_gas_processed_total{instance=\"localhost:9100\"}", - "fullMetaSearch": false, - "includeNullMetadata": true, - "instant": false, - "legendFormat": "__auto", - "range": true, - "refId": "A", - "useBackend": false - } - ], - "title": "L1 Gas Processed", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "cdh4g2kxwgx6od" - }, - "description": "The total amount of Cairo steps that has been processed", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "Total steps", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "smooth", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 1 - }, - "id": 123, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "mode": "single", - "sort": "none" - } - }, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "cdh4g2kxwgx6od" - }, - "disableTextWrap": false, - "editorMode": "builder", - "expr": "katana_block_producer_cairo_steps_processed_total{instance=\"localhost:9100\"}", - "fullMetaSearch": false, - "includeNullMetadata": true, - "instant": false, - "legendFormat": "__auto", - "range": true, - "refId": "A", - "useBackend": false - } - ], - "title": "Cairo Steps Processed", - "type": "timeseries" - }, - { - "collapsed": false, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 9 - }, - "id": 108, - "panels": [], - "title": "RPC Server", - "type": "row" - }, - { - "datasource": { - "type": "prometheus", - "uid": "cdh4g2kxwgx6od" - }, - "description": "", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 10, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "short" - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "http" - }, - "properties": [ - { - "id": "displayName", - "value": "HTTP" - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "ws" - }, - "properties": [ - { - "id": "displayName", - "value": "WebSocket" - } - ] - } - ] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 10 - }, - "id": 109, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "multi", - "sort": "none" - } - }, - "pluginVersion": "10.1.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "cdh4g2kxwgx6od" - }, - "disableTextWrap": false, - "editorMode": "code", - "expr": "sum(katana_rpc_server_connections_connections_opened{instance=~\"$instance\"} - katana_rpc_server_connections_connections_closed{instance=~\"$instance\"}) by (transport)", - "format": "time_series", - "fullMetaSearch": false, - "includeNullMetadata": true, - "legendFormat": "{{transport}}", - "range": true, - "refId": "A", - "useBackend": false - } - ], - "title": "Active Connections", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "cdh4g2kxwgx6od" - }, - "description": "", - "fieldConfig": { - "defaults": { - "custom": { - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "scaleDistribution": { - "type": "linear" - } - } - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 10 - }, - "id": 111, - "maxDataPoints": 25, - "options": { - "calculate": false, - "cellGap": 1, - "cellValues": { - "unit": "s" - }, - "color": { - "exponent": 0.2, - "fill": "dark-orange", - "min": 0, - "mode": "opacity", - "reverse": false, - "scale": "exponential", - "scheme": "Oranges", - "steps": 128 - }, - "exemplars": { - "color": "rgba(255,0,255,0.7)" - }, - "filterValues": { - "le": 1e-9 - }, - "legend": { - "show": true - }, - "rowsFrame": { - "layout": "auto", - "value": "Latency time" - }, - "tooltip": { - "mode": "single", - "showColorScale": false, - "yHistogram": false - }, - "yAxis": { - "axisLabel": "Quantile", - "axisPlacement": "left", - "reverse": false, - "unit": "percentunit" - } - }, - "pluginVersion": "10.4.1", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "cdh4g2kxwgx6od" - }, - "editorMode": "code", - "exemplar": false, - "expr": "avg(max_over_time(katana_rpc_server_connections_request_time_seconds{instance=~\"$instance\"}[$__rate_interval]) > 0) by (quantile)", - "format": "time_series", - "instant": false, - "legendFormat": "__auto", - "range": true, - "refId": "A" - } - ], - "title": "Request Latency time", - "type": "heatmap" - }, - { - "datasource": { - "type": "prometheus", - "uid": "cdh4g2kxwgx6od" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "points", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "s" - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 18 - }, - "id": 120, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "single", - "sort": "none" - } - }, - "pluginVersion": "10.1.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "cdh4g2kxwgx6od" - }, - "editorMode": "code", - "expr": "max(max_over_time(katana_rpc_server_calls_time_seconds[$__rate_interval])) by (method) > 0", - "instant": false, - "legendFormat": "__auto", - "range": true, - "refId": "A" - } - ], - "title": "Maximum call latency per method", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "cdh4g2kxwgx6od" - }, - "description": "", - "fieldConfig": { - "defaults": { - "custom": { - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "scaleDistribution": { - "type": "linear" - } - } - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 18 - }, - "id": 112, - "maxDataPoints": 25, - "options": { - "calculate": false, - "cellGap": 1, - "cellValues": { - "unit": "s" - }, - "color": { - "exponent": 0.2, - "fill": "dark-orange", - "min": 0, - "mode": "opacity", - "reverse": false, - "scale": "exponential", - "scheme": "Oranges", - "steps": 128 - }, - "exemplars": { - "color": "rgba(255,0,255,0.7)" - }, - "filterValues": { - "le": 1e-9 - }, - "legend": { - "show": true - }, - "rowsFrame": { - "layout": "auto", - "value": "Latency time" - }, - "tooltip": { - "mode": "single", - "showColorScale": false, - "yHistogram": false - }, - "yAxis": { - "axisLabel": "Quantile", - "axisPlacement": "left", - "reverse": false, - "unit": "percentunit" - } - }, - "pluginVersion": "10.4.1", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "cdh4g2kxwgx6od" - }, - "editorMode": "code", - "exemplar": false, - "expr": "avg(max_over_time(katana_rpc_server_calls_time_seconds{instance=~\"$instance\"}[$__rate_interval]) > 0) by (quantile)", - "format": "time_series", - "instant": false, - "legendFormat": "{{quantile}}", - "range": true, - "refId": "A" - } - ], - "title": "Call Latency time", - "type": "heatmap" - }, - { - "collapsed": false, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 26 - }, - "id": 97, - "panels": [], - "title": "Process", - "type": "row" - }, - { - "datasource": { - "type": "prometheus", - "uid": "cdh4g2kxwgx6od" - }, - "description": "100% = 1 core", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "percentunit" - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 27 - }, - "id": 99, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "single", - "sort": "none" - } - }, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "cdh4g2kxwgx6od" - }, - "editorMode": "builder", - "expr": "avg(rate(katana_process_cpu_seconds_total{instance=~\"$instance\"}[1m]))", - "instant": false, - "legendFormat": "Process", - "range": true, - "refId": "A" - } - ], - "title": "CPU", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "cdh4g2kxwgx6od" - }, - "description": "", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "decbytes" - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 27 - }, - "id": 101, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "single", - "sort": "none" - } - }, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "cdh4g2kxwgx6od" - }, - "editorMode": "code", - "expr": "katana_process_resident_memory_bytes{instance=~\"$instance\"}", - "instant": false, - "legendFormat": "Resident", - "range": true, - "refId": "A" - } - ], - "title": "Memory", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "cdh4g2kxwgx6od" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "decbytes" - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 35 - }, - "id": 98, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "single", - "sort": "none" - } - }, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "cdh4g2kxwgx6od" - }, - "editorMode": "builder", - "expr": "katana_jemalloc_active{instance=~\"$instance\"}", - "instant": false, - "legendFormat": "Active", - "range": true, - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "cdh4g2kxwgx6od" - }, - "editorMode": "builder", - "expr": "katana_jemalloc_allocated{instance=~\"$instance\"}", - "hide": false, - "instant": false, - "legendFormat": "Allocated", - "range": true, - "refId": "B" - }, - { - "datasource": { - "type": "prometheus", - "uid": "cdh4g2kxwgx6od" - }, - "editorMode": "builder", - "expr": "katana_jemalloc_mapped{instance=~\"$instance\"}", - "hide": false, - "instant": false, - "legendFormat": "Mapped", - "range": true, - "refId": "C" - }, - { - "datasource": { - "type": "prometheus", - "uid": "cdh4g2kxwgx6od" - }, - "editorMode": "builder", - "expr": "katana_jemalloc_metadata{instance=~\"$instance\"}", - "hide": false, - "instant": false, - "legendFormat": "Metadata", - "range": true, - "refId": "D" - }, - { - "datasource": { - "type": "prometheus", - "uid": "cdh4g2kxwgx6od" - }, - "editorMode": "builder", - "expr": "katana_jemalloc_resident{instance=~\"$instance\"}", - "hide": false, - "instant": false, - "legendFormat": "Resident", - "range": true, - "refId": "E" - }, - { - "datasource": { - "type": "prometheus", - "uid": "cdh4g2kxwgx6od" - }, - "editorMode": "builder", - "expr": "katana_jemalloc_retained{instance=~\"$instance\"}", - "hide": false, - "instant": false, - "legendFormat": "Retained", - "range": true, - "refId": "F" - } - ], - "title": "Jemalloc Memory", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "cdh4g2kxwgx6od" - }, - "description": "", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "none" - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 35 - }, - "id": 100, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "single", - "sort": "none" - } - }, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "cdh4g2kxwgx6od" - }, - "editorMode": "builder", - "expr": "katana_process_open_fds{instance=~\"$instance\"}", - "instant": false, - "legendFormat": "Open", - "range": true, - "refId": "A" - } - ], - "title": "File Descriptors", - "type": "timeseries" - } - ], - "refresh": "5s", - "revision": 1, - "schemaVersion": 39, - "tags": [], - "templating": { - "list": [ - { - "current": { - "selected": false, - "text": "localhost:9100", - "value": "localhost:9100" - }, - "datasource": { - "type": "prometheus", - "uid": "cdh4g2kxwgx6od" - }, - "definition": "query_result(up)", - "hide": 0, - "includeAll": false, - "multi": false, - "name": "instance", - "options": [], - "query": { - "query": "query_result(up)", - "refId": "PrometheusVariableQueryEditor-VariableQuery" - }, - "refresh": 1, - "regex": "/.*instance=\\\"([^\\\"]*).*/", - "skipUrlSync": false, - "sort": 0, - "type": "query" - } - ] - }, - "time": { - "from": "now-5m", - "to": "now" - }, - "timepicker": {}, - "timezone": "", - "title": "katana", - "uid": "2k8BXz24x", - "version": 6, - "weekStart": "" -} + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": { + "type": "grafana", + "uid": "-- Grafana --" + }, + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "target": { + "limit": 100, + "matchAny": false, + "tags": [], + "type": "dashboard" + }, + "type": "dashboard" + } + ] + }, + "editable": true, + "fiscalYearStartMonth": 0, + "graphTooltip": 0, + "id": 2, + "links": [], + "liveNow": false, + "panels": [ + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 0 + }, + "id": 125, + "panels": [], + "title": "Database", + "type": "row" + }, + { + "datasource": { + "type": "prometheus", + "uid": "cdtkn4qt08kxsb" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "decbytes" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 1 + }, + "id": 124, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "cdtkn4qt08kxsb" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "katana_db_table_size{table=\"BlockBodyIndices\"}", + "fullMetaSearch": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "BlockBodyIndices", + "range": true, + "refId": "A", + "useBackend": false + }, + { + "datasource": { + "type": "prometheus", + "uid": "cdtkn4qt08kxsb" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "katana_db_table_size{table=\"BlockHashes\"}", + "fullMetaSearch": false, + "hide": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "BlockHashes", + "range": true, + "refId": "B", + "useBackend": false + }, + { + "datasource": { + "type": "prometheus", + "uid": "cdtkn4qt08kxsb" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "katana_db_table_size{table=\"BlockNumbers\"}", + "fullMetaSearch": false, + "hide": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "BlockNumbers", + "range": true, + "refId": "C", + "useBackend": false + }, + { + "datasource": { + "type": "prometheus", + "uid": "cdtkn4qt08kxsb" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "katana_db_table_size{table=\"BlockStatusses\"}", + "fullMetaSearch": false, + "hide": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "BlockStatusses", + "range": true, + "refId": "D", + "useBackend": false + }, + { + "datasource": { + "type": "prometheus", + "uid": "cdtkn4qt08kxsb" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "katana_db_table_size{table=\"ClassChangeHistory\"}", + "fullMetaSearch": false, + "hide": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "ClassChangeHistory", + "range": true, + "refId": "E", + "useBackend": false + }, + { + "datasource": { + "type": "prometheus", + "uid": "cdtkn4qt08kxsb" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "katana_db_table_size{table=\"ClassDeclarationBlock\"}", + "fullMetaSearch": false, + "hide": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "ClassDeclarationBlock", + "range": true, + "refId": "F", + "useBackend": false + }, + { + "datasource": { + "type": "prometheus", + "uid": "cdtkn4qt08kxsb" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "katana_db_table_size{table=\"ClassDeclarations\"}", + "fullMetaSearch": false, + "hide": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "ClassDeclarations", + "range": true, + "refId": "G", + "useBackend": false + }, + { + "datasource": { + "type": "prometheus", + "uid": "cdtkn4qt08kxsb" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "katana_db_table_size{table=\"CompiledClassHashes\"}", + "fullMetaSearch": false, + "hide": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "CompiledClassHashes", + "range": true, + "refId": "H", + "useBackend": false + }, + { + "datasource": { + "type": "prometheus", + "uid": "cdtkn4qt08kxsb" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "katana_db_table_size{table=\"CompiledClasses\"}", + "fullMetaSearch": false, + "hide": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "CompiledClasses", + "range": true, + "refId": "I", + "useBackend": false + }, + { + "datasource": { + "type": "prometheus", + "uid": "cdtkn4qt08kxsb" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "katana_db_table_size{table=\"ContractInfo\"}", + "fullMetaSearch": false, + "hide": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "ContractInfo", + "range": true, + "refId": "J", + "useBackend": false + }, + { + "datasource": { + "type": "prometheus", + "uid": "cdtkn4qt08kxsb" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "katana_db_table_size{table=\"ContractInfoChangeSet\"}", + "fullMetaSearch": false, + "hide": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "ContractInfoChangeSet", + "range": true, + "refId": "K", + "useBackend": false + }, + { + "datasource": { + "type": "prometheus", + "uid": "cdtkn4qt08kxsb" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "katana_db_table_size{table=\"Headers\"}", + "fullMetaSearch": false, + "hide": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "Headers", + "range": true, + "refId": "L", + "useBackend": false + }, + { + "datasource": { + "type": "prometheus", + "uid": "cdtkn4qt08kxsb" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "katana_db_table_size{table=\"NonceChangeHistory\"}", + "fullMetaSearch": false, + "hide": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "NonceChangeHistory", + "range": true, + "refId": "M", + "useBackend": false + }, + { + "datasource": { + "type": "prometheus", + "uid": "cdtkn4qt08kxsb" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "katana_db_table_size{table=\"Receipts\"}", + "fullMetaSearch": false, + "hide": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "Receipts", + "range": true, + "refId": "N", + "useBackend": false + }, + { + "datasource": { + "type": "prometheus", + "uid": "cdtkn4qt08kxsb" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "katana_db_table_size{table=\"SierraClasses\"}", + "fullMetaSearch": false, + "hide": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "SierraClasses", + "range": true, + "refId": "O", + "useBackend": false + }, + { + "datasource": { + "type": "prometheus", + "uid": "cdtkn4qt08kxsb" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "katana_db_table_size{table=\"StorageChangeHistory\"}", + "fullMetaSearch": false, + "hide": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "StorageChangeHistory", + "range": true, + "refId": "P", + "useBackend": false + }, + { + "datasource": { + "type": "prometheus", + "uid": "cdtkn4qt08kxsb" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "katana_db_table_size{table=\"StorageChangeSet\"}", + "fullMetaSearch": false, + "hide": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "StorageChangeSet", + "range": true, + "refId": "Q", + "useBackend": false + }, + { + "datasource": { + "type": "prometheus", + "uid": "cdtkn4qt08kxsb" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "katana_db_table_size{table=\"Transactions\"}", + "fullMetaSearch": false, + "hide": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "Transactions", + "range": true, + "refId": "R", + "useBackend": false + }, + { + "datasource": { + "type": "prometheus", + "uid": "cdtkn4qt08kxsb" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "katana_db_table_size{table=\"TxBlocks\"}", + "fullMetaSearch": false, + "hide": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "TxBlocks", + "range": true, + "refId": "S", + "useBackend": false + }, + { + "datasource": { + "type": "prometheus", + "uid": "cdtkn4qt08kxsb" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "katana_db_table_size{table=\"TxHashes\"}", + "fullMetaSearch": false, + "hide": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "TxHashes", + "range": true, + "refId": "T", + "useBackend": false + }, + { + "datasource": { + "type": "prometheus", + "uid": "cdtkn4qt08kxsb" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "katana_db_table_size{table=\"TxNumbers\"}", + "fullMetaSearch": false, + "hide": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "TxNumbers", + "range": true, + "refId": "U", + "useBackend": false + }, + { + "datasource": { + "type": "prometheus", + "uid": "cdtkn4qt08kxsb" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "katana_db_table_size{table=\"TxTraces\"}", + "fullMetaSearch": false, + "hide": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "TxTraces", + "range": true, + "refId": "V", + "useBackend": false + } + ], + "title": "Table Sizes", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "cdtkn4qt08kxsb" + }, + "description": "Total storage capacity of the database", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "decbytes" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 1 + }, + "id": 127, + "options": { + "colorMode": "value", + "graphMode": "area", + "justifyMode": "center", + "orientation": "auto", + "percentChangeColorMode": "standard", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showPercentChange": false, + "textMode": "auto", + "wideLayout": true + }, + "pluginVersion": "11.1.3", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "cdtkn4qt08kxsb" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "katana_db_freelist", + "fullMetaSearch": false, + "hide": true, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "__auto", + "range": true, + "refId": "A", + "useBackend": false + }, + { + "datasource": { + "type": "prometheus", + "uid": "cdtkn4qt08kxsb" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "sum(katana_db_table_size)", + "fullMetaSearch": false, + "hide": true, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "__auto", + "range": true, + "refId": "B", + "useBackend": false + }, + { + "datasource": { + "name": "Expression", + "type": "__expr__", + "uid": "__expr__" + }, + "expression": "$A + $B", + "hide": false, + "refId": "C", + "type": "math" + } + ], + "title": "Total Size", + "type": "stat" + }, + { + "datasource": { + "type": "prometheus", + "uid": "cdtkn4qt08kxsb" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "decbytes" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 9 + }, + "id": 126, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "11.1.3", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "cdtkn4qt08kxsb" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "katana_db_freelist", + "fullMetaSearch": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "Freelist", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "Freelist Size", + "type": "timeseries" + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 17 + }, + "id": 122, + "panels": [], + "title": "Execution", + "type": "row" + }, + { + "datasource": { + "type": "prometheus", + "uid": "cdtkn4qt08kxsb" + }, + "description": "The total amount of L1 gas that has been processed", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "Total gas", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 18 + }, + "id": 121, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": false + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "cdtkn4qt08kxsb" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "katana_block_producer_l1_gas_processed_total{instance=\"localhost:9100\"}", + "fullMetaSearch": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "__auto", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "L1 Gas Processed", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "cdtkn4qt08kxsb" + }, + "description": "The total amount of Cairo steps that has been processed", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "Total steps", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 18 + }, + "id": 123, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": false + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "cdtkn4qt08kxsb" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "katana_block_producer_cairo_steps_processed_total{instance=\"localhost:9100\"}", + "fullMetaSearch": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "__auto", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "Cairo Steps Processed", + "type": "timeseries" + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 26 + }, + "id": 108, + "panels": [], + "title": "RPC Server", + "type": "row" + }, + { + "datasource": { + "type": "prometheus", + "uid": "cdtkn4qt08kxsb" + }, + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 10, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "http" + }, + "properties": [ + { + "id": "displayName", + "value": "HTTP" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "ws" + }, + "properties": [ + { + "id": "displayName", + "value": "WebSocket" + } + ] + } + ] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 27 + }, + "id": 109, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "10.1.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "cdtkn4qt08kxsb" + }, + "disableTextWrap": false, + "editorMode": "code", + "expr": "sum(katana_rpc_server_connections_connections_opened{instance=~\"$instance\"} - katana_rpc_server_connections_connections_closed{instance=~\"$instance\"}) by (transport)", + "format": "time_series", + "fullMetaSearch": false, + "includeNullMetadata": true, + "legendFormat": "{{transport}}", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "Active Connections", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "cdtkn4qt08kxsb" + }, + "description": "", + "fieldConfig": { + "defaults": { + "custom": { + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "scaleDistribution": { + "type": "linear" + } + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 27 + }, + "id": 111, + "maxDataPoints": 25, + "options": { + "calculate": false, + "cellGap": 1, + "cellValues": { + "unit": "s" + }, + "color": { + "exponent": 0.2, + "fill": "dark-orange", + "min": 0, + "mode": "opacity", + "reverse": false, + "scale": "exponential", + "scheme": "Oranges", + "steps": 128 + }, + "exemplars": { + "color": "rgba(255,0,255,0.7)" + }, + "filterValues": { + "le": 1e-9 + }, + "legend": { + "show": true + }, + "rowsFrame": { + "layout": "auto", + "value": "Latency time" + }, + "tooltip": { + "mode": "single", + "showColorScale": false, + "yHistogram": false + }, + "yAxis": { + "axisLabel": "Quantile", + "axisPlacement": "left", + "reverse": false, + "unit": "percentunit" + } + }, + "pluginVersion": "11.1.3", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "cdtkn4qt08kxsb" + }, + "editorMode": "code", + "exemplar": false, + "expr": "avg(max_over_time(katana_rpc_server_connections_request_time_seconds{instance=~\"$instance\"}[$__rate_interval]) > 0) by (quantile)", + "format": "time_series", + "instant": false, + "legendFormat": "__auto", + "range": true, + "refId": "A" + } + ], + "title": "Request Latency time", + "type": "heatmap" + }, + { + "datasource": { + "type": "prometheus", + "uid": "cdtkn4qt08kxsb" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "points", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "s" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 35 + }, + "id": 120, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "10.1.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "cdtkn4qt08kxsb" + }, + "editorMode": "code", + "expr": "max(max_over_time(katana_rpc_server_calls_time_seconds[$__rate_interval])) by (method) > 0", + "instant": false, + "legendFormat": "__auto", + "range": true, + "refId": "A" + } + ], + "title": "Maximum call latency per method", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "cdtkn4qt08kxsb" + }, + "description": "", + "fieldConfig": { + "defaults": { + "custom": { + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "scaleDistribution": { + "type": "linear" + } + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 35 + }, + "id": 112, + "maxDataPoints": 25, + "options": { + "calculate": false, + "cellGap": 1, + "cellValues": { + "unit": "s" + }, + "color": { + "exponent": 0.2, + "fill": "dark-orange", + "min": 0, + "mode": "opacity", + "reverse": false, + "scale": "exponential", + "scheme": "Oranges", + "steps": 128 + }, + "exemplars": { + "color": "rgba(255,0,255,0.7)" + }, + "filterValues": { + "le": 1e-9 + }, + "legend": { + "show": true + }, + "rowsFrame": { + "layout": "auto", + "value": "Latency time" + }, + "tooltip": { + "mode": "single", + "showColorScale": false, + "yHistogram": false + }, + "yAxis": { + "axisLabel": "Quantile", + "axisPlacement": "left", + "reverse": false, + "unit": "percentunit" + } + }, + "pluginVersion": "11.1.3", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "cdtkn4qt08kxsb" + }, + "editorMode": "code", + "exemplar": false, + "expr": "avg(max_over_time(katana_rpc_server_calls_time_seconds{instance=~\"$instance\"}[$__rate_interval]) > 0) by (quantile)", + "format": "time_series", + "instant": false, + "legendFormat": "{{quantile}}", + "range": true, + "refId": "A" + } + ], + "title": "Call Latency time", + "type": "heatmap" + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 43 + }, + "id": 97, + "panels": [], + "title": "Process", + "type": "row" + }, + { + "datasource": { + "type": "prometheus", + "uid": "cdtkn4qt08kxsb" + }, + "description": "100% = 1 core", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "percentunit" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 44 + }, + "id": 99, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "cdtkn4qt08kxsb" + }, + "editorMode": "builder", + "expr": "avg(rate(katana_process_cpu_seconds_total{instance=~\"$instance\"}[1m]))", + "instant": false, + "legendFormat": "Process", + "range": true, + "refId": "A" + } + ], + "title": "CPU", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "cdtkn4qt08kxsb" + }, + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "decbytes" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 44 + }, + "id": 101, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "cdtkn4qt08kxsb" + }, + "editorMode": "code", + "expr": "katana_process_resident_memory_bytes{instance=~\"$instance\"}", + "instant": false, + "legendFormat": "Resident", + "range": true, + "refId": "A" + } + ], + "title": "Memory", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "cdtkn4qt08kxsb" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "decbytes" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 52 + }, + "id": 98, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "cdtkn4qt08kxsb" + }, + "editorMode": "builder", + "expr": "katana_jemalloc_active{instance=~\"$instance\"}", + "instant": false, + "legendFormat": "Active", + "range": true, + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "cdtkn4qt08kxsb" + }, + "editorMode": "builder", + "expr": "katana_jemalloc_allocated{instance=~\"$instance\"}", + "hide": false, + "instant": false, + "legendFormat": "Allocated", + "range": true, + "refId": "B" + }, + { + "datasource": { + "type": "prometheus", + "uid": "cdtkn4qt08kxsb" + }, + "editorMode": "builder", + "expr": "katana_jemalloc_mapped{instance=~\"$instance\"}", + "hide": false, + "instant": false, + "legendFormat": "Mapped", + "range": true, + "refId": "C" + }, + { + "datasource": { + "type": "prometheus", + "uid": "cdtkn4qt08kxsb" + }, + "editorMode": "builder", + "expr": "katana_jemalloc_metadata{instance=~\"$instance\"}", + "hide": false, + "instant": false, + "legendFormat": "Metadata", + "range": true, + "refId": "D" + }, + { + "datasource": { + "type": "prometheus", + "uid": "cdtkn4qt08kxsb" + }, + "editorMode": "builder", + "expr": "katana_jemalloc_resident{instance=~\"$instance\"}", + "hide": false, + "instant": false, + "legendFormat": "Resident", + "range": true, + "refId": "E" + }, + { + "datasource": { + "type": "prometheus", + "uid": "cdtkn4qt08kxsb" + }, + "editorMode": "builder", + "expr": "katana_jemalloc_retained{instance=~\"$instance\"}", + "hide": false, + "instant": false, + "legendFormat": "Retained", + "range": true, + "refId": "F" + } + ], + "title": "Jemalloc Memory", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "cdtkn4qt08kxsb" + }, + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "none" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 52 + }, + "id": 100, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "cdtkn4qt08kxsb" + }, + "editorMode": "builder", + "expr": "katana_process_open_fds{instance=~\"$instance\"}", + "instant": false, + "legendFormat": "Open", + "range": true, + "refId": "A" + } + ], + "title": "File Descriptors", + "type": "timeseries" + } + ], + "refresh": "5s", + "revision": 1, + "schemaVersion": 39, + "tags": [], + "templating": { + "list": [ + { + "current": { + "selected": false, + "text": "localhost:9100", + "value": "localhost:9100" + }, + "datasource": { + "type": "prometheus", + "uid": "cdtkn4qt08kxsb" + }, + "definition": "query_result(up)", + "hide": 0, + "includeAll": false, + "multi": false, + "name": "instance", + "options": [], + "query": { + "query": "query_result(up)", + "refId": "PrometheusVariableQueryEditor-VariableQuery" + }, + "refresh": 1, + "regex": "/.*instance=\\\"([^\\\"]*).*/", + "skipUrlSync": false, + "sort": 0, + "type": "query" + } + ] + }, + "time": { + "from": "now-3h", + "to": "now" + }, + "timepicker": {}, + "timezone": "", + "title": "katana", + "uid": "2k8BXz24x", + "version": 13, + "weekStart": "" +} \ No newline at end of file From 9eac7cfd25710f81b67cd326a7eca41861f1ec9a Mon Sep 17 00:00:00 2001 From: Larko <59736843+Larkooo@users.noreply.github.com> Date: Mon, 5 Aug 2024 18:57:21 -0400 Subject: [PATCH 07/10] refactor(torii-client): remove deprecated model storage and subscription (#2267) * refactor(torii-client): remove deprecated model storage and subscription * chore: fmt --- crates/torii/client/src/client/mod.rs | 160 +-------- crates/torii/client/src/client/storage.rs | 211 ------------ .../torii/client/src/client/subscription.rs | 313 ------------------ crates/torii/client/src/lib.rs | 1 - crates/torii/client/src/utils.rs | 22 -- 5 files changed, 3 insertions(+), 704 deletions(-) delete mode 100644 crates/torii/client/src/client/storage.rs delete mode 100644 crates/torii/client/src/client/subscription.rs delete mode 100644 crates/torii/client/src/utils.rs diff --git a/crates/torii/client/src/client/mod.rs b/crates/torii/client/src/client/mod.rs index 869ff87d2e..42ca0e4c07 100644 --- a/crates/torii/client/src/client/mod.rs +++ b/crates/torii/client/src/client/mod.rs @@ -1,33 +1,23 @@ pub mod error; -pub mod storage; -pub mod subscription; -use std::cell::OnceCell; -use std::collections::HashSet; use std::sync::Arc; -use dojo_types::packing::unpack; -use dojo_types::schema::Ty; use dojo_types::WorldMetadata; -use dojo_world::contracts::{naming, WorldContractReader}; +use dojo_world::contracts::WorldContractReader; use futures::lock::Mutex; use parking_lot::{RwLock, RwLockReadGuard}; use starknet::core::types::Felt; use starknet::providers::jsonrpc::HttpTransport; use starknet::providers::JsonRpcClient; use tokio::sync::RwLock as AsyncRwLock; -use torii_grpc::client::{EntityUpdateStreaming, EventUpdateStreaming, ModelDiffsStreaming}; +use torii_grpc::client::{EntityUpdateStreaming, EventUpdateStreaming}; use torii_grpc::proto::world::{RetrieveEntitiesResponse, RetrieveEventsResponse}; use torii_grpc::types::schema::Entity; -use torii_grpc::types::{EntityKeysClause, Event, EventQuery, KeysClause, ModelKeysClause, Query}; +use torii_grpc::types::{EntityKeysClause, Event, EventQuery, KeysClause, Query}; use torii_relay::client::EventLoop; use torii_relay::types::Message; use crate::client::error::{Error, ParseError}; -use crate::client::storage::ModelStorage; -use crate::client::subscription::{ - SubscribedModels, SubscriptionClientHandle, SubscriptionService, -}; // TODO: remove reliance on RPC #[allow(unused)] @@ -39,12 +29,7 @@ pub struct Client { inner: AsyncRwLock, /// Relay client. relay_client: torii_relay::client::RelayClient, - /// Model storage - storage: Arc, - /// Models the client are subscribed to. - subscribed_models: Arc, /// The subscription client handle. - sub_client_handle: OnceCell, /// World contract reader. world_reader: WorldContractReader>, } @@ -64,8 +49,6 @@ impl Client { let metadata = grpc_client.metadata().await?; let shared_metadata: Arc<_> = RwLock::new(metadata).into(); - let client_storage: Arc<_> = ModelStorage::new(shared_metadata.clone()).into(); - let subbed_models: Arc<_> = SubscribedModels::new(shared_metadata.clone()).into(); // initialize the entities to be synced with the latest values let rpc_url = url::Url::parse(&rpc_url).map_err(ParseError::Url)?; @@ -74,12 +57,9 @@ impl Client { Ok(Self { world_reader, - storage: client_storage, metadata: shared_metadata, - sub_client_handle: OnceCell::new(), inner: AsyncRwLock::new(grpc_client), relay_client, - subscribed_models: subbed_models, }) } @@ -105,10 +85,6 @@ impl Client { self.metadata.read() } - pub fn subscribed_models(&self) -> RwLockReadGuard<'_, HashSet> { - self.subscribed_models.models_keys.read() - } - /// Retrieves entities matching query parameter. /// /// The query param includes an optional clause for filtering. Without clause, it fetches ALL @@ -188,134 +164,4 @@ impl Client { let stream = grpc_client.subscribe_events(keys).await?; Ok(stream) } - - /// Returns the value of a model. - /// - /// This function will only return `None`, if `model` doesn't exist. If there is no model with - /// the specified `keys`, it will return a [`Ty`] with the default values. - /// - /// If the requested model is not among the synced models, it will attempt to fetch it from - /// the RPC. - pub async fn model(&self, keys: &ModelKeysClause) -> Result, Error> { - let (namespace, model) = keys.model.split_once('-').unwrap(); - let model_selector = naming::compute_selector_from_names(namespace, model); - let Some(mut schema) = - self.metadata.read().model(&model_selector).map(|m| m.schema.clone()) - else { - return Ok(None); - }; - - if !self.subscribed_models.is_synced(keys) { - let model = self.world_reader.model_reader(namespace, model).await?; - return Ok(Some(model.entity(&keys.keys).await?)); - } - - let Ok(Some(raw_values)) = self.storage.get_model_storage(model_selector, &keys.keys) - else { - return Ok(Some(schema)); - }; - - let layout = self - .metadata - .read() - .model(&model_selector) - .map(|m| m.layout.clone()) - .expect("qed; layout should exist"); - - let unpacked = unpack(raw_values, layout).unwrap(); - let mut keys_and_unpacked = [keys.keys.to_vec(), unpacked].concat(); - - schema.deserialize(&mut keys_and_unpacked).unwrap(); - - Ok(Some(schema)) - } - - /// Initiate the model subscriptions and returns a [SubscriptionService] which when await'ed - /// will execute the subscription service and starts the syncing process. - pub async fn start_subscription(&self) -> Result { - let models_keys: Vec = - self.subscribed_models.models_keys.read().clone().into_iter().collect(); - let sub_res_stream = self.initiate_subscription(models_keys).await?; - - let (service, handle) = SubscriptionService::new( - Arc::clone(&self.storage), - Arc::clone(&self.metadata), - Arc::clone(&self.subscribed_models), - sub_res_stream, - ); - - self.sub_client_handle.set(handle).unwrap(); - Ok(service) - } - - /// Adds entities to the list of entities to be synced. - /// - /// NOTE: This will establish a new subscription stream with the server. - pub async fn add_models_to_sync(&self, models_keys: Vec) -> Result<(), Error> { - for keys in &models_keys { - let (namespace, model) = keys.model.split_once('-').unwrap(); - self.initiate_model(namespace, model, keys.keys.clone()).await?; - } - - self.subscribed_models.add_models(models_keys)?; - - let updated_models = - self.subscribed_models.models_keys.read().clone().into_iter().collect(); - let sub_res_stream = self.initiate_subscription(updated_models).await?; - - match self.sub_client_handle.get() { - Some(handle) => handle.update_subscription_stream(sub_res_stream), - None => return Err(Error::SubscriptionUninitialized), - } - Ok(()) - } - - /// Removes models from the list of models to be synced. - /// - /// NOTE: This will establish a new subscription stream with the server. - pub async fn remove_models_to_sync( - &self, - models_keys: Vec, - ) -> Result<(), Error> { - self.subscribed_models.remove_models(models_keys)?; - - let updated_entities = - self.subscribed_models.models_keys.read().clone().into_iter().collect(); - let sub_res_stream = self.initiate_subscription(updated_entities).await?; - - match self.sub_client_handle.get() { - Some(handle) => handle.update_subscription_stream(sub_res_stream), - None => return Err(Error::SubscriptionUninitialized), - } - Ok(()) - } - - pub fn storage(&self) -> Arc { - Arc::clone(&self.storage) - } - - async fn initiate_subscription( - &self, - keys: Vec, - ) -> Result { - let mut grpc_client = self.inner.write().await; - let stream = grpc_client.subscribe_model_diffs(keys).await?; - Ok(stream) - } - - async fn initiate_model( - &self, - namespace: &str, - model: &str, - keys: Vec, - ) -> Result<(), Error> { - let model_reader = self.world_reader.model_reader(namespace, model).await?; - let values = model_reader.entity_storage(&keys).await?; - self.storage.set_model_storage( - naming::compute_selector_from_names(namespace, model), - keys, - values, - )?; - Ok(()) - } } diff --git a/crates/torii/client/src/client/storage.rs b/crates/torii/client/src/client/storage.rs deleted file mode 100644 index 2e3672de36..0000000000 --- a/crates/torii/client/src/client/storage.rs +++ /dev/null @@ -1,211 +0,0 @@ -use std::collections::{HashMap, HashSet}; -use std::sync::Arc; - -use dojo_types::WorldMetadata; -use futures::channel::mpsc::{channel, Receiver, Sender}; -use parking_lot::{Mutex, RwLock}; -use starknet::core::types::Felt; - -use super::error::Error; -use crate::utils::compute_all_storage_addresses; - -pub type EntityKeys = Vec; - -pub type StorageKey = Felt; -pub type StorageValue = Felt; - -/// An in-memory storage for storing the component values of entities. -// TODO: check if we can use sql db instead. -#[derive(Debug)] -pub struct ModelStorage { - metadata: Arc>, - storage: RwLock>, - // a map of model name to a set of model keys. - model_index: RwLock>>, - - // listener for storage updates. - senders: Mutex>>, - listeners: Mutex>>, -} - -impl ModelStorage { - pub(super) fn new(metadata: Arc>) -> Self { - Self { - metadata, - storage: Default::default(), - model_index: Default::default(), - senders: Default::default(), - listeners: Default::default(), - } - } - - /// Listen to model changes. - /// - /// # Arguments - /// * `model` - the model name. - /// * `keys` - the keys of the model. - /// - /// # Returns - /// A receiver that will receive updates for the specified storage keys. - pub fn add_listener(&self, model: Felt, keys: &[Felt]) -> Result, Error> { - let storage_addresses = self.get_model_storage_addresses(model, keys)?; - - let (sender, receiver) = channel(128); - let listener_id = self.senders.lock().len() as u8; - self.senders.lock().insert(listener_id, sender); - - storage_addresses.iter().for_each(|key| { - self.listeners.lock().entry(*key).or_default().push(listener_id); - }); - - Ok(receiver) - } - - /// Retrieves the raw values of an model. - pub fn get_model_storage( - &self, - model: Felt, - raw_keys: &[Felt], - ) -> Result>, Error> { - let storage_addresses = self.get_model_storage_addresses(model, raw_keys)?; - Ok(storage_addresses - .into_iter() - .map(|storage_address| self.storage.read().get(&storage_address).copied()) - .collect::>>()) - } - - /// Set the raw values of an model. - pub fn set_model_storage( - &self, - model: Felt, - raw_keys: Vec, - raw_values: Vec, - ) -> Result<(), Error> { - let storage_addresses = self.get_model_storage_addresses(model, &raw_keys)?; - self.set_storages_at(storage_addresses.into_iter().zip(raw_values).collect()); - self.index_model(model, raw_keys); - - Ok(()) - } - - /// Set the value of storage slots in bulk - pub(super) fn set_storages_at(&self, storage_models: Vec<(Felt, Felt)>) { - let mut senders: HashSet = Default::default(); - - for (key, _) in &storage_models { - if let Some(lists) = self.listeners.lock().get(key) { - for id in lists { - senders.insert(*id); - } - } - } - - self.storage.write().extend(storage_models); - - for sender_id in senders { - self.notify_listener(sender_id); - } - } - - fn notify_listener(&self, id: u8) { - if let Some(sender) = self.senders.lock().get_mut(&id) { - let _ = sender.try_send(()); - } - } - - fn get_model_storage_addresses( - &self, - model: Felt, - raw_keys: &[Felt], - ) -> Result, Error> { - let model_packed_size = self - .metadata - .read() - .model(&model) - .map(|c| c.packed_size) - .ok_or(Error::UnknownModel(model))?; - - Ok(compute_all_storage_addresses(model, raw_keys, model_packed_size)) - } - - fn index_model(&self, model: Felt, raw_keys: Vec) { - self.model_index.write().entry(model).or_default().insert(raw_keys); - } -} - -#[cfg(test)] -mod tests { - use std::collections::HashMap; - use std::sync::Arc; - - use dojo_types::schema::Ty; - use dojo_types::WorldMetadata; - use dojo_world::contracts::naming::compute_selector_from_names; - use parking_lot::RwLock; - use starknet::macros::felt; - - use crate::utils::compute_all_storage_addresses; - - fn create_dummy_metadata() -> WorldMetadata { - let models = HashMap::from([( - compute_selector_from_names("Test", "Position"), - dojo_types::schema::ModelMetadata { - namespace: "Test".into(), - name: "Position".into(), - class_hash: felt!("1"), - contract_address: felt!("2"), - packed_size: 4, - unpacked_size: 4, - layout: vec![], - schema: Ty::Primitive(dojo_types::primitive::Primitive::Bool(None)), - }, - )]); - - WorldMetadata { models, ..Default::default() } - } - - fn create_dummy_storage() -> super::ModelStorage { - let metadata = Arc::new(RwLock::new(create_dummy_metadata())); - super::ModelStorage::new(metadata) - } - - #[test] - fn set_and_get_model_value() { - let storage = create_dummy_storage(); - let keys = vec![felt!("0x12345")]; - - assert!(storage.storage.read().is_empty(), "storage must be empty initially"); - - let model_selector = compute_selector_from_names("Test", "Position"); - - let model = storage.metadata.read().model(&model_selector).cloned().unwrap(); - let expected_storage_addresses = - compute_all_storage_addresses(model_selector, &keys, model.packed_size); - - let expected_values = vec![felt!("1"), felt!("2"), felt!("3"), felt!("4")]; - - storage - .set_model_storage(model_selector, keys.clone(), expected_values.clone()) - .expect("set storage values"); - - let actual_values: Vec = storage - .get_model_storage(model_selector, &keys) - .expect("model exist") - .expect("values are set"); - - let actual_storage_addresses = - storage.storage.read().clone().into_keys().collect::>(); - - assert!( - storage.model_index.read().get(&model_selector).is_some_and(|e| e.contains(&keys)), - "model keys must be indexed" - ); - assert!(actual_values == expected_values); - assert!(storage.storage.read().len() == model.packed_size as usize); - assert!( - actual_storage_addresses - .into_iter() - .all(|address| expected_storage_addresses.contains(&address)) - ); - } -} diff --git a/crates/torii/client/src/client/subscription.rs b/crates/torii/client/src/client/subscription.rs deleted file mode 100644 index dfce86d1af..0000000000 --- a/crates/torii/client/src/client/subscription.rs +++ /dev/null @@ -1,313 +0,0 @@ -use std::cell::RefCell; -use std::collections::HashSet; -use std::future::Future; -use std::sync::Arc; -use std::task::Poll; - -use dojo_types::WorldMetadata; -use dojo_world::contracts::naming; -use futures::channel::mpsc::{self, Receiver, Sender}; -use futures_util::StreamExt; -use parking_lot::{Mutex, RwLock}; -use starknet::core::types::{Felt, StateDiff, StateUpdate}; -use torii_grpc::client::ModelDiffsStreaming; -use torii_grpc::types::ModelKeysClause; - -use crate::client::error::Error; -use crate::client::storage::ModelStorage; -use crate::utils::compute_all_storage_addresses; - -#[derive(Debug)] -pub enum SubscriptionEvent { - UpdateSubsciptionStream(ModelDiffsStreaming), -} - -#[derive(Debug)] -pub struct SubscribedModels { - metadata: Arc>, - pub(crate) models_keys: RwLock>, - /// All the relevant storage addresses derived from the subscribed models - pub(crate) subscribed_storage_addresses: RwLock>, -} - -impl SubscribedModels { - pub(crate) fn is_synced(&self, keys: &ModelKeysClause) -> bool { - self.models_keys.read().contains(keys) - } - - pub(crate) fn new(metadata: Arc>) -> Self { - Self { - metadata, - models_keys: Default::default(), - subscribed_storage_addresses: Default::default(), - } - } - - pub(crate) fn add_models(&self, models_keys: Vec) -> Result<(), Error> { - for keys in models_keys { - Self::add_model(self, keys)?; - } - Ok(()) - } - - pub(crate) fn remove_models(&self, entities_keys: Vec) -> Result<(), Error> { - for keys in entities_keys { - Self::remove_model(self, keys)?; - } - Ok(()) - } - - pub(crate) fn add_model(&self, keys: ModelKeysClause) -> Result<(), Error> { - if !self.models_keys.write().insert(keys.clone()) { - return Ok(()); - } - - let (namespace, model) = - keys.model.split_once('-').ok_or(Error::InvalidModelName(keys.model.clone()))?; - let selector = naming::compute_selector_from_names(namespace, model); - - let model_packed_size = self - .metadata - .read() - .models - .get(&selector) - .map(|c| c.packed_size) - .ok_or(Error::UnknownModel(selector))?; - - let storage_addresses = - compute_all_storage_addresses(selector, &keys.keys, model_packed_size); - - let storage_lock = &mut self.subscribed_storage_addresses.write(); - storage_addresses.into_iter().for_each(|address| { - storage_lock.insert(address); - }); - - Ok(()) - } - - pub(crate) fn remove_model(&self, keys: ModelKeysClause) -> Result<(), Error> { - if !self.models_keys.write().remove(&keys) { - return Ok(()); - } - - let (namespace, model) = - keys.model.split_once('-').ok_or(Error::InvalidModelName(keys.model.clone()))?; - let selector = naming::compute_selector_from_names(namespace, model); - - let model_packed_size = self - .metadata - .read() - .models - .get(&selector) - .map(|c| c.packed_size) - .ok_or(Error::UnknownModel(selector))?; - - let storage_addresses = - compute_all_storage_addresses(selector, &keys.keys, model_packed_size); - - let storage_lock = &mut self.subscribed_storage_addresses.write(); - storage_addresses.iter().for_each(|address| { - storage_lock.remove(address); - }); - - Ok(()) - } -} - -#[derive(Debug)] -pub(crate) struct SubscriptionClientHandle(Mutex>); - -impl SubscriptionClientHandle { - fn new(sender: Sender) -> Self { - Self(Mutex::new(sender)) - } - - pub(crate) fn update_subscription_stream(&self, stream: ModelDiffsStreaming) { - let _ = self.0.lock().try_send(SubscriptionEvent::UpdateSubsciptionStream(stream)); - } -} - -#[must_use = "SubscriptionClient does nothing unless polled"] -#[allow(missing_debug_implementations)] -pub struct SubscriptionService { - req_rcv: Receiver, - /// Model Diff stream by subscription server to receive response - model_diffs_stream: RefCell>, - - /// Callback to be called on error - err_callback: Option>, - - // for processing the model diff and updating the storage - storage: Arc, - world_metadata: Arc>, - subscribed_models: Arc, -} - -impl SubscriptionService { - pub(crate) fn new( - storage: Arc, - world_metadata: Arc>, - subscribed_models: Arc, - model_diffs_stream: ModelDiffsStreaming, - ) -> (Self, SubscriptionClientHandle) { - let (req_sender, req_rcv) = mpsc::channel(128); - - let handle = SubscriptionClientHandle::new(req_sender); - let model_diffs_stream = RefCell::new(Some(model_diffs_stream)); - - let client = Self { - req_rcv, - storage, - world_metadata, - model_diffs_stream, - err_callback: None, - subscribed_models, - }; - - (client, handle) - } - - // TODO: handle the subscription events properly - fn handle_event(&self, event: SubscriptionEvent) -> Result<(), Error> { - match event { - SubscriptionEvent::UpdateSubsciptionStream(stream) => { - self.model_diffs_stream.replace(Some(stream)); - } - } - Ok(()) - } - - // handle the response from the subscription stream - fn handle_response(&mut self, response: Result) { - match response { - Ok(update) => { - self.process_model_diff(update.state_diff); - } - - Err(err) => { - if let Some(ref callback) = self.err_callback { - callback(err) - } - } - } - } - - fn process_model_diff(&mut self, diff: StateDiff) { - let storage_entries = diff.storage_diffs.into_iter().find_map(|d| { - let expected = self.world_metadata.read().world_address; - let current = d.address; - if current == expected { Some(d.storage_entries) } else { None } - }); - - let Some(entries) = storage_entries else { - return; - }; - - let entries: Vec<(Felt, Felt)> = { - let subscribed_models = self.subscribed_models.subscribed_storage_addresses.read(); - entries - .into_iter() - .filter(|entry| subscribed_models.contains(&entry.key)) - .map(|entry| (entry.key, entry.value)) - .collect() - }; - - self.storage.set_storages_at(entries); - } -} - -impl Future for SubscriptionService { - type Output = (); - - fn poll( - self: std::pin::Pin<&mut Self>, - cx: &mut std::task::Context<'_>, - ) -> std::task::Poll { - let pin = self.get_mut(); - - loop { - while let Poll::Ready(Some(req)) = pin.req_rcv.poll_next_unpin(cx) { - let _ = pin.handle_event(req); - } - - if let Some(stream) = pin.model_diffs_stream.get_mut() { - match stream.poll_next_unpin(cx) { - Poll::Ready(Some(res)) => pin.handle_response(res), - Poll::Ready(None) => return Poll::Ready(()), - Poll::Pending => return Poll::Pending, - } - } - } - } -} - -#[cfg(test)] -mod tests { - use std::collections::HashMap; - use std::sync::Arc; - - use dojo_types::schema::Ty; - use dojo_types::WorldMetadata; - use dojo_world::contracts::naming::compute_selector_from_names; - use parking_lot::RwLock; - use starknet::macros::felt; - use torii_grpc::types::ModelKeysClause; - - use crate::utils::compute_all_storage_addresses; - - fn create_dummy_metadata() -> WorldMetadata { - let components = HashMap::from([( - compute_selector_from_names("Test", "Position"), - dojo_types::schema::ModelMetadata { - namespace: "Test".into(), - name: "Position".into(), - class_hash: felt!("1"), - contract_address: felt!("2"), - packed_size: 1, - unpacked_size: 2, - layout: vec![], - schema: Ty::Primitive(dojo_types::primitive::Primitive::Bool(None)), - }, - )]); - - WorldMetadata { models: components, ..Default::default() } - } - - #[test] - fn add_and_remove_subscribed_model() { - let model_name = String::from("Test-Position"); - let keys = vec![felt!("0x12345")]; - let packed_size: u32 = 1; - - let mut expected_storage_addresses = compute_all_storage_addresses( - compute_selector_from_names("Test", "Position"), - &keys, - packed_size, - ) - .into_iter(); - - let metadata = self::create_dummy_metadata(); - - let keys = ModelKeysClause { model: model_name, keys }; - - let subscribed_models = super::SubscribedModels::new(Arc::new(RwLock::new(metadata))); - subscribed_models.add_models(vec![keys.clone()]).expect("able to add model"); - - let actual_storage_addresses_count = - subscribed_models.subscribed_storage_addresses.read().len(); - let actual_storage_addresses = - subscribed_models.subscribed_storage_addresses.read().clone(); - - assert!(subscribed_models.models_keys.read().contains(&keys)); - assert_eq!(actual_storage_addresses_count, expected_storage_addresses.len()); - assert!(expected_storage_addresses.all(|addr| actual_storage_addresses.contains(&addr))); - - subscribed_models.remove_models(vec![keys.clone()]).expect("able to remove entities"); - - let actual_storage_addresses_count_after = - subscribed_models.subscribed_storage_addresses.read().len(); - - assert_eq!(actual_storage_addresses_count_after, 0); - assert!(!subscribed_models.models_keys.read().contains(&keys)); - } -} diff --git a/crates/torii/client/src/lib.rs b/crates/torii/client/src/lib.rs index 7b4bc605cf..86b7bddd60 100644 --- a/crates/torii/client/src/lib.rs +++ b/crates/torii/client/src/lib.rs @@ -4,4 +4,3 @@ extern crate wasm_prost as prost; extern crate wasm_tonic as tonic; pub mod client; -pub mod utils; diff --git a/crates/torii/client/src/utils.rs b/crates/torii/client/src/utils.rs deleted file mode 100644 index b476ba91c3..0000000000 --- a/crates/torii/client/src/utils.rs +++ /dev/null @@ -1,22 +0,0 @@ -use num_traits::FromPrimitive; -use starknet::core::types::Felt; -use starknet::macros::short_string; -use starknet_crypto::poseidon_hash_many; - -/// Compute the base storage address for a given component of an entity. -pub fn compute_storage_base_address(model: Felt, entity_keys: &[Felt]) -> Felt { - poseidon_hash_many(&[short_string!("dojo_storage"), model, poseidon_hash_many(entity_keys)]) -} - -/// Compute all the storage addresses that are used for a given component of an entity when it is -/// stored in the World storage. -pub(crate) fn compute_all_storage_addresses( - model: Felt, - entity_keys: &[Felt], - packed_size: u32, -) -> Vec { - let base = compute_storage_base_address(model, entity_keys); - (0..packed_size) - .map(|i| base + Felt::from_u32(i).expect("u32 should fit in Felt")) - .collect::>() -} From 2b09547fb16c8f539d4f439b3029cf06cc51bda3 Mon Sep 17 00:00:00 2001 From: Larko <59736843+Larkooo@users.noreply.github.com> Date: Mon, 5 Aug 2024 18:57:42 -0400 Subject: [PATCH 08/10] fix(torii): member clause escaped table name (#2255) --- crates/torii/grpc/src/server/mod.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/torii/grpc/src/server/mod.rs b/crates/torii/grpc/src/server/mod.rs index e69ada8461..db5aa6c2f2 100644 --- a/crates/torii/grpc/src/server/mod.rs +++ b/crates/torii/grpc/src/server/mod.rs @@ -516,7 +516,7 @@ impl DojoWorld { table, entity_relation_column, Some(&format!( - "{table_name}.{column_name} {comparison_operator} ? ORDER BY {table}.event_id \ + "[{table_name}].{column_name} {comparison_operator} ? ORDER BY {table}.event_id \ DESC LIMIT ? OFFSET ?" )), None, From 8d077cccd23158f5e624e6c651ed60b7461ee9a7 Mon Sep 17 00:00:00 2001 From: Larko <59736843+Larkooo@users.noreply.github.com> Date: Mon, 5 Aug 2024 19:02:07 -0400 Subject: [PATCH 09/10] fix(torii-grpc): deser from db for grpc enums (#2259) * fix(torii-grpc): deser from db for grpc enums * refactor: fix broken type name from contributor * revert * chore: more helpful comment * refactor: enum type name * fmt --- crates/dojo-types/src/schema.rs | 12 +------ crates/dojo-world/src/contracts/model.rs | 18 +++++++---- crates/torii/core/src/model.rs | 11 +++++-- crates/torii/grpc/src/types/schema.rs | 41 +++++++++++------------- 4 files changed, 39 insertions(+), 43 deletions(-) diff --git a/crates/dojo-types/src/schema.rs b/crates/dojo-types/src/schema.rs index f5497c06bf..c1783f496e 100644 --- a/crates/dojo-types/src/schema.rs +++ b/crates/dojo-types/src/schema.rs @@ -54,17 +54,7 @@ impl Ty { match self { Ty::Primitive(c) => c.to_string(), Ty::Struct(s) => s.name.clone(), - Ty::Enum(e) => e.name.replace( - "", - &e.options - .iter() - .map(|o| { - let t = o.ty.name().replace("()", ""); - format!("<{}>", t) - }) - .unique() - .join(""), - ), + Ty::Enum(e) => e.name.clone(), Ty::Tuple(tys) => format!("({})", tys.iter().map(|ty| ty.name()).join(", ")), Ty::Array(ty) => format!("Array<{}>", ty[0].name()), Ty::ByteArray(_) => "ByteArray".to_string(), diff --git a/crates/dojo-world/src/contracts/model.rs b/crates/dojo-world/src/contracts/model.rs index d6b7d61d48..c887ca572d 100644 --- a/crates/dojo-world/src/contracts/model.rs +++ b/crates/dojo-world/src/contracts/model.rs @@ -221,19 +221,25 @@ fn parse_schema(ty: &abigen::model::Ty) -> Result { Ok(Ty::Struct(Struct { name, children })) } abigen::model::Ty::Enum(enum_) => { - let name = parse_cairo_short_string(&enum_.name)?; + let mut name = parse_cairo_short_string(&enum_.name)?; let options = enum_ .children .iter() - .map(|(name, ty)| { - // strip of the type (T) of the enum variant for now + .map(|(variant_name, ty)| { + // strip "(T)" of the type of the enum variant for now // breaks the db queries - let name = - parse_cairo_short_string(name)?.split('(').next().unwrap().to_string(); + // Some(T) => Some + let mut variant_name = parse_cairo_short_string(variant_name)?; + let ty = parse_schema(ty)?; + // generalize this for any generic name? + if variant_name.ends_with("(T)") { + variant_name = variant_name.trim_end_matches("(T)").to_string(); + name = name.replace("", format!("<{}>", ty.name()).as_str()); + } - Ok(EnumOption { name, ty }) + Ok(EnumOption { name: variant_name, ty }) }) .collect::, ParseError>>()?; diff --git a/crates/torii/core/src/model.rs b/crates/torii/core/src/model.rs index c4fea400b3..d991d86fab 100644 --- a/crates/torii/core/src/model.rs +++ b/crates/torii/core/src/model.rs @@ -425,6 +425,7 @@ pub fn map_row_to_ty( arrays_rows: &HashMap>, ) -> Result<(), Error> { let column_name = format!("{}.{}", path, name); + match ty { Ty::Primitive(primitive) => { match &primitive { @@ -500,7 +501,7 @@ pub fn map_row_to_ty( } Primitive::ClassHash(_) => { let value = row.try_get::(&column_name)?; - primitive.set_contract_address(Some( + primitive.set_class_hash(Some( Felt::from_str(&value).map_err(ParseError::FromStr)?, ))?; } @@ -513,11 +514,15 @@ pub fn map_row_to_ty( }; } Ty::Enum(enum_ty) => { - let option = row.try_get::(&column_name)?; - enum_ty.set_option(&option)?; + let option_name = row.try_get::(&column_name)?; + enum_ty.set_option(&option_name)?; let path = [path, name].join("$"); for option in &mut enum_ty.options { + if option.name != option_name { + continue; + } + map_row_to_ty(&path, &option.name, &mut option.ty, row, arrays_rows)?; } } diff --git a/crates/torii/grpc/src/types/schema.rs b/crates/torii/grpc/src/types/schema.rs index 8f63d746d0..00a837cd62 100644 --- a/crates/torii/grpc/src/types/schema.rs +++ b/crates/torii/grpc/src/types/schema.rs @@ -189,36 +189,31 @@ impl From for proto::types::Primitive { use proto::types::value::ValueType; let value_type = match primitive { - Primitive::I8(i8) => i8.map(|val| ValueType::IntValue(val as i64)), - Primitive::I16(i16) => i16.map(|val| ValueType::IntValue(val as i64)), - Primitive::I32(i32) => i32.map(|val| ValueType::IntValue(val as i64)), - Primitive::I64(i64) => i64.map(ValueType::IntValue), + Primitive::I8(i8) => ValueType::IntValue(i8.unwrap_or_default() as i64), + Primitive::I16(i16) => ValueType::IntValue(i16.unwrap_or_default() as i64), + Primitive::I32(i32) => ValueType::IntValue(i32.unwrap_or_default() as i64), + Primitive::I64(i64) => ValueType::IntValue(i64.unwrap_or_default()), Primitive::I128(i128) => { - i128.map(|val| ValueType::ByteValue(val.to_be_bytes().to_vec())) + ValueType::ByteValue(i128.unwrap_or_default().to_be_bytes().to_vec()) } - Primitive::U8(u8) => u8.map(|val| ValueType::UintValue(val as u64)), - Primitive::U16(u16) => u16.map(|val| ValueType::UintValue(val as u64)), - Primitive::U32(u32) => u32.map(|val| ValueType::UintValue(val as u64)), - Primitive::U64(u64) => u64.map(ValueType::UintValue), + Primitive::U8(u8) => ValueType::UintValue(u8.unwrap_or_default() as u64), + Primitive::U16(u16) => ValueType::UintValue(u16.unwrap_or_default() as u64), + Primitive::U32(u32) => ValueType::UintValue(u32.unwrap_or_default() as u64), + Primitive::U64(u64) => ValueType::UintValue(u64.unwrap_or_default()), Primitive::U128(u128) => { - u128.map(|val| ValueType::ByteValue(val.to_be_bytes().to_vec())) + ValueType::ByteValue(u128.unwrap_or_default().to_be_bytes().to_vec()) } Primitive::U256(u256) => { - u256.map(|val| ValueType::ByteValue(val.to_be_bytes().to_vec())) + ValueType::ByteValue(u256.unwrap_or_default().to_be_bytes().to_vec()) } - Primitive::USize(usize) => usize.map(|val| ValueType::UintValue(val as u64)), - Primitive::Bool(bool) => bool.map(ValueType::BoolValue), - Primitive::Felt252(felt) => { - felt.map(|val| ValueType::ByteValue(val.to_bytes_be().to_vec())) + Primitive::USize(usize) => ValueType::UintValue(usize.unwrap_or_default() as u64), + Primitive::Bool(bool) => ValueType::BoolValue(bool.unwrap_or_default()), + Primitive::Felt252(felt) + | Primitive::ClassHash(felt) + | Primitive::ContractAddress(felt) => { + ValueType::ByteValue(felt.unwrap_or_default().to_bytes_be().to_vec()) } - Primitive::ClassHash(class) => { - class.map(|val| ValueType::ByteValue(val.to_bytes_be().to_vec())) - } - Primitive::ContractAddress(contract) => { - contract.map(|val| ValueType::ByteValue(val.to_bytes_be().to_vec())) - } - } - .expect("value expected"); + }; proto::types::Primitive { value: Some(proto::types::Value { value_type: Some(value_type) }), From 1c0e8cc17e0c6e3fd4cc0d3e0826f19cff674740 Mon Sep 17 00:00:00 2001 From: Larko <59736843+Larkooo@users.noreply.github.com> Date: Mon, 5 Aug 2024 22:17:01 -0400 Subject: [PATCH 10/10] refactor(torii-grpc): subscribe to all for empty clauses (#2269) * refactor(torii-grpc): subscribe to all for empty clauses * fmt --- .../grpc/src/server/subscriptions/entity.rs | 109 +++++++++--------- .../src/server/subscriptions/event_message.rs | 109 +++++++++--------- 2 files changed, 112 insertions(+), 106 deletions(-) diff --git a/crates/torii/grpc/src/server/subscriptions/entity.rs b/crates/torii/grpc/src/server/subscriptions/entity.rs index 2b0c976d69..ee6a44275d 100644 --- a/crates/torii/grpc/src/server/subscriptions/entity.rs +++ b/crates/torii/grpc/src/server/subscriptions/entity.rs @@ -124,64 +124,67 @@ impl Service { // If we have a clause of keys, then check that the key pattern of the entity // matches the key pattern of the subscriber. - if !sub.clauses.iter().any(|clause| match clause { - EntityKeysClause::HashedKeys(hashed_keys) => { - hashed_keys.is_empty() || hashed_keys.contains(&hashed) - } - EntityKeysClause::Keys(clause) => { - // if we have a model clause, then we need to check that the entity - // has an updated model and that the model name matches the clause - if let Some(updated_model) = &entity.updated_model { - let name = updated_model.name(); - let (namespace, name) = name.split_once('-').unwrap(); - - if !clause.models.is_empty() - && !clause.models.iter().any(|clause_model| { - let (clause_namespace, clause_model) = - clause_model.split_once('-').unwrap(); - // if both namespace and model are empty, we should match all. - // if namespace is specified and model is empty or * we should match - // all models in the namespace - // if namespace and model are specified, we should match the - // specific model - (clause_namespace.is_empty() - || clause_namespace == namespace - || clause_namespace == "*") - && (clause_model.is_empty() - || clause_model == name - || clause_model == "*") - }) + if !sub.clauses.is_empty() + && !sub.clauses.iter().any(|clause| match clause { + EntityKeysClause::HashedKeys(hashed_keys) => { + hashed_keys.is_empty() || hashed_keys.contains(&hashed) + } + EntityKeysClause::Keys(clause) => { + // if we have a model clause, then we need to check that the entity + // has an updated model and that the model name matches the clause + if let Some(updated_model) = &entity.updated_model { + let name = updated_model.name(); + let (namespace, name) = name.split_once('-').unwrap(); + + if !clause.models.is_empty() + && !clause.models.iter().any(|clause_model| { + let (clause_namespace, clause_model) = + clause_model.split_once('-').unwrap(); + // if both namespace and model are empty, we should match all. + // if namespace is specified and model is empty or * we should + // match all models in the + // namespace if namespace + // and model are specified, we should match the + // specific model + (clause_namespace.is_empty() + || clause_namespace == namespace + || clause_namespace == "*") + && (clause_model.is_empty() + || clause_model == name + || clause_model == "*") + }) + { + return false; + } + } + + // if the key pattern doesnt match our subscribers key pattern, skip + // ["", "0x0"] would match with keys ["0x...", "0x0", ...] + if clause.pattern_matching == PatternMatching::FixedLen + && keys.len() != clause.keys.len() { return false; } - } - // if the key pattern doesnt match our subscribers key pattern, skip - // ["", "0x0"] would match with keys ["0x...", "0x0", ...] - if clause.pattern_matching == PatternMatching::FixedLen - && keys.len() != clause.keys.len() - { - return false; + return keys.iter().enumerate().all(|(idx, key)| { + // this is going to be None if our key pattern overflows the subscriber + // key pattern in this case we should skip + let sub_key = clause.keys.get(idx); + + match sub_key { + // the key in the subscriber must match the key of the entity + // athis index + Some(Some(sub_key)) => key == sub_key, + // otherwise, if we have no key we should automatically match. + // or.. we overflowed the subscriber key pattern + // but we're in VariableLen pattern matching + // so we should match all next keys + _ => true, + } + }); } - - return keys.iter().enumerate().all(|(idx, key)| { - // this is going to be None if our key pattern overflows the subscriber - // key pattern in this case we should skip - let sub_key = clause.keys.get(idx); - - match sub_key { - // the key in the subscriber must match the key of the entity - // athis index - Some(Some(sub_key)) => key == sub_key, - // otherwise, if we have no key we should automatically match. - // or.. we overflowed the subscriber key pattern - // but we're in VariableLen pattern matching - // so we should match all next keys - _ => true, - } - }); - } - }) { + }) + { continue; } diff --git a/crates/torii/grpc/src/server/subscriptions/event_message.rs b/crates/torii/grpc/src/server/subscriptions/event_message.rs index 5cabd5f03a..47792418dd 100644 --- a/crates/torii/grpc/src/server/subscriptions/event_message.rs +++ b/crates/torii/grpc/src/server/subscriptions/event_message.rs @@ -118,64 +118,67 @@ impl Service { // If we have a clause of keys, then check that the key pattern of the entity // matches the key pattern of the subscriber. - if !sub.clauses.iter().any(|clause| match clause { - EntityKeysClause::HashedKeys(hashed_keys) => { - hashed_keys.is_empty() || hashed_keys.contains(&hashed) - } - EntityKeysClause::Keys(clause) => { - // if we have a model clause, then we need to check that the entity - // has an updated model and that the model name matches the clause - if let Some(updated_model) = &entity.updated_model { - let name = updated_model.name(); - let (namespace, name) = name.split_once('-').unwrap(); - - if !clause.models.is_empty() - && !clause.models.iter().any(|clause_model| { - let (clause_namespace, clause_model) = - clause_model.split_once('-').unwrap(); - // if both namespace and model are empty, we should match all. - // if namespace is specified and model is empty or * we should match - // all models in the namespace - // if namespace and model are specified, we should match the - // specific model - (clause_namespace.is_empty() - || clause_namespace == namespace - || clause_namespace == "*") - && (clause_model.is_empty() - || clause_model == name - || clause_model == "*") - }) + if !sub.clauses.is_empty() + && !sub.clauses.iter().any(|clause| match clause { + EntityKeysClause::HashedKeys(hashed_keys) => { + hashed_keys.is_empty() || hashed_keys.contains(&hashed) + } + EntityKeysClause::Keys(clause) => { + // if we have a model clause, then we need to check that the entity + // has an updated model and that the model name matches the clause + if let Some(updated_model) = &entity.updated_model { + let name = updated_model.name(); + let (namespace, name) = name.split_once('-').unwrap(); + + if !clause.models.is_empty() + && !clause.models.iter().any(|clause_model| { + let (clause_namespace, clause_model) = + clause_model.split_once('-').unwrap(); + // if both namespace and model are empty, we should match all. + // if namespace is specified and model is empty or * we should + // match all models in the + // namespace if namespace + // and model are specified, we should match the + // specific model + (clause_namespace.is_empty() + || clause_namespace == namespace + || clause_namespace == "*") + && (clause_model.is_empty() + || clause_model == name + || clause_model == "*") + }) + { + return false; + } + } + + // if the key pattern doesnt match our subscribers key pattern, skip + // ["", "0x0"] would match with keys ["0x...", "0x0", ...] + if clause.pattern_matching == PatternMatching::FixedLen + && keys.len() != clause.keys.len() { return false; } - } - // if the key pattern doesnt match our subscribers key pattern, skip - // ["", "0x0"] would match with keys ["0x...", "0x0", ...] - if clause.pattern_matching == PatternMatching::FixedLen - && keys.len() != clause.keys.len() - { - return false; + return keys.iter().enumerate().all(|(idx, key)| { + // this is going to be None if our key pattern overflows the subscriber + // key pattern in this case we should skip + let sub_key = clause.keys.get(idx); + + match sub_key { + // the key in the subscriber must match the key of the entity + // athis index + Some(Some(sub_key)) => key == sub_key, + // otherwise, if we have no key we should automatically match. + // or.. we overflowed the subscriber key pattern + // but we're in VariableLen pattern matching + // so we should match all next keys + _ => true, + } + }); } - - return keys.iter().enumerate().all(|(idx, key)| { - // this is going to be None if our key pattern overflows the subscriber - // key pattern in this case we should skip - let sub_key = clause.keys.get(idx); - - match sub_key { - // the key in the subscriber must match the key of the entity - // athis index - Some(Some(sub_key)) => key == sub_key, - // otherwise, if we have no key we should automatically match. - // or.. we overflowed the subscriber key pattern - // but we're in VariableLen pattern matching - // so we should match all next keys - _ => true, - } - }); - } - }) { + }) + { continue; }