diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile index 32fe7261de..7acdf2de72 100644 --- a/.devcontainer/Dockerfile +++ b/.devcontainer/Dockerfile @@ -69,6 +69,7 @@ ARG DOJO_VERSION=stable ARG BUILD_TYPE=default RUN curl -L https://install.dojoengine.org | bash RUN curl --proto '=https' --tlsv1.2 -sSf https://docs.swmansion.com/scarb/install.sh | bash +RUN curl -L https://raw.githubusercontent.com/foundry-rs/starknet-foundry/master/scripts/install.sh | bash ENV PATH=${PATH}:/root/.dojo/bin RUN if [ "$BUILD_TYPE" = "release" ]; then \ echo "Installing Dojo version $DOJO_VERSION"; \ diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index a991cb5f30..0ca7723caa 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -117,7 +117,7 @@ jobs: scarb --manifest-path examples/spawn-and-move/Scarb.toml fmt --check scarb --manifest-path examples/simple/Scarb.toml fmt --check scarb --manifest-path crates/dojo/core/Scarb.toml fmt --check - scarb --manifest-path crates/dojo/core-cairo-test/Scarb.toml fmt --check + scarb --manifest-path crates/dojo/core-foundry-test/Scarb.toml fmt --check dojo-core-test: needs: build @@ -132,8 +132,7 @@ jobs: - uses: actions/checkout@v3 - run: | chmod +x /tmp/bins/sozo - /tmp/bins/sozo --manifest-path crates/dojo/core/Scarb.toml test - /tmp/bins/sozo --manifest-path crates/dojo/core-cairo-test/Scarb.toml test + /tmp/bins/sozo --manifest-path crates/dojo/core-foundry-test/Scarb.toml test dojo-spawn-and-move-example-test: needs: build diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index ac5ded5a7b..52515e9f71 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -112,16 +112,16 @@ jobs: VERSION_NAME: v${{ needs.prepare.outputs.tag_name }} run: | if [ "$PLATFORM_NAME" == "linux" ]; then - tar -czvf "dojo_${VERSION_NAME}_${PLATFORM_NAME}_${ARCH}.tar.gz" -C ./target/${TARGET}/release katana sozo torii dojo-language-server + tar -czvf "dojo_${VERSION_NAME}_${PLATFORM_NAME}_${ARCH}.tar.gz" -C ./target/${TARGET}/release katana sozo torii echo "file_name=dojo_${VERSION_NAME}_${PLATFORM_NAME}_${ARCH}.tar.gz" >> $GITHUB_OUTPUT elif [ "$PLATFORM_NAME" == "darwin" ]; then # We need to use gtar here otherwise the archive is corrupt. # See: https://github.com/actions/virtual-environments/issues/2619 - gtar -czvf "dojo_${VERSION_NAME}_${PLATFORM_NAME}_${ARCH}.tar.gz" -C ./target/${TARGET}/release katana sozo torii dojo-language-server + gtar -czvf "dojo_${VERSION_NAME}_${PLATFORM_NAME}_${ARCH}.tar.gz" -C ./target/${TARGET}/release katana sozo torii echo "file_name=dojo_${VERSION_NAME}_${PLATFORM_NAME}_${ARCH}.tar.gz" >> $GITHUB_OUTPUT else cd ./target/${TARGET}/release - 7z a -tzip "dojo_${VERSION_NAME}_${PLATFORM_NAME}_${ARCH}.zip" katana.exe sozo.exe torii.exe dojo-language-server.exe + 7z a -tzip "dojo_${VERSION_NAME}_${PLATFORM_NAME}_${ARCH}.zip" katana.exe sozo.exe torii.exe mv "dojo_${VERSION_NAME}_${PLATFORM_NAME}_${ARCH}.zip" ../../../ echo "file_name=dojo_${VERSION_NAME}_${PLATFORM_NAME}_${ARCH}.tar.gz" >> $GITHUB_OUTPUT fi diff --git a/Cargo.lock b/Cargo.lock index 26028e75d9..f68506cc0d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2260,7 +2260,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "40723b8fb387abc38f4f4a37c09073622e41dd12327033091ef8950659e6dc0c" dependencies = [ "memchr", - "regex-automata 0.4.7", + "regex-automata 0.4.9", "serde", ] @@ -2782,21 +2782,6 @@ dependencies = [ "itertools 0.12.1", ] -[[package]] -name = "cairo-lang-doc" -version = "2.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a932262ab491cf248283ccbe6d584a76fd55fc85ae0c7879b2ad687c512a115" -dependencies = [ - "cairo-lang-defs", - "cairo-lang-formatter", - "cairo-lang-parser", - "cairo-lang-syntax", - "cairo-lang-utils", - "itertools 0.12.1", - "rust-analyzer-salsa", -] - [[package]] name = "cairo-lang-eq-solver" version = "2.8.4" @@ -2843,43 +2828,6 @@ dependencies = [ "thiserror", ] -[[package]] -name = "cairo-lang-language-server" -version = "2.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b5dad8906d9d4b3876e6b2061f9ddd499f0514368e3e7e0aeaea70e80c3608a" -dependencies = [ - "anyhow", - "cairo-lang-compiler", - "cairo-lang-defs", - "cairo-lang-diagnostics", - "cairo-lang-doc", - "cairo-lang-filesystem", - "cairo-lang-formatter", - "cairo-lang-lowering", - "cairo-lang-parser", - "cairo-lang-project", - "cairo-lang-semantic", - "cairo-lang-starknet", - "cairo-lang-syntax", - "cairo-lang-test-plugin", - "cairo-lang-utils", - "indent", - "indoc 2.0.5", - "itertools 0.12.1", - "rust-analyzer-salsa", - "scarb-metadata 1.12.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde", - "serde_json", - "smol_str", - "tempfile", - "tokio", - "tower-lsp", - "tracing", - "tracing-chrome", - "tracing-subscriber", -] - [[package]] name = "cairo-lang-lowering" version = "2.8.4" @@ -2909,7 +2857,17 @@ name = "cairo-lang-macro" version = "0.1.0" source = "git+https://github.com/dojoengine/scarb?rev=7eac49b3e61236ce466e712225d9c989f9db1ef3#7eac49b3e61236ce466e712225d9c989f9db1ef3" dependencies = [ - "cairo-lang-macro-attributes", + "cairo-lang-macro-attributes 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "cairo-lang-macro-stable", + "linkme", +] + +[[package]] +name = "cairo-lang-macro" +version = "0.1.1" +source = "git+https://github.com/remybar/scarb?rev=f6953d5b0690f166011da5f911452922dd835a96#f6953d5b0690f166011da5f911452922dd835a96" +dependencies = [ + "cairo-lang-macro-attributes 0.1.0 (git+https://github.com/remybar/scarb?rev=f6953d5b0690f166011da5f911452922dd835a96)", "cairo-lang-macro-stable", "linkme", ] @@ -2925,6 +2883,16 @@ dependencies = [ "syn 2.0.77", ] +[[package]] +name = "cairo-lang-macro-attributes" +version = "0.1.0" +source = "git+https://github.com/remybar/scarb?rev=f6953d5b0690f166011da5f911452922dd835a96#f6953d5b0690f166011da5f911452922dd835a96" +dependencies = [ + "quote", + "scarb-stable-hash 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 2.0.77", +] + [[package]] name = "cairo-lang-macro-stable" version = "1.0.0" @@ -3272,29 +3240,6 @@ dependencies = [ "starknet-types-core", ] -[[package]] -name = "cairo-lang-test-runner" -version = "2.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3effbddf1d0cebab9c91ca46d9792ed441095e1eb75a53785a15e5f378f9c52e" -dependencies = [ - "anyhow", - "cairo-lang-compiler", - "cairo-lang-filesystem", - "cairo-lang-runner", - "cairo-lang-sierra", - "cairo-lang-sierra-generator", - "cairo-lang-sierra-to-casm", - "cairo-lang-starknet", - "cairo-lang-test-plugin", - "cairo-lang-utils", - "colored", - "itertools 0.12.1", - "num-traits 0.2.19", - "rayon", - "starknet-types-core", -] - [[package]] name = "cairo-lang-test-utils" version = "2.8.4" @@ -4887,33 +4832,22 @@ dependencies = [ ] [[package]] -name = "dojo-lang" -version = "1.0.5" +name = "dojo-macros" +version = "0.1.0" dependencies = [ - "anyhow", "cairo-lang-defs", - "cairo-lang-diagnostics", - "cairo-lang-filesystem", + "cairo-lang-macro 0.1.1", + "cairo-lang-parser", "cairo-lang-plugins", - "cairo-lang-semantic", "cairo-lang-syntax", "cairo-lang-utils", + "convert_case 0.6.0", "dojo-types 1.0.5", - "itertools 0.12.1", + "regex", "serde", - "smol_str", + "serde_json", "starknet 0.12.0", "starknet-crypto 0.7.2", - "tracing", -] - -[[package]] -name = "dojo-language-server" -version = "1.0.5" -dependencies = [ - "cairo-lang-language-server", - "clap", - "dojo-lang 1.0.5", ] [[package]] @@ -6667,8 +6601,8 @@ dependencies = [ "aho-corasick", "bstr", "log", - "regex-automata 0.4.7", - "regex-syntax 0.8.4", + "regex-automata 0.4.9", + "regex-syntax 0.8.5", ] [[package]] @@ -7545,7 +7479,7 @@ dependencies = [ "globset", "log", "memchr", - "regex-automata 0.4.7", + "regex-automata 0.4.9", "same-file", "walkdir", "winapi-util", @@ -8960,7 +8894,7 @@ dependencies = [ "petgraph", "pico-args", "regex", - "regex-syntax 0.8.4", + "regex-syntax 0.8.5", "string_cache", "term", "tiny-keccak", @@ -8974,7 +8908,7 @@ version = "0.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "507460a910eb7b32ee961886ff48539633b788a36b65692b95f225b844c82553" dependencies = [ - "regex-automata 0.4.7", + "regex-automata 0.4.9", ] [[package]] @@ -9683,19 +9617,6 @@ dependencies = [ "linked-hash-map", ] -[[package]] -name = "lsp-types" -version = "0.94.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c66bfd44a06ae10647fe3f8214762e9369fd4248df1350924b4ef9e770a85ea1" -dependencies = [ - "bitflags 1.3.2", - "serde", - "serde_json", - "serde_repr", - "url", -] - [[package]] name = "mach2" version = "0.4.2" @@ -11456,7 +11377,7 @@ dependencies = [ "rand 0.8.5", "rand_chacha", "rand_xorshift", - "regex-syntax 0.8.4", + "regex-syntax 0.8.5", "rusty-fork", "tempfile", "unarray", @@ -12006,14 +11927,14 @@ dependencies = [ [[package]] name = "regex" -version = "1.10.6" +version = "1.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4219d74c6b67a3654a9fbebc4b419e22126d13d2f3c4a07ee0cb61ff79a79619" +checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" dependencies = [ "aho-corasick", "memchr", - "regex-automata 0.4.7", - "regex-syntax 0.8.4", + "regex-automata 0.4.9", + "regex-syntax 0.8.5", ] [[package]] @@ -12027,13 +11948,13 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.7" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38caf58cc5ef2fed281f89292ef23f6365465ed9a41b7a7754eb4e26496c92df" +checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" dependencies = [ "aho-corasick", "memchr", - "regex-syntax 0.8.4", + "regex-syntax 0.8.5", ] [[package]] @@ -12044,9 +11965,9 @@ checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" [[package]] name = "regex-syntax" -version = "0.8.4" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b" +checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" [[package]] name = "relative-path" @@ -12953,7 +12874,7 @@ dependencies = [ "cairo-lang-filesystem", "cairo-lang-formatter", "cairo-lang-lowering", - "cairo-lang-macro", + "cairo-lang-macro 0.1.0", "cairo-lang-macro-stable", "cairo-lang-parser", "cairo-lang-semantic", @@ -12973,7 +12894,7 @@ dependencies = [ "derive_builder", "dialoguer", "directories", - "dojo-lang 1.0.0-rc.2", + "dojo-lang", "dunce", "fs4", "fs_extra", @@ -12993,7 +12914,7 @@ dependencies = [ "redb", "reqwest 0.11.27", "scarb-build-metadata", - "scarb-metadata 1.12.0 (git+https://github.com/dojoengine/scarb?rev=7eac49b3e61236ce466e712225d9c989f9db1ef3)", + "scarb-metadata", "scarb-stable-hash 1.0.0 (git+https://github.com/dojoengine/scarb?rev=7eac49b3e61236ce466e712225d9c989f9db1ef3)", "scarb-ui", "semver 1.0.23", @@ -13029,19 +12950,6 @@ dependencies = [ "cargo_metadata", ] -[[package]] -name = "scarb-metadata" -version = "1.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "170ebce1774a85568646ba4096827f898306665187eebd9282fee313e316518d" -dependencies = [ - "camino", - "semver 1.0.23", - "serde", - "serde_json", - "thiserror", -] - [[package]] name = "scarb-metadata" version = "1.12.0" @@ -13084,7 +12992,7 @@ dependencies = [ "clap", "console", "indicatif", - "scarb-metadata 1.12.0 (git+https://github.com/dojoengine/scarb?rev=7eac49b3e61236ce466e712225d9c989f9db1ef3)", + "scarb-metadata", "serde", "serde_json", "tracing-core", @@ -13835,24 +13743,15 @@ dependencies = [ "anyhow", "async-trait", "cainome 0.4.8", - "cairo-lang-compiler", - "cairo-lang-filesystem", - "cairo-lang-project", - "cairo-lang-starknet", - "cairo-lang-test-plugin", - "cairo-lang-test-runner", - "cairo-lang-utils", "camino", "clap", "clap-verbosity-flag", "colored", "dojo-bindgen", - "dojo-lang 1.0.5", "dojo-test-utils", "dojo-types 1.0.5", "dojo-utils", "dojo-world", - "itertools 0.12.1", "katana-rpc-api", "katana-runner", "notify", @@ -15876,40 +15775,6 @@ version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" -[[package]] -name = "tower-lsp" -version = "0.20.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4ba052b54a6627628d9b3c34c176e7eda8359b7da9acd497b9f20998d118508" -dependencies = [ - "async-trait", - "auto_impl", - "bytes", - "dashmap 5.5.3", - "futures", - "httparse", - "lsp-types", - "memchr", - "serde", - "serde_json", - "tokio", - "tokio-util", - "tower 0.4.13", - "tower-lsp-macros", - "tracing", -] - -[[package]] -name = "tower-lsp-macros" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84fd902d4e0b9a4b27f2f440108dc034e1758628a9b702f8ec61ad66355422fa" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.77", -] - [[package]] name = "tower-service" version = "0.3.3" @@ -15939,17 +15804,6 @@ dependencies = [ "syn 2.0.77", ] -[[package]] -name = "tracing-chrome" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf0a738ed5d6450a9fb96e86a23ad808de2b727fd1394585da5cdd6788ffe724" -dependencies = [ - "serde_json", - "tracing-core", - "tracing-subscriber", -] - [[package]] name = "tracing-core" version = "0.1.32" diff --git a/Cargo.toml b/Cargo.toml index e84cc6cb8e..2424426ea8 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -2,7 +2,6 @@ resolver = "2" members = [ - "bin/dojo-language-server", "bin/katana", "bin/saya", "bin/scheduler", @@ -10,7 +9,7 @@ members = [ "bin/torii", "crates/dojo/bindgen", "crates/dojo/core", - "crates/dojo/lang", + "crates/dojo/macros", "crates/dojo/test-utils", "crates/dojo/types", "crates/dojo/utils", @@ -83,7 +82,7 @@ dojo-metrics = { path = "crates/metrics" } # dojo-lang dojo-bindgen = { path = "crates/dojo/bindgen" } dojo-core = { path = "crates/dojo/core" } -dojo-lang = { path = "crates/dojo/lang" } +dojo-macros = { path = "crates/dojo/macros" } dojo-test-utils = { path = "crates/dojo/test-utils" } dojo-types = { path = "crates/dojo/types" } dojo-world = { path = "crates/dojo/world" } @@ -144,17 +143,14 @@ auto_impl = "1.2.0" base64 = "0.21.2" bigdecimal = "0.4.1" bytes = "1.6" -cairo-lang-compiler = "=2.8.4" cairo-lang-debug = "=2.8.4" cairo-lang-defs = "=2.8.4" cairo-lang-diagnostics = "2.7.0" -cairo-lang-filesystem = "=2.8.4" cairo-lang-formatter = "=2.8.4" cairo-lang-language-server = "=2.8.4" cairo-lang-lowering = "=2.8.4" cairo-lang-parser = "=2.8.4" cairo-lang-plugins = { version = "=2.8.4", features = [ "testing" ] } -cairo-lang-project = "=2.8.4" cairo-lang-semantic = "=2.8.4" cairo-lang-sierra = "=2.8.4" cairo-lang-sierra-generator = "=2.8.4" @@ -163,7 +159,6 @@ cairo-lang-starknet = "=2.8.4" cairo-lang-starknet-classes = "=2.8.4" cairo-lang-syntax = "=2.8.4" cairo-lang-test-plugin = "=2.8.4" -cairo-lang-test-runner = "=2.8.4" cairo-lang-test-utils = "=2.8.4" cairo-lang-utils = "=2.8.4" cairo-vm = "1.0.0-rc4" diff --git a/bin/dojo-language-server/Cargo.toml b/bin/dojo-language-server/Cargo.toml deleted file mode 100644 index 8dc16e26b0..0000000000 --- a/bin/dojo-language-server/Cargo.toml +++ /dev/null @@ -1,11 +0,0 @@ -[package] -edition.workspace = true -name = "dojo-language-server" -version.workspace = true - -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - -[dependencies] -cairo-lang-language-server.workspace = true -clap.workspace = true -dojo-lang.workspace = true diff --git a/bin/dojo-language-server/src/main.rs b/bin/dojo-language-server/src/main.rs deleted file mode 100644 index 7f12f22078..0000000000 --- a/bin/dojo-language-server/src/main.rs +++ /dev/null @@ -1,16 +0,0 @@ -use cairo_lang_language_server::Tricks; -use clap::Parser; -use dojo_lang::dojo_plugin_suite; - -/// Dojo Language Server -#[derive(Parser, Debug)] -#[command(author, version, about, long_about = None)] -struct Args {} - -fn main() { - let _args = Args::parse(); - - let mut tricks = Tricks::default(); - tricks.extra_plugin_suites = Some(&|| vec![dojo_plugin_suite()]); - cairo_lang_language_server::start_with_tricks(tricks); -} diff --git a/bin/sozo/Cargo.toml b/bin/sozo/Cargo.toml index 6831fbf059..a6a10122b5 100644 --- a/bin/sozo/Cargo.toml +++ b/bin/sozo/Cargo.toml @@ -11,23 +11,14 @@ slot = { workspace = true, optional = true } anyhow.workspace = true async-trait.workspace = true cainome.workspace = true -cairo-lang-compiler.workspace = true -cairo-lang-filesystem.workspace = true -cairo-lang-project.workspace = true -cairo-lang-starknet.workspace = true -cairo-lang-test-plugin.workspace = true -cairo-lang-test-runner.workspace = true -cairo-lang-utils.workspace = true camino.workspace = true clap.workspace = true clap-verbosity-flag.workspace = true colored.workspace = true dojo-bindgen.workspace = true -dojo-lang.workspace = true dojo-types.workspace = true dojo-utils.workspace = true dojo-world.workspace = true -itertools.workspace = true katana-rpc-api.workspace = true notify = "7.0.0" tabled = { version = "0.16.0", features = [ "ansi" ] } diff --git a/bin/sozo/src/commands/events.rs b/bin/sozo/src/commands/events.rs index 5471de2fde..977588569d 100644 --- a/bin/sozo/src/commands/events.rs +++ b/bin/sozo/src/commands/events.rs @@ -86,7 +86,7 @@ impl EventsArgs { provider.get_events(event_filter, self.continuation_token, self.chunk_size).await?; for event in &res.events { - match world::Event::try_from(event) { + match world::Event::try_from(event.clone()) { Ok(ev) => { match_event( &ev, diff --git a/bin/sozo/src/commands/test.rs b/bin/sozo/src/commands/test.rs index 772a87df1a..619d59bfe5 100644 --- a/bin/sozo/src/commands/test.rs +++ b/bin/sozo/src/commands/test.rs @@ -1,60 +1,23 @@ //! Compiles and runs tests for a Dojo project. -//! -//! We can't use scarb to run tests since our injection will not work. -//! Scarb uses other binaries to run tests. Dojo plugin injection is done in scarb itself. -//! When proc macro will be fully supported, we can switch back to scarb. -use anyhow::{bail, Result}; -use cairo_lang_compiler::db::RootDatabase; -use cairo_lang_compiler::diagnostics::DiagnosticsReporter; -use cairo_lang_compiler::project::{ProjectConfig, ProjectConfigContent}; -use cairo_lang_filesystem::cfg::{Cfg, CfgSet}; -use cairo_lang_filesystem::db::{CrateSettings, ExperimentalFeaturesConfig, FilesGroup}; -use cairo_lang_filesystem::ids::{CrateId, CrateLongId, Directory}; -use cairo_lang_project::AllCratesConfig; -use cairo_lang_starknet::starknet_plugin_suite; -use cairo_lang_test_plugin::{test_plugin_suite, TestsCompilationConfig}; -use cairo_lang_test_runner::{CompiledTestRunner, RunProfilerConfig, TestCompiler, TestRunConfig}; -use cairo_lang_utils::ordered_hash_map::OrderedHashMap; use clap::Args; -use dojo_lang::dojo_plugin_suite; -use itertools::Itertools; -use scarb::compiler::{ - CairoCompilationUnit, CompilationUnit, CompilationUnitAttributes, ContractSelector, -}; -use scarb::core::{Config, Package, TargetKind}; -use scarb::ops::{self, CompileOpts}; +use scarb::compiler::ContractSelector; +use scarb::core::{Config, Package}; +use scarb::ops; +use scarb::ops::{validate_features, FeaturesOpts}; use scarb_ui::args::{FeaturesSpec, PackagesFilter}; use serde::{Deserialize, Serialize}; -use smol_str::SmolStr; -use tracing::trace; - -pub const WORLD_QUALIFIED_PATH: &str = "dojo::world::world_contract::world"; use super::check_package_dojo_version; +const TEST_COMMAND: &str = "scarb"; +const TEST_COMMAND_FIRST_ARG: &str = "test"; + #[derive(Debug, Default, Serialize, Deserialize)] #[serde(rename_all = "kebab-case")] pub struct Props { pub build_external_contracts: Option>, } -#[derive(Debug, Clone, PartialEq, clap::ValueEnum)] -pub enum ProfilerMode { - None, - Cairo, - Sierra, -} - -impl From for RunProfilerConfig { - fn from(mode: ProfilerMode) -> Self { - match mode { - ProfilerMode::None => RunProfilerConfig::None, - ProfilerMode::Cairo => RunProfilerConfig::Cairo, - ProfilerMode::Sierra => RunProfilerConfig::Sierra, - } - } -} - /// Execute all unit tests of a local package. #[derive(Debug, Args)] pub struct TestArgs { @@ -67,12 +30,9 @@ pub struct TestArgs { /// Should we run only the ignored tests. #[arg(long, default_value_t = false)] ignored: bool, - /// Should we run the profiler and with what mode. - #[arg(long, default_value = "none")] - profiler_mode: ProfilerMode, - /// Should we run the tests with gas enabled. - #[arg(long, default_value_t = true)] - gas_enabled: bool, + /// Should we run the profiler. + #[arg(long, default_value_t = false)] + profiler: bool, /// Should we print the resource usage. #[arg(long, default_value_t = false)] print_resource_usage: bool, @@ -85,14 +45,13 @@ pub struct TestArgs { } impl TestArgs { - // TODO: move this into the DojoCompiler. - pub fn run(self, config: &Config) -> anyhow::Result<()> { + pub fn run(&self, config: &Config) -> anyhow::Result<()> { let ws = ops::read_workspace(config.manifest_path(), config).unwrap_or_else(|err| { eprintln!("error: {err}"); std::process::exit(1); }); - let packages: Vec = if let Some(filter) = self.packages { + let packages: Vec = if let Some(filter) = &self.packages { filter.match_many(&ws)?.into_iter().collect() } else { ws.members().collect() @@ -102,201 +61,44 @@ impl TestArgs { check_package_dojo_version(&ws, p)?; } - let resolve = ops::resolve_workspace(&ws)?; - - let opts = CompileOpts { - include_target_kinds: vec![TargetKind::TEST], - exclude_target_kinds: vec![], - include_target_names: vec![], - features: self.features.try_into()?, - }; - - let compilation_units = ops::generate_compilation_units(&resolve, &opts.features, &ws)? - .into_iter() - .filter(|cu| { - let is_excluded = - opts.exclude_target_kinds.contains(&cu.main_component().target_kind()); - let is_included = opts.include_target_kinds.is_empty() - || opts.include_target_kinds.contains(&cu.main_component().target_kind()); - let is_included = is_included - && (opts.include_target_names.is_empty() - || cu - .main_component() - .targets - .iter() - .any(|t| opts.include_target_names.contains(&t.name))); - - let is_selected = packages.iter().any(|p| p.id == cu.main_package_id()); - - let is_cairo_plugin = matches!(cu, CompilationUnit::ProcMacro(_)); - is_cairo_plugin || (is_included && is_selected && !is_excluded) - }) - .collect::>(); - - for unit in compilation_units { - let unit = if let CompilationUnit::Cairo(unit) = unit { - unit - } else { - continue; - }; - - config.ui().print(format!("testing {}", unit.name())); - - let props: Props = unit.main_component().target_props()?; - let db = build_root_database(&unit)?; - - if DiagnosticsReporter::stderr().allow_warnings().check(&db) { - bail!("failed to compile"); - } - - let test_crate_ids = collect_main_crate_ids(&unit, &db, false); - - let mut main_crate_ids = collect_all_crate_ids(&unit, &db); - - if let Some(external_contracts) = props.build_external_contracts { - main_crate_ids.extend(collect_crates_ids_from_selectors(&db, &external_contracts)); - } - - let config = TestRunConfig { - filter: self.filter.clone(), - ignored: self.ignored, - include_ignored: self.include_ignored, - run_profiler: self.profiler_mode.clone().into(), - gas_enabled: self.gas_enabled, - print_resource_usage: self.print_resource_usage, - }; - - let compiler = TestCompiler { - db: db.snapshot(), - main_crate_ids, - test_crate_ids, - allow_warnings: true, - config: TestsCompilationConfig { - starknet: true, - add_statements_functions: false, - add_statements_code_locations: false, - }, - }; - - let compiled = compiler.build()?; - let runner = CompiledTestRunner { compiled, config }; - - // Database is required here for the profiler to work. - runner.run(Some(&db))?; - - println!(); - } - - Ok(()) - } -} - -pub(crate) fn build_root_database(unit: &CairoCompilationUnit) -> Result { - let mut b = RootDatabase::builder(); - b.with_project_config(build_project_config(unit)?); - b.with_cfg(CfgSet::from_iter([Cfg::name("test"), Cfg::kv("target", "test")])); - - b.with_plugin_suite(test_plugin_suite()); - b.with_plugin_suite(dojo_plugin_suite()); - b.with_plugin_suite(starknet_plugin_suite()); - - b.build() -} - -fn build_project_config(unit: &CairoCompilationUnit) -> Result { - let crate_roots = unit - .components - .iter() - .filter(|c| !c.package.id.is_core()) - // NOTE: We're taking the first target of each compilation unit, which should always be the - // main package source root due to the order maintained by scarb. - .map(|c| { - ( - c.cairo_package_name(), - c.first_target().source_root().into(), - ) + let features_opts: FeaturesOpts = self.features.clone().try_into()?; + validate_features(&packages, &features_opts)?; + + packages.iter().try_for_each(|package| { + std::process::Command::new(TEST_COMMAND) + .args(self.build_args()) + .current_dir(package.root()) + .stdout(std::process::Stdio::inherit()) + .output() + .map_err(|_| { + anyhow::anyhow!( + "Unable to run `{TEST_COMMAND} {TEST_COMMAND_FIRST_ARG}` for {}", + package.manifest_path() + ) + }) + .map(|_| ()) }) - .collect(); - - let corelib = - unit.core_package_component().map(|c| Directory::Real(c.targets[0].source_root().into())); - - let crates_config = crates_config_for_compilation_unit(unit); - - let content = ProjectConfigContent { crate_roots, crates_config }; - - let project_config = - ProjectConfig { base_path: unit.main_component().package.root().into(), corelib, content }; - - trace!(?project_config, "Project config built."); - - Ok(project_config) -} - -/// Collects the main crate ids for Dojo including the core crates. -pub fn collect_main_crate_ids( - unit: &CairoCompilationUnit, - db: &RootDatabase, - with_dojo_core: bool, -) -> Vec { - let mut main_crate_ids = scarb::compiler::helpers::collect_main_crate_ids(unit, db); - - if unit.main_package_id.name.to_string() != "dojo" && with_dojo_core { - let core_crate_ids: Vec = collect_crates_ids_from_selectors( - db, - &[ContractSelector(WORLD_QUALIFIED_PATH.to_string())], - ); - - main_crate_ids.extend(core_crate_ids); } - main_crate_ids -} + pub fn build_args(&self) -> Vec<&str> { + let mut args = vec![TEST_COMMAND_FIRST_ARG]; -/// Collects the crate ids containing the given contract selectors. -pub fn collect_crates_ids_from_selectors( - db: &RootDatabase, - contract_selectors: &[ContractSelector], -) -> Vec { - contract_selectors - .iter() - .map(|selector| selector.package().into()) - .unique() - .map(|package_name: SmolStr| db.intern_crate(CrateLongId::Real(package_name))) - .collect::>() -} + if self.include_ignored { + args.push("--include-ignored"); + } -pub fn collect_all_crate_ids(unit: &CairoCompilationUnit, db: &RootDatabase) -> Vec { - unit.components - .iter() - .map(|component| db.intern_crate(CrateLongId::Real(component.cairo_package_name()))) - .collect() -} + if self.ignored { + args.push("--ignored"); + } -pub fn crates_config_for_compilation_unit(unit: &CairoCompilationUnit) -> AllCratesConfig { - let crates_config: OrderedHashMap = unit - .components() - .iter() - .map(|component| { - // Ensure experimental features are only enable if required. - let experimental_features = component.package.manifest.experimental_features.clone(); - let experimental_features = experimental_features.unwrap_or_default(); + if self.print_resource_usage { + args.push("--detailed-resources"); + } - ( - component.cairo_package_name(), - CrateSettings { - version: Some(component.package.id.version.clone()), - edition: component.package.manifest.edition, - experimental_features: ExperimentalFeaturesConfig { - negative_impls: experimental_features - .contains(&SmolStr::new_inline("negative_impls")), - coupons: experimental_features.contains(&SmolStr::new_inline("coupons")), - }, - cfg_set: component.cfg_set.clone(), - }, - ) - }) - .collect(); + if self.profiler { + args.push("--build-profile"); + } - AllCratesConfig { override_map: crates_config, ..Default::default() } + args + } } diff --git a/crates/benches/Cargo.toml b/crates/benches/Cargo.toml index e46982d00c..51d2818679 100644 --- a/crates/benches/Cargo.toml +++ b/crates/benches/Cargo.toml @@ -14,7 +14,6 @@ katana-runner.workspace = true anyhow.workspace = true clap.workspace = true -dojo-lang.workspace = true dojo-world.workspace = true futures.workspace = true hex.workspace = true diff --git a/crates/benches/contracts/src/models/character.cairo b/crates/benches/contracts/src/models/character.cairo index c1ace9b9eb..c09e0c8967 100644 --- a/crates/benches/contracts/src/models/character.cairo +++ b/crates/benches/contracts/src/models/character.cairo @@ -1,4 +1,4 @@ -use starknet::{ContractAddress, get_caller_address}; +use starknet::ContractAddress; // TODO import all this when complex benchmarks are merged #[derive(Introspect, Copy, Drop, Serde)] @@ -63,4 +63,4 @@ struct Alias { #[key] player: ContractAddress, name: felt252, -} \ No newline at end of file +} diff --git a/crates/dojo/core-cairo-test/Scarb.lock b/crates/dojo/core-cairo-test/Scarb.lock deleted file mode 100644 index 2c1a7ab14c..0000000000 --- a/crates/dojo/core-cairo-test/Scarb.lock +++ /dev/null @@ -1,20 +0,0 @@ -# Code generated by scarb DO NOT EDIT. -version = 1 - -[[package]] -name = "dojo" -version = "1.0.0-rc.0" -dependencies = [ - "dojo_plugin", -] - -[[package]] -name = "dojo_cairo_test" -version = "1.0.0-rc.0" -dependencies = [ - "dojo", -] - -[[package]] -name = "dojo_plugin" -version = "2.8.4" diff --git a/crates/dojo/core-cairo-test/src/tests/contract.cairo b/crates/dojo/core-cairo-test/src/tests/contract.cairo deleted file mode 100644 index 1fc1539eb1..0000000000 --- a/crates/dojo/core-cairo-test/src/tests/contract.cairo +++ /dev/null @@ -1,187 +0,0 @@ -use core::option::OptionTrait; -use core::traits::TryInto; - -use starknet::ClassHash; - -use dojo::contract::components::upgradeable::{IUpgradeableDispatcher, IUpgradeableDispatcherTrait}; -use dojo::world::IWorldDispatcherTrait; - -use crate::tests::helpers::deploy_world; - -#[starknet::contract] -pub mod contract_invalid_upgrade { - #[storage] - struct Storage {} - - #[abi(per_item)] - #[generate_trait] - pub impl InvalidImpl of InvalidContractTrait { - #[external(v0)] - fn no_dojo_name(self: @ContractState) -> ByteArray { - "test_contract" - } - } -} - -#[dojo::contract] -mod test_contract {} - -#[starknet::interface] -pub trait IQuantumLeap { - fn plz_more_tps(self: @T) -> felt252; -} - -#[starknet::contract] -pub mod test_contract_upgrade { - use dojo::contract::IContract; - use dojo::meta::IDeployedResource; - use dojo::world::IWorldDispatcher; - use dojo::contract::components::world_provider::IWorldProvider; - - #[storage] - struct Storage {} - - #[constructor] - fn constructor(ref self: ContractState) {} - - #[abi(embed_v0)] - pub impl QuantumLeap of super::IQuantumLeap { - fn plz_more_tps(self: @ContractState) -> felt252 { - 'daddy' - } - } - - #[abi(embed_v0)] - pub impl WorldProviderImpl of IWorldProvider { - fn world_dispatcher(self: @ContractState) -> IWorldDispatcher { - IWorldDispatcher { contract_address: starknet::contract_address_const::<'world'>() } - } - } - - #[abi(embed_v0)] - pub impl ContractImpl of IContract {} - - #[abi(embed_v0)] - pub impl Contract_DeployedContractImpl of IDeployedResource { - fn dojo_name(self: @ContractState) -> ByteArray { - "test_contract" - } - } -} - -#[test] -#[available_gas(7000000)] -fn test_upgrade_from_world() { - let world = deploy_world(); - let world = world.dispatcher; - - let base_address = world - .register_contract('salt', "dojo", test_contract::TEST_CLASS_HASH.try_into().unwrap()); - let new_class_hash: ClassHash = test_contract_upgrade::TEST_CLASS_HASH.try_into().unwrap(); - - world.upgrade_contract("dojo", new_class_hash); - - let quantum_dispatcher = IQuantumLeapDispatcher { contract_address: base_address }; - assert(quantum_dispatcher.plz_more_tps() == 'daddy', 'quantum leap failed'); -} - -#[test] -#[available_gas(7000000)] -#[should_panic(expected: ('ENTRYPOINT_NOT_FOUND', 'ENTRYPOINT_FAILED'))] -fn test_upgrade_from_world_not_world_provider() { - let world = deploy_world(); - let world = world.dispatcher; - - let _ = world - .register_contract('salt', "dojo", test_contract::TEST_CLASS_HASH.try_into().unwrap()); - let new_class_hash: ClassHash = contract_invalid_upgrade::TEST_CLASS_HASH.try_into().unwrap(); - - world.upgrade_contract("dojo", new_class_hash); -} - -#[test] -#[available_gas(6000000)] -#[should_panic(expected: ('must be called by world', 'ENTRYPOINT_FAILED'))] -fn test_upgrade_direct() { - let world = deploy_world(); - let world = world.dispatcher; - - let base_address = world - .register_contract('salt', "dojo", test_contract::TEST_CLASS_HASH.try_into().unwrap()); - let new_class_hash: ClassHash = test_contract_upgrade::TEST_CLASS_HASH.try_into().unwrap(); - - let upgradeable_dispatcher = IUpgradeableDispatcher { contract_address: base_address }; - upgradeable_dispatcher.upgrade(new_class_hash); -} - -#[starknet::interface] -trait IMetadataOnly { - fn dojo_name(self: @T) -> ByteArray; -} - -#[starknet::contract] -mod invalid_legacy_model { - #[storage] - struct Storage {} - - #[abi(embed_v0)] - impl InvalidModelMetadata of super::IMetadataOnly { - fn dojo_name(self: @ContractState) -> ByteArray { - "invalid_legacy_model" - } - } -} - -#[starknet::contract] -mod invalid_legacy_model_world { - #[storage] - struct Storage {} - - #[abi(embed_v0)] - impl InvalidModelName of super::IMetadataOnly { - fn dojo_name(self: @ContractState) -> ByteArray { - "invalid_legacy_model" - } - } -} - -#[starknet::contract] -mod invalid_model { - #[storage] - struct Storage {} - - #[abi(embed_v0)] - impl InvalidModelSelector of super::IMetadataOnly { - fn dojo_name(self: @ContractState) -> ByteArray { - "invalid_model" - } - } -} - -#[starknet::contract] -mod invalid_model_world { - #[storage] - struct Storage {} - - #[abi(embed_v0)] - impl InvalidModelSelector of super::IMetadataOnly { - fn dojo_name(self: @ContractState) -> ByteArray { - "invalid_model_world" - } - } -} - -#[test] -#[available_gas(6000000)] -#[should_panic( - expected: ( - "Namespace `` is invalid according to Dojo naming rules: ^[a-zA-Z0-9_]+$", - 'ENTRYPOINT_FAILED', - ) -)] -fn test_register_namespace_empty_name() { - let world = deploy_world(); - let world = world.dispatcher; - - world.register_namespace(""); -} diff --git a/crates/dojo/core-cairo-test/src/tests/helpers/event.cairo b/crates/dojo/core-cairo-test/src/tests/helpers/event.cairo deleted file mode 100644 index 4b41eaf263..0000000000 --- a/crates/dojo/core-cairo-test/src/tests/helpers/event.cairo +++ /dev/null @@ -1,110 +0,0 @@ -use core::starknet::ContractAddress; - -use dojo::world::{IWorldDispatcher}; - -use crate::world::{spawn_test_world, NamespaceDef, TestResource}; - -/// This file contains some partial event contracts written without the dojo::event -/// attribute, to avoid having several contracts with a same name/classhash, -/// as the test runner does not differenciate them. -/// These event contracts are used to test event upgrades in tests/event.cairo. - -// This event is used as a base to create the "previous" version of an event to be upgraded. -#[derive(Introspect)] -struct FooBaseEvent { - #[key] - pub caller: ContractAddress, - pub a: felt252, - pub b: u128, -} - -#[derive(Copy, Drop, Serde, Debug)] -#[dojo::event] -pub struct FooEventBadLayoutType { - #[key] - pub caller: ContractAddress, - pub a: felt252, - pub b: u128, -} - -#[derive(Copy, Drop, Serde, Debug)] -#[dojo::event] -struct FooEventMemberRemoved { - #[key] - pub caller: ContractAddress, - pub a: felt252, - pub b: u128, -} - -#[derive(Copy, Drop, Serde, Debug)] -#[dojo::event] -struct FooEventMemberAddedButRemoved { - #[key] - pub caller: ContractAddress, - pub a: felt252, - pub b: u128, -} - -#[derive(Copy, Drop, Serde, Debug)] -#[dojo::event] -struct FooEventMemberAddedButMoved { - #[key] - pub caller: ContractAddress, - pub a: felt252, - pub b: u128, -} - -#[derive(Copy, Drop, Serde, Debug)] -#[dojo::event] -struct FooEventMemberAdded { - #[key] - pub caller: ContractAddress, - pub a: felt252, - pub b: u128, -} - -pub fn deploy_world_for_event_upgrades() -> IWorldDispatcher { - let namespace_def = NamespaceDef { - namespace: "dojo", resources: [ - TestResource::Event(old_foo_event_bad_layout_type::TEST_CLASS_HASH.try_into().unwrap()), - TestResource::Event(e_FooEventMemberRemoved::TEST_CLASS_HASH.try_into().unwrap()), - TestResource::Event( - e_FooEventMemberAddedButRemoved::TEST_CLASS_HASH.try_into().unwrap() - ), - TestResource::Event(e_FooEventMemberAddedButMoved::TEST_CLASS_HASH.try_into().unwrap()), - TestResource::Event(e_FooEventMemberAdded::TEST_CLASS_HASH.try_into().unwrap()), - ].span() - }; - spawn_test_world([namespace_def].span()).dispatcher -} - -#[starknet::contract] -pub mod old_foo_event_bad_layout_type { - #[storage] - struct Storage {} - - #[abi(embed_v0)] - impl DeployedEventImpl of dojo::meta::interface::IDeployedResource { - fn dojo_name(self: @ContractState) -> ByteArray { - "FooEventBadLayoutType" - } - } - - #[abi(embed_v0)] - impl StoredImpl of dojo::meta::interface::IStoredResource { - fn schema(self: @ContractState) -> dojo::meta::introspect::Struct { - if let dojo::meta::introspect::Ty::Struct(mut s) = - dojo::meta::introspect::Introspect::::ty() { - s.name = 'FooEventBadLayoutType'; - s - } else { - panic!("Unexpected schema.") - } - } - - fn layout(self: @ContractState) -> dojo::meta::Layout { - // Should never happen as dojo::event always derive Introspect. - dojo::meta::Layout::Fixed([].span()) - } - } -} diff --git a/crates/dojo/core-cairo-test/src/tests/helpers/model.cairo b/crates/dojo/core-cairo-test/src/tests/helpers/model.cairo deleted file mode 100644 index 238f3e4fe0..0000000000 --- a/crates/dojo/core-cairo-test/src/tests/helpers/model.cairo +++ /dev/null @@ -1,71 +0,0 @@ -use core::starknet::ContractAddress; - -use dojo::world::IWorldDispatcher; - -use crate::world::{spawn_test_world, NamespaceDef, TestResource}; - -/// This file contains some partial model contracts written without the dojo::model -/// attribute, to avoid having several contracts with a same name/classhash, -/// as the test runner does not differenciate them. -/// These model contracts are used to test model upgrades in tests/model.cairo. - -#[derive(IntrospectPacked, Copy, Drop, Serde)] -#[dojo::model] -struct FooModelBadLayoutType { - #[key] - pub caller: ContractAddress, - pub a: felt252, - pub b: u128, -} - -#[derive(Introspect, Copy, Drop, Serde)] -#[dojo::model] -struct FooModelMemberRemoved { - #[key] - pub caller: ContractAddress, - pub a: felt252, - pub b: u128, -} - -#[derive(Introspect, Copy, Drop, Serde)] -#[dojo::model] -struct FooModelMemberAddedButRemoved { - #[key] - pub caller: ContractAddress, - pub a: felt252, - pub b: u128, -} - -#[derive(Introspect, Copy, Drop, Serde)] -#[dojo::model] -struct FooModelMemberAddedButMoved { - #[key] - pub caller: ContractAddress, - pub a: felt252, - pub b: u128, -} - -#[derive(Introspect, Copy, Drop, Serde)] -#[dojo::model] -struct FooModelMemberAdded { - #[key] - pub caller: ContractAddress, - pub a: felt252, - pub b: u128, -} - - -pub fn deploy_world_for_model_upgrades() -> IWorldDispatcher { - let namespace_def = NamespaceDef { - namespace: "dojo", resources: [ - TestResource::Model(m_FooModelBadLayoutType::TEST_CLASS_HASH.try_into().unwrap()), - TestResource::Model(m_FooModelMemberRemoved::TEST_CLASS_HASH.try_into().unwrap()), - TestResource::Model( - m_FooModelMemberAddedButRemoved::TEST_CLASS_HASH.try_into().unwrap() - ), - TestResource::Model(m_FooModelMemberAddedButMoved::TEST_CLASS_HASH.try_into().unwrap()), - TestResource::Model(m_FooModelMemberAdded::TEST_CLASS_HASH.try_into().unwrap()), - ].span() - }; - spawn_test_world([namespace_def].span()).dispatcher -} diff --git a/crates/dojo/core-cairo-test/src/tests/world/event.cairo b/crates/dojo/core-cairo-test/src/tests/world/event.cairo deleted file mode 100644 index 2c52779447..0000000000 --- a/crates/dojo/core-cairo-test/src/tests/world/event.cairo +++ /dev/null @@ -1,287 +0,0 @@ -use core::starknet::ContractAddress; - -use crate::tests::helpers::{ - SimpleEvent, e_SimpleEvent, DOJO_NSH, e_FooEventBadLayoutType, drop_all_events, deploy_world, - deploy_world_for_event_upgrades -}; -use dojo::world::{world, IWorldDispatcherTrait}; -use dojo::event::Event; - -#[derive(Copy, Drop, Serde, Debug)] -#[dojo::event] -pub struct FooEventMemberRemoved { - #[key] - pub caller: ContractAddress, - pub b: u128, -} - -#[derive(Copy, Drop, Serde, Debug)] -#[dojo::event] -pub struct FooEventMemberAddedButRemoved { - #[key] - pub caller: ContractAddress, - pub b: u128, - pub c: u256, - pub d: u256 -} - -#[derive(Copy, Drop, Serde, Debug)] -#[dojo::event] -pub struct FooEventMemberAddedButMoved { - #[key] - pub caller: ContractAddress, - pub b: u128, - pub a: felt252, - pub c: u256 -} - -#[derive(Copy, Drop, Serde, Debug)] -#[dojo::event] -pub struct FooEventMemberAdded { - #[key] - pub caller: ContractAddress, - pub a: felt252, - pub b: u128, - pub c: u256 -} - -#[test] -fn test_register_event_for_namespace_owner() { - let bob = starknet::contract_address_const::<0xb0b>(); - - let world = deploy_world(); - let world = world.dispatcher; - - world.grant_owner(DOJO_NSH, bob); - - drop_all_events(world.contract_address); - - starknet::testing::set_account_contract_address(bob); - starknet::testing::set_contract_address(bob); - world.register_event("dojo", e_SimpleEvent::TEST_CLASS_HASH.try_into().unwrap()); - - let event = starknet::testing::pop_log::(world.contract_address); - assert(event.is_some(), 'no event)'); - - if let world::Event::EventRegistered(event) = event.unwrap() { - assert(event.name == Event::::name(), 'bad event name'); - assert(event.namespace == "dojo", 'bad event namespace'); - assert( - event.class_hash == e_SimpleEvent::TEST_CLASS_HASH.try_into().unwrap(), - 'bad event class_hash' - ); - assert( - event.address != core::num::traits::Zero::::zero(), - 'bad event prev address' - ); - } else { - core::panic_with_felt252('no EventRegistered event'); - } - - assert(world.is_owner(Event::::selector(DOJO_NSH), bob), 'bob is not the owner'); -} - -#[test] -#[should_panic( - expected: ("Account `2827` does NOT have OWNER role on namespace `dojo`", 'ENTRYPOINT_FAILED',) -)] -fn test_register_event_for_namespace_writer() { - let bob = starknet::contract_address_const::<0xb0b>(); - - let world = deploy_world(); - let world = world.dispatcher; - - world.grant_writer(DOJO_NSH, bob); - - drop_all_events(world.contract_address); - - starknet::testing::set_account_contract_address(bob); - starknet::testing::set_contract_address(bob); - world.register_event("dojo", e_SimpleEvent::TEST_CLASS_HASH.try_into().unwrap()); -} - -#[test] -fn test_upgrade_event_from_event_owner() { - let bob = starknet::contract_address_const::<0xb0b>(); - - let world = deploy_world_for_event_upgrades(); - world.grant_owner(Event::::selector(DOJO_NSH), bob); - - starknet::testing::set_account_contract_address(bob); - starknet::testing::set_contract_address(bob); - - drop_all_events(world.contract_address); - - world.upgrade_event("dojo", e_FooEventMemberAdded::TEST_CLASS_HASH.try_into().unwrap()); - - let event = starknet::testing::pop_log::(world.contract_address); - assert(event.is_some(), 'no event)'); - - if let world::Event::EventUpgraded(event) = event.unwrap() { - assert( - event.selector == Event::::selector(DOJO_NSH), 'bad model selector' - ); - assert( - event.class_hash == e_FooEventMemberAdded::TEST_CLASS_HASH.try_into().unwrap(), - 'bad model class_hash' - ); - assert( - event.address != core::num::traits::Zero::::zero(), - 'bad model prev address' - ); - } else { - core::panic_with_felt252('no EventUpgraded event'); - } - - assert( - world.is_owner(Event::::selector(DOJO_NSH), bob), - 'bob is not the owner' - ); -} - -#[test] -fn test_upgrade_event() { - let world = deploy_world_for_event_upgrades(); - - drop_all_events(world.contract_address); - - world.upgrade_event("dojo", e_FooEventMemberAdded::TEST_CLASS_HASH.try_into().unwrap()); - - let event = starknet::testing::pop_log::(world.contract_address); - assert(event.is_some(), 'no event)'); - - if let world::Event::EventUpgraded(event) = event.unwrap() { - assert( - event.selector == Event::::selector(DOJO_NSH), 'bad model selector' - ); - assert( - event.class_hash == e_FooEventMemberAdded::TEST_CLASS_HASH.try_into().unwrap(), - 'bad model class_hash' - ); - assert( - event.address != core::num::traits::Zero::::zero(), 'bad model address' - ); - } else { - core::panic_with_felt252('no EventUpgraded event'); - } -} - -#[test] -#[should_panic( - expected: ( - "Invalid new layout to upgrade the resource `dojo-FooEventBadLayoutType`", - 'ENTRYPOINT_FAILED', - ) -)] -fn test_upgrade_event_with_bad_layout_type() { - let world = deploy_world_for_event_upgrades(); - world.upgrade_event("dojo", e_FooEventBadLayoutType::TEST_CLASS_HASH.try_into().unwrap()); -} - -#[test] -#[should_panic( - expected: ( - "Invalid new schema to upgrade the resource `dojo-FooEventMemberRemoved`", - 'ENTRYPOINT_FAILED', - ) -)] -fn test_upgrade_event_with_member_removed() { - let world = deploy_world_for_event_upgrades(); - world.upgrade_event("dojo", e_FooEventMemberRemoved::TEST_CLASS_HASH.try_into().unwrap()); -} - -#[test] -#[should_panic( - expected: ( - "Invalid new schema to upgrade the resource `dojo-FooEventMemberAddedButRemoved`", - 'ENTRYPOINT_FAILED', - ) -)] -fn test_upgrade_event_with_member_added_but_removed() { - let world = deploy_world_for_event_upgrades(); - world - .upgrade_event( - "dojo", e_FooEventMemberAddedButRemoved::TEST_CLASS_HASH.try_into().unwrap() - ); -} - -#[test] -#[should_panic( - expected: ( - "Invalid new schema to upgrade the resource `dojo-FooEventMemberAddedButMoved`", - 'ENTRYPOINT_FAILED', - ) -)] -fn test_upgrade_event_with_member_moved() { - let world = deploy_world_for_event_upgrades(); - world.upgrade_event("dojo", e_FooEventMemberAddedButMoved::TEST_CLASS_HASH.try_into().unwrap()); -} - -#[test] -#[should_panic( - expected: ( - "Account `659918` does NOT have OWNER role on event (or its namespace) `FooEventMemberAdded`", - 'ENTRYPOINT_FAILED', - ) -)] -fn test_upgrade_event_from_event_writer() { - let alice = starknet::contract_address_const::<0xa11ce>(); - - let world = deploy_world_for_event_upgrades(); - - world.grant_writer(Event::::selector(DOJO_NSH), alice); - - starknet::testing::set_account_contract_address(alice); - starknet::testing::set_contract_address(alice); - world.upgrade_event("dojo", e_FooEventMemberAdded::TEST_CLASS_HASH.try_into().unwrap()); -} - -#[test] -#[should_panic( - expected: ("Resource `dojo-SimpleEvent` is already registered", 'ENTRYPOINT_FAILED',) -)] -fn test_upgrade_event_from_random_account() { - let bob = starknet::contract_address_const::<0xb0b>(); - let alice = starknet::contract_address_const::<0xa11ce>(); - - let world = deploy_world(); - let world = world.dispatcher; - - world.grant_owner(DOJO_NSH, bob); - world.grant_owner(DOJO_NSH, alice); - - starknet::testing::set_account_contract_address(bob); - starknet::testing::set_contract_address(bob); - world.register_event("dojo", e_SimpleEvent::TEST_CLASS_HASH.try_into().unwrap()); - - starknet::testing::set_account_contract_address(alice); - starknet::testing::set_contract_address(alice); - world.register_event("dojo", e_SimpleEvent::TEST_CLASS_HASH.try_into().unwrap()); -} - -#[test] -#[should_panic(expected: ("Namespace `another_namespace` is not registered", 'ENTRYPOINT_FAILED',))] -fn test_register_event_with_unregistered_namespace() { - let world = deploy_world(); - let world = world.dispatcher; - - world.register_event("another_namespace", e_SimpleEvent::TEST_CLASS_HASH.try_into().unwrap()); -} - -// It's CONTRACT_NOT_DEPLOYED for now as in this example the contract is not a dojo contract -// and it's not the account that is calling the register_event function. -#[test] -#[should_panic(expected: ('CONTRACT_NOT_DEPLOYED', 'ENTRYPOINT_FAILED',))] -fn test_register_event_through_malicious_contract() { - let bob = starknet::contract_address_const::<0xb0b>(); - let malicious_contract = starknet::contract_address_const::<0xdead>(); - - let world = deploy_world(); - let world = world.dispatcher; - - world.grant_owner(DOJO_NSH, bob); - - starknet::testing::set_account_contract_address(bob); - starknet::testing::set_contract_address(malicious_contract); - world.register_event("dojo", e_SimpleEvent::TEST_CLASS_HASH.try_into().unwrap()); -} diff --git a/crates/dojo/core-cairo-test/src/tests/world/model.cairo b/crates/dojo/core-cairo-test/src/tests/world/model.cairo deleted file mode 100644 index 64cce8ee3e..0000000000 --- a/crates/dojo/core-cairo-test/src/tests/world/model.cairo +++ /dev/null @@ -1,309 +0,0 @@ -use core::starknet::ContractAddress; - -use crate::tests::helpers::{ - Foo, m_Foo, DOJO_NSH, drop_all_events, deploy_world, deploy_world_for_model_upgrades, - foo_invalid_name -}; -use dojo::world::{world, IWorldDispatcherTrait}; -use dojo::model::Model; - - -#[derive(Introspect, Copy, Drop, Serde)] -#[dojo::model] -pub struct FooModelBadLayoutType { - #[key] - pub caller: ContractAddress, - pub a: felt252, - pub b: u128, -} - -#[derive(Introspect, Copy, Drop, Serde)] -#[dojo::model] -pub struct FooModelMemberRemoved { - #[key] - pub caller: ContractAddress, - pub b: u128, -} - -#[derive(Introspect, Copy, Drop, Serde)] -#[dojo::model] -pub struct FooModelMemberAddedButRemoved { - #[key] - pub caller: ContractAddress, - pub b: u128, - pub c: u256, - pub d: u256 -} - -#[derive(Introspect, Copy, Drop, Serde)] -#[dojo::model] -pub struct FooModelMemberAddedButMoved { - #[key] - pub caller: ContractAddress, - pub b: u128, - pub a: felt252, - pub c: u256 -} - -#[derive(Introspect, Copy, Drop, Serde)] -#[dojo::model] -pub struct FooModelMemberAdded { - #[key] - pub caller: ContractAddress, - pub a: felt252, - pub b: u128, - pub c: u256 -} - -#[test] -fn test_register_model_for_namespace_owner() { - let bob = starknet::contract_address_const::<0xb0b>(); - - let world = deploy_world(); - let world = world.dispatcher; - - world.grant_owner(DOJO_NSH, bob); - - drop_all_events(world.contract_address); - - starknet::testing::set_account_contract_address(bob); - starknet::testing::set_contract_address(bob); - world.register_model("dojo", m_Foo::TEST_CLASS_HASH.try_into().unwrap()); - - let event = starknet::testing::pop_log::(world.contract_address); - assert(event.is_some(), 'no event)'); - - if let world::Event::ModelRegistered(event) = event.unwrap() { - assert(event.name == Model::::name(), 'bad event name'); - assert(event.namespace == "dojo", 'bad event namespace'); - assert( - event.class_hash == m_Foo::TEST_CLASS_HASH.try_into().unwrap(), 'bad event class_hash' - ); - assert( - event.address != core::num::traits::Zero::::zero(), - 'bad event prev address' - ); - } else { - core::panic_with_felt252('no ModelRegistered event'); - } - - assert(world.is_owner(Model::::selector(DOJO_NSH), bob), 'bob is not the owner'); -} - - -#[test] -#[should_panic( - expected: ( - "Name `foo-bis` is invalid according to Dojo naming rules: ^[a-zA-Z0-9_]+$", - 'ENTRYPOINT_FAILED', - ) -)] -fn test_register_model_with_invalid_name() { - let world = deploy_world(); - let world = world.dispatcher; - - world.register_model("dojo", foo_invalid_name::TEST_CLASS_HASH.try_into().unwrap()); -} - -#[test] -#[should_panic( - expected: ("Account `2827` does NOT have OWNER role on namespace `dojo`", 'ENTRYPOINT_FAILED',) -)] -fn test_register_model_for_namespace_writer() { - let bob = starknet::contract_address_const::<0xb0b>(); - - let world = deploy_world(); - let world = world.dispatcher; - - world.grant_writer(DOJO_NSH, bob); - - drop_all_events(world.contract_address); - - starknet::testing::set_account_contract_address(bob); - starknet::testing::set_contract_address(bob); - world.register_model("dojo", m_Foo::TEST_CLASS_HASH.try_into().unwrap()); -} - -#[test] -fn test_upgrade_model_from_model_owner() { - let bob = starknet::contract_address_const::<0xb0b>(); - - let world = deploy_world_for_model_upgrades(); - world.grant_owner(Model::::selector(DOJO_NSH), bob); - - starknet::testing::set_account_contract_address(bob); - starknet::testing::set_contract_address(bob); - - drop_all_events(world.contract_address); - - world.upgrade_model("dojo", m_FooModelMemberAdded::TEST_CLASS_HASH.try_into().unwrap()); - - let event = starknet::testing::pop_log::(world.contract_address); - assert(event.is_some(), 'no event)'); - - if let world::Event::ModelUpgraded(event) = event.unwrap() { - assert( - event.selector == Model::::selector(DOJO_NSH), 'bad model selector' - ); - assert( - event.class_hash == m_FooModelMemberAdded::TEST_CLASS_HASH.try_into().unwrap(), - 'bad model class_hash' - ); - assert( - event.address != core::num::traits::Zero::::zero(), - 'bad model prev address' - ); - } else { - core::panic_with_felt252('no ModelUpgraded event'); - } - - assert( - world.is_owner(Model::::selector(DOJO_NSH), bob), - 'bob is not the owner' - ); -} - -#[test] -fn test_upgrade_model() { - let world = deploy_world_for_model_upgrades(); - - drop_all_events(world.contract_address); - - world.upgrade_model("dojo", m_FooModelMemberAdded::TEST_CLASS_HASH.try_into().unwrap()); - - let event = starknet::testing::pop_log::(world.contract_address); - assert(event.is_some(), 'no event)'); - - if let world::Event::ModelUpgraded(event) = event.unwrap() { - assert( - event.selector == Model::::selector(DOJO_NSH), 'bad model selector' - ); - assert( - event.class_hash == m_FooModelMemberAdded::TEST_CLASS_HASH.try_into().unwrap(), - 'bad model class_hash' - ); - assert( - event.address != core::num::traits::Zero::::zero(), 'bad model address' - ); - } else { - core::panic_with_felt252('no ModelUpgraded event'); - } -} - -#[test] -#[should_panic( - expected: ( - "Invalid new layout to upgrade the resource `dojo-FooModelBadLayoutType`", - 'ENTRYPOINT_FAILED', - ) -)] -fn test_upgrade_model_with_bad_layout_type() { - let world = deploy_world_for_model_upgrades(); - world.upgrade_model("dojo", m_FooModelBadLayoutType::TEST_CLASS_HASH.try_into().unwrap()); -} - -#[test] -#[should_panic( - expected: ( - "Invalid new schema to upgrade the resource `dojo-FooModelMemberRemoved`", - 'ENTRYPOINT_FAILED', - ) -)] -fn test_upgrade_model_with_member_removed() { - let world = deploy_world_for_model_upgrades(); - world.upgrade_model("dojo", m_FooModelMemberRemoved::TEST_CLASS_HASH.try_into().unwrap()); -} - -#[test] -#[should_panic( - expected: ( - "Invalid new schema to upgrade the resource `dojo-FooModelMemberAddedButRemoved`", - 'ENTRYPOINT_FAILED', - ) -)] -fn test_upgrade_model_with_member_added_but_removed() { - let world = deploy_world_for_model_upgrades(); - world - .upgrade_model( - "dojo", m_FooModelMemberAddedButRemoved::TEST_CLASS_HASH.try_into().unwrap() - ); -} - -#[test] -#[should_panic( - expected: ( - "Invalid new schema to upgrade the resource `dojo-FooModelMemberAddedButMoved`", - 'ENTRYPOINT_FAILED', - ) -)] -fn test_upgrade_model_with_member_moved() { - let world = deploy_world_for_model_upgrades(); - world.upgrade_model("dojo", m_FooModelMemberAddedButMoved::TEST_CLASS_HASH.try_into().unwrap()); -} - -#[test] -#[should_panic( - expected: ( - "Account `659918` does NOT have OWNER role on model (or its namespace) `FooModelMemberAdded`", - 'ENTRYPOINT_FAILED', - ) -)] -fn test_upgrade_model_from_model_writer() { - let alice = starknet::contract_address_const::<0xa11ce>(); - - let world = deploy_world_for_model_upgrades(); - - world.grant_writer(Model::::selector(DOJO_NSH), alice); - - starknet::testing::set_account_contract_address(alice); - starknet::testing::set_contract_address(alice); - world.upgrade_model("dojo", m_FooModelMemberAdded::TEST_CLASS_HASH.try_into().unwrap()); -} - -#[test] -#[should_panic(expected: ("Resource `dojo-Foo` is already registered", 'ENTRYPOINT_FAILED',))] -fn test_upgrade_model_from_random_account() { - let bob = starknet::contract_address_const::<0xb0b>(); - let alice = starknet::contract_address_const::<0xa11ce>(); - - let world = deploy_world(); - let world = world.dispatcher; - - world.grant_owner(DOJO_NSH, bob); - world.grant_owner(DOJO_NSH, alice); - - starknet::testing::set_account_contract_address(bob); - starknet::testing::set_contract_address(bob); - world.register_model("dojo", m_Foo::TEST_CLASS_HASH.try_into().unwrap()); - - starknet::testing::set_account_contract_address(alice); - starknet::testing::set_contract_address(alice); - world.register_model("dojo", m_Foo::TEST_CLASS_HASH.try_into().unwrap()); -} - -#[test] -#[should_panic(expected: ("Namespace `another_namespace` is not registered", 'ENTRYPOINT_FAILED',))] -fn test_register_model_with_unregistered_namespace() { - let world = deploy_world(); - let world = world.dispatcher; - - world.register_model("another_namespace", m_Foo::TEST_CLASS_HASH.try_into().unwrap()); -} - -// It's CONTRACT_NOT_DEPLOYED for now as in this example the contract is not a dojo contract -// and it's not the account that is calling the register_model function. -#[test] -#[should_panic(expected: ('CONTRACT_NOT_DEPLOYED', 'ENTRYPOINT_FAILED',))] -fn test_register_model_through_malicious_contract() { - let bob = starknet::contract_address_const::<0xb0b>(); - let malicious_contract = starknet::contract_address_const::<0xdead>(); - - let world = deploy_world(); - let world = world.dispatcher; - - world.grant_owner(DOJO_NSH, bob); - - starknet::testing::set_account_contract_address(bob); - starknet::testing::set_contract_address(malicious_contract); - world.register_model("dojo", m_Foo::TEST_CLASS_HASH.try_into().unwrap()); -} diff --git a/crates/dojo/core-foundry-test/.snfoundry_cache/.prev_tests_failed b/crates/dojo/core-foundry-test/.snfoundry_cache/.prev_tests_failed new file mode 100644 index 0000000000..e69de29bb2 diff --git a/crates/dojo/core-foundry-test/Scarb.lock b/crates/dojo/core-foundry-test/Scarb.lock new file mode 100644 index 0000000000..18a157321b --- /dev/null +++ b/crates/dojo/core-foundry-test/Scarb.lock @@ -0,0 +1,36 @@ +# Code generated by scarb DO NOT EDIT. +version = 1 + +[[package]] +name = "dojo" +version = "1.0.5" +dependencies = [ + "dojo_macros", +] + +[[package]] +name = "dojo_foundry_test" +version = "1.0.0-rc.0" +dependencies = [ + "dojo", + "snforge_std", +] + +[[package]] +name = "dojo_macros" +version = "0.1.0" + +[[package]] +name = "snforge_scarb_plugin" +version = "0.33.0" +source = "registry+https://scarbs.xyz/" +checksum = "sha256:b4dd6088372decd367652827091e0589bbf6bc550dfc3957baa3e9c61d6eb449" + +[[package]] +name = "snforge_std" +version = "0.33.0" +source = "registry+https://scarbs.xyz/" +checksum = "sha256:f7dc3349f8a6ef4915c93df447a00bd5a53a31129fd0990a00afa0ad31d91b06" +dependencies = [ + "snforge_scarb_plugin", +] diff --git a/crates/dojo/core-cairo-test/Scarb.toml b/crates/dojo/core-foundry-test/Scarb.toml similarity index 53% rename from crates/dojo/core-cairo-test/Scarb.toml rename to crates/dojo/core-foundry-test/Scarb.toml index b7e2111a73..9e271ba8a1 100644 --- a/crates/dojo/core-cairo-test/Scarb.toml +++ b/crates/dojo/core-foundry-test/Scarb.toml @@ -2,7 +2,7 @@ cairo-version = "=2.8.4" edition = "2024_07" description = "Testing library for Dojo using Cairo test runner." -name = "dojo_cairo_test" +name = "dojo_foundry_test" version = "1.0.0-rc.0" [dependencies] @@ -10,6 +10,13 @@ starknet = "=2.8.4" dojo = { path = "../core" } [dev-dependencies] -cairo_test = "=2.8.4" +snforge_std = "0.33.0" +assert_macros = "2.8.4" + +[scripts] +test = "snforge test" [lib] + +[[target.starknet-contract]] +build-external-contracts = ["dojo::world::world_contract::world"] diff --git a/crates/dojo/core-cairo-test/src/lib.cairo b/crates/dojo/core-foundry-test/src/lib.cairo similarity index 66% rename from crates/dojo/core-cairo-test/src/lib.cairo rename to crates/dojo/core-foundry-test/src/lib.cairo index 7517f85da7..665a14d35d 100644 --- a/crates/dojo/core-cairo-test/src/lib.cairo +++ b/crates/dojo/core-foundry-test/src/lib.cairo @@ -1,16 +1,16 @@ -//! Testing library for Dojo using Cairo test runner. - #[cfg(target: "test")] mod utils; #[cfg(target: "test")] +mod snf_utils; +#[cfg(target: "test")] mod world; #[cfg(target: "test")] pub use utils::{GasCounter, assert_array, GasCounterTrait}; #[cfg(target: "test")] pub use world::{ - deploy_contract, deploy_with_world_address, spawn_test_world, NamespaceDef, TestResource, - ContractDef, ContractDefTrait, WorldStorageTestTrait, + spawn_test_world, NamespaceDef, TestResource, ContractDef, ContractDefTrait, + WorldStorageTestTrait, }; #[cfg(test)] @@ -33,7 +33,6 @@ mod tests { mod storage; } - mod contract; // mod benchmarks; mod expanded { @@ -43,17 +42,15 @@ mod tests { mod helpers { mod helpers; pub use helpers::{ - DOJO_NSH, SimpleEvent, e_SimpleEvent, Foo, m_Foo, foo_invalid_name, foo_setter, + DOJO_NSH, SimpleEvent, e_SimpleEvent, Foo, m_Foo, m_FooInvalidName, foo_setter, test_contract, test_contract_with_dojo_init_args, Sword, Case, Character, Abilities, Stats, Weapon, Ibar, IbarDispatcher, IbarDispatcherTrait, bar, deploy_world, - deploy_world_and_bar, deploy_world_and_foo, drop_all_events, IFooSetter, - IFooSetterDispatcher, IFooSetterDispatcherTrait, NotCopiable + deploy_world_and_bar, deploy_world_and_foo, IFooSetter, IFooSetterDispatcher, + IFooSetterDispatcherTrait, NotCopiable, malicious_contract }; mod event; - pub use event::{ - FooEventBadLayoutType, e_FooEventBadLayoutType, deploy_world_for_event_upgrades - }; + pub use event::deploy_world_for_event_upgrades; mod model; pub use model::deploy_world_for_model_upgrades; diff --git a/crates/dojo/core-foundry-test/src/snf_utils.cairo b/crates/dojo/core-foundry-test/src/snf_utils.cairo new file mode 100644 index 0000000000..21b50a89c7 --- /dev/null +++ b/crates/dojo/core-foundry-test/src/snf_utils.cairo @@ -0,0 +1,96 @@ +use starknet::{ClassHash, ContractAddress}; +use snforge_std::{ContractClassTrait, DeclareResultTrait}; +use snforge_std::cheatcodes::contract_class::ContractClass; + +/// Declare a contract. +/// +/// # Arguments +/// * `name` - the contract name. +/// +/// # Returns +/// The declared contract class and classHash. +pub fn declare(name: ByteArray) -> (ContractClass, ClassHash) { + let contract = snforge_std::declare(name).unwrap().contract_class(); + (*contract, (*contract.class_hash).into()) +} + +/// Deploy a contract. +/// +/// # Arguments +/// * `contract_class` - the contract class. +/// * `calldata` - serialized calldata to pass to constructor. +/// +/// # Returns +/// The deployed contract address. +pub fn deploy(contract_class: ContractClass, calldata: @Array) -> ContractAddress { + let (address, _) = contract_class.deploy(calldata).unwrap(); + address +} + +/// Declare and deploy and contract. +/// +/// # Arguments +/// * `name` - the contract name. +/// +/// # Returns +/// The deployed contract address. +pub fn declare_and_deploy(name: ByteArray) -> ContractAddress { + let contract = snforge_std::declare(name).unwrap().contract_class(); + let (address, _) = contract.deploy(@array![]).unwrap(); + address +} + +/// Declare a Dojo contract. +/// +/// # Arguments +/// * `name` - the contract name. +/// +/// # Returns +/// The declared contract classhash. +pub fn declare_contract(name: ByteArray) -> ClassHash { + let (_, class_hash) = declare(name.clone()); + class_hash +} + +/// Declare a Dojo Event contract. +/// +/// # Arguments +/// * `name` - the contract name. +/// +/// # Returns +/// The declared contract classhash. +pub fn declare_event_contract(name: ByteArray) -> ClassHash { + declare_contract(format!("e_{name}")) +} + +/// Declare a Dojo Model contract. +/// +/// # Arguments +/// * `name` - the contract name. +/// +/// # Returns +/// The declared contract classhash. +pub fn declare_model_contract(name: ByteArray) -> ClassHash { + declare_contract(format!("m_{name}")) +} + +/// Set the global account address used for tests. +/// +/// # Arguments +/// * `account` - the account address. +pub fn set_account_address(account: ContractAddress) { + snforge_std::start_cheat_account_contract_address_global(account); +} + +/// Set the global caller address used for tests. +/// +/// # Arguments +/// * `account` - the caller address. +pub fn set_caller_address(contract: ContractAddress) { + snforge_std::start_cheat_caller_address_global(contract); +} + +/// Get the default caller address used for tests. +pub fn get_default_caller_address() -> ContractAddress { + snforge_std::test_address() +} diff --git a/crates/dojo/core-cairo-test/src/tests/benchmarks.cairo b/crates/dojo/core-foundry-test/src/tests/benchmarks.cairo similarity index 98% rename from crates/dojo/core-cairo-test/src/tests/benchmarks.cairo rename to crates/dojo/core-foundry-test/src/tests/benchmarks.cairo index e76b91b479..4196764a1e 100644 --- a/crates/dojo/core-cairo-test/src/tests/benchmarks.cairo +++ b/crates/dojo/core-foundry-test/src/tests/benchmarks.cairo @@ -45,9 +45,9 @@ struct ComplexModel { fn deploy_world() -> IWorldDispatcher { let namespace_def = NamespaceDef { namespace: "dojo", resources: [ - TestResource::Model(case::TEST_CLASS_HASH.try_into().unwrap()), - TestResource::Model(case_not_packed::TEST_CLASS_HASH.try_into().unwrap()), - TestResource::Model(complex_model::TEST_CLASS_HASH.try_into().unwrap()), + TestResource::Model("Case"), + TestResource::Model("CaseNotPacked"), + TestResource::Model("ComplexM"), ].span(), }; diff --git a/crates/dojo/core-cairo-test/src/tests/event/event.cairo b/crates/dojo/core-foundry-test/src/tests/event/event.cairo similarity index 100% rename from crates/dojo/core-cairo-test/src/tests/event/event.cairo rename to crates/dojo/core-foundry-test/src/tests/event/event.cairo diff --git a/crates/dojo/core-cairo-test/src/tests/expanded/selector_attack.cairo b/crates/dojo/core-foundry-test/src/tests/expanded/selector_attack.cairo similarity index 100% rename from crates/dojo/core-cairo-test/src/tests/expanded/selector_attack.cairo rename to crates/dojo/core-foundry-test/src/tests/expanded/selector_attack.cairo diff --git a/crates/dojo/core-foundry-test/src/tests/helpers/event.cairo b/crates/dojo/core-foundry-test/src/tests/helpers/event.cairo new file mode 100644 index 0000000000..f5e4d44928 --- /dev/null +++ b/crates/dojo/core-foundry-test/src/tests/helpers/event.cairo @@ -0,0 +1,183 @@ +use core::starknet::ContractAddress; + +use dojo::world::{IWorldDispatcher}; + +use crate::world::{spawn_test_world, NamespaceDef, TestResource}; + +// This event is used as a base to create the "previous" version of an event to be upgraded. +#[derive(Introspect)] +struct FooBaseEvent { + #[key] + pub caller: ContractAddress, + pub a: felt252, + pub b: u128, +} + +pub fn deploy_world_for_event_upgrades() -> IWorldDispatcher { + let namespace_def = NamespaceDef { + namespace: "dojo", resources: [ + TestResource::Event("OldFooEventBadLayoutType"), + TestResource::Event("OldFooEventMemberRemoved"), + TestResource::Event("OldFooEventMemberAddedButRemoved"), + TestResource::Event("OldFooEventMemberAddedButMoved"), + TestResource::Event("OldFooEventMemberAdded"), + ].span() + }; + spawn_test_world([namespace_def].span()).dispatcher +} + +/// This file contains some partial event contracts written without the dojo::event +/// attribute, to avoid having several contracts with a same name, +/// as the snfoundry test runner does not differenciate them. +/// These event contracts are used to test event upgrades in tests/event.cairo. + +#[starknet::contract] +pub mod e_OldFooEventBadLayoutType { + #[storage] + struct Storage {} + + #[abi(embed_v0)] + impl DeployedEventImpl of dojo::meta::interface::IDeployedResource { + fn dojo_name(self: @ContractState) -> ByteArray { + "FooEventBadLayoutType" + } + } + + #[abi(embed_v0)] + impl StoredImpl of dojo::meta::interface::IStoredResource { + fn schema(self: @ContractState) -> dojo::meta::introspect::Struct { + if let dojo::meta::introspect::Ty::Struct(mut s) = + dojo::meta::introspect::Introspect::::ty() { + s.name = 'FooEventBadLayoutType'; + s + } else { + panic!("Unexpected schema.") + } + } + + fn layout(self: @ContractState) -> dojo::meta::Layout { + // Should never happen as dojo::event always derive Introspect. + dojo::meta::Layout::Fixed([].span()) + } + } +} + +#[starknet::contract] +pub mod e_OldFooEventMemberRemoved { + #[storage] + struct Storage {} + + #[abi(embed_v0)] + impl DeployedEventImpl of dojo::meta::interface::IDeployedResource { + fn dojo_name(self: @ContractState) -> ByteArray { + "FooEventMemberRemoved" + } + } + + #[abi(embed_v0)] + impl StoredImpl of dojo::meta::interface::IStoredResource { + fn schema(self: @ContractState) -> dojo::meta::introspect::Struct { + if let dojo::meta::introspect::Ty::Struct(mut s) = + dojo::meta::introspect::Introspect::::ty() { + s.name = 'FooEventMemberRemoved'; + s + } else { + panic!("Unexpected schema.") + } + } + + fn layout(self: @ContractState) -> dojo::meta::Layout { + dojo::meta::introspect::Introspect::::layout() + } + } +} + +#[starknet::contract] +pub mod e_OldFooEventMemberAddedButRemoved { + #[storage] + struct Storage {} + + #[abi(embed_v0)] + impl DeployedEventImpl of dojo::meta::interface::IDeployedResource { + fn dojo_name(self: @ContractState) -> ByteArray { + "FooEventMemberAddedButRemoved" + } + } + + #[abi(embed_v0)] + impl StoredImpl of dojo::meta::interface::IStoredResource { + fn schema(self: @ContractState) -> dojo::meta::introspect::Struct { + if let dojo::meta::introspect::Ty::Struct(mut s) = + dojo::meta::introspect::Introspect::::ty() { + s.name = 'FooEventMemberAddedButRemoved'; + s + } else { + panic!("Unexpected schema.") + } + } + + fn layout(self: @ContractState) -> dojo::meta::Layout { + dojo::meta::introspect::Introspect::::layout() + } + } +} + +#[starknet::contract] +pub mod e_OldFooEventMemberAddedButMoved { + #[storage] + struct Storage {} + + #[abi(embed_v0)] + impl DeployedEventImpl of dojo::meta::interface::IDeployedResource { + fn dojo_name(self: @ContractState) -> ByteArray { + "FooEventMemberAddedButMoved" + } + } + + #[abi(embed_v0)] + impl StoredImpl of dojo::meta::interface::IStoredResource { + fn schema(self: @ContractState) -> dojo::meta::introspect::Struct { + if let dojo::meta::introspect::Ty::Struct(mut s) = + dojo::meta::introspect::Introspect::::ty() { + s.name = 'FooEventMemberAddedButMoved'; + s + } else { + panic!("Unexpected schema.") + } + } + + fn layout(self: @ContractState) -> dojo::meta::Layout { + dojo::meta::introspect::Introspect::::layout() + } + } +} + +#[starknet::contract] +pub mod e_OldFooEventMemberAdded { + #[storage] + struct Storage {} + + #[abi(embed_v0)] + impl DeployedEventImpl of dojo::meta::interface::IDeployedResource { + fn dojo_name(self: @ContractState) -> ByteArray { + "FooEventMemberAdded" + } + } + + #[abi(embed_v0)] + impl StoredImpl of dojo::meta::interface::IStoredResource { + fn schema(self: @ContractState) -> dojo::meta::introspect::Struct { + if let dojo::meta::introspect::Ty::Struct(mut s) = + dojo::meta::introspect::Introspect::::ty() { + s.name = 'FooEventMemberAdded'; + s + } else { + panic!("Unexpected schema.") + } + } + + fn layout(self: @ContractState) -> dojo::meta::Layout { + dojo::meta::introspect::Introspect::::layout() + } + } +} diff --git a/crates/dojo/core-cairo-test/src/tests/helpers/helpers.cairo b/crates/dojo/core-foundry-test/src/tests/helpers/helpers.cairo similarity index 92% rename from crates/dojo/core-cairo-test/src/tests/helpers/helpers.cairo rename to crates/dojo/core-foundry-test/src/tests/helpers/helpers.cairo index f0e859ec86..3f194826e8 100644 --- a/crates/dojo/core-cairo-test/src/tests/helpers/helpers.cairo +++ b/crates/dojo/core-foundry-test/src/tests/helpers/helpers.cairo @@ -36,7 +36,7 @@ pub struct NotCopiable { } #[starknet::contract] -pub mod foo_invalid_name { +pub mod m_FooInvalidName { use dojo::model::IModel; #[storage] @@ -101,9 +101,21 @@ pub mod foo_setter { } } +#[dojo::contract] +pub mod dojo_caller_contract {} + +#[starknet::contract] +pub mod non_dojo_caller_contract { + #[storage] + struct Storage {} +} + #[dojo::contract] pub mod test_contract {} +#[dojo::contract] +pub mod another_test_contract {} + #[dojo::contract] pub mod test_contract_with_dojo_init_args { fn dojo_init(ref self: ContractState, arg1: felt252) { @@ -203,6 +215,12 @@ pub mod bar { } } +#[starknet::contract] +pub mod malicious_contract { + #[storage] + struct Storage {} +} + /// Deploys an empty world with the `dojo` namespace. pub fn deploy_world() -> WorldStorage { let namespace_def = NamespaceDef { namespace: "dojo", resources: [].span(), }; @@ -215,8 +233,7 @@ pub fn deploy_world() -> WorldStorage { pub fn deploy_world_and_foo() -> (WorldStorage, felt252) { let namespace_def = NamespaceDef { namespace: "dojo", resources: [ - TestResource::Model(m_Foo::TEST_CLASS_HASH), - TestResource::Model(m_NotCopiable::TEST_CLASS_HASH), + TestResource::Model("Foo"), TestResource::Model("NotCopiable"), ].span(), }; @@ -228,8 +245,7 @@ pub fn deploy_world_and_foo() -> (WorldStorage, felt252) { pub fn deploy_world_and_bar() -> (WorldStorage, IbarDispatcher) { let namespace_def = NamespaceDef { namespace: "dojo", resources: [ - TestResource::Model(m_Foo::TEST_CLASS_HASH), - TestResource::Contract(bar::TEST_CLASS_HASH), + TestResource::Model("Foo"), TestResource::Contract("bar"), ].span(), }; @@ -245,11 +261,3 @@ pub fn deploy_world_and_bar() -> (WorldStorage, IbarDispatcher) { (world, bar_contract) } -pub fn drop_all_events(address: ContractAddress) { - loop { - match starknet::testing::pop_log_raw(address) { - core::option::Option::Some(_) => {}, - core::option::Option::None => { break; }, - }; - } -} diff --git a/crates/dojo/core-foundry-test/src/tests/helpers/model.cairo b/crates/dojo/core-foundry-test/src/tests/helpers/model.cairo new file mode 100644 index 0000000000..1d97a543fb --- /dev/null +++ b/crates/dojo/core-foundry-test/src/tests/helpers/model.cairo @@ -0,0 +1,183 @@ +use core::starknet::ContractAddress; + +use dojo::world::IWorldDispatcher; + +use crate::world::{spawn_test_world, NamespaceDef, TestResource}; + +// This model is used as a base to create the "previous" version of a model to be upgraded. +#[derive(Introspect)] +struct FooBaseModel { + #[key] + pub caller: ContractAddress, + pub a: felt252, + pub b: u128, +} + +pub fn deploy_world_for_model_upgrades() -> IWorldDispatcher { + let namespace_def = NamespaceDef { + namespace: "dojo", resources: [ + TestResource::Model("OldFooModelBadLayoutType"), + TestResource::Model("OldFooModelMemberRemoved"), + TestResource::Model("OldFooModelMemberAddedButRemoved"), + TestResource::Model("OldFooModelMemberAddedButMoved"), + TestResource::Model("OldFooModelMemberAdded"), + ].span() + }; + spawn_test_world([namespace_def].span()).dispatcher +} + +/// This file contains some partial model contracts written without the dojo::model +/// attribute, to avoid having several contracts with a same name, +/// as the snfoundry test runner does not differenciate them. +/// These model contracts are used to test model upgrades in tests/model.cairo. + +#[starknet::contract] +pub mod m_OldFooModelBadLayoutType { + #[storage] + struct Storage {} + + #[abi(embed_v0)] + impl DeployedModelImpl of dojo::meta::interface::IDeployedResource { + fn dojo_name(self: @ContractState) -> ByteArray { + "FooModelBadLayoutType" + } + } + + #[abi(embed_v0)] + impl StoredImpl of dojo::meta::interface::IStoredResource { + fn schema(self: @ContractState) -> dojo::meta::introspect::Struct { + if let dojo::meta::introspect::Ty::Struct(mut s) = + dojo::meta::introspect::Introspect::::ty() { + s.name = 'FooModelBadLayoutType'; + s + } else { + panic!("Unexpected schema.") + } + } + + fn layout(self: @ContractState) -> dojo::meta::Layout { + // Should never happen as dojo::model always derive Introspect. + dojo::meta::Layout::Fixed([].span()) + } + } +} + +#[starknet::contract] +pub mod m_OldFooModelMemberRemoved { + #[storage] + struct Storage {} + + #[abi(embed_v0)] + impl DeployedModelImpl of dojo::meta::interface::IDeployedResource { + fn dojo_name(self: @ContractState) -> ByteArray { + "FooModelMemberRemoved" + } + } + + #[abi(embed_v0)] + impl StoredImpl of dojo::meta::interface::IStoredResource { + fn schema(self: @ContractState) -> dojo::meta::introspect::Struct { + if let dojo::meta::introspect::Ty::Struct(mut s) = + dojo::meta::introspect::Introspect::::ty() { + s.name = 'FooModelMemberRemoved'; + s + } else { + panic!("Unexpected schema.") + } + } + + fn layout(self: @ContractState) -> dojo::meta::Layout { + dojo::meta::introspect::Introspect::::layout() + } + } +} + +#[starknet::contract] +pub mod m_OldFooModelMemberAddedButRemoved { + #[storage] + struct Storage {} + + #[abi(embed_v0)] + impl DeployedModelImpl of dojo::meta::interface::IDeployedResource { + fn dojo_name(self: @ContractState) -> ByteArray { + "FooModelMemberAddedButRemoved" + } + } + + #[abi(embed_v0)] + impl StoredImpl of dojo::meta::interface::IStoredResource { + fn schema(self: @ContractState) -> dojo::meta::introspect::Struct { + if let dojo::meta::introspect::Ty::Struct(mut s) = + dojo::meta::introspect::Introspect::::ty() { + s.name = 'FooModelMemberAddedButRemoved'; + s + } else { + panic!("Unexpected schema.") + } + } + + fn layout(self: @ContractState) -> dojo::meta::Layout { + dojo::meta::introspect::Introspect::::layout() + } + } +} + +#[starknet::contract] +pub mod m_OldFooModelMemberAddedButMoved { + #[storage] + struct Storage {} + + #[abi(embed_v0)] + impl DeployedModelImpl of dojo::meta::interface::IDeployedResource { + fn dojo_name(self: @ContractState) -> ByteArray { + "FooModelMemberAddedButMoved" + } + } + + #[abi(embed_v0)] + impl StoredImpl of dojo::meta::interface::IStoredResource { + fn schema(self: @ContractState) -> dojo::meta::introspect::Struct { + if let dojo::meta::introspect::Ty::Struct(mut s) = + dojo::meta::introspect::Introspect::::ty() { + s.name = 'FooModelMemberAddedButMoved'; + s + } else { + panic!("Unexpected schema.") + } + } + + fn layout(self: @ContractState) -> dojo::meta::Layout { + dojo::meta::introspect::Introspect::::layout() + } + } +} + +#[starknet::contract] +pub mod m_OldFooModelMemberAdded { + #[storage] + struct Storage {} + + #[abi(embed_v0)] + impl DeployedModelImpl of dojo::meta::interface::IDeployedResource { + fn dojo_name(self: @ContractState) -> ByteArray { + "FooModelMemberAdded" + } + } + + #[abi(embed_v0)] + impl StoredImpl of dojo::meta::interface::IStoredResource { + fn schema(self: @ContractState) -> dojo::meta::introspect::Struct { + if let dojo::meta::introspect::Ty::Struct(mut s) = + dojo::meta::introspect::Introspect::::ty() { + s.name = 'FooModelMemberAdded'; + s + } else { + panic!("Unexpected schema.") + } + } + + fn layout(self: @ContractState) -> dojo::meta::Layout { + dojo::meta::introspect::Introspect::::layout() + } + } +} diff --git a/crates/dojo/core-cairo-test/src/tests/meta/introspect.cairo b/crates/dojo/core-foundry-test/src/tests/meta/introspect.cairo similarity index 97% rename from crates/dojo/core-cairo-test/src/tests/meta/introspect.cairo rename to crates/dojo/core-foundry-test/src/tests/meta/introspect.cairo index bfa89e3023..6f994f5521 100644 --- a/crates/dojo/core-cairo-test/src/tests/meta/introspect.cairo +++ b/crates/dojo/core-foundry-test/src/tests/meta/introspect.cairo @@ -281,7 +281,7 @@ fn test_layout_of_inner_packed_struct() { } #[test] -#[should_panic(expected: ("A packed model layout must contain Fixed layouts only.",))] +#[should_panic(expected: "A packed model layout must contain Fixed layouts only.")] fn test_layout_of_not_packed_inner_struct() { let _ = Introspect::::layout(); } @@ -304,7 +304,7 @@ fn test_layout_of_inner_packed_enum() { } #[test] -#[should_panic(expected: ("A packed model layout must contain Fixed layouts only.",))] +#[should_panic(expected: "A packed model layout must contain Fixed layouts only.")] fn test_layout_of_not_packed_inner_enum() { let _ = Introspect::::layout(); } diff --git a/crates/dojo/core-cairo-test/src/tests/model/model.cairo b/crates/dojo/core-foundry-test/src/tests/model/model.cairo similarity index 94% rename from crates/dojo/core-cairo-test/src/tests/model/model.cairo rename to crates/dojo/core-foundry-test/src/tests/model/model.cairo index ff48b33192..be38c067d6 100644 --- a/crates/dojo/core-cairo-test/src/tests/model/model.cairo +++ b/crates/dojo/core-foundry-test/src/tests/model/model.cairo @@ -1,6 +1,6 @@ use dojo::model::{Model, ModelValue, ModelStorage, ModelValueStorage}; use dojo::world::WorldStorage; -use dojo_cairo_test::{spawn_test_world, NamespaceDef, TestResource}; +use crate::world::{spawn_test_world, NamespaceDef, TestResource}; #[derive(Copy, Drop, Serde, Debug)] #[dojo::model] @@ -27,9 +27,8 @@ struct Foo2 { fn namespace_def() -> NamespaceDef { NamespaceDef { - namespace: "dojo_cairo_test", resources: [ - TestResource::Model(m_Foo::TEST_CLASS_HASH.try_into().unwrap()), - TestResource::Model(m_Foo2::TEST_CLASS_HASH.try_into().unwrap()), + namespace: "dojo_foundry_test", resources: [ + TestResource::Model("Foo"), TestResource::Model("Foo2"), ].span() } } diff --git a/crates/dojo/core-cairo-test/src/tests/storage/database.cairo b/crates/dojo/core-foundry-test/src/tests/storage/database.cairo similarity index 100% rename from crates/dojo/core-cairo-test/src/tests/storage/database.cairo rename to crates/dojo/core-foundry-test/src/tests/storage/database.cairo diff --git a/crates/dojo/core-cairo-test/src/tests/storage/packing.cairo b/crates/dojo/core-foundry-test/src/tests/storage/packing.cairo similarity index 100% rename from crates/dojo/core-cairo-test/src/tests/storage/packing.cairo rename to crates/dojo/core-foundry-test/src/tests/storage/packing.cairo diff --git a/crates/dojo/core-cairo-test/src/tests/storage/storage.cairo b/crates/dojo/core-foundry-test/src/tests/storage/storage.cairo similarity index 100% rename from crates/dojo/core-cairo-test/src/tests/storage/storage.cairo rename to crates/dojo/core-foundry-test/src/tests/storage/storage.cairo diff --git a/crates/dojo/core-cairo-test/src/tests/utils/hash.cairo b/crates/dojo/core-foundry-test/src/tests/utils/hash.cairo similarity index 100% rename from crates/dojo/core-cairo-test/src/tests/utils/hash.cairo rename to crates/dojo/core-foundry-test/src/tests/utils/hash.cairo diff --git a/crates/dojo/core-cairo-test/src/tests/utils/key.cairo b/crates/dojo/core-foundry-test/src/tests/utils/key.cairo similarity index 100% rename from crates/dojo/core-cairo-test/src/tests/utils/key.cairo rename to crates/dojo/core-foundry-test/src/tests/utils/key.cairo diff --git a/crates/dojo/core-cairo-test/src/tests/utils/layout.cairo b/crates/dojo/core-foundry-test/src/tests/utils/layout.cairo similarity index 100% rename from crates/dojo/core-cairo-test/src/tests/utils/layout.cairo rename to crates/dojo/core-foundry-test/src/tests/utils/layout.cairo diff --git a/crates/dojo/core-cairo-test/src/tests/utils/misc.cairo b/crates/dojo/core-foundry-test/src/tests/utils/misc.cairo similarity index 100% rename from crates/dojo/core-cairo-test/src/tests/utils/misc.cairo rename to crates/dojo/core-foundry-test/src/tests/utils/misc.cairo diff --git a/crates/dojo/core-cairo-test/src/tests/utils/naming.cairo b/crates/dojo/core-foundry-test/src/tests/utils/naming.cairo similarity index 100% rename from crates/dojo/core-cairo-test/src/tests/utils/naming.cairo rename to crates/dojo/core-foundry-test/src/tests/utils/naming.cairo diff --git a/crates/dojo/core-cairo-test/src/tests/world/acl.cairo b/crates/dojo/core-foundry-test/src/tests/world/acl.cairo similarity index 55% rename from crates/dojo/core-cairo-test/src/tests/world/acl.cairo rename to crates/dojo/core-foundry-test/src/tests/world/acl.cairo index f899b51dfb..9f46389ab8 100644 --- a/crates/dojo/core-cairo-test/src/tests/world/acl.cairo +++ b/crates/dojo/core-foundry-test/src/tests/world/acl.cairo @@ -1,39 +1,44 @@ -use dojo::utils::bytearray_hash; use dojo::world::IWorldDispatcherTrait; use crate::tests::helpers::{ - deploy_world, foo_setter, IFooSetterDispatcher, IFooSetterDispatcherTrait, deploy_world_and_foo + deploy_world, IFooSetterDispatcher, IFooSetterDispatcherTrait, deploy_world_and_foo }; -use crate::tests::expanded::selector_attack::{attacker_model, attacker_contract}; +use crate::snf_utils; + #[test] fn test_owner() { - let (world, foo_selector) = deploy_world_and_foo(); + // deploy a dedicated contract to be used as caller/account address because of + // the way `world.panic_with_details()` is written. + // Once this function will use SRC5, we will be able to remove these lines + let caller_contract = snf_utils::declare_and_deploy("dojo_caller_contract"); + snf_utils::set_caller_address(caller_contract); + snf_utils::set_account_address(caller_contract); + let (world, foo_selector) = deploy_world_and_foo(); let world = world.dispatcher; - let alice = starknet::contract_address_const::<0xa11ce>(); - let bob = starknet::contract_address_const::<0xb0b>(); + let test_contract = snf_utils::declare_and_deploy("test_contract"); + let another_test_contract = snf_utils::declare_and_deploy("another_test_contract"); - assert(!world.is_owner(0, alice), 'should not be owner'); - assert(!world.is_owner(foo_selector, bob), 'should not be owner'); + assert(!world.is_owner(0, test_contract), 'should not be owner'); + assert(!world.is_owner(foo_selector, another_test_contract), 'should not be owner'); + world.grant_owner(0, test_contract); + assert(world.is_owner(0, test_contract), 'should be owner'); - world.grant_owner(0, alice); - assert(world.is_owner(0, alice), 'should be owner'); + world.grant_owner(foo_selector, another_test_contract); + assert(world.is_owner(foo_selector, another_test_contract), 'should be owner'); - world.grant_owner(foo_selector, bob); - assert(world.is_owner(foo_selector, bob), 'should be owner'); + world.revoke_owner(0, test_contract); + assert(!world.is_owner(0, test_contract), 'should not be owner'); - world.revoke_owner(0, alice); - assert(!world.is_owner(0, alice), 'should not be owner'); - - world.revoke_owner(foo_selector, bob); - assert(!world.is_owner(foo_selector, bob), 'should not be owner'); + world.revoke_owner(foo_selector, another_test_contract); + assert(!world.is_owner(foo_selector, another_test_contract), 'should not be owner'); } #[test] -#[should_panic(expected: ("Resource `42` is not registered", 'ENTRYPOINT_FAILED'))] +#[should_panic(expected: "Resource `42` is not registered")] fn test_grant_owner_not_registered_resource() { let world = deploy_world(); let world = world.dispatcher; @@ -43,29 +48,26 @@ fn test_grant_owner_not_registered_resource() { } #[test] -#[should_panic(expected: ('CONTRACT_NOT_DEPLOYED', 'ENTRYPOINT_FAILED'))] +#[should_panic(expected: ('ENTRYPOINT_NOT_FOUND', 'ENTRYPOINT_FAILED'))] fn test_grant_owner_through_malicious_contract() { let (world, foo_selector) = deploy_world_and_foo(); let world = world.dispatcher; let alice = starknet::contract_address_const::<0xa11ce>(); let bob = starknet::contract_address_const::<0xb0b>(); - let malicious_contract = starknet::contract_address_const::<0xdead>(); + let malicious_contract = snf_utils::declare_and_deploy("malicious_contract"); world.grant_owner(foo_selector, alice); - starknet::testing::set_account_contract_address(alice); - starknet::testing::set_contract_address(malicious_contract); + snf_utils::set_account_address(alice); + snf_utils::set_caller_address(malicious_contract); world.grant_owner(foo_selector, bob); } #[test] #[should_panic( - expected: ( - "Account `659918` does NOT have OWNER role on model (or its namespace) `Foo`", - 'ENTRYPOINT_FAILED' - ) + expected: "Account `659918` does NOT have OWNER role on model (or its namespace) `Foo`" )] fn test_grant_owner_fails_for_non_owner() { let (world, foo_selector) = deploy_world_and_foo(); @@ -74,37 +76,34 @@ fn test_grant_owner_fails_for_non_owner() { let alice = starknet::contract_address_const::<0xa11ce>(); let bob = starknet::contract_address_const::<0xb0b>(); - starknet::testing::set_account_contract_address(alice); - starknet::testing::set_contract_address(alice); + snf_utils::set_account_address(alice); + snf_utils::set_caller_address(alice); world.grant_owner(foo_selector, bob); } #[test] -#[should_panic(expected: ('CONTRACT_NOT_DEPLOYED', 'ENTRYPOINT_FAILED'))] +#[should_panic(expected: ('ENTRYPOINT_NOT_FOUND', 'ENTRYPOINT_FAILED'))] fn test_revoke_owner_through_malicious_contract() { let (world, foo_selector) = deploy_world_and_foo(); let world = world.dispatcher; let alice = starknet::contract_address_const::<0xa11ce>(); let bob = starknet::contract_address_const::<0xb0b>(); - let malicious_contract = starknet::contract_address_const::<0xdead>(); + let malicious_contract = snf_utils::declare_and_deploy("malicious_contract"); world.grant_owner(foo_selector, alice); world.grant_owner(foo_selector, bob); - starknet::testing::set_account_contract_address(alice); - starknet::testing::set_contract_address(malicious_contract); + snf_utils::set_account_address(alice); + snf_utils::set_caller_address(malicious_contract); world.revoke_owner(foo_selector, bob); } #[test] #[should_panic( - expected: ( - "Account `659918` does NOT have OWNER role on model (or its namespace) `Foo`", - 'ENTRYPOINT_FAILED' - ) + expected: "Account `659918` does NOT have OWNER role on model (or its namespace) `Foo`" )] fn test_revoke_owner_fails_for_non_owner() { let (world, foo_selector) = deploy_world_and_foo(); @@ -115,8 +114,8 @@ fn test_revoke_owner_fails_for_non_owner() { world.grant_owner(foo_selector, bob); - starknet::testing::set_account_contract_address(alice); - starknet::testing::set_contract_address(alice); + snf_utils::set_account_address(alice); + snf_utils::set_caller_address(alice); world.revoke_owner(foo_selector, bob); } @@ -146,29 +145,26 @@ fn test_writer_not_registered_resource() { } #[test] -#[should_panic(expected: ('CONTRACT_NOT_DEPLOYED', 'ENTRYPOINT_FAILED'))] +#[should_panic(expected: ('ENTRYPOINT_NOT_FOUND', 'ENTRYPOINT_FAILED'))] fn test_grant_writer_through_malicious_contract() { let (world, foo_selector) = deploy_world_and_foo(); let world = world.dispatcher; let alice = starknet::contract_address_const::<0xa11ce>(); let bob = starknet::contract_address_const::<0xb0b>(); - let malicious_contract = starknet::contract_address_const::<0xdead>(); + let malicious_contract = snf_utils::declare_and_deploy("malicious_contract"); world.grant_owner(foo_selector, alice); - starknet::testing::set_account_contract_address(alice); - starknet::testing::set_contract_address(malicious_contract); + snf_utils::set_account_address(alice); + snf_utils::set_caller_address(malicious_contract); world.grant_writer(foo_selector, bob); } #[test] #[should_panic( - expected: ( - "Account `659918` does NOT have OWNER role on model (or its namespace) `Foo`", - 'ENTRYPOINT_FAILED' - ) + expected: "Account `659918` does NOT have OWNER role on model (or its namespace) `Foo`" )] fn test_grant_writer_fails_for_non_owner() { let (world, foo_selector) = deploy_world_and_foo(); @@ -177,37 +173,34 @@ fn test_grant_writer_fails_for_non_owner() { let alice = starknet::contract_address_const::<0xa11ce>(); let bob = starknet::contract_address_const::<0xb0b>(); - starknet::testing::set_account_contract_address(alice); - starknet::testing::set_contract_address(alice); + snf_utils::set_account_address(alice); + snf_utils::set_caller_address(alice); world.grant_writer(foo_selector, bob); } #[test] -#[should_panic(expected: ('CONTRACT_NOT_DEPLOYED', 'ENTRYPOINT_FAILED'))] +#[should_panic(expected: ('ENTRYPOINT_NOT_FOUND', 'ENTRYPOINT_FAILED'))] fn test_revoke_writer_through_malicious_contract() { let (world, foo_selector) = deploy_world_and_foo(); let world = world.dispatcher; let alice = starknet::contract_address_const::<0xa11ce>(); let bob = starknet::contract_address_const::<0xb0b>(); - let malicious_contract = starknet::contract_address_const::<0xdead>(); + let malicious_contract = snf_utils::declare_and_deploy("malicious_contract"); world.grant_owner(foo_selector, alice); world.grant_writer(foo_selector, bob); - starknet::testing::set_account_contract_address(alice); - starknet::testing::set_contract_address(malicious_contract); + snf_utils::set_account_address(alice); + snf_utils::set_caller_address(malicious_contract); world.revoke_writer(foo_selector, bob); } #[test] #[should_panic( - expected: ( - "Account `659918` does NOT have OWNER role on model (or its namespace) `Foo`", - 'ENTRYPOINT_FAILED' - ) + expected: "Account `659918` does NOT have OWNER role on model (or its namespace) `Foo`" )] fn test_revoke_writer_fails_for_non_owner() { let (world, foo_selector) = deploy_world_and_foo(); @@ -218,58 +211,39 @@ fn test_revoke_writer_fails_for_non_owner() { world.grant_owner(foo_selector, bob); - starknet::testing::set_account_contract_address(alice); - starknet::testing::set_contract_address(alice); + snf_utils::set_account_address(alice); + snf_utils::set_caller_address(alice); world.revoke_writer(foo_selector, bob); } #[test] #[should_panic( - expected: ( - "Contract `foo_setter` does NOT have WRITER role on model (or its namespace) `Foo`", - 'ENTRYPOINT_FAILED', - 'ENTRYPOINT_FAILED' - ) + expected: "Contract `foo_setter` does NOT have WRITER role on model (or its namespace) `Foo`" )] fn test_not_writer_with_known_contract() { let (world, _) = deploy_world_and_foo(); let world = world.dispatcher; - let account = starknet::contract_address_const::<0xb0b>(); - world.grant_owner(bytearray_hash(@"dojo"), account); - - // the account owns the 'test_contract' namespace so it should be able to deploy - // and register the model. - starknet::testing::set_account_contract_address(account); - starknet::testing::set_contract_address(account); - let contract_address = world - .register_contract('salt1', "dojo", foo_setter::TEST_CLASS_HASH.try_into().unwrap()); + .register_contract('salt1', "dojo", snf_utils::declare_contract("foo_setter")); let d = IFooSetterDispatcher { contract_address }; d.set_foo(1, 2); - - core::panics::panic_with_byte_array( - @"Contract `dojo-foo_setter` does NOT have WRITER role on model (or its namespace) `Foo`" - ); } /// Test that an attacker can't control the hashes of resources in other namespaces /// by registering a model in an other namespace. #[test] #[should_panic( - expected: ( - "Account `7022365680606078322` does NOT have OWNER role on namespace `dojo`", - 'ENTRYPOINT_FAILED', - ) + expected: "Account `7022365680606078322` does NOT have OWNER role on namespace `dojo`" )] fn test_register_model_namespace_not_owner() { let owner = starknet::contract_address_const::<'owner'>(); let attacker = starknet::contract_address_const::<'attacker'>(); - starknet::testing::set_account_contract_address(owner); - starknet::testing::set_contract_address(owner); + snf_utils::set_account_address(owner); + snf_utils::set_caller_address(owner); // Owner deploys the world and register Foo model. let (world, foo_selector) = deploy_world_and_foo(); @@ -277,31 +251,28 @@ fn test_register_model_namespace_not_owner() { assert(world.is_owner(foo_selector, owner), 'should be owner'); - starknet::testing::set_contract_address(attacker); - starknet::testing::set_account_contract_address(attacker); + snf_utils::set_caller_address(attacker); + snf_utils::set_account_address(attacker); // Attacker has control over the this namespace. world.register_namespace("atk"); // Attacker can't take ownership of the Foo model in the dojo namespace. - world.register_model("dojo", attacker_model::TEST_CLASS_HASH.try_into().unwrap()); + world.register_model("dojo", snf_utils::declare_contract("attacker_model")); } /// Test that an attacker can't control the hashes of resources in other namespaces /// by deploying a contract in an other namespace. #[test] #[should_panic( - expected: ( - "Account `7022365680606078322` does NOT have OWNER role on namespace `dojo`", - 'ENTRYPOINT_FAILED', - ) + expected: "Account `7022365680606078322` does NOT have OWNER role on namespace `dojo`" )] fn test_register_contract_namespace_not_owner() { let owner = starknet::contract_address_const::<'owner'>(); let attacker = starknet::contract_address_const::<'attacker'>(); - starknet::testing::set_account_contract_address(owner); - starknet::testing::set_contract_address(owner); + snf_utils::set_account_address(owner); + snf_utils::set_caller_address(owner); // Owner deploys the world and register Foo model. let (world, foo_selector) = deploy_world_and_foo(); @@ -309,13 +280,12 @@ fn test_register_contract_namespace_not_owner() { assert(world.is_owner(foo_selector, owner), 'should be owner'); - starknet::testing::set_contract_address(attacker); - starknet::testing::set_account_contract_address(attacker); + snf_utils::set_caller_address(attacker); + snf_utils::set_account_address(attacker); // Attacker has control over the this namespace. world.register_namespace("atk"); // Attacker can't take ownership of the Foo model. - world - .register_contract('salt1', "dojo", attacker_contract::TEST_CLASS_HASH.try_into().unwrap()); + world.register_contract('salt1', "dojo", snf_utils::declare_contract("attacker_contract")); } diff --git a/crates/dojo/core-cairo-test/src/tests/world/contract.cairo b/crates/dojo/core-foundry-test/src/tests/world/contract.cairo similarity index 56% rename from crates/dojo/core-cairo-test/src/tests/world/contract.cairo rename to crates/dojo/core-foundry-test/src/tests/world/contract.cairo index 093427cac9..4ff6d5fbca 100644 --- a/crates/dojo/core-cairo-test/src/tests/world/contract.cairo +++ b/crates/dojo/core-foundry-test/src/tests/world/contract.cairo @@ -1,8 +1,10 @@ -use core::starknet::{ContractAddress, ClassHash}; use dojo::world::{world, IWorldDispatcherTrait}; use dojo::contract::components::upgradeable::{IUpgradeableDispatcher, IUpgradeableDispatcherTrait}; use dojo::meta::{IDeployedResourceDispatcher, IDeployedResourceDispatcherTrait}; -use crate::tests::helpers::{DOJO_NSH, test_contract, drop_all_events, deploy_world}; +use crate::tests::helpers::{DOJO_NSH, deploy_world}; +use crate::snf_utils; + +use snforge_std::{spy_events, EventSpyAssertionsTrait}; #[starknet::contract] pub mod contract_invalid_upgrade { @@ -64,10 +66,9 @@ fn test_upgrade_from_world() { let world = world.dispatcher; let base_address = world - .register_contract('salt', "dojo", test_contract::TEST_CLASS_HASH.try_into().unwrap()); - let new_class_hash: ClassHash = test_contract_upgrade::TEST_CLASS_HASH.try_into().unwrap(); + .register_contract('salt', "dojo", snf_utils::declare_contract("test_contract")); - world.upgrade_contract("dojo", new_class_hash); + world.upgrade_contract("dojo", snf_utils::declare_contract("test_contract_upgrade")); let quantum_dispatcher = IQuantumLeapDispatcher { contract_address: base_address }; assert(quantum_dispatcher.plz_more_tps() == 'daddy', 'quantum leap failed'); @@ -80,26 +81,22 @@ fn test_upgrade_from_world_not_world_provider() { let world = deploy_world(); let world = world.dispatcher; - let _ = world - .register_contract('salt', "dojo", test_contract::TEST_CLASS_HASH.try_into().unwrap()); - let new_class_hash: ClassHash = contract_invalid_upgrade::TEST_CLASS_HASH.try_into().unwrap(); - - world.upgrade_contract("dojo", new_class_hash); + let _ = world.register_contract('salt', "dojo", snf_utils::declare_contract("test_contract")); + world.upgrade_contract("dojo", snf_utils::declare_contract("contract_invalid_upgrade")); } #[test] #[available_gas(6000000)] -#[should_panic(expected: ('must be called by world', 'ENTRYPOINT_FAILED'))] +#[should_panic(expected: 'must be called by world')] fn test_upgrade_direct() { let world = deploy_world(); let world = world.dispatcher; let base_address = world - .register_contract('salt', "dojo", test_contract::TEST_CLASS_HASH.try_into().unwrap()); - let new_class_hash: ClassHash = test_contract_upgrade::TEST_CLASS_HASH.try_into().unwrap(); + .register_contract('salt', "dojo", snf_utils::declare_contract("test_contract")); let upgradeable_dispatcher = IUpgradeableDispatcher { contract_address: base_address }; - upgradeable_dispatcher.upgrade(new_class_hash); + upgradeable_dispatcher.upgrade(snf_utils::declare_contract("test_contract_upgrade")); } #[starknet::interface] @@ -164,40 +161,40 @@ fn test_deploy_contract_for_namespace_owner() { let world = deploy_world(); let world = world.dispatcher; - let class_hash = test_contract::TEST_CLASS_HASH.try_into().unwrap(); + let class_hash = snf_utils::declare_contract("test_contract"); let bob = starknet::contract_address_const::<0xb0b>(); world.grant_owner(DOJO_NSH, bob); // the account owns the 'test_contract' namespace so it should be able to deploy the contract. - starknet::testing::set_account_contract_address(bob); - starknet::testing::set_contract_address(bob); + snf_utils::set_account_address(bob); + snf_utils::set_caller_address(bob); - drop_all_events(world.contract_address); + let mut spy = spy_events(); let contract_address = world.register_contract('salt1', "dojo", class_hash); - let event = match starknet::testing::pop_log::(world.contract_address).unwrap() { - world::Event::ContractRegistered(event) => event, - _ => panic!("no ContractRegistered event"), - }; - - let contract = IDeployedResourceDispatcher { contract_address }; - let contract_name = contract.dojo_name(); - - assert(event.name == contract_name, 'bad name'); - assert(event.namespace == "dojo", 'bad namespace'); - assert(event.salt == 'salt1', 'bad event salt'); - assert(event.class_hash == class_hash, 'bad class_hash'); - assert( - event.address != core::num::traits::Zero::::zero(), 'bad contract address' - ); + spy + .assert_emitted( + @array![ + ( + world.contract_address, + world::Event::ContractRegistered( + world::ContractRegistered { + name: "test_contract", + namespace: "dojo", + address: contract_address, + class_hash: class_hash, + salt: 'salt1' + } + ) + ) + ] + ); } #[test] -#[should_panic( - expected: ("Account `2827` does NOT have OWNER role on namespace `dojo`", 'ENTRYPOINT_FAILED',) -)] +#[should_panic(expected: "Account `2827` does NOT have OWNER role on namespace `dojo`")] fn test_deploy_contract_for_namespace_writer() { let world = deploy_world(); let world = world.dispatcher; @@ -207,117 +204,109 @@ fn test_deploy_contract_for_namespace_writer() { // the account has write access to the 'test_contract' namespace so it should be able to deploy // the contract. - starknet::testing::set_account_contract_address(bob); - starknet::testing::set_contract_address(bob); + snf_utils::set_account_address(bob); + snf_utils::set_caller_address(bob); - world.register_contract('salt1', "dojo", test_contract::TEST_CLASS_HASH.try_into().unwrap()); + world.register_contract('salt1', "dojo", snf_utils::declare_contract("test_contract")); } #[test] -#[should_panic( - expected: ("Account `2827` does NOT have OWNER role on namespace `dojo`", 'ENTRYPOINT_FAILED',) -)] +#[should_panic(expected: "Account `2827` does NOT have OWNER role on namespace `dojo`")] fn test_deploy_contract_no_namespace_owner_access() { let world = deploy_world(); let world = world.dispatcher; let bob = starknet::contract_address_const::<0xb0b>(); - starknet::testing::set_account_contract_address(bob); - starknet::testing::set_contract_address(bob); + snf_utils::set_account_address(bob); + snf_utils::set_caller_address(bob); - world.register_contract('salt1', "dojo", test_contract::TEST_CLASS_HASH.try_into().unwrap()); + world.register_contract('salt1', "dojo", snf_utils::declare_contract("test_contract")); } #[test] -#[should_panic(expected: ("Namespace `buzz_namespace` is not registered", 'ENTRYPOINT_FAILED',))] +#[should_panic(expected: "Namespace `buzz_namespace` is not registered")] fn test_deploy_contract_with_unregistered_namespace() { let world = deploy_world(); let world = world.dispatcher; world - .register_contract( - 'salt1', "buzz_namespace", test_contract::TEST_CLASS_HASH.try_into().unwrap() - ); + .register_contract('salt1', "buzz_namespace", snf_utils::declare_contract("test_contract")); } -// It's CONTRACT_NOT_DEPLOYED for now as in this example the contract is not a dojo contract +// It's ENTRYPOINT_NOT_FOUND for now as in this example the contract is not a dojo contract // and it's not the account that is calling the deploy_contract function. #[test] -#[should_panic(expected: ('CONTRACT_NOT_DEPLOYED', 'ENTRYPOINT_FAILED',))] +#[should_panic(expected: ('ENTRYPOINT_NOT_FOUND', 'ENTRYPOINT_FAILED'))] fn test_deploy_contract_through_malicious_contract() { let world = deploy_world(); let world = world.dispatcher; let bob = starknet::contract_address_const::<0xb0b>(); - let malicious_contract = starknet::contract_address_const::<0xdead>(); + let malicious_contract = snf_utils::declare_and_deploy("malicious_contract"); world.grant_owner(DOJO_NSH, bob); // the account owns the 'test_contract' namespace so it should be able to deploy the contract. - starknet::testing::set_account_contract_address(bob); - starknet::testing::set_contract_address(malicious_contract); + snf_utils::set_account_address(bob); + snf_utils::set_caller_address(malicious_contract); - world.register_contract('salt1', "dojo", test_contract::TEST_CLASS_HASH.try_into().unwrap()); + world.register_contract('salt1', "dojo", snf_utils::declare_contract("test_contract")); } #[test] fn test_upgrade_contract_from_resource_owner() { let world = deploy_world(); let world = world.dispatcher; - let class_hash = test_contract::TEST_CLASS_HASH.try_into().unwrap(); + let class_hash = snf_utils::declare_contract("test_contract"); let bob = starknet::contract_address_const::<0xb0b>(); world.grant_owner(DOJO_NSH, bob); - starknet::testing::set_account_contract_address(bob); - starknet::testing::set_contract_address(bob); + snf_utils::set_account_address(bob); + snf_utils::set_caller_address(bob); - let contract_address = world.register_contract('salt1', "dojo", class_hash); - let contract = IDeployedResourceDispatcher { contract_address }; - let contract_name = contract.dojo_name(); + let _ = world.register_contract('salt1', "dojo", class_hash); - drop_all_events(world.contract_address); + let mut spy = spy_events(); world.upgrade_contract("dojo", class_hash); - let event = starknet::testing::pop_log::(world.contract_address); - assert(event.is_some(), 'no event)'); - - if let world::Event::ContractUpgraded(event) = event.unwrap() { - assert( - event - .selector == dojo::utils::selector_from_namespace_and_name( - DOJO_NSH, @contract_name - ), - 'bad contract selector' + spy + .assert_emitted( + @array![ + ( + world.contract_address, + world::Event::ContractUpgraded( + world::ContractUpgraded { + selector: dojo::utils::selector_from_namespace_and_name( + DOJO_NSH, @"test_contract" + ), + class_hash: class_hash, + } + ) + ) + ] ); - assert(event.class_hash == class_hash, 'bad class_hash'); - } else { - core::panic_with_felt252('no ContractUpgraded event'); - }; } #[test] #[should_panic( - expected: ( - "Account `659918` does NOT have OWNER role on contract (or its namespace) `test_contract`", - 'ENTRYPOINT_FAILED', - ) + expected: "Account `659918` does NOT have OWNER role on contract (or its namespace) `test_contract`" )] fn test_upgrade_contract_from_resource_writer() { let world = deploy_world(); let world = world.dispatcher; - let class_hash = test_contract::TEST_CLASS_HASH.try_into().unwrap(); + let class_hash = snf_utils::declare_contract("test_contract"); let bob = starknet::contract_address_const::<0xb0b>(); let alice = starknet::contract_address_const::<0xa11ce>(); world.grant_owner(DOJO_NSH, bob); - starknet::testing::set_account_contract_address(bob); - starknet::testing::set_contract_address(bob); + snf_utils::set_account_address(bob); + snf_utils::set_caller_address(bob); let contract_address = world.register_contract('salt1', "dojo", class_hash); let contract = IDeployedResourceDispatcher { contract_address }; @@ -326,54 +315,51 @@ fn test_upgrade_contract_from_resource_writer() { world.grant_writer(contract_selector, alice); - starknet::testing::set_account_contract_address(alice); - starknet::testing::set_contract_address(alice); + snf_utils::set_account_address(alice); + snf_utils::set_caller_address(alice); world.upgrade_contract("dojo", class_hash); } #[test] #[should_panic( - expected: ( - "Account `659918` does NOT have OWNER role on contract (or its namespace) `test_contract`", - 'ENTRYPOINT_FAILED', - ) + expected: "Account `659918` does NOT have OWNER role on contract (or its namespace) `test_contract`" )] fn test_upgrade_contract_from_random_account() { let world = deploy_world(); let world = world.dispatcher; - let class_hash = test_contract::TEST_CLASS_HASH.try_into().unwrap(); + let class_hash = snf_utils::declare_contract("test_contract"); let _contract_address = world.register_contract('salt1', "dojo", class_hash); let alice = starknet::contract_address_const::<0xa11ce>(); - starknet::testing::set_account_contract_address(alice); - starknet::testing::set_contract_address(alice); + snf_utils::set_account_address(alice); + snf_utils::set_caller_address(alice); world.upgrade_contract("dojo", class_hash); } #[test] -#[should_panic(expected: ('CONTRACT_NOT_DEPLOYED', 'ENTRYPOINT_FAILED',))] +#[should_panic(expected: ('ENTRYPOINT_NOT_FOUND', 'ENTRYPOINT_FAILED'))] fn test_upgrade_contract_through_malicious_contract() { let world = deploy_world(); let world = world.dispatcher; - let class_hash = test_contract::TEST_CLASS_HASH.try_into().unwrap(); + let class_hash = snf_utils::declare_contract("test_contract"); let bob = starknet::contract_address_const::<0xb0b>(); - let malicious_contract = starknet::contract_address_const::<0xdead>(); + let malicious_contract = snf_utils::declare_and_deploy("malicious_contract"); world.grant_owner(DOJO_NSH, bob); - starknet::testing::set_account_contract_address(bob); - starknet::testing::set_contract_address(bob); + snf_utils::set_account_address(bob); + snf_utils::set_caller_address(bob); let _contract_address = world.register_contract('salt1', "dojo", class_hash); - starknet::testing::set_contract_address(malicious_contract); + snf_utils::set_caller_address(malicious_contract); world.upgrade_contract("dojo", class_hash); } diff --git a/crates/dojo/core-foundry-test/src/tests/world/event.cairo b/crates/dojo/core-foundry-test/src/tests/world/event.cairo new file mode 100644 index 0000000000..4c4ac84ba2 --- /dev/null +++ b/crates/dojo/core-foundry-test/src/tests/world/event.cairo @@ -0,0 +1,260 @@ +use core::starknet::ContractAddress; + +use crate::tests::helpers::{DOJO_NSH, deploy_world, deploy_world_for_event_upgrades}; +use dojo::world::IWorldDispatcherTrait; +use dojo::event::Event; +use crate::snf_utils; + +use snforge_std::{spy_events, EventSpyTrait, EventsFilterTrait}; + +#[derive(Copy, Drop, Serde, Debug)] +#[dojo::event] +pub struct FooEventBadLayoutType { + #[key] + pub caller: ContractAddress, + pub a: felt252, + pub b: u128, +} + +#[derive(Copy, Drop, Serde, Debug)] +#[dojo::event] +pub struct FooEventMemberRemoved { + #[key] + pub caller: ContractAddress, + pub b: u128, +} + +#[derive(Copy, Drop, Serde, Debug)] +#[dojo::event] +pub struct FooEventMemberAddedButRemoved { + #[key] + pub caller: ContractAddress, + pub b: u128, + pub c: u256, + pub d: u256 +} + +#[derive(Copy, Drop, Serde, Debug)] +#[dojo::event] +pub struct FooEventMemberAddedButMoved { + #[key] + pub caller: ContractAddress, + pub b: u128, + pub a: felt252, + pub c: u256 +} + +#[derive(Copy, Drop, Serde, Debug)] +#[dojo::event] +pub struct FooEventMemberAdded { + #[key] + pub caller: ContractAddress, + pub a: felt252, + pub b: u128, + pub c: u256 +} + +#[test] +fn test_register_event_for_namespace_owner() { + let bob = starknet::contract_address_const::<0xb0b>(); + + let world = deploy_world(); + let world = world.dispatcher; + + world.grant_owner(DOJO_NSH, bob); + + let mut spy = spy_events(); + + snf_utils::set_account_address(bob); + snf_utils::set_caller_address(bob); + + let class_hash = snf_utils::declare_event_contract("SimpleEvent"); + world.register_event("dojo", class_hash); + + // parse the event manually because we don't know the value of + // the 'address' field of the emitted event to assert a full event. + let events = spy.get_events().emitted_by(world.contract_address); + + assert(events.events.len() == 1, 'There should be one event'); + + let (_, event) = events.events.at(0); + let mut keys = event.keys.span(); + + let event_name = *keys.pop_front().unwrap(); + let name: ByteArray = core::serde::Serde::deserialize(ref keys).unwrap(); + let ns: ByteArray = core::serde::Serde::deserialize(ref keys).unwrap(); + + assert(event_name == selector!("EventRegistered"), 'Wrong event name'); + assert(name == "SimpleEvent", 'Wrong name'); + assert(ns == "dojo", 'Wrong namespace'); + assert(event.data.at(0) == @class_hash.into(), 'Wrong class hash'); +} + +#[test] +#[should_panic(expected: "Account `2827` does NOT have OWNER role on namespace `dojo`")] +fn test_register_event_for_namespace_writer() { + let bob = starknet::contract_address_const::<0xb0b>(); + + let world = deploy_world(); + let world = world.dispatcher; + + world.grant_writer(DOJO_NSH, bob); + + snf_utils::set_account_address(bob); + snf_utils::set_caller_address(bob); + world.register_event("dojo", snf_utils::declare_event_contract("SimpleEvent")); +} + +#[test] +fn test_upgrade_event_from_event_owner() { + let bob = starknet::contract_address_const::<0xb0b>(); + + let world = deploy_world_for_event_upgrades(); + world.grant_owner(Event::::selector(DOJO_NSH), bob); + + snf_utils::set_account_address(bob); + snf_utils::set_caller_address(bob); + + let mut spy = spy_events(); + + let class_hash = snf_utils::declare_event_contract("FooEventMemberAdded"); + world.upgrade_event("dojo", class_hash); + + // parse the event manually because we don't know the value of + // the 'address' field of the emitted event to assert a full event. + let events = spy.get_events().emitted_by(world.contract_address); + + assert(events.events.len() == 1, 'There should be one event'); + + let (_, event) = events.events.at(0); + + assert(event.keys.at(0) == @selector!("EventUpgraded"), 'Wrong event name'); + assert( + event.keys.at(1) == @Event::::selector(DOJO_NSH), 'bad model selector' + ); + assert(event.data.at(0) == @class_hash.into(), 'Wrong class hash'); + + assert( + world.is_owner(Event::::selector(DOJO_NSH), bob), + 'bob is not the owner' + ); +} + +#[test] +fn test_upgrade_event() { + let world = deploy_world_for_event_upgrades(); + + let mut spy = spy_events(); + + let class_hash = snf_utils::declare_event_contract("FooEventMemberAdded"); + world.upgrade_event("dojo", class_hash); + + // parse the event manually because we don't know the value of + // the 'address' field of the emitted event to assert a full event. + let events = spy.get_events().emitted_by(world.contract_address); + + assert(events.events.len() == 1, 'There should be one event'); + + let (_, event) = events.events.at(0); + + assert(event.keys.at(0) == @selector!("EventUpgraded"), 'Wrong event name'); + assert( + event.keys.at(1) == @Event::::selector(DOJO_NSH), 'bad model selector' + ); + assert(event.data.at(0) == @class_hash.into(), 'Wrong class hash'); +} + +#[test] +#[should_panic(expected: "Invalid new layout to upgrade the resource `dojo-FooEventBadLayoutType`")] +fn test_upgrade_event_with_bad_layout_type() { + let world = deploy_world_for_event_upgrades(); + world.upgrade_event("dojo", snf_utils::declare_event_contract("FooEventBadLayoutType")); +} + +#[test] +#[should_panic(expected: "Invalid new schema to upgrade the resource `dojo-FooEventMemberRemoved`")] +fn test_upgrade_event_with_member_removed() { + let world = deploy_world_for_event_upgrades(); + world.upgrade_event("dojo", snf_utils::declare_event_contract("FooEventMemberRemoved")); +} + +#[test] +#[should_panic( + expected: "Invalid new schema to upgrade the resource `dojo-FooEventMemberAddedButRemoved`" +)] +fn test_upgrade_event_with_member_added_but_removed() { + let world = deploy_world_for_event_upgrades(); + world.upgrade_event("dojo", snf_utils::declare_event_contract("FooEventMemberAddedButRemoved")); +} + +#[test] +#[should_panic( + expected: "Invalid new schema to upgrade the resource `dojo-FooEventMemberAddedButMoved`" +)] +fn test_upgrade_event_with_member_moved() { + let world = deploy_world_for_event_upgrades(); + world.upgrade_event("dojo", snf_utils::declare_event_contract("FooEventMemberAddedButMoved")); +} + +#[test] +#[should_panic( + expected: "Account `659918` does NOT have OWNER role on event (or its namespace) `FooEventMemberAdded`" +)] +fn test_upgrade_event_from_event_writer() { + let alice = starknet::contract_address_const::<0xa11ce>(); + + let world = deploy_world_for_event_upgrades(); + + world.grant_writer(Event::::selector(DOJO_NSH), alice); + + snf_utils::set_account_address(alice); + snf_utils::set_caller_address(alice); + world.upgrade_event("dojo", snf_utils::declare_event_contract("FooEventMemberAdded")); +} + +#[test] +#[should_panic(expected: "Resource `dojo-SimpleEvent` is already registered")] +fn test_upgrade_event_from_random_account() { + let bob = starknet::contract_address_const::<0xb0b>(); + let alice = starknet::contract_address_const::<0xa11ce>(); + + let world = deploy_world(); + let world = world.dispatcher; + + world.grant_owner(DOJO_NSH, bob); + world.grant_owner(DOJO_NSH, alice); + + snf_utils::set_account_address(bob); + snf_utils::set_caller_address(bob); + world.register_event("dojo", snf_utils::declare_event_contract("SimpleEvent")); + + snf_utils::set_account_address(alice); + snf_utils::set_caller_address(alice); + world.register_event("dojo", snf_utils::declare_event_contract("SimpleEvent")); +} + +#[test] +#[should_panic(expected: "Namespace `another_namespace` is not registered")] +fn test_register_event_with_unregistered_namespace() { + let world = deploy_world(); + let world = world.dispatcher; + + world.register_event("another_namespace", snf_utils::declare_event_contract("SimpleEvent")); +} + +// It's ENTRYPOINT_NOT_FOUND for now as in this example the contract is not a dojo contract +// and it's not the account that is calling the register_event function. +#[test] +#[should_panic(expected: ('ENTRYPOINT_NOT_FOUND', 'ENTRYPOINT_FAILED'))] +fn test_register_event_through_malicious_contract() { + let bob = starknet::contract_address_const::<0xb0b>(); + let malicious_contract = snf_utils::declare_and_deploy("malicious_contract"); + + let world = deploy_world(); + let world = world.dispatcher; + world.grant_owner(DOJO_NSH, bob); + + snf_utils::set_account_address(bob); + snf_utils::set_caller_address(malicious_contract); + world.register_event("dojo", snf_utils::declare_event_contract("SimpleEvent")); +} diff --git a/crates/dojo/core-cairo-test/src/tests/world/metadata.cairo b/crates/dojo/core-foundry-test/src/tests/world/metadata.cairo similarity index 59% rename from crates/dojo/core-cairo-test/src/tests/world/metadata.cairo rename to crates/dojo/core-foundry-test/src/tests/world/metadata.cairo index 0471b82d62..dc4f482a74 100644 --- a/crates/dojo/core-cairo-test/src/tests/world/metadata.cairo +++ b/crates/dojo/core-foundry-test/src/tests/world/metadata.cairo @@ -1,10 +1,20 @@ use dojo::world::{world, IWorldDispatcherTrait}; use dojo::model::{Model, ResourceMetadata}; -use crate::tests::helpers::{DOJO_NSH, Foo, drop_all_events, deploy_world, deploy_world_and_foo}; +use crate::tests::helpers::{DOJO_NSH, Foo, deploy_world, deploy_world_and_foo}; +use crate::snf_utils; + +use snforge_std::{spy_events, EventSpyAssertionsTrait}; #[test] fn test_set_metadata_world() { + // deploy a dedicated contract to be used as caller/account address because of + // the way `world.panic_with_details()` is written. + // Once this function will use SRC5, we will be able to remove these lines + let caller_contract = snf_utils::declare_and_deploy("dojo_caller_contract"); + snf_utils::set_caller_address(caller_contract); + snf_utils::set_account_address(caller_contract); + let world = deploy_world(); let world = world.dispatcher; @@ -26,38 +36,40 @@ fn test_set_metadata_resource_owner() { world.grant_owner(Model::::selector(DOJO_NSH), bob); - starknet::testing::set_account_contract_address(bob); - starknet::testing::set_contract_address(bob); + snf_utils::set_account_address(bob); + snf_utils::set_caller_address(bob); let metadata = ResourceMetadata { resource_id: model_selector, metadata_uri: format!("ipfs:bob"), metadata_hash: 42 }; - drop_all_events(world.contract_address); + let mut spy = spy_events(); // Metadata must be updated by a direct call from an account which has owner role // for the attached resource. world.set_metadata(metadata.clone()); assert(world.metadata(model_selector) == metadata, 'bad metadata'); - let event = starknet::testing::pop_log::(world.contract_address); - assert(event.is_some(), 'no event)'); - - if let world::Event::MetadataUpdate(event) = event.unwrap() { - assert(event.resource == metadata.resource_id, 'bad resource'); - assert(event.uri == metadata.metadata_uri, 'bad uri'); - assert(event.hash == metadata.metadata_hash, 'bad hash'); - } else { - core::panic_with_felt252('no EventUpgraded event'); - } + spy + .assert_emitted( + @array![ + ( + world.contract_address, + world::Event::MetadataUpdate( + world::MetadataUpdate { + resource: metadata.resource_id, + uri: metadata.metadata_uri, + hash: metadata.metadata_hash + } + ) + ) + ] + ); } #[test] #[should_panic( - expected: ( - "Account `2827` does NOT have OWNER role on model (or its namespace) `Foo`", - 'ENTRYPOINT_FAILED', - ) + expected: "Account `2827` does NOT have OWNER role on model (or its namespace) `Foo`" )] fn test_set_metadata_not_possible_for_resource_writer() { let (world, model_selector) = deploy_world_and_foo(); @@ -67,8 +79,8 @@ fn test_set_metadata_not_possible_for_resource_writer() { world.grant_writer(model_selector, bob); - starknet::testing::set_account_contract_address(bob); - starknet::testing::set_contract_address(bob); + snf_utils::set_account_address(bob); + snf_utils::set_caller_address(bob); let metadata = ResourceMetadata { resource_id: model_selector, metadata_uri: format!("ipfs:bob"), metadata_hash: 42 @@ -78,9 +90,7 @@ fn test_set_metadata_not_possible_for_resource_writer() { } #[test] -#[should_panic( - expected: ("Account `2827` does NOT have OWNER role on world", 'ENTRYPOINT_FAILED',) -)] +#[should_panic(expected: "Account `2827` does NOT have OWNER role on world")] fn test_set_metadata_not_possible_for_random_account() { let world = deploy_world(); let world = world.dispatcher; @@ -90,8 +100,8 @@ fn test_set_metadata_not_possible_for_random_account() { }; let bob = starknet::contract_address_const::<0xb0b>(); - starknet::testing::set_contract_address(bob); - starknet::testing::set_account_contract_address(bob); + snf_utils::set_caller_address(bob); + snf_utils::set_account_address(bob); // Bob access follows the conventional ACL, he can't write the world // metadata if he does not have access to it. @@ -99,18 +109,18 @@ fn test_set_metadata_not_possible_for_random_account() { } #[test] -#[should_panic(expected: ('CONTRACT_NOT_DEPLOYED', 'ENTRYPOINT_FAILED',))] +#[should_panic(expected: ('ENTRYPOINT_NOT_FOUND', 'ENTRYPOINT_FAILED'))] fn test_set_metadata_through_malicious_contract() { let (world, model_selector) = deploy_world_and_foo(); let world = world.dispatcher; let bob = starknet::contract_address_const::<0xb0b>(); - let malicious_contract = starknet::contract_address_const::<0xdead>(); + let malicious_contract = snf_utils::declare_and_deploy("malicious_contract"); world.grant_owner(model_selector, bob); - starknet::testing::set_account_contract_address(bob); - starknet::testing::set_contract_address(malicious_contract); + snf_utils::set_account_address(bob); + snf_utils::set_caller_address(malicious_contract); let metadata = ResourceMetadata { resource_id: model_selector, metadata_uri: format!("ipfs:bob"), metadata_hash: 42 diff --git a/crates/dojo/core-foundry-test/src/tests/world/model.cairo b/crates/dojo/core-foundry-test/src/tests/world/model.cairo new file mode 100644 index 0000000000..89b7a5a31d --- /dev/null +++ b/crates/dojo/core-foundry-test/src/tests/world/model.cairo @@ -0,0 +1,271 @@ +use core::starknet::ContractAddress; + +use crate::tests::helpers::{Foo, DOJO_NSH, deploy_world, deploy_world_for_model_upgrades}; +use dojo::world::IWorldDispatcherTrait; +use dojo::model::Model; +use crate::snf_utils; + +use snforge_std::{spy_events, EventSpyTrait, EventsFilterTrait}; + +#[derive(Copy, Drop, Serde)] +#[dojo::model] +pub struct FooModelBadLayoutType { + #[key] + pub caller: ContractAddress, + pub a: felt252, + pub b: u128, +} + +#[derive(Copy, Drop, Serde)] +#[dojo::model] +pub struct FooModelMemberRemoved { + #[key] + pub caller: ContractAddress, + pub b: u128, +} + +#[derive(Copy, Drop, Serde)] +#[dojo::model] +pub struct FooModelMemberAddedButRemoved { + #[key] + pub caller: ContractAddress, + pub b: u128, + pub c: u256, + pub d: u256 +} + +#[derive(Copy, Drop, Serde)] +#[dojo::model] +pub struct FooModelMemberAddedButMoved { + #[key] + pub caller: ContractAddress, + pub b: u128, + pub a: felt252, + pub c: u256 +} + +#[derive(Copy, Drop, Serde)] +#[dojo::model] +pub struct FooModelMemberAdded { + #[key] + pub caller: ContractAddress, + pub a: felt252, + pub b: u128, + pub c: u256 +} + +#[test] +fn test_register_model_for_namespace_owner() { + let bob = starknet::contract_address_const::<0xb0b>(); + + let world = deploy_world(); + let world = world.dispatcher; + + world.grant_owner(DOJO_NSH, bob); + + let mut spy = spy_events(); + + snf_utils::set_account_address(bob); + snf_utils::set_caller_address(bob); + + let class_hash = snf_utils::declare_model_contract("Foo"); + world.register_model("dojo", class_hash); + + // parse the event manually because we don't know the value of + // the 'address' field of the emitted event to assert a full event. + let events = spy.get_events().emitted_by(world.contract_address); + + assert(events.events.len() == 1, 'There should be one event'); + + let (_, event) = events.events.at(0); + let mut keys = event.keys.span(); + + let event_name = *keys.pop_front().unwrap(); + let name: ByteArray = core::serde::Serde::deserialize(ref keys).unwrap(); + let ns: ByteArray = core::serde::Serde::deserialize(ref keys).unwrap(); + + assert(event_name == selector!("ModelRegistered"), 'Wrong event name'); + assert(name == "Foo", 'Wrong name'); + assert(ns == "dojo", 'Wrong namespace'); + assert(event.data.at(0) == @class_hash.into(), 'Wrong class hash'); + + assert(world.is_owner(Model::::selector(DOJO_NSH), bob), 'bob is not the owner'); +} + +#[test] +#[should_panic( + expected: "Name `foo-bis` is invalid according to Dojo naming rules: ^[a-zA-Z0-9_]+$" +)] +fn test_register_model_with_invalid_name() { + let world = deploy_world(); + let world = world.dispatcher; + + world.register_model("dojo", snf_utils::declare_model_contract("FooInvalidName")); +} + +#[test] +#[should_panic(expected: "Account `2827` does NOT have OWNER role on namespace `dojo`")] +fn test_register_model_for_namespace_writer() { + let bob = starknet::contract_address_const::<0xb0b>(); + + let world = deploy_world(); + let world = world.dispatcher; + + world.grant_writer(DOJO_NSH, bob); + + snf_utils::set_account_address(bob); + snf_utils::set_caller_address(bob); + world.register_model("dojo", snf_utils::declare_model_contract("Foo")); +} + +#[test] +fn test_upgrade_model_from_model_owner() { + let bob = starknet::contract_address_const::<0xb0b>(); + + let world = deploy_world_for_model_upgrades(); + + world.grant_owner(Model::::selector(DOJO_NSH), bob); + + snf_utils::set_account_address(bob); + snf_utils::set_caller_address(bob); + + let mut spy = spy_events(); + + let class_hash = snf_utils::declare_model_contract("FooModelMemberAdded"); + world.upgrade_model("dojo", class_hash); + + // parse the event manually because we don't know the value of + // the 'address' field of the emitted event to assert a full event. + let events = spy.get_events().emitted_by(world.contract_address); + + assert(events.events.len() == 1, 'There should be one event'); + + let (_, event) = events.events.at(0); + + assert(event.keys.at(0) == @selector!("ModelUpgraded"), 'Wrong event name'); + assert(event.keys.at(1) == @Model::::selector(DOJO_NSH), 'Wrong selector'); + assert(event.data.at(0) == @class_hash.into(), 'Wrong class hash'); + + assert( + world.is_owner(Model::::selector(DOJO_NSH), bob), + 'bob is not the owner' + ); +} + +#[test] +fn test_upgrade_model() { + let world = deploy_world_for_model_upgrades(); + + let mut spy = spy_events(); + + let class_hash = snf_utils::declare_model_contract("FooModelMemberAdded"); + world.upgrade_model("dojo", class_hash); + + // parse the event manually because we don't know the value of + // the 'address' field of the emitted event to assert a full event. + let events = spy.get_events().emitted_by(world.contract_address); + + assert(events.events.len() == 1, 'There should be one event'); + + let (_, event) = events.events.at(0); + + assert(event.keys.at(0) == @selector!("ModelUpgraded"), 'Wrong event name'); + assert(event.keys.at(1) == @Model::::selector(DOJO_NSH), 'Wrong selector'); + assert(event.data.at(0) == @class_hash.into(), 'Wrong class hash'); +} + +#[test] +#[should_panic(expected: "Invalid new layout to upgrade the resource `dojo-FooModelBadLayoutType`")] +fn test_upgrade_model_with_bad_layout_type() { + let world = deploy_world_for_model_upgrades(); + world.upgrade_model("dojo", snf_utils::declare_model_contract("FooModelBadLayoutType")); +} + +#[test] +#[should_panic(expected: "Invalid new schema to upgrade the resource `dojo-FooModelMemberRemoved`")] +fn test_upgrade_model_with_member_removed() { + let world = deploy_world_for_model_upgrades(); + world.upgrade_model("dojo", snf_utils::declare_model_contract("FooModelMemberRemoved")); +} + +#[test] +#[should_panic( + expected: "Invalid new schema to upgrade the resource `dojo-FooModelMemberAddedButRemoved`" +)] +fn test_upgrade_model_with_member_added_but_removed() { + let world = deploy_world_for_model_upgrades(); + world.upgrade_model("dojo", snf_utils::declare_model_contract("FooModelMemberAddedButRemoved")); +} + +#[test] +#[should_panic( + expected: "Invalid new schema to upgrade the resource `dojo-FooModelMemberAddedButMoved`" +)] +fn test_upgrade_model_with_member_moved() { + let world = deploy_world_for_model_upgrades(); + world.upgrade_model("dojo", snf_utils::declare_model_contract("FooModelMemberAddedButMoved")); +} + +#[test] +#[should_panic( + expected: "Account `659918` does NOT have OWNER role on model (or its namespace) `FooModelMemberAdded`" +)] +fn test_upgrade_model_from_model_writer() { + let alice = starknet::contract_address_const::<0xa11ce>(); + + let world = deploy_world_for_model_upgrades(); + + world.grant_writer(Model::::selector(DOJO_NSH), alice); + + snf_utils::set_account_address(alice); + snf_utils::set_caller_address(alice); + world.upgrade_model("dojo", snf_utils::declare_model_contract("FooModelMemberAdded")); +} + +#[test] +#[should_panic(expected: "Resource `dojo-Foo` is already registered")] +fn test_upgrade_model_from_random_account() { + let bob = starknet::contract_address_const::<0xb0b>(); + let alice = starknet::contract_address_const::<0xa11ce>(); + + let world = deploy_world(); + let world = world.dispatcher; + + world.grant_owner(DOJO_NSH, bob); + world.grant_owner(DOJO_NSH, alice); + + snf_utils::set_account_address(bob); + snf_utils::set_caller_address(bob); + world.register_model("dojo", snf_utils::declare_model_contract("Foo")); + + snf_utils::set_account_address(alice); + snf_utils::set_caller_address(alice); + world.register_model("dojo", snf_utils::declare_model_contract("Foo")); +} + +#[test] +#[should_panic(expected: "Namespace `another_namespace` is not registered")] +fn test_register_model_with_unregistered_namespace() { + let world = deploy_world(); + let world = world.dispatcher; + + world.register_model("another_namespace", snf_utils::declare_model_contract("Foo")); +} + +// It's ENTRYPOINT_NOT_FOUND for now as in this example the contract is not a dojo contract +// and it's not the account that is calling the register_model function. +#[test] +#[should_panic(expected: ('ENTRYPOINT_NOT_FOUND', 'ENTRYPOINT_FAILED'))] +fn test_register_model_through_malicious_contract() { + let bob = starknet::contract_address_const::<0xb0b>(); + let malicious_contract = snf_utils::declare_and_deploy("malicious_contract"); + + let world = deploy_world(); + let world = world.dispatcher; + + world.grant_owner(DOJO_NSH, bob); + + snf_utils::set_account_address(bob); + snf_utils::set_caller_address(malicious_contract); + world.register_model("dojo", snf_utils::declare_model_contract("Foo")); +} diff --git a/crates/dojo/core-cairo-test/src/tests/world/namespace.cairo b/crates/dojo/core-foundry-test/src/tests/world/namespace.cairo similarity index 50% rename from crates/dojo/core-cairo-test/src/tests/world/namespace.cairo rename to crates/dojo/core-foundry-test/src/tests/world/namespace.cairo index 12883604fa..136fcc6255 100644 --- a/crates/dojo/core-cairo-test/src/tests/world/namespace.cairo +++ b/crates/dojo/core-foundry-test/src/tests/world/namespace.cairo @@ -1,7 +1,10 @@ use dojo::world::{world, IWorldDispatcherTrait}; use dojo::utils::bytearray_hash; -use crate::tests::helpers::{drop_all_events, deploy_world}; +use crate::tests::helpers::deploy_world; +use crate::snf_utils; + +use snforge_std::{spy_events, EventSpyAssertionsTrait}; #[test] fn test_register_namespace() { @@ -9,10 +12,10 @@ fn test_register_namespace() { let world = world.dispatcher; let bob = starknet::contract_address_const::<0xb0b>(); - starknet::testing::set_account_contract_address(bob); - starknet::testing::set_contract_address(bob); + snf_utils::set_account_address(bob); + snf_utils::set_caller_address(bob); - drop_all_events(world.contract_address); + let mut spy = spy_events(); let namespace = "namespace"; let hash = bytearray_hash(@namespace); @@ -21,44 +24,48 @@ fn test_register_namespace() { assert(world.is_owner(hash, bob), 'namespace not registered'); - match starknet::testing::pop_log::(world.contract_address).unwrap() { - world::Event::NamespaceRegistered(event) => { - assert(event.namespace == namespace, 'bad namespace'); - assert(event.hash == hash, 'bad hash'); - }, - _ => panic!("no NamespaceRegistered event"), - } + spy + .assert_emitted( + @array![ + ( + world.contract_address, + world::Event::NamespaceRegistered( + world::NamespaceRegistered { namespace, hash } + ) + ) + ] + ); } #[test] -#[should_panic(expected: ("Namespace `namespace` is already registered", 'ENTRYPOINT_FAILED',))] +#[should_panic(expected: "Namespace `namespace` is already registered")] fn test_register_namespace_already_registered_same_caller() { let world = deploy_world(); let world = world.dispatcher; let bob = starknet::contract_address_const::<0xb0b>(); - starknet::testing::set_account_contract_address(bob); - starknet::testing::set_contract_address(bob); + snf_utils::set_account_address(bob); + snf_utils::set_caller_address(bob); world.register_namespace("namespace"); world.register_namespace("namespace"); } #[test] -#[should_panic(expected: ("Namespace `namespace` is already registered", 'ENTRYPOINT_FAILED',))] +#[should_panic(expected: "Namespace `namespace` is already registered")] fn test_register_namespace_already_registered_other_caller() { let world = deploy_world(); let world = world.dispatcher; let bob = starknet::contract_address_const::<0xb0b>(); - starknet::testing::set_account_contract_address(bob); - starknet::testing::set_contract_address(bob); + snf_utils::set_account_address(bob); + snf_utils::set_caller_address(bob); world.register_namespace("namespace"); let alice = starknet::contract_address_const::<0xa11ce>(); - starknet::testing::set_account_contract_address(alice); - starknet::testing::set_contract_address(alice); + snf_utils::set_account_address(alice); + snf_utils::set_caller_address(alice); world.register_namespace("namespace"); } @@ -66,12 +73,7 @@ fn test_register_namespace_already_registered_other_caller() { #[test] #[available_gas(6000000)] -#[should_panic( - expected: ( - "Namespace `` is invalid according to Dojo naming rules: ^[a-zA-Z0-9_]+$", - 'ENTRYPOINT_FAILED', - ) -)] +#[should_panic(expected: "Namespace `` is invalid according to Dojo naming rules: ^[a-zA-Z0-9_]+$")] fn test_register_namespace_empty_name() { let world = deploy_world(); let world = world.dispatcher; diff --git a/crates/dojo/core-cairo-test/src/tests/world/storage.cairo b/crates/dojo/core-foundry-test/src/tests/world/storage.cairo similarity index 100% rename from crates/dojo/core-cairo-test/src/tests/world/storage.cairo rename to crates/dojo/core-foundry-test/src/tests/world/storage.cairo diff --git a/crates/dojo/core-cairo-test/src/tests/world/world.cairo b/crates/dojo/core-foundry-test/src/tests/world/world.cairo similarity index 67% rename from crates/dojo/core-cairo-test/src/tests/world/world.cairo rename to crates/dojo/core-foundry-test/src/tests/world/world.cairo index 47b6818a50..a692fc74d5 100644 --- a/crates/dojo/core-cairo-test/src/tests/world/world.cairo +++ b/crates/dojo/core-foundry-test/src/tests/world/world.cairo @@ -1,51 +1,57 @@ use dojo::world::Resource; -use dojo::world::world::Event as WorldEvent; use dojo::utils::bytearray_hash; use dojo::world::{ - IWorldDispatcher, IWorldDispatcherTrait, IUpgradeableWorldDispatcher, + world, IWorldDispatcher, IWorldDispatcherTrait, IUpgradeableWorldDispatcher, IUpgradeableWorldDispatcherTrait, WorldStorageTrait }; use dojo::model::ModelStorage; use dojo::event::{Event, EventStorage}; use crate::tests::helpers::{ - IbarDispatcherTrait, drop_all_events, deploy_world_and_bar, Foo, m_Foo, test_contract, - test_contract_with_dojo_init_args, SimpleEvent, e_SimpleEvent, deploy_world + IbarDispatcherTrait, deploy_world_and_bar, Foo, SimpleEvent, deploy_world }; use crate::{spawn_test_world, ContractDefTrait, NamespaceDef, TestResource, WorldStorageTestTrait}; +use crate::snf_utils; + +use snforge_std::{spy_events, EventSpyAssertionsTrait}; + #[test] #[available_gas(20000000)] fn test_model() { let world = deploy_world(); let world = world.dispatcher; - world.register_model("dojo", m_Foo::TEST_CLASS_HASH.try_into().unwrap()); + world.register_model("dojo", snf_utils::declare_model_contract("Foo")); } #[test] fn test_system() { + let caller = snforge_std::test_address(); + let (world, bar_contract) = deploy_world_and_bar(); bar_contract.set_foo(1337, 1337); - let stored: Foo = world.read_model(starknet::get_caller_address()); + let stored: Foo = world.read_model(caller); assert(stored.a == 1337, 'data not stored'); assert(stored.b == 1337, 'data not stored'); } #[test] fn test_delete() { + let caller = snforge_std::test_address(); + let (world, bar_contract) = deploy_world_and_bar(); bar_contract.set_foo(1337, 1337); - let stored: Foo = world.read_model(starknet::get_caller_address()); + let stored: Foo = world.read_model(caller); assert(stored.a == 1337, 'data not stored'); assert(stored.b == 1337, 'data not stored'); bar_contract.delete_foo(); - let deleted: Foo = world.read_model(starknet::get_caller_address()); + let deleted: Foo = world.read_model(caller); assert(deleted.a == 0, 'data not deleted'); assert(deleted.b == 0, 'data not deleted'); } @@ -57,7 +63,7 @@ fn test_contract_getter() { let world = world.dispatcher; let address = world - .register_contract('salt1', "dojo", test_contract::TEST_CLASS_HASH.try_into().unwrap()); + .register_contract('salt1', "dojo", snf_utils::declare_contract("test_contract")); if let Resource::Contract((contract_address, namespace_hash)) = world .resource(selector_from_tag!("dojo-test_contract")) { @@ -73,7 +79,7 @@ fn test_emit() { let bob = starknet::contract_address_const::<0xb0b>(); let namespace_def = NamespaceDef { - namespace: "dojo", resources: [TestResource::Event(e_SimpleEvent::TEST_CLASS_HASH),].span(), + namespace: "dojo", resources: [TestResource::Event("SimpleEvent"),].span(), }; let mut world = spawn_test_world([namespace_def].span()); @@ -82,43 +88,46 @@ fn test_emit() { .with_writer_of([world.resource_selector(@"SimpleEvent")].span()); world.sync_perms_and_inits([bob_def].span()); - drop_all_events(world.dispatcher.contract_address); + let mut spy = spy_events(); - starknet::testing::set_contract_address(bob); + snf_utils::set_caller_address(bob); let simple_event = SimpleEvent { id: 2, data: (3, 4) }; world.emit_event(@simple_event); - let event = starknet::testing::pop_log::(world.dispatcher.contract_address); - - assert(event.is_some(), 'no event'); - - if let WorldEvent::EventEmitted(event) = event.unwrap() { - assert( - event.selector == Event::::selector(world.namespace_hash), - 'bad event selector' + spy + .assert_emitted( + @array![ + ( + world.dispatcher.contract_address, + world::Event::EventEmitted( + world::EventEmitted { + selector: Event::::selector(world.namespace_hash), + system_address: bob, + keys: [ + 2 + ].span(), values: [ + 3, 4 + ].span() + } + ) + ) + ] ); - assert(event.system_address == bob, 'bad system address'); - assert(event.keys == [2].span(), 'bad keys'); - assert(event.values == [3, 4].span(), 'bad values'); - } else { - core::panic_with_felt252('no EventEmitted event'); - } } #[test] fn test_execute_multiple_worlds() { + let caller = snforge_std::test_address(); + let (world1, bar1_contract) = deploy_world_and_bar(); let (world2, bar2_contract) = deploy_world_and_bar(); - let alice = starknet::contract_address_const::<0x1337>(); - starknet::testing::set_contract_address(alice); - bar1_contract.set_foo(1337, 1337); bar2_contract.set_foo(7331, 7331); - let data1: Foo = world1.read_model(alice); - let data2: Foo = world2.read_model(alice); + let data1: Foo = world1.read_model(caller); + let data2: Foo = world2.read_model(caller); assert(data1.a == 1337, 'data1 not stored'); assert(data2.a == 7331, 'data2 not stored'); @@ -150,13 +159,17 @@ mod worldupgrade { #[test] #[available_gas(60000000)] fn test_upgradeable_world() { + let caller = snf_utils::declare_and_deploy("dojo_caller_contract"); + snf_utils::set_account_address(caller); + snf_utils::set_caller_address(caller); + let world = deploy_world(); let world = world.dispatcher; let mut upgradeable_world_dispatcher = IUpgradeableWorldDispatcher { contract_address: world.contract_address }; - upgradeable_world_dispatcher.upgrade(worldupgrade::TEST_CLASS_HASH.try_into().unwrap()); + upgradeable_world_dispatcher.upgrade(snf_utils::declare_contract("worldupgrade")); let res = (IWorldUpgradeDispatcher { contract_address: world.contract_address }).hello(); @@ -165,14 +178,14 @@ fn test_upgradeable_world() { #[test] #[available_gas(60000000)] -#[should_panic(expected: ('invalid class_hash', 'ENTRYPOINT_FAILED'))] +#[should_panic(expected: 'invalid class_hash')] fn test_upgradeable_world_with_class_hash_zero() { let world = deploy_world(); let world = world.dispatcher; let admin = starknet::contract_address_const::<0x1337>(); - starknet::testing::set_account_contract_address(admin); - starknet::testing::set_contract_address(admin); + snf_utils::set_account_address(admin); + snf_utils::set_caller_address(admin); let mut upgradeable_world_dispatcher = IUpgradeableWorldDispatcher { contract_address: world.contract_address @@ -182,17 +195,15 @@ fn test_upgradeable_world_with_class_hash_zero() { #[test] #[available_gas(60000000)] -#[should_panic( - expected: ("Caller `4919` cannot upgrade the resource `0` (not owner)", 'ENTRYPOINT_FAILED') -)] +#[should_panic(expected: "Caller `4919` cannot upgrade the resource `0` (not owner)")] fn test_upgradeable_world_from_non_owner() { // Deploy world contract let world = deploy_world(); let world = world.dispatcher; let not_owner = starknet::contract_address_const::<0x1337>(); - starknet::testing::set_contract_address(not_owner); - starknet::testing::set_account_contract_address(not_owner); + snf_utils::set_caller_address(not_owner); + snf_utils::set_account_address(not_owner); let mut upgradeable_world_dispatcher = IUpgradeableWorldDispatcher { contract_address: world.contract_address @@ -207,7 +218,7 @@ fn test_constructor_default() { let world = world.dispatcher; let _address = world - .register_contract('salt1', "dojo", test_contract::TEST_CLASS_HASH.try_into().unwrap()); + .register_contract('salt1', "dojo", snf_utils::declare_contract("test_contract")); } #[test] @@ -216,10 +227,12 @@ fn test_can_call_init_only_world() { let world = world.dispatcher; let address = world - .register_contract('salt1', "dojo", test_contract::TEST_CLASS_HASH.try_into().unwrap()); + .register_contract('salt1', "dojo", snf_utils::declare_contract("test_contract")); let expected_panic: ByteArray = - "Only the world can init contract `test_contract`, but caller is `0`"; + "Only the world can init contract `test_contract`, but caller is `2827`"; + + snf_utils::set_caller_address(starknet::contract_address_const::<2827>()); match starknet::syscalls::call_contract_syscall( address, dojo::world::world::DOJO_INIT_SELECTOR, [].span() @@ -229,8 +242,6 @@ fn test_can_call_init_only_world() { let mut s = e.span(); // Remove the out of range error. s.pop_front().unwrap(); - // Remove the ENTRYPOINT_FAILED suffix. - s.pop_back().unwrap(); let e_str: ByteArray = Serde::deserialize(ref s).expect('failed deser'); println!("e_str: {}", e_str); @@ -241,16 +252,16 @@ fn test_can_call_init_only_world() { #[test] #[available_gas(6000000)] -#[should_panic(expected: ('CONTRACT_NOT_DEPLOYED', 'ENTRYPOINT_FAILED'))] +#[should_panic(expected: ('ENTRYPOINT_NOT_FOUND', 'ENTRYPOINT_FAILED'))] fn test_can_call_init_only_owner() { let world = deploy_world(); let world = world.dispatcher; let _address = world - .register_contract('salt1', "dojo", test_contract::TEST_CLASS_HASH.try_into().unwrap()); + .register_contract('salt1', "dojo", snf_utils::declare_contract("test_contract")); - let bob = starknet::contract_address_const::<0x1337>(); - starknet::testing::set_contract_address(bob); + let caller_contract = snf_utils::declare_and_deploy("non_dojo_caller_contract"); + snf_utils::set_caller_address(caller_contract); world.init_contract(selector_from_tag!("dojo-test_contract"), [].span()); } @@ -262,7 +273,7 @@ fn test_can_call_init_default() { let world = world.dispatcher; let _address = world - .register_contract('salt1', "dojo", test_contract::TEST_CLASS_HASH.try_into().unwrap()); + .register_contract('salt1', "dojo", snf_utils::declare_contract("test_contract")); world.init_contract(selector_from_tag!("dojo-test_contract"), [].span()); } @@ -275,7 +286,7 @@ fn test_can_call_init_args() { let _address = world .register_contract( - 'salt1', "dojo", test_contract_with_dojo_init_args::TEST_CLASS_HASH.try_into().unwrap() + 'salt1', "dojo", snf_utils::declare_contract("test_contract_with_dojo_init_args") ); world.init_contract(selector_from_tag!("dojo-test_contract_with_dojo_init_args"), [1].span()); @@ -288,11 +299,14 @@ fn test_can_call_init_only_world_args() { let address = world .register_contract( - 'salt1', "dojo", test_contract_with_dojo_init_args::TEST_CLASS_HASH.try_into().unwrap() + 'salt1', "dojo", snf_utils::declare_contract("test_contract_with_dojo_init_args") ); - let expected_panic: ByteArray = - "Only the world can init contract `test_contract_with_dojo_init_args`, but caller is `0`"; + let expected_panic: ByteArray = format!( + "Only the world can init contract `test_contract_with_dojo_init_args`, but caller is `2827`", + ); + + snf_utils::set_caller_address(starknet::contract_address_const::<2827>()); match starknet::syscalls::call_contract_syscall( address, dojo::world::world::DOJO_INIT_SELECTOR, [123].span() @@ -303,7 +317,7 @@ fn test_can_call_init_only_world_args() { // Remove the out of range error. s.pop_front().unwrap(); // Remove the ENTRYPOINT_FAILED suffix. - s.pop_back().unwrap(); + //s.pop_back().unwrap(); let e_str: ByteArray = Serde::deserialize(ref s).expect('failed deser'); diff --git a/crates/dojo/core-cairo-test/src/utils.cairo b/crates/dojo/core-foundry-test/src/utils.cairo similarity index 99% rename from crates/dojo/core-cairo-test/src/utils.cairo rename to crates/dojo/core-foundry-test/src/utils.cairo index 051be84e2a..71c89c1826 100644 --- a/crates/dojo/core-cairo-test/src/utils.cairo +++ b/crates/dojo/core-foundry-test/src/utils.cairo @@ -55,3 +55,4 @@ pub fn assert_array(value: Span, expected: Span) { i += 1; } } + diff --git a/crates/dojo/core-cairo-test/src/world.cairo b/crates/dojo/core-foundry-test/src/world.cairo similarity index 70% rename from crates/dojo/core-cairo-test/src/world.cairo rename to crates/dojo/core-foundry-test/src/world.cairo index 8e3910fc21..b38a9b08a9 100644 --- a/crates/dojo/core-cairo-test/src/world.cairo +++ b/crates/dojo/core-foundry-test/src/world.cairo @@ -1,25 +1,15 @@ use core::option::OptionTrait; -use core::result::ResultTrait; -use core::traits::{Into, TryInto}; -use starknet::{ContractAddress, syscalls::deploy_syscall}; +use crate::snf_utils; +use starknet::ContractAddress; -use dojo::world::{world, IWorldDispatcher, IWorldDispatcherTrait, WorldStorageTrait, WorldStorage}; +use dojo::world::{IWorldDispatcher, IWorldDispatcherTrait, WorldStorageTrait, WorldStorage}; -pub type TestClassHash = felt252; - -/// In Cairo test runner, all the classes are expected to be declared already. -/// If a contract belong to an other crate, it must be added to the `build-external-contract`, -/// event for testing, since Scarb does not do that automatically anymore. -/// -/// The [`TestResource`] enum uses a felt252 to represent the class hash, this avoids -/// having to write `bar::TEST_CLASS_HASH.try_into().unwrap()` in the test file, simply use -/// `bar::TEST_CLASS_HASH`. #[derive(Drop)] pub enum TestResource { - Event: TestClassHash, - Model: TestClassHash, - Contract: TestClassHash, + Event: ByteArray, + Model: ByteArray, + Contract: ByteArray, } #[derive(Drop, Copy)] @@ -95,36 +85,6 @@ pub impl ContractDefImpl of ContractDefTrait { } } -/// Deploy classhash with calldata for constructor -/// -/// # Arguments -/// -/// * `class_hash` - Class to deploy -/// * `calldata` - calldata for constructor -/// -/// # Returns -/// * address of contract deployed -pub fn deploy_contract(class_hash: felt252, calldata: Span) -> ContractAddress { - let (contract, _) = starknet::syscalls::deploy_syscall( - class_hash.try_into().unwrap(), 0, calldata, false - ) - .unwrap(); - contract -} - -/// Deploy classhash and passes in world address to constructor -/// -/// # Arguments -/// -/// * `class_hash` - Class to deploy -/// * `world` - World dispatcher to pass as world address -/// -/// # Returns -/// * address of contract deployed -pub fn deploy_with_world_address(class_hash: felt252, world: IWorldDispatcher) -> ContractAddress { - deploy_contract(class_hash, [world.contract_address.into()].span()) -} - /// Spawns a test world registering provided resources into namespaces. /// /// This function only deploys the world and registers the resources, it does not initialize the @@ -139,15 +99,8 @@ pub fn deploy_with_world_address(class_hash: felt252, world: IWorldDispatcher) - /// /// * World dispatcher pub fn spawn_test_world(namespaces_defs: Span) -> WorldStorage { - let salt = core::testing::get_available_gas(); - - let (world_address, _) = deploy_syscall( - world::TEST_CLASS_HASH.try_into().unwrap(), - salt.into(), - [world::TEST_CLASS_HASH].span(), - false - ) - .unwrap(); + let (world_contract, class_hash) = snf_utils::declare("world"); + let world_address = snf_utils::deploy(world_contract, @array![class_hash.into()]); let world = IWorldDispatcher { contract_address: world_address }; @@ -165,14 +118,18 @@ pub fn spawn_test_world(namespaces_defs: Span) -> WorldStorage { .resources .clone() { match r { - TestResource::Event(ch) => { - world.register_event(namespace.clone(), (*ch).try_into().unwrap()); + TestResource::Event(name) => { + let ch = snf_utils::declare_event_contract(name.clone()); + world.register_event(namespace.clone(), ch); }, - TestResource::Model(ch) => { - world.register_model(namespace.clone(), (*ch).try_into().unwrap()); + TestResource::Model(name) => { + let ch = snf_utils::declare_model_contract(name.clone()); + world.register_model(namespace.clone(), ch); }, - TestResource::Contract(ch) => { - world.register_contract(*ch, namespace.clone(), (*ch).try_into().unwrap()); + TestResource::Contract(name) => { + let (_, ch) = snf_utils::declare(name.clone()); + let salt = dojo::utils::bytearray_hash(name); + world.register_contract(salt, namespace.clone(), ch); } } } diff --git a/crates/dojo/core/.snfoundry_cache/.prev_tests_failed b/crates/dojo/core/.snfoundry_cache/.prev_tests_failed new file mode 100644 index 0000000000..e69de29bb2 diff --git a/crates/dojo/core/Scarb.lock b/crates/dojo/core/Scarb.lock index 3c9d0fa727..f0c9911fa0 100644 --- a/crates/dojo/core/Scarb.lock +++ b/crates/dojo/core/Scarb.lock @@ -5,9 +5,25 @@ version = 1 name = "dojo" version = "1.0.5" dependencies = [ - "dojo_plugin", + "dojo_macros", + "snforge_std", ] [[package]] -name = "dojo_plugin" -version = "2.8.4" +name = "dojo_macros" +version = "0.1.0" + +[[package]] +name = "snforge_scarb_plugin" +version = "0.33.0" +source = "registry+https://scarbs.xyz/" +checksum = "sha256:b4dd6088372decd367652827091e0589bbf6bc550dfc3957baa3e9c61d6eb449" + +[[package]] +name = "snforge_std" +version = "0.33.0" +source = "registry+https://scarbs.xyz/" +checksum = "sha256:f7dc3349f8a6ef4915c93df447a00bd5a53a31129fd0990a00afa0ad31d91b06" +dependencies = [ + "snforge_scarb_plugin", +] diff --git a/crates/dojo/core/Scarb.toml b/crates/dojo/core/Scarb.toml index 5fe09416d2..488008443b 100644 --- a/crates/dojo/core/Scarb.toml +++ b/crates/dojo/core/Scarb.toml @@ -7,11 +7,10 @@ version = "1.0.5" [dependencies] starknet = "=2.8.4" -dojo_plugin = { path = "../lang" } -#dojo_macros = { path = "../macros" } +dojo_macros = { path = "../macros" } [dev-dependencies] -cairo_test = "=2.8.4" +snforge_std = "0.33.0" [lib] diff --git a/crates/dojo/core/src/utils/snf_test.cairo b/crates/dojo/core/src/utils/snf_test.cairo deleted file mode 100644 index 520e491c2e..0000000000 --- a/crates/dojo/core/src/utils/snf_test.cairo +++ /dev/null @@ -1,109 +0,0 @@ -use starknet::{ClassHash, ContractAddress}; -use snforge_std::{declare, ContractClassTrait, DeclareResultTrait}; -use dojo::world::{IWorldDispatcher, IWorldDispatcherTrait, Resource}; -use core::panics::panic_with_byte_array; - -#[derive(Drop)] -pub enum TestResource { - Event: ByteArray, - Model: ByteArray, - Contract: ByteArray, -} - -#[derive(Drop)] -pub struct NamespaceDef { - pub namespace: ByteArray, - pub resources: Span, -} - -/// Spawns a test world registering namespaces and resources. -/// -/// # Arguments -/// -/// * `namespaces` - Namespaces to register. -/// * `resources` - Resources to register. -/// -/// # Returns -/// -/// * World dispatcher -pub fn spawn_test_world(namespaces_defs: Span) -> IWorldDispatcher { - let world_contract = declare("world").unwrap().contract_class(); - let class_hash_felt: felt252 = (*world_contract.class_hash).into(); - let (world_address, _) = world_contract.deploy(@array![class_hash_felt]).unwrap(); - - let world = IWorldDispatcher { contract_address: world_address }; - - for ns in namespaces_defs { - let namespace = ns.namespace.clone(); - world.register_namespace(namespace.clone()); - - for r in ns - .resources - .clone() { - match r { - TestResource::Event(name) => { - let ch: ClassHash = *declare(name.clone()) - .unwrap() - .contract_class() - .class_hash; - world.register_event(namespace.clone(), ch); - }, - TestResource::Model(name) => { - let ch: ClassHash = *declare(name.clone()) - .unwrap() - .contract_class() - .class_hash; - world.register_model(namespace.clone(), ch); - }, - TestResource::Contract(name) => { - let ch: ClassHash = *declare(name.clone()) - .unwrap() - .contract_class() - .class_hash; - let salt = dojo::utils::bytearray_hash(name); - world.register_contract(salt, namespace.clone(), ch); - }, - } - } - }; - - world -} - -/// Extension trait for world dispatcher to test resources. -pub trait WorldTestExt { - fn resource_contract_address( - self: IWorldDispatcher, namespace: ByteArray, name: ByteArray - ) -> ContractAddress; - fn resource_class_hash( - self: IWorldDispatcher, namespace: ByteArray, name: ByteArray - ) -> ClassHash; -} - -impl WorldTestExtImpl of WorldTestExt { - fn resource_contract_address( - self: IWorldDispatcher, namespace: ByteArray, name: ByteArray - ) -> ContractAddress { - match self.resource(dojo::utils::selector_from_names(@namespace, @name)) { - Resource::Contract((ca, _)) => ca, - Resource::Event((ca, _)) => ca, - Resource::Model((ca, _)) => ca, - _ => panic_with_byte_array( - @format!("Resource is not registered: {}-{}", namespace, name) - ) - } - } - - fn resource_class_hash( - self: IWorldDispatcher, namespace: ByteArray, name: ByteArray - ) -> ClassHash { - match self.resource(dojo::utils::selector_from_names(@namespace, @name)) { - Resource::Contract((_, ch)) => ch.try_into().unwrap(), - Resource::Event((_, ch)) => ch.try_into().unwrap(), - Resource::Model((_, ch)) => ch.try_into().unwrap(), - _ => panic_with_byte_array( - @format!("Resource is not registered: {}-{}", namespace, name) - ), - } - } -} diff --git a/crates/dojo/lang/Cargo.toml b/crates/dojo/lang/Cargo.toml deleted file mode 100644 index 07647d5dc6..0000000000 --- a/crates/dojo/lang/Cargo.toml +++ /dev/null @@ -1,30 +0,0 @@ -[package] -description = "Cairo compiler plugin for Dojo." -edition.workspace = true -license-file.workspace = true -name = "dojo-lang" -repository.workspace = true -version.workspace = true - -[features] -testing = [ ] - -[dependencies] -anyhow.workspace = true -cairo-lang-defs.workspace = true -cairo-lang-diagnostics.workspace = true -cairo-lang-filesystem.workspace = true -cairo-lang-plugins.workspace = true -cairo-lang-semantic.workspace = true -cairo-lang-syntax.workspace = true -cairo-lang-utils.workspace = true -dojo-types.workspace = true -itertools.workspace = true -serde.workspace = true -smol_str.workspace = true -starknet.workspace = true -starknet-crypto.workspace = true -tracing.workspace = true - -[dev-dependencies] -cairo-lang-semantic.workspace = true diff --git a/crates/dojo/lang/README.md b/crates/dojo/lang/README.md deleted file mode 100644 index 6c2608868d..0000000000 --- a/crates/dojo/lang/README.md +++ /dev/null @@ -1,11 +0,0 @@ -# Cairo compiler plugin for Dojo - -Cairo compiler plugin to compile Dojo specific macros. - -## Testing - -To regenerate the test data, set `CAIRO_FIX_TESTS=1`: - -``` -CAIRO_FIX_TESTS=1 cargo test -p dojo-compiler -``` diff --git a/crates/dojo/lang/Scarb.toml b/crates/dojo/lang/Scarb.toml deleted file mode 100644 index 6371a4614c..0000000000 --- a/crates/dojo/lang/Scarb.toml +++ /dev/null @@ -1,6 +0,0 @@ -[package] -name = "dojo_plugin" -version = "2.8.4" - -[cairo-plugin] -builtin = true diff --git a/crates/dojo/lang/src/attribute_macros/contract.rs b/crates/dojo/lang/src/attribute_macros/contract.rs deleted file mode 100644 index 2f9c94c9b7..0000000000 --- a/crates/dojo/lang/src/attribute_macros/contract.rs +++ /dev/null @@ -1,373 +0,0 @@ -use cairo_lang_defs::patcher::{PatchBuilder, RewriteNode}; -use cairo_lang_defs::plugin::{ - DynGeneratedFileAuxData, MacroPluginMetadata, PluginDiagnostic, PluginGeneratedFile, - PluginResult, -}; -use cairo_lang_diagnostics::Severity; -use cairo_lang_plugins::plugins::HasItemsInCfgEx; -use cairo_lang_syntax::node::ast::{MaybeModuleBody, OptionReturnTypeClause}; -use cairo_lang_syntax::node::db::SyntaxGroup; -use cairo_lang_syntax::node::{ast, Terminal, TypedStablePtr, TypedSyntaxNode}; -use cairo_lang_utils::unordered_hash_map::UnorderedHashMap; -use dojo_types::naming; - -use crate::aux_data::ContractAuxData; - -const CONTRACT_PATCH: &str = include_str!("./patches/contract.patch.cairo"); -const DEFAULT_INIT_PATCH: &str = include_str!("./patches/default_init.patch.cairo"); -const CONSTRUCTOR_FN: &str = "constructor"; -const DOJO_INIT_FN: &str = "dojo_init"; - -#[derive(Debug, Clone, Default)] -pub struct ContractParameters { - pub namespace: Option, -} - -#[derive(Debug)] -pub struct DojoContract { - diagnostics: Vec, - systems: Vec, -} - -impl DojoContract { - pub fn from_module( - db: &dyn SyntaxGroup, - module_ast: &ast::ItemModule, - metadata: &MacroPluginMetadata<'_>, - ) -> PluginResult { - let name = module_ast.name(db).text(db); - - let mut contract = DojoContract { diagnostics: vec![], systems: vec![] }; - - for (id, value) in [("name", &name.to_string())] { - if !naming::is_name_valid(value) { - return PluginResult { - code: None, - diagnostics: vec![PluginDiagnostic { - stable_ptr: module_ast.stable_ptr().0, - message: format!( - "The contract {id} '{value}' can only contain characters (a-z/A-Z), \ - digits (0-9) and underscore (_)." - ), - severity: Severity::Error, - }], - remove_original_item: false, - }; - } - } - - let mut has_event = false; - let mut has_storage = false; - let mut has_init = false; - let mut has_constructor = false; - - if let MaybeModuleBody::Some(body) = module_ast.body(db) { - let mut body_nodes: Vec<_> = body - .iter_items_in_cfg(db, metadata.cfg_set) - .flat_map(|el| { - if let ast::ModuleItem::Enum(ref enum_ast) = el { - if enum_ast.name(db).text(db).to_string() == "Event" { - has_event = true; - return contract.merge_event(db, enum_ast.clone()); - } - } else if let ast::ModuleItem::Struct(ref struct_ast) = el { - if struct_ast.name(db).text(db).to_string() == "Storage" { - has_storage = true; - return contract.merge_storage(db, struct_ast.clone()); - } - } else if let ast::ModuleItem::FreeFunction(ref fn_ast) = el { - let fn_decl = fn_ast.declaration(db); - let fn_name = fn_decl.name(db).text(db); - - if fn_name == CONSTRUCTOR_FN { - has_constructor = true; - return contract.handle_constructor_fn(db, fn_ast); - } - - if fn_name == DOJO_INIT_FN { - has_init = true; - return contract.handle_init_fn(db, fn_ast); - } - } - - vec![RewriteNode::Copied(el.as_syntax_node())] - }) - .collect(); - - if !has_constructor { - let node = RewriteNode::Text( - " - #[constructor] - fn constructor(ref self: ContractState) { - self.world_provider.initializer(); - } - " - .to_string(), - ); - - body_nodes.append(&mut vec![node]); - } - - if !has_init { - let node = RewriteNode::interpolate_patched( - DEFAULT_INIT_PATCH, - &UnorderedHashMap::from([( - "init_name".to_string(), - RewriteNode::Text(DOJO_INIT_FN.to_string()), - )]), - ); - body_nodes.append(&mut vec![node]); - } - - if !has_event { - body_nodes.append(&mut contract.create_event()) - } - - if !has_storage { - body_nodes.append(&mut contract.create_storage()) - } - - let mut builder = PatchBuilder::new(db, module_ast); - builder.add_modified(RewriteNode::Mapped { - node: Box::new(RewriteNode::interpolate_patched( - CONTRACT_PATCH, - &UnorderedHashMap::from([ - ("name".to_string(), RewriteNode::Text(name.to_string())), - ("body".to_string(), RewriteNode::new_modified(body_nodes)), - ]), - )), - origin: module_ast.as_syntax_node().span_without_trivia(db), - }); - - let (code, code_mappings) = builder.build(); - - crate::debug_expand(&format!("CONTRACT PATCH: {name}"), &code); - - return PluginResult { - code: Some(PluginGeneratedFile { - name: name.clone(), - content: code, - aux_data: Some(DynGeneratedFileAuxData::new(ContractAuxData { - name: name.to_string(), - systems: contract.systems.clone(), - })), - code_mappings, - }), - diagnostics: contract.diagnostics, - remove_original_item: true, - }; - } - - PluginResult::default() - } - - /// If a constructor is provided, we should keep the user statements. - /// We only inject the world provider initializer. - fn handle_constructor_fn( - &mut self, - db: &dyn SyntaxGroup, - fn_ast: &ast::FunctionWithBody, - ) -> Vec { - let fn_decl = fn_ast.declaration(db); - - let params_str = self.params_to_str(db, fn_decl.signature(db).parameters(db)); - - let declaration_node = RewriteNode::Mapped { - node: Box::new(RewriteNode::Text(format!( - " - #[constructor] - fn constructor({}) {{ - self.world_provider.initializer(); - ", - params_str - ))), - origin: fn_ast.declaration(db).as_syntax_node().span_without_trivia(db), - }; - - let func_nodes = fn_ast - .body(db) - .statements(db) - .elements(db) - .iter() - .map(|e| RewriteNode::Mapped { - node: Box::new(RewriteNode::from(e.as_syntax_node())), - origin: e.as_syntax_node().span_without_trivia(db), - }) - .collect::>(); - - let mut nodes = vec![declaration_node]; - - nodes.extend(func_nodes); - - // Close the constructor with users statements included. - nodes.push(RewriteNode::Text("}\n".to_string())); - - nodes - } - - fn handle_init_fn( - &mut self, - db: &dyn SyntaxGroup, - fn_ast: &ast::FunctionWithBody, - ) -> Vec { - let fn_decl = fn_ast.declaration(db); - - if let OptionReturnTypeClause::ReturnTypeClause(_) = fn_decl.signature(db).ret_ty(db) { - self.diagnostics.push(PluginDiagnostic { - stable_ptr: fn_ast.stable_ptr().untyped(), - message: format!("The {} function cannot have a return type.", DOJO_INIT_FN) - .to_string(), - severity: Severity::Error, - }); - } - - let params: Vec = fn_decl - .signature(db) - .parameters(db) - .elements(db) - .iter() - .map(|p| p.as_syntax_node().get_text(db)) - .collect::>(); - - let params_str = params.join(", "); - - // Since the dojo init is meant to be called by the world, we don't need an - // interface to be generated (which adds a considerable amount of code). - let impl_node = RewriteNode::Text( - " - #[abi(per_item)] - #[generate_trait] - pub impl IDojoInitImpl of IDojoInit { - #[external(v0)] - " - .to_string(), - ); - - let declaration_node = RewriteNode::Mapped { - node: Box::new(RewriteNode::Text(format!("fn {}({}) {{", DOJO_INIT_FN, params_str))), - origin: fn_ast.declaration(db).as_syntax_node().span_without_trivia(db), - }; - - // Asserts the caller is the world, and close the init function. - let assert_world_caller_node = RewriteNode::Text( - "if starknet::get_caller_address() != \ - self.world_provider.world_dispatcher().contract_address { \ - core::panics::panic_with_byte_array(@format!(\"Only the world can init contract \ - `{}`, but caller is `{:?}`\", self.dojo_name(), starknet::get_caller_address())); }" - .to_string(), - ); - - let func_nodes = fn_ast - .body(db) - .statements(db) - .elements(db) - .iter() - .map(|e| RewriteNode::Mapped { - node: Box::new(RewriteNode::from(e.as_syntax_node())), - origin: e.as_syntax_node().span_without_trivia(db), - }) - .collect::>(); - - let mut nodes = vec![impl_node, declaration_node, assert_world_caller_node]; - nodes.extend(func_nodes); - // Close the init function + close the impl block. - nodes.push(RewriteNode::Text("}\n}".to_string())); - - nodes - } - - pub fn merge_event( - &mut self, - db: &dyn SyntaxGroup, - enum_ast: ast::ItemEnum, - ) -> Vec { - let mut rewrite_nodes = vec![]; - - let elements = enum_ast.variants(db).elements(db); - - let variants = elements.iter().map(|e| e.as_syntax_node().get_text(db)).collect::>(); - let variants = variants.join(",\n"); - - rewrite_nodes.push(RewriteNode::interpolate_patched( - " - #[event] - #[derive(Drop, starknet::Event)] - enum Event { - UpgradeableEvent: upgradeable_cpt::Event, - WorldProviderEvent: world_provider_cpt::Event, - $variants$ - } - ", - &UnorderedHashMap::from([("variants".to_string(), RewriteNode::Text(variants))]), - )); - rewrite_nodes - } - - pub fn create_event(&mut self) -> Vec { - vec![RewriteNode::Text( - " - #[event] - #[derive(Drop, starknet::Event)] - enum Event { - UpgradeableEvent: upgradeable_cpt::Event, - WorldProviderEvent: world_provider_cpt::Event, - } - " - .to_string(), - )] - } - - pub fn merge_storage( - &mut self, - db: &dyn SyntaxGroup, - struct_ast: ast::ItemStruct, - ) -> Vec { - let mut rewrite_nodes = vec![]; - - let elements = struct_ast.members(db).elements(db); - - let members = elements.iter().map(|e| e.as_syntax_node().get_text(db)).collect::>(); - let members = members.join(",\n"); - - rewrite_nodes.push(RewriteNode::interpolate_patched( - " - #[storage] - struct Storage { - #[substorage(v0)] - upgradeable: upgradeable_cpt::Storage, - #[substorage(v0)] - world_provider: world_provider_cpt::Storage, - $members$ - } - ", - &UnorderedHashMap::from([("members".to_string(), RewriteNode::Text(members))]), - )); - rewrite_nodes - } - - pub fn create_storage(&mut self) -> Vec { - vec![RewriteNode::Text( - " - #[storage] - struct Storage { - #[substorage(v0)] - upgradeable: upgradeable_cpt::Storage, - #[substorage(v0)] - world_provider: world_provider_cpt::Storage, - } - " - .to_string(), - )] - } - - /// Converts parameter list to it's string representation. - pub fn params_to_str(&mut self, db: &dyn SyntaxGroup, param_list: ast::ParamList) -> String { - let params = param_list - .elements(db) - .iter() - .map(|param| param.as_syntax_node().get_text(db)) - .collect::>(); - - params.join(", ") - } -} diff --git a/crates/dojo/lang/src/attribute_macros/element.rs b/crates/dojo/lang/src/attribute_macros/element.rs deleted file mode 100644 index 684208157e..0000000000 --- a/crates/dojo/lang/src/attribute_macros/element.rs +++ /dev/null @@ -1,124 +0,0 @@ -use cairo_lang_defs::patcher::RewriteNode; -use cairo_lang_defs::plugin::PluginDiagnostic; -use cairo_lang_diagnostics::Severity; -use cairo_lang_syntax::node::ast::Member as MemberAst; -use cairo_lang_syntax::node::db::SyntaxGroup; -use cairo_lang_syntax::node::helpers::QueryAttrs; -use cairo_lang_syntax::node::{Terminal, TypedStablePtr, TypedSyntaxNode}; -use dojo_types::naming::compute_bytearray_hash; -use starknet_crypto::{poseidon_hash_many, Felt}; - -use crate::aux_data::Member; - -/// Compute a unique hash based on the element name and types and names of members. -/// This hash is used in element contracts to ensure uniqueness. -pub fn compute_unique_hash( - db: &dyn SyntaxGroup, - element_name: &str, - is_packed: bool, - members: &[MemberAst], -) -> Felt { - let mut hashes = - vec![if is_packed { Felt::ONE } else { Felt::ZERO }, compute_bytearray_hash(element_name)]; - hashes.extend( - members - .iter() - .map(|m| { - poseidon_hash_many(&[ - compute_bytearray_hash(&m.name(db).text(db).to_string()), - compute_bytearray_hash( - m.type_clause(db).ty(db).as_syntax_node().get_text(db).trim(), - ), - ]) - }) - .collect::>(), - ); - poseidon_hash_many(&hashes) -} - -pub fn parse_members( - db: &dyn SyntaxGroup, - members: &[MemberAst], - diagnostics: &mut Vec, -) -> Vec { - members - .iter() - .filter_map(|member_ast| { - let member = Member { - name: member_ast.name(db).text(db).to_string(), - ty: member_ast - .type_clause(db) - .ty(db) - .as_syntax_node() - .get_text(db) - .trim() - .to_string(), - key: member_ast.has_attr(db, "key"), - }; - - // validate key member - if member.key && member.ty == "u256" { - diagnostics.push(PluginDiagnostic { - message: "Key is only supported for core types that are 1 felt long once \ - serialized. `u256` is a struct of 2 u128, hence not supported." - .into(), - stable_ptr: member_ast.name(db).stable_ptr().untyped(), - severity: Severity::Error, - }); - None - } else { - Some(member) - } - }) - .collect::>() -} - -pub fn serialize_keys_and_values( - members: &[Member], - serialized_keys: &mut Vec, - serialized_values: &mut Vec, -) { - members.iter().for_each(|member| { - if member.key { - serialized_keys.push(serialize_member_ty(member, true)); - } else { - serialized_values.push(serialize_member_ty(member, true)); - } - }); -} - -pub fn deserialize_keys_and_values( - members: &[Member], - keys_input_name: &str, - deserialized_keys: &mut Vec, - values_input_name: &str, - deserialized_values: &mut Vec, -) { - members.iter().for_each(|member| { - if member.key { - deserialized_keys.push(deserialize_member_ty(member, keys_input_name)); - } else { - deserialized_values.push(deserialize_member_ty(member, values_input_name)); - } - }); -} - -/// Creates a [`RewriteNode`] for the member type serialization. -/// -/// # Arguments -/// -/// * member: The member to serialize. -pub fn serialize_member_ty(member: &Member, with_self: bool) -> RewriteNode { - RewriteNode::Text(format!( - "core::serde::Serde::serialize({}{}, ref serialized);\n", - if with_self { "self." } else { "@" }, - member.name - )) -} - -pub fn deserialize_member_ty(member: &Member, input_name: &str) -> RewriteNode { - RewriteNode::Text(format!( - "let {} = core::serde::Serde::<{}>::deserialize(ref {input_name})?;\n", - member.name, member.ty - )) -} diff --git a/crates/dojo/lang/src/attribute_macros/event.rs b/crates/dojo/lang/src/attribute_macros/event.rs deleted file mode 100644 index 1f7762be44..0000000000 --- a/crates/dojo/lang/src/attribute_macros/event.rs +++ /dev/null @@ -1,166 +0,0 @@ -//! A custom implementation of the starknet::Event derivation path. -//! -//! We append the event selector directly within the append_keys_and_data function. -//! Without the need of the enum for all event variants. -//! -//! - -use cairo_lang_defs::patcher::{PatchBuilder, RewriteNode}; -use cairo_lang_defs::plugin::{ - DynGeneratedFileAuxData, PluginDiagnostic, PluginGeneratedFile, PluginResult, -}; -use cairo_lang_diagnostics::Severity; -use cairo_lang_syntax::node::ast::ModuleItem; -use cairo_lang_syntax::node::db::SyntaxGroup; -use cairo_lang_syntax::node::helpers::QueryAttrs; -use cairo_lang_syntax::node::{ast, TypedStablePtr, TypedSyntaxNode}; -use cairo_lang_utils::unordered_hash_map::UnorderedHashMap; -use dojo_types::naming; - -use super::element::{compute_unique_hash, parse_members, serialize_keys_and_values}; -use crate::aux_data::EventAuxData; -use crate::derive_macros::{ - extract_derive_attr_names, handle_derive_attrs, DOJO_INTROSPECT_DERIVE, DOJO_PACKED_DERIVE, -}; - -const EVENT_PATCH: &str = include_str!("./patches/event.patch.cairo"); - -#[derive(Debug, Clone, Default)] -pub struct DojoEvent {} - -impl DojoEvent { - /// A handler for Dojo code that modifies an event struct. - /// Parameters: - /// * db: The semantic database. - /// * struct_ast: The AST of the event struct. - /// - /// Returns: - /// * A RewriteNode containing the generated code. - pub fn from_struct(db: &dyn SyntaxGroup, struct_ast: ast::ItemStruct) -> PluginResult { - let mut diagnostics = vec![]; - - let event_name = struct_ast.name(db).as_syntax_node().get_text(db).trim().to_string(); - - for (id, value) in [("name", &event_name)] { - if !naming::is_name_valid(value) { - return PluginResult { - code: None, - diagnostics: vec![PluginDiagnostic { - stable_ptr: struct_ast.stable_ptr().0, - message: format!( - "The event {id} '{value}' can only contain characters (a-z/A-Z), \ - digits (0-9) and underscore (_)." - ), - severity: Severity::Error, - }], - remove_original_item: false, - }; - } - } - - let members = parse_members(db, &struct_ast.members(db).elements(db), &mut diagnostics); - - let mut serialized_keys: Vec = vec![]; - let mut serialized_values: Vec = vec![]; - - serialize_keys_and_values(&members, &mut serialized_keys, &mut serialized_values); - - if serialized_keys.is_empty() { - diagnostics.push(PluginDiagnostic { - message: "Event must define at least one #[key] attribute".into(), - stable_ptr: struct_ast.name(db).stable_ptr().untyped(), - severity: Severity::Error, - }); - } - - if serialized_values.is_empty() { - diagnostics.push(PluginDiagnostic { - message: "Event must define at least one member that is not a key".into(), - stable_ptr: struct_ast.name(db).stable_ptr().untyped(), - severity: Severity::Error, - }); - } - - let members_values = members - .iter() - .filter_map(|m| { - if m.key { - None - } else { - Some(RewriteNode::Text(format!("pub {}: {},\n", m.name, m.ty))) - } - }) - .collect::>(); - - let member_names = members - .iter() - .map(|member| RewriteNode::Text(format!("{},\n", member.name.clone()))) - .collect::>(); - - let mut derive_attr_names = extract_derive_attr_names( - db, - &mut diagnostics, - struct_ast.attributes(db).query_attr(db, "derive"), - ); - - // Ensures events always derive Introspect if not already derived, - // and do not derive IntrospectPacked. - if derive_attr_names.contains(&DOJO_PACKED_DERIVE.to_string()) { - diagnostics.push(PluginDiagnostic { - message: format!("Deriving {DOJO_PACKED_DERIVE} on event is not allowed."), - stable_ptr: struct_ast.name(db).stable_ptr().untyped(), - severity: Severity::Error, - }); - } - - if !derive_attr_names.contains(&DOJO_INTROSPECT_DERIVE.to_string()) { - derive_attr_names.push(DOJO_INTROSPECT_DERIVE.to_string()); - } - - let (derive_nodes, derive_diagnostics) = - handle_derive_attrs(db, &derive_attr_names, &ModuleItem::Struct(struct_ast.clone())); - - let unique_hash = - compute_unique_hash(db, &event_name, false, &struct_ast.members(db).elements(db)) - .to_string(); - - diagnostics.extend(derive_diagnostics); - - let node = RewriteNode::interpolate_patched( - EVENT_PATCH, - &UnorderedHashMap::from([ - ("type_name".to_string(), RewriteNode::Text(event_name.clone())), - ("member_names".to_string(), RewriteNode::new_modified(member_names)), - ("serialized_keys".to_string(), RewriteNode::new_modified(serialized_keys)), - ("serialized_values".to_string(), RewriteNode::new_modified(serialized_values)), - ("unique_hash".to_string(), RewriteNode::Text(unique_hash)), - ("members_values".to_string(), RewriteNode::new_modified(members_values)), - ]), - ); - - let mut builder = PatchBuilder::new(db, &struct_ast); - - for node in derive_nodes { - builder.add_modified(node); - } - - builder.add_modified(node); - - let (code, code_mappings) = builder.build(); - - crate::debug_expand(&format!("EVENT PATCH: {event_name}"), &code); - - let aux_data = EventAuxData { name: event_name.clone(), members }; - - PluginResult { - code: Some(PluginGeneratedFile { - name: event_name.into(), - content: code, - aux_data: Some(DynGeneratedFileAuxData::new(aux_data)), - code_mappings, - }), - diagnostics, - remove_original_item: false, - } - } -} diff --git a/crates/dojo/lang/src/attribute_macros/interface.rs b/crates/dojo/lang/src/attribute_macros/interface.rs deleted file mode 100644 index 7e257095c4..0000000000 --- a/crates/dojo/lang/src/attribute_macros/interface.rs +++ /dev/null @@ -1,170 +0,0 @@ -use cairo_lang_defs::patcher::{PatchBuilder, RewriteNode}; -use cairo_lang_defs::plugin::{ - MacroPluginMetadata, PluginDiagnostic, PluginGeneratedFile, PluginResult, -}; -use cairo_lang_diagnostics::Severity; -use cairo_lang_plugins::plugins::HasItemsInCfgEx; -use cairo_lang_syntax::node::db::SyntaxGroup; -use cairo_lang_syntax::node::{ast, ids, Terminal, TypedStablePtr, TypedSyntaxNode}; -use cairo_lang_utils::unordered_hash_map::UnorderedHashMap; - -use crate::syntax::self_param; -use crate::syntax::world_param::{self, WorldParamInjectionKind}; - -#[derive(Debug)] -pub struct DojoInterface { - diagnostics: Vec, -} - -impl DojoInterface { - pub fn from_trait( - db: &dyn SyntaxGroup, - trait_ast: &ast::ItemTrait, - metadata: &MacroPluginMetadata<'_>, - ) -> PluginResult { - let name = trait_ast.name(db).text(db); - let mut interface = DojoInterface { diagnostics: vec![] }; - let mut builder = PatchBuilder::new(db, trait_ast); - - if let ast::MaybeTraitBody::Some(body) = trait_ast.body(db) { - let body_nodes: Vec<_> = body - .iter_items_in_cfg(db, metadata.cfg_set) - .flat_map(|el| { - if let ast::TraitItem::Function(ref fn_ast) = el { - return interface.rewrite_function(db, fn_ast.clone()); - } - - interface.diagnostics.push(PluginDiagnostic { - stable_ptr: el.stable_ptr().untyped(), - message: "Anything other than functions is not supported in a \ - dojo::interface" - .to_string(), - severity: Severity::Error, - }); - - vec![] - }) - .collect(); - - builder.add_modified(RewriteNode::Mapped { - node: Box::new(RewriteNode::interpolate_patched( - " - #[starknet::interface] - pub trait $name$ { - $body$ - } - ", - &UnorderedHashMap::from([ - ("name".to_string(), RewriteNode::Text(name.to_string())), - ("body".to_string(), RewriteNode::new_modified(body_nodes)), - ]), - )), - origin: trait_ast.as_syntax_node().span_without_trivia(db), - }); - } else { - // empty trait - builder.add_modified(RewriteNode::Mapped { - node: Box::new(RewriteNode::interpolate_patched( - " - #[starknet::interface] - pub trait $name$ {} - ", - &UnorderedHashMap::from([( - "name".to_string(), - RewriteNode::Text(name.to_string()), - )]), - )), - origin: trait_ast.as_syntax_node().span_without_trivia(db), - }); - } - - let (code, code_mappings) = builder.build(); - - PluginResult { - code: Some(PluginGeneratedFile { - name: name.clone(), - content: code, - aux_data: None, - code_mappings, - }), - diagnostics: interface.diagnostics, - remove_original_item: true, - } - } - - /// Rewrites parameter list by adding `self` parameter based on the `world` parameter. - pub fn rewrite_parameters( - &mut self, - db: &dyn SyntaxGroup, - param_list: ast::ParamList, - diagnostic_item: ids::SyntaxStablePtrId, - ) -> String { - let mut params = param_list - .elements(db) - .iter() - .map(|e| e.as_syntax_node().get_text(db)) - .collect::>(); - - let is_self_used = self_param::check_parameter(db, ¶m_list); - - let world_injection = world_param::parse_world_injection( - db, - param_list, - diagnostic_item, - &mut self.diagnostics, - ); - - if is_self_used && world_injection != WorldParamInjectionKind::None { - self.diagnostics.push(PluginDiagnostic { - stable_ptr: diagnostic_item, - message: "You cannot use `self` and `world` parameters together.".to_string(), - severity: Severity::Error, - }); - } - - match world_injection { - WorldParamInjectionKind::None => { - if !is_self_used { - params.insert(0, "self: @T".to_string()); - } - } - WorldParamInjectionKind::View => { - params.remove(0); - params.insert(0, "self: @T".to_string()); - } - WorldParamInjectionKind::External => { - params.remove(0); - params.insert(0, "ref self: T".to_string()); - } - }; - - params.join(", ") - } - - /// Rewrites function declaration by adding `self` parameter if missing, - pub fn rewrite_function( - &mut self, - db: &dyn SyntaxGroup, - fn_ast: ast::TraitItemFunction, - ) -> Vec { - let fn_name = fn_ast.declaration(db).name(db).text(db); - let return_type = - fn_ast.declaration(db).signature(db).ret_ty(db).as_syntax_node().get_text(db); - - let params_str = self.rewrite_parameters( - db, - fn_ast.declaration(db).signature(db).parameters(db), - fn_ast.stable_ptr().untyped(), - ); - - let declaration_node = RewriteNode::Mapped { - node: Box::new(RewriteNode::Text(format!( - "fn {}({}) {};", - fn_name, params_str, return_type - ))), - origin: fn_ast.declaration(db).as_syntax_node().span_without_trivia(db), - }; - - vec![declaration_node] - } -} diff --git a/crates/dojo/lang/src/attribute_macros/mod.rs b/crates/dojo/lang/src/attribute_macros/mod.rs deleted file mode 100644 index aa04576732..0000000000 --- a/crates/dojo/lang/src/attribute_macros/mod.rs +++ /dev/null @@ -1,20 +0,0 @@ -//! Attribute macros. -//! -//! An attribute macros is a macro that is used to generate code generally for a struct, enum, -//! module or trait. - -pub mod contract; -pub mod element; -pub mod event; -pub mod interface; -pub mod model; - -pub use contract::DojoContract; -pub use event::DojoEvent; -pub use interface::DojoInterface; -pub use model::DojoModel; - -pub const DOJO_CONTRACT_ATTR: &str = "dojo::contract"; -pub const DOJO_INTERFACE_ATTR: &str = "dojo::interface"; -pub const DOJO_MODEL_ATTR: &str = "dojo::model"; -pub const DOJO_EVENT_ATTR: &str = "dojo::event"; diff --git a/crates/dojo/lang/src/attribute_macros/model.rs b/crates/dojo/lang/src/attribute_macros/model.rs deleted file mode 100644 index 9987f5e8b6..0000000000 --- a/crates/dojo/lang/src/attribute_macros/model.rs +++ /dev/null @@ -1,238 +0,0 @@ -//! Handle the `dojo::model` attribute macro. - -use std::collections::HashSet; - -use cairo_lang_defs::patcher::{PatchBuilder, RewriteNode}; -use cairo_lang_defs::plugin::{ - DynGeneratedFileAuxData, PluginDiagnostic, PluginGeneratedFile, PluginResult, -}; -use cairo_lang_diagnostics::Severity; -use cairo_lang_syntax::node::ast::{ItemStruct, ModuleItem}; -use cairo_lang_syntax::node::db::SyntaxGroup; -use cairo_lang_syntax::node::helpers::QueryAttrs; -use cairo_lang_syntax::node::{TypedStablePtr, TypedSyntaxNode}; -use cairo_lang_utils::unordered_hash_map::UnorderedHashMap; -use dojo_types::naming; -use starknet::core::utils::get_selector_from_name; - -use super::element::{compute_unique_hash, parse_members, serialize_member_ty}; -use crate::aux_data::{Member, ModelAuxData}; -use crate::derive_macros::{ - extract_derive_attr_names, handle_derive_attrs, DOJO_INTROSPECT_DERIVE, DOJO_PACKED_DERIVE, -}; - -const MODEL_CODE_PATCH: &str = include_str!("./patches/model.patch.cairo"); -const MODEL_FIELD_CODE_PATCH: &str = include_str!("./patches/model_field_store.patch.cairo"); - -#[derive(Debug, Clone, Default)] -pub struct DojoModel {} - -impl DojoModel { - /// A handler for Dojo code that modifies a model struct. - /// Parameters: - /// * db: The semantic database. - /// * struct_ast: The AST of the model struct. - /// - /// Returns: - /// * A RewriteNode containing the generated code. - pub fn from_struct(db: &dyn SyntaxGroup, struct_ast: ItemStruct) -> PluginResult { - let mut diagnostics = vec![]; - - let model_type = struct_ast.name(db).as_syntax_node().get_text(db).trim().to_string(); - - for (id, value) in [("name", &model_type)] { - if !naming::is_name_valid(value) { - return PluginResult { - code: None, - diagnostics: vec![PluginDiagnostic { - stable_ptr: struct_ast.stable_ptr().0, - message: format!( - "The model {id} '{value}' can only contain characters (a-z/A-Z), \ - digits (0-9) and underscore (_)." - ), - severity: Severity::Error, - }], - remove_original_item: false, - }; - } - } - - let mut values: Vec = vec![]; - let mut keys: Vec = vec![]; - let mut members_values: Vec = vec![]; - let mut key_types: Vec = vec![]; - let mut key_attrs: Vec = vec![]; - - let mut serialized_keys: Vec = vec![]; - let mut serialized_values: Vec = vec![]; - let mut field_accessors: Vec = vec![]; - - // The impl constraint for a model `MemberStore` must be defined for each member type. - // To avoid double, we keep track of the processed types to skip the double impls. - let mut model_member_store_impls_processed: HashSet = HashSet::new(); - let mut model_member_store_impls: Vec = vec![]; - - let members = parse_members(db, &struct_ast.members(db).elements(db), &mut diagnostics); - - members.iter().for_each(|member| { - if member.key { - keys.push(member.clone()); - key_types.push(member.ty.clone()); - key_attrs.push(format!("*self.{}", member.name.clone())); - serialized_keys.push(serialize_member_ty(member, true)); - } else { - values.push(member.clone()); - serialized_values.push(serialize_member_ty(member, true)); - members_values - .push(RewriteNode::Text(format!("pub {}: {},\n", member.name, member.ty))); - field_accessors.push(generate_field_accessors(model_type.clone(), member)); - - if !model_member_store_impls_processed.contains(&member.ty.to_string()) { - model_member_store_impls.extend(vec![ - format!( - "+dojo::model::storage::MemberModelStorage", - model_type, member.ty - ), - format!( - "+dojo::model::storage::MemberModelStorage", - model_type, member.ty - ), - format!( - "+dojo::model::members::MemberStore::", - model_type, member.ty - ), - ]); - - model_member_store_impls_processed.insert(member.ty.to_string()); - } - } - }); - if keys.is_empty() { - diagnostics.push(PluginDiagnostic { - message: "Model must define at least one #[key] attribute".into(), - stable_ptr: struct_ast.name(db).stable_ptr().untyped(), - severity: Severity::Error, - }); - } - - if values.is_empty() { - diagnostics.push(PluginDiagnostic { - message: "Model must define at least one member that is not a key".into(), - stable_ptr: struct_ast.name(db).stable_ptr().untyped(), - severity: Severity::Error, - }); - } - if !diagnostics.is_empty() { - return PluginResult { code: None, diagnostics, remove_original_item: false }; - } - let (keys_to_tuple, key_type) = if keys.len() > 1 { - (format!("({})", key_attrs.join(", ")), format!("({})", key_types.join(", "))) - } else { - (key_attrs.first().unwrap().to_string(), key_types.first().unwrap().to_string()) - }; - - let mut derive_attr_names = extract_derive_attr_names( - db, - &mut diagnostics, - struct_ast.attributes(db).query_attr(db, "derive"), - ); - - // Ensures models always derive Introspect if not already derived. - let model_value_derive_attr_names = derive_attr_names - .iter() - .map(|d| d.as_str()) - .filter(|&d| d != DOJO_INTROSPECT_DERIVE && d != DOJO_PACKED_DERIVE) - .collect::>() - .join(", "); - - if !derive_attr_names.contains(&DOJO_INTROSPECT_DERIVE.to_string()) - && !derive_attr_names.contains(&DOJO_PACKED_DERIVE.to_string()) - { - // Default to Introspect, and not packed. - derive_attr_names.push(DOJO_INTROSPECT_DERIVE.to_string()); - } - - let is_packed = derive_attr_names.contains(&DOJO_PACKED_DERIVE.to_string()); - - let (derive_nodes, derive_diagnostics) = - handle_derive_attrs(db, &derive_attr_names, &ModuleItem::Struct(struct_ast.clone())); - - let unique_hash = - compute_unique_hash(db, &model_type, is_packed, &struct_ast.members(db).elements(db)) - .to_string(); - - diagnostics.extend(derive_diagnostics); - - let node = RewriteNode::interpolate_patched( - MODEL_CODE_PATCH, - &UnorderedHashMap::from([ - ("model_type".to_string(), RewriteNode::Text(model_type.clone())), - ("serialized_keys".to_string(), RewriteNode::new_modified(serialized_keys)), - ("serialized_values".to_string(), RewriteNode::new_modified(serialized_values)), - ("keys_to_tuple".to_string(), RewriteNode::Text(keys_to_tuple)), - ("key_type".to_string(), RewriteNode::Text(key_type)), - ("members_values".to_string(), RewriteNode::new_modified(members_values)), - ("field_accessors".to_string(), RewriteNode::new_modified(field_accessors)), - ( - "model_value_derive_attr_names".to_string(), - RewriteNode::Text(model_value_derive_attr_names), - ), - ("unique_hash".to_string(), RewriteNode::Text(unique_hash)), - ]), - ); - - let mut builder = PatchBuilder::new(db, &struct_ast); - - for node in derive_nodes { - builder.add_modified(node); - } - - builder.add_modified(node); - - let (code, code_mappings) = builder.build(); - - crate::debug_expand(&format!("MODEL PATCH: {model_type}"), &code); - - let aux_data = ModelAuxData { name: model_type.clone(), members }; - - PluginResult { - code: Some(PluginGeneratedFile { - name: model_type.into(), - content: code, - aux_data: Some(DynGeneratedFileAuxData::new(aux_data)), - code_mappings, - }), - diagnostics, - remove_original_item: false, - } - } -} - -/// Generates field accessors (`get_[field_name]` and `set_[field_name]`) for every -/// fields of a model. -/// -/// # Arguments -/// -/// * `model_name` - the model name. -/// * `param_keys` - coma separated model keys with the format `KEY_NAME: KEY_TYPE`. -/// * `serialized_param_keys` - code to serialize model keys in a `serialized` felt252 array. -/// * `member` - information about the field for which to generate accessors. -/// -/// # Returns -/// A [`RewriteNode`] containing accessors code. -fn generate_field_accessors(model_type: String, member: &Member) -> RewriteNode { - RewriteNode::interpolate_patched( - MODEL_FIELD_CODE_PATCH, - &UnorderedHashMap::from([ - ("model_type".to_string(), RewriteNode::Text(model_type)), - ( - "field_selector".to_string(), - RewriteNode::Text( - get_selector_from_name(&member.name).expect("invalid member name").to_string(), - ), - ), - ("field_name".to_string(), RewriteNode::Text(member.name.clone())), - ("field_type".to_string(), RewriteNode::Text(member.ty.clone())), - ]), - ) -} diff --git a/crates/dojo/lang/src/aux_data.rs b/crates/dojo/lang/src/aux_data.rs deleted file mode 100644 index eb2bbcdf1f..0000000000 --- a/crates/dojo/lang/src/aux_data.rs +++ /dev/null @@ -1,67 +0,0 @@ -//! Auxiliary data for Dojo generated files. -//! -//! The plugin generates aux data for models, contracts and events. -//! Then the compiler uses this aux data to generate the manifests and organize the artifacts. - -use cairo_lang_defs::plugin::GeneratedFileAuxData; -use serde::{Deserialize, Serialize}; - -/// Represents a member of a struct. -#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)] -pub struct Member { - // Name of the member. - pub name: String, - // Type of the member. - #[serde(rename = "type")] - pub ty: String, - // Whether the member is a key. - pub key: bool, -} - -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] -pub struct ModelAuxData { - pub name: String, - pub members: Vec, -} - -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] -pub struct ContractAuxData { - pub name: String, - pub systems: Vec, -} - -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] -pub struct EventAuxData { - pub name: String, - pub members: Vec, -} - -impl GeneratedFileAuxData for ModelAuxData { - fn as_any(&self) -> &dyn std::any::Any { - self - } - - fn eq(&self, other: &dyn GeneratedFileAuxData) -> bool { - if let Some(other) = other.as_any().downcast_ref::() { self == other } else { false } - } -} - -impl GeneratedFileAuxData for EventAuxData { - fn as_any(&self) -> &dyn std::any::Any { - self - } - - fn eq(&self, other: &dyn GeneratedFileAuxData) -> bool { - if let Some(other) = other.as_any().downcast_ref::() { self == other } else { false } - } -} - -impl GeneratedFileAuxData for ContractAuxData { - fn as_any(&self) -> &dyn std::any::Any { - self - } - - fn eq(&self, other: &dyn GeneratedFileAuxData) -> bool { - if let Some(other) = other.as_any().downcast_ref::() { self == other } else { false } - } -} diff --git a/crates/dojo/lang/src/cairo_plugin.rs b/crates/dojo/lang/src/cairo_plugin.rs deleted file mode 100644 index a13cc76533..0000000000 --- a/crates/dojo/lang/src/cairo_plugin.rs +++ /dev/null @@ -1,107 +0,0 @@ -//! Dojo plugin for Cairo. - -use cairo_lang_defs::plugin::{MacroPlugin, MacroPluginMetadata, PluginDiagnostic, PluginResult}; -use cairo_lang_defs::plugin_utils::PluginResultTrait; -use cairo_lang_diagnostics::Severity; -use cairo_lang_semantic::plugin::PluginSuite; -use cairo_lang_syntax::node::db::SyntaxGroup; -use cairo_lang_syntax::node::helpers::QueryAttrs; -use cairo_lang_syntax::node::{ast, Terminal, TypedSyntaxNode}; - -use super::attribute_macros::{ - DojoContract, DojoEvent, DojoModel, DOJO_CONTRACT_ATTR, DOJO_EVENT_ATTR, DOJO_MODEL_ATTR, -}; -use super::derive_macros::{dojo_derive_all, DOJO_INTROSPECT_DERIVE, DOJO_PACKED_DERIVE}; -use super::inline_macros::SelectorFromTagMacro; - -// #[cfg(test)] -// #[path = "plugin_test.rs"] -// mod test; -pub const DOJO_PLUGIN_PACKAGE_NAME: &str = "dojo_plugin"; - -#[derive(Debug, Default)] -pub struct BuiltinDojoPlugin; - -pub fn dojo_plugin_suite() -> PluginSuite { - let mut suite = PluginSuite::default(); - - suite.add_plugin::().add_inline_macro_plugin::(); - - suite -} - -impl MacroPlugin for BuiltinDojoPlugin { - /// This function is called for every item in whole db. Hence, - /// the sooner we can return, the better. - /// As an example, compiling spawn-and-move project, it's almost 14K calls to this - /// function. - /// - /// Currently Dojo mainly supports: - /// - Contracts: which are built from attribute macros on a module. - /// - Interfaces: which are built from attribute macros on a trait. - /// - Models: which are built from attribute macros on a struct. - /// - Events: which are built from attribute macros on a struct. - /// - Enums: mostly used for deriving introspect to be used into a model or event. - fn generate_code( - &self, - db: &dyn SyntaxGroup, - item_ast: ast::ModuleItem, - metadata: &MacroPluginMetadata<'_>, - ) -> PluginResult { - // Metadata gives information from the crates from where `item_ast` was parsed. - // During the compilation phase, we inject namespace information into the `CfgSet` - // so that it can be used here. - // let namespace_config = metadata.cfg_set.into(); - - match &item_ast { - ast::ModuleItem::Module(module_ast) => { - if module_ast.has_attr(db, DOJO_CONTRACT_ATTR) { - DojoContract::from_module(db, module_ast, metadata) - } else { - PluginResult::default() - } - } - ast::ModuleItem::Enum(enum_ast) => { - dojo_derive_all(db, enum_ast.attributes(db).query_attr(db, "derive"), &item_ast) - } - ast::ModuleItem::Struct(struct_ast) => { - let n_model_attrs = struct_ast.attributes(db).query_attr(db, DOJO_MODEL_ATTR).len(); - - let n_event_attrs = struct_ast.attributes(db).query_attr(db, DOJO_EVENT_ATTR).len(); - - if n_model_attrs > 0 && n_event_attrs > 0 { - return PluginResult::diagnostic_only(PluginDiagnostic { - stable_ptr: struct_ast.stable_ptr().0, - message: format!( - "The struct {} can only have one of the dojo::model or one \ - dojo::event attribute.", - struct_ast.name(db).text(db) - ), - severity: Severity::Error, - }); - } else if n_model_attrs == 1 { - return DojoModel::from_struct(db, struct_ast.clone()); - } else if n_event_attrs == 1 { - return DojoEvent::from_struct(db, struct_ast.clone()); - } - - // Not a model or event, but has derives. - dojo_derive_all(db, struct_ast.attributes(db).query_attr(db, "derive"), &item_ast) - } - _ => PluginResult::default(), - } - } - - fn declared_attributes(&self) -> Vec { - vec![ - DOJO_CONTRACT_ATTR.to_string(), - DOJO_EVENT_ATTR.to_string(), - DOJO_MODEL_ATTR.to_string(), - "key".to_string(), - ] - } - - fn declared_derives(&self) -> Vec { - vec![DOJO_INTROSPECT_DERIVE.to_string(), DOJO_PACKED_DERIVE.to_string()] - } -} diff --git a/crates/dojo/lang/src/inline_macros/delete.rs b/crates/dojo/lang/src/inline_macros/delete.rs deleted file mode 100644 index 91070ceb65..0000000000 --- a/crates/dojo/lang/src/inline_macros/delete.rs +++ /dev/null @@ -1,112 +0,0 @@ -use cairo_lang_defs::patcher::PatchBuilder; -use cairo_lang_defs::plugin::{ - InlineMacroExprPlugin, InlinePluginResult, MacroPluginMetadata, NamedPlugin, PluginDiagnostic, - PluginGeneratedFile, -}; -use cairo_lang_defs::plugin_utils::unsupported_bracket_diagnostic; -use cairo_lang_diagnostics::Severity; -use cairo_lang_syntax::node::{ast, TypedStablePtr, TypedSyntaxNode}; - -use super::unsupported_arg_diagnostic; - -#[derive(Debug, Default)] -pub struct DeleteMacro; - -impl NamedPlugin for DeleteMacro { - const NAME: &'static str = "delete"; -} - -impl InlineMacroExprPlugin for DeleteMacro { - fn generate_code( - &self, - db: &dyn cairo_lang_syntax::node::db::SyntaxGroup, - syntax: &ast::ExprInlineMacro, - _metadata: &MacroPluginMetadata<'_>, - ) -> InlinePluginResult { - let ast::WrappedArgList::ParenthesizedArgList(arg_list) = syntax.arguments(db) else { - return unsupported_bracket_diagnostic(db, syntax); - }; - let mut builder = PatchBuilder::new(db, syntax); - builder.add_str("{"); - - let args = arg_list.arguments(db).elements(db); - - if args.len() != 2 { - return InlinePluginResult { - code: None, - diagnostics: vec![PluginDiagnostic { - stable_ptr: arg_list.arguments(db).stable_ptr().untyped(), - message: "Invalid arguments. Expected \"(world, (models,))\"".to_string(), - severity: Severity::Error, - }], - }; - } - - let world = &args[0]; - - let ast::ArgClause::Unnamed(models) = args[1].arg_clause(db) else { - return unsupported_arg_diagnostic(db, syntax); - }; - - let mut bundle = vec![]; - - match models.value(db) { - ast::Expr::Parenthesized(parens) => { - let syntax_node = parens.expr(db).as_syntax_node(); - bundle.push(syntax_node.get_text(db)); - } - ast::Expr::Tuple(list) => { - list.expressions(db).elements(db).into_iter().for_each(|expr| { - let syntax_node = expr.as_syntax_node(); - bundle.push(syntax_node.get_text(db)); - }) - } - ast::Expr::StructCtorCall(ctor) => { - let syntax_node = ctor.as_syntax_node(); - bundle.push(syntax_node.get_text(db)); - } - _ => { - return InlinePluginResult { - code: None, - diagnostics: vec![PluginDiagnostic { - message: "Invalid arguments. Expected \"(world, (models,))\"".to_string(), - stable_ptr: arg_list.arguments(db).stable_ptr().untyped(), - severity: Severity::Error, - }], - }; - } - } - - if bundle.is_empty() { - return InlinePluginResult { - code: None, - diagnostics: vec![PluginDiagnostic { - message: "Invalid arguments: No models provided.".to_string(), - stable_ptr: arg_list.arguments(db).stable_ptr().untyped(), - severity: Severity::Error, - }], - }; - } - - for entity in bundle { - builder.add_str(&format!( - "dojo::model::ModelStore::delete({}, @{})\n;", - world.as_syntax_node().get_text(db), - entity, - )); - } - builder.add_str("}"); - - let (code, code_mappings) = builder.build(); - - InlinePluginResult { - code: Some(PluginGeneratedFile { - name: "delete_inline_macro".into(), - content: code, - code_mappings, - aux_data: None, - }), - diagnostics: vec![], - } - } -} diff --git a/crates/dojo/lang/src/inline_macros/emit.rs b/crates/dojo/lang/src/inline_macros/emit.rs deleted file mode 100644 index 57b87b424c..0000000000 --- a/crates/dojo/lang/src/inline_macros/emit.rs +++ /dev/null @@ -1,116 +0,0 @@ -use cairo_lang_defs::patcher::PatchBuilder; -use cairo_lang_defs::plugin::{ - InlineMacroExprPlugin, InlinePluginResult, MacroPluginMetadata, NamedPlugin, PluginDiagnostic, - PluginGeneratedFile, -}; -use cairo_lang_defs::plugin_utils::unsupported_bracket_diagnostic; -use cairo_lang_diagnostics::Severity; -use cairo_lang_syntax::node::{ast, TypedStablePtr, TypedSyntaxNode}; - -use super::unsupported_arg_diagnostic; - -#[derive(Debug, Default)] -pub struct EmitMacro; - -impl NamedPlugin for EmitMacro { - const NAME: &'static str = "emit"; -} - -impl InlineMacroExprPlugin for EmitMacro { - fn generate_code( - &self, - db: &dyn cairo_lang_syntax::node::db::SyntaxGroup, - syntax: &ast::ExprInlineMacro, - _metadata: &MacroPluginMetadata<'_>, - ) -> InlinePluginResult { - let ast::WrappedArgList::ParenthesizedArgList(arg_list) = syntax.arguments(db) else { - return unsupported_bracket_diagnostic(db, syntax); - }; - let mut builder = PatchBuilder::new(db, syntax); - builder.add_str("{"); - - let args = arg_list.arguments(db).elements(db); - - if args.len() < 2 || args.len() > 3 { - return InlinePluginResult { - code: None, - diagnostics: vec![PluginDiagnostic { - stable_ptr: arg_list.arguments(db).stable_ptr().untyped(), - message: "Invalid arguments. Expected \"emit!(world, (events,))\"".to_string(), - severity: Severity::Error, - }], - }; - } - - let world = &args[0]; - - let ast::ArgClause::Unnamed(models) = args[1].arg_clause(db) else { - return unsupported_arg_diagnostic(db, syntax); - }; - - let mut bundle = vec![]; - - match models.value(db) { - ast::Expr::Parenthesized(parens) => { - let syntax_node = parens.expr(db).as_syntax_node(); - bundle.push(syntax_node.get_text(db)); - } - ast::Expr::Tuple(list) => { - list.expressions(db).elements(db).into_iter().for_each(|expr| { - let syntax_node = expr.as_syntax_node(); - bundle.push(syntax_node.get_text(db)); - }) - } - ast::Expr::StructCtorCall(ctor) => { - let syntax_node = ctor.as_syntax_node(); - bundle.push(syntax_node.get_text(db)); - } - _ => { - return InlinePluginResult { - code: None, - diagnostics: vec![PluginDiagnostic { - message: "Invalid arguments. Expected \"(world, (events,))\"".to_string(), - stable_ptr: arg_list.arguments(db).stable_ptr().untyped(), - severity: Severity::Error, - }], - }; - } - } - - if bundle.is_empty() { - return InlinePluginResult { - code: None, - diagnostics: vec![PluginDiagnostic { - message: "Invalid arguments: No models provided.".to_string(), - stable_ptr: arg_list.arguments(db).stable_ptr().untyped(), - severity: Severity::Error, - }], - }; - } - - for event in bundle { - builder.add_str(&format!( - " - let __event_instance__ = {}; - dojo::event::Event::emit(@__event_instance__, {}); - ", - event, - world.as_syntax_node().get_text(db), - )); - } - - builder.add_str("}"); - - let (code, code_mappings) = builder.build(); - - InlinePluginResult { - code: Some(PluginGeneratedFile { - name: "emit_inline_macro".into(), - content: code, - code_mappings, - aux_data: None, - }), - diagnostics: vec![], - } - } -} diff --git a/crates/dojo/lang/src/inline_macros/get.rs b/crates/dojo/lang/src/inline_macros/get.rs deleted file mode 100644 index f2c8f9a601..0000000000 --- a/crates/dojo/lang/src/inline_macros/get.rs +++ /dev/null @@ -1,106 +0,0 @@ -use cairo_lang_defs::patcher::PatchBuilder; -use cairo_lang_defs::plugin::{ - InlineMacroExprPlugin, InlinePluginResult, MacroPluginMetadata, NamedPlugin, PluginDiagnostic, - PluginGeneratedFile, -}; -use cairo_lang_defs::plugin_utils::unsupported_bracket_diagnostic; -use cairo_lang_diagnostics::Severity; -use cairo_lang_syntax::node::ast::Expr; -use cairo_lang_syntax::node::{ast, TypedStablePtr, TypedSyntaxNode}; -use itertools::Itertools; - -use super::{extract_models, unsupported_arg_diagnostic, CAIRO_ERR_MSG_LEN}; - -#[derive(Debug, Default)] -pub struct GetMacro; - -impl NamedPlugin for GetMacro { - const NAME: &'static str = "get"; -} - -impl InlineMacroExprPlugin for GetMacro { - fn generate_code( - &self, - db: &dyn cairo_lang_syntax::node::db::SyntaxGroup, - syntax: &ast::ExprInlineMacro, - _metadata: &MacroPluginMetadata<'_>, - ) -> InlinePluginResult { - let ast::WrappedArgList::ParenthesizedArgList(arg_list) = syntax.arguments(db) else { - return unsupported_bracket_diagnostic(db, syntax); - }; - let mut builder = PatchBuilder::new(db, syntax); - builder.add_str("{\n"); - - let args = arg_list.arguments(db).elements(db); - - if args.len() != 3 { - return InlinePluginResult { - code: None, - diagnostics: vec![PluginDiagnostic { - stable_ptr: syntax.stable_ptr().untyped(), - message: "Invalid arguments. Expected \"get!(world, keys, (models,))\"" - .to_string(), - severity: Severity::Error, - }], - }; - } - - let world = &args[0]; - - let ast::ArgClause::Unnamed(keys) = args[1].arg_clause(db) else { - return unsupported_arg_diagnostic(db, syntax); - }; - - let ast::ArgClause::Unnamed(models) = args[2].arg_clause(db) else { - return unsupported_arg_diagnostic(db, syntax); - }; - let models = match extract_models(db, &models.value(db)) { - Ok(models) => models, - Err(diagnostic) => { - return InlinePluginResult { code: None, diagnostics: vec![diagnostic] }; - } - }; - - if models.is_empty() { - return InlinePluginResult { - code: None, - diagnostics: vec![PluginDiagnostic { - stable_ptr: syntax.stable_ptr().untyped(), - message: "Model types cannot be empty".to_string(), - severity: Severity::Error, - }], - }; - } - - let args = match keys.value(db) { - Expr::Literal(literal) => format!("({})", literal.as_syntax_node().get_text(db)), - _ => keys.as_syntax_node().get_text(db), - }; - - for model in &models { - let mut lookup_err_msg = format!("{} not found", model.to_string()); - lookup_err_msg.truncate(CAIRO_ERR_MSG_LEN); - - builder.add_str(&format!( - "let __{model}: {model} = dojo::model::ModelStore::get(@{}, {});\n", - world.as_syntax_node().get_text(db), - args, - )); - } - builder.add_str(&format!("({})}}", models.iter().map(|c| format!("__{c}")).join(","))); - - let (code, code_mappings) = builder.build(); - - crate::debug_expand(&format!("GET MACRO: {args}"), &code); - - InlinePluginResult { - code: Some(PluginGeneratedFile { - name: "get_inline_macro".into(), - content: code, - code_mappings, - aux_data: None, - }), - diagnostics: vec![], - } - } -} diff --git a/crates/dojo/lang/src/inline_macros/get_models_test_class_hashes.rs b/crates/dojo/lang/src/inline_macros/get_models_test_class_hashes.rs deleted file mode 100644 index 1cfcfe0ea4..0000000000 --- a/crates/dojo/lang/src/inline_macros/get_models_test_class_hashes.rs +++ /dev/null @@ -1,104 +0,0 @@ -use cairo_lang_defs::patcher::PatchBuilder; -use cairo_lang_defs::plugin::{ - InlineMacroExprPlugin, InlinePluginResult, MacroPluginMetadata, NamedPlugin, PluginDiagnostic, - PluginGeneratedFile, -}; -use cairo_lang_defs::plugin_utils::unsupported_bracket_diagnostic; -use cairo_lang_diagnostics::Severity; -use cairo_lang_syntax::node::{ast, TypedStablePtr, TypedSyntaxNode}; - -use super::unsupported_arg_diagnostic; -use super::utils::{extract_namespaces, load_manifest_models_and_namespaces}; - -#[derive(Debug, Default)] -pub struct GetModelsTestClassHashes; - -impl NamedPlugin for GetModelsTestClassHashes { - const NAME: &'static str = "get_models_test_class_hashes"; -} - -impl InlineMacroExprPlugin for GetModelsTestClassHashes { - fn generate_code( - &self, - db: &dyn cairo_lang_syntax::node::db::SyntaxGroup, - syntax: &ast::ExprInlineMacro, - metadata: &MacroPluginMetadata<'_>, - ) -> InlinePluginResult { - let ast::WrappedArgList::ParenthesizedArgList(arg_list) = syntax.arguments(db) else { - return unsupported_bracket_diagnostic(db, syntax); - }; - - let args = arg_list.arguments(db).elements(db); - - if args.len() > 1 { - return InlinePluginResult { - code: None, - diagnostics: vec![PluginDiagnostic { - stable_ptr: syntax.stable_ptr().untyped(), - message: "Invalid arguments. Expected \ - \"get_models_test_class_hashes!([\"ns1\", \"ns2\")]\" or \ - \"get_models_test_class_hashes!()\"." - .to_string(), - severity: Severity::Error, - }], - }; - } - - let whitelisted_namespaces = if args.len() == 1 { - let ast::ArgClause::Unnamed(expected_array) = args[0].arg_clause(db) else { - return unsupported_arg_diagnostic(db, syntax); - }; - - match extract_namespaces(db, &expected_array.value(db)) { - Ok(namespaces) => namespaces, - Err(e) => { - return InlinePluginResult { code: None, diagnostics: vec![e] }; - } - } - } else { - vec![] - }; - - let (_namespaces, models) = - match load_manifest_models_and_namespaces(metadata.cfg_set, &whitelisted_namespaces) { - Ok((namespaces, models)) => (namespaces, models), - Err(_e) => { - return InlinePluginResult { - code: None, - diagnostics: vec![PluginDiagnostic { - stable_ptr: syntax.stable_ptr().untyped(), - message: "Failed to load models and namespaces, ensure you have run \ - `sozo build` first." - .to_string(), - severity: Severity::Error, - }], - }; - } - }; - - let mut builder = PatchBuilder::new(db, syntax); - - // Use the TEST_CLASS_HASH for each model, which is already a qualified path, no `use` - // required. - builder.add_str(&format!( - "[{}].span()", - models - .iter() - .map(|m| format!("{}::TEST_CLASS_HASH", m)) - .collect::>() - .join(", ") - )); - - let (code, code_mappings) = builder.build(); - - InlinePluginResult { - code: Some(PluginGeneratedFile { - name: "get_models_test_class_hashes_macro".into(), - content: code, - code_mappings, - aux_data: None, - }), - diagnostics: vec![], - } - } -} diff --git a/crates/dojo/lang/src/inline_macros/mod.rs b/crates/dojo/lang/src/inline_macros/mod.rs deleted file mode 100644 index 1f28612be1..0000000000 --- a/crates/dojo/lang/src/inline_macros/mod.rs +++ /dev/null @@ -1,111 +0,0 @@ -//! Inline macros. -//! -//! An inline macros is a macro that is used directly within the code. - -use cairo_lang_defs::plugin::{InlinePluginResult, PluginDiagnostic}; -use cairo_lang_diagnostics::Severity; -use cairo_lang_syntax::node::db::SyntaxGroup; -use cairo_lang_syntax::node::{ast, Terminal, TypedStablePtr, TypedSyntaxNode}; -use smol_str::SmolStr; - -pub mod delete; -pub mod emit; -pub mod get; -pub mod get_models_test_class_hashes; -pub mod selector_from_tag; -pub mod set; -pub mod spawn_test_world; -pub mod utils; - -pub use delete::DeleteMacro; -pub use emit::EmitMacro; -pub use get::GetMacro; -pub use get_models_test_class_hashes::GetModelsTestClassHashes; -pub use selector_from_tag::SelectorFromTagMacro; -pub use set::SetMacro; -pub use spawn_test_world::SpawnTestWorld; - -const CAIRO_ERR_MSG_LEN: usize = 31; - -pub fn extract_models( - db: &dyn SyntaxGroup, - expression: &ast::Expr, -) -> Result, PluginDiagnostic> { - let mut models = vec![]; - match expression { - ast::Expr::Tuple(tuple) => { - for element in tuple.expressions(db).elements(db) { - match extract_models(db, &element) { - Ok(mut element_models) => models.append(&mut element_models), - Err(diagnostic) => return Err(diagnostic), - } - } - } - ast::Expr::Parenthesized(parenthesized) => { - match extract_models(db, &parenthesized.expr(db)) { - Ok(mut parenthesized_models) => models.append(&mut parenthesized_models), - Err(diagnostic) => return Err(diagnostic), - } - } - ast::Expr::Path(path) => match path.elements(db).last().unwrap() { - ast::PathSegment::WithGenericArgs(segment) => { - let generic = segment.generic_args(db); - - for param in generic.generic_args(db).elements(db) { - let ast::GenericArg::Unnamed(unnamed) = param else { - return Err(PluginDiagnostic { - stable_ptr: param.stable_ptr().untyped(), - message: "Should be an unnamed argument".to_string(), - severity: Severity::Error, - }); - }; - - let ast::GenericArgValue::Expr(expr) = unnamed.value(db) else { - return Err(PluginDiagnostic { - stable_ptr: unnamed.stable_ptr().untyped(), - message: "Should be an expression".to_string(), - severity: Severity::Error, - }); - }; - - match extract_models(db, &expr.expr(db)) { - Ok(mut expr_models) => models.append(&mut expr_models), - Err(diagnostic) => return Err(diagnostic), - } - } - } - ast::PathSegment::Simple(segment) => { - models.push(segment.ident(db).text(db)); - } - }, - _ => { - return Err(PluginDiagnostic { - stable_ptr: expression.stable_ptr().untyped(), - message: format!( - "Unsupported expression type: {}", - expression.as_syntax_node().get_text(db) - ), - severity: Severity::Error, - }); - } - } - - Ok(models) -} - -pub fn unsupported_arg_diagnostic( - db: &dyn SyntaxGroup, - macro_ast: &ast::ExprInlineMacro, -) -> InlinePluginResult { - InlinePluginResult { - code: None, - diagnostics: vec![PluginDiagnostic { - stable_ptr: macro_ast.stable_ptr().untyped(), - message: format!( - "Macro {} does not support this arg type", - macro_ast.path(db).as_syntax_node().get_text(db) - ), - severity: Severity::Error, - }], - } -} diff --git a/crates/dojo/lang/src/inline_macros/selector_from_tag.rs b/crates/dojo/lang/src/inline_macros/selector_from_tag.rs deleted file mode 100644 index 4145100d4e..0000000000 --- a/crates/dojo/lang/src/inline_macros/selector_from_tag.rs +++ /dev/null @@ -1,74 +0,0 @@ -use cairo_lang_defs::patcher::PatchBuilder; -use cairo_lang_defs::plugin::{ - InlineMacroExprPlugin, InlinePluginResult, MacroPluginMetadata, NamedPlugin, PluginDiagnostic, - PluginGeneratedFile, -}; -use cairo_lang_defs::plugin_utils::unsupported_bracket_diagnostic; -use cairo_lang_diagnostics::Severity; -use cairo_lang_syntax::node::{ast, TypedStablePtr, TypedSyntaxNode}; -use dojo_types::naming; - -#[derive(Debug, Default)] -pub struct SelectorFromTagMacro; - -impl NamedPlugin for SelectorFromTagMacro { - const NAME: &'static str = "selector_from_tag"; -} - -impl InlineMacroExprPlugin for SelectorFromTagMacro { - fn generate_code( - &self, - db: &dyn cairo_lang_syntax::node::db::SyntaxGroup, - syntax: &ast::ExprInlineMacro, - _metadata: &MacroPluginMetadata<'_>, - ) -> InlinePluginResult { - let ast::WrappedArgList::ParenthesizedArgList(arg_list) = syntax.arguments(db) else { - return unsupported_bracket_diagnostic(db, syntax); - }; - - let args = arg_list.arguments(db).elements(db); - - if args.len() != 1 { - return InlinePluginResult { - code: None, - diagnostics: vec![PluginDiagnostic { - stable_ptr: syntax.stable_ptr().untyped(), - message: "Invalid arguments. Expected \"selector_from_tag!(\"tag\")\"" - .to_string(), - severity: Severity::Error, - }], - }; - } - - let tag = &args[0].as_syntax_node().get_text(db).replace('\"', ""); - - if !naming::is_valid_tag(tag) { - return InlinePluginResult { - code: None, - diagnostics: vec![PluginDiagnostic { - stable_ptr: syntax.stable_ptr().untyped(), - message: "Invalid tag. Tag must be in the format of `namespace-name`." - .to_string(), - severity: Severity::Error, - }], - }; - } - - let selector = naming::compute_selector_from_tag(tag); - - let mut builder = PatchBuilder::new(db, syntax); - builder.add_str(&format!("{:#64x}", selector)); - - let (code, code_mappings) = builder.build(); - - InlinePluginResult { - code: Some(PluginGeneratedFile { - name: "selector_from_tag_macro".into(), - content: code, - code_mappings, - aux_data: None, - }), - diagnostics: vec![], - } - } -} diff --git a/crates/dojo/lang/src/inline_macros/set.rs b/crates/dojo/lang/src/inline_macros/set.rs deleted file mode 100644 index 7a040fbae9..0000000000 --- a/crates/dojo/lang/src/inline_macros/set.rs +++ /dev/null @@ -1,128 +0,0 @@ -use cairo_lang_defs::patcher::PatchBuilder; -use cairo_lang_defs::plugin::{ - InlineMacroExprPlugin, InlinePluginResult, MacroPluginMetadata, NamedPlugin, PluginDiagnostic, - PluginGeneratedFile, -}; -use cairo_lang_defs::plugin_utils::unsupported_bracket_diagnostic; -use cairo_lang_diagnostics::Severity; -use cairo_lang_syntax::node::{ast, TypedStablePtr, TypedSyntaxNode}; - -use super::unsupported_arg_diagnostic; - -#[derive(Debug, Default)] -pub struct SetMacro; - -impl NamedPlugin for SetMacro { - const NAME: &'static str = "set"; - // Parents of set!() - // ----------------- - // StatementExpr - // StatementList - // ExprBlock - // FunctionWithBody - // ImplItemList - // ImplBody - // ItemImpl - // ItemList - // ModuleBody - // ItemModule - // ItemList - // SyntaxFile -} - -impl InlineMacroExprPlugin for SetMacro { - fn generate_code( - &self, - db: &dyn cairo_lang_syntax::node::db::SyntaxGroup, - syntax: &ast::ExprInlineMacro, - _metadata: &MacroPluginMetadata<'_>, - ) -> InlinePluginResult { - let ast::WrappedArgList::ParenthesizedArgList(arg_list) = syntax.arguments(db) else { - return unsupported_bracket_diagnostic(db, syntax); - }; - let mut builder = PatchBuilder::new(db, syntax); - builder.add_str("{"); - - let args = arg_list.arguments(db).elements(db); - - if args.len() != 2 { - return InlinePluginResult { - code: None, - diagnostics: vec![PluginDiagnostic { - stable_ptr: arg_list.arguments(db).stable_ptr().untyped(), - message: "Invalid arguments. Expected \"(world, (models,))\"".to_string(), - severity: Severity::Error, - }], - }; - } - - let world = &args[0]; - - let ast::ArgClause::Unnamed(models) = args[1].arg_clause(db) else { - return unsupported_arg_diagnostic(db, syntax); - }; - - let mut bundle = vec![]; - - match models.value(db) { - ast::Expr::Parenthesized(parens) => { - let syntax_node = parens.expr(db).as_syntax_node(); - bundle.push(syntax_node.get_text(db)); - } - ast::Expr::Tuple(list) => { - list.expressions(db).elements(db).into_iter().for_each(|expr| { - let syntax_node = expr.as_syntax_node(); - bundle.push(syntax_node.get_text(db)); - }) - } - ast::Expr::StructCtorCall(ctor) => { - let syntax_node = ctor.as_syntax_node(); - bundle.push(syntax_node.get_text(db)); - } - _ => { - return InlinePluginResult { - code: None, - diagnostics: vec![PluginDiagnostic { - message: "Invalid arguments. Expected \"(world, (models,))\"".to_string(), - stable_ptr: arg_list.arguments(db).stable_ptr().untyped(), - severity: Severity::Error, - }], - }; - } - } - - if bundle.is_empty() { - return InlinePluginResult { - code: None, - diagnostics: vec![PluginDiagnostic { - message: "Invalid arguments: No models provided.".to_string(), - stable_ptr: arg_list.arguments(db).stable_ptr().untyped(), - severity: Severity::Error, - }], - }; - } - - for entity in bundle { - builder.add_str(&format!( - " - dojo::model::ModelStore::set({}, @{}); - ", - world.as_syntax_node().get_text(db), - entity, - )); - } - builder.add_str("}"); - - let (code, code_mappings) = builder.build(); - - InlinePluginResult { - code: Some(PluginGeneratedFile { - name: "set_inline_macro".into(), - content: code, - code_mappings, - aux_data: None, - }), - diagnostics: vec![], - } - } -} diff --git a/crates/dojo/lang/src/inline_macros/spawn_test_world.rs b/crates/dojo/lang/src/inline_macros/spawn_test_world.rs deleted file mode 100644 index e40004bebc..0000000000 --- a/crates/dojo/lang/src/inline_macros/spawn_test_world.rs +++ /dev/null @@ -1,105 +0,0 @@ -use cairo_lang_defs::patcher::PatchBuilder; -use cairo_lang_defs::plugin::{ - InlineMacroExprPlugin, InlinePluginResult, MacroPluginMetadata, NamedPlugin, PluginDiagnostic, - PluginGeneratedFile, -}; -use cairo_lang_defs::plugin_utils::unsupported_bracket_diagnostic; -use cairo_lang_diagnostics::Severity; -use cairo_lang_syntax::node::{ast, TypedStablePtr, TypedSyntaxNode}; -use tracing::trace; - -use super::unsupported_arg_diagnostic; -use super::utils::{extract_namespaces, load_manifest_models_and_namespaces}; - -#[derive(Debug, Default)] -pub struct SpawnTestWorld; - -impl NamedPlugin for SpawnTestWorld { - const NAME: &'static str = "spawn_test_world"; -} - -impl InlineMacroExprPlugin for SpawnTestWorld { - fn generate_code( - &self, - db: &dyn cairo_lang_syntax::node::db::SyntaxGroup, - syntax: &ast::ExprInlineMacro, - metadata: &MacroPluginMetadata<'_>, - ) -> InlinePluginResult { - let ast::WrappedArgList::ParenthesizedArgList(arg_list) = syntax.arguments(db) else { - return unsupported_bracket_diagnostic(db, syntax); - }; - - let args = arg_list.arguments(db).elements(db); - - if args.len() > 1 { - return InlinePluginResult { - code: None, - diagnostics: vec![PluginDiagnostic { - stable_ptr: syntax.stable_ptr().untyped(), - message: "Invalid arguments. Expected \"spawn_test_world!()\" or \ - \"spawn_test_world!([\"ns1\"])" - .to_string(), - severity: Severity::Error, - }], - }; - } - - let whitelisted_namespaces = if args.len() == 1 { - let ast::ArgClause::Unnamed(expected_array) = args[0].arg_clause(db) else { - return unsupported_arg_diagnostic(db, syntax); - }; - - match extract_namespaces(db, &expected_array.value(db)) { - Ok(namespaces) => namespaces, - Err(e) => { - return InlinePluginResult { code: None, diagnostics: vec![e] }; - } - } - } else { - vec![] - }; - - let (namespaces, models) = - match load_manifest_models_and_namespaces(metadata.cfg_set, &whitelisted_namespaces) { - Ok((namespaces, models)) => (namespaces, models), - Err(_e) => { - return InlinePluginResult { - code: None, - diagnostics: vec![PluginDiagnostic { - stable_ptr: syntax.stable_ptr().untyped(), - message: "failed to load models and namespaces, ensure you have run \ - `sozo build` first." - .to_string(), - severity: Severity::Error, - }], - }; - } - }; - - trace!(?namespaces, ?models, "Spawning test world from macro."); - - let mut builder = PatchBuilder::new(db, syntax); - - builder.add_str(&format!( - "dojo::utils::test::spawn_test_world([{}].span(), [{}].span())", - namespaces.iter().map(|n| format!("\"{}\"", n)).collect::>().join(", "), - models - .iter() - .map(|m| format!("{}::TEST_CLASS_HASH", m)) - .collect::>() - .join(", ") - )); - - let (code, code_mappings) = builder.build(); - - InlinePluginResult { - code: Some(PluginGeneratedFile { - name: "spawn_test_world_macro".into(), - content: code, - code_mappings, - aux_data: None, - }), - diagnostics: vec![], - } - } -} diff --git a/crates/dojo/lang/src/inline_macros/utils.rs b/crates/dojo/lang/src/inline_macros/utils.rs deleted file mode 100644 index 5366b477e7..0000000000 --- a/crates/dojo/lang/src/inline_macros/utils.rs +++ /dev/null @@ -1,90 +0,0 @@ -use std::collections::HashSet; - -use cairo_lang_defs::plugin::PluginDiagnostic; -use cairo_lang_diagnostics::Severity; -use cairo_lang_filesystem::cfg::CfgSet; -use cairo_lang_syntax::node::ast::{self, ExprPath, ExprStructCtorCall}; -use cairo_lang_syntax::node::db::SyntaxGroup; -use cairo_lang_syntax::node::kind::SyntaxKind; -use cairo_lang_syntax::node::{SyntaxNode, TypedStablePtr, TypedSyntaxNode}; - -#[derive(Debug)] -pub enum SystemRWOpRecord { - StructCtor(ExprStructCtorCall), - Path(ExprPath), -} - -pub fn parent_of_kind( - db: &dyn cairo_lang_syntax::node::db::SyntaxGroup, - target: &SyntaxNode, - kind: SyntaxKind, -) -> Option { - let mut new_target = target.clone(); - while let Some(parent) = new_target.parent() { - if kind == parent.kind(db) { - return Some(parent); - } - new_target = parent; - } - None -} - -/// Reads all the models and namespaces from base manifests files. -pub fn load_manifest_models_and_namespaces( - _cfg_set: &CfgSet, - _whitelisted_namespaces: &[String], -) -> anyhow::Result<(Vec, Vec)> { - let models = HashSet::::new(); - let namespaces = HashSet::::new(); - - // for model in annotations.models { - // let qualified_path = model.qualified_path; - // let namespace = naming::split_tag(&model.tag)?.0; - // - // if !whitelisted_namespaces.is_empty() && !whitelisted_namespaces.contains(&namespace) { - // continue; - // } - // - // models.insert(qualified_path); - // namespaces.insert(namespace); - // } - - let models_vec: Vec = models.into_iter().collect(); - let namespaces_vec: Vec = namespaces.into_iter().collect(); - - Ok((namespaces_vec, models_vec)) -} - -/// Extracts the namespaces from a fixed size array of strings. -pub fn extract_namespaces( - db: &dyn SyntaxGroup, - expression: &ast::Expr, -) -> Result, PluginDiagnostic> { - let mut namespaces = vec![]; - - match expression { - ast::Expr::FixedSizeArray(array) => { - for element in array.exprs(db).elements(db) { - if let ast::Expr::String(string_literal) = element { - namespaces.push(string_literal.as_syntax_node().get_text(db).replace('\"', "")); - } else { - return Err(PluginDiagnostic { - stable_ptr: element.stable_ptr().untyped(), - message: "Expected a string literal".to_string(), - severity: Severity::Error, - }); - } - } - } - _ => { - return Err(PluginDiagnostic { - stable_ptr: expression.stable_ptr().untyped(), - message: "The list of namespaces should be a fixed size array of strings." - .to_string(), - severity: Severity::Error, - }); - } - } - - Ok(namespaces) -} diff --git a/crates/dojo/lang/src/lib.rs b/crates/dojo/lang/src/lib.rs deleted file mode 100644 index f92c752fd0..0000000000 --- a/crates/dojo/lang/src/lib.rs +++ /dev/null @@ -1,41 +0,0 @@ -//! Dojo compiler. -//! -//! This crate contains the Dojo compiler, with a cairo plugin for the Cairo language. - -#![warn(unused_crate_dependencies)] - -pub mod attribute_macros; -pub mod aux_data; -pub mod cairo_plugin; -pub mod derive_macros; -pub mod inline_macros; -pub mod semantics; -pub mod syntax; - -pub use cairo_plugin::{dojo_plugin_suite, BuiltinDojoPlugin, DOJO_PLUGIN_PACKAGE_NAME}; - -pub const CAIRO_PATH_SEPARATOR: &str = "::"; -pub const WORLD_QUALIFIED_PATH: &str = "dojo::world::world_contract::world"; -pub const WORLD_CONTRACT_TAG: &str = "dojo-world"; -pub const RESOURCE_METADATA_QUALIFIED_PATH: &str = "dojo::model::metadata::resource_metadata"; -pub const CONTRACTS_DIR: &str = "contracts"; -pub const MODELS_DIR: &str = "models"; -pub const EVENTS_DIR: &str = "events"; -pub const MANIFESTS_DIR: &str = "manifests"; -pub const MANIFESTS_BASE_DIR: &str = "base"; - -/// Prints the given string only if the `DOJO_EXPAND` environemnt variable is set. -/// This is useful for debugging the compiler with verbose output. -/// -/// # Arguments -/// -/// * `loc` - The location of the code to be expanded. -/// * `code` - The code to be expanded. -pub fn debug_expand(loc: &str, code: &str) { - if std::env::var("DOJO_EXPAND").is_ok() { - println!( - "\n*> EXPAND {} <*\n>>>>>>>>>>>>>>>>>>>>>>>>>>>\n{}\n<<<<<<<<<<<<<<<<<<<<<<<<<<<\n", - loc, code - ); - } -} diff --git a/crates/dojo/lang/src/plugin_test.rs b/crates/dojo/lang/src/plugin_test.rs deleted file mode 100644 index 609bdb6f74..0000000000 --- a/crates/dojo/lang/src/plugin_test.rs +++ /dev/null @@ -1,175 +0,0 @@ -use std::path::PathBuf; -use std::sync::Arc; - -use cairo_lang_defs::db::{DefsDatabase, DefsGroup}; -use cairo_lang_defs::ids::ModuleId; -use cairo_lang_defs::plugin::MacroPlugin; -use cairo_lang_filesystem::cfg::{Cfg, CfgSet}; -use cairo_lang_filesystem::db::{ - init_files_group, AsFilesGroupMut, CrateConfiguration, ExternalFiles, FilesDatabase, - FilesGroup, FilesGroupEx, -}; -use cairo_lang_filesystem::ids::{CrateLongId, Directory, VirtualFile}; -use cairo_lang_parser::db::ParserDatabase; -use cairo_lang_plugins::get_base_plugins; -use cairo_lang_plugins::test_utils::expand_module_text; -use cairo_lang_starknet::plugin::StarkNetPlugin; -use cairo_lang_syntax::node::db::{SyntaxDatabase, SyntaxGroup}; -use cairo_lang_test_utils::parse_test_file::TestRunnerResult; -use cairo_lang_test_utils::verify_diagnostics_expectation; -use cairo_lang_utils::ordered_hash_map::OrderedHashMap; -use cairo_lang_utils::Upcast; -use smol_str::SmolStr; - -use super::BuiltinDojoPlugin; - -#[salsa::database(DefsDatabase, ParserDatabase, SyntaxDatabase, FilesDatabase)] -pub struct DatabaseForTesting { - storage: salsa::Storage, -} -impl salsa::Database for DatabaseForTesting {} -impl ExternalFiles for DatabaseForTesting { - fn try_ext_as_virtual(&self, external_id: salsa::InternId) -> Option { - try_ext_as_virtual_impl(self.upcast(), external_id) - } -} -impl Default for DatabaseForTesting { - fn default() -> Self { - let mut res = Self { storage: Default::default() }; - init_files_group(&mut res); - res.set_macro_plugins(vec![ - Arc::new(FooToBarPlugin), - Arc::new(RemoveOrigPlugin), - Arc::new(DummyPlugin), - ]); - res - } -} -impl AsFilesGroupMut for DatabaseForTesting { - fn as_files_group_mut(&mut self) -> &mut (dyn FilesGroup + 'static) { - self - } -} -impl Upcast for DatabaseForTesting { - fn upcast(&self) -> &(dyn DefsGroup + 'static) { - self - } -} -impl Upcast for DatabaseForTesting { - fn upcast(&self) -> &(dyn FilesGroup + 'static) { - self - } -} -impl Upcast for DatabaseForTesting { - fn upcast(&self) -> &(dyn SyntaxGroup + 'static) { - self - } -} - -cairo_lang_test_utils::test_file_test!( - expand_plugin, - "src/plugin/plugin_test_data", - { - model: "model", - event: "event", - print: "print", - introspect: "introspect", - system: "system", - }, - test_expand_plugin -); - -pub fn test_expand_plugin( - inputs: &OrderedHashMap, - args: &OrderedHashMap, -) -> TestRunnerResult { - test_expand_plugin_inner( - inputs, - args, - &[Arc::new(BuiltinDojoPlugin), Arc::new(StarkNetPlugin::default())], - ) -} - -/// Tests expansion of given code, with the default plugins plus the given extra plugins. -pub fn test_expand_plugin_inner( - inputs: &OrderedHashMap, - args: &OrderedHashMap, - extra_plugins: &[Arc], -) -> TestRunnerResult { - let db = &mut DatabaseForTesting::default(); - let mut plugins = db.macro_plugins(); - plugins.extend_from_slice(extra_plugins); - db.set_macro_plugins(plugins); - - // if no configuration is provided, be sure there is at least a default namespace, - // so all the tests have a correct configuration. - let cfg_set: CfgSet = match inputs.get("cfg") { - Some(cfg) => serde_json::from_str(cfg.as_str()).unwrap(), - None => { - let mut cfg_set = CfgSet::new(); - cfg_set.insert(Cfg::kv(DEFAULT_NAMESPACE_CFG_KEY, SmolStr::from("dojo_test"))); - cfg_set - } - }; - - db.set_cfg_set(Arc::new(cfg_set)); - - let test_id = &inputs["test_id"]; - let cairo_code = &inputs["cairo_code"]; - - // The path as to remain the same, because diagnostics contains the path - // of the file. Which can cause error when checked without CAIRO_FIX=1. - let tmp_dir = PathBuf::from(format!("/tmp/plugin_test/{}", test_id)); - let _ = std::fs::create_dir_all(&tmp_dir); - let tmp_path = tmp_dir.as_path(); - - // Create Scarb.toml file - let scarb_toml_path = tmp_path.join("Scarb.toml"); - std::fs::write( - scarb_toml_path, - r#" -[package] -cairo-version = "=2.6.4" -edition = "2024_07" -name = "test_package" -version = "0.7.3" - -[cairo] -sierra-replace-ids = true - -[[target.dojo]] - -[tool.dojo.world] -namespace = { default = "test_package" } -seed = "test_package" -"#, - ) - .expect("Failed to write Scarb.toml"); - - // Create src directory - let src_dir = tmp_path.join("src"); - let _ = std::fs::create_dir(&src_dir); - - // Create lib.cairo file - let lib_cairo_path = src_dir.join("lib.cairo"); - std::fs::write(lib_cairo_path, cairo_code).expect("Failed to write lib.cairo"); - - let crate_id = db.intern_crate(CrateLongId::Real("test".into())); - let root = Directory::Real(src_dir.to_path_buf()); - - db.set_crate_config(crate_id, Some(CrateConfiguration::default_for_root(root))); - - let mut diagnostic_items = vec![]; - let expanded_module = - expand_module_text(db, ModuleId::CrateRoot(crate_id), &mut diagnostic_items); - let joined_diagnostics = diagnostic_items.join("\n"); - let error = verify_diagnostics_expectation(args, &joined_diagnostics); - - TestRunnerResult { - outputs: OrderedHashMap::from([ - ("expanded_cairo_code".into(), expanded_module), - ("expected_diagnostics".into(), joined_diagnostics), - ]), - error, - } -} diff --git a/crates/dojo/lang/src/plugin_test_data/event b/crates/dojo/lang/src/plugin_test_data/event deleted file mode 100644 index ffd85c4e82..0000000000 --- a/crates/dojo/lang/src/plugin_test_data/event +++ /dev/null @@ -1,1585 +0,0 @@ -//! > Test expansion of the dojo::event. - -//! > test_runner_name -test_expand_plugin - -//! > test_id -event - -//! > cairo_code -#[derive(Drop, Serde)] -#[dojo::event] -pub struct Message { - #[key] - pub identity: ContractAddress, - #[key] - pub channel: felt252, - pub message: ByteArray, - #[key] - pub salt: felt252 -} - -#[dojo::event(namespace: 'my_namespace')] -struct MyEventWithNamespace { - #[key] - id: felt252, - name: ByteArray, -} - -#[dojo::event(historical: false)] -struct MyEventNoHistorical { - #[key] - id: felt252, - name: ByteArray, -} - -//! > expanded_cairo_code -#[derive(Drop, Serde)] -#[dojo::event] -pub struct Message { - #[key] - pub identity: ContractAddress, - #[key] - pub channel: felt252, - pub message: ByteArray, - #[key] - pub salt: felt252 -} - -#[dojo::event(namespace: 'my_namespace')] -struct MyEventWithNamespace { - #[key] - id: felt252, - name: ByteArray, -} - -#[dojo::event(historical: false)] -struct MyEventNoHistorical { - #[key] - id: felt252, - name: ByteArray, -}impl MessageDrop of core::traits::Drop::; -impl MessageSerde of core::serde::Serde:: { - fn serialize(self: @Message, ref output: core::array::Array) { - core::serde::Serde::serialize(self.identity, ref output); - core::serde::Serde::serialize(self.channel, ref output); - core::serde::Serde::serialize(self.message, ref output); - core::serde::Serde::serialize(self.salt, ref output) - } - fn deserialize(ref serialized: core::array::Span) -> core::option::Option { - core::option::Option::Some(Message { - identity: core::serde::Serde::deserialize(ref serialized)?, - channel: core::serde::Serde::deserialize(ref serialized)?, - message: core::serde::Serde::deserialize(ref serialized)?, - salt: core::serde::Serde::deserialize(ref serialized)?, - }) - } -} - -impl MessageIntrospect<> of dojo::meta::introspect::Introspect> { - #[inline(always)] - fn size() -> Option { - Option::None - } - - fn layout() -> dojo::meta::Layout { - dojo::meta::Layout::Struct( - array![ - dojo::meta::FieldLayout { - selector: 1234962429638067342109111948666382589302318509162806680039978245403372666376, - layout: dojo::meta::introspect::Introspect::::layout() - } - ].span() - ) - } - - #[inline(always)] - fn ty() -> dojo::meta::introspect::Ty { - dojo::meta::introspect::Ty::Struct( - dojo::meta::introspect::Struct { - name: 'Message', - attrs: array![].span(), - children: array![ - dojo::meta::introspect::Member { - name: 'identity', - attrs: array!['key'].span(), - ty: dojo::meta::introspect::Introspect::::ty() - }, -dojo::meta::introspect::Member { - name: 'channel', - attrs: array!['key'].span(), - ty: dojo::meta::introspect::Introspect::::ty() - }, -dojo::meta::introspect::Member { - name: 'message', - attrs: array![].span(), - ty: dojo::meta::introspect::Ty::ByteArray - }, -dojo::meta::introspect::Member { - name: 'salt', - attrs: array!['key'].span(), - ty: dojo::meta::introspect::Introspect::::ty() - } - - ].span() - } - ) - } -} - #[generate_trait] -pub impl MessageEmitterImpl of MessageEmitter { - fn emit(self: @Message, world: dojo::world::IWorldDispatcher) { - dojo::event::Event::::emit(self, world); - } -} - -pub impl MessageEventImpl of dojo::event::Event { - - fn emit(self: @Message, world: dojo::world::IWorldDispatcher) { - dojo::world::IWorldDispatcherTrait::emit_event( - world, - Self::selector(), - Self::keys(self), - Self::values(self), - Self::historical() - ); - } - - #[inline(always)] - fn name() -> ByteArray { - "Message" - } - - #[inline(always)] - fn namespace() -> ByteArray { - "dojo_test" - } - - #[inline(always)] - fn tag() -> ByteArray { - "dojo_test-Message" - } - - #[inline(always)] - fn version() -> u8 { - 1 - } - - #[inline(always)] - fn selector() -> felt252 { - 1906185680711303922822303398414928927091284519615502535643957313578662707163 - } - - #[inline(always)] - fn instance_selector(self: @Message) -> felt252 { - Self::selector() - } - - #[inline(always)] - fn name_hash() -> felt252 { - 1218932985479400212550774377351312162398071867364919833219536439613388630232 - } - - #[inline(always)] - fn namespace_hash() -> felt252 { - 1452123528942907587532668415362544424816022573043154497385993678618948064048 - } - - #[inline(always)] - fn definition() -> dojo::event::EventDefinition { - dojo::event::EventDefinition { - name: Self::name(), - namespace: Self::namespace(), - namespace_selector: Self::namespace_hash(), - version: Self::version(), - layout: Self::layout(), - schema: Self::schema() - } - } - - #[inline(always)] - fn layout() -> dojo::meta::Layout { - dojo::meta::introspect::Introspect::::layout() - } - - #[inline(always)] - fn schema() -> dojo::meta::introspect::Ty { - dojo::meta::introspect::Introspect::::ty() - } - - #[inline(always)] - fn historical() -> bool { - true - } - - #[inline(always)] - fn keys(self: @Message) -> Span { - let mut serialized = core::array::ArrayTrait::new(); - core::serde::Serde::serialize(self.identity, ref serialized); -core::serde::Serde::serialize(self.channel, ref serialized); -core::serde::Serde::serialize(self.salt, ref serialized); - - core::array::ArrayTrait::span(@serialized) - } - - #[inline(always)] - fn values(self: @Message) -> Span { - let mut serialized = core::array::ArrayTrait::new(); - core::serde::Serde::serialize(self.message, ref serialized); - - core::array::ArrayTrait::span(@serialized) - } -} - -#[starknet::contract] -pub mod message { - use super::Message; - - #[abi(embed_v0)] - impl DojoEventImpl of dojo::event::IEvent{ - fn name(self: @ContractState) -> ByteArray { - "Message" - } - - fn namespace(self: @ContractState) -> ByteArray { - "dojo_test" - } - - fn tag(self: @ContractState) -> ByteArray { - "dojo_test-Message" - } - - fn version(self: @ContractState) -> u8 { - 1 - } - - fn selector(self: @ContractState) -> felt252 { - 1906185680711303922822303398414928927091284519615502535643957313578662707163 - } - - fn name_hash(self: @ContractState) -> felt252 { - 1218932985479400212550774377351312162398071867364919833219536439613388630232 - } - - fn namespace_hash(self: @ContractState) -> felt252 { - 1452123528942907587532668415362544424816022573043154497385993678618948064048 - } - - fn definition(self: @ContractState) -> dojo::event::EventDefinition { - dojo::event::Event::::definition() - } - - fn layout(self: @ContractState) -> dojo::meta::Layout { - dojo::event::Event::::layout() - } - - fn schema(self: @ContractState) -> dojo::meta::introspect::Ty { - dojo::meta::introspect::Introspect::::ty() - } - } -#[event] -#[derive(Drop, starknet::Event)] -pub enum Event {} - - -#[phantom] -pub struct Storage { -} - -#[derive(Drop, Copy)] -pub struct StorageStorageBase { -} -impl StorageStorageImpl of starknet::storage::StorageTrait { - type BaseType = StorageStorageBase; - fn storage(self: starknet::storage::FlattenedStorage) -> StorageStorageBase { - StorageStorageBase { - } - } -} -#[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 ContractState { -} - -impl ContractStateDrop of Drop {} - -impl ContractStateDeref of core::ops::SnapshotDeref { - type Target = starknet::storage::FlattenedStorage; - fn snapshot_deref(self: @ContractState) -> starknet::storage::FlattenedStorage { - starknet::storage::FlattenedStorage {} - } -} -impl ContractStateDerefMut of core::ops::DerefMut { - type Target = starknet::storage::FlattenedStorage> ; - fn deref_mut(ref self: ContractState) -> starknet::storage::FlattenedStorage> { - starknet::storage::FlattenedStorage {} - } -} -pub fn unsafe_new_contract_state() -> ContractState { - ContractState { - } -} - -// TODO(Gil): This generates duplicate diagnostics because of the plugin system, squash the duplicates into one. -#[deprecated( - feature: "deprecated_legacy_map", - note: "Use `starknet::storage::Map` instead." -)] -#[allow(unused_imports)] -use starknet::storage::Map as LegacyMap; - -#[implicit_precedence(core::pedersen::Pedersen, core::RangeCheck, core::integer::Bitwise, core::ec::EcOp, core::poseidon::Poseidon, core::SegmentArena, core::circuit::RangeCheck96, core::circuit::AddMod, core::circuit::MulMod, core::gas::GasBuiltin, System)] -fn __wrapper__DojoEventImpl__name(mut data: Span::) -> Span:: { - core::internal::require_implicit::(); - core::internal::revoke_ap_tracking(); - core::option::OptionTraitImpl::expect(core::gas::withdraw_gas(), 'Out of gas'); - - assert(core::array::SpanTrait::is_empty(data), 'Input too long for arguments'); - core::option::OptionTraitImpl::expect( - core::gas::withdraw_gas_all(core::gas::get_builtin_costs()), 'Out of gas', - ); - let mut contract_state = unsafe_new_contract_state(); - let res = DojoEventImpl::name(@contract_state, ); - let mut arr = ArrayTrait::new(); - // References. - // Result. - core::serde::Serde::::serialize(@res, ref arr); - core::array::ArrayTrait::span(@arr) -} - -#[implicit_precedence(core::pedersen::Pedersen, core::RangeCheck, core::integer::Bitwise, core::ec::EcOp, core::poseidon::Poseidon, core::SegmentArena, core::circuit::RangeCheck96, core::circuit::AddMod, core::circuit::MulMod, core::gas::GasBuiltin, System)] -fn __wrapper__DojoEventImpl__namespace(mut data: Span::) -> Span:: { - core::internal::require_implicit::(); - core::internal::revoke_ap_tracking(); - core::option::OptionTraitImpl::expect(core::gas::withdraw_gas(), 'Out of gas'); - - assert(core::array::SpanTrait::is_empty(data), 'Input too long for arguments'); - core::option::OptionTraitImpl::expect( - core::gas::withdraw_gas_all(core::gas::get_builtin_costs()), 'Out of gas', - ); - let mut contract_state = unsafe_new_contract_state(); - let res = DojoEventImpl::namespace(@contract_state, ); - let mut arr = ArrayTrait::new(); - // References. - // Result. - core::serde::Serde::::serialize(@res, ref arr); - core::array::ArrayTrait::span(@arr) -} - -#[implicit_precedence(core::pedersen::Pedersen, core::RangeCheck, core::integer::Bitwise, core::ec::EcOp, core::poseidon::Poseidon, core::SegmentArena, core::circuit::RangeCheck96, core::circuit::AddMod, core::circuit::MulMod, core::gas::GasBuiltin, System)] -fn __wrapper__DojoEventImpl__tag(mut data: Span::) -> Span:: { - core::internal::require_implicit::(); - core::internal::revoke_ap_tracking(); - core::option::OptionTraitImpl::expect(core::gas::withdraw_gas(), 'Out of gas'); - - assert(core::array::SpanTrait::is_empty(data), 'Input too long for arguments'); - core::option::OptionTraitImpl::expect( - core::gas::withdraw_gas_all(core::gas::get_builtin_costs()), 'Out of gas', - ); - let mut contract_state = unsafe_new_contract_state(); - let res = DojoEventImpl::tag(@contract_state, ); - let mut arr = ArrayTrait::new(); - // References. - // Result. - core::serde::Serde::::serialize(@res, ref arr); - core::array::ArrayTrait::span(@arr) -} - -#[implicit_precedence(core::pedersen::Pedersen, core::RangeCheck, core::integer::Bitwise, core::ec::EcOp, core::poseidon::Poseidon, core::SegmentArena, core::circuit::RangeCheck96, core::circuit::AddMod, core::circuit::MulMod, core::gas::GasBuiltin, System)] -fn __wrapper__DojoEventImpl__version(mut data: Span::) -> Span:: { - core::internal::require_implicit::(); - core::internal::revoke_ap_tracking(); - core::option::OptionTraitImpl::expect(core::gas::withdraw_gas(), 'Out of gas'); - - assert(core::array::SpanTrait::is_empty(data), 'Input too long for arguments'); - core::option::OptionTraitImpl::expect( - core::gas::withdraw_gas_all(core::gas::get_builtin_costs()), 'Out of gas', - ); - let mut contract_state = unsafe_new_contract_state(); - let res = DojoEventImpl::version(@contract_state, ); - let mut arr = ArrayTrait::new(); - // References. - // Result. - core::serde::Serde::::serialize(@res, ref arr); - core::array::ArrayTrait::span(@arr) -} - -#[implicit_precedence(core::pedersen::Pedersen, core::RangeCheck, core::integer::Bitwise, core::ec::EcOp, core::poseidon::Poseidon, core::SegmentArena, core::circuit::RangeCheck96, core::circuit::AddMod, core::circuit::MulMod, core::gas::GasBuiltin, System)] -fn __wrapper__DojoEventImpl__selector(mut data: Span::) -> Span:: { - core::internal::require_implicit::(); - core::internal::revoke_ap_tracking(); - core::option::OptionTraitImpl::expect(core::gas::withdraw_gas(), 'Out of gas'); - - assert(core::array::SpanTrait::is_empty(data), 'Input too long for arguments'); - core::option::OptionTraitImpl::expect( - core::gas::withdraw_gas_all(core::gas::get_builtin_costs()), 'Out of gas', - ); - let mut contract_state = unsafe_new_contract_state(); - let res = DojoEventImpl::selector(@contract_state, ); - let mut arr = ArrayTrait::new(); - // References. - // Result. - core::serde::Serde::::serialize(@res, ref arr); - core::array::ArrayTrait::span(@arr) -} - -#[implicit_precedence(core::pedersen::Pedersen, core::RangeCheck, core::integer::Bitwise, core::ec::EcOp, core::poseidon::Poseidon, core::SegmentArena, core::circuit::RangeCheck96, core::circuit::AddMod, core::circuit::MulMod, core::gas::GasBuiltin, System)] -fn __wrapper__DojoEventImpl__name_hash(mut data: Span::) -> Span:: { - core::internal::require_implicit::(); - core::internal::revoke_ap_tracking(); - core::option::OptionTraitImpl::expect(core::gas::withdraw_gas(), 'Out of gas'); - - assert(core::array::SpanTrait::is_empty(data), 'Input too long for arguments'); - core::option::OptionTraitImpl::expect( - core::gas::withdraw_gas_all(core::gas::get_builtin_costs()), 'Out of gas', - ); - let mut contract_state = unsafe_new_contract_state(); - let res = DojoEventImpl::name_hash(@contract_state, ); - let mut arr = ArrayTrait::new(); - // References. - // Result. - core::serde::Serde::::serialize(@res, ref arr); - core::array::ArrayTrait::span(@arr) -} - -#[implicit_precedence(core::pedersen::Pedersen, core::RangeCheck, core::integer::Bitwise, core::ec::EcOp, core::poseidon::Poseidon, core::SegmentArena, core::circuit::RangeCheck96, core::circuit::AddMod, core::circuit::MulMod, core::gas::GasBuiltin, System)] -fn __wrapper__DojoEventImpl__namespace_hash(mut data: Span::) -> Span:: { - core::internal::require_implicit::(); - core::internal::revoke_ap_tracking(); - core::option::OptionTraitImpl::expect(core::gas::withdraw_gas(), 'Out of gas'); - - assert(core::array::SpanTrait::is_empty(data), 'Input too long for arguments'); - core::option::OptionTraitImpl::expect( - core::gas::withdraw_gas_all(core::gas::get_builtin_costs()), 'Out of gas', - ); - let mut contract_state = unsafe_new_contract_state(); - let res = DojoEventImpl::namespace_hash(@contract_state, ); - let mut arr = ArrayTrait::new(); - // References. - // Result. - core::serde::Serde::::serialize(@res, ref arr); - core::array::ArrayTrait::span(@arr) -} - -#[implicit_precedence(core::pedersen::Pedersen, core::RangeCheck, core::integer::Bitwise, core::ec::EcOp, core::poseidon::Poseidon, core::SegmentArena, core::circuit::RangeCheck96, core::circuit::AddMod, core::circuit::MulMod, core::gas::GasBuiltin, System)] -fn __wrapper__DojoEventImpl__definition(mut data: Span::) -> Span:: { - core::internal::require_implicit::(); - core::internal::revoke_ap_tracking(); - core::option::OptionTraitImpl::expect(core::gas::withdraw_gas(), 'Out of gas'); - - assert(core::array::SpanTrait::is_empty(data), 'Input too long for arguments'); - core::option::OptionTraitImpl::expect( - core::gas::withdraw_gas_all(core::gas::get_builtin_costs()), 'Out of gas', - ); - let mut contract_state = unsafe_new_contract_state(); - let res = DojoEventImpl::definition(@contract_state, ); - let mut arr = ArrayTrait::new(); - // References. - // Result. - core::serde::Serde::::serialize(@res, ref arr); - core::array::ArrayTrait::span(@arr) -} - -#[implicit_precedence(core::pedersen::Pedersen, core::RangeCheck, core::integer::Bitwise, core::ec::EcOp, core::poseidon::Poseidon, core::SegmentArena, core::circuit::RangeCheck96, core::circuit::AddMod, core::circuit::MulMod, core::gas::GasBuiltin, System)] -fn __wrapper__DojoEventImpl__layout(mut data: Span::) -> Span:: { - core::internal::require_implicit::(); - core::internal::revoke_ap_tracking(); - core::option::OptionTraitImpl::expect(core::gas::withdraw_gas(), 'Out of gas'); - - assert(core::array::SpanTrait::is_empty(data), 'Input too long for arguments'); - core::option::OptionTraitImpl::expect( - core::gas::withdraw_gas_all(core::gas::get_builtin_costs()), 'Out of gas', - ); - let mut contract_state = unsafe_new_contract_state(); - let res = DojoEventImpl::layout(@contract_state, ); - let mut arr = ArrayTrait::new(); - // References. - // Result. - core::serde::Serde::::serialize(@res, ref arr); - core::array::ArrayTrait::span(@arr) -} - -#[implicit_precedence(core::pedersen::Pedersen, core::RangeCheck, core::integer::Bitwise, core::ec::EcOp, core::poseidon::Poseidon, core::SegmentArena, core::circuit::RangeCheck96, core::circuit::AddMod, core::circuit::MulMod, core::gas::GasBuiltin, System)] -fn __wrapper__DojoEventImpl__schema(mut data: Span::) -> Span:: { - core::internal::require_implicit::(); - core::internal::revoke_ap_tracking(); - core::option::OptionTraitImpl::expect(core::gas::withdraw_gas(), 'Out of gas'); - - assert(core::array::SpanTrait::is_empty(data), 'Input too long for arguments'); - core::option::OptionTraitImpl::expect( - core::gas::withdraw_gas_all(core::gas::get_builtin_costs()), 'Out of gas', - ); - let mut contract_state = unsafe_new_contract_state(); - let res = DojoEventImpl::schema(@contract_state, ); - let mut arr = ArrayTrait::new(); - // References. - // Result. - core::serde::Serde::::serialize(@res, ref arr); - core::array::ArrayTrait::span(@arr) -} - - -pub mod __external { - pub use super::__wrapper__DojoEventImpl__name as name; - pub use super::__wrapper__DojoEventImpl__namespace as namespace; - pub use super::__wrapper__DojoEventImpl__tag as tag; - pub use super::__wrapper__DojoEventImpl__version as version; - pub use super::__wrapper__DojoEventImpl__selector as selector; - pub use super::__wrapper__DojoEventImpl__name_hash as name_hash; - pub use super::__wrapper__DojoEventImpl__namespace_hash as namespace_hash; - pub use super::__wrapper__DojoEventImpl__definition as definition; - pub use super::__wrapper__DojoEventImpl__layout as layout; - pub use super::__wrapper__DojoEventImpl__schema as schema; -} -pub mod __l1_handler { -} -pub mod __constructor { -} - impl ContractStateEventEmitter of starknet::event::EventEmitter< - ContractState, Event - > { - fn emit>( - ref self: ContractState, event: S - ) { - let event: Event = core::traits::Into::into(event); - let mut keys = Default::::default(); - let mut data = Default::::default(); - starknet::Event::append_keys_and_data(@event, ref keys, ref data); - starknet::SyscallResultTrait::unwrap_syscall( - starknet::syscalls::emit_event_syscall( - core::array::ArrayTrait::span(@keys), - core::array::ArrayTrait::span(@data), - ) - ) - } - } -impl EventDrop of core::traits::Drop::; -impl EventIsEvent of starknet::Event { - fn append_keys_and_data( - self: @Event, ref keys: Array, ref data: Array - ) { - match self { - } - } - fn deserialize( - ref keys: Span, ref data: Span, - ) -> Option { - let __selector__ = *core::array::SpanTrait::pop_front(ref keys)?; - Option::None - } -} -impl StorageStorageBaseDrop of core::traits::Drop::; -impl StorageStorageBaseCopy of core::traits::Copy::; -impl StorageStorageBaseMutDrop of core::traits::Drop::; -impl StorageStorageBaseMutCopy of core::traits::Copy::; -} - -impl MyEventWithNamespaceIntrospect<> of dojo::meta::introspect::Introspect> { - #[inline(always)] - fn size() -> Option { - Option::None - } - - fn layout() -> dojo::meta::Layout { - dojo::meta::Layout::Struct( - array![ - dojo::meta::FieldLayout { - selector: 1528802474226268325865027367859591458315299653151958663884057507666229546336, - layout: dojo::meta::introspect::Introspect::::layout() - } - ].span() - ) - } - - #[inline(always)] - fn ty() -> dojo::meta::introspect::Ty { - dojo::meta::introspect::Ty::Struct( - dojo::meta::introspect::Struct { - name: 'MyEventWithNamespace', - attrs: array![].span(), - children: array![ - dojo::meta::introspect::Member { - name: 'id', - attrs: array!['key'].span(), - ty: dojo::meta::introspect::Introspect::::ty() - }, -dojo::meta::introspect::Member { - name: 'name', - attrs: array![].span(), - ty: dojo::meta::introspect::Ty::ByteArray - } - - ].span() - } - ) - } -} - #[generate_trait] -pub impl MyEventWithNamespaceEmitterImpl of MyEventWithNamespaceEmitter { - fn emit(self: @MyEventWithNamespace, world: dojo::world::IWorldDispatcher) { - dojo::event::Event::::emit(self, world); - } -} - -pub impl MyEventWithNamespaceEventImpl of dojo::event::Event { - - fn emit(self: @MyEventWithNamespace, world: dojo::world::IWorldDispatcher) { - dojo::world::IWorldDispatcherTrait::emit_event( - world, - Self::selector(), - Self::keys(self), - Self::values(self), - Self::historical() - ); - } - - #[inline(always)] - fn name() -> ByteArray { - "MyEventWithNamespace" - } - - #[inline(always)] - fn namespace() -> ByteArray { - "my_namespace" - } - - #[inline(always)] - fn tag() -> ByteArray { - "my_namespace-MyEventWithNamespace" - } - - #[inline(always)] - fn version() -> u8 { - 1 - } - - #[inline(always)] - fn selector() -> felt252 { - 522863814429969509522276935486616304495946442516761817333050868296788859995 - } - - #[inline(always)] - fn instance_selector(self: @MyEventWithNamespace) -> felt252 { - Self::selector() - } - - #[inline(always)] - fn name_hash() -> felt252 { - 2098606738830025182570698512150760386142000891530754603737354272913658631235 - } - - #[inline(always)] - fn namespace_hash() -> felt252 { - 1685136890688416384941629523783652800960468745356230625531475538826800548713 - } - - #[inline(always)] - fn definition() -> dojo::event::EventDefinition { - dojo::event::EventDefinition { - name: Self::name(), - namespace: Self::namespace(), - namespace_selector: Self::namespace_hash(), - version: Self::version(), - layout: Self::layout(), - schema: Self::schema() - } - } - - #[inline(always)] - fn layout() -> dojo::meta::Layout { - dojo::meta::introspect::Introspect::::layout() - } - - #[inline(always)] - fn schema() -> dojo::meta::introspect::Ty { - dojo::meta::introspect::Introspect::::ty() - } - - #[inline(always)] - fn historical() -> bool { - true - } - - #[inline(always)] - fn keys(self: @MyEventWithNamespace) -> Span { - let mut serialized = core::array::ArrayTrait::new(); - core::serde::Serde::serialize(self.id, ref serialized); - - core::array::ArrayTrait::span(@serialized) - } - - #[inline(always)] - fn values(self: @MyEventWithNamespace) -> Span { - let mut serialized = core::array::ArrayTrait::new(); - core::serde::Serde::serialize(self.name, ref serialized); - - core::array::ArrayTrait::span(@serialized) - } -} - -#[starknet::contract] -pub mod my_event_with_namespace { - use super::MyEventWithNamespace; - - #[abi(embed_v0)] - impl DojoEventImpl of dojo::event::IEvent{ - fn name(self: @ContractState) -> ByteArray { - "MyEventWithNamespace" - } - - fn namespace(self: @ContractState) -> ByteArray { - "my_namespace" - } - - fn tag(self: @ContractState) -> ByteArray { - "my_namespace-MyEventWithNamespace" - } - - fn version(self: @ContractState) -> u8 { - 1 - } - - fn selector(self: @ContractState) -> felt252 { - 522863814429969509522276935486616304495946442516761817333050868296788859995 - } - - fn name_hash(self: @ContractState) -> felt252 { - 2098606738830025182570698512150760386142000891530754603737354272913658631235 - } - - fn namespace_hash(self: @ContractState) -> felt252 { - 1685136890688416384941629523783652800960468745356230625531475538826800548713 - } - - fn definition(self: @ContractState) -> dojo::event::EventDefinition { - dojo::event::Event::::definition() - } - - fn layout(self: @ContractState) -> dojo::meta::Layout { - dojo::event::Event::::layout() - } - - fn schema(self: @ContractState) -> dojo::meta::introspect::Ty { - dojo::meta::introspect::Introspect::::ty() - } - } -#[event] -#[derive(Drop, starknet::Event)] -pub enum Event {} - - -#[phantom] -pub struct Storage { -} - -#[derive(Drop, Copy)] -pub struct StorageStorageBase { -} -impl StorageStorageImpl of starknet::storage::StorageTrait { - type BaseType = StorageStorageBase; - fn storage(self: starknet::storage::FlattenedStorage) -> StorageStorageBase { - StorageStorageBase { - } - } -} -#[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 ContractState { -} - -impl ContractStateDrop of Drop {} - -impl ContractStateDeref of core::ops::SnapshotDeref { - type Target = starknet::storage::FlattenedStorage; - fn snapshot_deref(self: @ContractState) -> starknet::storage::FlattenedStorage { - starknet::storage::FlattenedStorage {} - } -} -impl ContractStateDerefMut of core::ops::DerefMut { - type Target = starknet::storage::FlattenedStorage> ; - fn deref_mut(ref self: ContractState) -> starknet::storage::FlattenedStorage> { - starknet::storage::FlattenedStorage {} - } -} -pub fn unsafe_new_contract_state() -> ContractState { - ContractState { - } -} - -// TODO(Gil): This generates duplicate diagnostics because of the plugin system, squash the duplicates into one. -#[deprecated( - feature: "deprecated_legacy_map", - note: "Use `starknet::storage::Map` instead." -)] -#[allow(unused_imports)] -use starknet::storage::Map as LegacyMap; - -#[implicit_precedence(core::pedersen::Pedersen, core::RangeCheck, core::integer::Bitwise, core::ec::EcOp, core::poseidon::Poseidon, core::SegmentArena, core::circuit::RangeCheck96, core::circuit::AddMod, core::circuit::MulMod, core::gas::GasBuiltin, System)] -fn __wrapper__DojoEventImpl__name(mut data: Span::) -> Span:: { - core::internal::require_implicit::(); - core::internal::revoke_ap_tracking(); - core::option::OptionTraitImpl::expect(core::gas::withdraw_gas(), 'Out of gas'); - - assert(core::array::SpanTrait::is_empty(data), 'Input too long for arguments'); - core::option::OptionTraitImpl::expect( - core::gas::withdraw_gas_all(core::gas::get_builtin_costs()), 'Out of gas', - ); - let mut contract_state = unsafe_new_contract_state(); - let res = DojoEventImpl::name(@contract_state, ); - let mut arr = ArrayTrait::new(); - // References. - // Result. - core::serde::Serde::::serialize(@res, ref arr); - core::array::ArrayTrait::span(@arr) -} - -#[implicit_precedence(core::pedersen::Pedersen, core::RangeCheck, core::integer::Bitwise, core::ec::EcOp, core::poseidon::Poseidon, core::SegmentArena, core::circuit::RangeCheck96, core::circuit::AddMod, core::circuit::MulMod, core::gas::GasBuiltin, System)] -fn __wrapper__DojoEventImpl__namespace(mut data: Span::) -> Span:: { - core::internal::require_implicit::(); - core::internal::revoke_ap_tracking(); - core::option::OptionTraitImpl::expect(core::gas::withdraw_gas(), 'Out of gas'); - - assert(core::array::SpanTrait::is_empty(data), 'Input too long for arguments'); - core::option::OptionTraitImpl::expect( - core::gas::withdraw_gas_all(core::gas::get_builtin_costs()), 'Out of gas', - ); - let mut contract_state = unsafe_new_contract_state(); - let res = DojoEventImpl::namespace(@contract_state, ); - let mut arr = ArrayTrait::new(); - // References. - // Result. - core::serde::Serde::::serialize(@res, ref arr); - core::array::ArrayTrait::span(@arr) -} - -#[implicit_precedence(core::pedersen::Pedersen, core::RangeCheck, core::integer::Bitwise, core::ec::EcOp, core::poseidon::Poseidon, core::SegmentArena, core::circuit::RangeCheck96, core::circuit::AddMod, core::circuit::MulMod, core::gas::GasBuiltin, System)] -fn __wrapper__DojoEventImpl__tag(mut data: Span::) -> Span:: { - core::internal::require_implicit::(); - core::internal::revoke_ap_tracking(); - core::option::OptionTraitImpl::expect(core::gas::withdraw_gas(), 'Out of gas'); - - assert(core::array::SpanTrait::is_empty(data), 'Input too long for arguments'); - core::option::OptionTraitImpl::expect( - core::gas::withdraw_gas_all(core::gas::get_builtin_costs()), 'Out of gas', - ); - let mut contract_state = unsafe_new_contract_state(); - let res = DojoEventImpl::tag(@contract_state, ); - let mut arr = ArrayTrait::new(); - // References. - // Result. - core::serde::Serde::::serialize(@res, ref arr); - core::array::ArrayTrait::span(@arr) -} - -#[implicit_precedence(core::pedersen::Pedersen, core::RangeCheck, core::integer::Bitwise, core::ec::EcOp, core::poseidon::Poseidon, core::SegmentArena, core::circuit::RangeCheck96, core::circuit::AddMod, core::circuit::MulMod, core::gas::GasBuiltin, System)] -fn __wrapper__DojoEventImpl__version(mut data: Span::) -> Span:: { - core::internal::require_implicit::(); - core::internal::revoke_ap_tracking(); - core::option::OptionTraitImpl::expect(core::gas::withdraw_gas(), 'Out of gas'); - - assert(core::array::SpanTrait::is_empty(data), 'Input too long for arguments'); - core::option::OptionTraitImpl::expect( - core::gas::withdraw_gas_all(core::gas::get_builtin_costs()), 'Out of gas', - ); - let mut contract_state = unsafe_new_contract_state(); - let res = DojoEventImpl::version(@contract_state, ); - let mut arr = ArrayTrait::new(); - // References. - // Result. - core::serde::Serde::::serialize(@res, ref arr); - core::array::ArrayTrait::span(@arr) -} - -#[implicit_precedence(core::pedersen::Pedersen, core::RangeCheck, core::integer::Bitwise, core::ec::EcOp, core::poseidon::Poseidon, core::SegmentArena, core::circuit::RangeCheck96, core::circuit::AddMod, core::circuit::MulMod, core::gas::GasBuiltin, System)] -fn __wrapper__DojoEventImpl__selector(mut data: Span::) -> Span:: { - core::internal::require_implicit::(); - core::internal::revoke_ap_tracking(); - core::option::OptionTraitImpl::expect(core::gas::withdraw_gas(), 'Out of gas'); - - assert(core::array::SpanTrait::is_empty(data), 'Input too long for arguments'); - core::option::OptionTraitImpl::expect( - core::gas::withdraw_gas_all(core::gas::get_builtin_costs()), 'Out of gas', - ); - let mut contract_state = unsafe_new_contract_state(); - let res = DojoEventImpl::selector(@contract_state, ); - let mut arr = ArrayTrait::new(); - // References. - // Result. - core::serde::Serde::::serialize(@res, ref arr); - core::array::ArrayTrait::span(@arr) -} - -#[implicit_precedence(core::pedersen::Pedersen, core::RangeCheck, core::integer::Bitwise, core::ec::EcOp, core::poseidon::Poseidon, core::SegmentArena, core::circuit::RangeCheck96, core::circuit::AddMod, core::circuit::MulMod, core::gas::GasBuiltin, System)] -fn __wrapper__DojoEventImpl__name_hash(mut data: Span::) -> Span:: { - core::internal::require_implicit::(); - core::internal::revoke_ap_tracking(); - core::option::OptionTraitImpl::expect(core::gas::withdraw_gas(), 'Out of gas'); - - assert(core::array::SpanTrait::is_empty(data), 'Input too long for arguments'); - core::option::OptionTraitImpl::expect( - core::gas::withdraw_gas_all(core::gas::get_builtin_costs()), 'Out of gas', - ); - let mut contract_state = unsafe_new_contract_state(); - let res = DojoEventImpl::name_hash(@contract_state, ); - let mut arr = ArrayTrait::new(); - // References. - // Result. - core::serde::Serde::::serialize(@res, ref arr); - core::array::ArrayTrait::span(@arr) -} - -#[implicit_precedence(core::pedersen::Pedersen, core::RangeCheck, core::integer::Bitwise, core::ec::EcOp, core::poseidon::Poseidon, core::SegmentArena, core::circuit::RangeCheck96, core::circuit::AddMod, core::circuit::MulMod, core::gas::GasBuiltin, System)] -fn __wrapper__DojoEventImpl__namespace_hash(mut data: Span::) -> Span:: { - core::internal::require_implicit::(); - core::internal::revoke_ap_tracking(); - core::option::OptionTraitImpl::expect(core::gas::withdraw_gas(), 'Out of gas'); - - assert(core::array::SpanTrait::is_empty(data), 'Input too long for arguments'); - core::option::OptionTraitImpl::expect( - core::gas::withdraw_gas_all(core::gas::get_builtin_costs()), 'Out of gas', - ); - let mut contract_state = unsafe_new_contract_state(); - let res = DojoEventImpl::namespace_hash(@contract_state, ); - let mut arr = ArrayTrait::new(); - // References. - // Result. - core::serde::Serde::::serialize(@res, ref arr); - core::array::ArrayTrait::span(@arr) -} - -#[implicit_precedence(core::pedersen::Pedersen, core::RangeCheck, core::integer::Bitwise, core::ec::EcOp, core::poseidon::Poseidon, core::SegmentArena, core::circuit::RangeCheck96, core::circuit::AddMod, core::circuit::MulMod, core::gas::GasBuiltin, System)] -fn __wrapper__DojoEventImpl__definition(mut data: Span::) -> Span:: { - core::internal::require_implicit::(); - core::internal::revoke_ap_tracking(); - core::option::OptionTraitImpl::expect(core::gas::withdraw_gas(), 'Out of gas'); - - assert(core::array::SpanTrait::is_empty(data), 'Input too long for arguments'); - core::option::OptionTraitImpl::expect( - core::gas::withdraw_gas_all(core::gas::get_builtin_costs()), 'Out of gas', - ); - let mut contract_state = unsafe_new_contract_state(); - let res = DojoEventImpl::definition(@contract_state, ); - let mut arr = ArrayTrait::new(); - // References. - // Result. - core::serde::Serde::::serialize(@res, ref arr); - core::array::ArrayTrait::span(@arr) -} - -#[implicit_precedence(core::pedersen::Pedersen, core::RangeCheck, core::integer::Bitwise, core::ec::EcOp, core::poseidon::Poseidon, core::SegmentArena, core::circuit::RangeCheck96, core::circuit::AddMod, core::circuit::MulMod, core::gas::GasBuiltin, System)] -fn __wrapper__DojoEventImpl__layout(mut data: Span::) -> Span:: { - core::internal::require_implicit::(); - core::internal::revoke_ap_tracking(); - core::option::OptionTraitImpl::expect(core::gas::withdraw_gas(), 'Out of gas'); - - assert(core::array::SpanTrait::is_empty(data), 'Input too long for arguments'); - core::option::OptionTraitImpl::expect( - core::gas::withdraw_gas_all(core::gas::get_builtin_costs()), 'Out of gas', - ); - let mut contract_state = unsafe_new_contract_state(); - let res = DojoEventImpl::layout(@contract_state, ); - let mut arr = ArrayTrait::new(); - // References. - // Result. - core::serde::Serde::::serialize(@res, ref arr); - core::array::ArrayTrait::span(@arr) -} - -#[implicit_precedence(core::pedersen::Pedersen, core::RangeCheck, core::integer::Bitwise, core::ec::EcOp, core::poseidon::Poseidon, core::SegmentArena, core::circuit::RangeCheck96, core::circuit::AddMod, core::circuit::MulMod, core::gas::GasBuiltin, System)] -fn __wrapper__DojoEventImpl__schema(mut data: Span::) -> Span:: { - core::internal::require_implicit::(); - core::internal::revoke_ap_tracking(); - core::option::OptionTraitImpl::expect(core::gas::withdraw_gas(), 'Out of gas'); - - assert(core::array::SpanTrait::is_empty(data), 'Input too long for arguments'); - core::option::OptionTraitImpl::expect( - core::gas::withdraw_gas_all(core::gas::get_builtin_costs()), 'Out of gas', - ); - let mut contract_state = unsafe_new_contract_state(); - let res = DojoEventImpl::schema(@contract_state, ); - let mut arr = ArrayTrait::new(); - // References. - // Result. - core::serde::Serde::::serialize(@res, ref arr); - core::array::ArrayTrait::span(@arr) -} - - -pub mod __external { - pub use super::__wrapper__DojoEventImpl__name as name; - pub use super::__wrapper__DojoEventImpl__namespace as namespace; - pub use super::__wrapper__DojoEventImpl__tag as tag; - pub use super::__wrapper__DojoEventImpl__version as version; - pub use super::__wrapper__DojoEventImpl__selector as selector; - pub use super::__wrapper__DojoEventImpl__name_hash as name_hash; - pub use super::__wrapper__DojoEventImpl__namespace_hash as namespace_hash; - pub use super::__wrapper__DojoEventImpl__definition as definition; - pub use super::__wrapper__DojoEventImpl__layout as layout; - pub use super::__wrapper__DojoEventImpl__schema as schema; -} -pub mod __l1_handler { -} -pub mod __constructor { -} - impl ContractStateEventEmitter of starknet::event::EventEmitter< - ContractState, Event - > { - fn emit>( - ref self: ContractState, event: S - ) { - let event: Event = core::traits::Into::into(event); - let mut keys = Default::::default(); - let mut data = Default::::default(); - starknet::Event::append_keys_and_data(@event, ref keys, ref data); - starknet::SyscallResultTrait::unwrap_syscall( - starknet::syscalls::emit_event_syscall( - core::array::ArrayTrait::span(@keys), - core::array::ArrayTrait::span(@data), - ) - ) - } - } -impl EventDrop of core::traits::Drop::; -impl EventIsEvent of starknet::Event { - fn append_keys_and_data( - self: @Event, ref keys: Array, ref data: Array - ) { - match self { - } - } - fn deserialize( - ref keys: Span, ref data: Span, - ) -> Option { - let __selector__ = *core::array::SpanTrait::pop_front(ref keys)?; - Option::None - } -} -impl StorageStorageBaseDrop of core::traits::Drop::; -impl StorageStorageBaseCopy of core::traits::Copy::; -impl StorageStorageBaseMutDrop of core::traits::Drop::; -impl StorageStorageBaseMutCopy of core::traits::Copy::; -} - -impl MyEventNoHistoricalIntrospect<> of dojo::meta::introspect::Introspect> { - #[inline(always)] - fn size() -> Option { - Option::None - } - - fn layout() -> dojo::meta::Layout { - dojo::meta::Layout::Struct( - array![ - dojo::meta::FieldLayout { - selector: 1528802474226268325865027367859591458315299653151958663884057507666229546336, - layout: dojo::meta::introspect::Introspect::::layout() - } - ].span() - ) - } - - #[inline(always)] - fn ty() -> dojo::meta::introspect::Ty { - dojo::meta::introspect::Ty::Struct( - dojo::meta::introspect::Struct { - name: 'MyEventNoHistorical', - attrs: array![].span(), - children: array![ - dojo::meta::introspect::Member { - name: 'id', - attrs: array!['key'].span(), - ty: dojo::meta::introspect::Introspect::::ty() - }, -dojo::meta::introspect::Member { - name: 'name', - attrs: array![].span(), - ty: dojo::meta::introspect::Ty::ByteArray - } - - ].span() - } - ) - } -} - #[generate_trait] -pub impl MyEventNoHistoricalEmitterImpl of MyEventNoHistoricalEmitter { - fn emit(self: @MyEventNoHistorical, world: dojo::world::IWorldDispatcher) { - dojo::event::Event::::emit(self, world); - } -} - -pub impl MyEventNoHistoricalEventImpl of dojo::event::Event { - - fn emit(self: @MyEventNoHistorical, world: dojo::world::IWorldDispatcher) { - dojo::world::IWorldDispatcherTrait::emit_event( - world, - Self::selector(), - Self::keys(self), - Self::values(self), - Self::historical() - ); - } - - #[inline(always)] - fn name() -> ByteArray { - "MyEventNoHistorical" - } - - #[inline(always)] - fn namespace() -> ByteArray { - "dojo_test" - } - - #[inline(always)] - fn tag() -> ByteArray { - "dojo_test-MyEventNoHistorical" - } - - #[inline(always)] - fn version() -> u8 { - 1 - } - - #[inline(always)] - fn selector() -> felt252 { - 1337059065882820731687976087854228588833382671052971042794952278702302659992 - } - - #[inline(always)] - fn instance_selector(self: @MyEventNoHistorical) -> felt252 { - Self::selector() - } - - #[inline(always)] - fn name_hash() -> felt252 { - 900791686958237697199683333646433800101626975808368629569299817255472139882 - } - - #[inline(always)] - fn namespace_hash() -> felt252 { - 1452123528942907587532668415362544424816022573043154497385993678618948064048 - } - - #[inline(always)] - fn definition() -> dojo::event::EventDefinition { - dojo::event::EventDefinition { - name: Self::name(), - namespace: Self::namespace(), - namespace_selector: Self::namespace_hash(), - version: Self::version(), - layout: Self::layout(), - schema: Self::schema() - } - } - - #[inline(always)] - fn layout() -> dojo::meta::Layout { - dojo::meta::introspect::Introspect::::layout() - } - - #[inline(always)] - fn schema() -> dojo::meta::introspect::Ty { - dojo::meta::introspect::Introspect::::ty() - } - - #[inline(always)] - fn historical() -> bool { - false - } - - #[inline(always)] - fn keys(self: @MyEventNoHistorical) -> Span { - let mut serialized = core::array::ArrayTrait::new(); - core::serde::Serde::serialize(self.id, ref serialized); - - core::array::ArrayTrait::span(@serialized) - } - - #[inline(always)] - fn values(self: @MyEventNoHistorical) -> Span { - let mut serialized = core::array::ArrayTrait::new(); - core::serde::Serde::serialize(self.name, ref serialized); - - core::array::ArrayTrait::span(@serialized) - } -} - -#[starknet::contract] -pub mod my_event_no_historical { - use super::MyEventNoHistorical; - - #[abi(embed_v0)] - impl DojoEventImpl of dojo::event::IEvent{ - fn name(self: @ContractState) -> ByteArray { - "MyEventNoHistorical" - } - - fn namespace(self: @ContractState) -> ByteArray { - "dojo_test" - } - - fn tag(self: @ContractState) -> ByteArray { - "dojo_test-MyEventNoHistorical" - } - - fn version(self: @ContractState) -> u8 { - 1 - } - - fn selector(self: @ContractState) -> felt252 { - 1337059065882820731687976087854228588833382671052971042794952278702302659992 - } - - fn name_hash(self: @ContractState) -> felt252 { - 900791686958237697199683333646433800101626975808368629569299817255472139882 - } - - fn namespace_hash(self: @ContractState) -> felt252 { - 1452123528942907587532668415362544424816022573043154497385993678618948064048 - } - - fn definition(self: @ContractState) -> dojo::event::EventDefinition { - dojo::event::Event::::definition() - } - - fn layout(self: @ContractState) -> dojo::meta::Layout { - dojo::event::Event::::layout() - } - - fn schema(self: @ContractState) -> dojo::meta::introspect::Ty { - dojo::meta::introspect::Introspect::::ty() - } - } -#[event] -#[derive(Drop, starknet::Event)] -pub enum Event {} - - -#[phantom] -pub struct Storage { -} - -#[derive(Drop, Copy)] -pub struct StorageStorageBase { -} -impl StorageStorageImpl of starknet::storage::StorageTrait { - type BaseType = StorageStorageBase; - fn storage(self: starknet::storage::FlattenedStorage) -> StorageStorageBase { - StorageStorageBase { - } - } -} -#[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 ContractState { -} - -impl ContractStateDrop of Drop {} - -impl ContractStateDeref of core::ops::SnapshotDeref { - type Target = starknet::storage::FlattenedStorage; - fn snapshot_deref(self: @ContractState) -> starknet::storage::FlattenedStorage { - starknet::storage::FlattenedStorage {} - } -} -impl ContractStateDerefMut of core::ops::DerefMut { - type Target = starknet::storage::FlattenedStorage> ; - fn deref_mut(ref self: ContractState) -> starknet::storage::FlattenedStorage> { - starknet::storage::FlattenedStorage {} - } -} -pub fn unsafe_new_contract_state() -> ContractState { - ContractState { - } -} - -// TODO(Gil): This generates duplicate diagnostics because of the plugin system, squash the duplicates into one. -#[deprecated( - feature: "deprecated_legacy_map", - note: "Use `starknet::storage::Map` instead." -)] -#[allow(unused_imports)] -use starknet::storage::Map as LegacyMap; - -#[implicit_precedence(core::pedersen::Pedersen, core::RangeCheck, core::integer::Bitwise, core::ec::EcOp, core::poseidon::Poseidon, core::SegmentArena, core::circuit::RangeCheck96, core::circuit::AddMod, core::circuit::MulMod, core::gas::GasBuiltin, System)] -fn __wrapper__DojoEventImpl__name(mut data: Span::) -> Span:: { - core::internal::require_implicit::(); - core::internal::revoke_ap_tracking(); - core::option::OptionTraitImpl::expect(core::gas::withdraw_gas(), 'Out of gas'); - - assert(core::array::SpanTrait::is_empty(data), 'Input too long for arguments'); - core::option::OptionTraitImpl::expect( - core::gas::withdraw_gas_all(core::gas::get_builtin_costs()), 'Out of gas', - ); - let mut contract_state = unsafe_new_contract_state(); - let res = DojoEventImpl::name(@contract_state, ); - let mut arr = ArrayTrait::new(); - // References. - // Result. - core::serde::Serde::::serialize(@res, ref arr); - core::array::ArrayTrait::span(@arr) -} - -#[implicit_precedence(core::pedersen::Pedersen, core::RangeCheck, core::integer::Bitwise, core::ec::EcOp, core::poseidon::Poseidon, core::SegmentArena, core::circuit::RangeCheck96, core::circuit::AddMod, core::circuit::MulMod, core::gas::GasBuiltin, System)] -fn __wrapper__DojoEventImpl__namespace(mut data: Span::) -> Span:: { - core::internal::require_implicit::(); - core::internal::revoke_ap_tracking(); - core::option::OptionTraitImpl::expect(core::gas::withdraw_gas(), 'Out of gas'); - - assert(core::array::SpanTrait::is_empty(data), 'Input too long for arguments'); - core::option::OptionTraitImpl::expect( - core::gas::withdraw_gas_all(core::gas::get_builtin_costs()), 'Out of gas', - ); - let mut contract_state = unsafe_new_contract_state(); - let res = DojoEventImpl::namespace(@contract_state, ); - let mut arr = ArrayTrait::new(); - // References. - // Result. - core::serde::Serde::::serialize(@res, ref arr); - core::array::ArrayTrait::span(@arr) -} - -#[implicit_precedence(core::pedersen::Pedersen, core::RangeCheck, core::integer::Bitwise, core::ec::EcOp, core::poseidon::Poseidon, core::SegmentArena, core::circuit::RangeCheck96, core::circuit::AddMod, core::circuit::MulMod, core::gas::GasBuiltin, System)] -fn __wrapper__DojoEventImpl__tag(mut data: Span::) -> Span:: { - core::internal::require_implicit::(); - core::internal::revoke_ap_tracking(); - core::option::OptionTraitImpl::expect(core::gas::withdraw_gas(), 'Out of gas'); - - assert(core::array::SpanTrait::is_empty(data), 'Input too long for arguments'); - core::option::OptionTraitImpl::expect( - core::gas::withdraw_gas_all(core::gas::get_builtin_costs()), 'Out of gas', - ); - let mut contract_state = unsafe_new_contract_state(); - let res = DojoEventImpl::tag(@contract_state, ); - let mut arr = ArrayTrait::new(); - // References. - // Result. - core::serde::Serde::::serialize(@res, ref arr); - core::array::ArrayTrait::span(@arr) -} - -#[implicit_precedence(core::pedersen::Pedersen, core::RangeCheck, core::integer::Bitwise, core::ec::EcOp, core::poseidon::Poseidon, core::SegmentArena, core::circuit::RangeCheck96, core::circuit::AddMod, core::circuit::MulMod, core::gas::GasBuiltin, System)] -fn __wrapper__DojoEventImpl__version(mut data: Span::) -> Span:: { - core::internal::require_implicit::(); - core::internal::revoke_ap_tracking(); - core::option::OptionTraitImpl::expect(core::gas::withdraw_gas(), 'Out of gas'); - - assert(core::array::SpanTrait::is_empty(data), 'Input too long for arguments'); - core::option::OptionTraitImpl::expect( - core::gas::withdraw_gas_all(core::gas::get_builtin_costs()), 'Out of gas', - ); - let mut contract_state = unsafe_new_contract_state(); - let res = DojoEventImpl::version(@contract_state, ); - let mut arr = ArrayTrait::new(); - // References. - // Result. - core::serde::Serde::::serialize(@res, ref arr); - core::array::ArrayTrait::span(@arr) -} - -#[implicit_precedence(core::pedersen::Pedersen, core::RangeCheck, core::integer::Bitwise, core::ec::EcOp, core::poseidon::Poseidon, core::SegmentArena, core::circuit::RangeCheck96, core::circuit::AddMod, core::circuit::MulMod, core::gas::GasBuiltin, System)] -fn __wrapper__DojoEventImpl__selector(mut data: Span::) -> Span:: { - core::internal::require_implicit::(); - core::internal::revoke_ap_tracking(); - core::option::OptionTraitImpl::expect(core::gas::withdraw_gas(), 'Out of gas'); - - assert(core::array::SpanTrait::is_empty(data), 'Input too long for arguments'); - core::option::OptionTraitImpl::expect( - core::gas::withdraw_gas_all(core::gas::get_builtin_costs()), 'Out of gas', - ); - let mut contract_state = unsafe_new_contract_state(); - let res = DojoEventImpl::selector(@contract_state, ); - let mut arr = ArrayTrait::new(); - // References. - // Result. - core::serde::Serde::::serialize(@res, ref arr); - core::array::ArrayTrait::span(@arr) -} - -#[implicit_precedence(core::pedersen::Pedersen, core::RangeCheck, core::integer::Bitwise, core::ec::EcOp, core::poseidon::Poseidon, core::SegmentArena, core::circuit::RangeCheck96, core::circuit::AddMod, core::circuit::MulMod, core::gas::GasBuiltin, System)] -fn __wrapper__DojoEventImpl__name_hash(mut data: Span::) -> Span:: { - core::internal::require_implicit::(); - core::internal::revoke_ap_tracking(); - core::option::OptionTraitImpl::expect(core::gas::withdraw_gas(), 'Out of gas'); - - assert(core::array::SpanTrait::is_empty(data), 'Input too long for arguments'); - core::option::OptionTraitImpl::expect( - core::gas::withdraw_gas_all(core::gas::get_builtin_costs()), 'Out of gas', - ); - let mut contract_state = unsafe_new_contract_state(); - let res = DojoEventImpl::name_hash(@contract_state, ); - let mut arr = ArrayTrait::new(); - // References. - // Result. - core::serde::Serde::::serialize(@res, ref arr); - core::array::ArrayTrait::span(@arr) -} - -#[implicit_precedence(core::pedersen::Pedersen, core::RangeCheck, core::integer::Bitwise, core::ec::EcOp, core::poseidon::Poseidon, core::SegmentArena, core::circuit::RangeCheck96, core::circuit::AddMod, core::circuit::MulMod, core::gas::GasBuiltin, System)] -fn __wrapper__DojoEventImpl__namespace_hash(mut data: Span::) -> Span:: { - core::internal::require_implicit::(); - core::internal::revoke_ap_tracking(); - core::option::OptionTraitImpl::expect(core::gas::withdraw_gas(), 'Out of gas'); - - assert(core::array::SpanTrait::is_empty(data), 'Input too long for arguments'); - core::option::OptionTraitImpl::expect( - core::gas::withdraw_gas_all(core::gas::get_builtin_costs()), 'Out of gas', - ); - let mut contract_state = unsafe_new_contract_state(); - let res = DojoEventImpl::namespace_hash(@contract_state, ); - let mut arr = ArrayTrait::new(); - // References. - // Result. - core::serde::Serde::::serialize(@res, ref arr); - core::array::ArrayTrait::span(@arr) -} - -#[implicit_precedence(core::pedersen::Pedersen, core::RangeCheck, core::integer::Bitwise, core::ec::EcOp, core::poseidon::Poseidon, core::SegmentArena, core::circuit::RangeCheck96, core::circuit::AddMod, core::circuit::MulMod, core::gas::GasBuiltin, System)] -fn __wrapper__DojoEventImpl__definition(mut data: Span::) -> Span:: { - core::internal::require_implicit::(); - core::internal::revoke_ap_tracking(); - core::option::OptionTraitImpl::expect(core::gas::withdraw_gas(), 'Out of gas'); - - assert(core::array::SpanTrait::is_empty(data), 'Input too long for arguments'); - core::option::OptionTraitImpl::expect( - core::gas::withdraw_gas_all(core::gas::get_builtin_costs()), 'Out of gas', - ); - let mut contract_state = unsafe_new_contract_state(); - let res = DojoEventImpl::definition(@contract_state, ); - let mut arr = ArrayTrait::new(); - // References. - // Result. - core::serde::Serde::::serialize(@res, ref arr); - core::array::ArrayTrait::span(@arr) -} - -#[implicit_precedence(core::pedersen::Pedersen, core::RangeCheck, core::integer::Bitwise, core::ec::EcOp, core::poseidon::Poseidon, core::SegmentArena, core::circuit::RangeCheck96, core::circuit::AddMod, core::circuit::MulMod, core::gas::GasBuiltin, System)] -fn __wrapper__DojoEventImpl__layout(mut data: Span::) -> Span:: { - core::internal::require_implicit::(); - core::internal::revoke_ap_tracking(); - core::option::OptionTraitImpl::expect(core::gas::withdraw_gas(), 'Out of gas'); - - assert(core::array::SpanTrait::is_empty(data), 'Input too long for arguments'); - core::option::OptionTraitImpl::expect( - core::gas::withdraw_gas_all(core::gas::get_builtin_costs()), 'Out of gas', - ); - let mut contract_state = unsafe_new_contract_state(); - let res = DojoEventImpl::layout(@contract_state, ); - let mut arr = ArrayTrait::new(); - // References. - // Result. - core::serde::Serde::::serialize(@res, ref arr); - core::array::ArrayTrait::span(@arr) -} - -#[implicit_precedence(core::pedersen::Pedersen, core::RangeCheck, core::integer::Bitwise, core::ec::EcOp, core::poseidon::Poseidon, core::SegmentArena, core::circuit::RangeCheck96, core::circuit::AddMod, core::circuit::MulMod, core::gas::GasBuiltin, System)] -fn __wrapper__DojoEventImpl__schema(mut data: Span::) -> Span:: { - core::internal::require_implicit::(); - core::internal::revoke_ap_tracking(); - core::option::OptionTraitImpl::expect(core::gas::withdraw_gas(), 'Out of gas'); - - assert(core::array::SpanTrait::is_empty(data), 'Input too long for arguments'); - core::option::OptionTraitImpl::expect( - core::gas::withdraw_gas_all(core::gas::get_builtin_costs()), 'Out of gas', - ); - let mut contract_state = unsafe_new_contract_state(); - let res = DojoEventImpl::schema(@contract_state, ); - let mut arr = ArrayTrait::new(); - // References. - // Result. - core::serde::Serde::::serialize(@res, ref arr); - core::array::ArrayTrait::span(@arr) -} - - -pub mod __external { - pub use super::__wrapper__DojoEventImpl__name as name; - pub use super::__wrapper__DojoEventImpl__namespace as namespace; - pub use super::__wrapper__DojoEventImpl__tag as tag; - pub use super::__wrapper__DojoEventImpl__version as version; - pub use super::__wrapper__DojoEventImpl__selector as selector; - pub use super::__wrapper__DojoEventImpl__name_hash as name_hash; - pub use super::__wrapper__DojoEventImpl__namespace_hash as namespace_hash; - pub use super::__wrapper__DojoEventImpl__definition as definition; - pub use super::__wrapper__DojoEventImpl__layout as layout; - pub use super::__wrapper__DojoEventImpl__schema as schema; -} -pub mod __l1_handler { -} -pub mod __constructor { -} - impl ContractStateEventEmitter of starknet::event::EventEmitter< - ContractState, Event - > { - fn emit>( - ref self: ContractState, event: S - ) { - let event: Event = core::traits::Into::into(event); - let mut keys = Default::::default(); - let mut data = Default::::default(); - starknet::Event::append_keys_and_data(@event, ref keys, ref data); - starknet::SyscallResultTrait::unwrap_syscall( - starknet::syscalls::emit_event_syscall( - core::array::ArrayTrait::span(@keys), - core::array::ArrayTrait::span(@data), - ) - ) - } - } -impl EventDrop of core::traits::Drop::; -impl EventIsEvent of starknet::Event { - fn append_keys_and_data( - self: @Event, ref keys: Array, ref data: Array - ) { - match self { - } - } - fn deserialize( - ref keys: Span, ref data: Span, - ) -> Option { - let __selector__ = *core::array::SpanTrait::pop_front(ref keys)?; - Option::None - } -} -impl StorageStorageBaseDrop of core::traits::Drop::; -impl StorageStorageBaseCopy of core::traits::Copy::; -impl StorageStorageBaseMutDrop of core::traits::Drop::; -impl StorageStorageBaseMutCopy of core::traits::Copy::; -} - pub trait MessageEmitter { - fn emit(self: @Message, world: dojo::world::IWorldDispatcher); -} - pub trait MyEventWithNamespaceEmitter { - fn emit(self: @MyEventWithNamespace, world: dojo::world::IWorldDispatcher); -} - pub trait MyEventNoHistoricalEmitter { - fn emit(self: @MyEventNoHistorical, world: dojo::world::IWorldDispatcher); -} - -//! > expected_diagnostics diff --git a/crates/dojo/lang/src/plugin_test_data/introspect b/crates/dojo/lang/src/plugin_test_data/introspect deleted file mode 100644 index bdbc6724dd..0000000000 --- a/crates/dojo/lang/src/plugin_test_data/introspect +++ /dev/null @@ -1,2944 +0,0 @@ -//! > Test expansion of the derive(Introspect). - -//! > test_runner_name -test_expand_plugin - -//! > test_id -introspect - -//! > cairo_code -use core::serde::Serde; - -#[derive(Copy, Drop, Serde, Introspect)] -struct Vec2 { - x: u32, - y: u32 -} - -#[derive(Serde, Copy, Drop, Introspect)] -enum PlainEnum { - Left, - Right, -} - -#[derive(Serde, Copy, Drop, Introspect)] -enum EnumWithPrimitive { - Left: u32, - Right: u32, -} - -#[derive(Serde, Copy, Drop, Introspect)] -enum EnumWithStruct { - Left: Vec2, - Right: Vec2, -} - -#[derive(Serde, Copy, Drop, Introspect)] -enum EnumWithSimpleArray { - Left: Array, - Right: Array, -} - -#[derive(Serde, Copy, Drop, Introspect)] -enum EnumWithByteArray { - Left: ByteArray, - Right: ByteArray, -} - -#[derive(Serde, Copy, Drop, Introspect)] -enum EnumWithSimpleTuple { - Left: (u8, u256), - Right: (u8, u256), -} - -#[derive(Serde, Copy, Drop, Introspect)] -enum EnumWithComplexTuple { - Left: (u8, Vec2), - Right: (u8, Vec2), -} - -#[derive(Serde, Copy, Drop, Introspect)] -enum EnumWithPrimitive { - Left: u32, - Right: u32, -} - -#[derive(Serde, Copy, Drop, Introspect)] -enum EnumCustom { - Left: Vec2, - Right: Vec2, -} - -#[derive(Serde, Copy, Drop, Introspect)] -enum EnumTupleMix { - Left: (Vec2, u64, EnumCustom), - Right: (Vec2, u64, EnumCustom), -} - -#[derive(Serde, Copy, Drop, Introspect)] -enum EnumWithDifferentVariantData { - One, - Two: u32, - Three: (Vec2, u64), -} - -#[derive(Copy, Drop, Introspect)] -struct StructWithPrimitives { - #[key] - player: ContractAddress, - before: u8, - after: u16, -} - -#[derive(Copy, Drop, Introspect)] -struct StructWithStruct { - #[key] - player: ContractAddress, - before: u8, - after: Vec2, -} - -#[derive(Copy, Drop, Introspect)] -struct StructWithSimpleArray { - #[key] - player: ContractAddress, - before: u8, - after: Array, -} - -#[derive(Copy, Drop, Introspect)] -struct StructWithByteArray { - #[key] - player: ContractAddress, - before: u8, - after: ByteArray, -} - -#[derive(Copy, Drop, Introspect)] -struct StructWithComplexArray { - #[key] - player: ContractAddress, - before: u8, - after: Array, -} - -#[derive(Copy, Drop, Introspect)] -struct StructWithSimpleTuple { - #[key] - player: ContractAddress, - before: u8, - after: (u8, u256), -} - -#[derive(Copy, Drop, Introspect)] -struct StructWithComplexTuple { - #[key] - player: ContractAddress, - before: u8, - after: (u8, Vec2, EnumCustom), -} - -#[derive(Copy, Drop, Introspect)] -struct StructWithNestedArrays { - #[key] - player: ContractAddress, - before: u8, - after: Array>>, -} - -#[derive(Copy, Drop, Introspect)] -struct StructWithNestedTuples { - #[key] - player: ContractAddress, - before: u8, - after: ((u8, u32), (Vec2, EnumCustom)), -} - -#[derive(Copy, Drop, Introspect)] -struct StructWithNestedTuplesAndByteArray { - #[key] - player: ContractAddress, - before: u8, - after: ((u8, u32), (Vec2, ByteArray)), -} - -#[derive(Copy, Drop, Introspect)] -struct StructWithNestedEverything { - #[key] - player: ContractAddress, - before: u8, - after: ((u8, u32), (Vec2, EnumCustom), (Array<(u32, Vec2)>, EnumCustom), (u16,)) -} - -#[derive(Copy, Drop, Serde, Introspect)] -struct GenericStruct { - t: T, -} - -#[derive(Copy, Drop, Serde, Introspect)] -struct StructWithBadOption { - x: Option<(u8, u16)> -} - -#[derive(Copy, Drop, Serde, Introspect)] -enum EnumWithBadOption { - first: Option<(u8, u16)>, -} - -#[derive(Introspect, IntrospectPacked)] -enum EnumIncompatibleAttrs {} - -#[derive(Introspect, IntrospectPacked)] -struct StructIncompatibleAttrs {} - -#[derive(Introspect)] -#[derive(IntrospectPacked)] -struct StructIncompatibleAttrs2 {} - -#[derive(Introspect)] -#[derive(IntrospectPacked)] -enum EnumIncompatibleAttrs2 {} - -#[derive(IntrospectPacked)] -struct StructPacked1 { - x: u8 -} - -#[derive(IntrospectPacked)] -struct StructPacked2 { - x: u8, - y: u256 -} - -#[derive(IntrospectPacked)] -struct StructPacked3 { - x: u256, - y: (u8, u32) -} - -#[derive(IntrospectPacked)] -struct StructNotPackable1 { - x: u8, - y: Array -} - -#[derive(IntrospectPacked)] -struct StructPackableWithInnerPacked { - x: u8, - y: StructPacked1 -} - -#[derive(IntrospectPacked)] -enum EnumPacked1 { - a, - b, - c -} - -#[derive(IntrospectPacked)] -enum EnumPacked2 { - a: u8, - b: u8, - c: u8 -} - -#[derive(IntrospectPacked)] -enum EnumPacked3 { - a: (u128, u128), - b: u256, -} - - -#[derive(IntrospectPacked)] -enum EnumPackableWithInnerPacked { - a: StructPacked1, - b: StructPacked1, -} - -#[derive(IntrospectPacked)] -enum EnumNotPackable1 { - a: u8, - b: u256, -} - -//! > expanded_cairo_code -use core::serde::Serde; - -#[derive(Copy, Drop, Serde, Introspect)] -struct Vec2 { - x: u32, - y: u32 -} - -#[derive(Serde, Copy, Drop, Introspect)] -enum PlainEnum { - Left, - Right, -} - -#[derive(Serde, Copy, Drop, Introspect)] -enum EnumWithPrimitive { - Left: u32, - Right: u32, -} - -#[derive(Serde, Copy, Drop, Introspect)] -enum EnumWithStruct { - Left: Vec2, - Right: Vec2, -} - -#[derive(Serde, Copy, Drop, Introspect)] -enum EnumWithSimpleArray { - Left: Array, - Right: Array, -} - -#[derive(Serde, Copy, Drop, Introspect)] -enum EnumWithByteArray { - Left: ByteArray, - Right: ByteArray, -} - -#[derive(Serde, Copy, Drop, Introspect)] -enum EnumWithSimpleTuple { - Left: (u8, u256), - Right: (u8, u256), -} - -#[derive(Serde, Copy, Drop, Introspect)] -enum EnumWithComplexTuple { - Left: (u8, Vec2), - Right: (u8, Vec2), -} - -#[derive(Serde, Copy, Drop, Introspect)] -enum EnumWithPrimitive { - Left: u32, - Right: u32, -} - -#[derive(Serde, Copy, Drop, Introspect)] -enum EnumCustom { - Left: Vec2, - Right: Vec2, -} - -#[derive(Serde, Copy, Drop, Introspect)] -enum EnumTupleMix { - Left: (Vec2, u64, EnumCustom), - Right: (Vec2, u64, EnumCustom), -} - -#[derive(Serde, Copy, Drop, Introspect)] -enum EnumWithDifferentVariantData { - One, - Two: u32, - Three: (Vec2, u64), -} - -#[derive(Copy, Drop, Introspect)] -struct StructWithPrimitives { - #[key] - player: ContractAddress, - before: u8, - after: u16, -} - -#[derive(Copy, Drop, Introspect)] -struct StructWithStruct { - #[key] - player: ContractAddress, - before: u8, - after: Vec2, -} - -#[derive(Copy, Drop, Introspect)] -struct StructWithSimpleArray { - #[key] - player: ContractAddress, - before: u8, - after: Array, -} - -#[derive(Copy, Drop, Introspect)] -struct StructWithByteArray { - #[key] - player: ContractAddress, - before: u8, - after: ByteArray, -} - -#[derive(Copy, Drop, Introspect)] -struct StructWithComplexArray { - #[key] - player: ContractAddress, - before: u8, - after: Array, -} - -#[derive(Copy, Drop, Introspect)] -struct StructWithSimpleTuple { - #[key] - player: ContractAddress, - before: u8, - after: (u8, u256), -} - -#[derive(Copy, Drop, Introspect)] -struct StructWithComplexTuple { - #[key] - player: ContractAddress, - before: u8, - after: (u8, Vec2, EnumCustom), -} - -#[derive(Copy, Drop, Introspect)] -struct StructWithNestedArrays { - #[key] - player: ContractAddress, - before: u8, - after: Array>>, -} - -#[derive(Copy, Drop, Introspect)] -struct StructWithNestedTuples { - #[key] - player: ContractAddress, - before: u8, - after: ((u8, u32), (Vec2, EnumCustom)), -} - -#[derive(Copy, Drop, Introspect)] -struct StructWithNestedTuplesAndByteArray { - #[key] - player: ContractAddress, - before: u8, - after: ((u8, u32), (Vec2, ByteArray)), -} - -#[derive(Copy, Drop, Introspect)] -struct StructWithNestedEverything { - #[key] - player: ContractAddress, - before: u8, - after: ((u8, u32), (Vec2, EnumCustom), (Array<(u32, Vec2)>, EnumCustom), (u16,)) -} - -#[derive(Copy, Drop, Serde, Introspect)] -struct GenericStruct { - t: T, -} - -#[derive(Copy, Drop, Serde, Introspect)] -struct StructWithBadOption { - x: Option<(u8, u16)> -} - -#[derive(Copy, Drop, Serde, Introspect)] -enum EnumWithBadOption { - first: Option<(u8, u16)>, -} - -#[derive(Introspect, IntrospectPacked)] -enum EnumIncompatibleAttrs {} - -#[derive(Introspect, IntrospectPacked)] -struct StructIncompatibleAttrs {} - -#[derive(Introspect)] -#[derive(IntrospectPacked)] -struct StructIncompatibleAttrs2 {} - -#[derive(Introspect)] -#[derive(IntrospectPacked)] -enum EnumIncompatibleAttrs2 {} - -#[derive(IntrospectPacked)] -struct StructPacked1 { - x: u8 -} - -#[derive(IntrospectPacked)] -struct StructPacked2 { - x: u8, - y: u256 -} - -#[derive(IntrospectPacked)] -struct StructPacked3 { - x: u256, - y: (u8, u32) -} - -#[derive(IntrospectPacked)] -struct StructNotPackable1 { - x: u8, - y: Array -} - -#[derive(IntrospectPacked)] -struct StructPackableWithInnerPacked { - x: u8, - y: StructPacked1 -} - -#[derive(IntrospectPacked)] -enum EnumPacked1 { - a, - b, - c -} - -#[derive(IntrospectPacked)] -enum EnumPacked2 { - a: u8, - b: u8, - c: u8 -} - -#[derive(IntrospectPacked)] -enum EnumPacked3 { - a: (u128, u128), - b: u256, -} - - -#[derive(IntrospectPacked)] -enum EnumPackableWithInnerPacked { - a: StructPacked1, - b: StructPacked1, -} - -#[derive(IntrospectPacked)] -enum EnumNotPackable1 { - a: u8, - b: u256, -}impl Vec2Copy of core::traits::Copy::; -impl Vec2Drop of core::traits::Drop::; -impl Vec2Serde of core::serde::Serde:: { - fn serialize(self: @Vec2, ref output: core::array::Array) { - core::serde::Serde::serialize(self.x, ref output); - core::serde::Serde::serialize(self.y, ref output) - } - fn deserialize(ref serialized: core::array::Span) -> core::option::Option { - core::option::Option::Some(Vec2 { - x: core::serde::Serde::deserialize(ref serialized)?, - y: core::serde::Serde::deserialize(ref serialized)?, - }) - } -} - -impl Vec2Introspect<> of dojo::meta::introspect::Introspect> { - #[inline(always)] - fn size() -> Option { - Option::Some(2) - } - - fn layout() -> dojo::meta::Layout { - dojo::meta::Layout::Struct( - array![ - dojo::meta::FieldLayout { - selector: 512066735765477566404754172672287371265995314501343422459174036873487219331, - layout: dojo::meta::introspect::Introspect::::layout() - }, -dojo::meta::FieldLayout { - selector: 1591024729085637502504777720563487898377940395575083379770417352976841400819, - layout: dojo::meta::introspect::Introspect::::layout() - } - ].span() - ) - } - - #[inline(always)] - fn ty() -> dojo::meta::introspect::Ty { - dojo::meta::introspect::Ty::Struct( - dojo::meta::introspect::Struct { - name: 'Vec2', - attrs: array![].span(), - children: array![ - dojo::meta::introspect::Member { - name: 'x', - attrs: array![].span(), - ty: dojo::meta::introspect::Introspect::::ty() - }, -dojo::meta::introspect::Member { - name: 'y', - attrs: array![].span(), - ty: dojo::meta::introspect::Introspect::::ty() - } - - ].span() - } - ) - } -} -impl PlainEnumSerde of core::serde::Serde:: { - fn serialize(self: @PlainEnum, ref output: core::array::Array) { - match self { - PlainEnum::Left(x) => { core::serde::Serde::serialize(@0, ref output); core::serde::Serde::serialize(x, ref output); }, - PlainEnum::Right(x) => { core::serde::Serde::serialize(@1, ref output); core::serde::Serde::serialize(x, ref output); }, - } - } - fn deserialize(ref serialized: core::array::Span) -> core::option::Option { - let idx: felt252 = core::serde::Serde::deserialize(ref serialized)?; - core::option::Option::Some( - match idx { - 0 => PlainEnum::Left(core::serde::Serde::deserialize(ref serialized)?), - 1 => PlainEnum::Right(core::serde::Serde::deserialize(ref serialized)?), - _ => { return core::option::Option::None; } - } - ) - } -} -impl PlainEnumCopy of core::traits::Copy::; -impl PlainEnumDrop of core::traits::Drop::; - -impl PlainEnumIntrospect<> of dojo::meta::introspect::Introspect> { - #[inline(always)] - fn size() -> Option { - Option::Some(1) - } - - fn layout() -> dojo::meta::Layout { - dojo::meta::Layout::Enum( - array![ - dojo::meta::FieldLayout { - selector: 0, - layout: dojo::meta::Layout::Fixed(array![].span()) - }, -dojo::meta::FieldLayout { - selector: 1, - layout: dojo::meta::Layout::Fixed(array![].span()) - } - ].span() - ) - } - - #[inline(always)] - fn ty() -> dojo::meta::introspect::Ty { - dojo::meta::introspect::Ty::Enum( - dojo::meta::introspect::Enum { - name: 'PlainEnum', - attrs: array![].span(), - children: array![ - ('Left', dojo::meta::introspect::Ty::Tuple(array![].span())), -('Right', dojo::meta::introspect::Ty::Tuple(array![].span())) - - ].span() - } - ) - } -} -impl EnumWithPrimitiveSerde of core::serde::Serde:: { - fn serialize(self: @EnumWithPrimitive, ref output: core::array::Array) { - match self { - EnumWithPrimitive::Left(x) => { core::serde::Serde::serialize(@0, ref output); core::serde::Serde::serialize(x, ref output); }, - EnumWithPrimitive::Right(x) => { core::serde::Serde::serialize(@1, ref output); core::serde::Serde::serialize(x, ref output); }, - } - } - fn deserialize(ref serialized: core::array::Span) -> core::option::Option { - let idx: felt252 = core::serde::Serde::deserialize(ref serialized)?; - core::option::Option::Some( - match idx { - 0 => EnumWithPrimitive::Left(core::serde::Serde::deserialize(ref serialized)?), - 1 => EnumWithPrimitive::Right(core::serde::Serde::deserialize(ref serialized)?), - _ => { return core::option::Option::None; } - } - ) - } -} -impl EnumWithPrimitiveCopy of core::traits::Copy::; -impl EnumWithPrimitiveDrop of core::traits::Drop::; - -impl EnumWithPrimitiveIntrospect<> of dojo::meta::introspect::Introspect> { - #[inline(always)] - fn size() -> Option { - Option::Some(2) - } - - fn layout() -> dojo::meta::Layout { - dojo::meta::Layout::Enum( - array![ - dojo::meta::FieldLayout { - selector: 0, - layout: dojo::meta::introspect::Introspect::::layout() - }, -dojo::meta::FieldLayout { - selector: 1, - layout: dojo::meta::introspect::Introspect::::layout() - } - ].span() - ) - } - - #[inline(always)] - fn ty() -> dojo::meta::introspect::Ty { - dojo::meta::introspect::Ty::Enum( - dojo::meta::introspect::Enum { - name: 'EnumWithPrimitive', - attrs: array![].span(), - children: array![ - ('Left', dojo::meta::introspect::Introspect::::ty()), -('Right', dojo::meta::introspect::Introspect::::ty()) - - ].span() - } - ) - } -} -impl EnumWithStructSerde of core::serde::Serde:: { - fn serialize(self: @EnumWithStruct, ref output: core::array::Array) { - match self { - EnumWithStruct::Left(x) => { core::serde::Serde::serialize(@0, ref output); core::serde::Serde::serialize(x, ref output); }, - EnumWithStruct::Right(x) => { core::serde::Serde::serialize(@1, ref output); core::serde::Serde::serialize(x, ref output); }, - } - } - fn deserialize(ref serialized: core::array::Span) -> core::option::Option { - let idx: felt252 = core::serde::Serde::deserialize(ref serialized)?; - core::option::Option::Some( - match idx { - 0 => EnumWithStruct::Left(core::serde::Serde::deserialize(ref serialized)?), - 1 => EnumWithStruct::Right(core::serde::Serde::deserialize(ref serialized)?), - _ => { return core::option::Option::None; } - } - ) - } -} -impl EnumWithStructCopy of core::traits::Copy::; -impl EnumWithStructDrop of core::traits::Drop::; - -impl EnumWithStructIntrospect<> of dojo::meta::introspect::Introspect> { - #[inline(always)] - fn size() -> Option { - let sizes : Array> = array![ - dojo::meta::introspect::Introspect::::size(), -Option::Some(1) - ]; - - if dojo::utils::any_none(@sizes) { - return Option::None; - } - Option::Some(dojo::utils::sum(sizes)) - - } - - fn layout() -> dojo::meta::Layout { - dojo::meta::Layout::Enum( - array![ - dojo::meta::FieldLayout { - selector: 0, - layout: dojo::meta::introspect::Introspect::::layout() - }, -dojo::meta::FieldLayout { - selector: 1, - layout: dojo::meta::introspect::Introspect::::layout() - } - ].span() - ) - } - - #[inline(always)] - fn ty() -> dojo::meta::introspect::Ty { - dojo::meta::introspect::Ty::Enum( - dojo::meta::introspect::Enum { - name: 'EnumWithStruct', - attrs: array![].span(), - children: array![ - ('Left', dojo::meta::introspect::Introspect::::ty()), -('Right', dojo::meta::introspect::Introspect::::ty()) - - ].span() - } - ) - } -} -impl EnumWithSimpleArraySerde of core::serde::Serde:: { - fn serialize(self: @EnumWithSimpleArray, ref output: core::array::Array) { - match self { - EnumWithSimpleArray::Left(x) => { core::serde::Serde::serialize(@0, ref output); core::serde::Serde::serialize(x, ref output); }, - EnumWithSimpleArray::Right(x) => { core::serde::Serde::serialize(@1, ref output); core::serde::Serde::serialize(x, ref output); }, - } - } - fn deserialize(ref serialized: core::array::Span) -> core::option::Option { - let idx: felt252 = core::serde::Serde::deserialize(ref serialized)?; - core::option::Option::Some( - match idx { - 0 => EnumWithSimpleArray::Left(core::serde::Serde::deserialize(ref serialized)?), - 1 => EnumWithSimpleArray::Right(core::serde::Serde::deserialize(ref serialized)?), - _ => { return core::option::Option::None; } - } - ) - } -} -impl EnumWithSimpleArrayCopy of core::traits::Copy::; -impl EnumWithSimpleArrayDrop of core::traits::Drop::; - -impl EnumWithSimpleArrayIntrospect<> of dojo::meta::introspect::Introspect> { - #[inline(always)] - fn size() -> Option { - Option::None - } - - fn layout() -> dojo::meta::Layout { - dojo::meta::Layout::Enum( - array![ - dojo::meta::FieldLayout { - selector: 0, - layout: dojo::meta::introspect::Introspect::>::layout() - }, -dojo::meta::FieldLayout { - selector: 1, - layout: dojo::meta::introspect::Introspect::>::layout() - } - ].span() - ) - } - - #[inline(always)] - fn ty() -> dojo::meta::introspect::Ty { - dojo::meta::introspect::Ty::Enum( - dojo::meta::introspect::Enum { - name: 'EnumWithSimpleArray', - attrs: array![].span(), - children: array![ - ('Left', dojo::meta::introspect::Ty::Array( - array![ - dojo::meta::introspect::Introspect::::ty() - ].span() - )), -('Right', dojo::meta::introspect::Ty::Array( - array![ - dojo::meta::introspect::Introspect::::ty() - ].span() - )) - - ].span() - } - ) - } -} -impl EnumWithByteArraySerde of core::serde::Serde:: { - fn serialize(self: @EnumWithByteArray, ref output: core::array::Array) { - match self { - EnumWithByteArray::Left(x) => { core::serde::Serde::serialize(@0, ref output); core::serde::Serde::serialize(x, ref output); }, - EnumWithByteArray::Right(x) => { core::serde::Serde::serialize(@1, ref output); core::serde::Serde::serialize(x, ref output); }, - } - } - fn deserialize(ref serialized: core::array::Span) -> core::option::Option { - let idx: felt252 = core::serde::Serde::deserialize(ref serialized)?; - core::option::Option::Some( - match idx { - 0 => EnumWithByteArray::Left(core::serde::Serde::deserialize(ref serialized)?), - 1 => EnumWithByteArray::Right(core::serde::Serde::deserialize(ref serialized)?), - _ => { return core::option::Option::None; } - } - ) - } -} -impl EnumWithByteArrayCopy of core::traits::Copy::; -impl EnumWithByteArrayDrop of core::traits::Drop::; - -impl EnumWithByteArrayIntrospect<> of dojo::meta::introspect::Introspect> { - #[inline(always)] - fn size() -> Option { - Option::None - } - - fn layout() -> dojo::meta::Layout { - dojo::meta::Layout::Enum( - array![ - dojo::meta::FieldLayout { - selector: 0, - layout: dojo::meta::introspect::Introspect::::layout() - }, -dojo::meta::FieldLayout { - selector: 1, - layout: dojo::meta::introspect::Introspect::::layout() - } - ].span() - ) - } - - #[inline(always)] - fn ty() -> dojo::meta::introspect::Ty { - dojo::meta::introspect::Ty::Enum( - dojo::meta::introspect::Enum { - name: 'EnumWithByteArray', - attrs: array![].span(), - children: array![ - ('Left', dojo::meta::introspect::Ty::ByteArray), -('Right', dojo::meta::introspect::Ty::ByteArray) - - ].span() - } - ) - } -} -impl EnumWithSimpleTupleSerde of core::serde::Serde:: { - fn serialize(self: @EnumWithSimpleTuple, ref output: core::array::Array) { - match self { - EnumWithSimpleTuple::Left(x) => { core::serde::Serde::serialize(@0, ref output); core::serde::Serde::serialize(x, ref output); }, - EnumWithSimpleTuple::Right(x) => { core::serde::Serde::serialize(@1, ref output); core::serde::Serde::serialize(x, ref output); }, - } - } - fn deserialize(ref serialized: core::array::Span) -> core::option::Option { - let idx: felt252 = core::serde::Serde::deserialize(ref serialized)?; - core::option::Option::Some( - match idx { - 0 => EnumWithSimpleTuple::Left(core::serde::Serde::deserialize(ref serialized)?), - 1 => EnumWithSimpleTuple::Right(core::serde::Serde::deserialize(ref serialized)?), - _ => { return core::option::Option::None; } - } - ) - } -} -impl EnumWithSimpleTupleCopy of core::traits::Copy::; -impl EnumWithSimpleTupleDrop of core::traits::Drop::; - -impl EnumWithSimpleTupleIntrospect<> of dojo::meta::introspect::Introspect> { - #[inline(always)] - fn size() -> Option { - Option::Some(4) - } - - fn layout() -> dojo::meta::Layout { - dojo::meta::Layout::Enum( - array![ - dojo::meta::FieldLayout { - selector: 0, - layout: dojo::meta::Layout::Tuple( - array![ - dojo::meta::introspect::Introspect::::layout(), -dojo::meta::introspect::Introspect::::layout() - ].span() - ) - }, -dojo::meta::FieldLayout { - selector: 1, - layout: dojo::meta::Layout::Tuple( - array![ - dojo::meta::introspect::Introspect::::layout(), -dojo::meta::introspect::Introspect::::layout() - ].span() - ) - } - ].span() - ) - } - - #[inline(always)] - fn ty() -> dojo::meta::introspect::Ty { - dojo::meta::introspect::Ty::Enum( - dojo::meta::introspect::Enum { - name: 'EnumWithSimpleTuple', - attrs: array![].span(), - children: array![ - ('Left', dojo::meta::introspect::Ty::Tuple( - array![ - dojo::meta::introspect::Introspect::::ty(), -dojo::meta::introspect::Introspect::::ty() - ].span() - )), -('Right', dojo::meta::introspect::Ty::Tuple( - array![ - dojo::meta::introspect::Introspect::::ty(), -dojo::meta::introspect::Introspect::::ty() - ].span() - )) - - ].span() - } - ) - } -} -impl EnumWithComplexTupleSerde of core::serde::Serde:: { - fn serialize(self: @EnumWithComplexTuple, ref output: core::array::Array) { - match self { - EnumWithComplexTuple::Left(x) => { core::serde::Serde::serialize(@0, ref output); core::serde::Serde::serialize(x, ref output); }, - EnumWithComplexTuple::Right(x) => { core::serde::Serde::serialize(@1, ref output); core::serde::Serde::serialize(x, ref output); }, - } - } - fn deserialize(ref serialized: core::array::Span) -> core::option::Option { - let idx: felt252 = core::serde::Serde::deserialize(ref serialized)?; - core::option::Option::Some( - match idx { - 0 => EnumWithComplexTuple::Left(core::serde::Serde::deserialize(ref serialized)?), - 1 => EnumWithComplexTuple::Right(core::serde::Serde::deserialize(ref serialized)?), - _ => { return core::option::Option::None; } - } - ) - } -} -impl EnumWithComplexTupleCopy of core::traits::Copy::; -impl EnumWithComplexTupleDrop of core::traits::Drop::; - -impl EnumWithComplexTupleIntrospect<> of dojo::meta::introspect::Introspect> { - #[inline(always)] - fn size() -> Option { - let sizes : Array> = array![ - dojo::meta::introspect::Introspect::::size(), -Option::Some(2) - ]; - - if dojo::utils::any_none(@sizes) { - return Option::None; - } - Option::Some(dojo::utils::sum(sizes)) - - } - - fn layout() -> dojo::meta::Layout { - dojo::meta::Layout::Enum( - array![ - dojo::meta::FieldLayout { - selector: 0, - layout: dojo::meta::Layout::Tuple( - array![ - dojo::meta::introspect::Introspect::::layout(), -dojo::meta::introspect::Introspect::::layout() - ].span() - ) - }, -dojo::meta::FieldLayout { - selector: 1, - layout: dojo::meta::Layout::Tuple( - array![ - dojo::meta::introspect::Introspect::::layout(), -dojo::meta::introspect::Introspect::::layout() - ].span() - ) - } - ].span() - ) - } - - #[inline(always)] - fn ty() -> dojo::meta::introspect::Ty { - dojo::meta::introspect::Ty::Enum( - dojo::meta::introspect::Enum { - name: 'EnumWithComplexTuple', - attrs: array![].span(), - children: array![ - ('Left', dojo::meta::introspect::Ty::Tuple( - array![ - dojo::meta::introspect::Introspect::::ty(), -dojo::meta::introspect::Introspect::::ty() - ].span() - )), -('Right', dojo::meta::introspect::Ty::Tuple( - array![ - dojo::meta::introspect::Introspect::::ty(), -dojo::meta::introspect::Introspect::::ty() - ].span() - )) - - ].span() - } - ) - } -} -impl EnumWithPrimitiveSerde of core::serde::Serde:: { - fn serialize(self: @EnumWithPrimitive, ref output: core::array::Array) { - match self { - EnumWithPrimitive::Left(x) => { core::serde::Serde::serialize(@0, ref output); core::serde::Serde::serialize(x, ref output); }, - EnumWithPrimitive::Right(x) => { core::serde::Serde::serialize(@1, ref output); core::serde::Serde::serialize(x, ref output); }, - } - } - fn deserialize(ref serialized: core::array::Span) -> core::option::Option { - let idx: felt252 = core::serde::Serde::deserialize(ref serialized)?; - core::option::Option::Some( - match idx { - 0 => EnumWithPrimitive::Left(core::serde::Serde::deserialize(ref serialized)?), - 1 => EnumWithPrimitive::Right(core::serde::Serde::deserialize(ref serialized)?), - _ => { return core::option::Option::None; } - } - ) - } -} -impl EnumWithPrimitiveCopy of core::traits::Copy::; -impl EnumWithPrimitiveDrop of core::traits::Drop::; - -impl EnumWithPrimitiveIntrospect<> of dojo::meta::introspect::Introspect> { - #[inline(always)] - fn size() -> Option { - Option::Some(2) - } - - fn layout() -> dojo::meta::Layout { - dojo::meta::Layout::Enum( - array![ - dojo::meta::FieldLayout { - selector: 0, - layout: dojo::meta::introspect::Introspect::::layout() - }, -dojo::meta::FieldLayout { - selector: 1, - layout: dojo::meta::introspect::Introspect::::layout() - } - ].span() - ) - } - - #[inline(always)] - fn ty() -> dojo::meta::introspect::Ty { - dojo::meta::introspect::Ty::Enum( - dojo::meta::introspect::Enum { - name: 'EnumWithPrimitive', - attrs: array![].span(), - children: array![ - ('Left', dojo::meta::introspect::Introspect::::ty()), -('Right', dojo::meta::introspect::Introspect::::ty()) - - ].span() - } - ) - } -} -impl EnumCustomSerde of core::serde::Serde:: { - fn serialize(self: @EnumCustom, ref output: core::array::Array) { - match self { - EnumCustom::Left(x) => { core::serde::Serde::serialize(@0, ref output); core::serde::Serde::serialize(x, ref output); }, - EnumCustom::Right(x) => { core::serde::Serde::serialize(@1, ref output); core::serde::Serde::serialize(x, ref output); }, - } - } - fn deserialize(ref serialized: core::array::Span) -> core::option::Option { - let idx: felt252 = core::serde::Serde::deserialize(ref serialized)?; - core::option::Option::Some( - match idx { - 0 => EnumCustom::Left(core::serde::Serde::deserialize(ref serialized)?), - 1 => EnumCustom::Right(core::serde::Serde::deserialize(ref serialized)?), - _ => { return core::option::Option::None; } - } - ) - } -} -impl EnumCustomCopy of core::traits::Copy::; -impl EnumCustomDrop of core::traits::Drop::; - -impl EnumCustomIntrospect<> of dojo::meta::introspect::Introspect> { - #[inline(always)] - fn size() -> Option { - let sizes : Array> = array![ - dojo::meta::introspect::Introspect::::size(), -Option::Some(1) - ]; - - if dojo::utils::any_none(@sizes) { - return Option::None; - } - Option::Some(dojo::utils::sum(sizes)) - - } - - fn layout() -> dojo::meta::Layout { - dojo::meta::Layout::Enum( - array![ - dojo::meta::FieldLayout { - selector: 0, - layout: dojo::meta::introspect::Introspect::::layout() - }, -dojo::meta::FieldLayout { - selector: 1, - layout: dojo::meta::introspect::Introspect::::layout() - } - ].span() - ) - } - - #[inline(always)] - fn ty() -> dojo::meta::introspect::Ty { - dojo::meta::introspect::Ty::Enum( - dojo::meta::introspect::Enum { - name: 'EnumCustom', - attrs: array![].span(), - children: array![ - ('Left', dojo::meta::introspect::Introspect::::ty()), -('Right', dojo::meta::introspect::Introspect::::ty()) - - ].span() - } - ) - } -} -impl EnumTupleMixSerde of core::serde::Serde:: { - fn serialize(self: @EnumTupleMix, ref output: core::array::Array) { - match self { - EnumTupleMix::Left(x) => { core::serde::Serde::serialize(@0, ref output); core::serde::Serde::serialize(x, ref output); }, - EnumTupleMix::Right(x) => { core::serde::Serde::serialize(@1, ref output); core::serde::Serde::serialize(x, ref output); }, - } - } - fn deserialize(ref serialized: core::array::Span) -> core::option::Option { - let idx: felt252 = core::serde::Serde::deserialize(ref serialized)?; - core::option::Option::Some( - match idx { - 0 => EnumTupleMix::Left(core::serde::Serde::deserialize(ref serialized)?), - 1 => EnumTupleMix::Right(core::serde::Serde::deserialize(ref serialized)?), - _ => { return core::option::Option::None; } - } - ) - } -} -impl EnumTupleMixCopy of core::traits::Copy::; -impl EnumTupleMixDrop of core::traits::Drop::; - -impl EnumTupleMixIntrospect<> of dojo::meta::introspect::Introspect> { - #[inline(always)] - fn size() -> Option { - let sizes : Array> = array![ - dojo::meta::introspect::Introspect::::size(), -dojo::meta::introspect::Introspect::::size(), -Option::Some(2) - ]; - - if dojo::utils::any_none(@sizes) { - return Option::None; - } - Option::Some(dojo::utils::sum(sizes)) - - } - - fn layout() -> dojo::meta::Layout { - dojo::meta::Layout::Enum( - array![ - dojo::meta::FieldLayout { - selector: 0, - layout: dojo::meta::Layout::Tuple( - array![ - dojo::meta::introspect::Introspect::::layout(), -dojo::meta::introspect::Introspect::::layout(), -dojo::meta::introspect::Introspect::::layout() - ].span() - ) - }, -dojo::meta::FieldLayout { - selector: 1, - layout: dojo::meta::Layout::Tuple( - array![ - dojo::meta::introspect::Introspect::::layout(), -dojo::meta::introspect::Introspect::::layout(), -dojo::meta::introspect::Introspect::::layout() - ].span() - ) - } - ].span() - ) - } - - #[inline(always)] - fn ty() -> dojo::meta::introspect::Ty { - dojo::meta::introspect::Ty::Enum( - dojo::meta::introspect::Enum { - name: 'EnumTupleMix', - attrs: array![].span(), - children: array![ - ('Left', dojo::meta::introspect::Ty::Tuple( - array![ - dojo::meta::introspect::Introspect::::ty(), -dojo::meta::introspect::Introspect::::ty(), -dojo::meta::introspect::Introspect::::ty() - ].span() - )), -('Right', dojo::meta::introspect::Ty::Tuple( - array![ - dojo::meta::introspect::Introspect::::ty(), -dojo::meta::introspect::Introspect::::ty(), -dojo::meta::introspect::Introspect::::ty() - ].span() - )) - - ].span() - } - ) - } -} -impl EnumWithDifferentVariantDataSerde of core::serde::Serde:: { - fn serialize(self: @EnumWithDifferentVariantData, ref output: core::array::Array) { - match self { - EnumWithDifferentVariantData::One(x) => { core::serde::Serde::serialize(@0, ref output); core::serde::Serde::serialize(x, ref output); }, - EnumWithDifferentVariantData::Two(x) => { core::serde::Serde::serialize(@1, ref output); core::serde::Serde::serialize(x, ref output); }, - EnumWithDifferentVariantData::Three(x) => { core::serde::Serde::serialize(@2, ref output); core::serde::Serde::serialize(x, ref output); }, - } - } - fn deserialize(ref serialized: core::array::Span) -> core::option::Option { - let idx: felt252 = core::serde::Serde::deserialize(ref serialized)?; - core::option::Option::Some( - match idx { - 0 => EnumWithDifferentVariantData::One(core::serde::Serde::deserialize(ref serialized)?), - 1 => EnumWithDifferentVariantData::Two(core::serde::Serde::deserialize(ref serialized)?), - 2 => EnumWithDifferentVariantData::Three(core::serde::Serde::deserialize(ref serialized)?), - _ => { return core::option::Option::None; } - } - ) - } -} -impl EnumWithDifferentVariantDataCopy of core::traits::Copy::; -impl EnumWithDifferentVariantDataDrop of core::traits::Drop::; - -impl EnumWithDifferentVariantDataIntrospect<> of dojo::meta::introspect::Introspect> { - #[inline(always)] - fn size() -> Option { - Option::None - } - - fn layout() -> dojo::meta::Layout { - dojo::meta::Layout::Enum( - array![ - dojo::meta::FieldLayout { - selector: 0, - layout: dojo::meta::Layout::Fixed(array![].span()) - }, -dojo::meta::FieldLayout { - selector: 1, - layout: dojo::meta::introspect::Introspect::::layout() - }, -dojo::meta::FieldLayout { - selector: 2, - layout: dojo::meta::Layout::Tuple( - array![ - dojo::meta::introspect::Introspect::::layout(), -dojo::meta::introspect::Introspect::::layout() - ].span() - ) - } - ].span() - ) - } - - #[inline(always)] - fn ty() -> dojo::meta::introspect::Ty { - dojo::meta::introspect::Ty::Enum( - dojo::meta::introspect::Enum { - name: 'EnumWithDifferentVariantData', - attrs: array![].span(), - children: array![ - ('One', dojo::meta::introspect::Ty::Tuple(array![].span())), -('Two', dojo::meta::introspect::Introspect::::ty()), -('Three', dojo::meta::introspect::Ty::Tuple( - array![ - dojo::meta::introspect::Introspect::::ty(), -dojo::meta::introspect::Introspect::::ty() - ].span() - )) - - ].span() - } - ) - } -} -impl StructWithPrimitivesCopy of core::traits::Copy::; -impl StructWithPrimitivesDrop of core::traits::Drop::; - -impl StructWithPrimitivesIntrospect<> of dojo::meta::introspect::Introspect> { - #[inline(always)] - fn size() -> Option { - Option::Some(2) - } - - fn layout() -> dojo::meta::Layout { - dojo::meta::Layout::Struct( - array![ - dojo::meta::FieldLayout { - selector: 387461982739864353524563589639770327077359184971688375275386807599796929637, - layout: dojo::meta::introspect::Introspect::::layout() - }, -dojo::meta::FieldLayout { - selector: 564613130574576288414461160574656432422962213642984413874723251824844509768, - layout: dojo::meta::introspect::Introspect::::layout() - } - ].span() - ) - } - - #[inline(always)] - fn ty() -> dojo::meta::introspect::Ty { - dojo::meta::introspect::Ty::Struct( - dojo::meta::introspect::Struct { - name: 'StructWithPrimitives', - attrs: array![].span(), - children: array![ - dojo::meta::introspect::Member { - name: 'player', - attrs: array!['key'].span(), - ty: dojo::meta::introspect::Introspect::::ty() - }, -dojo::meta::introspect::Member { - name: 'before', - attrs: array![].span(), - ty: dojo::meta::introspect::Introspect::::ty() - }, -dojo::meta::introspect::Member { - name: 'after', - attrs: array![].span(), - ty: dojo::meta::introspect::Introspect::::ty() - } - - ].span() - } - ) - } -} -impl StructWithStructCopy of core::traits::Copy::; -impl StructWithStructDrop of core::traits::Drop::; - -impl StructWithStructIntrospect<> of dojo::meta::introspect::Introspect> { - #[inline(always)] - fn size() -> Option { - let sizes : Array> = array![ - dojo::meta::introspect::Introspect::::size(), -Option::Some(1) - ]; - - if dojo::utils::any_none(@sizes) { - return Option::None; - } - Option::Some(dojo::utils::sum(sizes)) - - } - - fn layout() -> dojo::meta::Layout { - dojo::meta::Layout::Struct( - array![ - dojo::meta::FieldLayout { - selector: 387461982739864353524563589639770327077359184971688375275386807599796929637, - layout: dojo::meta::introspect::Introspect::::layout() - }, -dojo::meta::FieldLayout { - selector: 564613130574576288414461160574656432422962213642984413874723251824844509768, - layout: dojo::meta::introspect::Introspect::::layout() - } - ].span() - ) - } - - #[inline(always)] - fn ty() -> dojo::meta::introspect::Ty { - dojo::meta::introspect::Ty::Struct( - dojo::meta::introspect::Struct { - name: 'StructWithStruct', - attrs: array![].span(), - children: array![ - dojo::meta::introspect::Member { - name: 'player', - attrs: array!['key'].span(), - ty: dojo::meta::introspect::Introspect::::ty() - }, -dojo::meta::introspect::Member { - name: 'before', - attrs: array![].span(), - ty: dojo::meta::introspect::Introspect::::ty() - }, -dojo::meta::introspect::Member { - name: 'after', - attrs: array![].span(), - ty: dojo::meta::introspect::Introspect::::ty() - } - - ].span() - } - ) - } -} -impl StructWithSimpleArrayCopy of core::traits::Copy::; -impl StructWithSimpleArrayDrop of core::traits::Drop::; - -impl StructWithSimpleArrayIntrospect<> of dojo::meta::introspect::Introspect> { - #[inline(always)] - fn size() -> Option { - Option::None - } - - fn layout() -> dojo::meta::Layout { - dojo::meta::Layout::Struct( - array![ - dojo::meta::FieldLayout { - selector: 387461982739864353524563589639770327077359184971688375275386807599796929637, - layout: dojo::meta::introspect::Introspect::::layout() - }, -dojo::meta::FieldLayout { - selector: 564613130574576288414461160574656432422962213642984413874723251824844509768, - layout: dojo::meta::introspect::Introspect::>::layout() - } - ].span() - ) - } - - #[inline(always)] - fn ty() -> dojo::meta::introspect::Ty { - dojo::meta::introspect::Ty::Struct( - dojo::meta::introspect::Struct { - name: 'StructWithSimpleArray', - attrs: array![].span(), - children: array![ - dojo::meta::introspect::Member { - name: 'player', - attrs: array!['key'].span(), - ty: dojo::meta::introspect::Introspect::::ty() - }, -dojo::meta::introspect::Member { - name: 'before', - attrs: array![].span(), - ty: dojo::meta::introspect::Introspect::::ty() - }, -dojo::meta::introspect::Member { - name: 'after', - attrs: array![].span(), - ty: dojo::meta::introspect::Ty::Array( - array![ - dojo::meta::introspect::Introspect::::ty() - ].span() - ) - } - - ].span() - } - ) - } -} -impl StructWithByteArrayCopy of core::traits::Copy::; -impl StructWithByteArrayDrop of core::traits::Drop::; - -impl StructWithByteArrayIntrospect<> of dojo::meta::introspect::Introspect> { - #[inline(always)] - fn size() -> Option { - Option::None - } - - fn layout() -> dojo::meta::Layout { - dojo::meta::Layout::Struct( - array![ - dojo::meta::FieldLayout { - selector: 387461982739864353524563589639770327077359184971688375275386807599796929637, - layout: dojo::meta::introspect::Introspect::::layout() - }, -dojo::meta::FieldLayout { - selector: 564613130574576288414461160574656432422962213642984413874723251824844509768, - layout: dojo::meta::introspect::Introspect::::layout() - } - ].span() - ) - } - - #[inline(always)] - fn ty() -> dojo::meta::introspect::Ty { - dojo::meta::introspect::Ty::Struct( - dojo::meta::introspect::Struct { - name: 'StructWithByteArray', - attrs: array![].span(), - children: array![ - dojo::meta::introspect::Member { - name: 'player', - attrs: array!['key'].span(), - ty: dojo::meta::introspect::Introspect::::ty() - }, -dojo::meta::introspect::Member { - name: 'before', - attrs: array![].span(), - ty: dojo::meta::introspect::Introspect::::ty() - }, -dojo::meta::introspect::Member { - name: 'after', - attrs: array![].span(), - ty: dojo::meta::introspect::Ty::ByteArray - } - - ].span() - } - ) - } -} -impl StructWithComplexArrayCopy of core::traits::Copy::; -impl StructWithComplexArrayDrop of core::traits::Drop::; - -impl StructWithComplexArrayIntrospect<> of dojo::meta::introspect::Introspect> { - #[inline(always)] - fn size() -> Option { - Option::None - } - - fn layout() -> dojo::meta::Layout { - dojo::meta::Layout::Struct( - array![ - dojo::meta::FieldLayout { - selector: 387461982739864353524563589639770327077359184971688375275386807599796929637, - layout: dojo::meta::introspect::Introspect::::layout() - }, -dojo::meta::FieldLayout { - selector: 564613130574576288414461160574656432422962213642984413874723251824844509768, - layout: dojo::meta::introspect::Introspect::>::layout() - } - ].span() - ) - } - - #[inline(always)] - fn ty() -> dojo::meta::introspect::Ty { - dojo::meta::introspect::Ty::Struct( - dojo::meta::introspect::Struct { - name: 'StructWithComplexArray', - attrs: array![].span(), - children: array![ - dojo::meta::introspect::Member { - name: 'player', - attrs: array!['key'].span(), - ty: dojo::meta::introspect::Introspect::::ty() - }, -dojo::meta::introspect::Member { - name: 'before', - attrs: array![].span(), - ty: dojo::meta::introspect::Introspect::::ty() - }, -dojo::meta::introspect::Member { - name: 'after', - attrs: array![].span(), - ty: dojo::meta::introspect::Ty::Array( - array![ - dojo::meta::introspect::Introspect::::ty() - ].span() - ) - } - - ].span() - } - ) - } -} -impl StructWithSimpleTupleCopy of core::traits::Copy::; -impl StructWithSimpleTupleDrop of core::traits::Drop::; - -impl StructWithSimpleTupleIntrospect<> of dojo::meta::introspect::Introspect> { - #[inline(always)] - fn size() -> Option { - Option::Some(4) - } - - fn layout() -> dojo::meta::Layout { - dojo::meta::Layout::Struct( - array![ - dojo::meta::FieldLayout { - selector: 387461982739864353524563589639770327077359184971688375275386807599796929637, - layout: dojo::meta::introspect::Introspect::::layout() - }, -dojo::meta::FieldLayout { - selector: 564613130574576288414461160574656432422962213642984413874723251824844509768, - layout: dojo::meta::Layout::Tuple( - array![ - dojo::meta::introspect::Introspect::::layout(), -dojo::meta::introspect::Introspect::::layout() - ].span() - ) - } - ].span() - ) - } - - #[inline(always)] - fn ty() -> dojo::meta::introspect::Ty { - dojo::meta::introspect::Ty::Struct( - dojo::meta::introspect::Struct { - name: 'StructWithSimpleTuple', - attrs: array![].span(), - children: array![ - dojo::meta::introspect::Member { - name: 'player', - attrs: array!['key'].span(), - ty: dojo::meta::introspect::Introspect::::ty() - }, -dojo::meta::introspect::Member { - name: 'before', - attrs: array![].span(), - ty: dojo::meta::introspect::Introspect::::ty() - }, -dojo::meta::introspect::Member { - name: 'after', - attrs: array![].span(), - ty: dojo::meta::introspect::Ty::Tuple( - array![ - dojo::meta::introspect::Introspect::::ty(), -dojo::meta::introspect::Introspect::::ty() - ].span() - ) - } - - ].span() - } - ) - } -} -impl StructWithComplexTupleCopy of core::traits::Copy::; -impl StructWithComplexTupleDrop of core::traits::Drop::; - -impl StructWithComplexTupleIntrospect<> of dojo::meta::introspect::Introspect> { - #[inline(always)] - fn size() -> Option { - let sizes : Array> = array![ - dojo::meta::introspect::Introspect::::size(), -dojo::meta::introspect::Introspect::::size(), -Option::Some(2) - ]; - - if dojo::utils::any_none(@sizes) { - return Option::None; - } - Option::Some(dojo::utils::sum(sizes)) - - } - - fn layout() -> dojo::meta::Layout { - dojo::meta::Layout::Struct( - array![ - dojo::meta::FieldLayout { - selector: 387461982739864353524563589639770327077359184971688375275386807599796929637, - layout: dojo::meta::introspect::Introspect::::layout() - }, -dojo::meta::FieldLayout { - selector: 564613130574576288414461160574656432422962213642984413874723251824844509768, - layout: dojo::meta::Layout::Tuple( - array![ - dojo::meta::introspect::Introspect::::layout(), -dojo::meta::introspect::Introspect::::layout(), -dojo::meta::introspect::Introspect::::layout() - ].span() - ) - } - ].span() - ) - } - - #[inline(always)] - fn ty() -> dojo::meta::introspect::Ty { - dojo::meta::introspect::Ty::Struct( - dojo::meta::introspect::Struct { - name: 'StructWithComplexTuple', - attrs: array![].span(), - children: array![ - dojo::meta::introspect::Member { - name: 'player', - attrs: array!['key'].span(), - ty: dojo::meta::introspect::Introspect::::ty() - }, -dojo::meta::introspect::Member { - name: 'before', - attrs: array![].span(), - ty: dojo::meta::introspect::Introspect::::ty() - }, -dojo::meta::introspect::Member { - name: 'after', - attrs: array![].span(), - ty: dojo::meta::introspect::Ty::Tuple( - array![ - dojo::meta::introspect::Introspect::::ty(), -dojo::meta::introspect::Introspect::::ty(), -dojo::meta::introspect::Introspect::::ty() - ].span() - ) - } - - ].span() - } - ) - } -} -impl StructWithNestedArraysCopy of core::traits::Copy::; -impl StructWithNestedArraysDrop of core::traits::Drop::; - -impl StructWithNestedArraysIntrospect<> of dojo::meta::introspect::Introspect> { - #[inline(always)] - fn size() -> Option { - Option::None - } - - fn layout() -> dojo::meta::Layout { - dojo::meta::Layout::Struct( - array![ - dojo::meta::FieldLayout { - selector: 387461982739864353524563589639770327077359184971688375275386807599796929637, - layout: dojo::meta::introspect::Introspect::::layout() - }, -dojo::meta::FieldLayout { - selector: 564613130574576288414461160574656432422962213642984413874723251824844509768, - layout: dojo::meta::Layout::Array( - array![ - dojo::meta::Layout::Array( - array![ - dojo::meta::introspect::Introspect::>::layout() - ].span() - ) - ].span() - ) - } - ].span() - ) - } - - #[inline(always)] - fn ty() -> dojo::meta::introspect::Ty { - dojo::meta::introspect::Ty::Struct( - dojo::meta::introspect::Struct { - name: 'StructWithNestedArrays', - attrs: array![].span(), - children: array![ - dojo::meta::introspect::Member { - name: 'player', - attrs: array!['key'].span(), - ty: dojo::meta::introspect::Introspect::::ty() - }, -dojo::meta::introspect::Member { - name: 'before', - attrs: array![].span(), - ty: dojo::meta::introspect::Introspect::::ty() - }, -dojo::meta::introspect::Member { - name: 'after', - attrs: array![].span(), - ty: dojo::meta::introspect::Ty::Array( - array![ - dojo::meta::introspect::Ty::Array( - array![ - dojo::meta::introspect::Ty::Array( - array![ - dojo::meta::introspect::Introspect::::ty() - ].span() - ) - ].span() - ) - ].span() - ) - } - - ].span() - } - ) - } -} -impl StructWithNestedTuplesCopy of core::traits::Copy::; -impl StructWithNestedTuplesDrop of core::traits::Drop::; - -impl StructWithNestedTuplesIntrospect<> of dojo::meta::introspect::Introspect> { - #[inline(always)] - fn size() -> Option { - let sizes : Array> = array![ - dojo::meta::introspect::Introspect::::size(), -dojo::meta::introspect::Introspect::::size(), -Option::Some(3) - ]; - - if dojo::utils::any_none(@sizes) { - return Option::None; - } - Option::Some(dojo::utils::sum(sizes)) - - } - - fn layout() -> dojo::meta::Layout { - dojo::meta::Layout::Struct( - array![ - dojo::meta::FieldLayout { - selector: 387461982739864353524563589639770327077359184971688375275386807599796929637, - layout: dojo::meta::introspect::Introspect::::layout() - }, -dojo::meta::FieldLayout { - selector: 564613130574576288414461160574656432422962213642984413874723251824844509768, - layout: dojo::meta::Layout::Tuple( - array![ - dojo::meta::Layout::Tuple( - array![ - dojo::meta::introspect::Introspect::::layout(), -dojo::meta::introspect::Introspect::::layout() - ].span() - ), -dojo::meta::Layout::Tuple( - array![ - dojo::meta::introspect::Introspect::::layout(), -dojo::meta::introspect::Introspect::::layout() - ].span() - ) - ].span() - ) - } - ].span() - ) - } - - #[inline(always)] - fn ty() -> dojo::meta::introspect::Ty { - dojo::meta::introspect::Ty::Struct( - dojo::meta::introspect::Struct { - name: 'StructWithNestedTuples', - attrs: array![].span(), - children: array![ - dojo::meta::introspect::Member { - name: 'player', - attrs: array!['key'].span(), - ty: dojo::meta::introspect::Introspect::::ty() - }, -dojo::meta::introspect::Member { - name: 'before', - attrs: array![].span(), - ty: dojo::meta::introspect::Introspect::::ty() - }, -dojo::meta::introspect::Member { - name: 'after', - attrs: array![].span(), - ty: dojo::meta::introspect::Ty::Tuple( - array![ - dojo::meta::introspect::Ty::Tuple( - array![ - dojo::meta::introspect::Introspect::::ty(), -dojo::meta::introspect::Introspect::::ty() - ].span() - ), -dojo::meta::introspect::Ty::Tuple( - array![ - dojo::meta::introspect::Introspect::::ty(), -dojo::meta::introspect::Introspect::::ty() - ].span() - ) - ].span() - ) - } - - ].span() - } - ) - } -} -impl StructWithNestedTuplesAndByteArrayCopy of core::traits::Copy::; -impl StructWithNestedTuplesAndByteArrayDrop of core::traits::Drop::; - -impl StructWithNestedTuplesAndByteArrayIntrospect<> of dojo::meta::introspect::Introspect> { - #[inline(always)] - fn size() -> Option { - Option::None - } - - fn layout() -> dojo::meta::Layout { - dojo::meta::Layout::Struct( - array![ - dojo::meta::FieldLayout { - selector: 387461982739864353524563589639770327077359184971688375275386807599796929637, - layout: dojo::meta::introspect::Introspect::::layout() - }, -dojo::meta::FieldLayout { - selector: 564613130574576288414461160574656432422962213642984413874723251824844509768, - layout: dojo::meta::Layout::Tuple( - array![ - dojo::meta::Layout::Tuple( - array![ - dojo::meta::introspect::Introspect::::layout(), -dojo::meta::introspect::Introspect::::layout() - ].span() - ), -dojo::meta::Layout::Tuple( - array![ - dojo::meta::introspect::Introspect::::layout(), -dojo::meta::introspect::Introspect::::layout() - ].span() - ) - ].span() - ) - } - ].span() - ) - } - - #[inline(always)] - fn ty() -> dojo::meta::introspect::Ty { - dojo::meta::introspect::Ty::Struct( - dojo::meta::introspect::Struct { - name: 'StructWithNestedTuplesAndByteArray', - attrs: array![].span(), - children: array![ - dojo::meta::introspect::Member { - name: 'player', - attrs: array!['key'].span(), - ty: dojo::meta::introspect::Introspect::::ty() - }, -dojo::meta::introspect::Member { - name: 'before', - attrs: array![].span(), - ty: dojo::meta::introspect::Introspect::::ty() - }, -dojo::meta::introspect::Member { - name: 'after', - attrs: array![].span(), - ty: dojo::meta::introspect::Ty::Tuple( - array![ - dojo::meta::introspect::Ty::Tuple( - array![ - dojo::meta::introspect::Introspect::::ty(), -dojo::meta::introspect::Introspect::::ty() - ].span() - ), -dojo::meta::introspect::Ty::Tuple( - array![ - dojo::meta::introspect::Introspect::::ty(), -dojo::meta::introspect::Ty::ByteArray - ].span() - ) - ].span() - ) - } - - ].span() - } - ) - } -} -impl StructWithNestedEverythingCopy of core::traits::Copy::; -impl StructWithNestedEverythingDrop of core::traits::Drop::; - -impl StructWithNestedEverythingIntrospect<> of dojo::meta::introspect::Introspect> { - #[inline(always)] - fn size() -> Option { - Option::None - } - - fn layout() -> dojo::meta::Layout { - dojo::meta::Layout::Struct( - array![ - dojo::meta::FieldLayout { - selector: 387461982739864353524563589639770327077359184971688375275386807599796929637, - layout: dojo::meta::introspect::Introspect::::layout() - }, -dojo::meta::FieldLayout { - selector: 564613130574576288414461160574656432422962213642984413874723251824844509768, - layout: dojo::meta::Layout::Tuple( - array![ - dojo::meta::Layout::Tuple( - array![ - dojo::meta::introspect::Introspect::::layout(), -dojo::meta::introspect::Introspect::::layout() - ].span() - ), -dojo::meta::Layout::Tuple( - array![ - dojo::meta::introspect::Introspect::::layout(), -dojo::meta::introspect::Introspect::::layout() - ].span() - ), -dojo::meta::Layout::Tuple( - array![ - dojo::meta::Layout::Array( - array![ - dojo::meta::Layout::Tuple( - array![ - dojo::meta::introspect::Introspect::::layout(), -dojo::meta::introspect::Introspect::::layout() - ].span() - ) - ].span() - ), -dojo::meta::introspect::Introspect::::layout() - ].span() - ), -dojo::meta::Layout::Tuple( - array![ - dojo::meta::introspect::Introspect::::layout() - ].span() - ) - ].span() - ) - } - ].span() - ) - } - - #[inline(always)] - fn ty() -> dojo::meta::introspect::Ty { - dojo::meta::introspect::Ty::Struct( - dojo::meta::introspect::Struct { - name: 'StructWithNestedEverything', - attrs: array![].span(), - children: array![ - dojo::meta::introspect::Member { - name: 'player', - attrs: array!['key'].span(), - ty: dojo::meta::introspect::Introspect::::ty() - }, -dojo::meta::introspect::Member { - name: 'before', - attrs: array![].span(), - ty: dojo::meta::introspect::Introspect::::ty() - }, -dojo::meta::introspect::Member { - name: 'after', - attrs: array![].span(), - ty: dojo::meta::introspect::Ty::Tuple( - array![ - dojo::meta::introspect::Ty::Tuple( - array![ - dojo::meta::introspect::Introspect::::ty(), -dojo::meta::introspect::Introspect::::ty() - ].span() - ), -dojo::meta::introspect::Ty::Tuple( - array![ - dojo::meta::introspect::Introspect::::ty(), -dojo::meta::introspect::Introspect::::ty() - ].span() - ), -dojo::meta::introspect::Ty::Tuple( - array![ - dojo::meta::introspect::Ty::Array( - array![ - dojo::meta::introspect::Ty::Tuple( - array![ - dojo::meta::introspect::Introspect::::ty(), -dojo::meta::introspect::Introspect::::ty() - ].span() - ) - ].span() - ), -dojo::meta::introspect::Introspect::::ty() - ].span() - ), -dojo::meta::introspect::Ty::Tuple( - array![ - dojo::meta::introspect::Introspect::::ty() - ].span() - ) - ].span() - ) - } - - ].span() - } - ) - } -} -impl GenericStructCopy> of core::traits::Copy::>; -impl GenericStructDrop> of core::traits::Drop::>; -impl GenericStructSerde, +core::traits::Destruct> of core::serde::Serde::> { - fn serialize(self: @GenericStruct, ref output: core::array::Array) { - core::serde::Serde::serialize(self.t, ref output) - } - fn deserialize(ref serialized: core::array::Span) -> core::option::Option> { - core::option::Option::Some(GenericStruct { - t: core::serde::Serde::deserialize(ref serialized)?, - }) - } -} - -impl GenericStructIntrospect> of dojo::meta::introspect::Introspect> { - #[inline(always)] - fn size() -> Option { - dojo::meta::introspect::Introspect::::size() - } - - fn layout() -> dojo::meta::Layout { - dojo::meta::Layout::Struct( - array![ - dojo::meta::FieldLayout { - selector: 1246920879054256875300693562709339669009726288543267794550465531256469553289, - layout: dojo::meta::introspect::Introspect::::layout() - } - ].span() - ) - } - - #[inline(always)] - fn ty() -> dojo::meta::introspect::Ty { - dojo::meta::introspect::Ty::Struct( - dojo::meta::introspect::Struct { - name: 'GenericStruct', - attrs: array![].span(), - children: array![ - dojo::meta::introspect::Member { - name: 't', - attrs: array![].span(), - ty: dojo::meta::introspect::Introspect::::ty() - } - - ].span() - } - ) - } -} -impl StructWithBadOptionCopy of core::traits::Copy::; -impl StructWithBadOptionDrop of core::traits::Drop::; -impl StructWithBadOptionSerde of core::serde::Serde:: { - fn serialize(self: @StructWithBadOption, ref output: core::array::Array) { - core::serde::Serde::serialize(self.x, ref output) - } - fn deserialize(ref serialized: core::array::Span) -> core::option::Option { - core::option::Option::Some(StructWithBadOption { - x: core::serde::Serde::deserialize(ref serialized)?, - }) - } -} - -impl StructWithBadOptionIntrospect<> of dojo::meta::introspect::Introspect> { - #[inline(always)] - fn size() -> Option { - dojo::meta::introspect::Introspect::>::size() - } - - fn layout() -> dojo::meta::Layout { - dojo::meta::Layout::Struct( - array![ - dojo::meta::FieldLayout { - selector: 512066735765477566404754172672287371265995314501343422459174036873487219331, - layout: dojo::meta::introspect::Introspect:: ->::layout() - } - ].span() - ) - } - - #[inline(always)] - fn ty() -> dojo::meta::introspect::Ty { - dojo::meta::introspect::Ty::Struct( - dojo::meta::introspect::Struct { - name: 'StructWithBadOption', - attrs: array![].span(), - children: array![ - dojo::meta::introspect::Member { - name: 'x', - attrs: array![].span(), - ty: dojo::meta::introspect::Introspect::>::ty() - } - - ].span() - } - ) - } -} -impl EnumWithBadOptionCopy of core::traits::Copy::; -impl EnumWithBadOptionDrop of core::traits::Drop::; -impl EnumWithBadOptionSerde of core::serde::Serde:: { - fn serialize(self: @EnumWithBadOption, ref output: core::array::Array) { - match self { - EnumWithBadOption::first(x) => { core::serde::Serde::serialize(@0, ref output); core::serde::Serde::serialize(x, ref output); }, - } - } - fn deserialize(ref serialized: core::array::Span) -> core::option::Option { - let idx: felt252 = core::serde::Serde::deserialize(ref serialized)?; - core::option::Option::Some( - match idx { - 0 => EnumWithBadOption::first(core::serde::Serde::deserialize(ref serialized)?), - _ => { return core::option::Option::None; } - } - ) - } -} - -impl EnumWithBadOptionIntrospect<> of dojo::meta::introspect::Introspect> { - #[inline(always)] - fn size() -> Option { - let sizes : Array> = array![ - dojo::meta::introspect::Introspect::>::size(), -Option::Some(1) - ]; - - if dojo::utils::any_none(@sizes) { - return Option::None; - } - Option::Some(dojo::utils::sum(sizes)) - - } - - fn layout() -> dojo::meta::Layout { - dojo::meta::Layout::Enum( - array![ - dojo::meta::FieldLayout { - selector: 0, - layout: dojo::meta::introspect::Introspect::>::layout() - } - ].span() - ) - } - - #[inline(always)] - fn ty() -> dojo::meta::introspect::Ty { - dojo::meta::introspect::Ty::Enum( - dojo::meta::introspect::Enum { - name: 'EnumWithBadOption', - attrs: array![].span(), - children: array![ - ('first', dojo::meta::introspect::Introspect::>::ty()) - - ].span() - } - ) - } -} - -impl EnumIncompatibleAttrsIntrospect<> of dojo::meta::introspect::Introspect> { - #[inline(always)] - fn size() -> Option { - Option::None - } - - fn layout() -> dojo::meta::Layout { - dojo::meta::Layout::Enum( - array![ - - ].span() - ) - } - - #[inline(always)] - fn ty() -> dojo::meta::introspect::Ty { - dojo::meta::introspect::Ty::Enum( - dojo::meta::introspect::Enum { - name: 'EnumIncompatibleAttrs', - attrs: array![].span(), - children: array![ - - - ].span() - } - ) - } -} - -impl EnumIncompatibleAttrsIntrospect<> of dojo::meta::introspect::Introspect> { - #[inline(always)] - fn size() -> Option { - Option::None - } - - fn layout() -> dojo::meta::Layout { - dojo::meta::Layout::Fixed( - array![ - 8 - ].span() - ) - } - - #[inline(always)] - fn ty() -> dojo::meta::introspect::Ty { - dojo::meta::introspect::Ty::Enum( - dojo::meta::introspect::Enum { - name: 'EnumIncompatibleAttrs', - attrs: array![].span(), - children: array![ - - - ].span() - } - ) - } -} - -impl StructIncompatibleAttrsIntrospect<> of dojo::meta::introspect::Introspect> { - #[inline(always)] - fn size() -> Option { - Option::None - } - - fn layout() -> dojo::meta::Layout { - dojo::meta::Layout::Struct( - array![ - - ].span() - ) - } - - #[inline(always)] - fn ty() -> dojo::meta::introspect::Ty { - dojo::meta::introspect::Ty::Struct( - dojo::meta::introspect::Struct { - name: 'StructIncompatibleAttrs', - attrs: array![].span(), - children: array![ - - - ].span() - } - ) - } -} - -impl StructIncompatibleAttrsIntrospect<> of dojo::meta::introspect::Introspect> { - #[inline(always)] - fn size() -> Option { - Option::None - } - - fn layout() -> dojo::meta::Layout { - dojo::meta::Layout::Fixed( - array![ - - ].span() - ) - } - - #[inline(always)] - fn ty() -> dojo::meta::introspect::Ty { - dojo::meta::introspect::Ty::Struct( - dojo::meta::introspect::Struct { - name: 'StructIncompatibleAttrs', - attrs: array![].span(), - children: array![ - - - ].span() - } - ) - } -} - -impl StructIncompatibleAttrs2Introspect<> of dojo::meta::introspect::Introspect> { - #[inline(always)] - fn size() -> Option { - Option::None - } - - fn layout() -> dojo::meta::Layout { - dojo::meta::Layout::Struct( - array![ - - ].span() - ) - } - - #[inline(always)] - fn ty() -> dojo::meta::introspect::Ty { - dojo::meta::introspect::Ty::Struct( - dojo::meta::introspect::Struct { - name: 'StructIncompatibleAttrs2', - attrs: array![].span(), - children: array![ - - - ].span() - } - ) - } -} - -impl StructIncompatibleAttrs2Introspect<> of dojo::meta::introspect::Introspect> { - #[inline(always)] - fn size() -> Option { - Option::None - } - - fn layout() -> dojo::meta::Layout { - dojo::meta::Layout::Fixed( - array![ - - ].span() - ) - } - - #[inline(always)] - fn ty() -> dojo::meta::introspect::Ty { - dojo::meta::introspect::Ty::Struct( - dojo::meta::introspect::Struct { - name: 'StructIncompatibleAttrs2', - attrs: array![].span(), - children: array![ - - - ].span() - } - ) - } -} - -impl EnumIncompatibleAttrs2Introspect<> of dojo::meta::introspect::Introspect> { - #[inline(always)] - fn size() -> Option { - Option::None - } - - fn layout() -> dojo::meta::Layout { - dojo::meta::Layout::Enum( - array![ - - ].span() - ) - } - - #[inline(always)] - fn ty() -> dojo::meta::introspect::Ty { - dojo::meta::introspect::Ty::Enum( - dojo::meta::introspect::Enum { - name: 'EnumIncompatibleAttrs2', - attrs: array![].span(), - children: array![ - - - ].span() - } - ) - } -} - -impl EnumIncompatibleAttrs2Introspect<> of dojo::meta::introspect::Introspect> { - #[inline(always)] - fn size() -> Option { - Option::None - } - - fn layout() -> dojo::meta::Layout { - dojo::meta::Layout::Fixed( - array![ - 8 - ].span() - ) - } - - #[inline(always)] - fn ty() -> dojo::meta::introspect::Ty { - dojo::meta::introspect::Ty::Enum( - dojo::meta::introspect::Enum { - name: 'EnumIncompatibleAttrs2', - attrs: array![].span(), - children: array![ - - - ].span() - } - ) - } -} - -impl StructPacked1Introspect<> of dojo::meta::introspect::Introspect> { - #[inline(always)] - fn size() -> Option { - Option::Some(1) - } - - fn layout() -> dojo::meta::Layout { - dojo::meta::Layout::Fixed( - array![ - 8 - ].span() - ) - } - - #[inline(always)] - fn ty() -> dojo::meta::introspect::Ty { - dojo::meta::introspect::Ty::Struct( - dojo::meta::introspect::Struct { - name: 'StructPacked1', - attrs: array![].span(), - children: array![ - dojo::meta::introspect::Member { - name: 'x', - attrs: array![].span(), - ty: dojo::meta::introspect::Introspect::::ty() - } - - ].span() - } - ) - } -} - -impl StructPacked2Introspect<> of dojo::meta::introspect::Introspect> { - #[inline(always)] - fn size() -> Option { - Option::Some(3) - } - - fn layout() -> dojo::meta::Layout { - dojo::meta::Layout::Fixed( - array![ - 8,128,128 - ].span() - ) - } - - #[inline(always)] - fn ty() -> dojo::meta::introspect::Ty { - dojo::meta::introspect::Ty::Struct( - dojo::meta::introspect::Struct { - name: 'StructPacked2', - attrs: array![].span(), - children: array![ - dojo::meta::introspect::Member { - name: 'x', - attrs: array![].span(), - ty: dojo::meta::introspect::Introspect::::ty() - }, -dojo::meta::introspect::Member { - name: 'y', - attrs: array![].span(), - ty: dojo::meta::introspect::Introspect::::ty() - } - - ].span() - } - ) - } -} - -impl StructPacked3Introspect<> of dojo::meta::introspect::Introspect> { - #[inline(always)] - fn size() -> Option { - Option::Some(4) - } - - fn layout() -> dojo::meta::Layout { - dojo::meta::Layout::Fixed( - array![ - 128,128,8,32 - ].span() - ) - } - - #[inline(always)] - fn ty() -> dojo::meta::introspect::Ty { - dojo::meta::introspect::Ty::Struct( - dojo::meta::introspect::Struct { - name: 'StructPacked3', - attrs: array![].span(), - children: array![ - dojo::meta::introspect::Member { - name: 'x', - attrs: array![].span(), - ty: dojo::meta::introspect::Introspect::::ty() - }, -dojo::meta::introspect::Member { - name: 'y', - attrs: array![].span(), - ty: dojo::meta::introspect::Ty::Tuple( - array![ - dojo::meta::introspect::Introspect::::ty(), -dojo::meta::introspect::Introspect::::ty() - ].span() - ) - } - - ].span() - } - ) - } -} - -impl StructNotPackable1Introspect<> of dojo::meta::introspect::Introspect> { - #[inline(always)] - fn size() -> Option { - Option::None - } - - fn layout() -> dojo::meta::Layout { - dojo::meta::Layout::Fixed( - array![ - 8,ERROR - ].span() - ) - } - - #[inline(always)] - fn ty() -> dojo::meta::introspect::Ty { - dojo::meta::introspect::Ty::Struct( - dojo::meta::introspect::Struct { - name: 'StructNotPackable1', - attrs: array![].span(), - children: array![ - dojo::meta::introspect::Member { - name: 'x', - attrs: array![].span(), - ty: dojo::meta::introspect::Introspect::::ty() - }, -dojo::meta::introspect::Member { - name: 'y', - attrs: array![].span(), - ty: dojo::meta::introspect::Ty::Array( - array![ - dojo::meta::introspect::Introspect::::ty() - ].span() - ) - } - - ].span() - } - ) - } -} - -impl StructPackableWithInnerPackedIntrospect<> of dojo::meta::introspect::Introspect> { - #[inline(always)] - fn size() -> Option { - let sizes : Array> = array![ - dojo::meta::introspect::Introspect::::size(), -Option::Some(1) - ]; - - - Option::Some(dojo::utils::sum(sizes)) - - } - - fn layout() -> dojo::meta::Layout { - let mut layouts = array![ - dojo::meta::Layout::Fixed(array![8].span()), -dojo::meta::introspect::Introspect::::layout() - ]; - let mut merged_layout = ArrayTrait::::new(); - - loop { - match ArrayTrait::pop_front(ref layouts) { - Option::Some(mut layout) => { - match layout { - dojo::meta::Layout::Fixed(mut l) => { - loop { - match SpanTrait::pop_front(ref l) { - Option::Some(x) => merged_layout.append(*x), - Option::None(_) => { break; } - }; - }; - }, - _ => panic!("A packed model layout must contain Fixed layouts only."), - }; - }, - Option::None(_) => { break; } - }; - }; - - dojo::meta::Layout::Fixed(merged_layout.span()) - - } - - #[inline(always)] - fn ty() -> dojo::meta::introspect::Ty { - dojo::meta::introspect::Ty::Struct( - dojo::meta::introspect::Struct { - name: 'StructPackableWithInnerPacked', - attrs: array![].span(), - children: array![ - dojo::meta::introspect::Member { - name: 'x', - attrs: array![].span(), - ty: dojo::meta::introspect::Introspect::::ty() - }, -dojo::meta::introspect::Member { - name: 'y', - attrs: array![].span(), - ty: dojo::meta::introspect::Introspect::::ty() - } - - ].span() - } - ) - } -} - -impl EnumPacked1Introspect<> of dojo::meta::introspect::Introspect> { - #[inline(always)] - fn size() -> Option { - Option::Some(1) - } - - fn layout() -> dojo::meta::Layout { - dojo::meta::Layout::Fixed( - array![ - 8 - ].span() - ) - } - - #[inline(always)] - fn ty() -> dojo::meta::introspect::Ty { - dojo::meta::introspect::Ty::Enum( - dojo::meta::introspect::Enum { - name: 'EnumPacked1', - attrs: array![].span(), - children: array![ - ('a', dojo::meta::introspect::Ty::Tuple(array![].span())), -('b', dojo::meta::introspect::Ty::Tuple(array![].span())), -('c', dojo::meta::introspect::Ty::Tuple(array![].span())) - - ].span() - } - ) - } -} - -impl EnumPacked2Introspect<> of dojo::meta::introspect::Introspect> { - #[inline(always)] - fn size() -> Option { - Option::Some(2) - } - - fn layout() -> dojo::meta::Layout { - dojo::meta::Layout::Fixed( - array![ - 8,8 - ].span() - ) - } - - #[inline(always)] - fn ty() -> dojo::meta::introspect::Ty { - dojo::meta::introspect::Ty::Enum( - dojo::meta::introspect::Enum { - name: 'EnumPacked2', - attrs: array![].span(), - children: array![ - ('a', dojo::meta::introspect::Introspect::::ty()), -('b', dojo::meta::introspect::Introspect::::ty()), -('c', dojo::meta::introspect::Introspect::::ty()) - - ].span() - } - ) - } -} - -impl EnumPacked3Introspect<> of dojo::meta::introspect::Introspect> { - #[inline(always)] - fn size() -> Option { - Option::Some(3) - } - - fn layout() -> dojo::meta::Layout { - dojo::meta::Layout::Fixed( - array![ - 8,128,128 - ].span() - ) - } - - #[inline(always)] - fn ty() -> dojo::meta::introspect::Ty { - dojo::meta::introspect::Ty::Enum( - dojo::meta::introspect::Enum { - name: 'EnumPacked3', - attrs: array![].span(), - children: array![ - ('a', dojo::meta::introspect::Ty::Tuple( - array![ - dojo::meta::introspect::Introspect::::ty(), -dojo::meta::introspect::Introspect::::ty() - ].span() - )), -('b', dojo::meta::introspect::Introspect::::ty()) - - ].span() - } - ) - } -} - -impl EnumPackableWithInnerPackedIntrospect<> of dojo::meta::introspect::Introspect> { - #[inline(always)] - fn size() -> Option { - let sizes : Array> = array![ - dojo::meta::introspect::Introspect::::size(), -Option::Some(1) - ]; - - - Option::Some(dojo::utils::sum(sizes)) - - } - - fn layout() -> dojo::meta::Layout { - let mut layouts = array![ - dojo::meta::Layout::Fixed(array![8].span()), -dojo::meta::introspect::Introspect::::layout() - ]; - let mut merged_layout = ArrayTrait::::new(); - - loop { - match ArrayTrait::pop_front(ref layouts) { - Option::Some(mut layout) => { - match layout { - dojo::meta::Layout::Fixed(mut l) => { - loop { - match SpanTrait::pop_front(ref l) { - Option::Some(x) => merged_layout.append(*x), - Option::None(_) => { break; } - }; - }; - }, - _ => panic!("A packed model layout must contain Fixed layouts only."), - }; - }, - Option::None(_) => { break; } - }; - }; - - dojo::meta::Layout::Fixed(merged_layout.span()) - - } - - #[inline(always)] - fn ty() -> dojo::meta::introspect::Ty { - dojo::meta::introspect::Ty::Enum( - dojo::meta::introspect::Enum { - name: 'EnumPackableWithInnerPacked', - attrs: array![].span(), - children: array![ - ('a', dojo::meta::introspect::Introspect::::ty()), -('b', dojo::meta::introspect::Introspect::::ty()) - - ].span() - } - ) - } -} - -impl EnumNotPackable1Introspect<> of dojo::meta::introspect::Introspect> { - #[inline(always)] - fn size() -> Option { - Option::None - } - - fn layout() -> dojo::meta::Layout { - ERROR - } - - #[inline(always)] - fn ty() -> dojo::meta::introspect::Ty { - dojo::meta::introspect::Ty::Enum( - dojo::meta::introspect::Enum { - name: 'EnumNotPackable1', - attrs: array![].span(), - children: array![ - ('a', dojo::meta::introspect::Introspect::::ty()), -('b', dojo::meta::introspect::Introspect::::ty()) - - ].span() - } - ) - } -} - -//! > expected_diagnostics -error: Option cannot be used with tuples. Prefer using a struct. - --> /tmp/plugin_test/introspect/src/lib.cairo:171:6 - x: Option<(u8, u16)> - ^*****************^ - -error: Option cannot be used with tuples. Prefer using a struct. - --> /tmp/plugin_test/introspect/src/lib.cairo:176:10 - first: Option<(u8, u16)>, - ^*****************^ - -error: Introspect and IntrospectPacked attributes cannot be used at a same time. - --> /tmp/plugin_test/introspect/src/lib.cairo:179:1 -#[derive(Introspect, IntrospectPacked)] -^*************************************^ - -error: Introspect and IntrospectPacked attributes cannot be used at a same time. - --> /tmp/plugin_test/introspect/src/lib.cairo:182:1 -#[derive(Introspect, IntrospectPacked)] -^*************************************^ - -error: Introspect and IntrospectPacked attributes cannot be used at a same time. - --> /tmp/plugin_test/introspect/src/lib.cairo:185:1 -#[derive(Introspect)] -^*******************^ - -error: Introspect and IntrospectPacked attributes cannot be used at a same time. - --> /tmp/plugin_test/introspect/src/lib.cairo:189:1 -#[derive(Introspect)] -^*******************^ - -error: Array field cannot be packed. - --> /tmp/plugin_test/introspect/src/lib.cairo:213:6 - y: Array - ^**********^ - -error: To be packed, all variants must have fixed layout of same size. - --> /tmp/plugin_test/introspect/src/lib.cairo:250:6 -enum EnumNotPackable1 { - ^**************^ diff --git a/crates/dojo/lang/src/plugin_test_data/model b/crates/dojo/lang/src/plugin_test_data/model deleted file mode 100644 index ad5ec36787..0000000000 --- a/crates/dojo/lang/src/plugin_test_data/model +++ /dev/null @@ -1,9182 +0,0 @@ -//! > Test expansion of the dojo::model. - -//! > test_runner_name -test_expand_plugin - -//! > test_id -model - -//! > cairo_code -#[dojo::model(version: 0)] -#[dojo::model(version: 0)] -struct BadModelMultipleAttr { - #[key] - id: felt252, - v: Vec3, -} - -#[dojo::model(version: 0, version: 0)] -struct BadModelMultipleVersions { - #[key] - id: felt252, - v: Vec3, -} - -#[dojo::model(version: hello)] -struct BadModelBadVersionType { - #[key] - id: felt252, - v: Vec3, -} - -#[dojo::model(version)] -struct BadModelNoVersionValue { - #[key] - id: felt252, - v: Vec3, -} - -#[dojo::model(my_arg: 1)] -struct BadModelUnexpectedArgWithValue { - #[key] - id: felt252, - v: Vec3, -} - -#[dojo::model(my_arg)] -struct BadModelUnexpectedArg { - #[key] - id: felt252, - v: Vec3, -} - -#[dojo::model(version: 2)] -struct BadModelNotSupportedVersion { - #[key] - id: felt252, - v: Vec3, -} - -#[dojo::model(version: 0)] -struct Modelv0 { - #[key] - id: felt252, - v: Vec3, -} - -#[dojo::model(namespace: 'MyNamespace')] -struct ModelWithBadNamespaceFormat { - #[key] - id: felt252, - v: Vec3, -} - -#[dojo::model(namespace: 'my_namespace')] -struct ModelWithShortStringNamespace { - #[key] - id: felt252, - v: Vec3, -} - -#[dojo::model(namespace: "my_namespace")] -struct ModelWithStringNamespace { - #[key] - id: felt252, - v: Vec3, -} - -#[dojo::model] -struct Position { - #[key] - id: felt252, - v: Vec3, -} - -#[dojo::model] -struct Roles { - role_ids: Array -} - -#[dojo::model] -struct OnlyKeyModel { - #[key] - id: felt252 -} - -#[dojo::model] -struct U256KeyModel { - #[key] - id: u256 -} - -#[dojo::model] -struct Player { - #[key] - game: felt252, - #[key] - player: ContractAddress, - name: felt252, -} - -#[dojo::model] -type OtherPlayer = Player; - -#[dojo::model] -struct ModelWithSimpleArray { - #[key] - player: ContractAddress, - x: u16, - y: Array -} - -#[dojo::model] -struct ModelWithByteArray { - #[key] - player: ContractAddress, - x: u16, - y: ByteArray -} - -#[dojo::model] -struct ModelWithComplexArray { - #[key] - player: ContractAddress, - x: u16, - y: Array -} - -#[dojo::model] -struct ModelWithTuple { - #[key] - player: ContractAddress, - x: u16, - y: (u8, u16, u32) -} - -#[dojo::model] -struct ModelWithTupleNoPrimitives { - #[key] - player: ContractAddress, - x: u16, - y: (u8, Vec3, u32) -} - -//! > expanded_cairo_code -#[dojo::model(version: 0)] -#[dojo::model(version: 0)] -struct BadModelMultipleAttr { - #[key] - id: felt252, - v: Vec3, -} - -#[dojo::model(version: 0, version: 0)] -struct BadModelMultipleVersions { - #[key] - id: felt252, - v: Vec3, -} - -#[dojo::model(version: hello)] -struct BadModelBadVersionType { - #[key] - id: felt252, - v: Vec3, -} - -#[dojo::model(version)] -struct BadModelNoVersionValue { - #[key] - id: felt252, - v: Vec3, -} - -#[dojo::model(my_arg: 1)] -struct BadModelUnexpectedArgWithValue { - #[key] - id: felt252, - v: Vec3, -} - -#[dojo::model(my_arg)] -struct BadModelUnexpectedArg { - #[key] - id: felt252, - v: Vec3, -} - -#[dojo::model(version: 2)] -struct BadModelNotSupportedVersion { - #[key] - id: felt252, - v: Vec3, -} - -#[dojo::model(version: 0)] -struct Modelv0 { - #[key] - id: felt252, - v: Vec3, -} - -#[dojo::model(namespace: 'MyNamespace')] -struct ModelWithBadNamespaceFormat { - #[key] - id: felt252, - v: Vec3, -} - -#[dojo::model(namespace: 'my_namespace')] -struct ModelWithShortStringNamespace { - #[key] - id: felt252, - v: Vec3, -} - -#[dojo::model(namespace: "my_namespace")] -struct ModelWithStringNamespace { - #[key] - id: felt252, - v: Vec3, -} - -#[dojo::model] -struct Position { - #[key] - id: felt252, - v: Vec3, -} - -#[dojo::model] -struct Roles { - role_ids: Array -} - -#[dojo::model] -struct OnlyKeyModel { - #[key] - id: felt252 -} - -#[dojo::model] -struct U256KeyModel { - #[key] - id: u256 -} - -#[dojo::model] -struct Player { - #[key] - game: felt252, - #[key] - player: ContractAddress, - name: felt252, -} - -#[dojo::model] -type OtherPlayer = Player; - -#[dojo::model] -struct ModelWithSimpleArray { - #[key] - player: ContractAddress, - x: u16, - y: Array -} - -#[dojo::model] -struct ModelWithByteArray { - #[key] - player: ContractAddress, - x: u16, - y: ByteArray -} - -#[dojo::model] -struct ModelWithComplexArray { - #[key] - player: ContractAddress, - x: u16, - y: Array -} - -#[dojo::model] -struct ModelWithTuple { - #[key] - player: ContractAddress, - x: u16, - y: (u8, u16, u32) -} - -#[dojo::model] -struct ModelWithTupleNoPrimitives { - #[key] - player: ContractAddress, - x: u16, - y: (u8, Vec3, u32) -} -impl Modelv0Introspect<> of dojo::meta::introspect::Introspect> { - #[inline(always)] - fn size() -> Option { - dojo::meta::introspect::Introspect::::size() - } - - fn layout() -> dojo::meta::Layout { - dojo::meta::Layout::Struct( - array![ - dojo::meta::FieldLayout { - selector: 578691550836206188651404750433984985630363913126316857592149308417275000080, - layout: dojo::meta::introspect::Introspect::::layout() - } - ].span() - ) - } - - #[inline(always)] - fn ty() -> dojo::meta::introspect::Ty { - dojo::meta::introspect::Ty::Struct( - dojo::meta::introspect::Struct { - name: 'Modelv0', - attrs: array![].span(), - children: array![ - dojo::meta::introspect::Member { - name: 'id', - attrs: array!['key'].span(), - ty: dojo::meta::introspect::Introspect::::ty() - }, -dojo::meta::introspect::Member { - name: 'v', - attrs: array![].span(), - ty: dojo::meta::introspect::Introspect::::ty() - } - - ].span() - } - ) - } -} - #[derive()] -pub struct Modelv0Entity { - __id: felt252, // private field - pub v: Vec3, - -} - -type Modelv0KeyType = felt252; - -pub impl Modelv0KeyParser of dojo::model::model::KeyParser{ - #[inline(always)] - fn parse_key(self: @Modelv0) -> Modelv0KeyType { - *self.id - } -} - -impl Modelv0EntityKey of dojo::model::entity::EntityKey { -} - -// Impl to get the static definition of a model -pub mod modelv_0_definition { - use super::Modelv0; - pub impl Modelv0DefinitionImpl of dojo::model::ModelDefinition{ - #[inline(always)] - fn name() -> ByteArray { - "Modelv0" - } - - #[inline(always)] - fn namespace() -> ByteArray { - "dojo_test" - } - - #[inline(always)] - fn tag() -> ByteArray { - "dojo_test-Modelv0" - } - - #[inline(always)] - fn version() -> u8 { - 0 - } - - #[inline(always)] - fn selector() -> felt252 { - "Modelv0" - } - - #[inline(always)] - fn name_hash() -> felt252 { - 2212879130471315306779111820244908968466545702031328551192231795237740448313 - } - - #[inline(always)] - fn namespace_hash() -> felt252 { - 1452123528942907587532668415362544424816022573043154497385993678618948064048 - } - - - #[inline(always)] - fn layout() -> dojo::meta::Layout { - dojo::meta::Introspect::::layout() - } - - #[inline(always)] - fn schema() -> dojo::meta::introspect::Ty { - dojo::meta::Introspect::::ty() - } - - #[inline(always)] - fn size() -> Option { - dojo::meta::Introspect::::size() - } - } - -} - - -pub impl Modelv0Definition = modelv_0_definition::Modelv0DefinitionImpl; -pub impl Modelv0EntityDefinition = modelv_0_definition::Modelv0DefinitionImpl; - -pub impl Modelv0ModelParser of dojo::model::model::ModelParser{ - fn serialize_keys(self: @Modelv0) -> Span { - let mut serialized = core::array::ArrayTrait::new(); - core::serde::Serde::serialize(self.id, ref serialized); - - core::array::ArrayTrait::span(@serialized) - } - fn serialize_values(self: @Modelv0) -> Span { - let mut serialized = core::array::ArrayTrait::new(); - core::serde::Serde::serialize(self.v, ref serialized); - - core::array::ArrayTrait::span(@serialized) - } -} - -pub impl Modelv0EntityParser of dojo::model::entity::EntityParser{ - fn parse_id(self: @Modelv0Entity) -> felt252 { - *self.__id - } - fn serialize_values(self: @Modelv0Entity) -> Span { - let mut serialized = core::array::ArrayTrait::new(); - core::serde::Serde::serialize(self.v, ref serialized); - - core::array::ArrayTrait::span(@serialized) - } -} - - -pub impl Modelv0ModelImpl = dojo::model::model::ModelImpl; -pub impl Modelv0Store = dojo::model::model::ModelStoreImpl; - -pub impl Modelv0EntityImpl = dojo::model::entity::EntityImpl; -pub impl Modelv0EntityStore = dojo::model::entity::EntityStoreImpl; - - -#[generate_trait] -pub impl Modelv0MembersStoreImpl of Modelv0MembersStore { - fn get_v(self: @dojo::world::IWorldDispatcher, key: Modelv0KeyType) -> Vec3 { - Modelv0Store::get_member(self, key, 578691550836206188651404750433984985630363913126316857592149308417275000080) - } - - fn get_v_from_id(self: @dojo::world::IWorldDispatcher, entity_id: felt252) -> Vec3 { - Modelv0EntityStore::get_member_from_id(self, entity_id, 578691550836206188651404750433984985630363913126316857592149308417275000080) - } - - fn update_v(self: dojo::world::IWorldDispatcher, key: Modelv0KeyType, value: Vec3) { - Modelv0Store::update_member(self, key, 578691550836206188651404750433984985630363913126316857592149308417275000080, value); - } - - fn update_v_from_id(self: dojo::world::IWorldDispatcher, entity_id: felt252, value: Vec3) { - Modelv0EntityStore::update_member_from_id(self, entity_id, 578691550836206188651404750433984985630363913126316857592149308417275000080, value); - } - - -} - - -#[starknet::interface] -pub trait IModelv0 { - fn ensure_abi(self: @T, model: Modelv0); -} - -#[starknet::contract] -pub mod modelv_0 { - use super::Modelv0; - use super::IModelv0; - - #[abi(embed_v0)] - impl DojoModelImpl = dojo::model::component::IModelImpl; - - #[abi(embed_v0)] - impl Modelv0Impl of IModelv0{ - fn ensure_abi(self: @ContractState, model: Modelv0) { - } - } -#[event] -#[derive(Drop, starknet::Event)] -pub enum Event {} - - -#[phantom] -pub struct Storage { -} - -#[derive(Drop, Copy)] -pub struct StorageStorageBase { -} -impl StorageStorageImpl of starknet::storage::StorageTrait { - type BaseType = StorageStorageBase; - fn storage(self: starknet::storage::FlattenedStorage) -> StorageStorageBase { - StorageStorageBase { - } - } -} -#[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 ContractState { -} - -impl ContractStateDrop of Drop {} - -impl ContractStateDeref of core::ops::SnapshotDeref { - type Target = starknet::storage::FlattenedStorage; - fn snapshot_deref(self: @ContractState) -> starknet::storage::FlattenedStorage { - starknet::storage::FlattenedStorage {} - } -} -impl ContractStateDerefMut of core::ops::DerefMut { - type Target = starknet::storage::FlattenedStorage> ; - fn deref_mut(ref self: ContractState) -> starknet::storage::FlattenedStorage> { - starknet::storage::FlattenedStorage {} - } -} -pub fn unsafe_new_contract_state() -> ContractState { - ContractState { - } -} - -// TODO(Gil): This generates duplicate diagnostics because of the plugin system, squash the duplicates into one. -#[deprecated( - feature: "deprecated_legacy_map", - note: "Use `starknet::storage::Map` instead." -)] -#[allow(unused_imports)] -use starknet::storage::Map as LegacyMap; - -impl ContractStateIModelImpl of - dojo::model::component::UnsafeNewContractStateTraitForIModelImpl { - fn unsafe_new_contract_state() -> ContractState { - unsafe_new_contract_state() - } -} -#[implicit_precedence(core::pedersen::Pedersen, core::RangeCheck, core::integer::Bitwise, core::ec::EcOp, core::poseidon::Poseidon, core::SegmentArena, core::circuit::RangeCheck96, core::circuit::AddMod, core::circuit::MulMod, core::gas::GasBuiltin, System)] -fn __wrapper__Modelv0Impl__ensure_abi(mut data: Span::) -> Span:: { - core::internal::require_implicit::(); - core::internal::revoke_ap_tracking(); - core::option::OptionTraitImpl::expect(core::gas::withdraw_gas(), 'Out of gas'); - let __arg_model = core::option::OptionTraitImpl::expect( - core::serde::Serde::::deserialize(ref data), - 'Failed to deserialize param #1' - ); - assert(core::array::SpanTrait::is_empty(data), 'Input too long for arguments'); - core::option::OptionTraitImpl::expect( - core::gas::withdraw_gas_all(core::gas::get_builtin_costs()), 'Out of gas', - ); - let mut contract_state = unsafe_new_contract_state(); - Modelv0Impl::ensure_abi(@contract_state, __arg_model); - let mut arr = ArrayTrait::new(); - // References. - // Result. - core::array::ArrayTrait::span(@arr) -} - - -pub mod __external { - pub use super::__wrapper__Modelv0Impl__ensure_abi as ensure_abi; -} -pub mod __l1_handler { -} -pub mod __constructor { -} - impl ContractStateEventEmitter of starknet::event::EventEmitter< - ContractState, Event - > { - fn emit>( - ref self: ContractState, event: S - ) { - let event: Event = core::traits::Into::into(event); - let mut keys = Default::::default(); - let mut data = Default::::default(); - starknet::Event::append_keys_and_data(@event, ref keys, ref data); - starknet::SyscallResultTrait::unwrap_syscall( - starknet::syscalls::emit_event_syscall( - core::array::ArrayTrait::span(@keys), - core::array::ArrayTrait::span(@data), - ) - ) - } - } -impl EventDrop of core::traits::Drop::; -impl EventIsEvent of starknet::Event { - fn append_keys_and_data( - self: @Event, ref keys: Array, ref data: Array - ) { - match self { - } - } - fn deserialize( - ref keys: Span, ref data: Span, - ) -> Option { - let __selector__ = *core::array::SpanTrait::pop_front(ref keys)?; - Option::None - } -} -impl StorageStorageBaseDrop of core::traits::Drop::; -impl StorageStorageBaseCopy of core::traits::Copy::; -impl StorageStorageBaseMutDrop of core::traits::Drop::; -impl StorageStorageBaseMutCopy of core::traits::Copy::; -} - -impl ModelWithBadNamespaceFormatIntrospect<> of dojo::meta::introspect::Introspect> { - #[inline(always)] - fn size() -> Option { - dojo::meta::introspect::Introspect::::size() - } - - fn layout() -> dojo::meta::Layout { - dojo::meta::Layout::Struct( - array![ - dojo::meta::FieldLayout { - selector: 578691550836206188651404750433984985630363913126316857592149308417275000080, - layout: dojo::meta::introspect::Introspect::::layout() - } - ].span() - ) - } - - #[inline(always)] - fn ty() -> dojo::meta::introspect::Ty { - dojo::meta::introspect::Ty::Struct( - dojo::meta::introspect::Struct { - name: 'ModelWithBadNamespaceFormat', - attrs: array![].span(), - children: array![ - dojo::meta::introspect::Member { - name: 'id', - attrs: array!['key'].span(), - ty: dojo::meta::introspect::Introspect::::ty() - }, -dojo::meta::introspect::Member { - name: 'v', - attrs: array![].span(), - ty: dojo::meta::introspect::Introspect::::ty() - } - - ].span() - } - ) - } -} - #[derive()] -pub struct ModelWithBadNamespaceFormatEntity { - __id: felt252, // private field - pub v: Vec3, - -} - -type ModelWithBadNamespaceFormatKeyType = felt252; - -pub impl ModelWithBadNamespaceFormatKeyParser of dojo::model::model::KeyParser{ - #[inline(always)] - fn parse_key(self: @ModelWithBadNamespaceFormat) -> ModelWithBadNamespaceFormatKeyType { - *self.id - } -} - -impl ModelWithBadNamespaceFormatEntityKey of dojo::model::entity::EntityKey { -} - -// Impl to get the static definition of a model -pub mod model_with_bad_namespace_format_definition { - use super::ModelWithBadNamespaceFormat; - pub impl ModelWithBadNamespaceFormatDefinitionImpl of dojo::model::ModelDefinition{ - #[inline(always)] - fn name() -> ByteArray { - "ModelWithBadNamespaceFormat" - } - - #[inline(always)] - fn namespace() -> ByteArray { - "MyNamespace" - } - - #[inline(always)] - fn tag() -> ByteArray { - "MyNamespace-ModelWithBadNamespaceFormat" - } - - #[inline(always)] - fn version() -> u8 { - 1 - } - - #[inline(always)] - fn selector() -> felt252 { - 3498075185010572568869958326439183660947774785526793544998939163671395407352 - } - - #[inline(always)] - fn name_hash() -> felt252 { - 513559242384681567568052881519197161166285694153303371154270254637843894159 - } - - #[inline(always)] - fn namespace_hash() -> felt252 { - 2518247443458975119180817677753479732439290689944304814934908400279022945373 - } - - - #[inline(always)] - fn layout() -> dojo::meta::Layout { - dojo::meta::Introspect::::layout() - } - - #[inline(always)] - fn schema() -> dojo::meta::introspect::Ty { - dojo::meta::Introspect::::ty() - } - - #[inline(always)] - fn size() -> Option { - dojo::meta::Introspect::::size() - } - } - -} - - -pub impl ModelWithBadNamespaceFormatDefinition = model_with_bad_namespace_format_definition::ModelWithBadNamespaceFormatDefinitionImpl; -pub impl ModelWithBadNamespaceFormatEntityDefinition = model_with_bad_namespace_format_definition::ModelWithBadNamespaceFormatDefinitionImpl; - -pub impl ModelWithBadNamespaceFormatModelParser of dojo::model::model::ModelParser{ - fn serialize_keys(self: @ModelWithBadNamespaceFormat) -> Span { - let mut serialized = core::array::ArrayTrait::new(); - core::serde::Serde::serialize(self.id, ref serialized); - - core::array::ArrayTrait::span(@serialized) - } - fn serialize_values(self: @ModelWithBadNamespaceFormat) -> Span { - let mut serialized = core::array::ArrayTrait::new(); - core::serde::Serde::serialize(self.v, ref serialized); - - core::array::ArrayTrait::span(@serialized) - } -} - -pub impl ModelWithBadNamespaceFormatEntityParser of dojo::model::entity::EntityParser{ - fn parse_id(self: @ModelWithBadNamespaceFormatEntity) -> felt252 { - *self.__id - } - fn serialize_values(self: @ModelWithBadNamespaceFormatEntity) -> Span { - let mut serialized = core::array::ArrayTrait::new(); - core::serde::Serde::serialize(self.v, ref serialized); - - core::array::ArrayTrait::span(@serialized) - } -} - - -pub impl ModelWithBadNamespaceFormatModelImpl = dojo::model::model::ModelImpl; -pub impl ModelWithBadNamespaceFormatStore = dojo::model::model::ModelStoreImpl; - -pub impl ModelWithBadNamespaceFormatEntityImpl = dojo::model::entity::EntityImpl; -pub impl ModelWithBadNamespaceFormatEntityStore = dojo::model::entity::EntityStoreImpl; - - -#[generate_trait] -pub impl ModelWithBadNamespaceFormatMembersStoreImpl of ModelWithBadNamespaceFormatMembersStore { - fn get_v(self: @dojo::world::IWorldDispatcher, key: ModelWithBadNamespaceFormatKeyType) -> Vec3 { - ModelWithBadNamespaceFormatStore::get_member(self, key, 578691550836206188651404750433984985630363913126316857592149308417275000080) - } - - fn get_v_from_id(self: @dojo::world::IWorldDispatcher, entity_id: felt252) -> Vec3 { - ModelWithBadNamespaceFormatEntityStore::get_member_from_id(self, entity_id, 578691550836206188651404750433984985630363913126316857592149308417275000080) - } - - fn update_v(self: dojo::world::IWorldDispatcher, key: ModelWithBadNamespaceFormatKeyType, value: Vec3) { - ModelWithBadNamespaceFormatStore::update_member(self, key, 578691550836206188651404750433984985630363913126316857592149308417275000080, value); - } - - fn update_v_from_id(self: dojo::world::IWorldDispatcher, entity_id: felt252, value: Vec3) { - ModelWithBadNamespaceFormatEntityStore::update_member_from_id(self, entity_id, 578691550836206188651404750433984985630363913126316857592149308417275000080, value); - } - - -} - - -#[starknet::interface] -pub trait IModelWithBadNamespaceFormat { - fn ensure_abi(self: @T, model: ModelWithBadNamespaceFormat); -} - -#[starknet::contract] -pub mod model_with_bad_namespace_format { - use super::ModelWithBadNamespaceFormat; - use super::IModelWithBadNamespaceFormat; - - #[abi(embed_v0)] - impl DojoModelImpl = dojo::model::component::IModelImpl; - - #[abi(embed_v0)] - impl ModelWithBadNamespaceFormatImpl of IModelWithBadNamespaceFormat{ - fn ensure_abi(self: @ContractState, model: ModelWithBadNamespaceFormat) { - } - } -#[event] -#[derive(Drop, starknet::Event)] -pub enum Event {} - - -#[phantom] -pub struct Storage { -} - -#[derive(Drop, Copy)] -pub struct StorageStorageBase { -} -impl StorageStorageImpl of starknet::storage::StorageTrait { - type BaseType = StorageStorageBase; - fn storage(self: starknet::storage::FlattenedStorage) -> StorageStorageBase { - StorageStorageBase { - } - } -} -#[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 ContractState { -} - -impl ContractStateDrop of Drop {} - -impl ContractStateDeref of core::ops::SnapshotDeref { - type Target = starknet::storage::FlattenedStorage; - fn snapshot_deref(self: @ContractState) -> starknet::storage::FlattenedStorage { - starknet::storage::FlattenedStorage {} - } -} -impl ContractStateDerefMut of core::ops::DerefMut { - type Target = starknet::storage::FlattenedStorage> ; - fn deref_mut(ref self: ContractState) -> starknet::storage::FlattenedStorage> { - starknet::storage::FlattenedStorage {} - } -} -pub fn unsafe_new_contract_state() -> ContractState { - ContractState { - } -} - -// TODO(Gil): This generates duplicate diagnostics because of the plugin system, squash the duplicates into one. -#[deprecated( - feature: "deprecated_legacy_map", - note: "Use `starknet::storage::Map` instead." -)] -#[allow(unused_imports)] -use starknet::storage::Map as LegacyMap; - -impl ContractStateIModelImpl of - dojo::model::component::UnsafeNewContractStateTraitForIModelImpl { - fn unsafe_new_contract_state() -> ContractState { - unsafe_new_contract_state() - } -} -#[implicit_precedence(core::pedersen::Pedersen, core::RangeCheck, core::integer::Bitwise, core::ec::EcOp, core::poseidon::Poseidon, core::SegmentArena, core::circuit::RangeCheck96, core::circuit::AddMod, core::circuit::MulMod, core::gas::GasBuiltin, System)] -fn __wrapper__ModelWithBadNamespaceFormatImpl__ensure_abi(mut data: Span::) -> Span:: { - core::internal::require_implicit::(); - core::internal::revoke_ap_tracking(); - core::option::OptionTraitImpl::expect(core::gas::withdraw_gas(), 'Out of gas'); - let __arg_model = core::option::OptionTraitImpl::expect( - core::serde::Serde::::deserialize(ref data), - 'Failed to deserialize param #1' - ); - assert(core::array::SpanTrait::is_empty(data), 'Input too long for arguments'); - core::option::OptionTraitImpl::expect( - core::gas::withdraw_gas_all(core::gas::get_builtin_costs()), 'Out of gas', - ); - let mut contract_state = unsafe_new_contract_state(); - ModelWithBadNamespaceFormatImpl::ensure_abi(@contract_state, __arg_model); - let mut arr = ArrayTrait::new(); - // References. - // Result. - core::array::ArrayTrait::span(@arr) -} - - -pub mod __external { - pub use super::__wrapper__ModelWithBadNamespaceFormatImpl__ensure_abi as ensure_abi; -} -pub mod __l1_handler { -} -pub mod __constructor { -} - impl ContractStateEventEmitter of starknet::event::EventEmitter< - ContractState, Event - > { - fn emit>( - ref self: ContractState, event: S - ) { - let event: Event = core::traits::Into::into(event); - let mut keys = Default::::default(); - let mut data = Default::::default(); - starknet::Event::append_keys_and_data(@event, ref keys, ref data); - starknet::SyscallResultTrait::unwrap_syscall( - starknet::syscalls::emit_event_syscall( - core::array::ArrayTrait::span(@keys), - core::array::ArrayTrait::span(@data), - ) - ) - } - } -impl EventDrop of core::traits::Drop::; -impl EventIsEvent of starknet::Event { - fn append_keys_and_data( - self: @Event, ref keys: Array, ref data: Array - ) { - match self { - } - } - fn deserialize( - ref keys: Span, ref data: Span, - ) -> Option { - let __selector__ = *core::array::SpanTrait::pop_front(ref keys)?; - Option::None - } -} -impl StorageStorageBaseDrop of core::traits::Drop::; -impl StorageStorageBaseCopy of core::traits::Copy::; -impl StorageStorageBaseMutDrop of core::traits::Drop::; -impl StorageStorageBaseMutCopy of core::traits::Copy::; -} - -impl ModelWithShortStringNamespaceIntrospect<> of dojo::meta::introspect::Introspect> { - #[inline(always)] - fn size() -> Option { - dojo::meta::introspect::Introspect::::size() - } - - fn layout() -> dojo::meta::Layout { - dojo::meta::Layout::Struct( - array![ - dojo::meta::FieldLayout { - selector: 578691550836206188651404750433984985630363913126316857592149308417275000080, - layout: dojo::meta::introspect::Introspect::::layout() - } - ].span() - ) - } - - #[inline(always)] - fn ty() -> dojo::meta::introspect::Ty { - dojo::meta::introspect::Ty::Struct( - dojo::meta::introspect::Struct { - name: 'ModelWithShortStringNamespace', - attrs: array![].span(), - children: array![ - dojo::meta::introspect::Member { - name: 'id', - attrs: array!['key'].span(), - ty: dojo::meta::introspect::Introspect::::ty() - }, -dojo::meta::introspect::Member { - name: 'v', - attrs: array![].span(), - ty: dojo::meta::introspect::Introspect::::ty() - } - - ].span() - } - ) - } -} - #[derive()] -pub struct ModelWithShortStringNamespaceEntity { - __id: felt252, // private field - pub v: Vec3, - -} - -type ModelWithShortStringNamespaceKeyType = felt252; - -pub impl ModelWithShortStringNamespaceKeyParser of dojo::model::model::KeyParser{ - #[inline(always)] - fn parse_key(self: @ModelWithShortStringNamespace) -> ModelWithShortStringNamespaceKeyType { - *self.id - } -} - -impl ModelWithShortStringNamespaceEntityKey of dojo::model::entity::EntityKey { -} - -// Impl to get the static definition of a model -pub mod model_with_short_string_namespace_definition { - use super::ModelWithShortStringNamespace; - pub impl ModelWithShortStringNamespaceDefinitionImpl of dojo::model::ModelDefinition{ - #[inline(always)] - fn name() -> ByteArray { - "ModelWithShortStringNamespace" - } - - #[inline(always)] - fn namespace() -> ByteArray { - "my_namespace" - } - - #[inline(always)] - fn tag() -> ByteArray { - "my_namespace-ModelWithShortStringNamespace" - } - - #[inline(always)] - fn version() -> u8 { - 1 - } - - #[inline(always)] - fn selector() -> felt252 { - 643350075018191729855964658181798951445581630505240307235771395728709379388 - } - - #[inline(always)] - fn name_hash() -> felt252 { - 4646597166239297873853881466258165424425132957303541470648153031188639878 - } - - #[inline(always)] - fn namespace_hash() -> felt252 { - 1685136890688416384941629523783652800960468745356230625531475538826800548713 - } - - - #[inline(always)] - fn layout() -> dojo::meta::Layout { - dojo::meta::Introspect::::layout() - } - - #[inline(always)] - fn schema() -> dojo::meta::introspect::Ty { - dojo::meta::Introspect::::ty() - } - - #[inline(always)] - fn size() -> Option { - dojo::meta::Introspect::::size() - } - } - -} - - -pub impl ModelWithShortStringNamespaceDefinition = model_with_short_string_namespace_definition::ModelWithShortStringNamespaceDefinitionImpl; -pub impl ModelWithShortStringNamespaceEntityDefinition = model_with_short_string_namespace_definition::ModelWithShortStringNamespaceDefinitionImpl; - -pub impl ModelWithShortStringNamespaceModelParser of dojo::model::model::ModelParser{ - fn serialize_keys(self: @ModelWithShortStringNamespace) -> Span { - let mut serialized = core::array::ArrayTrait::new(); - core::serde::Serde::serialize(self.id, ref serialized); - - core::array::ArrayTrait::span(@serialized) - } - fn serialize_values(self: @ModelWithShortStringNamespace) -> Span { - let mut serialized = core::array::ArrayTrait::new(); - core::serde::Serde::serialize(self.v, ref serialized); - - core::array::ArrayTrait::span(@serialized) - } -} - -pub impl ModelWithShortStringNamespaceEntityParser of dojo::model::entity::EntityParser{ - fn parse_id(self: @ModelWithShortStringNamespaceEntity) -> felt252 { - *self.__id - } - fn serialize_values(self: @ModelWithShortStringNamespaceEntity) -> Span { - let mut serialized = core::array::ArrayTrait::new(); - core::serde::Serde::serialize(self.v, ref serialized); - - core::array::ArrayTrait::span(@serialized) - } -} - - -pub impl ModelWithShortStringNamespaceModelImpl = dojo::model::model::ModelImpl; -pub impl ModelWithShortStringNamespaceStore = dojo::model::model::ModelStoreImpl; - -pub impl ModelWithShortStringNamespaceEntityImpl = dojo::model::entity::EntityImpl; -pub impl ModelWithShortStringNamespaceEntityStore = dojo::model::entity::EntityStoreImpl; - - -#[generate_trait] -pub impl ModelWithShortStringNamespaceMembersStoreImpl of ModelWithShortStringNamespaceMembersStore { - fn get_v(self: @dojo::world::IWorldDispatcher, key: ModelWithShortStringNamespaceKeyType) -> Vec3 { - ModelWithShortStringNamespaceStore::get_member(self, key, 578691550836206188651404750433984985630363913126316857592149308417275000080) - } - - fn get_v_from_id(self: @dojo::world::IWorldDispatcher, entity_id: felt252) -> Vec3 { - ModelWithShortStringNamespaceEntityStore::get_member_from_id(self, entity_id, 578691550836206188651404750433984985630363913126316857592149308417275000080) - } - - fn update_v(self: dojo::world::IWorldDispatcher, key: ModelWithShortStringNamespaceKeyType, value: Vec3) { - ModelWithShortStringNamespaceStore::update_member(self, key, 578691550836206188651404750433984985630363913126316857592149308417275000080, value); - } - - fn update_v_from_id(self: dojo::world::IWorldDispatcher, entity_id: felt252, value: Vec3) { - ModelWithShortStringNamespaceEntityStore::update_member_from_id(self, entity_id, 578691550836206188651404750433984985630363913126316857592149308417275000080, value); - } - - -} - - -#[starknet::interface] -pub trait IModelWithShortStringNamespace { - fn ensure_abi(self: @T, model: ModelWithShortStringNamespace); -} - -#[starknet::contract] -pub mod model_with_short_string_namespace { - use super::ModelWithShortStringNamespace; - use super::IModelWithShortStringNamespace; - - #[abi(embed_v0)] - impl DojoModelImpl = dojo::model::component::IModelImpl; - - #[abi(embed_v0)] - impl ModelWithShortStringNamespaceImpl of IModelWithShortStringNamespace{ - fn ensure_abi(self: @ContractState, model: ModelWithShortStringNamespace) { - } - } -#[event] -#[derive(Drop, starknet::Event)] -pub enum Event {} - - -#[phantom] -pub struct Storage { -} - -#[derive(Drop, Copy)] -pub struct StorageStorageBase { -} -impl StorageStorageImpl of starknet::storage::StorageTrait { - type BaseType = StorageStorageBase; - fn storage(self: starknet::storage::FlattenedStorage) -> StorageStorageBase { - StorageStorageBase { - } - } -} -#[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 ContractState { -} - -impl ContractStateDrop of Drop {} - -impl ContractStateDeref of core::ops::SnapshotDeref { - type Target = starknet::storage::FlattenedStorage; - fn snapshot_deref(self: @ContractState) -> starknet::storage::FlattenedStorage { - starknet::storage::FlattenedStorage {} - } -} -impl ContractStateDerefMut of core::ops::DerefMut { - type Target = starknet::storage::FlattenedStorage> ; - fn deref_mut(ref self: ContractState) -> starknet::storage::FlattenedStorage> { - starknet::storage::FlattenedStorage {} - } -} -pub fn unsafe_new_contract_state() -> ContractState { - ContractState { - } -} - -// TODO(Gil): This generates duplicate diagnostics because of the plugin system, squash the duplicates into one. -#[deprecated( - feature: "deprecated_legacy_map", - note: "Use `starknet::storage::Map` instead." -)] -#[allow(unused_imports)] -use starknet::storage::Map as LegacyMap; - -impl ContractStateIModelImpl of - dojo::model::component::UnsafeNewContractStateTraitForIModelImpl { - fn unsafe_new_contract_state() -> ContractState { - unsafe_new_contract_state() - } -} -#[implicit_precedence(core::pedersen::Pedersen, core::RangeCheck, core::integer::Bitwise, core::ec::EcOp, core::poseidon::Poseidon, core::SegmentArena, core::circuit::RangeCheck96, core::circuit::AddMod, core::circuit::MulMod, core::gas::GasBuiltin, System)] -fn __wrapper__ModelWithShortStringNamespaceImpl__ensure_abi(mut data: Span::) -> Span:: { - core::internal::require_implicit::(); - core::internal::revoke_ap_tracking(); - core::option::OptionTraitImpl::expect(core::gas::withdraw_gas(), 'Out of gas'); - let __arg_model = core::option::OptionTraitImpl::expect( - core::serde::Serde::::deserialize(ref data), - 'Failed to deserialize param #1' - ); - assert(core::array::SpanTrait::is_empty(data), 'Input too long for arguments'); - core::option::OptionTraitImpl::expect( - core::gas::withdraw_gas_all(core::gas::get_builtin_costs()), 'Out of gas', - ); - let mut contract_state = unsafe_new_contract_state(); - ModelWithShortStringNamespaceImpl::ensure_abi(@contract_state, __arg_model); - let mut arr = ArrayTrait::new(); - // References. - // Result. - core::array::ArrayTrait::span(@arr) -} - - -pub mod __external { - pub use super::__wrapper__ModelWithShortStringNamespaceImpl__ensure_abi as ensure_abi; -} -pub mod __l1_handler { -} -pub mod __constructor { -} - impl ContractStateEventEmitter of starknet::event::EventEmitter< - ContractState, Event - > { - fn emit>( - ref self: ContractState, event: S - ) { - let event: Event = core::traits::Into::into(event); - let mut keys = Default::::default(); - let mut data = Default::::default(); - starknet::Event::append_keys_and_data(@event, ref keys, ref data); - starknet::SyscallResultTrait::unwrap_syscall( - starknet::syscalls::emit_event_syscall( - core::array::ArrayTrait::span(@keys), - core::array::ArrayTrait::span(@data), - ) - ) - } - } -impl EventDrop of core::traits::Drop::; -impl EventIsEvent of starknet::Event { - fn append_keys_and_data( - self: @Event, ref keys: Array, ref data: Array - ) { - match self { - } - } - fn deserialize( - ref keys: Span, ref data: Span, - ) -> Option { - let __selector__ = *core::array::SpanTrait::pop_front(ref keys)?; - Option::None - } -} -impl StorageStorageBaseDrop of core::traits::Drop::; -impl StorageStorageBaseCopy of core::traits::Copy::; -impl StorageStorageBaseMutDrop of core::traits::Drop::; -impl StorageStorageBaseMutCopy of core::traits::Copy::; -} - -impl ModelWithStringNamespaceIntrospect<> of dojo::meta::introspect::Introspect> { - #[inline(always)] - fn size() -> Option { - dojo::meta::introspect::Introspect::::size() - } - - fn layout() -> dojo::meta::Layout { - dojo::meta::Layout::Struct( - array![ - dojo::meta::FieldLayout { - selector: 578691550836206188651404750433984985630363913126316857592149308417275000080, - layout: dojo::meta::introspect::Introspect::::layout() - } - ].span() - ) - } - - #[inline(always)] - fn ty() -> dojo::meta::introspect::Ty { - dojo::meta::introspect::Ty::Struct( - dojo::meta::introspect::Struct { - name: 'ModelWithStringNamespace', - attrs: array![].span(), - children: array![ - dojo::meta::introspect::Member { - name: 'id', - attrs: array!['key'].span(), - ty: dojo::meta::introspect::Introspect::::ty() - }, -dojo::meta::introspect::Member { - name: 'v', - attrs: array![].span(), - ty: dojo::meta::introspect::Introspect::::ty() - } - - ].span() - } - ) - } -} - #[derive()] -pub struct ModelWithStringNamespaceEntity { - __id: felt252, // private field - pub v: Vec3, - -} - -type ModelWithStringNamespaceKeyType = felt252; - -pub impl ModelWithStringNamespaceKeyParser of dojo::model::model::KeyParser{ - #[inline(always)] - fn parse_key(self: @ModelWithStringNamespace) -> ModelWithStringNamespaceKeyType { - *self.id - } -} - -impl ModelWithStringNamespaceEntityKey of dojo::model::entity::EntityKey { -} - -// Impl to get the static definition of a model -pub mod model_with_string_namespace_definition { - use super::ModelWithStringNamespace; - pub impl ModelWithStringNamespaceDefinitionImpl of dojo::model::ModelDefinition{ - #[inline(always)] - fn name() -> ByteArray { - "ModelWithStringNamespace" - } - - #[inline(always)] - fn namespace() -> ByteArray { - "my_namespace" - } - - #[inline(always)] - fn tag() -> ByteArray { - "my_namespace-ModelWithStringNamespace" - } - - #[inline(always)] - fn version() -> u8 { - 1 - } - - #[inline(always)] - fn selector() -> felt252 { - 2567055065785696374111447326195815858786390804996225951953791904194802101726 - } - - #[inline(always)] - fn name_hash() -> felt252 { - 36187013840655350498900857372670392628596870210415176261336407419317644423 - } - - #[inline(always)] - fn namespace_hash() -> felt252 { - 1685136890688416384941629523783652800960468745356230625531475538826800548713 - } - - - #[inline(always)] - fn layout() -> dojo::meta::Layout { - dojo::meta::Introspect::::layout() - } - - #[inline(always)] - fn schema() -> dojo::meta::introspect::Ty { - dojo::meta::Introspect::::ty() - } - - #[inline(always)] - fn size() -> Option { - dojo::meta::Introspect::::size() - } - } - -} - - -pub impl ModelWithStringNamespaceDefinition = model_with_string_namespace_definition::ModelWithStringNamespaceDefinitionImpl; -pub impl ModelWithStringNamespaceEntityDefinition = model_with_string_namespace_definition::ModelWithStringNamespaceDefinitionImpl; - -pub impl ModelWithStringNamespaceModelParser of dojo::model::model::ModelParser{ - fn serialize_keys(self: @ModelWithStringNamespace) -> Span { - let mut serialized = core::array::ArrayTrait::new(); - core::serde::Serde::serialize(self.id, ref serialized); - - core::array::ArrayTrait::span(@serialized) - } - fn serialize_values(self: @ModelWithStringNamespace) -> Span { - let mut serialized = core::array::ArrayTrait::new(); - core::serde::Serde::serialize(self.v, ref serialized); - - core::array::ArrayTrait::span(@serialized) - } -} - -pub impl ModelWithStringNamespaceEntityParser of dojo::model::entity::EntityParser{ - fn parse_id(self: @ModelWithStringNamespaceEntity) -> felt252 { - *self.__id - } - fn serialize_values(self: @ModelWithStringNamespaceEntity) -> Span { - let mut serialized = core::array::ArrayTrait::new(); - core::serde::Serde::serialize(self.v, ref serialized); - - core::array::ArrayTrait::span(@serialized) - } -} - - -pub impl ModelWithStringNamespaceModelImpl = dojo::model::model::ModelImpl; -pub impl ModelWithStringNamespaceStore = dojo::model::model::ModelStoreImpl; - -pub impl ModelWithStringNamespaceEntityImpl = dojo::model::entity::EntityImpl; -pub impl ModelWithStringNamespaceEntityStore = dojo::model::entity::EntityStoreImpl; - - -#[generate_trait] -pub impl ModelWithStringNamespaceMembersStoreImpl of ModelWithStringNamespaceMembersStore { - fn get_v(self: @dojo::world::IWorldDispatcher, key: ModelWithStringNamespaceKeyType) -> Vec3 { - ModelWithStringNamespaceStore::get_member(self, key, 578691550836206188651404750433984985630363913126316857592149308417275000080) - } - - fn get_v_from_id(self: @dojo::world::IWorldDispatcher, entity_id: felt252) -> Vec3 { - ModelWithStringNamespaceEntityStore::get_member_from_id(self, entity_id, 578691550836206188651404750433984985630363913126316857592149308417275000080) - } - - fn update_v(self: dojo::world::IWorldDispatcher, key: ModelWithStringNamespaceKeyType, value: Vec3) { - ModelWithStringNamespaceStore::update_member(self, key, 578691550836206188651404750433984985630363913126316857592149308417275000080, value); - } - - fn update_v_from_id(self: dojo::world::IWorldDispatcher, entity_id: felt252, value: Vec3) { - ModelWithStringNamespaceEntityStore::update_member_from_id(self, entity_id, 578691550836206188651404750433984985630363913126316857592149308417275000080, value); - } - - -} - - -#[starknet::interface] -pub trait IModelWithStringNamespace { - fn ensure_abi(self: @T, model: ModelWithStringNamespace); -} - -#[starknet::contract] -pub mod model_with_string_namespace { - use super::ModelWithStringNamespace; - use super::IModelWithStringNamespace; - - #[abi(embed_v0)] - impl DojoModelImpl = dojo::model::component::IModelImpl; - - #[abi(embed_v0)] - impl ModelWithStringNamespaceImpl of IModelWithStringNamespace{ - fn ensure_abi(self: @ContractState, model: ModelWithStringNamespace) { - } - } -#[event] -#[derive(Drop, starknet::Event)] -pub enum Event {} - - -#[phantom] -pub struct Storage { -} - -#[derive(Drop, Copy)] -pub struct StorageStorageBase { -} -impl StorageStorageImpl of starknet::storage::StorageTrait { - type BaseType = StorageStorageBase; - fn storage(self: starknet::storage::FlattenedStorage) -> StorageStorageBase { - StorageStorageBase { - } - } -} -#[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 ContractState { -} - -impl ContractStateDrop of Drop {} - -impl ContractStateDeref of core::ops::SnapshotDeref { - type Target = starknet::storage::FlattenedStorage; - fn snapshot_deref(self: @ContractState) -> starknet::storage::FlattenedStorage { - starknet::storage::FlattenedStorage {} - } -} -impl ContractStateDerefMut of core::ops::DerefMut { - type Target = starknet::storage::FlattenedStorage> ; - fn deref_mut(ref self: ContractState) -> starknet::storage::FlattenedStorage> { - starknet::storage::FlattenedStorage {} - } -} -pub fn unsafe_new_contract_state() -> ContractState { - ContractState { - } -} - -// TODO(Gil): This generates duplicate diagnostics because of the plugin system, squash the duplicates into one. -#[deprecated( - feature: "deprecated_legacy_map", - note: "Use `starknet::storage::Map` instead." -)] -#[allow(unused_imports)] -use starknet::storage::Map as LegacyMap; - -impl ContractStateIModelImpl of - dojo::model::component::UnsafeNewContractStateTraitForIModelImpl { - fn unsafe_new_contract_state() -> ContractState { - unsafe_new_contract_state() - } -} -#[implicit_precedence(core::pedersen::Pedersen, core::RangeCheck, core::integer::Bitwise, core::ec::EcOp, core::poseidon::Poseidon, core::SegmentArena, core::circuit::RangeCheck96, core::circuit::AddMod, core::circuit::MulMod, core::gas::GasBuiltin, System)] -fn __wrapper__ModelWithStringNamespaceImpl__ensure_abi(mut data: Span::) -> Span:: { - core::internal::require_implicit::(); - core::internal::revoke_ap_tracking(); - core::option::OptionTraitImpl::expect(core::gas::withdraw_gas(), 'Out of gas'); - let __arg_model = core::option::OptionTraitImpl::expect( - core::serde::Serde::::deserialize(ref data), - 'Failed to deserialize param #1' - ); - assert(core::array::SpanTrait::is_empty(data), 'Input too long for arguments'); - core::option::OptionTraitImpl::expect( - core::gas::withdraw_gas_all(core::gas::get_builtin_costs()), 'Out of gas', - ); - let mut contract_state = unsafe_new_contract_state(); - ModelWithStringNamespaceImpl::ensure_abi(@contract_state, __arg_model); - let mut arr = ArrayTrait::new(); - // References. - // Result. - core::array::ArrayTrait::span(@arr) -} - - -pub mod __external { - pub use super::__wrapper__ModelWithStringNamespaceImpl__ensure_abi as ensure_abi; -} -pub mod __l1_handler { -} -pub mod __constructor { -} - impl ContractStateEventEmitter of starknet::event::EventEmitter< - ContractState, Event - > { - fn emit>( - ref self: ContractState, event: S - ) { - let event: Event = core::traits::Into::into(event); - let mut keys = Default::::default(); - let mut data = Default::::default(); - starknet::Event::append_keys_and_data(@event, ref keys, ref data); - starknet::SyscallResultTrait::unwrap_syscall( - starknet::syscalls::emit_event_syscall( - core::array::ArrayTrait::span(@keys), - core::array::ArrayTrait::span(@data), - ) - ) - } - } -impl EventDrop of core::traits::Drop::; -impl EventIsEvent of starknet::Event { - fn append_keys_and_data( - self: @Event, ref keys: Array, ref data: Array - ) { - match self { - } - } - fn deserialize( - ref keys: Span, ref data: Span, - ) -> Option { - let __selector__ = *core::array::SpanTrait::pop_front(ref keys)?; - Option::None - } -} -impl StorageStorageBaseDrop of core::traits::Drop::; -impl StorageStorageBaseCopy of core::traits::Copy::; -impl StorageStorageBaseMutDrop of core::traits::Drop::; -impl StorageStorageBaseMutCopy of core::traits::Copy::; -} - -impl PositionIntrospect<> of dojo::meta::introspect::Introspect> { - #[inline(always)] - fn size() -> Option { - dojo::meta::introspect::Introspect::::size() - } - - fn layout() -> dojo::meta::Layout { - dojo::meta::Layout::Struct( - array![ - dojo::meta::FieldLayout { - selector: 578691550836206188651404750433984985630363913126316857592149308417275000080, - layout: dojo::meta::introspect::Introspect::::layout() - } - ].span() - ) - } - - #[inline(always)] - fn ty() -> dojo::meta::introspect::Ty { - dojo::meta::introspect::Ty::Struct( - dojo::meta::introspect::Struct { - name: 'Position', - attrs: array![].span(), - children: array![ - dojo::meta::introspect::Member { - name: 'id', - attrs: array!['key'].span(), - ty: dojo::meta::introspect::Introspect::::ty() - }, -dojo::meta::introspect::Member { - name: 'v', - attrs: array![].span(), - ty: dojo::meta::introspect::Introspect::::ty() - } - - ].span() - } - ) - } -} - #[derive()] -pub struct PositionEntity { - __id: felt252, // private field - pub v: Vec3, - -} - -type PositionKeyType = felt252; - -pub impl PositionKeyParser of dojo::model::model::KeyParser{ - #[inline(always)] - fn parse_key(self: @Position) -> PositionKeyType { - *self.id - } -} - -impl PositionEntityKey of dojo::model::entity::EntityKey { -} - -// Impl to get the static definition of a model -pub mod position_definition { - use super::Position; - pub impl PositionDefinitionImpl of dojo::model::ModelDefinition{ - #[inline(always)] - fn name() -> ByteArray { - "Position" - } - - #[inline(always)] - fn namespace() -> ByteArray { - "dojo_test" - } - - #[inline(always)] - fn tag() -> ByteArray { - "dojo_test-Position" - } - - #[inline(always)] - fn version() -> u8 { - 1 - } - - #[inline(always)] - fn selector() -> felt252 { - 1782729361185285637005619480739442196364037716000358448825261820703351159758 - } - - #[inline(always)] - fn name_hash() -> felt252 { - 2899920299641094436341712346886623904698864491830316325765258522168980161362 - } - - #[inline(always)] - fn namespace_hash() -> felt252 { - 1452123528942907587532668415362544424816022573043154497385993678618948064048 - } - - - #[inline(always)] - fn layout() -> dojo::meta::Layout { - dojo::meta::Introspect::::layout() - } - - #[inline(always)] - fn schema() -> dojo::meta::introspect::Ty { - dojo::meta::Introspect::::ty() - } - - #[inline(always)] - fn size() -> Option { - dojo::meta::Introspect::::size() - } - } - -} - - -pub impl PositionDefinition = position_definition::PositionDefinitionImpl; -pub impl PositionEntityDefinition = position_definition::PositionDefinitionImpl; - -pub impl PositionModelParser of dojo::model::model::ModelParser{ - fn serialize_keys(self: @Position) -> Span { - let mut serialized = core::array::ArrayTrait::new(); - core::serde::Serde::serialize(self.id, ref serialized); - - core::array::ArrayTrait::span(@serialized) - } - fn serialize_values(self: @Position) -> Span { - let mut serialized = core::array::ArrayTrait::new(); - core::serde::Serde::serialize(self.v, ref serialized); - - core::array::ArrayTrait::span(@serialized) - } -} - -pub impl PositionEntityParser of dojo::model::entity::EntityParser{ - fn parse_id(self: @PositionEntity) -> felt252 { - *self.__id - } - fn serialize_values(self: @PositionEntity) -> Span { - let mut serialized = core::array::ArrayTrait::new(); - core::serde::Serde::serialize(self.v, ref serialized); - - core::array::ArrayTrait::span(@serialized) - } -} - - -pub impl PositionModelImpl = dojo::model::model::ModelImpl; -pub impl PositionStore = dojo::model::model::ModelStoreImpl; - -pub impl PositionEntityImpl = dojo::model::entity::EntityImpl; -pub impl PositionEntityStore = dojo::model::entity::EntityStoreImpl; - - -#[generate_trait] -pub impl PositionMembersStoreImpl of PositionMembersStore { - fn get_v(self: @dojo::world::IWorldDispatcher, key: PositionKeyType) -> Vec3 { - PositionStore::get_member(self, key, 578691550836206188651404750433984985630363913126316857592149308417275000080) - } - - fn get_v_from_id(self: @dojo::world::IWorldDispatcher, entity_id: felt252) -> Vec3 { - PositionEntityStore::get_member_from_id(self, entity_id, 578691550836206188651404750433984985630363913126316857592149308417275000080) - } - - fn update_v(self: dojo::world::IWorldDispatcher, key: PositionKeyType, value: Vec3) { - PositionStore::update_member(self, key, 578691550836206188651404750433984985630363913126316857592149308417275000080, value); - } - - fn update_v_from_id(self: dojo::world::IWorldDispatcher, entity_id: felt252, value: Vec3) { - PositionEntityStore::update_member_from_id(self, entity_id, 578691550836206188651404750433984985630363913126316857592149308417275000080, value); - } - - -} - - -#[starknet::interface] -pub trait IPosition { - fn ensure_abi(self: @T, model: Position); -} - -#[starknet::contract] -pub mod position { - use super::Position; - use super::IPosition; - - #[abi(embed_v0)] - impl DojoModelImpl = dojo::model::component::IModelImpl; - - #[abi(embed_v0)] - impl PositionImpl of IPosition{ - fn ensure_abi(self: @ContractState, model: Position) { - } - } -#[event] -#[derive(Drop, starknet::Event)] -pub enum Event {} - - -#[phantom] -pub struct Storage { -} - -#[derive(Drop, Copy)] -pub struct StorageStorageBase { -} -impl StorageStorageImpl of starknet::storage::StorageTrait { - type BaseType = StorageStorageBase; - fn storage(self: starknet::storage::FlattenedStorage) -> StorageStorageBase { - StorageStorageBase { - } - } -} -#[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 ContractState { -} - -impl ContractStateDrop of Drop {} - -impl ContractStateDeref of core::ops::SnapshotDeref { - type Target = starknet::storage::FlattenedStorage; - fn snapshot_deref(self: @ContractState) -> starknet::storage::FlattenedStorage { - starknet::storage::FlattenedStorage {} - } -} -impl ContractStateDerefMut of core::ops::DerefMut { - type Target = starknet::storage::FlattenedStorage> ; - fn deref_mut(ref self: ContractState) -> starknet::storage::FlattenedStorage> { - starknet::storage::FlattenedStorage {} - } -} -pub fn unsafe_new_contract_state() -> ContractState { - ContractState { - } -} - -// TODO(Gil): This generates duplicate diagnostics because of the plugin system, squash the duplicates into one. -#[deprecated( - feature: "deprecated_legacy_map", - note: "Use `starknet::storage::Map` instead." -)] -#[allow(unused_imports)] -use starknet::storage::Map as LegacyMap; - -impl ContractStateIModelImpl of - dojo::model::component::UnsafeNewContractStateTraitForIModelImpl { - fn unsafe_new_contract_state() -> ContractState { - unsafe_new_contract_state() - } -} -#[implicit_precedence(core::pedersen::Pedersen, core::RangeCheck, core::integer::Bitwise, core::ec::EcOp, core::poseidon::Poseidon, core::SegmentArena, core::circuit::RangeCheck96, core::circuit::AddMod, core::circuit::MulMod, core::gas::GasBuiltin, System)] -fn __wrapper__PositionImpl__ensure_abi(mut data: Span::) -> Span:: { - core::internal::require_implicit::(); - core::internal::revoke_ap_tracking(); - core::option::OptionTraitImpl::expect(core::gas::withdraw_gas(), 'Out of gas'); - let __arg_model = core::option::OptionTraitImpl::expect( - core::serde::Serde::::deserialize(ref data), - 'Failed to deserialize param #1' - ); - assert(core::array::SpanTrait::is_empty(data), 'Input too long for arguments'); - core::option::OptionTraitImpl::expect( - core::gas::withdraw_gas_all(core::gas::get_builtin_costs()), 'Out of gas', - ); - let mut contract_state = unsafe_new_contract_state(); - PositionImpl::ensure_abi(@contract_state, __arg_model); - let mut arr = ArrayTrait::new(); - // References. - // Result. - core::array::ArrayTrait::span(@arr) -} - - -pub mod __external { - pub use super::__wrapper__PositionImpl__ensure_abi as ensure_abi; -} -pub mod __l1_handler { -} -pub mod __constructor { -} - impl ContractStateEventEmitter of starknet::event::EventEmitter< - ContractState, Event - > { - fn emit>( - ref self: ContractState, event: S - ) { - let event: Event = core::traits::Into::into(event); - let mut keys = Default::::default(); - let mut data = Default::::default(); - starknet::Event::append_keys_and_data(@event, ref keys, ref data); - starknet::SyscallResultTrait::unwrap_syscall( - starknet::syscalls::emit_event_syscall( - core::array::ArrayTrait::span(@keys), - core::array::ArrayTrait::span(@data), - ) - ) - } - } -impl EventDrop of core::traits::Drop::; -impl EventIsEvent of starknet::Event { - fn append_keys_and_data( - self: @Event, ref keys: Array, ref data: Array - ) { - match self { - } - } - fn deserialize( - ref keys: Span, ref data: Span, - ) -> Option { - let __selector__ = *core::array::SpanTrait::pop_front(ref keys)?; - Option::None - } -} -impl StorageStorageBaseDrop of core::traits::Drop::; -impl StorageStorageBaseCopy of core::traits::Copy::; -impl StorageStorageBaseMutDrop of core::traits::Drop::; -impl StorageStorageBaseMutCopy of core::traits::Copy::; -} - -impl PlayerIntrospect<> of dojo::meta::introspect::Introspect> { - #[inline(always)] - fn size() -> Option { - Option::Some(1) - } - - fn layout() -> dojo::meta::Layout { - dojo::meta::Layout::Struct( - array![ - dojo::meta::FieldLayout { - selector: 1528802474226268325865027367859591458315299653151958663884057507666229546336, - layout: dojo::meta::introspect::Introspect::::layout() - } - ].span() - ) - } - - #[inline(always)] - fn ty() -> dojo::meta::introspect::Ty { - dojo::meta::introspect::Ty::Struct( - dojo::meta::introspect::Struct { - name: 'Player', - attrs: array![].span(), - children: array![ - dojo::meta::introspect::Member { - name: 'game', - attrs: array!['key'].span(), - ty: dojo::meta::introspect::Introspect::::ty() - }, -dojo::meta::introspect::Member { - name: 'player', - attrs: array!['key'].span(), - ty: dojo::meta::introspect::Introspect::::ty() - }, -dojo::meta::introspect::Member { - name: 'name', - attrs: array![].span(), - ty: dojo::meta::introspect::Introspect::::ty() - } - - ].span() - } - ) - } -} - #[derive()] -pub struct PlayerEntity { - __id: felt252, // private field - pub name: felt252, - -} - -type PlayerKeyType = (felt252, ContractAddress); - -pub impl PlayerKeyParser of dojo::model::model::KeyParser{ - #[inline(always)] - fn parse_key(self: @Player) -> PlayerKeyType { - (*self.game, *self.player) - } -} - -impl PlayerEntityKey of dojo::model::entity::EntityKey { -} - -// Impl to get the static definition of a model -pub mod player_definition { - use super::Player; - pub impl PlayerDefinitionImpl of dojo::model::ModelDefinition{ - #[inline(always)] - fn name() -> ByteArray { - "Player" - } - - #[inline(always)] - fn namespace() -> ByteArray { - "dojo_test" - } - - #[inline(always)] - fn tag() -> ByteArray { - "dojo_test-Player" - } - - #[inline(always)] - fn version() -> u8 { - 1 - } - - #[inline(always)] - fn selector() -> felt252 { - 32472305970791489884889070587064570056671760620943135506258424375410423946 - } - - #[inline(always)] - fn name_hash() -> felt252 { - 1073075359926275415180704315933677548333097210683379121732618306925003101845 - } - - #[inline(always)] - fn namespace_hash() -> felt252 { - 1452123528942907587532668415362544424816022573043154497385993678618948064048 - } - - - #[inline(always)] - fn layout() -> dojo::meta::Layout { - dojo::meta::Introspect::::layout() - } - - #[inline(always)] - fn schema() -> dojo::meta::introspect::Ty { - dojo::meta::Introspect::::ty() - } - - #[inline(always)] - fn size() -> Option { - dojo::meta::Introspect::::size() - } - } - -} - - -pub impl PlayerDefinition = player_definition::PlayerDefinitionImpl; -pub impl PlayerEntityDefinition = player_definition::PlayerDefinitionImpl; - -pub impl PlayerModelParser of dojo::model::model::ModelParser{ - fn serialize_keys(self: @Player) -> Span { - let mut serialized = core::array::ArrayTrait::new(); - core::serde::Serde::serialize(self.game, ref serialized); -core::serde::Serde::serialize(self.player, ref serialized); - - core::array::ArrayTrait::span(@serialized) - } - fn serialize_values(self: @Player) -> Span { - let mut serialized = core::array::ArrayTrait::new(); - core::serde::Serde::serialize(self.name, ref serialized); - - core::array::ArrayTrait::span(@serialized) - } -} - -pub impl PlayerEntityParser of dojo::model::entity::EntityParser{ - fn parse_id(self: @PlayerEntity) -> felt252 { - *self.__id - } - fn serialize_values(self: @PlayerEntity) -> Span { - let mut serialized = core::array::ArrayTrait::new(); - core::serde::Serde::serialize(self.name, ref serialized); - - core::array::ArrayTrait::span(@serialized) - } -} - - -pub impl PlayerModelImpl = dojo::model::model::ModelImpl; -pub impl PlayerStore = dojo::model::model::ModelStoreImpl; - -pub impl PlayerEntityImpl = dojo::model::entity::EntityImpl; -pub impl PlayerEntityStore = dojo::model::entity::EntityStoreImpl; - - -#[generate_trait] -pub impl PlayerMembersStoreImpl of PlayerMembersStore { - fn get_name(self: @dojo::world::IWorldDispatcher, key: PlayerKeyType) -> felt252 { - PlayerStore::get_member(self, key, 1528802474226268325865027367859591458315299653151958663884057507666229546336) - } - - fn get_name_from_id(self: @dojo::world::IWorldDispatcher, entity_id: felt252) -> felt252 { - PlayerEntityStore::get_member_from_id(self, entity_id, 1528802474226268325865027367859591458315299653151958663884057507666229546336) - } - - fn update_name(self: dojo::world::IWorldDispatcher, key: PlayerKeyType, value: felt252) { - PlayerStore::update_member(self, key, 1528802474226268325865027367859591458315299653151958663884057507666229546336, value); - } - - fn update_name_from_id(self: dojo::world::IWorldDispatcher, entity_id: felt252, value: felt252) { - PlayerEntityStore::update_member_from_id(self, entity_id, 1528802474226268325865027367859591458315299653151958663884057507666229546336, value); - } - - -} - - -#[starknet::interface] -pub trait IPlayer { - fn ensure_abi(self: @T, model: Player); -} - -#[starknet::contract] -pub mod player { - use super::Player; - use super::IPlayer; - - #[abi(embed_v0)] - impl DojoModelImpl = dojo::model::component::IModelImpl; - - #[abi(embed_v0)] - impl PlayerImpl of IPlayer{ - fn ensure_abi(self: @ContractState, model: Player) { - } - } -#[event] -#[derive(Drop, starknet::Event)] -pub enum Event {} - - -#[phantom] -pub struct Storage { -} - -#[derive(Drop, Copy)] -pub struct StorageStorageBase { -} -impl StorageStorageImpl of starknet::storage::StorageTrait { - type BaseType = StorageStorageBase; - fn storage(self: starknet::storage::FlattenedStorage) -> StorageStorageBase { - StorageStorageBase { - } - } -} -#[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 ContractState { -} - -impl ContractStateDrop of Drop {} - -impl ContractStateDeref of core::ops::SnapshotDeref { - type Target = starknet::storage::FlattenedStorage; - fn snapshot_deref(self: @ContractState) -> starknet::storage::FlattenedStorage { - starknet::storage::FlattenedStorage {} - } -} -impl ContractStateDerefMut of core::ops::DerefMut { - type Target = starknet::storage::FlattenedStorage> ; - fn deref_mut(ref self: ContractState) -> starknet::storage::FlattenedStorage> { - starknet::storage::FlattenedStorage {} - } -} -pub fn unsafe_new_contract_state() -> ContractState { - ContractState { - } -} - -// TODO(Gil): This generates duplicate diagnostics because of the plugin system, squash the duplicates into one. -#[deprecated( - feature: "deprecated_legacy_map", - note: "Use `starknet::storage::Map` instead." -)] -#[allow(unused_imports)] -use starknet::storage::Map as LegacyMap; - -impl ContractStateIModelImpl of - dojo::model::component::UnsafeNewContractStateTraitForIModelImpl { - fn unsafe_new_contract_state() -> ContractState { - unsafe_new_contract_state() - } -} -#[implicit_precedence(core::pedersen::Pedersen, core::RangeCheck, core::integer::Bitwise, core::ec::EcOp, core::poseidon::Poseidon, core::SegmentArena, core::circuit::RangeCheck96, core::circuit::AddMod, core::circuit::MulMod, core::gas::GasBuiltin, System)] -fn __wrapper__PlayerImpl__ensure_abi(mut data: Span::) -> Span:: { - core::internal::require_implicit::(); - core::internal::revoke_ap_tracking(); - core::option::OptionTraitImpl::expect(core::gas::withdraw_gas(), 'Out of gas'); - let __arg_model = core::option::OptionTraitImpl::expect( - core::serde::Serde::::deserialize(ref data), - 'Failed to deserialize param #1' - ); - assert(core::array::SpanTrait::is_empty(data), 'Input too long for arguments'); - core::option::OptionTraitImpl::expect( - core::gas::withdraw_gas_all(core::gas::get_builtin_costs()), 'Out of gas', - ); - let mut contract_state = unsafe_new_contract_state(); - PlayerImpl::ensure_abi(@contract_state, __arg_model); - let mut arr = ArrayTrait::new(); - // References. - // Result. - core::array::ArrayTrait::span(@arr) -} - - -pub mod __external { - pub use super::__wrapper__PlayerImpl__ensure_abi as ensure_abi; -} -pub mod __l1_handler { -} -pub mod __constructor { -} - impl ContractStateEventEmitter of starknet::event::EventEmitter< - ContractState, Event - > { - fn emit>( - ref self: ContractState, event: S - ) { - let event: Event = core::traits::Into::into(event); - let mut keys = Default::::default(); - let mut data = Default::::default(); - starknet::Event::append_keys_and_data(@event, ref keys, ref data); - starknet::SyscallResultTrait::unwrap_syscall( - starknet::syscalls::emit_event_syscall( - core::array::ArrayTrait::span(@keys), - core::array::ArrayTrait::span(@data), - ) - ) - } - } -impl EventDrop of core::traits::Drop::; -impl EventIsEvent of starknet::Event { - fn append_keys_and_data( - self: @Event, ref keys: Array, ref data: Array - ) { - match self { - } - } - fn deserialize( - ref keys: Span, ref data: Span, - ) -> Option { - let __selector__ = *core::array::SpanTrait::pop_front(ref keys)?; - Option::None - } -} -impl StorageStorageBaseDrop of core::traits::Drop::; -impl StorageStorageBaseCopy of core::traits::Copy::; -impl StorageStorageBaseMutDrop of core::traits::Drop::; -impl StorageStorageBaseMutCopy of core::traits::Copy::; -} - -impl ModelWithSimpleArrayIntrospect<> of dojo::meta::introspect::Introspect> { - #[inline(always)] - fn size() -> Option { - Option::None - } - - fn layout() -> dojo::meta::Layout { - dojo::meta::Layout::Struct( - array![ - dojo::meta::FieldLayout { - selector: 512066735765477566404754172672287371265995314501343422459174036873487219331, - layout: dojo::meta::introspect::Introspect::::layout() - }, -dojo::meta::FieldLayout { - selector: 1591024729085637502504777720563487898377940395575083379770417352976841400819, - layout: dojo::meta::introspect::Introspect:: ->::layout() - } - ].span() - ) - } - - #[inline(always)] - fn ty() -> dojo::meta::introspect::Ty { - dojo::meta::introspect::Ty::Struct( - dojo::meta::introspect::Struct { - name: 'ModelWithSimpleArray', - attrs: array![].span(), - children: array![ - dojo::meta::introspect::Member { - name: 'player', - attrs: array!['key'].span(), - ty: dojo::meta::introspect::Introspect::::ty() - }, -dojo::meta::introspect::Member { - name: 'x', - attrs: array![].span(), - ty: dojo::meta::introspect::Introspect::::ty() - }, -dojo::meta::introspect::Member { - name: 'y', - attrs: array![].span(), - ty: dojo::meta::introspect::Ty::Array( - array![ - dojo::meta::introspect::Introspect::::ty() - ].span() - ) - } - - ].span() - } - ) - } -} - #[derive()] -pub struct ModelWithSimpleArrayEntity { - __id: felt252, // private field - pub x: u16, -pub y: Array, - -} - -type ModelWithSimpleArrayKeyType = ContractAddress; - -pub impl ModelWithSimpleArrayKeyParser of dojo::model::model::KeyParser{ - #[inline(always)] - fn parse_key(self: @ModelWithSimpleArray) -> ModelWithSimpleArrayKeyType { - *self.player - } -} - -impl ModelWithSimpleArrayEntityKey of dojo::model::entity::EntityKey { -} - -// Impl to get the static definition of a model -pub mod model_with_simple_array_definition { - use super::ModelWithSimpleArray; - pub impl ModelWithSimpleArrayDefinitionImpl of dojo::model::ModelDefinition{ - #[inline(always)] - fn name() -> ByteArray { - "ModelWithSimpleArray" - } - - #[inline(always)] - fn namespace() -> ByteArray { - "dojo_test" - } - - #[inline(always)] - fn tag() -> ByteArray { - "dojo_test-ModelWithSimpleArray" - } - - #[inline(always)] - fn version() -> u8 { - 1 - } - - #[inline(always)] - fn selector() -> felt252 { - 2155888289741706273257207428305937938996511115291276975807216945184181752777 - } - - #[inline(always)] - fn name_hash() -> felt252 { - 173141902001925402715103859951360389436088950156916962046507357841237663931 - } - - #[inline(always)] - fn namespace_hash() -> felt252 { - 1452123528942907587532668415362544424816022573043154497385993678618948064048 - } - - - #[inline(always)] - fn layout() -> dojo::meta::Layout { - dojo::meta::Introspect::::layout() - } - - #[inline(always)] - fn schema() -> dojo::meta::introspect::Ty { - dojo::meta::Introspect::::ty() - } - - #[inline(always)] - fn size() -> Option { - dojo::meta::Introspect::::size() - } - } - -} - - -pub impl ModelWithSimpleArrayDefinition = model_with_simple_array_definition::ModelWithSimpleArrayDefinitionImpl; -pub impl ModelWithSimpleArrayEntityDefinition = model_with_simple_array_definition::ModelWithSimpleArrayDefinitionImpl; - -pub impl ModelWithSimpleArrayModelParser of dojo::model::model::ModelParser{ - fn serialize_keys(self: @ModelWithSimpleArray) -> Span { - let mut serialized = core::array::ArrayTrait::new(); - core::serde::Serde::serialize(self.player, ref serialized); - - core::array::ArrayTrait::span(@serialized) - } - fn serialize_values(self: @ModelWithSimpleArray) -> Span { - let mut serialized = core::array::ArrayTrait::new(); - core::serde::Serde::serialize(self.x, ref serialized); -core::serde::Serde::serialize(self.y, ref serialized); - - core::array::ArrayTrait::span(@serialized) - } -} - -pub impl ModelWithSimpleArrayEntityParser of dojo::model::entity::EntityParser{ - fn parse_id(self: @ModelWithSimpleArrayEntity) -> felt252 { - *self.__id - } - fn serialize_values(self: @ModelWithSimpleArrayEntity) -> Span { - let mut serialized = core::array::ArrayTrait::new(); - core::serde::Serde::serialize(self.x, ref serialized); -core::serde::Serde::serialize(self.y, ref serialized); - - core::array::ArrayTrait::span(@serialized) - } -} - - -pub impl ModelWithSimpleArrayModelImpl = dojo::model::model::ModelImpl; -pub impl ModelWithSimpleArrayStore = dojo::model::model::ModelStoreImpl; - -pub impl ModelWithSimpleArrayEntityImpl = dojo::model::entity::EntityImpl; -pub impl ModelWithSimpleArrayEntityStore = dojo::model::entity::EntityStoreImpl; - - -#[generate_trait] -pub impl ModelWithSimpleArrayMembersStoreImpl of ModelWithSimpleArrayMembersStore { - fn get_x(self: @dojo::world::IWorldDispatcher, key: ModelWithSimpleArrayKeyType) -> u16 { - ModelWithSimpleArrayStore::get_member(self, key, 512066735765477566404754172672287371265995314501343422459174036873487219331) - } - - fn get_x_from_id(self: @dojo::world::IWorldDispatcher, entity_id: felt252) -> u16 { - ModelWithSimpleArrayEntityStore::get_member_from_id(self, entity_id, 512066735765477566404754172672287371265995314501343422459174036873487219331) - } - - fn update_x(self: dojo::world::IWorldDispatcher, key: ModelWithSimpleArrayKeyType, value: u16) { - ModelWithSimpleArrayStore::update_member(self, key, 512066735765477566404754172672287371265995314501343422459174036873487219331, value); - } - - fn update_x_from_id(self: dojo::world::IWorldDispatcher, entity_id: felt252, value: u16) { - ModelWithSimpleArrayEntityStore::update_member_from_id(self, entity_id, 512066735765477566404754172672287371265995314501343422459174036873487219331, value); - } - - fn get_y(self: @dojo::world::IWorldDispatcher, key: ModelWithSimpleArrayKeyType) -> Array { - ModelWithSimpleArrayStore::get_member(self, key, 1591024729085637502504777720563487898377940395575083379770417352976841400819) - } - - fn get_y_from_id(self: @dojo::world::IWorldDispatcher, entity_id: felt252) -> Array { - ModelWithSimpleArrayEntityStore::get_member_from_id(self, entity_id, 1591024729085637502504777720563487898377940395575083379770417352976841400819) - } - - fn update_y(self: dojo::world::IWorldDispatcher, key: ModelWithSimpleArrayKeyType, value: Array) { - ModelWithSimpleArrayStore::update_member(self, key, 1591024729085637502504777720563487898377940395575083379770417352976841400819, value); - } - - fn update_y_from_id(self: dojo::world::IWorldDispatcher, entity_id: felt252, value: Array) { - ModelWithSimpleArrayEntityStore::update_member_from_id(self, entity_id, 1591024729085637502504777720563487898377940395575083379770417352976841400819, value); - } - - -} - - -#[starknet::interface] -pub trait IModelWithSimpleArray { - fn ensure_abi(self: @T, model: ModelWithSimpleArray); -} - -#[starknet::contract] -pub mod model_with_simple_array { - use super::ModelWithSimpleArray; - use super::IModelWithSimpleArray; - - #[abi(embed_v0)] - impl DojoModelImpl = dojo::model::component::IModelImpl; - - #[abi(embed_v0)] - impl ModelWithSimpleArrayImpl of IModelWithSimpleArray{ - fn ensure_abi(self: @ContractState, model: ModelWithSimpleArray) { - } - } -#[event] -#[derive(Drop, starknet::Event)] -pub enum Event {} - - -#[phantom] -pub struct Storage { -} - -#[derive(Drop, Copy)] -pub struct StorageStorageBase { -} -impl StorageStorageImpl of starknet::storage::StorageTrait { - type BaseType = StorageStorageBase; - fn storage(self: starknet::storage::FlattenedStorage) -> StorageStorageBase { - StorageStorageBase { - } - } -} -#[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 ContractState { -} - -impl ContractStateDrop of Drop {} - -impl ContractStateDeref of core::ops::SnapshotDeref { - type Target = starknet::storage::FlattenedStorage; - fn snapshot_deref(self: @ContractState) -> starknet::storage::FlattenedStorage { - starknet::storage::FlattenedStorage {} - } -} -impl ContractStateDerefMut of core::ops::DerefMut { - type Target = starknet::storage::FlattenedStorage> ; - fn deref_mut(ref self: ContractState) -> starknet::storage::FlattenedStorage> { - starknet::storage::FlattenedStorage {} - } -} -pub fn unsafe_new_contract_state() -> ContractState { - ContractState { - } -} - -// TODO(Gil): This generates duplicate diagnostics because of the plugin system, squash the duplicates into one. -#[deprecated( - feature: "deprecated_legacy_map", - note: "Use `starknet::storage::Map` instead." -)] -#[allow(unused_imports)] -use starknet::storage::Map as LegacyMap; - -impl ContractStateIModelImpl of - dojo::model::component::UnsafeNewContractStateTraitForIModelImpl { - fn unsafe_new_contract_state() -> ContractState { - unsafe_new_contract_state() - } -} -#[implicit_precedence(core::pedersen::Pedersen, core::RangeCheck, core::integer::Bitwise, core::ec::EcOp, core::poseidon::Poseidon, core::SegmentArena, core::circuit::RangeCheck96, core::circuit::AddMod, core::circuit::MulMod, core::gas::GasBuiltin, System)] -fn __wrapper__ModelWithSimpleArrayImpl__ensure_abi(mut data: Span::) -> Span:: { - core::internal::require_implicit::(); - core::internal::revoke_ap_tracking(); - core::option::OptionTraitImpl::expect(core::gas::withdraw_gas(), 'Out of gas'); - let __arg_model = core::option::OptionTraitImpl::expect( - core::serde::Serde::::deserialize(ref data), - 'Failed to deserialize param #1' - ); - assert(core::array::SpanTrait::is_empty(data), 'Input too long for arguments'); - core::option::OptionTraitImpl::expect( - core::gas::withdraw_gas_all(core::gas::get_builtin_costs()), 'Out of gas', - ); - let mut contract_state = unsafe_new_contract_state(); - ModelWithSimpleArrayImpl::ensure_abi(@contract_state, __arg_model); - let mut arr = ArrayTrait::new(); - // References. - // Result. - core::array::ArrayTrait::span(@arr) -} - - -pub mod __external { - pub use super::__wrapper__ModelWithSimpleArrayImpl__ensure_abi as ensure_abi; -} -pub mod __l1_handler { -} -pub mod __constructor { -} - impl ContractStateEventEmitter of starknet::event::EventEmitter< - ContractState, Event - > { - fn emit>( - ref self: ContractState, event: S - ) { - let event: Event = core::traits::Into::into(event); - let mut keys = Default::::default(); - let mut data = Default::::default(); - starknet::Event::append_keys_and_data(@event, ref keys, ref data); - starknet::SyscallResultTrait::unwrap_syscall( - starknet::syscalls::emit_event_syscall( - core::array::ArrayTrait::span(@keys), - core::array::ArrayTrait::span(@data), - ) - ) - } - } -impl EventDrop of core::traits::Drop::; -impl EventIsEvent of starknet::Event { - fn append_keys_and_data( - self: @Event, ref keys: Array, ref data: Array - ) { - match self { - } - } - fn deserialize( - ref keys: Span, ref data: Span, - ) -> Option { - let __selector__ = *core::array::SpanTrait::pop_front(ref keys)?; - Option::None - } -} -impl StorageStorageBaseDrop of core::traits::Drop::; -impl StorageStorageBaseCopy of core::traits::Copy::; -impl StorageStorageBaseMutDrop of core::traits::Drop::; -impl StorageStorageBaseMutCopy of core::traits::Copy::; -} - -impl ModelWithByteArrayIntrospect<> of dojo::meta::introspect::Introspect> { - #[inline(always)] - fn size() -> Option { - Option::None - } - - fn layout() -> dojo::meta::Layout { - dojo::meta::Layout::Struct( - array![ - dojo::meta::FieldLayout { - selector: 512066735765477566404754172672287371265995314501343422459174036873487219331, - layout: dojo::meta::introspect::Introspect::::layout() - }, -dojo::meta::FieldLayout { - selector: 1591024729085637502504777720563487898377940395575083379770417352976841400819, - layout: dojo::meta::introspect::Introspect::::layout() - } - ].span() - ) - } - - #[inline(always)] - fn ty() -> dojo::meta::introspect::Ty { - dojo::meta::introspect::Ty::Struct( - dojo::meta::introspect::Struct { - name: 'ModelWithByteArray', - attrs: array![].span(), - children: array![ - dojo::meta::introspect::Member { - name: 'player', - attrs: array!['key'].span(), - ty: dojo::meta::introspect::Introspect::::ty() - }, -dojo::meta::introspect::Member { - name: 'x', - attrs: array![].span(), - ty: dojo::meta::introspect::Introspect::::ty() - }, -dojo::meta::introspect::Member { - name: 'y', - attrs: array![].span(), - ty: dojo::meta::introspect::Ty::ByteArray - } - - ].span() - } - ) - } -} - #[derive()] -pub struct ModelWithByteArrayEntity { - __id: felt252, // private field - pub x: u16, -pub y: ByteArray, - -} - -type ModelWithByteArrayKeyType = ContractAddress; - -pub impl ModelWithByteArrayKeyParser of dojo::model::model::KeyParser{ - #[inline(always)] - fn parse_key(self: @ModelWithByteArray) -> ModelWithByteArrayKeyType { - *self.player - } -} - -impl ModelWithByteArrayEntityKey of dojo::model::entity::EntityKey { -} - -// Impl to get the static definition of a model -pub mod model_with_byte_array_definition { - use super::ModelWithByteArray; - pub impl ModelWithByteArrayDefinitionImpl of dojo::model::ModelDefinition{ - #[inline(always)] - fn name() -> ByteArray { - "ModelWithByteArray" - } - - #[inline(always)] - fn namespace() -> ByteArray { - "dojo_test" - } - - #[inline(always)] - fn tag() -> ByteArray { - "dojo_test-ModelWithByteArray" - } - - #[inline(always)] - fn version() -> u8 { - 1 - } - - #[inline(always)] - fn selector() -> felt252 { - 2309493726682581230048608406375650493303358263694405202817326852234706548038 - } - - #[inline(always)] - fn name_hash() -> felt252 { - 2176409715042145900636260236501596599545103472111273072320531220776338338674 - } - - #[inline(always)] - fn namespace_hash() -> felt252 { - 1452123528942907587532668415362544424816022573043154497385993678618948064048 - } - - - #[inline(always)] - fn layout() -> dojo::meta::Layout { - dojo::meta::Introspect::::layout() - } - - #[inline(always)] - fn schema() -> dojo::meta::introspect::Ty { - dojo::meta::Introspect::::ty() - } - - #[inline(always)] - fn size() -> Option { - dojo::meta::Introspect::::size() - } - } - -} - - -pub impl ModelWithByteArrayDefinition = model_with_byte_array_definition::ModelWithByteArrayDefinitionImpl; -pub impl ModelWithByteArrayEntityDefinition = model_with_byte_array_definition::ModelWithByteArrayDefinitionImpl; - -pub impl ModelWithByteArrayModelParser of dojo::model::model::ModelParser{ - fn serialize_keys(self: @ModelWithByteArray) -> Span { - let mut serialized = core::array::ArrayTrait::new(); - core::serde::Serde::serialize(self.player, ref serialized); - - core::array::ArrayTrait::span(@serialized) - } - fn serialize_values(self: @ModelWithByteArray) -> Span { - let mut serialized = core::array::ArrayTrait::new(); - core::serde::Serde::serialize(self.x, ref serialized); -core::serde::Serde::serialize(self.y, ref serialized); - - core::array::ArrayTrait::span(@serialized) - } -} - -pub impl ModelWithByteArrayEntityParser of dojo::model::entity::EntityParser{ - fn parse_id(self: @ModelWithByteArrayEntity) -> felt252 { - *self.__id - } - fn serialize_values(self: @ModelWithByteArrayEntity) -> Span { - let mut serialized = core::array::ArrayTrait::new(); - core::serde::Serde::serialize(self.x, ref serialized); -core::serde::Serde::serialize(self.y, ref serialized); - - core::array::ArrayTrait::span(@serialized) - } -} - - -pub impl ModelWithByteArrayModelImpl = dojo::model::model::ModelImpl; -pub impl ModelWithByteArrayStore = dojo::model::model::ModelStoreImpl; - -pub impl ModelWithByteArrayEntityImpl = dojo::model::entity::EntityImpl; -pub impl ModelWithByteArrayEntityStore = dojo::model::entity::EntityStoreImpl; - - -#[generate_trait] -pub impl ModelWithByteArrayMembersStoreImpl of ModelWithByteArrayMembersStore { - fn get_x(self: @dojo::world::IWorldDispatcher, key: ModelWithByteArrayKeyType) -> u16 { - ModelWithByteArrayStore::get_member(self, key, 512066735765477566404754172672287371265995314501343422459174036873487219331) - } - - fn get_x_from_id(self: @dojo::world::IWorldDispatcher, entity_id: felt252) -> u16 { - ModelWithByteArrayEntityStore::get_member_from_id(self, entity_id, 512066735765477566404754172672287371265995314501343422459174036873487219331) - } - - fn update_x(self: dojo::world::IWorldDispatcher, key: ModelWithByteArrayKeyType, value: u16) { - ModelWithByteArrayStore::update_member(self, key, 512066735765477566404754172672287371265995314501343422459174036873487219331, value); - } - - fn update_x_from_id(self: dojo::world::IWorldDispatcher, entity_id: felt252, value: u16) { - ModelWithByteArrayEntityStore::update_member_from_id(self, entity_id, 512066735765477566404754172672287371265995314501343422459174036873487219331, value); - } - - fn get_y(self: @dojo::world::IWorldDispatcher, key: ModelWithByteArrayKeyType) -> ByteArray { - ModelWithByteArrayStore::get_member(self, key, 1591024729085637502504777720563487898377940395575083379770417352976841400819) - } - - fn get_y_from_id(self: @dojo::world::IWorldDispatcher, entity_id: felt252) -> ByteArray { - ModelWithByteArrayEntityStore::get_member_from_id(self, entity_id, 1591024729085637502504777720563487898377940395575083379770417352976841400819) - } - - fn update_y(self: dojo::world::IWorldDispatcher, key: ModelWithByteArrayKeyType, value: ByteArray) { - ModelWithByteArrayStore::update_member(self, key, 1591024729085637502504777720563487898377940395575083379770417352976841400819, value); - } - - fn update_y_from_id(self: dojo::world::IWorldDispatcher, entity_id: felt252, value: ByteArray) { - ModelWithByteArrayEntityStore::update_member_from_id(self, entity_id, 1591024729085637502504777720563487898377940395575083379770417352976841400819, value); - } - - -} - - -#[starknet::interface] -pub trait IModelWithByteArray { - fn ensure_abi(self: @T, model: ModelWithByteArray); -} - -#[starknet::contract] -pub mod model_with_byte_array { - use super::ModelWithByteArray; - use super::IModelWithByteArray; - - #[abi(embed_v0)] - impl DojoModelImpl = dojo::model::component::IModelImpl; - - #[abi(embed_v0)] - impl ModelWithByteArrayImpl of IModelWithByteArray{ - fn ensure_abi(self: @ContractState, model: ModelWithByteArray) { - } - } -#[event] -#[derive(Drop, starknet::Event)] -pub enum Event {} - - -#[phantom] -pub struct Storage { -} - -#[derive(Drop, Copy)] -pub struct StorageStorageBase { -} -impl StorageStorageImpl of starknet::storage::StorageTrait { - type BaseType = StorageStorageBase; - fn storage(self: starknet::storage::FlattenedStorage) -> StorageStorageBase { - StorageStorageBase { - } - } -} -#[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 ContractState { -} - -impl ContractStateDrop of Drop {} - -impl ContractStateDeref of core::ops::SnapshotDeref { - type Target = starknet::storage::FlattenedStorage; - fn snapshot_deref(self: @ContractState) -> starknet::storage::FlattenedStorage { - starknet::storage::FlattenedStorage {} - } -} -impl ContractStateDerefMut of core::ops::DerefMut { - type Target = starknet::storage::FlattenedStorage> ; - fn deref_mut(ref self: ContractState) -> starknet::storage::FlattenedStorage> { - starknet::storage::FlattenedStorage {} - } -} -pub fn unsafe_new_contract_state() -> ContractState { - ContractState { - } -} - -// TODO(Gil): This generates duplicate diagnostics because of the plugin system, squash the duplicates into one. -#[deprecated( - feature: "deprecated_legacy_map", - note: "Use `starknet::storage::Map` instead." -)] -#[allow(unused_imports)] -use starknet::storage::Map as LegacyMap; - -impl ContractStateIModelImpl of - dojo::model::component::UnsafeNewContractStateTraitForIModelImpl { - fn unsafe_new_contract_state() -> ContractState { - unsafe_new_contract_state() - } -} -#[implicit_precedence(core::pedersen::Pedersen, core::RangeCheck, core::integer::Bitwise, core::ec::EcOp, core::poseidon::Poseidon, core::SegmentArena, core::circuit::RangeCheck96, core::circuit::AddMod, core::circuit::MulMod, core::gas::GasBuiltin, System)] -fn __wrapper__ModelWithByteArrayImpl__ensure_abi(mut data: Span::) -> Span:: { - core::internal::require_implicit::(); - core::internal::revoke_ap_tracking(); - core::option::OptionTraitImpl::expect(core::gas::withdraw_gas(), 'Out of gas'); - let __arg_model = core::option::OptionTraitImpl::expect( - core::serde::Serde::::deserialize(ref data), - 'Failed to deserialize param #1' - ); - assert(core::array::SpanTrait::is_empty(data), 'Input too long for arguments'); - core::option::OptionTraitImpl::expect( - core::gas::withdraw_gas_all(core::gas::get_builtin_costs()), 'Out of gas', - ); - let mut contract_state = unsafe_new_contract_state(); - ModelWithByteArrayImpl::ensure_abi(@contract_state, __arg_model); - let mut arr = ArrayTrait::new(); - // References. - // Result. - core::array::ArrayTrait::span(@arr) -} - - -pub mod __external { - pub use super::__wrapper__ModelWithByteArrayImpl__ensure_abi as ensure_abi; -} -pub mod __l1_handler { -} -pub mod __constructor { -} - impl ContractStateEventEmitter of starknet::event::EventEmitter< - ContractState, Event - > { - fn emit>( - ref self: ContractState, event: S - ) { - let event: Event = core::traits::Into::into(event); - let mut keys = Default::::default(); - let mut data = Default::::default(); - starknet::Event::append_keys_and_data(@event, ref keys, ref data); - starknet::SyscallResultTrait::unwrap_syscall( - starknet::syscalls::emit_event_syscall( - core::array::ArrayTrait::span(@keys), - core::array::ArrayTrait::span(@data), - ) - ) - } - } -impl EventDrop of core::traits::Drop::; -impl EventIsEvent of starknet::Event { - fn append_keys_and_data( - self: @Event, ref keys: Array, ref data: Array - ) { - match self { - } - } - fn deserialize( - ref keys: Span, ref data: Span, - ) -> Option { - let __selector__ = *core::array::SpanTrait::pop_front(ref keys)?; - Option::None - } -} -impl StorageStorageBaseDrop of core::traits::Drop::; -impl StorageStorageBaseCopy of core::traits::Copy::; -impl StorageStorageBaseMutDrop of core::traits::Drop::; -impl StorageStorageBaseMutCopy of core::traits::Copy::; -} - -impl ModelWithComplexArrayIntrospect<> of dojo::meta::introspect::Introspect> { - #[inline(always)] - fn size() -> Option { - Option::None - } - - fn layout() -> dojo::meta::Layout { - dojo::meta::Layout::Struct( - array![ - dojo::meta::FieldLayout { - selector: 512066735765477566404754172672287371265995314501343422459174036873487219331, - layout: dojo::meta::introspect::Introspect::::layout() - }, -dojo::meta::FieldLayout { - selector: 1591024729085637502504777720563487898377940395575083379770417352976841400819, - layout: dojo::meta::introspect::Introspect:: ->::layout() - } - ].span() - ) - } - - #[inline(always)] - fn ty() -> dojo::meta::introspect::Ty { - dojo::meta::introspect::Ty::Struct( - dojo::meta::introspect::Struct { - name: 'ModelWithComplexArray', - attrs: array![].span(), - children: array![ - dojo::meta::introspect::Member { - name: 'player', - attrs: array!['key'].span(), - ty: dojo::meta::introspect::Introspect::::ty() - }, -dojo::meta::introspect::Member { - name: 'x', - attrs: array![].span(), - ty: dojo::meta::introspect::Introspect::::ty() - }, -dojo::meta::introspect::Member { - name: 'y', - attrs: array![].span(), - ty: dojo::meta::introspect::Ty::Array( - array![ - dojo::meta::introspect::Introspect::::ty() - ].span() - ) - } - - ].span() - } - ) - } -} - #[derive()] -pub struct ModelWithComplexArrayEntity { - __id: felt252, // private field - pub x: u16, -pub y: Array, - -} - -type ModelWithComplexArrayKeyType = ContractAddress; - -pub impl ModelWithComplexArrayKeyParser of dojo::model::model::KeyParser{ - #[inline(always)] - fn parse_key(self: @ModelWithComplexArray) -> ModelWithComplexArrayKeyType { - *self.player - } -} - -impl ModelWithComplexArrayEntityKey of dojo::model::entity::EntityKey { -} - -// Impl to get the static definition of a model -pub mod model_with_complex_array_definition { - use super::ModelWithComplexArray; - pub impl ModelWithComplexArrayDefinitionImpl of dojo::model::ModelDefinition{ - #[inline(always)] - fn name() -> ByteArray { - "ModelWithComplexArray" - } - - #[inline(always)] - fn namespace() -> ByteArray { - "dojo_test" - } - - #[inline(always)] - fn tag() -> ByteArray { - "dojo_test-ModelWithComplexArray" - } - - #[inline(always)] - fn version() -> u8 { - 1 - } - - #[inline(always)] - fn selector() -> felt252 { - 1293570145807126672811046976011709110822800800255162893130594439459909679461 - } - - #[inline(always)] - fn name_hash() -> felt252 { - 2866472224509756243720005045848892642397514372569303051745174230372637769655 - } - - #[inline(always)] - fn namespace_hash() -> felt252 { - 1452123528942907587532668415362544424816022573043154497385993678618948064048 - } - - - #[inline(always)] - fn layout() -> dojo::meta::Layout { - dojo::meta::Introspect::::layout() - } - - #[inline(always)] - fn schema() -> dojo::meta::introspect::Ty { - dojo::meta::Introspect::::ty() - } - - #[inline(always)] - fn size() -> Option { - dojo::meta::Introspect::::size() - } - } - -} - - -pub impl ModelWithComplexArrayDefinition = model_with_complex_array_definition::ModelWithComplexArrayDefinitionImpl; -pub impl ModelWithComplexArrayEntityDefinition = model_with_complex_array_definition::ModelWithComplexArrayDefinitionImpl; - -pub impl ModelWithComplexArrayModelParser of dojo::model::model::ModelParser{ - fn serialize_keys(self: @ModelWithComplexArray) -> Span { - let mut serialized = core::array::ArrayTrait::new(); - core::serde::Serde::serialize(self.player, ref serialized); - - core::array::ArrayTrait::span(@serialized) - } - fn serialize_values(self: @ModelWithComplexArray) -> Span { - let mut serialized = core::array::ArrayTrait::new(); - core::serde::Serde::serialize(self.x, ref serialized); -core::serde::Serde::serialize(self.y, ref serialized); - - core::array::ArrayTrait::span(@serialized) - } -} - -pub impl ModelWithComplexArrayEntityParser of dojo::model::entity::EntityParser{ - fn parse_id(self: @ModelWithComplexArrayEntity) -> felt252 { - *self.__id - } - fn serialize_values(self: @ModelWithComplexArrayEntity) -> Span { - let mut serialized = core::array::ArrayTrait::new(); - core::serde::Serde::serialize(self.x, ref serialized); -core::serde::Serde::serialize(self.y, ref serialized); - - core::array::ArrayTrait::span(@serialized) - } -} - - -pub impl ModelWithComplexArrayModelImpl = dojo::model::model::ModelImpl; -pub impl ModelWithComplexArrayStore = dojo::model::model::ModelStoreImpl; - -pub impl ModelWithComplexArrayEntityImpl = dojo::model::entity::EntityImpl; -pub impl ModelWithComplexArrayEntityStore = dojo::model::entity::EntityStoreImpl; - - -#[generate_trait] -pub impl ModelWithComplexArrayMembersStoreImpl of ModelWithComplexArrayMembersStore { - fn get_x(self: @dojo::world::IWorldDispatcher, key: ModelWithComplexArrayKeyType) -> u16 { - ModelWithComplexArrayStore::get_member(self, key, 512066735765477566404754172672287371265995314501343422459174036873487219331) - } - - fn get_x_from_id(self: @dojo::world::IWorldDispatcher, entity_id: felt252) -> u16 { - ModelWithComplexArrayEntityStore::get_member_from_id(self, entity_id, 512066735765477566404754172672287371265995314501343422459174036873487219331) - } - - fn update_x(self: dojo::world::IWorldDispatcher, key: ModelWithComplexArrayKeyType, value: u16) { - ModelWithComplexArrayStore::update_member(self, key, 512066735765477566404754172672287371265995314501343422459174036873487219331, value); - } - - fn update_x_from_id(self: dojo::world::IWorldDispatcher, entity_id: felt252, value: u16) { - ModelWithComplexArrayEntityStore::update_member_from_id(self, entity_id, 512066735765477566404754172672287371265995314501343422459174036873487219331, value); - } - - fn get_y(self: @dojo::world::IWorldDispatcher, key: ModelWithComplexArrayKeyType) -> Array { - ModelWithComplexArrayStore::get_member(self, key, 1591024729085637502504777720563487898377940395575083379770417352976841400819) - } - - fn get_y_from_id(self: @dojo::world::IWorldDispatcher, entity_id: felt252) -> Array { - ModelWithComplexArrayEntityStore::get_member_from_id(self, entity_id, 1591024729085637502504777720563487898377940395575083379770417352976841400819) - } - - fn update_y(self: dojo::world::IWorldDispatcher, key: ModelWithComplexArrayKeyType, value: Array) { - ModelWithComplexArrayStore::update_member(self, key, 1591024729085637502504777720563487898377940395575083379770417352976841400819, value); - } - - fn update_y_from_id(self: dojo::world::IWorldDispatcher, entity_id: felt252, value: Array) { - ModelWithComplexArrayEntityStore::update_member_from_id(self, entity_id, 1591024729085637502504777720563487898377940395575083379770417352976841400819, value); - } - - -} - - -#[starknet::interface] -pub trait IModelWithComplexArray { - fn ensure_abi(self: @T, model: ModelWithComplexArray); -} - -#[starknet::contract] -pub mod model_with_complex_array { - use super::ModelWithComplexArray; - use super::IModelWithComplexArray; - - #[abi(embed_v0)] - impl DojoModelImpl = dojo::model::component::IModelImpl; - - #[abi(embed_v0)] - impl ModelWithComplexArrayImpl of IModelWithComplexArray{ - fn ensure_abi(self: @ContractState, model: ModelWithComplexArray) { - } - } -#[event] -#[derive(Drop, starknet::Event)] -pub enum Event {} - - -#[phantom] -pub struct Storage { -} - -#[derive(Drop, Copy)] -pub struct StorageStorageBase { -} -impl StorageStorageImpl of starknet::storage::StorageTrait { - type BaseType = StorageStorageBase; - fn storage(self: starknet::storage::FlattenedStorage) -> StorageStorageBase { - StorageStorageBase { - } - } -} -#[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 ContractState { -} - -impl ContractStateDrop of Drop {} - -impl ContractStateDeref of core::ops::SnapshotDeref { - type Target = starknet::storage::FlattenedStorage; - fn snapshot_deref(self: @ContractState) -> starknet::storage::FlattenedStorage { - starknet::storage::FlattenedStorage {} - } -} -impl ContractStateDerefMut of core::ops::DerefMut { - type Target = starknet::storage::FlattenedStorage> ; - fn deref_mut(ref self: ContractState) -> starknet::storage::FlattenedStorage> { - starknet::storage::FlattenedStorage {} - } -} -pub fn unsafe_new_contract_state() -> ContractState { - ContractState { - } -} - -// TODO(Gil): This generates duplicate diagnostics because of the plugin system, squash the duplicates into one. -#[deprecated( - feature: "deprecated_legacy_map", - note: "Use `starknet::storage::Map` instead." -)] -#[allow(unused_imports)] -use starknet::storage::Map as LegacyMap; - -impl ContractStateIModelImpl of - dojo::model::component::UnsafeNewContractStateTraitForIModelImpl { - fn unsafe_new_contract_state() -> ContractState { - unsafe_new_contract_state() - } -} -#[implicit_precedence(core::pedersen::Pedersen, core::RangeCheck, core::integer::Bitwise, core::ec::EcOp, core::poseidon::Poseidon, core::SegmentArena, core::circuit::RangeCheck96, core::circuit::AddMod, core::circuit::MulMod, core::gas::GasBuiltin, System)] -fn __wrapper__ModelWithComplexArrayImpl__ensure_abi(mut data: Span::) -> Span:: { - core::internal::require_implicit::(); - core::internal::revoke_ap_tracking(); - core::option::OptionTraitImpl::expect(core::gas::withdraw_gas(), 'Out of gas'); - let __arg_model = core::option::OptionTraitImpl::expect( - core::serde::Serde::::deserialize(ref data), - 'Failed to deserialize param #1' - ); - assert(core::array::SpanTrait::is_empty(data), 'Input too long for arguments'); - core::option::OptionTraitImpl::expect( - core::gas::withdraw_gas_all(core::gas::get_builtin_costs()), 'Out of gas', - ); - let mut contract_state = unsafe_new_contract_state(); - ModelWithComplexArrayImpl::ensure_abi(@contract_state, __arg_model); - let mut arr = ArrayTrait::new(); - // References. - // Result. - core::array::ArrayTrait::span(@arr) -} - - -pub mod __external { - pub use super::__wrapper__ModelWithComplexArrayImpl__ensure_abi as ensure_abi; -} -pub mod __l1_handler { -} -pub mod __constructor { -} - impl ContractStateEventEmitter of starknet::event::EventEmitter< - ContractState, Event - > { - fn emit>( - ref self: ContractState, event: S - ) { - let event: Event = core::traits::Into::into(event); - let mut keys = Default::::default(); - let mut data = Default::::default(); - starknet::Event::append_keys_and_data(@event, ref keys, ref data); - starknet::SyscallResultTrait::unwrap_syscall( - starknet::syscalls::emit_event_syscall( - core::array::ArrayTrait::span(@keys), - core::array::ArrayTrait::span(@data), - ) - ) - } - } -impl EventDrop of core::traits::Drop::; -impl EventIsEvent of starknet::Event { - fn append_keys_and_data( - self: @Event, ref keys: Array, ref data: Array - ) { - match self { - } - } - fn deserialize( - ref keys: Span, ref data: Span, - ) -> Option { - let __selector__ = *core::array::SpanTrait::pop_front(ref keys)?; - Option::None - } -} -impl StorageStorageBaseDrop of core::traits::Drop::; -impl StorageStorageBaseCopy of core::traits::Copy::; -impl StorageStorageBaseMutDrop of core::traits::Drop::; -impl StorageStorageBaseMutCopy of core::traits::Copy::; -} - -impl ModelWithTupleIntrospect<> of dojo::meta::introspect::Introspect> { - #[inline(always)] - fn size() -> Option { - Option::Some(4) - } - - fn layout() -> dojo::meta::Layout { - dojo::meta::Layout::Struct( - array![ - dojo::meta::FieldLayout { - selector: 512066735765477566404754172672287371265995314501343422459174036873487219331, - layout: dojo::meta::introspect::Introspect::::layout() - }, -dojo::meta::FieldLayout { - selector: 1591024729085637502504777720563487898377940395575083379770417352976841400819, - layout: dojo::meta::Layout::Tuple( - array![ - dojo::meta::introspect::Introspect::::layout(), -dojo::meta::introspect::Introspect::::layout(), -dojo::meta::introspect::Introspect::::layout() - ].span() - ) - } - ].span() - ) - } - - #[inline(always)] - fn ty() -> dojo::meta::introspect::Ty { - dojo::meta::introspect::Ty::Struct( - dojo::meta::introspect::Struct { - name: 'ModelWithTuple', - attrs: array![].span(), - children: array![ - dojo::meta::introspect::Member { - name: 'player', - attrs: array!['key'].span(), - ty: dojo::meta::introspect::Introspect::::ty() - }, -dojo::meta::introspect::Member { - name: 'x', - attrs: array![].span(), - ty: dojo::meta::introspect::Introspect::::ty() - }, -dojo::meta::introspect::Member { - name: 'y', - attrs: array![].span(), - ty: dojo::meta::introspect::Ty::Tuple( - array![ - dojo::meta::introspect::Introspect::::ty(), -dojo::meta::introspect::Introspect::::ty(), -dojo::meta::introspect::Introspect::::ty() - ].span() - ) - } - - ].span() - } - ) - } -} - #[derive()] -pub struct ModelWithTupleEntity { - __id: felt252, // private field - pub x: u16, -pub y: (u8, u16, u32), - -} - -type ModelWithTupleKeyType = ContractAddress; - -pub impl ModelWithTupleKeyParser of dojo::model::model::KeyParser{ - #[inline(always)] - fn parse_key(self: @ModelWithTuple) -> ModelWithTupleKeyType { - *self.player - } -} - -impl ModelWithTupleEntityKey of dojo::model::entity::EntityKey { -} - -// Impl to get the static definition of a model -pub mod model_with_tuple_definition { - use super::ModelWithTuple; - pub impl ModelWithTupleDefinitionImpl of dojo::model::ModelDefinition{ - #[inline(always)] - fn name() -> ByteArray { - "ModelWithTuple" - } - - #[inline(always)] - fn namespace() -> ByteArray { - "dojo_test" - } - - #[inline(always)] - fn tag() -> ByteArray { - "dojo_test-ModelWithTuple" - } - - #[inline(always)] - fn version() -> u8 { - 1 - } - - #[inline(always)] - fn selector() -> felt252 { - 2556860780543194947392385177981405629628409496147617432088261544126553394590 - } - - #[inline(always)] - fn name_hash() -> felt252 { - 3222351670132870101782632958288197874250493316621507272653773018669253981260 - } - - #[inline(always)] - fn namespace_hash() -> felt252 { - 1452123528942907587532668415362544424816022573043154497385993678618948064048 - } - - - #[inline(always)] - fn layout() -> dojo::meta::Layout { - dojo::meta::Introspect::::layout() - } - - #[inline(always)] - fn schema() -> dojo::meta::introspect::Ty { - dojo::meta::Introspect::::ty() - } - - #[inline(always)] - fn size() -> Option { - dojo::meta::Introspect::::size() - } - } - -} - - -pub impl ModelWithTupleDefinition = model_with_tuple_definition::ModelWithTupleDefinitionImpl; -pub impl ModelWithTupleEntityDefinition = model_with_tuple_definition::ModelWithTupleDefinitionImpl; - -pub impl ModelWithTupleModelParser of dojo::model::model::ModelParser{ - fn serialize_keys(self: @ModelWithTuple) -> Span { - let mut serialized = core::array::ArrayTrait::new(); - core::serde::Serde::serialize(self.player, ref serialized); - - core::array::ArrayTrait::span(@serialized) - } - fn serialize_values(self: @ModelWithTuple) -> Span { - let mut serialized = core::array::ArrayTrait::new(); - core::serde::Serde::serialize(self.x, ref serialized); -core::serde::Serde::serialize(self.y, ref serialized); - - core::array::ArrayTrait::span(@serialized) - } -} - -pub impl ModelWithTupleEntityParser of dojo::model::entity::EntityParser{ - fn parse_id(self: @ModelWithTupleEntity) -> felt252 { - *self.__id - } - fn serialize_values(self: @ModelWithTupleEntity) -> Span { - let mut serialized = core::array::ArrayTrait::new(); - core::serde::Serde::serialize(self.x, ref serialized); -core::serde::Serde::serialize(self.y, ref serialized); - - core::array::ArrayTrait::span(@serialized) - } -} - - -pub impl ModelWithTupleModelImpl = dojo::model::model::ModelImpl; -pub impl ModelWithTupleStore = dojo::model::model::ModelStoreImpl; - -pub impl ModelWithTupleEntityImpl = dojo::model::entity::EntityImpl; -pub impl ModelWithTupleEntityStore = dojo::model::entity::EntityStoreImpl; - - -#[generate_trait] -pub impl ModelWithTupleMembersStoreImpl of ModelWithTupleMembersStore { - fn get_x(self: @dojo::world::IWorldDispatcher, key: ModelWithTupleKeyType) -> u16 { - ModelWithTupleStore::get_member(self, key, 512066735765477566404754172672287371265995314501343422459174036873487219331) - } - - fn get_x_from_id(self: @dojo::world::IWorldDispatcher, entity_id: felt252) -> u16 { - ModelWithTupleEntityStore::get_member_from_id(self, entity_id, 512066735765477566404754172672287371265995314501343422459174036873487219331) - } - - fn update_x(self: dojo::world::IWorldDispatcher, key: ModelWithTupleKeyType, value: u16) { - ModelWithTupleStore::update_member(self, key, 512066735765477566404754172672287371265995314501343422459174036873487219331, value); - } - - fn update_x_from_id(self: dojo::world::IWorldDispatcher, entity_id: felt252, value: u16) { - ModelWithTupleEntityStore::update_member_from_id(self, entity_id, 512066735765477566404754172672287371265995314501343422459174036873487219331, value); - } - - fn get_y(self: @dojo::world::IWorldDispatcher, key: ModelWithTupleKeyType) -> (u8, u16, u32) { - ModelWithTupleStore::get_member(self, key, 1591024729085637502504777720563487898377940395575083379770417352976841400819) - } - - fn get_y_from_id(self: @dojo::world::IWorldDispatcher, entity_id: felt252) -> (u8, u16, u32) { - ModelWithTupleEntityStore::get_member_from_id(self, entity_id, 1591024729085637502504777720563487898377940395575083379770417352976841400819) - } - - fn update_y(self: dojo::world::IWorldDispatcher, key: ModelWithTupleKeyType, value: (u8, u16, u32)) { - ModelWithTupleStore::update_member(self, key, 1591024729085637502504777720563487898377940395575083379770417352976841400819, value); - } - - fn update_y_from_id(self: dojo::world::IWorldDispatcher, entity_id: felt252, value: (u8, u16, u32)) { - ModelWithTupleEntityStore::update_member_from_id(self, entity_id, 1591024729085637502504777720563487898377940395575083379770417352976841400819, value); - } - - -} - - -#[starknet::interface] -pub trait IModelWithTuple { - fn ensure_abi(self: @T, model: ModelWithTuple); -} - -#[starknet::contract] -pub mod model_with_tuple { - use super::ModelWithTuple; - use super::IModelWithTuple; - - #[abi(embed_v0)] - impl DojoModelImpl = dojo::model::component::IModelImpl; - - #[abi(embed_v0)] - impl ModelWithTupleImpl of IModelWithTuple{ - fn ensure_abi(self: @ContractState, model: ModelWithTuple) { - } - } -#[event] -#[derive(Drop, starknet::Event)] -pub enum Event {} - - -#[phantom] -pub struct Storage { -} - -#[derive(Drop, Copy)] -pub struct StorageStorageBase { -} -impl StorageStorageImpl of starknet::storage::StorageTrait { - type BaseType = StorageStorageBase; - fn storage(self: starknet::storage::FlattenedStorage) -> StorageStorageBase { - StorageStorageBase { - } - } -} -#[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 ContractState { -} - -impl ContractStateDrop of Drop {} - -impl ContractStateDeref of core::ops::SnapshotDeref { - type Target = starknet::storage::FlattenedStorage; - fn snapshot_deref(self: @ContractState) -> starknet::storage::FlattenedStorage { - starknet::storage::FlattenedStorage {} - } -} -impl ContractStateDerefMut of core::ops::DerefMut { - type Target = starknet::storage::FlattenedStorage> ; - fn deref_mut(ref self: ContractState) -> starknet::storage::FlattenedStorage> { - starknet::storage::FlattenedStorage {} - } -} -pub fn unsafe_new_contract_state() -> ContractState { - ContractState { - } -} - -// TODO(Gil): This generates duplicate diagnostics because of the plugin system, squash the duplicates into one. -#[deprecated( - feature: "deprecated_legacy_map", - note: "Use `starknet::storage::Map` instead." -)] -#[allow(unused_imports)] -use starknet::storage::Map as LegacyMap; - -impl ContractStateIModelImpl of - dojo::model::component::UnsafeNewContractStateTraitForIModelImpl { - fn unsafe_new_contract_state() -> ContractState { - unsafe_new_contract_state() - } -} -#[implicit_precedence(core::pedersen::Pedersen, core::RangeCheck, core::integer::Bitwise, core::ec::EcOp, core::poseidon::Poseidon, core::SegmentArena, core::circuit::RangeCheck96, core::circuit::AddMod, core::circuit::MulMod, core::gas::GasBuiltin, System)] -fn __wrapper__ModelWithTupleImpl__ensure_abi(mut data: Span::) -> Span:: { - core::internal::require_implicit::(); - core::internal::revoke_ap_tracking(); - core::option::OptionTraitImpl::expect(core::gas::withdraw_gas(), 'Out of gas'); - let __arg_model = core::option::OptionTraitImpl::expect( - core::serde::Serde::::deserialize(ref data), - 'Failed to deserialize param #1' - ); - assert(core::array::SpanTrait::is_empty(data), 'Input too long for arguments'); - core::option::OptionTraitImpl::expect( - core::gas::withdraw_gas_all(core::gas::get_builtin_costs()), 'Out of gas', - ); - let mut contract_state = unsafe_new_contract_state(); - ModelWithTupleImpl::ensure_abi(@contract_state, __arg_model); - let mut arr = ArrayTrait::new(); - // References. - // Result. - core::array::ArrayTrait::span(@arr) -} - - -pub mod __external { - pub use super::__wrapper__ModelWithTupleImpl__ensure_abi as ensure_abi; -} -pub mod __l1_handler { -} -pub mod __constructor { -} - impl ContractStateEventEmitter of starknet::event::EventEmitter< - ContractState, Event - > { - fn emit>( - ref self: ContractState, event: S - ) { - let event: Event = core::traits::Into::into(event); - let mut keys = Default::::default(); - let mut data = Default::::default(); - starknet::Event::append_keys_and_data(@event, ref keys, ref data); - starknet::SyscallResultTrait::unwrap_syscall( - starknet::syscalls::emit_event_syscall( - core::array::ArrayTrait::span(@keys), - core::array::ArrayTrait::span(@data), - ) - ) - } - } -impl EventDrop of core::traits::Drop::; -impl EventIsEvent of starknet::Event { - fn append_keys_and_data( - self: @Event, ref keys: Array, ref data: Array - ) { - match self { - } - } - fn deserialize( - ref keys: Span, ref data: Span, - ) -> Option { - let __selector__ = *core::array::SpanTrait::pop_front(ref keys)?; - Option::None - } -} -impl StorageStorageBaseDrop of core::traits::Drop::; -impl StorageStorageBaseCopy of core::traits::Copy::; -impl StorageStorageBaseMutDrop of core::traits::Drop::; -impl StorageStorageBaseMutCopy of core::traits::Copy::; -} - -impl ModelWithTupleNoPrimitivesIntrospect<> of dojo::meta::introspect::Introspect> { - #[inline(always)] - fn size() -> Option { - let sizes : Array> = array![ - dojo::meta::introspect::Introspect::::size(), -Option::Some(3) - ]; - - if dojo::utils::any_none(@sizes) { - return Option::None; - } - Option::Some(dojo::utils::sum(sizes)) - - } - - fn layout() -> dojo::meta::Layout { - dojo::meta::Layout::Struct( - array![ - dojo::meta::FieldLayout { - selector: 512066735765477566404754172672287371265995314501343422459174036873487219331, - layout: dojo::meta::introspect::Introspect::::layout() - }, -dojo::meta::FieldLayout { - selector: 1591024729085637502504777720563487898377940395575083379770417352976841400819, - layout: dojo::meta::Layout::Tuple( - array![ - dojo::meta::introspect::Introspect::::layout(), -dojo::meta::introspect::Introspect::::layout(), -dojo::meta::introspect::Introspect::::layout() - ].span() - ) - } - ].span() - ) - } - - #[inline(always)] - fn ty() -> dojo::meta::introspect::Ty { - dojo::meta::introspect::Ty::Struct( - dojo::meta::introspect::Struct { - name: 'ModelWithTupleNoPrimitives', - attrs: array![].span(), - children: array![ - dojo::meta::introspect::Member { - name: 'player', - attrs: array!['key'].span(), - ty: dojo::meta::introspect::Introspect::::ty() - }, -dojo::meta::introspect::Member { - name: 'x', - attrs: array![].span(), - ty: dojo::meta::introspect::Introspect::::ty() - }, -dojo::meta::introspect::Member { - name: 'y', - attrs: array![].span(), - ty: dojo::meta::introspect::Ty::Tuple( - array![ - dojo::meta::introspect::Introspect::::ty(), -dojo::meta::introspect::Introspect::::ty(), -dojo::meta::introspect::Introspect::::ty() - ].span() - ) - } - - ].span() - } - ) - } -} - #[derive()] -pub struct ModelWithTupleNoPrimitivesEntity { - __id: felt252, // private field - pub x: u16, -pub y: (u8, Vec3, u32), - -} - -type ModelWithTupleNoPrimitivesKeyType = ContractAddress; - -pub impl ModelWithTupleNoPrimitivesKeyParser of dojo::model::model::KeyParser{ - #[inline(always)] - fn parse_key(self: @ModelWithTupleNoPrimitives) -> ModelWithTupleNoPrimitivesKeyType { - *self.player - } -} - -impl ModelWithTupleNoPrimitivesEntityKey of dojo::model::entity::EntityKey { -} - -// Impl to get the static definition of a model -pub mod model_with_tuple_no_primitives_definition { - use super::ModelWithTupleNoPrimitives; - pub impl ModelWithTupleNoPrimitivesDefinitionImpl of dojo::model::ModelDefinition{ - #[inline(always)] - fn name() -> ByteArray { - "ModelWithTupleNoPrimitives" - } - - #[inline(always)] - fn namespace() -> ByteArray { - "dojo_test" - } - - #[inline(always)] - fn tag() -> ByteArray { - "dojo_test-ModelWithTupleNoPrimitives" - } - - #[inline(always)] - fn version() -> u8 { - 1 - } - - #[inline(always)] - fn selector() -> felt252 { - 59168777730614245274545541976317431416582911855710103554159293691166950405 - } - - #[inline(always)] - fn name_hash() -> felt252 { - 157059227407493660591195028728750607977045261142495925435047270200565107096 - } - - #[inline(always)] - fn namespace_hash() -> felt252 { - 1452123528942907587532668415362544424816022573043154497385993678618948064048 - } - - - #[inline(always)] - fn layout() -> dojo::meta::Layout { - dojo::meta::Introspect::::layout() - } - - #[inline(always)] - fn schema() -> dojo::meta::introspect::Ty { - dojo::meta::Introspect::::ty() - } - - #[inline(always)] - fn size() -> Option { - dojo::meta::Introspect::::size() - } - } - -} - - -pub impl ModelWithTupleNoPrimitivesDefinition = model_with_tuple_no_primitives_definition::ModelWithTupleNoPrimitivesDefinitionImpl; -pub impl ModelWithTupleNoPrimitivesEntityDefinition = model_with_tuple_no_primitives_definition::ModelWithTupleNoPrimitivesDefinitionImpl; - -pub impl ModelWithTupleNoPrimitivesModelParser of dojo::model::model::ModelParser{ - fn serialize_keys(self: @ModelWithTupleNoPrimitives) -> Span { - let mut serialized = core::array::ArrayTrait::new(); - core::serde::Serde::serialize(self.player, ref serialized); - - core::array::ArrayTrait::span(@serialized) - } - fn serialize_values(self: @ModelWithTupleNoPrimitives) -> Span { - let mut serialized = core::array::ArrayTrait::new(); - core::serde::Serde::serialize(self.x, ref serialized); -core::serde::Serde::serialize(self.y, ref serialized); - - core::array::ArrayTrait::span(@serialized) - } -} - -pub impl ModelWithTupleNoPrimitivesEntityParser of dojo::model::entity::EntityParser{ - fn parse_id(self: @ModelWithTupleNoPrimitivesEntity) -> felt252 { - *self.__id - } - fn serialize_values(self: @ModelWithTupleNoPrimitivesEntity) -> Span { - let mut serialized = core::array::ArrayTrait::new(); - core::serde::Serde::serialize(self.x, ref serialized); -core::serde::Serde::serialize(self.y, ref serialized); - - core::array::ArrayTrait::span(@serialized) - } -} - - -pub impl ModelWithTupleNoPrimitivesModelImpl = dojo::model::model::ModelImpl; -pub impl ModelWithTupleNoPrimitivesStore = dojo::model::model::ModelStoreImpl; - -pub impl ModelWithTupleNoPrimitivesEntityImpl = dojo::model::entity::EntityImpl; -pub impl ModelWithTupleNoPrimitivesEntityStore = dojo::model::entity::EntityStoreImpl; - - -#[generate_trait] -pub impl ModelWithTupleNoPrimitivesMembersStoreImpl of ModelWithTupleNoPrimitivesMembersStore { - fn get_x(self: @dojo::world::IWorldDispatcher, key: ModelWithTupleNoPrimitivesKeyType) -> u16 { - ModelWithTupleNoPrimitivesStore::get_member(self, key, 512066735765477566404754172672287371265995314501343422459174036873487219331) - } - - fn get_x_from_id(self: @dojo::world::IWorldDispatcher, entity_id: felt252) -> u16 { - ModelWithTupleNoPrimitivesEntityStore::get_member_from_id(self, entity_id, 512066735765477566404754172672287371265995314501343422459174036873487219331) - } - - fn update_x(self: dojo::world::IWorldDispatcher, key: ModelWithTupleNoPrimitivesKeyType, value: u16) { - ModelWithTupleNoPrimitivesStore::update_member(self, key, 512066735765477566404754172672287371265995314501343422459174036873487219331, value); - } - - fn update_x_from_id(self: dojo::world::IWorldDispatcher, entity_id: felt252, value: u16) { - ModelWithTupleNoPrimitivesEntityStore::update_member_from_id(self, entity_id, 512066735765477566404754172672287371265995314501343422459174036873487219331, value); - } - - fn get_y(self: @dojo::world::IWorldDispatcher, key: ModelWithTupleNoPrimitivesKeyType) -> (u8, Vec3, u32) { - ModelWithTupleNoPrimitivesStore::get_member(self, key, 1591024729085637502504777720563487898377940395575083379770417352976841400819) - } - - fn get_y_from_id(self: @dojo::world::IWorldDispatcher, entity_id: felt252) -> (u8, Vec3, u32) { - ModelWithTupleNoPrimitivesEntityStore::get_member_from_id(self, entity_id, 1591024729085637502504777720563487898377940395575083379770417352976841400819) - } - - fn update_y(self: dojo::world::IWorldDispatcher, key: ModelWithTupleNoPrimitivesKeyType, value: (u8, Vec3, u32)) { - ModelWithTupleNoPrimitivesStore::update_member(self, key, 1591024729085637502504777720563487898377940395575083379770417352976841400819, value); - } - - fn update_y_from_id(self: dojo::world::IWorldDispatcher, entity_id: felt252, value: (u8, Vec3, u32)) { - ModelWithTupleNoPrimitivesEntityStore::update_member_from_id(self, entity_id, 1591024729085637502504777720563487898377940395575083379770417352976841400819, value); - } - - -} - - -#[starknet::interface] -pub trait IModelWithTupleNoPrimitives { - fn ensure_abi(self: @T, model: ModelWithTupleNoPrimitives); -} - -#[starknet::contract] -pub mod model_with_tuple_no_primitives { - use super::ModelWithTupleNoPrimitives; - use super::IModelWithTupleNoPrimitives; - - #[abi(embed_v0)] - impl DojoModelImpl = dojo::model::component::IModelImpl; - - #[abi(embed_v0)] - impl ModelWithTupleNoPrimitivesImpl of IModelWithTupleNoPrimitives{ - fn ensure_abi(self: @ContractState, model: ModelWithTupleNoPrimitives) { - } - } -#[event] -#[derive(Drop, starknet::Event)] -pub enum Event {} - - -#[phantom] -pub struct Storage { -} - -#[derive(Drop, Copy)] -pub struct StorageStorageBase { -} -impl StorageStorageImpl of starknet::storage::StorageTrait { - type BaseType = StorageStorageBase; - fn storage(self: starknet::storage::FlattenedStorage) -> StorageStorageBase { - StorageStorageBase { - } - } -} -#[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 ContractState { -} - -impl ContractStateDrop of Drop {} - -impl ContractStateDeref of core::ops::SnapshotDeref { - type Target = starknet::storage::FlattenedStorage; - fn snapshot_deref(self: @ContractState) -> starknet::storage::FlattenedStorage { - starknet::storage::FlattenedStorage {} - } -} -impl ContractStateDerefMut of core::ops::DerefMut { - type Target = starknet::storage::FlattenedStorage> ; - fn deref_mut(ref self: ContractState) -> starknet::storage::FlattenedStorage> { - starknet::storage::FlattenedStorage {} - } -} -pub fn unsafe_new_contract_state() -> ContractState { - ContractState { - } -} - -// TODO(Gil): This generates duplicate diagnostics because of the plugin system, squash the duplicates into one. -#[deprecated( - feature: "deprecated_legacy_map", - note: "Use `starknet::storage::Map` instead." -)] -#[allow(unused_imports)] -use starknet::storage::Map as LegacyMap; - -impl ContractStateIModelImpl of - dojo::model::component::UnsafeNewContractStateTraitForIModelImpl { - fn unsafe_new_contract_state() -> ContractState { - unsafe_new_contract_state() - } -} -#[implicit_precedence(core::pedersen::Pedersen, core::RangeCheck, core::integer::Bitwise, core::ec::EcOp, core::poseidon::Poseidon, core::SegmentArena, core::circuit::RangeCheck96, core::circuit::AddMod, core::circuit::MulMod, core::gas::GasBuiltin, System)] -fn __wrapper__ModelWithTupleNoPrimitivesImpl__ensure_abi(mut data: Span::) -> Span:: { - core::internal::require_implicit::(); - core::internal::revoke_ap_tracking(); - core::option::OptionTraitImpl::expect(core::gas::withdraw_gas(), 'Out of gas'); - let __arg_model = core::option::OptionTraitImpl::expect( - core::serde::Serde::::deserialize(ref data), - 'Failed to deserialize param #1' - ); - assert(core::array::SpanTrait::is_empty(data), 'Input too long for arguments'); - core::option::OptionTraitImpl::expect( - core::gas::withdraw_gas_all(core::gas::get_builtin_costs()), 'Out of gas', - ); - let mut contract_state = unsafe_new_contract_state(); - ModelWithTupleNoPrimitivesImpl::ensure_abi(@contract_state, __arg_model); - let mut arr = ArrayTrait::new(); - // References. - // Result. - core::array::ArrayTrait::span(@arr) -} - - -pub mod __external { - pub use super::__wrapper__ModelWithTupleNoPrimitivesImpl__ensure_abi as ensure_abi; -} -pub mod __l1_handler { -} -pub mod __constructor { -} - impl ContractStateEventEmitter of starknet::event::EventEmitter< - ContractState, Event - > { - fn emit>( - ref self: ContractState, event: S - ) { - let event: Event = core::traits::Into::into(event); - let mut keys = Default::::default(); - let mut data = Default::::default(); - starknet::Event::append_keys_and_data(@event, ref keys, ref data); - starknet::SyscallResultTrait::unwrap_syscall( - starknet::syscalls::emit_event_syscall( - core::array::ArrayTrait::span(@keys), - core::array::ArrayTrait::span(@data), - ) - ) - } - } -impl EventDrop of core::traits::Drop::; -impl EventIsEvent of starknet::Event { - fn append_keys_and_data( - self: @Event, ref keys: Array, ref data: Array - ) { - match self { - } - } - fn deserialize( - ref keys: Span, ref data: Span, - ) -> Option { - let __selector__ = *core::array::SpanTrait::pop_front(ref keys)?; - Option::None - } -} -impl StorageStorageBaseDrop of core::traits::Drop::; -impl StorageStorageBaseCopy of core::traits::Copy::; -impl StorageStorageBaseMutDrop of core::traits::Drop::; -impl StorageStorageBaseMutCopy of core::traits::Copy::; -} -pub trait Modelv0MembersStore { - fn get_v(self: @dojo::world::IWorldDispatcher, key: Modelv0KeyType) -> Vec3; - - fn get_v_from_id(self: @dojo::world::IWorldDispatcher, entity_id: felt252) -> Vec3; - - fn update_v(self: dojo::world::IWorldDispatcher, key: Modelv0KeyType, value: Vec3); - - fn update_v_from_id(self: dojo::world::IWorldDispatcher, entity_id: felt252, value: Vec3); - - -} -pub trait IModelv0DispatcherTrait { - fn ensure_abi(self: T, model: Modelv0); -} - -#[derive(Copy, Drop, starknet::Store, Serde)] -pub struct IModelv0Dispatcher { - pub contract_address: starknet::ContractAddress, -} - -impl IModelv0DispatcherImpl of IModelv0DispatcherTrait { - fn ensure_abi(self: IModelv0Dispatcher, model: Modelv0) { - let mut __calldata__ = core::traits::Default::default(); - core::serde::Serde::::serialize(@model, ref __calldata__); - - let mut __dispatcher_return_data__ = starknet::syscalls::call_contract_syscall( - self.contract_address, - selector!("ensure_abi"), - core::array::ArrayTrait::span(@__calldata__), - ); - let mut __dispatcher_return_data__ = starknet::SyscallResultTrait::unwrap_syscall(__dispatcher_return_data__); - () - } - -} - -#[derive(Copy, Drop, starknet::Store, Serde)] -pub struct IModelv0LibraryDispatcher { - pub class_hash: starknet::ClassHash, -} - -impl IModelv0LibraryDispatcherImpl of IModelv0DispatcherTrait { - fn ensure_abi(self: IModelv0LibraryDispatcher, model: Modelv0) { - let mut __calldata__ = core::traits::Default::default(); - core::serde::Serde::::serialize(@model, ref __calldata__); - - let mut __dispatcher_return_data__ = starknet::syscalls::library_call_syscall( - self.class_hash, - selector!("ensure_abi"), - core::array::ArrayTrait::span(@__calldata__), - ); - let mut __dispatcher_return_data__ = starknet::SyscallResultTrait::unwrap_syscall(__dispatcher_return_data__); - () - } - -} - -pub trait IModelv0SafeDispatcherTrait { - #[unstable(feature: "safe_dispatcher")] - fn ensure_abi(self: T, model: Modelv0) -> starknet::SyscallResult<()>; -} - -#[derive(Copy, Drop, starknet::Store, Serde)] -pub struct IModelv0SafeLibraryDispatcher { - pub class_hash: starknet::ClassHash, -} - -impl IModelv0SafeLibraryDispatcherImpl of IModelv0SafeDispatcherTrait { - fn ensure_abi(self: IModelv0SafeLibraryDispatcher, model: Modelv0) -> starknet::SyscallResult<()> { - let mut __calldata__ = core::traits::Default::default(); - core::serde::Serde::::serialize(@model, ref __calldata__); - - let mut __dispatcher_return_data__ = starknet::syscalls::library_call_syscall( - self.class_hash, - selector!("ensure_abi"), - core::array::ArrayTrait::span(@__calldata__), - ); - let mut __dispatcher_return_data__ = __dispatcher_return_data__?; - Result::Ok(()) - } - -} - - -#[derive(Copy, Drop, starknet::Store, Serde)] -pub struct IModelv0SafeDispatcher { - pub contract_address: starknet::ContractAddress, -} - -impl IModelv0SafeDispatcherImpl of IModelv0SafeDispatcherTrait { - fn ensure_abi(self: IModelv0SafeDispatcher, model: Modelv0) -> starknet::SyscallResult<()> { - let mut __calldata__ = core::traits::Default::default(); - core::serde::Serde::::serialize(@model, ref __calldata__); - - let mut __dispatcher_return_data__ = starknet::syscalls::call_contract_syscall( - self.contract_address, - selector!("ensure_abi"), - core::array::ArrayTrait::span(@__calldata__), - ); - let mut __dispatcher_return_data__ = __dispatcher_return_data__?; - Result::Ok(()) - } - -} -pub trait ModelWithBadNamespaceFormatMembersStore { - fn get_v(self: @dojo::world::IWorldDispatcher, key: ModelWithBadNamespaceFormatKeyType) -> Vec3; - - fn get_v_from_id(self: @dojo::world::IWorldDispatcher, entity_id: felt252) -> Vec3; - - fn update_v(self: dojo::world::IWorldDispatcher, key: ModelWithBadNamespaceFormatKeyType, value: Vec3); - - fn update_v_from_id(self: dojo::world::IWorldDispatcher, entity_id: felt252, value: Vec3); - - -} -pub trait IModelWithBadNamespaceFormatDispatcherTrait { - fn ensure_abi(self: T, model: ModelWithBadNamespaceFormat); -} - -#[derive(Copy, Drop, starknet::Store, Serde)] -pub struct IModelWithBadNamespaceFormatDispatcher { - pub contract_address: starknet::ContractAddress, -} - -impl IModelWithBadNamespaceFormatDispatcherImpl of IModelWithBadNamespaceFormatDispatcherTrait { - fn ensure_abi(self: IModelWithBadNamespaceFormatDispatcher, model: ModelWithBadNamespaceFormat) { - let mut __calldata__ = core::traits::Default::default(); - core::serde::Serde::::serialize(@model, ref __calldata__); - - let mut __dispatcher_return_data__ = starknet::syscalls::call_contract_syscall( - self.contract_address, - selector!("ensure_abi"), - core::array::ArrayTrait::span(@__calldata__), - ); - let mut __dispatcher_return_data__ = starknet::SyscallResultTrait::unwrap_syscall(__dispatcher_return_data__); - () - } - -} - -#[derive(Copy, Drop, starknet::Store, Serde)] -pub struct IModelWithBadNamespaceFormatLibraryDispatcher { - pub class_hash: starknet::ClassHash, -} - -impl IModelWithBadNamespaceFormatLibraryDispatcherImpl of IModelWithBadNamespaceFormatDispatcherTrait { - fn ensure_abi(self: IModelWithBadNamespaceFormatLibraryDispatcher, model: ModelWithBadNamespaceFormat) { - let mut __calldata__ = core::traits::Default::default(); - core::serde::Serde::::serialize(@model, ref __calldata__); - - let mut __dispatcher_return_data__ = starknet::syscalls::library_call_syscall( - self.class_hash, - selector!("ensure_abi"), - core::array::ArrayTrait::span(@__calldata__), - ); - let mut __dispatcher_return_data__ = starknet::SyscallResultTrait::unwrap_syscall(__dispatcher_return_data__); - () - } - -} - -pub trait IModelWithBadNamespaceFormatSafeDispatcherTrait { - #[unstable(feature: "safe_dispatcher")] - fn ensure_abi(self: T, model: ModelWithBadNamespaceFormat) -> starknet::SyscallResult<()>; -} - -#[derive(Copy, Drop, starknet::Store, Serde)] -pub struct IModelWithBadNamespaceFormatSafeLibraryDispatcher { - pub class_hash: starknet::ClassHash, -} - -impl IModelWithBadNamespaceFormatSafeLibraryDispatcherImpl of IModelWithBadNamespaceFormatSafeDispatcherTrait { - fn ensure_abi(self: IModelWithBadNamespaceFormatSafeLibraryDispatcher, model: ModelWithBadNamespaceFormat) -> starknet::SyscallResult<()> { - let mut __calldata__ = core::traits::Default::default(); - core::serde::Serde::::serialize(@model, ref __calldata__); - - let mut __dispatcher_return_data__ = starknet::syscalls::library_call_syscall( - self.class_hash, - selector!("ensure_abi"), - core::array::ArrayTrait::span(@__calldata__), - ); - let mut __dispatcher_return_data__ = __dispatcher_return_data__?; - Result::Ok(()) - } - -} - - -#[derive(Copy, Drop, starknet::Store, Serde)] -pub struct IModelWithBadNamespaceFormatSafeDispatcher { - pub contract_address: starknet::ContractAddress, -} - -impl IModelWithBadNamespaceFormatSafeDispatcherImpl of IModelWithBadNamespaceFormatSafeDispatcherTrait { - fn ensure_abi(self: IModelWithBadNamespaceFormatSafeDispatcher, model: ModelWithBadNamespaceFormat) -> starknet::SyscallResult<()> { - let mut __calldata__ = core::traits::Default::default(); - core::serde::Serde::::serialize(@model, ref __calldata__); - - let mut __dispatcher_return_data__ = starknet::syscalls::call_contract_syscall( - self.contract_address, - selector!("ensure_abi"), - core::array::ArrayTrait::span(@__calldata__), - ); - let mut __dispatcher_return_data__ = __dispatcher_return_data__?; - Result::Ok(()) - } - -} -pub trait ModelWithShortStringNamespaceMembersStore { - fn get_v(self: @dojo::world::IWorldDispatcher, key: ModelWithShortStringNamespaceKeyType) -> Vec3; - - fn get_v_from_id(self: @dojo::world::IWorldDispatcher, entity_id: felt252) -> Vec3; - - fn update_v(self: dojo::world::IWorldDispatcher, key: ModelWithShortStringNamespaceKeyType, value: Vec3); - - fn update_v_from_id(self: dojo::world::IWorldDispatcher, entity_id: felt252, value: Vec3); - - -} -pub trait IModelWithShortStringNamespaceDispatcherTrait { - fn ensure_abi(self: T, model: ModelWithShortStringNamespace); -} - -#[derive(Copy, Drop, starknet::Store, Serde)] -pub struct IModelWithShortStringNamespaceDispatcher { - pub contract_address: starknet::ContractAddress, -} - -impl IModelWithShortStringNamespaceDispatcherImpl of IModelWithShortStringNamespaceDispatcherTrait { - fn ensure_abi(self: IModelWithShortStringNamespaceDispatcher, model: ModelWithShortStringNamespace) { - let mut __calldata__ = core::traits::Default::default(); - core::serde::Serde::::serialize(@model, ref __calldata__); - - let mut __dispatcher_return_data__ = starknet::syscalls::call_contract_syscall( - self.contract_address, - selector!("ensure_abi"), - core::array::ArrayTrait::span(@__calldata__), - ); - let mut __dispatcher_return_data__ = starknet::SyscallResultTrait::unwrap_syscall(__dispatcher_return_data__); - () - } - -} - -#[derive(Copy, Drop, starknet::Store, Serde)] -pub struct IModelWithShortStringNamespaceLibraryDispatcher { - pub class_hash: starknet::ClassHash, -} - -impl IModelWithShortStringNamespaceLibraryDispatcherImpl of IModelWithShortStringNamespaceDispatcherTrait { - fn ensure_abi(self: IModelWithShortStringNamespaceLibraryDispatcher, model: ModelWithShortStringNamespace) { - let mut __calldata__ = core::traits::Default::default(); - core::serde::Serde::::serialize(@model, ref __calldata__); - - let mut __dispatcher_return_data__ = starknet::syscalls::library_call_syscall( - self.class_hash, - selector!("ensure_abi"), - core::array::ArrayTrait::span(@__calldata__), - ); - let mut __dispatcher_return_data__ = starknet::SyscallResultTrait::unwrap_syscall(__dispatcher_return_data__); - () - } - -} - -pub trait IModelWithShortStringNamespaceSafeDispatcherTrait { - #[unstable(feature: "safe_dispatcher")] - fn ensure_abi(self: T, model: ModelWithShortStringNamespace) -> starknet::SyscallResult<()>; -} - -#[derive(Copy, Drop, starknet::Store, Serde)] -pub struct IModelWithShortStringNamespaceSafeLibraryDispatcher { - pub class_hash: starknet::ClassHash, -} - -impl IModelWithShortStringNamespaceSafeLibraryDispatcherImpl of IModelWithShortStringNamespaceSafeDispatcherTrait { - fn ensure_abi(self: IModelWithShortStringNamespaceSafeLibraryDispatcher, model: ModelWithShortStringNamespace) -> starknet::SyscallResult<()> { - let mut __calldata__ = core::traits::Default::default(); - core::serde::Serde::::serialize(@model, ref __calldata__); - - let mut __dispatcher_return_data__ = starknet::syscalls::library_call_syscall( - self.class_hash, - selector!("ensure_abi"), - core::array::ArrayTrait::span(@__calldata__), - ); - let mut __dispatcher_return_data__ = __dispatcher_return_data__?; - Result::Ok(()) - } - -} - - -#[derive(Copy, Drop, starknet::Store, Serde)] -pub struct IModelWithShortStringNamespaceSafeDispatcher { - pub contract_address: starknet::ContractAddress, -} - -impl IModelWithShortStringNamespaceSafeDispatcherImpl of IModelWithShortStringNamespaceSafeDispatcherTrait { - fn ensure_abi(self: IModelWithShortStringNamespaceSafeDispatcher, model: ModelWithShortStringNamespace) -> starknet::SyscallResult<()> { - let mut __calldata__ = core::traits::Default::default(); - core::serde::Serde::::serialize(@model, ref __calldata__); - - let mut __dispatcher_return_data__ = starknet::syscalls::call_contract_syscall( - self.contract_address, - selector!("ensure_abi"), - core::array::ArrayTrait::span(@__calldata__), - ); - let mut __dispatcher_return_data__ = __dispatcher_return_data__?; - Result::Ok(()) - } - -} -pub trait ModelWithStringNamespaceMembersStore { - fn get_v(self: @dojo::world::IWorldDispatcher, key: ModelWithStringNamespaceKeyType) -> Vec3; - - fn get_v_from_id(self: @dojo::world::IWorldDispatcher, entity_id: felt252) -> Vec3; - - fn update_v(self: dojo::world::IWorldDispatcher, key: ModelWithStringNamespaceKeyType, value: Vec3); - - fn update_v_from_id(self: dojo::world::IWorldDispatcher, entity_id: felt252, value: Vec3); - - -} -pub trait IModelWithStringNamespaceDispatcherTrait { - fn ensure_abi(self: T, model: ModelWithStringNamespace); -} - -#[derive(Copy, Drop, starknet::Store, Serde)] -pub struct IModelWithStringNamespaceDispatcher { - pub contract_address: starknet::ContractAddress, -} - -impl IModelWithStringNamespaceDispatcherImpl of IModelWithStringNamespaceDispatcherTrait { - fn ensure_abi(self: IModelWithStringNamespaceDispatcher, model: ModelWithStringNamespace) { - let mut __calldata__ = core::traits::Default::default(); - core::serde::Serde::::serialize(@model, ref __calldata__); - - let mut __dispatcher_return_data__ = starknet::syscalls::call_contract_syscall( - self.contract_address, - selector!("ensure_abi"), - core::array::ArrayTrait::span(@__calldata__), - ); - let mut __dispatcher_return_data__ = starknet::SyscallResultTrait::unwrap_syscall(__dispatcher_return_data__); - () - } - -} - -#[derive(Copy, Drop, starknet::Store, Serde)] -pub struct IModelWithStringNamespaceLibraryDispatcher { - pub class_hash: starknet::ClassHash, -} - -impl IModelWithStringNamespaceLibraryDispatcherImpl of IModelWithStringNamespaceDispatcherTrait { - fn ensure_abi(self: IModelWithStringNamespaceLibraryDispatcher, model: ModelWithStringNamespace) { - let mut __calldata__ = core::traits::Default::default(); - core::serde::Serde::::serialize(@model, ref __calldata__); - - let mut __dispatcher_return_data__ = starknet::syscalls::library_call_syscall( - self.class_hash, - selector!("ensure_abi"), - core::array::ArrayTrait::span(@__calldata__), - ); - let mut __dispatcher_return_data__ = starknet::SyscallResultTrait::unwrap_syscall(__dispatcher_return_data__); - () - } - -} - -pub trait IModelWithStringNamespaceSafeDispatcherTrait { - #[unstable(feature: "safe_dispatcher")] - fn ensure_abi(self: T, model: ModelWithStringNamespace) -> starknet::SyscallResult<()>; -} - -#[derive(Copy, Drop, starknet::Store, Serde)] -pub struct IModelWithStringNamespaceSafeLibraryDispatcher { - pub class_hash: starknet::ClassHash, -} - -impl IModelWithStringNamespaceSafeLibraryDispatcherImpl of IModelWithStringNamespaceSafeDispatcherTrait { - fn ensure_abi(self: IModelWithStringNamespaceSafeLibraryDispatcher, model: ModelWithStringNamespace) -> starknet::SyscallResult<()> { - let mut __calldata__ = core::traits::Default::default(); - core::serde::Serde::::serialize(@model, ref __calldata__); - - let mut __dispatcher_return_data__ = starknet::syscalls::library_call_syscall( - self.class_hash, - selector!("ensure_abi"), - core::array::ArrayTrait::span(@__calldata__), - ); - let mut __dispatcher_return_data__ = __dispatcher_return_data__?; - Result::Ok(()) - } - -} - - -#[derive(Copy, Drop, starknet::Store, Serde)] -pub struct IModelWithStringNamespaceSafeDispatcher { - pub contract_address: starknet::ContractAddress, -} - -impl IModelWithStringNamespaceSafeDispatcherImpl of IModelWithStringNamespaceSafeDispatcherTrait { - fn ensure_abi(self: IModelWithStringNamespaceSafeDispatcher, model: ModelWithStringNamespace) -> starknet::SyscallResult<()> { - let mut __calldata__ = core::traits::Default::default(); - core::serde::Serde::::serialize(@model, ref __calldata__); - - let mut __dispatcher_return_data__ = starknet::syscalls::call_contract_syscall( - self.contract_address, - selector!("ensure_abi"), - core::array::ArrayTrait::span(@__calldata__), - ); - let mut __dispatcher_return_data__ = __dispatcher_return_data__?; - Result::Ok(()) - } - -} -pub trait PositionMembersStore { - fn get_v(self: @dojo::world::IWorldDispatcher, key: PositionKeyType) -> Vec3; - - fn get_v_from_id(self: @dojo::world::IWorldDispatcher, entity_id: felt252) -> Vec3; - - fn update_v(self: dojo::world::IWorldDispatcher, key: PositionKeyType, value: Vec3); - - fn update_v_from_id(self: dojo::world::IWorldDispatcher, entity_id: felt252, value: Vec3); - - -} -pub trait IPositionDispatcherTrait { - fn ensure_abi(self: T, model: Position); -} - -#[derive(Copy, Drop, starknet::Store, Serde)] -pub struct IPositionDispatcher { - pub contract_address: starknet::ContractAddress, -} - -impl IPositionDispatcherImpl of IPositionDispatcherTrait { - fn ensure_abi(self: IPositionDispatcher, model: Position) { - let mut __calldata__ = core::traits::Default::default(); - core::serde::Serde::::serialize(@model, ref __calldata__); - - let mut __dispatcher_return_data__ = starknet::syscalls::call_contract_syscall( - self.contract_address, - selector!("ensure_abi"), - core::array::ArrayTrait::span(@__calldata__), - ); - let mut __dispatcher_return_data__ = starknet::SyscallResultTrait::unwrap_syscall(__dispatcher_return_data__); - () - } - -} - -#[derive(Copy, Drop, starknet::Store, Serde)] -pub struct IPositionLibraryDispatcher { - pub class_hash: starknet::ClassHash, -} - -impl IPositionLibraryDispatcherImpl of IPositionDispatcherTrait { - fn ensure_abi(self: IPositionLibraryDispatcher, model: Position) { - let mut __calldata__ = core::traits::Default::default(); - core::serde::Serde::::serialize(@model, ref __calldata__); - - let mut __dispatcher_return_data__ = starknet::syscalls::library_call_syscall( - self.class_hash, - selector!("ensure_abi"), - core::array::ArrayTrait::span(@__calldata__), - ); - let mut __dispatcher_return_data__ = starknet::SyscallResultTrait::unwrap_syscall(__dispatcher_return_data__); - () - } - -} - -pub trait IPositionSafeDispatcherTrait { - #[unstable(feature: "safe_dispatcher")] - fn ensure_abi(self: T, model: Position) -> starknet::SyscallResult<()>; -} - -#[derive(Copy, Drop, starknet::Store, Serde)] -pub struct IPositionSafeLibraryDispatcher { - pub class_hash: starknet::ClassHash, -} - -impl IPositionSafeLibraryDispatcherImpl of IPositionSafeDispatcherTrait { - fn ensure_abi(self: IPositionSafeLibraryDispatcher, model: Position) -> starknet::SyscallResult<()> { - let mut __calldata__ = core::traits::Default::default(); - core::serde::Serde::::serialize(@model, ref __calldata__); - - let mut __dispatcher_return_data__ = starknet::syscalls::library_call_syscall( - self.class_hash, - selector!("ensure_abi"), - core::array::ArrayTrait::span(@__calldata__), - ); - let mut __dispatcher_return_data__ = __dispatcher_return_data__?; - Result::Ok(()) - } - -} - - -#[derive(Copy, Drop, starknet::Store, Serde)] -pub struct IPositionSafeDispatcher { - pub contract_address: starknet::ContractAddress, -} - -impl IPositionSafeDispatcherImpl of IPositionSafeDispatcherTrait { - fn ensure_abi(self: IPositionSafeDispatcher, model: Position) -> starknet::SyscallResult<()> { - let mut __calldata__ = core::traits::Default::default(); - core::serde::Serde::::serialize(@model, ref __calldata__); - - let mut __dispatcher_return_data__ = starknet::syscalls::call_contract_syscall( - self.contract_address, - selector!("ensure_abi"), - core::array::ArrayTrait::span(@__calldata__), - ); - let mut __dispatcher_return_data__ = __dispatcher_return_data__?; - Result::Ok(()) - } - -} -pub trait PlayerMembersStore { - fn get_name(self: @dojo::world::IWorldDispatcher, key: PlayerKeyType) -> felt252; - - fn get_name_from_id(self: @dojo::world::IWorldDispatcher, entity_id: felt252) -> felt252; - - fn update_name(self: dojo::world::IWorldDispatcher, key: PlayerKeyType, value: felt252); - - fn update_name_from_id(self: dojo::world::IWorldDispatcher, entity_id: felt252, value: felt252); - - -} -pub trait IPlayerDispatcherTrait { - fn ensure_abi(self: T, model: Player); -} - -#[derive(Copy, Drop, starknet::Store, Serde)] -pub struct IPlayerDispatcher { - pub contract_address: starknet::ContractAddress, -} - -impl IPlayerDispatcherImpl of IPlayerDispatcherTrait { - fn ensure_abi(self: IPlayerDispatcher, model: Player) { - let mut __calldata__ = core::traits::Default::default(); - core::serde::Serde::::serialize(@model, ref __calldata__); - - let mut __dispatcher_return_data__ = starknet::syscalls::call_contract_syscall( - self.contract_address, - selector!("ensure_abi"), - core::array::ArrayTrait::span(@__calldata__), - ); - let mut __dispatcher_return_data__ = starknet::SyscallResultTrait::unwrap_syscall(__dispatcher_return_data__); - () - } - -} - -#[derive(Copy, Drop, starknet::Store, Serde)] -pub struct IPlayerLibraryDispatcher { - pub class_hash: starknet::ClassHash, -} - -impl IPlayerLibraryDispatcherImpl of IPlayerDispatcherTrait { - fn ensure_abi(self: IPlayerLibraryDispatcher, model: Player) { - let mut __calldata__ = core::traits::Default::default(); - core::serde::Serde::::serialize(@model, ref __calldata__); - - let mut __dispatcher_return_data__ = starknet::syscalls::library_call_syscall( - self.class_hash, - selector!("ensure_abi"), - core::array::ArrayTrait::span(@__calldata__), - ); - let mut __dispatcher_return_data__ = starknet::SyscallResultTrait::unwrap_syscall(__dispatcher_return_data__); - () - } - -} - -pub trait IPlayerSafeDispatcherTrait { - #[unstable(feature: "safe_dispatcher")] - fn ensure_abi(self: T, model: Player) -> starknet::SyscallResult<()>; -} - -#[derive(Copy, Drop, starknet::Store, Serde)] -pub struct IPlayerSafeLibraryDispatcher { - pub class_hash: starknet::ClassHash, -} - -impl IPlayerSafeLibraryDispatcherImpl of IPlayerSafeDispatcherTrait { - fn ensure_abi(self: IPlayerSafeLibraryDispatcher, model: Player) -> starknet::SyscallResult<()> { - let mut __calldata__ = core::traits::Default::default(); - core::serde::Serde::::serialize(@model, ref __calldata__); - - let mut __dispatcher_return_data__ = starknet::syscalls::library_call_syscall( - self.class_hash, - selector!("ensure_abi"), - core::array::ArrayTrait::span(@__calldata__), - ); - let mut __dispatcher_return_data__ = __dispatcher_return_data__?; - Result::Ok(()) - } - -} - - -#[derive(Copy, Drop, starknet::Store, Serde)] -pub struct IPlayerSafeDispatcher { - pub contract_address: starknet::ContractAddress, -} - -impl IPlayerSafeDispatcherImpl of IPlayerSafeDispatcherTrait { - fn ensure_abi(self: IPlayerSafeDispatcher, model: Player) -> starknet::SyscallResult<()> { - let mut __calldata__ = core::traits::Default::default(); - core::serde::Serde::::serialize(@model, ref __calldata__); - - let mut __dispatcher_return_data__ = starknet::syscalls::call_contract_syscall( - self.contract_address, - selector!("ensure_abi"), - core::array::ArrayTrait::span(@__calldata__), - ); - let mut __dispatcher_return_data__ = __dispatcher_return_data__?; - Result::Ok(()) - } - -} -pub trait ModelWithSimpleArrayMembersStore { - fn get_x(self: @dojo::world::IWorldDispatcher, key: ModelWithSimpleArrayKeyType) -> u16; - - fn get_x_from_id(self: @dojo::world::IWorldDispatcher, entity_id: felt252) -> u16; - - fn update_x(self: dojo::world::IWorldDispatcher, key: ModelWithSimpleArrayKeyType, value: u16); - - fn update_x_from_id(self: dojo::world::IWorldDispatcher, entity_id: felt252, value: u16); - - fn get_y(self: @dojo::world::IWorldDispatcher, key: ModelWithSimpleArrayKeyType) -> Array; - - fn get_y_from_id(self: @dojo::world::IWorldDispatcher, entity_id: felt252) -> Array; - - fn update_y(self: dojo::world::IWorldDispatcher, key: ModelWithSimpleArrayKeyType, value: Array); - - fn update_y_from_id(self: dojo::world::IWorldDispatcher, entity_id: felt252, value: Array); - - -} -pub trait IModelWithSimpleArrayDispatcherTrait { - fn ensure_abi(self: T, model: ModelWithSimpleArray); -} - -#[derive(Copy, Drop, starknet::Store, Serde)] -pub struct IModelWithSimpleArrayDispatcher { - pub contract_address: starknet::ContractAddress, -} - -impl IModelWithSimpleArrayDispatcherImpl of IModelWithSimpleArrayDispatcherTrait { - fn ensure_abi(self: IModelWithSimpleArrayDispatcher, model: ModelWithSimpleArray) { - let mut __calldata__ = core::traits::Default::default(); - core::serde::Serde::::serialize(@model, ref __calldata__); - - let mut __dispatcher_return_data__ = starknet::syscalls::call_contract_syscall( - self.contract_address, - selector!("ensure_abi"), - core::array::ArrayTrait::span(@__calldata__), - ); - let mut __dispatcher_return_data__ = starknet::SyscallResultTrait::unwrap_syscall(__dispatcher_return_data__); - () - } - -} - -#[derive(Copy, Drop, starknet::Store, Serde)] -pub struct IModelWithSimpleArrayLibraryDispatcher { - pub class_hash: starknet::ClassHash, -} - -impl IModelWithSimpleArrayLibraryDispatcherImpl of IModelWithSimpleArrayDispatcherTrait { - fn ensure_abi(self: IModelWithSimpleArrayLibraryDispatcher, model: ModelWithSimpleArray) { - let mut __calldata__ = core::traits::Default::default(); - core::serde::Serde::::serialize(@model, ref __calldata__); - - let mut __dispatcher_return_data__ = starknet::syscalls::library_call_syscall( - self.class_hash, - selector!("ensure_abi"), - core::array::ArrayTrait::span(@__calldata__), - ); - let mut __dispatcher_return_data__ = starknet::SyscallResultTrait::unwrap_syscall(__dispatcher_return_data__); - () - } - -} - -pub trait IModelWithSimpleArraySafeDispatcherTrait { - #[unstable(feature: "safe_dispatcher")] - fn ensure_abi(self: T, model: ModelWithSimpleArray) -> starknet::SyscallResult<()>; -} - -#[derive(Copy, Drop, starknet::Store, Serde)] -pub struct IModelWithSimpleArraySafeLibraryDispatcher { - pub class_hash: starknet::ClassHash, -} - -impl IModelWithSimpleArraySafeLibraryDispatcherImpl of IModelWithSimpleArraySafeDispatcherTrait { - fn ensure_abi(self: IModelWithSimpleArraySafeLibraryDispatcher, model: ModelWithSimpleArray) -> starknet::SyscallResult<()> { - let mut __calldata__ = core::traits::Default::default(); - core::serde::Serde::::serialize(@model, ref __calldata__); - - let mut __dispatcher_return_data__ = starknet::syscalls::library_call_syscall( - self.class_hash, - selector!("ensure_abi"), - core::array::ArrayTrait::span(@__calldata__), - ); - let mut __dispatcher_return_data__ = __dispatcher_return_data__?; - Result::Ok(()) - } - -} - - -#[derive(Copy, Drop, starknet::Store, Serde)] -pub struct IModelWithSimpleArraySafeDispatcher { - pub contract_address: starknet::ContractAddress, -} - -impl IModelWithSimpleArraySafeDispatcherImpl of IModelWithSimpleArraySafeDispatcherTrait { - fn ensure_abi(self: IModelWithSimpleArraySafeDispatcher, model: ModelWithSimpleArray) -> starknet::SyscallResult<()> { - let mut __calldata__ = core::traits::Default::default(); - core::serde::Serde::::serialize(@model, ref __calldata__); - - let mut __dispatcher_return_data__ = starknet::syscalls::call_contract_syscall( - self.contract_address, - selector!("ensure_abi"), - core::array::ArrayTrait::span(@__calldata__), - ); - let mut __dispatcher_return_data__ = __dispatcher_return_data__?; - Result::Ok(()) - } - -} -pub trait ModelWithByteArrayMembersStore { - fn get_x(self: @dojo::world::IWorldDispatcher, key: ModelWithByteArrayKeyType) -> u16; - - fn get_x_from_id(self: @dojo::world::IWorldDispatcher, entity_id: felt252) -> u16; - - fn update_x(self: dojo::world::IWorldDispatcher, key: ModelWithByteArrayKeyType, value: u16); - - fn update_x_from_id(self: dojo::world::IWorldDispatcher, entity_id: felt252, value: u16); - - fn get_y(self: @dojo::world::IWorldDispatcher, key: ModelWithByteArrayKeyType) -> ByteArray; - - fn get_y_from_id(self: @dojo::world::IWorldDispatcher, entity_id: felt252) -> ByteArray; - - fn update_y(self: dojo::world::IWorldDispatcher, key: ModelWithByteArrayKeyType, value: ByteArray); - - fn update_y_from_id(self: dojo::world::IWorldDispatcher, entity_id: felt252, value: ByteArray); - - -} -pub trait IModelWithByteArrayDispatcherTrait { - fn ensure_abi(self: T, model: ModelWithByteArray); -} - -#[derive(Copy, Drop, starknet::Store, Serde)] -pub struct IModelWithByteArrayDispatcher { - pub contract_address: starknet::ContractAddress, -} - -impl IModelWithByteArrayDispatcherImpl of IModelWithByteArrayDispatcherTrait { - fn ensure_abi(self: IModelWithByteArrayDispatcher, model: ModelWithByteArray) { - let mut __calldata__ = core::traits::Default::default(); - core::serde::Serde::::serialize(@model, ref __calldata__); - - let mut __dispatcher_return_data__ = starknet::syscalls::call_contract_syscall( - self.contract_address, - selector!("ensure_abi"), - core::array::ArrayTrait::span(@__calldata__), - ); - let mut __dispatcher_return_data__ = starknet::SyscallResultTrait::unwrap_syscall(__dispatcher_return_data__); - () - } - -} - -#[derive(Copy, Drop, starknet::Store, Serde)] -pub struct IModelWithByteArrayLibraryDispatcher { - pub class_hash: starknet::ClassHash, -} - -impl IModelWithByteArrayLibraryDispatcherImpl of IModelWithByteArrayDispatcherTrait { - fn ensure_abi(self: IModelWithByteArrayLibraryDispatcher, model: ModelWithByteArray) { - let mut __calldata__ = core::traits::Default::default(); - core::serde::Serde::::serialize(@model, ref __calldata__); - - let mut __dispatcher_return_data__ = starknet::syscalls::library_call_syscall( - self.class_hash, - selector!("ensure_abi"), - core::array::ArrayTrait::span(@__calldata__), - ); - let mut __dispatcher_return_data__ = starknet::SyscallResultTrait::unwrap_syscall(__dispatcher_return_data__); - () - } - -} - -pub trait IModelWithByteArraySafeDispatcherTrait { - #[unstable(feature: "safe_dispatcher")] - fn ensure_abi(self: T, model: ModelWithByteArray) -> starknet::SyscallResult<()>; -} - -#[derive(Copy, Drop, starknet::Store, Serde)] -pub struct IModelWithByteArraySafeLibraryDispatcher { - pub class_hash: starknet::ClassHash, -} - -impl IModelWithByteArraySafeLibraryDispatcherImpl of IModelWithByteArraySafeDispatcherTrait { - fn ensure_abi(self: IModelWithByteArraySafeLibraryDispatcher, model: ModelWithByteArray) -> starknet::SyscallResult<()> { - let mut __calldata__ = core::traits::Default::default(); - core::serde::Serde::::serialize(@model, ref __calldata__); - - let mut __dispatcher_return_data__ = starknet::syscalls::library_call_syscall( - self.class_hash, - selector!("ensure_abi"), - core::array::ArrayTrait::span(@__calldata__), - ); - let mut __dispatcher_return_data__ = __dispatcher_return_data__?; - Result::Ok(()) - } - -} - - -#[derive(Copy, Drop, starknet::Store, Serde)] -pub struct IModelWithByteArraySafeDispatcher { - pub contract_address: starknet::ContractAddress, -} - -impl IModelWithByteArraySafeDispatcherImpl of IModelWithByteArraySafeDispatcherTrait { - fn ensure_abi(self: IModelWithByteArraySafeDispatcher, model: ModelWithByteArray) -> starknet::SyscallResult<()> { - let mut __calldata__ = core::traits::Default::default(); - core::serde::Serde::::serialize(@model, ref __calldata__); - - let mut __dispatcher_return_data__ = starknet::syscalls::call_contract_syscall( - self.contract_address, - selector!("ensure_abi"), - core::array::ArrayTrait::span(@__calldata__), - ); - let mut __dispatcher_return_data__ = __dispatcher_return_data__?; - Result::Ok(()) - } - -} -pub trait ModelWithComplexArrayMembersStore { - fn get_x(self: @dojo::world::IWorldDispatcher, key: ModelWithComplexArrayKeyType) -> u16; - - fn get_x_from_id(self: @dojo::world::IWorldDispatcher, entity_id: felt252) -> u16; - - fn update_x(self: dojo::world::IWorldDispatcher, key: ModelWithComplexArrayKeyType, value: u16); - - fn update_x_from_id(self: dojo::world::IWorldDispatcher, entity_id: felt252, value: u16); - - fn get_y(self: @dojo::world::IWorldDispatcher, key: ModelWithComplexArrayKeyType) -> Array; - - fn get_y_from_id(self: @dojo::world::IWorldDispatcher, entity_id: felt252) -> Array; - - fn update_y(self: dojo::world::IWorldDispatcher, key: ModelWithComplexArrayKeyType, value: Array); - - fn update_y_from_id(self: dojo::world::IWorldDispatcher, entity_id: felt252, value: Array); - - -} -pub trait IModelWithComplexArrayDispatcherTrait { - fn ensure_abi(self: T, model: ModelWithComplexArray); -} - -#[derive(Copy, Drop, starknet::Store, Serde)] -pub struct IModelWithComplexArrayDispatcher { - pub contract_address: starknet::ContractAddress, -} - -impl IModelWithComplexArrayDispatcherImpl of IModelWithComplexArrayDispatcherTrait { - fn ensure_abi(self: IModelWithComplexArrayDispatcher, model: ModelWithComplexArray) { - let mut __calldata__ = core::traits::Default::default(); - core::serde::Serde::::serialize(@model, ref __calldata__); - - let mut __dispatcher_return_data__ = starknet::syscalls::call_contract_syscall( - self.contract_address, - selector!("ensure_abi"), - core::array::ArrayTrait::span(@__calldata__), - ); - let mut __dispatcher_return_data__ = starknet::SyscallResultTrait::unwrap_syscall(__dispatcher_return_data__); - () - } - -} - -#[derive(Copy, Drop, starknet::Store, Serde)] -pub struct IModelWithComplexArrayLibraryDispatcher { - pub class_hash: starknet::ClassHash, -} - -impl IModelWithComplexArrayLibraryDispatcherImpl of IModelWithComplexArrayDispatcherTrait { - fn ensure_abi(self: IModelWithComplexArrayLibraryDispatcher, model: ModelWithComplexArray) { - let mut __calldata__ = core::traits::Default::default(); - core::serde::Serde::::serialize(@model, ref __calldata__); - - let mut __dispatcher_return_data__ = starknet::syscalls::library_call_syscall( - self.class_hash, - selector!("ensure_abi"), - core::array::ArrayTrait::span(@__calldata__), - ); - let mut __dispatcher_return_data__ = starknet::SyscallResultTrait::unwrap_syscall(__dispatcher_return_data__); - () - } - -} - -pub trait IModelWithComplexArraySafeDispatcherTrait { - #[unstable(feature: "safe_dispatcher")] - fn ensure_abi(self: T, model: ModelWithComplexArray) -> starknet::SyscallResult<()>; -} - -#[derive(Copy, Drop, starknet::Store, Serde)] -pub struct IModelWithComplexArraySafeLibraryDispatcher { - pub class_hash: starknet::ClassHash, -} - -impl IModelWithComplexArraySafeLibraryDispatcherImpl of IModelWithComplexArraySafeDispatcherTrait { - fn ensure_abi(self: IModelWithComplexArraySafeLibraryDispatcher, model: ModelWithComplexArray) -> starknet::SyscallResult<()> { - let mut __calldata__ = core::traits::Default::default(); - core::serde::Serde::::serialize(@model, ref __calldata__); - - let mut __dispatcher_return_data__ = starknet::syscalls::library_call_syscall( - self.class_hash, - selector!("ensure_abi"), - core::array::ArrayTrait::span(@__calldata__), - ); - let mut __dispatcher_return_data__ = __dispatcher_return_data__?; - Result::Ok(()) - } - -} - - -#[derive(Copy, Drop, starknet::Store, Serde)] -pub struct IModelWithComplexArraySafeDispatcher { - pub contract_address: starknet::ContractAddress, -} - -impl IModelWithComplexArraySafeDispatcherImpl of IModelWithComplexArraySafeDispatcherTrait { - fn ensure_abi(self: IModelWithComplexArraySafeDispatcher, model: ModelWithComplexArray) -> starknet::SyscallResult<()> { - let mut __calldata__ = core::traits::Default::default(); - core::serde::Serde::::serialize(@model, ref __calldata__); - - let mut __dispatcher_return_data__ = starknet::syscalls::call_contract_syscall( - self.contract_address, - selector!("ensure_abi"), - core::array::ArrayTrait::span(@__calldata__), - ); - let mut __dispatcher_return_data__ = __dispatcher_return_data__?; - Result::Ok(()) - } - -} -pub trait ModelWithTupleMembersStore { - fn get_x(self: @dojo::world::IWorldDispatcher, key: ModelWithTupleKeyType) -> u16; - - fn get_x_from_id(self: @dojo::world::IWorldDispatcher, entity_id: felt252) -> u16; - - fn update_x(self: dojo::world::IWorldDispatcher, key: ModelWithTupleKeyType, value: u16); - - fn update_x_from_id(self: dojo::world::IWorldDispatcher, entity_id: felt252, value: u16); - - fn get_y(self: @dojo::world::IWorldDispatcher, key: ModelWithTupleKeyType) -> (u8, u16, u32); - - fn get_y_from_id(self: @dojo::world::IWorldDispatcher, entity_id: felt252) -> (u8, u16, u32); - - fn update_y(self: dojo::world::IWorldDispatcher, key: ModelWithTupleKeyType, value: (u8, u16, u32)); - - fn update_y_from_id(self: dojo::world::IWorldDispatcher, entity_id: felt252, value: (u8, u16, u32)); - - -} -pub trait IModelWithTupleDispatcherTrait { - fn ensure_abi(self: T, model: ModelWithTuple); -} - -#[derive(Copy, Drop, starknet::Store, Serde)] -pub struct IModelWithTupleDispatcher { - pub contract_address: starknet::ContractAddress, -} - -impl IModelWithTupleDispatcherImpl of IModelWithTupleDispatcherTrait { - fn ensure_abi(self: IModelWithTupleDispatcher, model: ModelWithTuple) { - let mut __calldata__ = core::traits::Default::default(); - core::serde::Serde::::serialize(@model, ref __calldata__); - - let mut __dispatcher_return_data__ = starknet::syscalls::call_contract_syscall( - self.contract_address, - selector!("ensure_abi"), - core::array::ArrayTrait::span(@__calldata__), - ); - let mut __dispatcher_return_data__ = starknet::SyscallResultTrait::unwrap_syscall(__dispatcher_return_data__); - () - } - -} - -#[derive(Copy, Drop, starknet::Store, Serde)] -pub struct IModelWithTupleLibraryDispatcher { - pub class_hash: starknet::ClassHash, -} - -impl IModelWithTupleLibraryDispatcherImpl of IModelWithTupleDispatcherTrait { - fn ensure_abi(self: IModelWithTupleLibraryDispatcher, model: ModelWithTuple) { - let mut __calldata__ = core::traits::Default::default(); - core::serde::Serde::::serialize(@model, ref __calldata__); - - let mut __dispatcher_return_data__ = starknet::syscalls::library_call_syscall( - self.class_hash, - selector!("ensure_abi"), - core::array::ArrayTrait::span(@__calldata__), - ); - let mut __dispatcher_return_data__ = starknet::SyscallResultTrait::unwrap_syscall(__dispatcher_return_data__); - () - } - -} - -pub trait IModelWithTupleSafeDispatcherTrait { - #[unstable(feature: "safe_dispatcher")] - fn ensure_abi(self: T, model: ModelWithTuple) -> starknet::SyscallResult<()>; -} - -#[derive(Copy, Drop, starknet::Store, Serde)] -pub struct IModelWithTupleSafeLibraryDispatcher { - pub class_hash: starknet::ClassHash, -} - -impl IModelWithTupleSafeLibraryDispatcherImpl of IModelWithTupleSafeDispatcherTrait { - fn ensure_abi(self: IModelWithTupleSafeLibraryDispatcher, model: ModelWithTuple) -> starknet::SyscallResult<()> { - let mut __calldata__ = core::traits::Default::default(); - core::serde::Serde::::serialize(@model, ref __calldata__); - - let mut __dispatcher_return_data__ = starknet::syscalls::library_call_syscall( - self.class_hash, - selector!("ensure_abi"), - core::array::ArrayTrait::span(@__calldata__), - ); - let mut __dispatcher_return_data__ = __dispatcher_return_data__?; - Result::Ok(()) - } - -} - - -#[derive(Copy, Drop, starknet::Store, Serde)] -pub struct IModelWithTupleSafeDispatcher { - pub contract_address: starknet::ContractAddress, -} - -impl IModelWithTupleSafeDispatcherImpl of IModelWithTupleSafeDispatcherTrait { - fn ensure_abi(self: IModelWithTupleSafeDispatcher, model: ModelWithTuple) -> starknet::SyscallResult<()> { - let mut __calldata__ = core::traits::Default::default(); - core::serde::Serde::::serialize(@model, ref __calldata__); - - let mut __dispatcher_return_data__ = starknet::syscalls::call_contract_syscall( - self.contract_address, - selector!("ensure_abi"), - core::array::ArrayTrait::span(@__calldata__), - ); - let mut __dispatcher_return_data__ = __dispatcher_return_data__?; - Result::Ok(()) - } - -} -pub trait ModelWithTupleNoPrimitivesMembersStore { - fn get_x(self: @dojo::world::IWorldDispatcher, key: ModelWithTupleNoPrimitivesKeyType) -> u16; - - fn get_x_from_id(self: @dojo::world::IWorldDispatcher, entity_id: felt252) -> u16; - - fn update_x(self: dojo::world::IWorldDispatcher, key: ModelWithTupleNoPrimitivesKeyType, value: u16); - - fn update_x_from_id(self: dojo::world::IWorldDispatcher, entity_id: felt252, value: u16); - - fn get_y(self: @dojo::world::IWorldDispatcher, key: ModelWithTupleNoPrimitivesKeyType) -> (u8, Vec3, u32); - - fn get_y_from_id(self: @dojo::world::IWorldDispatcher, entity_id: felt252) -> (u8, Vec3, u32); - - fn update_y(self: dojo::world::IWorldDispatcher, key: ModelWithTupleNoPrimitivesKeyType, value: (u8, Vec3, u32)); - - fn update_y_from_id(self: dojo::world::IWorldDispatcher, entity_id: felt252, value: (u8, Vec3, u32)); - - -} -pub trait IModelWithTupleNoPrimitivesDispatcherTrait { - fn ensure_abi(self: T, model: ModelWithTupleNoPrimitives); -} - -#[derive(Copy, Drop, starknet::Store, Serde)] -pub struct IModelWithTupleNoPrimitivesDispatcher { - pub contract_address: starknet::ContractAddress, -} - -impl IModelWithTupleNoPrimitivesDispatcherImpl of IModelWithTupleNoPrimitivesDispatcherTrait { - fn ensure_abi(self: IModelWithTupleNoPrimitivesDispatcher, model: ModelWithTupleNoPrimitives) { - let mut __calldata__ = core::traits::Default::default(); - core::serde::Serde::::serialize(@model, ref __calldata__); - - let mut __dispatcher_return_data__ = starknet::syscalls::call_contract_syscall( - self.contract_address, - selector!("ensure_abi"), - core::array::ArrayTrait::span(@__calldata__), - ); - let mut __dispatcher_return_data__ = starknet::SyscallResultTrait::unwrap_syscall(__dispatcher_return_data__); - () - } - -} - -#[derive(Copy, Drop, starknet::Store, Serde)] -pub struct IModelWithTupleNoPrimitivesLibraryDispatcher { - pub class_hash: starknet::ClassHash, -} - -impl IModelWithTupleNoPrimitivesLibraryDispatcherImpl of IModelWithTupleNoPrimitivesDispatcherTrait { - fn ensure_abi(self: IModelWithTupleNoPrimitivesLibraryDispatcher, model: ModelWithTupleNoPrimitives) { - let mut __calldata__ = core::traits::Default::default(); - core::serde::Serde::::serialize(@model, ref __calldata__); - - let mut __dispatcher_return_data__ = starknet::syscalls::library_call_syscall( - self.class_hash, - selector!("ensure_abi"), - core::array::ArrayTrait::span(@__calldata__), - ); - let mut __dispatcher_return_data__ = starknet::SyscallResultTrait::unwrap_syscall(__dispatcher_return_data__); - () - } - -} - -pub trait IModelWithTupleNoPrimitivesSafeDispatcherTrait { - #[unstable(feature: "safe_dispatcher")] - fn ensure_abi(self: T, model: ModelWithTupleNoPrimitives) -> starknet::SyscallResult<()>; -} - -#[derive(Copy, Drop, starknet::Store, Serde)] -pub struct IModelWithTupleNoPrimitivesSafeLibraryDispatcher { - pub class_hash: starknet::ClassHash, -} - -impl IModelWithTupleNoPrimitivesSafeLibraryDispatcherImpl of IModelWithTupleNoPrimitivesSafeDispatcherTrait { - fn ensure_abi(self: IModelWithTupleNoPrimitivesSafeLibraryDispatcher, model: ModelWithTupleNoPrimitives) -> starknet::SyscallResult<()> { - let mut __calldata__ = core::traits::Default::default(); - core::serde::Serde::::serialize(@model, ref __calldata__); - - let mut __dispatcher_return_data__ = starknet::syscalls::library_call_syscall( - self.class_hash, - selector!("ensure_abi"), - core::array::ArrayTrait::span(@__calldata__), - ); - let mut __dispatcher_return_data__ = __dispatcher_return_data__?; - Result::Ok(()) - } - -} - - -#[derive(Copy, Drop, starknet::Store, Serde)] -pub struct IModelWithTupleNoPrimitivesSafeDispatcher { - pub contract_address: starknet::ContractAddress, -} - -impl IModelWithTupleNoPrimitivesSafeDispatcherImpl of IModelWithTupleNoPrimitivesSafeDispatcherTrait { - fn ensure_abi(self: IModelWithTupleNoPrimitivesSafeDispatcher, model: ModelWithTupleNoPrimitives) -> starknet::SyscallResult<()> { - let mut __calldata__ = core::traits::Default::default(); - core::serde::Serde::::serialize(@model, ref __calldata__); - - let mut __dispatcher_return_data__ = starknet::syscalls::call_contract_syscall( - self.contract_address, - selector!("ensure_abi"), - core::array::ArrayTrait::span(@__calldata__), - ); - let mut __dispatcher_return_data__ = __dispatcher_return_data__?; - Result::Ok(()) - } - -} -impl IModelv0DispatcherCopy of core::traits::Copy::; -impl IModelv0DispatcherDrop of core::traits::Drop::; -impl IModelv0DispatcherSerde of core::serde::Serde:: { - fn serialize(self: @IModelv0Dispatcher, ref output: core::array::Array) { - core::serde::Serde::serialize(self.contract_address, ref output) - } - fn deserialize(ref serialized: core::array::Span) -> core::option::Option { - core::option::Option::Some(IModelv0Dispatcher { - contract_address: core::serde::Serde::deserialize(ref serialized)?, - }) - } -} -impl StoreIModelv0Dispatcher of starknet::Store:: { - fn read(address_domain: u32, base: starknet::storage_access::StorageBaseAddress) -> starknet::SyscallResult { - let contract_address = starknet::Store::::read(address_domain, base)?; - starknet::SyscallResult::Ok( - IModelv0Dispatcher { - contract_address, - } - ) - } - fn write(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, value: IModelv0Dispatcher) -> starknet::SyscallResult<()> { - starknet::Store::::write(address_domain, base, value.contract_address)?; - starknet::SyscallResult::Ok(()) - } - fn read_at_offset(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, offset: u8) -> starknet::SyscallResult { - let contract_address = starknet::Store::::read_at_offset(address_domain, base, offset)?; - starknet::SyscallResult::Ok( - IModelv0Dispatcher { - contract_address, - } - ) - } - #[inline(always)] - fn write_at_offset(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, offset: u8, value: IModelv0Dispatcher) -> starknet::SyscallResult<()> { - starknet::Store::::write_at_offset(address_domain, base, offset, value.contract_address)?; - starknet::SyscallResult::Ok(()) - } - #[inline(always)] - fn size() -> u8 { - starknet::Store::::size() - } -} - -#[derive(Drop, Copy)] -pub struct IModelv0DispatcherSubPointers { - pub contract_address: starknet::storage::StoragePointer, -} -impl IModelv0DispatcherSubPointersImpl of starknet::storage::SubPointers { - type SubPointersType = IModelv0DispatcherSubPointers; - fn sub_pointers(self: starknet::storage::StoragePointer) -> IModelv0DispatcherSubPointers { - let base_address = self.__storage_pointer_address__; - let mut current_offset = self.__storage_pointer_offset__; - let __contract_address_value__ = starknet::storage::StoragePointer { - __storage_pointer_address__: base_address, - __storage_pointer_offset__: current_offset, - }; - IModelv0DispatcherSubPointers { - contract_address: __contract_address_value__, - } - } -} -#[derive(Drop, Copy)] -pub struct IModelv0DispatcherSubPointersMut { - pub contract_address: starknet::storage::StoragePointer>, -} -impl IModelv0DispatcherSubPointersMutImpl of starknet::storage::SubPointersMut { - type SubPointersType = IModelv0DispatcherSubPointersMut; - fn sub_pointers_mut(self: starknet::storage::StoragePointer>) -> IModelv0DispatcherSubPointersMut { - let base_address = self.__storage_pointer_address__; - let mut current_offset = self.__storage_pointer_offset__; - let __contract_address_value__ = starknet::storage::StoragePointer { - __storage_pointer_address__: base_address, - __storage_pointer_offset__: current_offset, - }; - IModelv0DispatcherSubPointersMut { - contract_address: __contract_address_value__, - } - } -} -impl IModelv0LibraryDispatcherCopy of core::traits::Copy::; -impl IModelv0LibraryDispatcherDrop of core::traits::Drop::; -impl IModelv0LibraryDispatcherSerde of core::serde::Serde:: { - fn serialize(self: @IModelv0LibraryDispatcher, ref output: core::array::Array) { - core::serde::Serde::serialize(self.class_hash, ref output) - } - fn deserialize(ref serialized: core::array::Span) -> core::option::Option { - core::option::Option::Some(IModelv0LibraryDispatcher { - class_hash: core::serde::Serde::deserialize(ref serialized)?, - }) - } -} -impl StoreIModelv0LibraryDispatcher of starknet::Store:: { - fn read(address_domain: u32, base: starknet::storage_access::StorageBaseAddress) -> starknet::SyscallResult { - let class_hash = starknet::Store::::read(address_domain, base)?; - starknet::SyscallResult::Ok( - IModelv0LibraryDispatcher { - class_hash, - } - ) - } - fn write(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, value: IModelv0LibraryDispatcher) -> starknet::SyscallResult<()> { - starknet::Store::::write(address_domain, base, value.class_hash)?; - starknet::SyscallResult::Ok(()) - } - fn read_at_offset(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, offset: u8) -> starknet::SyscallResult { - let class_hash = starknet::Store::::read_at_offset(address_domain, base, offset)?; - starknet::SyscallResult::Ok( - IModelv0LibraryDispatcher { - class_hash, - } - ) - } - #[inline(always)] - fn write_at_offset(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, offset: u8, value: IModelv0LibraryDispatcher) -> starknet::SyscallResult<()> { - starknet::Store::::write_at_offset(address_domain, base, offset, value.class_hash)?; - starknet::SyscallResult::Ok(()) - } - #[inline(always)] - fn size() -> u8 { - starknet::Store::::size() - } -} - -#[derive(Drop, Copy)] -pub struct IModelv0LibraryDispatcherSubPointers { - pub class_hash: starknet::storage::StoragePointer, -} -impl IModelv0LibraryDispatcherSubPointersImpl of starknet::storage::SubPointers { - type SubPointersType = IModelv0LibraryDispatcherSubPointers; - fn sub_pointers(self: starknet::storage::StoragePointer) -> IModelv0LibraryDispatcherSubPointers { - let base_address = self.__storage_pointer_address__; - let mut current_offset = self.__storage_pointer_offset__; - let __class_hash_value__ = starknet::storage::StoragePointer { - __storage_pointer_address__: base_address, - __storage_pointer_offset__: current_offset, - }; - IModelv0LibraryDispatcherSubPointers { - class_hash: __class_hash_value__, - } - } -} -#[derive(Drop, Copy)] -pub struct IModelv0LibraryDispatcherSubPointersMut { - pub class_hash: starknet::storage::StoragePointer>, -} -impl IModelv0LibraryDispatcherSubPointersMutImpl of starknet::storage::SubPointersMut { - type SubPointersType = IModelv0LibraryDispatcherSubPointersMut; - fn sub_pointers_mut(self: starknet::storage::StoragePointer>) -> IModelv0LibraryDispatcherSubPointersMut { - let base_address = self.__storage_pointer_address__; - let mut current_offset = self.__storage_pointer_offset__; - let __class_hash_value__ = starknet::storage::StoragePointer { - __storage_pointer_address__: base_address, - __storage_pointer_offset__: current_offset, - }; - IModelv0LibraryDispatcherSubPointersMut { - class_hash: __class_hash_value__, - } - } -} -impl IModelv0SafeLibraryDispatcherCopy of core::traits::Copy::; -impl IModelv0SafeLibraryDispatcherDrop of core::traits::Drop::; -impl IModelv0SafeLibraryDispatcherSerde of core::serde::Serde:: { - fn serialize(self: @IModelv0SafeLibraryDispatcher, ref output: core::array::Array) { - core::serde::Serde::serialize(self.class_hash, ref output) - } - fn deserialize(ref serialized: core::array::Span) -> core::option::Option { - core::option::Option::Some(IModelv0SafeLibraryDispatcher { - class_hash: core::serde::Serde::deserialize(ref serialized)?, - }) - } -} -impl StoreIModelv0SafeLibraryDispatcher of starknet::Store:: { - fn read(address_domain: u32, base: starknet::storage_access::StorageBaseAddress) -> starknet::SyscallResult { - let class_hash = starknet::Store::::read(address_domain, base)?; - starknet::SyscallResult::Ok( - IModelv0SafeLibraryDispatcher { - class_hash, - } - ) - } - fn write(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, value: IModelv0SafeLibraryDispatcher) -> starknet::SyscallResult<()> { - starknet::Store::::write(address_domain, base, value.class_hash)?; - starknet::SyscallResult::Ok(()) - } - fn read_at_offset(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, offset: u8) -> starknet::SyscallResult { - let class_hash = starknet::Store::::read_at_offset(address_domain, base, offset)?; - starknet::SyscallResult::Ok( - IModelv0SafeLibraryDispatcher { - class_hash, - } - ) - } - #[inline(always)] - fn write_at_offset(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, offset: u8, value: IModelv0SafeLibraryDispatcher) -> starknet::SyscallResult<()> { - starknet::Store::::write_at_offset(address_domain, base, offset, value.class_hash)?; - starknet::SyscallResult::Ok(()) - } - #[inline(always)] - fn size() -> u8 { - starknet::Store::::size() - } -} - -#[derive(Drop, Copy)] -pub struct IModelv0SafeLibraryDispatcherSubPointers { - pub class_hash: starknet::storage::StoragePointer, -} -impl IModelv0SafeLibraryDispatcherSubPointersImpl of starknet::storage::SubPointers { - type SubPointersType = IModelv0SafeLibraryDispatcherSubPointers; - fn sub_pointers(self: starknet::storage::StoragePointer) -> IModelv0SafeLibraryDispatcherSubPointers { - let base_address = self.__storage_pointer_address__; - let mut current_offset = self.__storage_pointer_offset__; - let __class_hash_value__ = starknet::storage::StoragePointer { - __storage_pointer_address__: base_address, - __storage_pointer_offset__: current_offset, - }; - IModelv0SafeLibraryDispatcherSubPointers { - class_hash: __class_hash_value__, - } - } -} -#[derive(Drop, Copy)] -pub struct IModelv0SafeLibraryDispatcherSubPointersMut { - pub class_hash: starknet::storage::StoragePointer>, -} -impl IModelv0SafeLibraryDispatcherSubPointersMutImpl of starknet::storage::SubPointersMut { - type SubPointersType = IModelv0SafeLibraryDispatcherSubPointersMut; - fn sub_pointers_mut(self: starknet::storage::StoragePointer>) -> IModelv0SafeLibraryDispatcherSubPointersMut { - let base_address = self.__storage_pointer_address__; - let mut current_offset = self.__storage_pointer_offset__; - let __class_hash_value__ = starknet::storage::StoragePointer { - __storage_pointer_address__: base_address, - __storage_pointer_offset__: current_offset, - }; - IModelv0SafeLibraryDispatcherSubPointersMut { - class_hash: __class_hash_value__, - } - } -} -impl IModelv0SafeDispatcherCopy of core::traits::Copy::; -impl IModelv0SafeDispatcherDrop of core::traits::Drop::; -impl IModelv0SafeDispatcherSerde of core::serde::Serde:: { - fn serialize(self: @IModelv0SafeDispatcher, ref output: core::array::Array) { - core::serde::Serde::serialize(self.contract_address, ref output) - } - fn deserialize(ref serialized: core::array::Span) -> core::option::Option { - core::option::Option::Some(IModelv0SafeDispatcher { - contract_address: core::serde::Serde::deserialize(ref serialized)?, - }) - } -} -impl StoreIModelv0SafeDispatcher of starknet::Store:: { - fn read(address_domain: u32, base: starknet::storage_access::StorageBaseAddress) -> starknet::SyscallResult { - let contract_address = starknet::Store::::read(address_domain, base)?; - starknet::SyscallResult::Ok( - IModelv0SafeDispatcher { - contract_address, - } - ) - } - fn write(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, value: IModelv0SafeDispatcher) -> starknet::SyscallResult<()> { - starknet::Store::::write(address_domain, base, value.contract_address)?; - starknet::SyscallResult::Ok(()) - } - fn read_at_offset(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, offset: u8) -> starknet::SyscallResult { - let contract_address = starknet::Store::::read_at_offset(address_domain, base, offset)?; - starknet::SyscallResult::Ok( - IModelv0SafeDispatcher { - contract_address, - } - ) - } - #[inline(always)] - fn write_at_offset(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, offset: u8, value: IModelv0SafeDispatcher) -> starknet::SyscallResult<()> { - starknet::Store::::write_at_offset(address_domain, base, offset, value.contract_address)?; - starknet::SyscallResult::Ok(()) - } - #[inline(always)] - fn size() -> u8 { - starknet::Store::::size() - } -} - -#[derive(Drop, Copy)] -pub struct IModelv0SafeDispatcherSubPointers { - pub contract_address: starknet::storage::StoragePointer, -} -impl IModelv0SafeDispatcherSubPointersImpl of starknet::storage::SubPointers { - type SubPointersType = IModelv0SafeDispatcherSubPointers; - fn sub_pointers(self: starknet::storage::StoragePointer) -> IModelv0SafeDispatcherSubPointers { - let base_address = self.__storage_pointer_address__; - let mut current_offset = self.__storage_pointer_offset__; - let __contract_address_value__ = starknet::storage::StoragePointer { - __storage_pointer_address__: base_address, - __storage_pointer_offset__: current_offset, - }; - IModelv0SafeDispatcherSubPointers { - contract_address: __contract_address_value__, - } - } -} -#[derive(Drop, Copy)] -pub struct IModelv0SafeDispatcherSubPointersMut { - pub contract_address: starknet::storage::StoragePointer>, -} -impl IModelv0SafeDispatcherSubPointersMutImpl of starknet::storage::SubPointersMut { - type SubPointersType = IModelv0SafeDispatcherSubPointersMut; - fn sub_pointers_mut(self: starknet::storage::StoragePointer>) -> IModelv0SafeDispatcherSubPointersMut { - let base_address = self.__storage_pointer_address__; - let mut current_offset = self.__storage_pointer_offset__; - let __contract_address_value__ = starknet::storage::StoragePointer { - __storage_pointer_address__: base_address, - __storage_pointer_offset__: current_offset, - }; - IModelv0SafeDispatcherSubPointersMut { - contract_address: __contract_address_value__, - } - } -} -impl IModelWithBadNamespaceFormatDispatcherCopy of core::traits::Copy::; -impl IModelWithBadNamespaceFormatDispatcherDrop of core::traits::Drop::; -impl IModelWithBadNamespaceFormatDispatcherSerde of core::serde::Serde:: { - fn serialize(self: @IModelWithBadNamespaceFormatDispatcher, ref output: core::array::Array) { - core::serde::Serde::serialize(self.contract_address, ref output) - } - fn deserialize(ref serialized: core::array::Span) -> core::option::Option { - core::option::Option::Some(IModelWithBadNamespaceFormatDispatcher { - contract_address: core::serde::Serde::deserialize(ref serialized)?, - }) - } -} -impl StoreIModelWithBadNamespaceFormatDispatcher of starknet::Store:: { - fn read(address_domain: u32, base: starknet::storage_access::StorageBaseAddress) -> starknet::SyscallResult { - let contract_address = starknet::Store::::read(address_domain, base)?; - starknet::SyscallResult::Ok( - IModelWithBadNamespaceFormatDispatcher { - contract_address, - } - ) - } - fn write(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, value: IModelWithBadNamespaceFormatDispatcher) -> starknet::SyscallResult<()> { - starknet::Store::::write(address_domain, base, value.contract_address)?; - starknet::SyscallResult::Ok(()) - } - fn read_at_offset(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, offset: u8) -> starknet::SyscallResult { - let contract_address = starknet::Store::::read_at_offset(address_domain, base, offset)?; - starknet::SyscallResult::Ok( - IModelWithBadNamespaceFormatDispatcher { - contract_address, - } - ) - } - #[inline(always)] - fn write_at_offset(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, offset: u8, value: IModelWithBadNamespaceFormatDispatcher) -> starknet::SyscallResult<()> { - starknet::Store::::write_at_offset(address_domain, base, offset, value.contract_address)?; - starknet::SyscallResult::Ok(()) - } - #[inline(always)] - fn size() -> u8 { - starknet::Store::::size() - } -} - -#[derive(Drop, Copy)] -pub struct IModelWithBadNamespaceFormatDispatcherSubPointers { - pub contract_address: starknet::storage::StoragePointer, -} -impl IModelWithBadNamespaceFormatDispatcherSubPointersImpl of starknet::storage::SubPointers { - type SubPointersType = IModelWithBadNamespaceFormatDispatcherSubPointers; - fn sub_pointers(self: starknet::storage::StoragePointer) -> IModelWithBadNamespaceFormatDispatcherSubPointers { - let base_address = self.__storage_pointer_address__; - let mut current_offset = self.__storage_pointer_offset__; - let __contract_address_value__ = starknet::storage::StoragePointer { - __storage_pointer_address__: base_address, - __storage_pointer_offset__: current_offset, - }; - IModelWithBadNamespaceFormatDispatcherSubPointers { - contract_address: __contract_address_value__, - } - } -} -#[derive(Drop, Copy)] -pub struct IModelWithBadNamespaceFormatDispatcherSubPointersMut { - pub contract_address: starknet::storage::StoragePointer>, -} -impl IModelWithBadNamespaceFormatDispatcherSubPointersMutImpl of starknet::storage::SubPointersMut { - type SubPointersType = IModelWithBadNamespaceFormatDispatcherSubPointersMut; - fn sub_pointers_mut(self: starknet::storage::StoragePointer>) -> IModelWithBadNamespaceFormatDispatcherSubPointersMut { - let base_address = self.__storage_pointer_address__; - let mut current_offset = self.__storage_pointer_offset__; - let __contract_address_value__ = starknet::storage::StoragePointer { - __storage_pointer_address__: base_address, - __storage_pointer_offset__: current_offset, - }; - IModelWithBadNamespaceFormatDispatcherSubPointersMut { - contract_address: __contract_address_value__, - } - } -} -impl IModelWithBadNamespaceFormatLibraryDispatcherCopy of core::traits::Copy::; -impl IModelWithBadNamespaceFormatLibraryDispatcherDrop of core::traits::Drop::; -impl IModelWithBadNamespaceFormatLibraryDispatcherSerde of core::serde::Serde:: { - fn serialize(self: @IModelWithBadNamespaceFormatLibraryDispatcher, ref output: core::array::Array) { - core::serde::Serde::serialize(self.class_hash, ref output) - } - fn deserialize(ref serialized: core::array::Span) -> core::option::Option { - core::option::Option::Some(IModelWithBadNamespaceFormatLibraryDispatcher { - class_hash: core::serde::Serde::deserialize(ref serialized)?, - }) - } -} -impl StoreIModelWithBadNamespaceFormatLibraryDispatcher of starknet::Store:: { - fn read(address_domain: u32, base: starknet::storage_access::StorageBaseAddress) -> starknet::SyscallResult { - let class_hash = starknet::Store::::read(address_domain, base)?; - starknet::SyscallResult::Ok( - IModelWithBadNamespaceFormatLibraryDispatcher { - class_hash, - } - ) - } - fn write(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, value: IModelWithBadNamespaceFormatLibraryDispatcher) -> starknet::SyscallResult<()> { - starknet::Store::::write(address_domain, base, value.class_hash)?; - starknet::SyscallResult::Ok(()) - } - fn read_at_offset(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, offset: u8) -> starknet::SyscallResult { - let class_hash = starknet::Store::::read_at_offset(address_domain, base, offset)?; - starknet::SyscallResult::Ok( - IModelWithBadNamespaceFormatLibraryDispatcher { - class_hash, - } - ) - } - #[inline(always)] - fn write_at_offset(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, offset: u8, value: IModelWithBadNamespaceFormatLibraryDispatcher) -> starknet::SyscallResult<()> { - starknet::Store::::write_at_offset(address_domain, base, offset, value.class_hash)?; - starknet::SyscallResult::Ok(()) - } - #[inline(always)] - fn size() -> u8 { - starknet::Store::::size() - } -} - -#[derive(Drop, Copy)] -pub struct IModelWithBadNamespaceFormatLibraryDispatcherSubPointers { - pub class_hash: starknet::storage::StoragePointer, -} -impl IModelWithBadNamespaceFormatLibraryDispatcherSubPointersImpl of starknet::storage::SubPointers { - type SubPointersType = IModelWithBadNamespaceFormatLibraryDispatcherSubPointers; - fn sub_pointers(self: starknet::storage::StoragePointer) -> IModelWithBadNamespaceFormatLibraryDispatcherSubPointers { - let base_address = self.__storage_pointer_address__; - let mut current_offset = self.__storage_pointer_offset__; - let __class_hash_value__ = starknet::storage::StoragePointer { - __storage_pointer_address__: base_address, - __storage_pointer_offset__: current_offset, - }; - IModelWithBadNamespaceFormatLibraryDispatcherSubPointers { - class_hash: __class_hash_value__, - } - } -} -#[derive(Drop, Copy)] -pub struct IModelWithBadNamespaceFormatLibraryDispatcherSubPointersMut { - pub class_hash: starknet::storage::StoragePointer>, -} -impl IModelWithBadNamespaceFormatLibraryDispatcherSubPointersMutImpl of starknet::storage::SubPointersMut { - type SubPointersType = IModelWithBadNamespaceFormatLibraryDispatcherSubPointersMut; - fn sub_pointers_mut(self: starknet::storage::StoragePointer>) -> IModelWithBadNamespaceFormatLibraryDispatcherSubPointersMut { - let base_address = self.__storage_pointer_address__; - let mut current_offset = self.__storage_pointer_offset__; - let __class_hash_value__ = starknet::storage::StoragePointer { - __storage_pointer_address__: base_address, - __storage_pointer_offset__: current_offset, - }; - IModelWithBadNamespaceFormatLibraryDispatcherSubPointersMut { - class_hash: __class_hash_value__, - } - } -} -impl IModelWithBadNamespaceFormatSafeLibraryDispatcherCopy of core::traits::Copy::; -impl IModelWithBadNamespaceFormatSafeLibraryDispatcherDrop of core::traits::Drop::; -impl IModelWithBadNamespaceFormatSafeLibraryDispatcherSerde of core::serde::Serde:: { - fn serialize(self: @IModelWithBadNamespaceFormatSafeLibraryDispatcher, ref output: core::array::Array) { - core::serde::Serde::serialize(self.class_hash, ref output) - } - fn deserialize(ref serialized: core::array::Span) -> core::option::Option { - core::option::Option::Some(IModelWithBadNamespaceFormatSafeLibraryDispatcher { - class_hash: core::serde::Serde::deserialize(ref serialized)?, - }) - } -} -impl StoreIModelWithBadNamespaceFormatSafeLibraryDispatcher of starknet::Store:: { - fn read(address_domain: u32, base: starknet::storage_access::StorageBaseAddress) -> starknet::SyscallResult { - let class_hash = starknet::Store::::read(address_domain, base)?; - starknet::SyscallResult::Ok( - IModelWithBadNamespaceFormatSafeLibraryDispatcher { - class_hash, - } - ) - } - fn write(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, value: IModelWithBadNamespaceFormatSafeLibraryDispatcher) -> starknet::SyscallResult<()> { - starknet::Store::::write(address_domain, base, value.class_hash)?; - starknet::SyscallResult::Ok(()) - } - fn read_at_offset(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, offset: u8) -> starknet::SyscallResult { - let class_hash = starknet::Store::::read_at_offset(address_domain, base, offset)?; - starknet::SyscallResult::Ok( - IModelWithBadNamespaceFormatSafeLibraryDispatcher { - class_hash, - } - ) - } - #[inline(always)] - fn write_at_offset(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, offset: u8, value: IModelWithBadNamespaceFormatSafeLibraryDispatcher) -> starknet::SyscallResult<()> { - starknet::Store::::write_at_offset(address_domain, base, offset, value.class_hash)?; - starknet::SyscallResult::Ok(()) - } - #[inline(always)] - fn size() -> u8 { - starknet::Store::::size() - } -} - -#[derive(Drop, Copy)] -pub struct IModelWithBadNamespaceFormatSafeLibraryDispatcherSubPointers { - pub class_hash: starknet::storage::StoragePointer, -} -impl IModelWithBadNamespaceFormatSafeLibraryDispatcherSubPointersImpl of starknet::storage::SubPointers { - type SubPointersType = IModelWithBadNamespaceFormatSafeLibraryDispatcherSubPointers; - fn sub_pointers(self: starknet::storage::StoragePointer) -> IModelWithBadNamespaceFormatSafeLibraryDispatcherSubPointers { - let base_address = self.__storage_pointer_address__; - let mut current_offset = self.__storage_pointer_offset__; - let __class_hash_value__ = starknet::storage::StoragePointer { - __storage_pointer_address__: base_address, - __storage_pointer_offset__: current_offset, - }; - IModelWithBadNamespaceFormatSafeLibraryDispatcherSubPointers { - class_hash: __class_hash_value__, - } - } -} -#[derive(Drop, Copy)] -pub struct IModelWithBadNamespaceFormatSafeLibraryDispatcherSubPointersMut { - pub class_hash: starknet::storage::StoragePointer>, -} -impl IModelWithBadNamespaceFormatSafeLibraryDispatcherSubPointersMutImpl of starknet::storage::SubPointersMut { - type SubPointersType = IModelWithBadNamespaceFormatSafeLibraryDispatcherSubPointersMut; - fn sub_pointers_mut(self: starknet::storage::StoragePointer>) -> IModelWithBadNamespaceFormatSafeLibraryDispatcherSubPointersMut { - let base_address = self.__storage_pointer_address__; - let mut current_offset = self.__storage_pointer_offset__; - let __class_hash_value__ = starknet::storage::StoragePointer { - __storage_pointer_address__: base_address, - __storage_pointer_offset__: current_offset, - }; - IModelWithBadNamespaceFormatSafeLibraryDispatcherSubPointersMut { - class_hash: __class_hash_value__, - } - } -} -impl IModelWithBadNamespaceFormatSafeDispatcherCopy of core::traits::Copy::; -impl IModelWithBadNamespaceFormatSafeDispatcherDrop of core::traits::Drop::; -impl IModelWithBadNamespaceFormatSafeDispatcherSerde of core::serde::Serde:: { - fn serialize(self: @IModelWithBadNamespaceFormatSafeDispatcher, ref output: core::array::Array) { - core::serde::Serde::serialize(self.contract_address, ref output) - } - fn deserialize(ref serialized: core::array::Span) -> core::option::Option { - core::option::Option::Some(IModelWithBadNamespaceFormatSafeDispatcher { - contract_address: core::serde::Serde::deserialize(ref serialized)?, - }) - } -} -impl StoreIModelWithBadNamespaceFormatSafeDispatcher of starknet::Store:: { - fn read(address_domain: u32, base: starknet::storage_access::StorageBaseAddress) -> starknet::SyscallResult { - let contract_address = starknet::Store::::read(address_domain, base)?; - starknet::SyscallResult::Ok( - IModelWithBadNamespaceFormatSafeDispatcher { - contract_address, - } - ) - } - fn write(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, value: IModelWithBadNamespaceFormatSafeDispatcher) -> starknet::SyscallResult<()> { - starknet::Store::::write(address_domain, base, value.contract_address)?; - starknet::SyscallResult::Ok(()) - } - fn read_at_offset(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, offset: u8) -> starknet::SyscallResult { - let contract_address = starknet::Store::::read_at_offset(address_domain, base, offset)?; - starknet::SyscallResult::Ok( - IModelWithBadNamespaceFormatSafeDispatcher { - contract_address, - } - ) - } - #[inline(always)] - fn write_at_offset(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, offset: u8, value: IModelWithBadNamespaceFormatSafeDispatcher) -> starknet::SyscallResult<()> { - starknet::Store::::write_at_offset(address_domain, base, offset, value.contract_address)?; - starknet::SyscallResult::Ok(()) - } - #[inline(always)] - fn size() -> u8 { - starknet::Store::::size() - } -} - -#[derive(Drop, Copy)] -pub struct IModelWithBadNamespaceFormatSafeDispatcherSubPointers { - pub contract_address: starknet::storage::StoragePointer, -} -impl IModelWithBadNamespaceFormatSafeDispatcherSubPointersImpl of starknet::storage::SubPointers { - type SubPointersType = IModelWithBadNamespaceFormatSafeDispatcherSubPointers; - fn sub_pointers(self: starknet::storage::StoragePointer) -> IModelWithBadNamespaceFormatSafeDispatcherSubPointers { - let base_address = self.__storage_pointer_address__; - let mut current_offset = self.__storage_pointer_offset__; - let __contract_address_value__ = starknet::storage::StoragePointer { - __storage_pointer_address__: base_address, - __storage_pointer_offset__: current_offset, - }; - IModelWithBadNamespaceFormatSafeDispatcherSubPointers { - contract_address: __contract_address_value__, - } - } -} -#[derive(Drop, Copy)] -pub struct IModelWithBadNamespaceFormatSafeDispatcherSubPointersMut { - pub contract_address: starknet::storage::StoragePointer>, -} -impl IModelWithBadNamespaceFormatSafeDispatcherSubPointersMutImpl of starknet::storage::SubPointersMut { - type SubPointersType = IModelWithBadNamespaceFormatSafeDispatcherSubPointersMut; - fn sub_pointers_mut(self: starknet::storage::StoragePointer>) -> IModelWithBadNamespaceFormatSafeDispatcherSubPointersMut { - let base_address = self.__storage_pointer_address__; - let mut current_offset = self.__storage_pointer_offset__; - let __contract_address_value__ = starknet::storage::StoragePointer { - __storage_pointer_address__: base_address, - __storage_pointer_offset__: current_offset, - }; - IModelWithBadNamespaceFormatSafeDispatcherSubPointersMut { - contract_address: __contract_address_value__, - } - } -} -impl IModelWithShortStringNamespaceDispatcherCopy of core::traits::Copy::; -impl IModelWithShortStringNamespaceDispatcherDrop of core::traits::Drop::; -impl IModelWithShortStringNamespaceDispatcherSerde of core::serde::Serde:: { - fn serialize(self: @IModelWithShortStringNamespaceDispatcher, ref output: core::array::Array) { - core::serde::Serde::serialize(self.contract_address, ref output) - } - fn deserialize(ref serialized: core::array::Span) -> core::option::Option { - core::option::Option::Some(IModelWithShortStringNamespaceDispatcher { - contract_address: core::serde::Serde::deserialize(ref serialized)?, - }) - } -} -impl StoreIModelWithShortStringNamespaceDispatcher of starknet::Store:: { - fn read(address_domain: u32, base: starknet::storage_access::StorageBaseAddress) -> starknet::SyscallResult { - let contract_address = starknet::Store::::read(address_domain, base)?; - starknet::SyscallResult::Ok( - IModelWithShortStringNamespaceDispatcher { - contract_address, - } - ) - } - fn write(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, value: IModelWithShortStringNamespaceDispatcher) -> starknet::SyscallResult<()> { - starknet::Store::::write(address_domain, base, value.contract_address)?; - starknet::SyscallResult::Ok(()) - } - fn read_at_offset(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, offset: u8) -> starknet::SyscallResult { - let contract_address = starknet::Store::::read_at_offset(address_domain, base, offset)?; - starknet::SyscallResult::Ok( - IModelWithShortStringNamespaceDispatcher { - contract_address, - } - ) - } - #[inline(always)] - fn write_at_offset(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, offset: u8, value: IModelWithShortStringNamespaceDispatcher) -> starknet::SyscallResult<()> { - starknet::Store::::write_at_offset(address_domain, base, offset, value.contract_address)?; - starknet::SyscallResult::Ok(()) - } - #[inline(always)] - fn size() -> u8 { - starknet::Store::::size() - } -} - -#[derive(Drop, Copy)] -pub struct IModelWithShortStringNamespaceDispatcherSubPointers { - pub contract_address: starknet::storage::StoragePointer, -} -impl IModelWithShortStringNamespaceDispatcherSubPointersImpl of starknet::storage::SubPointers { - type SubPointersType = IModelWithShortStringNamespaceDispatcherSubPointers; - fn sub_pointers(self: starknet::storage::StoragePointer) -> IModelWithShortStringNamespaceDispatcherSubPointers { - let base_address = self.__storage_pointer_address__; - let mut current_offset = self.__storage_pointer_offset__; - let __contract_address_value__ = starknet::storage::StoragePointer { - __storage_pointer_address__: base_address, - __storage_pointer_offset__: current_offset, - }; - IModelWithShortStringNamespaceDispatcherSubPointers { - contract_address: __contract_address_value__, - } - } -} -#[derive(Drop, Copy)] -pub struct IModelWithShortStringNamespaceDispatcherSubPointersMut { - pub contract_address: starknet::storage::StoragePointer>, -} -impl IModelWithShortStringNamespaceDispatcherSubPointersMutImpl of starknet::storage::SubPointersMut { - type SubPointersType = IModelWithShortStringNamespaceDispatcherSubPointersMut; - fn sub_pointers_mut(self: starknet::storage::StoragePointer>) -> IModelWithShortStringNamespaceDispatcherSubPointersMut { - let base_address = self.__storage_pointer_address__; - let mut current_offset = self.__storage_pointer_offset__; - let __contract_address_value__ = starknet::storage::StoragePointer { - __storage_pointer_address__: base_address, - __storage_pointer_offset__: current_offset, - }; - IModelWithShortStringNamespaceDispatcherSubPointersMut { - contract_address: __contract_address_value__, - } - } -} -impl IModelWithShortStringNamespaceLibraryDispatcherCopy of core::traits::Copy::; -impl IModelWithShortStringNamespaceLibraryDispatcherDrop of core::traits::Drop::; -impl IModelWithShortStringNamespaceLibraryDispatcherSerde of core::serde::Serde:: { - fn serialize(self: @IModelWithShortStringNamespaceLibraryDispatcher, ref output: core::array::Array) { - core::serde::Serde::serialize(self.class_hash, ref output) - } - fn deserialize(ref serialized: core::array::Span) -> core::option::Option { - core::option::Option::Some(IModelWithShortStringNamespaceLibraryDispatcher { - class_hash: core::serde::Serde::deserialize(ref serialized)?, - }) - } -} -impl StoreIModelWithShortStringNamespaceLibraryDispatcher of starknet::Store:: { - fn read(address_domain: u32, base: starknet::storage_access::StorageBaseAddress) -> starknet::SyscallResult { - let class_hash = starknet::Store::::read(address_domain, base)?; - starknet::SyscallResult::Ok( - IModelWithShortStringNamespaceLibraryDispatcher { - class_hash, - } - ) - } - fn write(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, value: IModelWithShortStringNamespaceLibraryDispatcher) -> starknet::SyscallResult<()> { - starknet::Store::::write(address_domain, base, value.class_hash)?; - starknet::SyscallResult::Ok(()) - } - fn read_at_offset(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, offset: u8) -> starknet::SyscallResult { - let class_hash = starknet::Store::::read_at_offset(address_domain, base, offset)?; - starknet::SyscallResult::Ok( - IModelWithShortStringNamespaceLibraryDispatcher { - class_hash, - } - ) - } - #[inline(always)] - fn write_at_offset(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, offset: u8, value: IModelWithShortStringNamespaceLibraryDispatcher) -> starknet::SyscallResult<()> { - starknet::Store::::write_at_offset(address_domain, base, offset, value.class_hash)?; - starknet::SyscallResult::Ok(()) - } - #[inline(always)] - fn size() -> u8 { - starknet::Store::::size() - } -} - -#[derive(Drop, Copy)] -pub struct IModelWithShortStringNamespaceLibraryDispatcherSubPointers { - pub class_hash: starknet::storage::StoragePointer, -} -impl IModelWithShortStringNamespaceLibraryDispatcherSubPointersImpl of starknet::storage::SubPointers { - type SubPointersType = IModelWithShortStringNamespaceLibraryDispatcherSubPointers; - fn sub_pointers(self: starknet::storage::StoragePointer) -> IModelWithShortStringNamespaceLibraryDispatcherSubPointers { - let base_address = self.__storage_pointer_address__; - let mut current_offset = self.__storage_pointer_offset__; - let __class_hash_value__ = starknet::storage::StoragePointer { - __storage_pointer_address__: base_address, - __storage_pointer_offset__: current_offset, - }; - IModelWithShortStringNamespaceLibraryDispatcherSubPointers { - class_hash: __class_hash_value__, - } - } -} -#[derive(Drop, Copy)] -pub struct IModelWithShortStringNamespaceLibraryDispatcherSubPointersMut { - pub class_hash: starknet::storage::StoragePointer>, -} -impl IModelWithShortStringNamespaceLibraryDispatcherSubPointersMutImpl of starknet::storage::SubPointersMut { - type SubPointersType = IModelWithShortStringNamespaceLibraryDispatcherSubPointersMut; - fn sub_pointers_mut(self: starknet::storage::StoragePointer>) -> IModelWithShortStringNamespaceLibraryDispatcherSubPointersMut { - let base_address = self.__storage_pointer_address__; - let mut current_offset = self.__storage_pointer_offset__; - let __class_hash_value__ = starknet::storage::StoragePointer { - __storage_pointer_address__: base_address, - __storage_pointer_offset__: current_offset, - }; - IModelWithShortStringNamespaceLibraryDispatcherSubPointersMut { - class_hash: __class_hash_value__, - } - } -} -impl IModelWithShortStringNamespaceSafeLibraryDispatcherCopy of core::traits::Copy::; -impl IModelWithShortStringNamespaceSafeLibraryDispatcherDrop of core::traits::Drop::; -impl IModelWithShortStringNamespaceSafeLibraryDispatcherSerde of core::serde::Serde:: { - fn serialize(self: @IModelWithShortStringNamespaceSafeLibraryDispatcher, ref output: core::array::Array) { - core::serde::Serde::serialize(self.class_hash, ref output) - } - fn deserialize(ref serialized: core::array::Span) -> core::option::Option { - core::option::Option::Some(IModelWithShortStringNamespaceSafeLibraryDispatcher { - class_hash: core::serde::Serde::deserialize(ref serialized)?, - }) - } -} -impl StoreIModelWithShortStringNamespaceSafeLibraryDispatcher of starknet::Store:: { - fn read(address_domain: u32, base: starknet::storage_access::StorageBaseAddress) -> starknet::SyscallResult { - let class_hash = starknet::Store::::read(address_domain, base)?; - starknet::SyscallResult::Ok( - IModelWithShortStringNamespaceSafeLibraryDispatcher { - class_hash, - } - ) - } - fn write(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, value: IModelWithShortStringNamespaceSafeLibraryDispatcher) -> starknet::SyscallResult<()> { - starknet::Store::::write(address_domain, base, value.class_hash)?; - starknet::SyscallResult::Ok(()) - } - fn read_at_offset(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, offset: u8) -> starknet::SyscallResult { - let class_hash = starknet::Store::::read_at_offset(address_domain, base, offset)?; - starknet::SyscallResult::Ok( - IModelWithShortStringNamespaceSafeLibraryDispatcher { - class_hash, - } - ) - } - #[inline(always)] - fn write_at_offset(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, offset: u8, value: IModelWithShortStringNamespaceSafeLibraryDispatcher) -> starknet::SyscallResult<()> { - starknet::Store::::write_at_offset(address_domain, base, offset, value.class_hash)?; - starknet::SyscallResult::Ok(()) - } - #[inline(always)] - fn size() -> u8 { - starknet::Store::::size() - } -} - -#[derive(Drop, Copy)] -pub struct IModelWithShortStringNamespaceSafeLibraryDispatcherSubPointers { - pub class_hash: starknet::storage::StoragePointer, -} -impl IModelWithShortStringNamespaceSafeLibraryDispatcherSubPointersImpl of starknet::storage::SubPointers { - type SubPointersType = IModelWithShortStringNamespaceSafeLibraryDispatcherSubPointers; - fn sub_pointers(self: starknet::storage::StoragePointer) -> IModelWithShortStringNamespaceSafeLibraryDispatcherSubPointers { - let base_address = self.__storage_pointer_address__; - let mut current_offset = self.__storage_pointer_offset__; - let __class_hash_value__ = starknet::storage::StoragePointer { - __storage_pointer_address__: base_address, - __storage_pointer_offset__: current_offset, - }; - IModelWithShortStringNamespaceSafeLibraryDispatcherSubPointers { - class_hash: __class_hash_value__, - } - } -} -#[derive(Drop, Copy)] -pub struct IModelWithShortStringNamespaceSafeLibraryDispatcherSubPointersMut { - pub class_hash: starknet::storage::StoragePointer>, -} -impl IModelWithShortStringNamespaceSafeLibraryDispatcherSubPointersMutImpl of starknet::storage::SubPointersMut { - type SubPointersType = IModelWithShortStringNamespaceSafeLibraryDispatcherSubPointersMut; - fn sub_pointers_mut(self: starknet::storage::StoragePointer>) -> IModelWithShortStringNamespaceSafeLibraryDispatcherSubPointersMut { - let base_address = self.__storage_pointer_address__; - let mut current_offset = self.__storage_pointer_offset__; - let __class_hash_value__ = starknet::storage::StoragePointer { - __storage_pointer_address__: base_address, - __storage_pointer_offset__: current_offset, - }; - IModelWithShortStringNamespaceSafeLibraryDispatcherSubPointersMut { - class_hash: __class_hash_value__, - } - } -} -impl IModelWithShortStringNamespaceSafeDispatcherCopy of core::traits::Copy::; -impl IModelWithShortStringNamespaceSafeDispatcherDrop of core::traits::Drop::; -impl IModelWithShortStringNamespaceSafeDispatcherSerde of core::serde::Serde:: { - fn serialize(self: @IModelWithShortStringNamespaceSafeDispatcher, ref output: core::array::Array) { - core::serde::Serde::serialize(self.contract_address, ref output) - } - fn deserialize(ref serialized: core::array::Span) -> core::option::Option { - core::option::Option::Some(IModelWithShortStringNamespaceSafeDispatcher { - contract_address: core::serde::Serde::deserialize(ref serialized)?, - }) - } -} -impl StoreIModelWithShortStringNamespaceSafeDispatcher of starknet::Store:: { - fn read(address_domain: u32, base: starknet::storage_access::StorageBaseAddress) -> starknet::SyscallResult { - let contract_address = starknet::Store::::read(address_domain, base)?; - starknet::SyscallResult::Ok( - IModelWithShortStringNamespaceSafeDispatcher { - contract_address, - } - ) - } - fn write(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, value: IModelWithShortStringNamespaceSafeDispatcher) -> starknet::SyscallResult<()> { - starknet::Store::::write(address_domain, base, value.contract_address)?; - starknet::SyscallResult::Ok(()) - } - fn read_at_offset(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, offset: u8) -> starknet::SyscallResult { - let contract_address = starknet::Store::::read_at_offset(address_domain, base, offset)?; - starknet::SyscallResult::Ok( - IModelWithShortStringNamespaceSafeDispatcher { - contract_address, - } - ) - } - #[inline(always)] - fn write_at_offset(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, offset: u8, value: IModelWithShortStringNamespaceSafeDispatcher) -> starknet::SyscallResult<()> { - starknet::Store::::write_at_offset(address_domain, base, offset, value.contract_address)?; - starknet::SyscallResult::Ok(()) - } - #[inline(always)] - fn size() -> u8 { - starknet::Store::::size() - } -} - -#[derive(Drop, Copy)] -pub struct IModelWithShortStringNamespaceSafeDispatcherSubPointers { - pub contract_address: starknet::storage::StoragePointer, -} -impl IModelWithShortStringNamespaceSafeDispatcherSubPointersImpl of starknet::storage::SubPointers { - type SubPointersType = IModelWithShortStringNamespaceSafeDispatcherSubPointers; - fn sub_pointers(self: starknet::storage::StoragePointer) -> IModelWithShortStringNamespaceSafeDispatcherSubPointers { - let base_address = self.__storage_pointer_address__; - let mut current_offset = self.__storage_pointer_offset__; - let __contract_address_value__ = starknet::storage::StoragePointer { - __storage_pointer_address__: base_address, - __storage_pointer_offset__: current_offset, - }; - IModelWithShortStringNamespaceSafeDispatcherSubPointers { - contract_address: __contract_address_value__, - } - } -} -#[derive(Drop, Copy)] -pub struct IModelWithShortStringNamespaceSafeDispatcherSubPointersMut { - pub contract_address: starknet::storage::StoragePointer>, -} -impl IModelWithShortStringNamespaceSafeDispatcherSubPointersMutImpl of starknet::storage::SubPointersMut { - type SubPointersType = IModelWithShortStringNamespaceSafeDispatcherSubPointersMut; - fn sub_pointers_mut(self: starknet::storage::StoragePointer>) -> IModelWithShortStringNamespaceSafeDispatcherSubPointersMut { - let base_address = self.__storage_pointer_address__; - let mut current_offset = self.__storage_pointer_offset__; - let __contract_address_value__ = starknet::storage::StoragePointer { - __storage_pointer_address__: base_address, - __storage_pointer_offset__: current_offset, - }; - IModelWithShortStringNamespaceSafeDispatcherSubPointersMut { - contract_address: __contract_address_value__, - } - } -} -impl IModelWithStringNamespaceDispatcherCopy of core::traits::Copy::; -impl IModelWithStringNamespaceDispatcherDrop of core::traits::Drop::; -impl IModelWithStringNamespaceDispatcherSerde of core::serde::Serde:: { - fn serialize(self: @IModelWithStringNamespaceDispatcher, ref output: core::array::Array) { - core::serde::Serde::serialize(self.contract_address, ref output) - } - fn deserialize(ref serialized: core::array::Span) -> core::option::Option { - core::option::Option::Some(IModelWithStringNamespaceDispatcher { - contract_address: core::serde::Serde::deserialize(ref serialized)?, - }) - } -} -impl StoreIModelWithStringNamespaceDispatcher of starknet::Store:: { - fn read(address_domain: u32, base: starknet::storage_access::StorageBaseAddress) -> starknet::SyscallResult { - let contract_address = starknet::Store::::read(address_domain, base)?; - starknet::SyscallResult::Ok( - IModelWithStringNamespaceDispatcher { - contract_address, - } - ) - } - fn write(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, value: IModelWithStringNamespaceDispatcher) -> starknet::SyscallResult<()> { - starknet::Store::::write(address_domain, base, value.contract_address)?; - starknet::SyscallResult::Ok(()) - } - fn read_at_offset(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, offset: u8) -> starknet::SyscallResult { - let contract_address = starknet::Store::::read_at_offset(address_domain, base, offset)?; - starknet::SyscallResult::Ok( - IModelWithStringNamespaceDispatcher { - contract_address, - } - ) - } - #[inline(always)] - fn write_at_offset(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, offset: u8, value: IModelWithStringNamespaceDispatcher) -> starknet::SyscallResult<()> { - starknet::Store::::write_at_offset(address_domain, base, offset, value.contract_address)?; - starknet::SyscallResult::Ok(()) - } - #[inline(always)] - fn size() -> u8 { - starknet::Store::::size() - } -} - -#[derive(Drop, Copy)] -pub struct IModelWithStringNamespaceDispatcherSubPointers { - pub contract_address: starknet::storage::StoragePointer, -} -impl IModelWithStringNamespaceDispatcherSubPointersImpl of starknet::storage::SubPointers { - type SubPointersType = IModelWithStringNamespaceDispatcherSubPointers; - fn sub_pointers(self: starknet::storage::StoragePointer) -> IModelWithStringNamespaceDispatcherSubPointers { - let base_address = self.__storage_pointer_address__; - let mut current_offset = self.__storage_pointer_offset__; - let __contract_address_value__ = starknet::storage::StoragePointer { - __storage_pointer_address__: base_address, - __storage_pointer_offset__: current_offset, - }; - IModelWithStringNamespaceDispatcherSubPointers { - contract_address: __contract_address_value__, - } - } -} -#[derive(Drop, Copy)] -pub struct IModelWithStringNamespaceDispatcherSubPointersMut { - pub contract_address: starknet::storage::StoragePointer>, -} -impl IModelWithStringNamespaceDispatcherSubPointersMutImpl of starknet::storage::SubPointersMut { - type SubPointersType = IModelWithStringNamespaceDispatcherSubPointersMut; - fn sub_pointers_mut(self: starknet::storage::StoragePointer>) -> IModelWithStringNamespaceDispatcherSubPointersMut { - let base_address = self.__storage_pointer_address__; - let mut current_offset = self.__storage_pointer_offset__; - let __contract_address_value__ = starknet::storage::StoragePointer { - __storage_pointer_address__: base_address, - __storage_pointer_offset__: current_offset, - }; - IModelWithStringNamespaceDispatcherSubPointersMut { - contract_address: __contract_address_value__, - } - } -} -impl IModelWithStringNamespaceLibraryDispatcherCopy of core::traits::Copy::; -impl IModelWithStringNamespaceLibraryDispatcherDrop of core::traits::Drop::; -impl IModelWithStringNamespaceLibraryDispatcherSerde of core::serde::Serde:: { - fn serialize(self: @IModelWithStringNamespaceLibraryDispatcher, ref output: core::array::Array) { - core::serde::Serde::serialize(self.class_hash, ref output) - } - fn deserialize(ref serialized: core::array::Span) -> core::option::Option { - core::option::Option::Some(IModelWithStringNamespaceLibraryDispatcher { - class_hash: core::serde::Serde::deserialize(ref serialized)?, - }) - } -} -impl StoreIModelWithStringNamespaceLibraryDispatcher of starknet::Store:: { - fn read(address_domain: u32, base: starknet::storage_access::StorageBaseAddress) -> starknet::SyscallResult { - let class_hash = starknet::Store::::read(address_domain, base)?; - starknet::SyscallResult::Ok( - IModelWithStringNamespaceLibraryDispatcher { - class_hash, - } - ) - } - fn write(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, value: IModelWithStringNamespaceLibraryDispatcher) -> starknet::SyscallResult<()> { - starknet::Store::::write(address_domain, base, value.class_hash)?; - starknet::SyscallResult::Ok(()) - } - fn read_at_offset(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, offset: u8) -> starknet::SyscallResult { - let class_hash = starknet::Store::::read_at_offset(address_domain, base, offset)?; - starknet::SyscallResult::Ok( - IModelWithStringNamespaceLibraryDispatcher { - class_hash, - } - ) - } - #[inline(always)] - fn write_at_offset(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, offset: u8, value: IModelWithStringNamespaceLibraryDispatcher) -> starknet::SyscallResult<()> { - starknet::Store::::write_at_offset(address_domain, base, offset, value.class_hash)?; - starknet::SyscallResult::Ok(()) - } - #[inline(always)] - fn size() -> u8 { - starknet::Store::::size() - } -} - -#[derive(Drop, Copy)] -pub struct IModelWithStringNamespaceLibraryDispatcherSubPointers { - pub class_hash: starknet::storage::StoragePointer, -} -impl IModelWithStringNamespaceLibraryDispatcherSubPointersImpl of starknet::storage::SubPointers { - type SubPointersType = IModelWithStringNamespaceLibraryDispatcherSubPointers; - fn sub_pointers(self: starknet::storage::StoragePointer) -> IModelWithStringNamespaceLibraryDispatcherSubPointers { - let base_address = self.__storage_pointer_address__; - let mut current_offset = self.__storage_pointer_offset__; - let __class_hash_value__ = starknet::storage::StoragePointer { - __storage_pointer_address__: base_address, - __storage_pointer_offset__: current_offset, - }; - IModelWithStringNamespaceLibraryDispatcherSubPointers { - class_hash: __class_hash_value__, - } - } -} -#[derive(Drop, Copy)] -pub struct IModelWithStringNamespaceLibraryDispatcherSubPointersMut { - pub class_hash: starknet::storage::StoragePointer>, -} -impl IModelWithStringNamespaceLibraryDispatcherSubPointersMutImpl of starknet::storage::SubPointersMut { - type SubPointersType = IModelWithStringNamespaceLibraryDispatcherSubPointersMut; - fn sub_pointers_mut(self: starknet::storage::StoragePointer>) -> IModelWithStringNamespaceLibraryDispatcherSubPointersMut { - let base_address = self.__storage_pointer_address__; - let mut current_offset = self.__storage_pointer_offset__; - let __class_hash_value__ = starknet::storage::StoragePointer { - __storage_pointer_address__: base_address, - __storage_pointer_offset__: current_offset, - }; - IModelWithStringNamespaceLibraryDispatcherSubPointersMut { - class_hash: __class_hash_value__, - } - } -} -impl IModelWithStringNamespaceSafeLibraryDispatcherCopy of core::traits::Copy::; -impl IModelWithStringNamespaceSafeLibraryDispatcherDrop of core::traits::Drop::; -impl IModelWithStringNamespaceSafeLibraryDispatcherSerde of core::serde::Serde:: { - fn serialize(self: @IModelWithStringNamespaceSafeLibraryDispatcher, ref output: core::array::Array) { - core::serde::Serde::serialize(self.class_hash, ref output) - } - fn deserialize(ref serialized: core::array::Span) -> core::option::Option { - core::option::Option::Some(IModelWithStringNamespaceSafeLibraryDispatcher { - class_hash: core::serde::Serde::deserialize(ref serialized)?, - }) - } -} -impl StoreIModelWithStringNamespaceSafeLibraryDispatcher of starknet::Store:: { - fn read(address_domain: u32, base: starknet::storage_access::StorageBaseAddress) -> starknet::SyscallResult { - let class_hash = starknet::Store::::read(address_domain, base)?; - starknet::SyscallResult::Ok( - IModelWithStringNamespaceSafeLibraryDispatcher { - class_hash, - } - ) - } - fn write(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, value: IModelWithStringNamespaceSafeLibraryDispatcher) -> starknet::SyscallResult<()> { - starknet::Store::::write(address_domain, base, value.class_hash)?; - starknet::SyscallResult::Ok(()) - } - fn read_at_offset(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, offset: u8) -> starknet::SyscallResult { - let class_hash = starknet::Store::::read_at_offset(address_domain, base, offset)?; - starknet::SyscallResult::Ok( - IModelWithStringNamespaceSafeLibraryDispatcher { - class_hash, - } - ) - } - #[inline(always)] - fn write_at_offset(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, offset: u8, value: IModelWithStringNamespaceSafeLibraryDispatcher) -> starknet::SyscallResult<()> { - starknet::Store::::write_at_offset(address_domain, base, offset, value.class_hash)?; - starknet::SyscallResult::Ok(()) - } - #[inline(always)] - fn size() -> u8 { - starknet::Store::::size() - } -} - -#[derive(Drop, Copy)] -pub struct IModelWithStringNamespaceSafeLibraryDispatcherSubPointers { - pub class_hash: starknet::storage::StoragePointer, -} -impl IModelWithStringNamespaceSafeLibraryDispatcherSubPointersImpl of starknet::storage::SubPointers { - type SubPointersType = IModelWithStringNamespaceSafeLibraryDispatcherSubPointers; - fn sub_pointers(self: starknet::storage::StoragePointer) -> IModelWithStringNamespaceSafeLibraryDispatcherSubPointers { - let base_address = self.__storage_pointer_address__; - let mut current_offset = self.__storage_pointer_offset__; - let __class_hash_value__ = starknet::storage::StoragePointer { - __storage_pointer_address__: base_address, - __storage_pointer_offset__: current_offset, - }; - IModelWithStringNamespaceSafeLibraryDispatcherSubPointers { - class_hash: __class_hash_value__, - } - } -} -#[derive(Drop, Copy)] -pub struct IModelWithStringNamespaceSafeLibraryDispatcherSubPointersMut { - pub class_hash: starknet::storage::StoragePointer>, -} -impl IModelWithStringNamespaceSafeLibraryDispatcherSubPointersMutImpl of starknet::storage::SubPointersMut { - type SubPointersType = IModelWithStringNamespaceSafeLibraryDispatcherSubPointersMut; - fn sub_pointers_mut(self: starknet::storage::StoragePointer>) -> IModelWithStringNamespaceSafeLibraryDispatcherSubPointersMut { - let base_address = self.__storage_pointer_address__; - let mut current_offset = self.__storage_pointer_offset__; - let __class_hash_value__ = starknet::storage::StoragePointer { - __storage_pointer_address__: base_address, - __storage_pointer_offset__: current_offset, - }; - IModelWithStringNamespaceSafeLibraryDispatcherSubPointersMut { - class_hash: __class_hash_value__, - } - } -} -impl IModelWithStringNamespaceSafeDispatcherCopy of core::traits::Copy::; -impl IModelWithStringNamespaceSafeDispatcherDrop of core::traits::Drop::; -impl IModelWithStringNamespaceSafeDispatcherSerde of core::serde::Serde:: { - fn serialize(self: @IModelWithStringNamespaceSafeDispatcher, ref output: core::array::Array) { - core::serde::Serde::serialize(self.contract_address, ref output) - } - fn deserialize(ref serialized: core::array::Span) -> core::option::Option { - core::option::Option::Some(IModelWithStringNamespaceSafeDispatcher { - contract_address: core::serde::Serde::deserialize(ref serialized)?, - }) - } -} -impl StoreIModelWithStringNamespaceSafeDispatcher of starknet::Store:: { - fn read(address_domain: u32, base: starknet::storage_access::StorageBaseAddress) -> starknet::SyscallResult { - let contract_address = starknet::Store::::read(address_domain, base)?; - starknet::SyscallResult::Ok( - IModelWithStringNamespaceSafeDispatcher { - contract_address, - } - ) - } - fn write(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, value: IModelWithStringNamespaceSafeDispatcher) -> starknet::SyscallResult<()> { - starknet::Store::::write(address_domain, base, value.contract_address)?; - starknet::SyscallResult::Ok(()) - } - fn read_at_offset(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, offset: u8) -> starknet::SyscallResult { - let contract_address = starknet::Store::::read_at_offset(address_domain, base, offset)?; - starknet::SyscallResult::Ok( - IModelWithStringNamespaceSafeDispatcher { - contract_address, - } - ) - } - #[inline(always)] - fn write_at_offset(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, offset: u8, value: IModelWithStringNamespaceSafeDispatcher) -> starknet::SyscallResult<()> { - starknet::Store::::write_at_offset(address_domain, base, offset, value.contract_address)?; - starknet::SyscallResult::Ok(()) - } - #[inline(always)] - fn size() -> u8 { - starknet::Store::::size() - } -} - -#[derive(Drop, Copy)] -pub struct IModelWithStringNamespaceSafeDispatcherSubPointers { - pub contract_address: starknet::storage::StoragePointer, -} -impl IModelWithStringNamespaceSafeDispatcherSubPointersImpl of starknet::storage::SubPointers { - type SubPointersType = IModelWithStringNamespaceSafeDispatcherSubPointers; - fn sub_pointers(self: starknet::storage::StoragePointer) -> IModelWithStringNamespaceSafeDispatcherSubPointers { - let base_address = self.__storage_pointer_address__; - let mut current_offset = self.__storage_pointer_offset__; - let __contract_address_value__ = starknet::storage::StoragePointer { - __storage_pointer_address__: base_address, - __storage_pointer_offset__: current_offset, - }; - IModelWithStringNamespaceSafeDispatcherSubPointers { - contract_address: __contract_address_value__, - } - } -} -#[derive(Drop, Copy)] -pub struct IModelWithStringNamespaceSafeDispatcherSubPointersMut { - pub contract_address: starknet::storage::StoragePointer>, -} -impl IModelWithStringNamespaceSafeDispatcherSubPointersMutImpl of starknet::storage::SubPointersMut { - type SubPointersType = IModelWithStringNamespaceSafeDispatcherSubPointersMut; - fn sub_pointers_mut(self: starknet::storage::StoragePointer>) -> IModelWithStringNamespaceSafeDispatcherSubPointersMut { - let base_address = self.__storage_pointer_address__; - let mut current_offset = self.__storage_pointer_offset__; - let __contract_address_value__ = starknet::storage::StoragePointer { - __storage_pointer_address__: base_address, - __storage_pointer_offset__: current_offset, - }; - IModelWithStringNamespaceSafeDispatcherSubPointersMut { - contract_address: __contract_address_value__, - } - } -} -impl IPositionDispatcherCopy of core::traits::Copy::; -impl IPositionDispatcherDrop of core::traits::Drop::; -impl IPositionDispatcherSerde of core::serde::Serde:: { - fn serialize(self: @IPositionDispatcher, ref output: core::array::Array) { - core::serde::Serde::serialize(self.contract_address, ref output) - } - fn deserialize(ref serialized: core::array::Span) -> core::option::Option { - core::option::Option::Some(IPositionDispatcher { - contract_address: core::serde::Serde::deserialize(ref serialized)?, - }) - } -} -impl StoreIPositionDispatcher of starknet::Store:: { - fn read(address_domain: u32, base: starknet::storage_access::StorageBaseAddress) -> starknet::SyscallResult { - let contract_address = starknet::Store::::read(address_domain, base)?; - starknet::SyscallResult::Ok( - IPositionDispatcher { - contract_address, - } - ) - } - fn write(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, value: IPositionDispatcher) -> starknet::SyscallResult<()> { - starknet::Store::::write(address_domain, base, value.contract_address)?; - starknet::SyscallResult::Ok(()) - } - fn read_at_offset(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, offset: u8) -> starknet::SyscallResult { - let contract_address = starknet::Store::::read_at_offset(address_domain, base, offset)?; - starknet::SyscallResult::Ok( - IPositionDispatcher { - contract_address, - } - ) - } - #[inline(always)] - fn write_at_offset(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, offset: u8, value: IPositionDispatcher) -> starknet::SyscallResult<()> { - starknet::Store::::write_at_offset(address_domain, base, offset, value.contract_address)?; - starknet::SyscallResult::Ok(()) - } - #[inline(always)] - fn size() -> u8 { - starknet::Store::::size() - } -} - -#[derive(Drop, Copy)] -pub struct IPositionDispatcherSubPointers { - pub contract_address: starknet::storage::StoragePointer, -} -impl IPositionDispatcherSubPointersImpl of starknet::storage::SubPointers { - type SubPointersType = IPositionDispatcherSubPointers; - fn sub_pointers(self: starknet::storage::StoragePointer) -> IPositionDispatcherSubPointers { - let base_address = self.__storage_pointer_address__; - let mut current_offset = self.__storage_pointer_offset__; - let __contract_address_value__ = starknet::storage::StoragePointer { - __storage_pointer_address__: base_address, - __storage_pointer_offset__: current_offset, - }; - IPositionDispatcherSubPointers { - contract_address: __contract_address_value__, - } - } -} -#[derive(Drop, Copy)] -pub struct IPositionDispatcherSubPointersMut { - pub contract_address: starknet::storage::StoragePointer>, -} -impl IPositionDispatcherSubPointersMutImpl of starknet::storage::SubPointersMut { - type SubPointersType = IPositionDispatcherSubPointersMut; - fn sub_pointers_mut(self: starknet::storage::StoragePointer>) -> IPositionDispatcherSubPointersMut { - let base_address = self.__storage_pointer_address__; - let mut current_offset = self.__storage_pointer_offset__; - let __contract_address_value__ = starknet::storage::StoragePointer { - __storage_pointer_address__: base_address, - __storage_pointer_offset__: current_offset, - }; - IPositionDispatcherSubPointersMut { - contract_address: __contract_address_value__, - } - } -} -impl IPositionLibraryDispatcherCopy of core::traits::Copy::; -impl IPositionLibraryDispatcherDrop of core::traits::Drop::; -impl IPositionLibraryDispatcherSerde of core::serde::Serde:: { - fn serialize(self: @IPositionLibraryDispatcher, ref output: core::array::Array) { - core::serde::Serde::serialize(self.class_hash, ref output) - } - fn deserialize(ref serialized: core::array::Span) -> core::option::Option { - core::option::Option::Some(IPositionLibraryDispatcher { - class_hash: core::serde::Serde::deserialize(ref serialized)?, - }) - } -} -impl StoreIPositionLibraryDispatcher of starknet::Store:: { - fn read(address_domain: u32, base: starknet::storage_access::StorageBaseAddress) -> starknet::SyscallResult { - let class_hash = starknet::Store::::read(address_domain, base)?; - starknet::SyscallResult::Ok( - IPositionLibraryDispatcher { - class_hash, - } - ) - } - fn write(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, value: IPositionLibraryDispatcher) -> starknet::SyscallResult<()> { - starknet::Store::::write(address_domain, base, value.class_hash)?; - starknet::SyscallResult::Ok(()) - } - fn read_at_offset(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, offset: u8) -> starknet::SyscallResult { - let class_hash = starknet::Store::::read_at_offset(address_domain, base, offset)?; - starknet::SyscallResult::Ok( - IPositionLibraryDispatcher { - class_hash, - } - ) - } - #[inline(always)] - fn write_at_offset(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, offset: u8, value: IPositionLibraryDispatcher) -> starknet::SyscallResult<()> { - starknet::Store::::write_at_offset(address_domain, base, offset, value.class_hash)?; - starknet::SyscallResult::Ok(()) - } - #[inline(always)] - fn size() -> u8 { - starknet::Store::::size() - } -} - -#[derive(Drop, Copy)] -pub struct IPositionLibraryDispatcherSubPointers { - pub class_hash: starknet::storage::StoragePointer, -} -impl IPositionLibraryDispatcherSubPointersImpl of starknet::storage::SubPointers { - type SubPointersType = IPositionLibraryDispatcherSubPointers; - fn sub_pointers(self: starknet::storage::StoragePointer) -> IPositionLibraryDispatcherSubPointers { - let base_address = self.__storage_pointer_address__; - let mut current_offset = self.__storage_pointer_offset__; - let __class_hash_value__ = starknet::storage::StoragePointer { - __storage_pointer_address__: base_address, - __storage_pointer_offset__: current_offset, - }; - IPositionLibraryDispatcherSubPointers { - class_hash: __class_hash_value__, - } - } -} -#[derive(Drop, Copy)] -pub struct IPositionLibraryDispatcherSubPointersMut { - pub class_hash: starknet::storage::StoragePointer>, -} -impl IPositionLibraryDispatcherSubPointersMutImpl of starknet::storage::SubPointersMut { - type SubPointersType = IPositionLibraryDispatcherSubPointersMut; - fn sub_pointers_mut(self: starknet::storage::StoragePointer>) -> IPositionLibraryDispatcherSubPointersMut { - let base_address = self.__storage_pointer_address__; - let mut current_offset = self.__storage_pointer_offset__; - let __class_hash_value__ = starknet::storage::StoragePointer { - __storage_pointer_address__: base_address, - __storage_pointer_offset__: current_offset, - }; - IPositionLibraryDispatcherSubPointersMut { - class_hash: __class_hash_value__, - } - } -} -impl IPositionSafeLibraryDispatcherCopy of core::traits::Copy::; -impl IPositionSafeLibraryDispatcherDrop of core::traits::Drop::; -impl IPositionSafeLibraryDispatcherSerde of core::serde::Serde:: { - fn serialize(self: @IPositionSafeLibraryDispatcher, ref output: core::array::Array) { - core::serde::Serde::serialize(self.class_hash, ref output) - } - fn deserialize(ref serialized: core::array::Span) -> core::option::Option { - core::option::Option::Some(IPositionSafeLibraryDispatcher { - class_hash: core::serde::Serde::deserialize(ref serialized)?, - }) - } -} -impl StoreIPositionSafeLibraryDispatcher of starknet::Store:: { - fn read(address_domain: u32, base: starknet::storage_access::StorageBaseAddress) -> starknet::SyscallResult { - let class_hash = starknet::Store::::read(address_domain, base)?; - starknet::SyscallResult::Ok( - IPositionSafeLibraryDispatcher { - class_hash, - } - ) - } - fn write(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, value: IPositionSafeLibraryDispatcher) -> starknet::SyscallResult<()> { - starknet::Store::::write(address_domain, base, value.class_hash)?; - starknet::SyscallResult::Ok(()) - } - fn read_at_offset(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, offset: u8) -> starknet::SyscallResult { - let class_hash = starknet::Store::::read_at_offset(address_domain, base, offset)?; - starknet::SyscallResult::Ok( - IPositionSafeLibraryDispatcher { - class_hash, - } - ) - } - #[inline(always)] - fn write_at_offset(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, offset: u8, value: IPositionSafeLibraryDispatcher) -> starknet::SyscallResult<()> { - starknet::Store::::write_at_offset(address_domain, base, offset, value.class_hash)?; - starknet::SyscallResult::Ok(()) - } - #[inline(always)] - fn size() -> u8 { - starknet::Store::::size() - } -} - -#[derive(Drop, Copy)] -pub struct IPositionSafeLibraryDispatcherSubPointers { - pub class_hash: starknet::storage::StoragePointer, -} -impl IPositionSafeLibraryDispatcherSubPointersImpl of starknet::storage::SubPointers { - type SubPointersType = IPositionSafeLibraryDispatcherSubPointers; - fn sub_pointers(self: starknet::storage::StoragePointer) -> IPositionSafeLibraryDispatcherSubPointers { - let base_address = self.__storage_pointer_address__; - let mut current_offset = self.__storage_pointer_offset__; - let __class_hash_value__ = starknet::storage::StoragePointer { - __storage_pointer_address__: base_address, - __storage_pointer_offset__: current_offset, - }; - IPositionSafeLibraryDispatcherSubPointers { - class_hash: __class_hash_value__, - } - } -} -#[derive(Drop, Copy)] -pub struct IPositionSafeLibraryDispatcherSubPointersMut { - pub class_hash: starknet::storage::StoragePointer>, -} -impl IPositionSafeLibraryDispatcherSubPointersMutImpl of starknet::storage::SubPointersMut { - type SubPointersType = IPositionSafeLibraryDispatcherSubPointersMut; - fn sub_pointers_mut(self: starknet::storage::StoragePointer>) -> IPositionSafeLibraryDispatcherSubPointersMut { - let base_address = self.__storage_pointer_address__; - let mut current_offset = self.__storage_pointer_offset__; - let __class_hash_value__ = starknet::storage::StoragePointer { - __storage_pointer_address__: base_address, - __storage_pointer_offset__: current_offset, - }; - IPositionSafeLibraryDispatcherSubPointersMut { - class_hash: __class_hash_value__, - } - } -} -impl IPositionSafeDispatcherCopy of core::traits::Copy::; -impl IPositionSafeDispatcherDrop of core::traits::Drop::; -impl IPositionSafeDispatcherSerde of core::serde::Serde:: { - fn serialize(self: @IPositionSafeDispatcher, ref output: core::array::Array) { - core::serde::Serde::serialize(self.contract_address, ref output) - } - fn deserialize(ref serialized: core::array::Span) -> core::option::Option { - core::option::Option::Some(IPositionSafeDispatcher { - contract_address: core::serde::Serde::deserialize(ref serialized)?, - }) - } -} -impl StoreIPositionSafeDispatcher of starknet::Store:: { - fn read(address_domain: u32, base: starknet::storage_access::StorageBaseAddress) -> starknet::SyscallResult { - let contract_address = starknet::Store::::read(address_domain, base)?; - starknet::SyscallResult::Ok( - IPositionSafeDispatcher { - contract_address, - } - ) - } - fn write(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, value: IPositionSafeDispatcher) -> starknet::SyscallResult<()> { - starknet::Store::::write(address_domain, base, value.contract_address)?; - starknet::SyscallResult::Ok(()) - } - fn read_at_offset(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, offset: u8) -> starknet::SyscallResult { - let contract_address = starknet::Store::::read_at_offset(address_domain, base, offset)?; - starknet::SyscallResult::Ok( - IPositionSafeDispatcher { - contract_address, - } - ) - } - #[inline(always)] - fn write_at_offset(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, offset: u8, value: IPositionSafeDispatcher) -> starknet::SyscallResult<()> { - starknet::Store::::write_at_offset(address_domain, base, offset, value.contract_address)?; - starknet::SyscallResult::Ok(()) - } - #[inline(always)] - fn size() -> u8 { - starknet::Store::::size() - } -} - -#[derive(Drop, Copy)] -pub struct IPositionSafeDispatcherSubPointers { - pub contract_address: starknet::storage::StoragePointer, -} -impl IPositionSafeDispatcherSubPointersImpl of starknet::storage::SubPointers { - type SubPointersType = IPositionSafeDispatcherSubPointers; - fn sub_pointers(self: starknet::storage::StoragePointer) -> IPositionSafeDispatcherSubPointers { - let base_address = self.__storage_pointer_address__; - let mut current_offset = self.__storage_pointer_offset__; - let __contract_address_value__ = starknet::storage::StoragePointer { - __storage_pointer_address__: base_address, - __storage_pointer_offset__: current_offset, - }; - IPositionSafeDispatcherSubPointers { - contract_address: __contract_address_value__, - } - } -} -#[derive(Drop, Copy)] -pub struct IPositionSafeDispatcherSubPointersMut { - pub contract_address: starknet::storage::StoragePointer>, -} -impl IPositionSafeDispatcherSubPointersMutImpl of starknet::storage::SubPointersMut { - type SubPointersType = IPositionSafeDispatcherSubPointersMut; - fn sub_pointers_mut(self: starknet::storage::StoragePointer>) -> IPositionSafeDispatcherSubPointersMut { - let base_address = self.__storage_pointer_address__; - let mut current_offset = self.__storage_pointer_offset__; - let __contract_address_value__ = starknet::storage::StoragePointer { - __storage_pointer_address__: base_address, - __storage_pointer_offset__: current_offset, - }; - IPositionSafeDispatcherSubPointersMut { - contract_address: __contract_address_value__, - } - } -} -impl IPlayerDispatcherCopy of core::traits::Copy::; -impl IPlayerDispatcherDrop of core::traits::Drop::; -impl IPlayerDispatcherSerde of core::serde::Serde:: { - fn serialize(self: @IPlayerDispatcher, ref output: core::array::Array) { - core::serde::Serde::serialize(self.contract_address, ref output) - } - fn deserialize(ref serialized: core::array::Span) -> core::option::Option { - core::option::Option::Some(IPlayerDispatcher { - contract_address: core::serde::Serde::deserialize(ref serialized)?, - }) - } -} -impl StoreIPlayerDispatcher of starknet::Store:: { - fn read(address_domain: u32, base: starknet::storage_access::StorageBaseAddress) -> starknet::SyscallResult { - let contract_address = starknet::Store::::read(address_domain, base)?; - starknet::SyscallResult::Ok( - IPlayerDispatcher { - contract_address, - } - ) - } - fn write(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, value: IPlayerDispatcher) -> starknet::SyscallResult<()> { - starknet::Store::::write(address_domain, base, value.contract_address)?; - starknet::SyscallResult::Ok(()) - } - fn read_at_offset(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, offset: u8) -> starknet::SyscallResult { - let contract_address = starknet::Store::::read_at_offset(address_domain, base, offset)?; - starknet::SyscallResult::Ok( - IPlayerDispatcher { - contract_address, - } - ) - } - #[inline(always)] - fn write_at_offset(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, offset: u8, value: IPlayerDispatcher) -> starknet::SyscallResult<()> { - starknet::Store::::write_at_offset(address_domain, base, offset, value.contract_address)?; - starknet::SyscallResult::Ok(()) - } - #[inline(always)] - fn size() -> u8 { - starknet::Store::::size() - } -} - -#[derive(Drop, Copy)] -pub struct IPlayerDispatcherSubPointers { - pub contract_address: starknet::storage::StoragePointer, -} -impl IPlayerDispatcherSubPointersImpl of starknet::storage::SubPointers { - type SubPointersType = IPlayerDispatcherSubPointers; - fn sub_pointers(self: starknet::storage::StoragePointer) -> IPlayerDispatcherSubPointers { - let base_address = self.__storage_pointer_address__; - let mut current_offset = self.__storage_pointer_offset__; - let __contract_address_value__ = starknet::storage::StoragePointer { - __storage_pointer_address__: base_address, - __storage_pointer_offset__: current_offset, - }; - IPlayerDispatcherSubPointers { - contract_address: __contract_address_value__, - } - } -} -#[derive(Drop, Copy)] -pub struct IPlayerDispatcherSubPointersMut { - pub contract_address: starknet::storage::StoragePointer>, -} -impl IPlayerDispatcherSubPointersMutImpl of starknet::storage::SubPointersMut { - type SubPointersType = IPlayerDispatcherSubPointersMut; - fn sub_pointers_mut(self: starknet::storage::StoragePointer>) -> IPlayerDispatcherSubPointersMut { - let base_address = self.__storage_pointer_address__; - let mut current_offset = self.__storage_pointer_offset__; - let __contract_address_value__ = starknet::storage::StoragePointer { - __storage_pointer_address__: base_address, - __storage_pointer_offset__: current_offset, - }; - IPlayerDispatcherSubPointersMut { - contract_address: __contract_address_value__, - } - } -} -impl IPlayerLibraryDispatcherCopy of core::traits::Copy::; -impl IPlayerLibraryDispatcherDrop of core::traits::Drop::; -impl IPlayerLibraryDispatcherSerde of core::serde::Serde:: { - fn serialize(self: @IPlayerLibraryDispatcher, ref output: core::array::Array) { - core::serde::Serde::serialize(self.class_hash, ref output) - } - fn deserialize(ref serialized: core::array::Span) -> core::option::Option { - core::option::Option::Some(IPlayerLibraryDispatcher { - class_hash: core::serde::Serde::deserialize(ref serialized)?, - }) - } -} -impl StoreIPlayerLibraryDispatcher of starknet::Store:: { - fn read(address_domain: u32, base: starknet::storage_access::StorageBaseAddress) -> starknet::SyscallResult { - let class_hash = starknet::Store::::read(address_domain, base)?; - starknet::SyscallResult::Ok( - IPlayerLibraryDispatcher { - class_hash, - } - ) - } - fn write(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, value: IPlayerLibraryDispatcher) -> starknet::SyscallResult<()> { - starknet::Store::::write(address_domain, base, value.class_hash)?; - starknet::SyscallResult::Ok(()) - } - fn read_at_offset(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, offset: u8) -> starknet::SyscallResult { - let class_hash = starknet::Store::::read_at_offset(address_domain, base, offset)?; - starknet::SyscallResult::Ok( - IPlayerLibraryDispatcher { - class_hash, - } - ) - } - #[inline(always)] - fn write_at_offset(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, offset: u8, value: IPlayerLibraryDispatcher) -> starknet::SyscallResult<()> { - starknet::Store::::write_at_offset(address_domain, base, offset, value.class_hash)?; - starknet::SyscallResult::Ok(()) - } - #[inline(always)] - fn size() -> u8 { - starknet::Store::::size() - } -} - -#[derive(Drop, Copy)] -pub struct IPlayerLibraryDispatcherSubPointers { - pub class_hash: starknet::storage::StoragePointer, -} -impl IPlayerLibraryDispatcherSubPointersImpl of starknet::storage::SubPointers { - type SubPointersType = IPlayerLibraryDispatcherSubPointers; - fn sub_pointers(self: starknet::storage::StoragePointer) -> IPlayerLibraryDispatcherSubPointers { - let base_address = self.__storage_pointer_address__; - let mut current_offset = self.__storage_pointer_offset__; - let __class_hash_value__ = starknet::storage::StoragePointer { - __storage_pointer_address__: base_address, - __storage_pointer_offset__: current_offset, - }; - IPlayerLibraryDispatcherSubPointers { - class_hash: __class_hash_value__, - } - } -} -#[derive(Drop, Copy)] -pub struct IPlayerLibraryDispatcherSubPointersMut { - pub class_hash: starknet::storage::StoragePointer>, -} -impl IPlayerLibraryDispatcherSubPointersMutImpl of starknet::storage::SubPointersMut { - type SubPointersType = IPlayerLibraryDispatcherSubPointersMut; - fn sub_pointers_mut(self: starknet::storage::StoragePointer>) -> IPlayerLibraryDispatcherSubPointersMut { - let base_address = self.__storage_pointer_address__; - let mut current_offset = self.__storage_pointer_offset__; - let __class_hash_value__ = starknet::storage::StoragePointer { - __storage_pointer_address__: base_address, - __storage_pointer_offset__: current_offset, - }; - IPlayerLibraryDispatcherSubPointersMut { - class_hash: __class_hash_value__, - } - } -} -impl IPlayerSafeLibraryDispatcherCopy of core::traits::Copy::; -impl IPlayerSafeLibraryDispatcherDrop of core::traits::Drop::; -impl IPlayerSafeLibraryDispatcherSerde of core::serde::Serde:: { - fn serialize(self: @IPlayerSafeLibraryDispatcher, ref output: core::array::Array) { - core::serde::Serde::serialize(self.class_hash, ref output) - } - fn deserialize(ref serialized: core::array::Span) -> core::option::Option { - core::option::Option::Some(IPlayerSafeLibraryDispatcher { - class_hash: core::serde::Serde::deserialize(ref serialized)?, - }) - } -} -impl StoreIPlayerSafeLibraryDispatcher of starknet::Store:: { - fn read(address_domain: u32, base: starknet::storage_access::StorageBaseAddress) -> starknet::SyscallResult { - let class_hash = starknet::Store::::read(address_domain, base)?; - starknet::SyscallResult::Ok( - IPlayerSafeLibraryDispatcher { - class_hash, - } - ) - } - fn write(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, value: IPlayerSafeLibraryDispatcher) -> starknet::SyscallResult<()> { - starknet::Store::::write(address_domain, base, value.class_hash)?; - starknet::SyscallResult::Ok(()) - } - fn read_at_offset(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, offset: u8) -> starknet::SyscallResult { - let class_hash = starknet::Store::::read_at_offset(address_domain, base, offset)?; - starknet::SyscallResult::Ok( - IPlayerSafeLibraryDispatcher { - class_hash, - } - ) - } - #[inline(always)] - fn write_at_offset(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, offset: u8, value: IPlayerSafeLibraryDispatcher) -> starknet::SyscallResult<()> { - starknet::Store::::write_at_offset(address_domain, base, offset, value.class_hash)?; - starknet::SyscallResult::Ok(()) - } - #[inline(always)] - fn size() -> u8 { - starknet::Store::::size() - } -} - -#[derive(Drop, Copy)] -pub struct IPlayerSafeLibraryDispatcherSubPointers { - pub class_hash: starknet::storage::StoragePointer, -} -impl IPlayerSafeLibraryDispatcherSubPointersImpl of starknet::storage::SubPointers { - type SubPointersType = IPlayerSafeLibraryDispatcherSubPointers; - fn sub_pointers(self: starknet::storage::StoragePointer) -> IPlayerSafeLibraryDispatcherSubPointers { - let base_address = self.__storage_pointer_address__; - let mut current_offset = self.__storage_pointer_offset__; - let __class_hash_value__ = starknet::storage::StoragePointer { - __storage_pointer_address__: base_address, - __storage_pointer_offset__: current_offset, - }; - IPlayerSafeLibraryDispatcherSubPointers { - class_hash: __class_hash_value__, - } - } -} -#[derive(Drop, Copy)] -pub struct IPlayerSafeLibraryDispatcherSubPointersMut { - pub class_hash: starknet::storage::StoragePointer>, -} -impl IPlayerSafeLibraryDispatcherSubPointersMutImpl of starknet::storage::SubPointersMut { - type SubPointersType = IPlayerSafeLibraryDispatcherSubPointersMut; - fn sub_pointers_mut(self: starknet::storage::StoragePointer>) -> IPlayerSafeLibraryDispatcherSubPointersMut { - let base_address = self.__storage_pointer_address__; - let mut current_offset = self.__storage_pointer_offset__; - let __class_hash_value__ = starknet::storage::StoragePointer { - __storage_pointer_address__: base_address, - __storage_pointer_offset__: current_offset, - }; - IPlayerSafeLibraryDispatcherSubPointersMut { - class_hash: __class_hash_value__, - } - } -} -impl IPlayerSafeDispatcherCopy of core::traits::Copy::; -impl IPlayerSafeDispatcherDrop of core::traits::Drop::; -impl IPlayerSafeDispatcherSerde of core::serde::Serde:: { - fn serialize(self: @IPlayerSafeDispatcher, ref output: core::array::Array) { - core::serde::Serde::serialize(self.contract_address, ref output) - } - fn deserialize(ref serialized: core::array::Span) -> core::option::Option { - core::option::Option::Some(IPlayerSafeDispatcher { - contract_address: core::serde::Serde::deserialize(ref serialized)?, - }) - } -} -impl StoreIPlayerSafeDispatcher of starknet::Store:: { - fn read(address_domain: u32, base: starknet::storage_access::StorageBaseAddress) -> starknet::SyscallResult { - let contract_address = starknet::Store::::read(address_domain, base)?; - starknet::SyscallResult::Ok( - IPlayerSafeDispatcher { - contract_address, - } - ) - } - fn write(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, value: IPlayerSafeDispatcher) -> starknet::SyscallResult<()> { - starknet::Store::::write(address_domain, base, value.contract_address)?; - starknet::SyscallResult::Ok(()) - } - fn read_at_offset(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, offset: u8) -> starknet::SyscallResult { - let contract_address = starknet::Store::::read_at_offset(address_domain, base, offset)?; - starknet::SyscallResult::Ok( - IPlayerSafeDispatcher { - contract_address, - } - ) - } - #[inline(always)] - fn write_at_offset(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, offset: u8, value: IPlayerSafeDispatcher) -> starknet::SyscallResult<()> { - starknet::Store::::write_at_offset(address_domain, base, offset, value.contract_address)?; - starknet::SyscallResult::Ok(()) - } - #[inline(always)] - fn size() -> u8 { - starknet::Store::::size() - } -} - -#[derive(Drop, Copy)] -pub struct IPlayerSafeDispatcherSubPointers { - pub contract_address: starknet::storage::StoragePointer, -} -impl IPlayerSafeDispatcherSubPointersImpl of starknet::storage::SubPointers { - type SubPointersType = IPlayerSafeDispatcherSubPointers; - fn sub_pointers(self: starknet::storage::StoragePointer) -> IPlayerSafeDispatcherSubPointers { - let base_address = self.__storage_pointer_address__; - let mut current_offset = self.__storage_pointer_offset__; - let __contract_address_value__ = starknet::storage::StoragePointer { - __storage_pointer_address__: base_address, - __storage_pointer_offset__: current_offset, - }; - IPlayerSafeDispatcherSubPointers { - contract_address: __contract_address_value__, - } - } -} -#[derive(Drop, Copy)] -pub struct IPlayerSafeDispatcherSubPointersMut { - pub contract_address: starknet::storage::StoragePointer>, -} -impl IPlayerSafeDispatcherSubPointersMutImpl of starknet::storage::SubPointersMut { - type SubPointersType = IPlayerSafeDispatcherSubPointersMut; - fn sub_pointers_mut(self: starknet::storage::StoragePointer>) -> IPlayerSafeDispatcherSubPointersMut { - let base_address = self.__storage_pointer_address__; - let mut current_offset = self.__storage_pointer_offset__; - let __contract_address_value__ = starknet::storage::StoragePointer { - __storage_pointer_address__: base_address, - __storage_pointer_offset__: current_offset, - }; - IPlayerSafeDispatcherSubPointersMut { - contract_address: __contract_address_value__, - } - } -} -impl IModelWithSimpleArrayDispatcherCopy of core::traits::Copy::; -impl IModelWithSimpleArrayDispatcherDrop of core::traits::Drop::; -impl IModelWithSimpleArrayDispatcherSerde of core::serde::Serde:: { - fn serialize(self: @IModelWithSimpleArrayDispatcher, ref output: core::array::Array) { - core::serde::Serde::serialize(self.contract_address, ref output) - } - fn deserialize(ref serialized: core::array::Span) -> core::option::Option { - core::option::Option::Some(IModelWithSimpleArrayDispatcher { - contract_address: core::serde::Serde::deserialize(ref serialized)?, - }) - } -} -impl StoreIModelWithSimpleArrayDispatcher of starknet::Store:: { - fn read(address_domain: u32, base: starknet::storage_access::StorageBaseAddress) -> starknet::SyscallResult { - let contract_address = starknet::Store::::read(address_domain, base)?; - starknet::SyscallResult::Ok( - IModelWithSimpleArrayDispatcher { - contract_address, - } - ) - } - fn write(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, value: IModelWithSimpleArrayDispatcher) -> starknet::SyscallResult<()> { - starknet::Store::::write(address_domain, base, value.contract_address)?; - starknet::SyscallResult::Ok(()) - } - fn read_at_offset(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, offset: u8) -> starknet::SyscallResult { - let contract_address = starknet::Store::::read_at_offset(address_domain, base, offset)?; - starknet::SyscallResult::Ok( - IModelWithSimpleArrayDispatcher { - contract_address, - } - ) - } - #[inline(always)] - fn write_at_offset(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, offset: u8, value: IModelWithSimpleArrayDispatcher) -> starknet::SyscallResult<()> { - starknet::Store::::write_at_offset(address_domain, base, offset, value.contract_address)?; - starknet::SyscallResult::Ok(()) - } - #[inline(always)] - fn size() -> u8 { - starknet::Store::::size() - } -} - -#[derive(Drop, Copy)] -pub struct IModelWithSimpleArrayDispatcherSubPointers { - pub contract_address: starknet::storage::StoragePointer, -} -impl IModelWithSimpleArrayDispatcherSubPointersImpl of starknet::storage::SubPointers { - type SubPointersType = IModelWithSimpleArrayDispatcherSubPointers; - fn sub_pointers(self: starknet::storage::StoragePointer) -> IModelWithSimpleArrayDispatcherSubPointers { - let base_address = self.__storage_pointer_address__; - let mut current_offset = self.__storage_pointer_offset__; - let __contract_address_value__ = starknet::storage::StoragePointer { - __storage_pointer_address__: base_address, - __storage_pointer_offset__: current_offset, - }; - IModelWithSimpleArrayDispatcherSubPointers { - contract_address: __contract_address_value__, - } - } -} -#[derive(Drop, Copy)] -pub struct IModelWithSimpleArrayDispatcherSubPointersMut { - pub contract_address: starknet::storage::StoragePointer>, -} -impl IModelWithSimpleArrayDispatcherSubPointersMutImpl of starknet::storage::SubPointersMut { - type SubPointersType = IModelWithSimpleArrayDispatcherSubPointersMut; - fn sub_pointers_mut(self: starknet::storage::StoragePointer>) -> IModelWithSimpleArrayDispatcherSubPointersMut { - let base_address = self.__storage_pointer_address__; - let mut current_offset = self.__storage_pointer_offset__; - let __contract_address_value__ = starknet::storage::StoragePointer { - __storage_pointer_address__: base_address, - __storage_pointer_offset__: current_offset, - }; - IModelWithSimpleArrayDispatcherSubPointersMut { - contract_address: __contract_address_value__, - } - } -} -impl IModelWithSimpleArrayLibraryDispatcherCopy of core::traits::Copy::; -impl IModelWithSimpleArrayLibraryDispatcherDrop of core::traits::Drop::; -impl IModelWithSimpleArrayLibraryDispatcherSerde of core::serde::Serde:: { - fn serialize(self: @IModelWithSimpleArrayLibraryDispatcher, ref output: core::array::Array) { - core::serde::Serde::serialize(self.class_hash, ref output) - } - fn deserialize(ref serialized: core::array::Span) -> core::option::Option { - core::option::Option::Some(IModelWithSimpleArrayLibraryDispatcher { - class_hash: core::serde::Serde::deserialize(ref serialized)?, - }) - } -} -impl StoreIModelWithSimpleArrayLibraryDispatcher of starknet::Store:: { - fn read(address_domain: u32, base: starknet::storage_access::StorageBaseAddress) -> starknet::SyscallResult { - let class_hash = starknet::Store::::read(address_domain, base)?; - starknet::SyscallResult::Ok( - IModelWithSimpleArrayLibraryDispatcher { - class_hash, - } - ) - } - fn write(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, value: IModelWithSimpleArrayLibraryDispatcher) -> starknet::SyscallResult<()> { - starknet::Store::::write(address_domain, base, value.class_hash)?; - starknet::SyscallResult::Ok(()) - } - fn read_at_offset(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, offset: u8) -> starknet::SyscallResult { - let class_hash = starknet::Store::::read_at_offset(address_domain, base, offset)?; - starknet::SyscallResult::Ok( - IModelWithSimpleArrayLibraryDispatcher { - class_hash, - } - ) - } - #[inline(always)] - fn write_at_offset(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, offset: u8, value: IModelWithSimpleArrayLibraryDispatcher) -> starknet::SyscallResult<()> { - starknet::Store::::write_at_offset(address_domain, base, offset, value.class_hash)?; - starknet::SyscallResult::Ok(()) - } - #[inline(always)] - fn size() -> u8 { - starknet::Store::::size() - } -} - -#[derive(Drop, Copy)] -pub struct IModelWithSimpleArrayLibraryDispatcherSubPointers { - pub class_hash: starknet::storage::StoragePointer, -} -impl IModelWithSimpleArrayLibraryDispatcherSubPointersImpl of starknet::storage::SubPointers { - type SubPointersType = IModelWithSimpleArrayLibraryDispatcherSubPointers; - fn sub_pointers(self: starknet::storage::StoragePointer) -> IModelWithSimpleArrayLibraryDispatcherSubPointers { - let base_address = self.__storage_pointer_address__; - let mut current_offset = self.__storage_pointer_offset__; - let __class_hash_value__ = starknet::storage::StoragePointer { - __storage_pointer_address__: base_address, - __storage_pointer_offset__: current_offset, - }; - IModelWithSimpleArrayLibraryDispatcherSubPointers { - class_hash: __class_hash_value__, - } - } -} -#[derive(Drop, Copy)] -pub struct IModelWithSimpleArrayLibraryDispatcherSubPointersMut { - pub class_hash: starknet::storage::StoragePointer>, -} -impl IModelWithSimpleArrayLibraryDispatcherSubPointersMutImpl of starknet::storage::SubPointersMut { - type SubPointersType = IModelWithSimpleArrayLibraryDispatcherSubPointersMut; - fn sub_pointers_mut(self: starknet::storage::StoragePointer>) -> IModelWithSimpleArrayLibraryDispatcherSubPointersMut { - let base_address = self.__storage_pointer_address__; - let mut current_offset = self.__storage_pointer_offset__; - let __class_hash_value__ = starknet::storage::StoragePointer { - __storage_pointer_address__: base_address, - __storage_pointer_offset__: current_offset, - }; - IModelWithSimpleArrayLibraryDispatcherSubPointersMut { - class_hash: __class_hash_value__, - } - } -} -impl IModelWithSimpleArraySafeLibraryDispatcherCopy of core::traits::Copy::; -impl IModelWithSimpleArraySafeLibraryDispatcherDrop of core::traits::Drop::; -impl IModelWithSimpleArraySafeLibraryDispatcherSerde of core::serde::Serde:: { - fn serialize(self: @IModelWithSimpleArraySafeLibraryDispatcher, ref output: core::array::Array) { - core::serde::Serde::serialize(self.class_hash, ref output) - } - fn deserialize(ref serialized: core::array::Span) -> core::option::Option { - core::option::Option::Some(IModelWithSimpleArraySafeLibraryDispatcher { - class_hash: core::serde::Serde::deserialize(ref serialized)?, - }) - } -} -impl StoreIModelWithSimpleArraySafeLibraryDispatcher of starknet::Store:: { - fn read(address_domain: u32, base: starknet::storage_access::StorageBaseAddress) -> starknet::SyscallResult { - let class_hash = starknet::Store::::read(address_domain, base)?; - starknet::SyscallResult::Ok( - IModelWithSimpleArraySafeLibraryDispatcher { - class_hash, - } - ) - } - fn write(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, value: IModelWithSimpleArraySafeLibraryDispatcher) -> starknet::SyscallResult<()> { - starknet::Store::::write(address_domain, base, value.class_hash)?; - starknet::SyscallResult::Ok(()) - } - fn read_at_offset(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, offset: u8) -> starknet::SyscallResult { - let class_hash = starknet::Store::::read_at_offset(address_domain, base, offset)?; - starknet::SyscallResult::Ok( - IModelWithSimpleArraySafeLibraryDispatcher { - class_hash, - } - ) - } - #[inline(always)] - fn write_at_offset(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, offset: u8, value: IModelWithSimpleArraySafeLibraryDispatcher) -> starknet::SyscallResult<()> { - starknet::Store::::write_at_offset(address_domain, base, offset, value.class_hash)?; - starknet::SyscallResult::Ok(()) - } - #[inline(always)] - fn size() -> u8 { - starknet::Store::::size() - } -} - -#[derive(Drop, Copy)] -pub struct IModelWithSimpleArraySafeLibraryDispatcherSubPointers { - pub class_hash: starknet::storage::StoragePointer, -} -impl IModelWithSimpleArraySafeLibraryDispatcherSubPointersImpl of starknet::storage::SubPointers { - type SubPointersType = IModelWithSimpleArraySafeLibraryDispatcherSubPointers; - fn sub_pointers(self: starknet::storage::StoragePointer) -> IModelWithSimpleArraySafeLibraryDispatcherSubPointers { - let base_address = self.__storage_pointer_address__; - let mut current_offset = self.__storage_pointer_offset__; - let __class_hash_value__ = starknet::storage::StoragePointer { - __storage_pointer_address__: base_address, - __storage_pointer_offset__: current_offset, - }; - IModelWithSimpleArraySafeLibraryDispatcherSubPointers { - class_hash: __class_hash_value__, - } - } -} -#[derive(Drop, Copy)] -pub struct IModelWithSimpleArraySafeLibraryDispatcherSubPointersMut { - pub class_hash: starknet::storage::StoragePointer>, -} -impl IModelWithSimpleArraySafeLibraryDispatcherSubPointersMutImpl of starknet::storage::SubPointersMut { - type SubPointersType = IModelWithSimpleArraySafeLibraryDispatcherSubPointersMut; - fn sub_pointers_mut(self: starknet::storage::StoragePointer>) -> IModelWithSimpleArraySafeLibraryDispatcherSubPointersMut { - let base_address = self.__storage_pointer_address__; - let mut current_offset = self.__storage_pointer_offset__; - let __class_hash_value__ = starknet::storage::StoragePointer { - __storage_pointer_address__: base_address, - __storage_pointer_offset__: current_offset, - }; - IModelWithSimpleArraySafeLibraryDispatcherSubPointersMut { - class_hash: __class_hash_value__, - } - } -} -impl IModelWithSimpleArraySafeDispatcherCopy of core::traits::Copy::; -impl IModelWithSimpleArraySafeDispatcherDrop of core::traits::Drop::; -impl IModelWithSimpleArraySafeDispatcherSerde of core::serde::Serde:: { - fn serialize(self: @IModelWithSimpleArraySafeDispatcher, ref output: core::array::Array) { - core::serde::Serde::serialize(self.contract_address, ref output) - } - fn deserialize(ref serialized: core::array::Span) -> core::option::Option { - core::option::Option::Some(IModelWithSimpleArraySafeDispatcher { - contract_address: core::serde::Serde::deserialize(ref serialized)?, - }) - } -} -impl StoreIModelWithSimpleArraySafeDispatcher of starknet::Store:: { - fn read(address_domain: u32, base: starknet::storage_access::StorageBaseAddress) -> starknet::SyscallResult { - let contract_address = starknet::Store::::read(address_domain, base)?; - starknet::SyscallResult::Ok( - IModelWithSimpleArraySafeDispatcher { - contract_address, - } - ) - } - fn write(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, value: IModelWithSimpleArraySafeDispatcher) -> starknet::SyscallResult<()> { - starknet::Store::::write(address_domain, base, value.contract_address)?; - starknet::SyscallResult::Ok(()) - } - fn read_at_offset(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, offset: u8) -> starknet::SyscallResult { - let contract_address = starknet::Store::::read_at_offset(address_domain, base, offset)?; - starknet::SyscallResult::Ok( - IModelWithSimpleArraySafeDispatcher { - contract_address, - } - ) - } - #[inline(always)] - fn write_at_offset(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, offset: u8, value: IModelWithSimpleArraySafeDispatcher) -> starknet::SyscallResult<()> { - starknet::Store::::write_at_offset(address_domain, base, offset, value.contract_address)?; - starknet::SyscallResult::Ok(()) - } - #[inline(always)] - fn size() -> u8 { - starknet::Store::::size() - } -} - -#[derive(Drop, Copy)] -pub struct IModelWithSimpleArraySafeDispatcherSubPointers { - pub contract_address: starknet::storage::StoragePointer, -} -impl IModelWithSimpleArraySafeDispatcherSubPointersImpl of starknet::storage::SubPointers { - type SubPointersType = IModelWithSimpleArraySafeDispatcherSubPointers; - fn sub_pointers(self: starknet::storage::StoragePointer) -> IModelWithSimpleArraySafeDispatcherSubPointers { - let base_address = self.__storage_pointer_address__; - let mut current_offset = self.__storage_pointer_offset__; - let __contract_address_value__ = starknet::storage::StoragePointer { - __storage_pointer_address__: base_address, - __storage_pointer_offset__: current_offset, - }; - IModelWithSimpleArraySafeDispatcherSubPointers { - contract_address: __contract_address_value__, - } - } -} -#[derive(Drop, Copy)] -pub struct IModelWithSimpleArraySafeDispatcherSubPointersMut { - pub contract_address: starknet::storage::StoragePointer>, -} -impl IModelWithSimpleArraySafeDispatcherSubPointersMutImpl of starknet::storage::SubPointersMut { - type SubPointersType = IModelWithSimpleArraySafeDispatcherSubPointersMut; - fn sub_pointers_mut(self: starknet::storage::StoragePointer>) -> IModelWithSimpleArraySafeDispatcherSubPointersMut { - let base_address = self.__storage_pointer_address__; - let mut current_offset = self.__storage_pointer_offset__; - let __contract_address_value__ = starknet::storage::StoragePointer { - __storage_pointer_address__: base_address, - __storage_pointer_offset__: current_offset, - }; - IModelWithSimpleArraySafeDispatcherSubPointersMut { - contract_address: __contract_address_value__, - } - } -} -impl IModelWithByteArrayDispatcherCopy of core::traits::Copy::; -impl IModelWithByteArrayDispatcherDrop of core::traits::Drop::; -impl IModelWithByteArrayDispatcherSerde of core::serde::Serde:: { - fn serialize(self: @IModelWithByteArrayDispatcher, ref output: core::array::Array) { - core::serde::Serde::serialize(self.contract_address, ref output) - } - fn deserialize(ref serialized: core::array::Span) -> core::option::Option { - core::option::Option::Some(IModelWithByteArrayDispatcher { - contract_address: core::serde::Serde::deserialize(ref serialized)?, - }) - } -} -impl StoreIModelWithByteArrayDispatcher of starknet::Store:: { - fn read(address_domain: u32, base: starknet::storage_access::StorageBaseAddress) -> starknet::SyscallResult { - let contract_address = starknet::Store::::read(address_domain, base)?; - starknet::SyscallResult::Ok( - IModelWithByteArrayDispatcher { - contract_address, - } - ) - } - fn write(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, value: IModelWithByteArrayDispatcher) -> starknet::SyscallResult<()> { - starknet::Store::::write(address_domain, base, value.contract_address)?; - starknet::SyscallResult::Ok(()) - } - fn read_at_offset(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, offset: u8) -> starknet::SyscallResult { - let contract_address = starknet::Store::::read_at_offset(address_domain, base, offset)?; - starknet::SyscallResult::Ok( - IModelWithByteArrayDispatcher { - contract_address, - } - ) - } - #[inline(always)] - fn write_at_offset(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, offset: u8, value: IModelWithByteArrayDispatcher) -> starknet::SyscallResult<()> { - starknet::Store::::write_at_offset(address_domain, base, offset, value.contract_address)?; - starknet::SyscallResult::Ok(()) - } - #[inline(always)] - fn size() -> u8 { - starknet::Store::::size() - } -} - -#[derive(Drop, Copy)] -pub struct IModelWithByteArrayDispatcherSubPointers { - pub contract_address: starknet::storage::StoragePointer, -} -impl IModelWithByteArrayDispatcherSubPointersImpl of starknet::storage::SubPointers { - type SubPointersType = IModelWithByteArrayDispatcherSubPointers; - fn sub_pointers(self: starknet::storage::StoragePointer) -> IModelWithByteArrayDispatcherSubPointers { - let base_address = self.__storage_pointer_address__; - let mut current_offset = self.__storage_pointer_offset__; - let __contract_address_value__ = starknet::storage::StoragePointer { - __storage_pointer_address__: base_address, - __storage_pointer_offset__: current_offset, - }; - IModelWithByteArrayDispatcherSubPointers { - contract_address: __contract_address_value__, - } - } -} -#[derive(Drop, Copy)] -pub struct IModelWithByteArrayDispatcherSubPointersMut { - pub contract_address: starknet::storage::StoragePointer>, -} -impl IModelWithByteArrayDispatcherSubPointersMutImpl of starknet::storage::SubPointersMut { - type SubPointersType = IModelWithByteArrayDispatcherSubPointersMut; - fn sub_pointers_mut(self: starknet::storage::StoragePointer>) -> IModelWithByteArrayDispatcherSubPointersMut { - let base_address = self.__storage_pointer_address__; - let mut current_offset = self.__storage_pointer_offset__; - let __contract_address_value__ = starknet::storage::StoragePointer { - __storage_pointer_address__: base_address, - __storage_pointer_offset__: current_offset, - }; - IModelWithByteArrayDispatcherSubPointersMut { - contract_address: __contract_address_value__, - } - } -} -impl IModelWithByteArrayLibraryDispatcherCopy of core::traits::Copy::; -impl IModelWithByteArrayLibraryDispatcherDrop of core::traits::Drop::; -impl IModelWithByteArrayLibraryDispatcherSerde of core::serde::Serde:: { - fn serialize(self: @IModelWithByteArrayLibraryDispatcher, ref output: core::array::Array) { - core::serde::Serde::serialize(self.class_hash, ref output) - } - fn deserialize(ref serialized: core::array::Span) -> core::option::Option { - core::option::Option::Some(IModelWithByteArrayLibraryDispatcher { - class_hash: core::serde::Serde::deserialize(ref serialized)?, - }) - } -} -impl StoreIModelWithByteArrayLibraryDispatcher of starknet::Store:: { - fn read(address_domain: u32, base: starknet::storage_access::StorageBaseAddress) -> starknet::SyscallResult { - let class_hash = starknet::Store::::read(address_domain, base)?; - starknet::SyscallResult::Ok( - IModelWithByteArrayLibraryDispatcher { - class_hash, - } - ) - } - fn write(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, value: IModelWithByteArrayLibraryDispatcher) -> starknet::SyscallResult<()> { - starknet::Store::::write(address_domain, base, value.class_hash)?; - starknet::SyscallResult::Ok(()) - } - fn read_at_offset(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, offset: u8) -> starknet::SyscallResult { - let class_hash = starknet::Store::::read_at_offset(address_domain, base, offset)?; - starknet::SyscallResult::Ok( - IModelWithByteArrayLibraryDispatcher { - class_hash, - } - ) - } - #[inline(always)] - fn write_at_offset(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, offset: u8, value: IModelWithByteArrayLibraryDispatcher) -> starknet::SyscallResult<()> { - starknet::Store::::write_at_offset(address_domain, base, offset, value.class_hash)?; - starknet::SyscallResult::Ok(()) - } - #[inline(always)] - fn size() -> u8 { - starknet::Store::::size() - } -} - -#[derive(Drop, Copy)] -pub struct IModelWithByteArrayLibraryDispatcherSubPointers { - pub class_hash: starknet::storage::StoragePointer, -} -impl IModelWithByteArrayLibraryDispatcherSubPointersImpl of starknet::storage::SubPointers { - type SubPointersType = IModelWithByteArrayLibraryDispatcherSubPointers; - fn sub_pointers(self: starknet::storage::StoragePointer) -> IModelWithByteArrayLibraryDispatcherSubPointers { - let base_address = self.__storage_pointer_address__; - let mut current_offset = self.__storage_pointer_offset__; - let __class_hash_value__ = starknet::storage::StoragePointer { - __storage_pointer_address__: base_address, - __storage_pointer_offset__: current_offset, - }; - IModelWithByteArrayLibraryDispatcherSubPointers { - class_hash: __class_hash_value__, - } - } -} -#[derive(Drop, Copy)] -pub struct IModelWithByteArrayLibraryDispatcherSubPointersMut { - pub class_hash: starknet::storage::StoragePointer>, -} -impl IModelWithByteArrayLibraryDispatcherSubPointersMutImpl of starknet::storage::SubPointersMut { - type SubPointersType = IModelWithByteArrayLibraryDispatcherSubPointersMut; - fn sub_pointers_mut(self: starknet::storage::StoragePointer>) -> IModelWithByteArrayLibraryDispatcherSubPointersMut { - let base_address = self.__storage_pointer_address__; - let mut current_offset = self.__storage_pointer_offset__; - let __class_hash_value__ = starknet::storage::StoragePointer { - __storage_pointer_address__: base_address, - __storage_pointer_offset__: current_offset, - }; - IModelWithByteArrayLibraryDispatcherSubPointersMut { - class_hash: __class_hash_value__, - } - } -} -impl IModelWithByteArraySafeLibraryDispatcherCopy of core::traits::Copy::; -impl IModelWithByteArraySafeLibraryDispatcherDrop of core::traits::Drop::; -impl IModelWithByteArraySafeLibraryDispatcherSerde of core::serde::Serde:: { - fn serialize(self: @IModelWithByteArraySafeLibraryDispatcher, ref output: core::array::Array) { - core::serde::Serde::serialize(self.class_hash, ref output) - } - fn deserialize(ref serialized: core::array::Span) -> core::option::Option { - core::option::Option::Some(IModelWithByteArraySafeLibraryDispatcher { - class_hash: core::serde::Serde::deserialize(ref serialized)?, - }) - } -} -impl StoreIModelWithByteArraySafeLibraryDispatcher of starknet::Store:: { - fn read(address_domain: u32, base: starknet::storage_access::StorageBaseAddress) -> starknet::SyscallResult { - let class_hash = starknet::Store::::read(address_domain, base)?; - starknet::SyscallResult::Ok( - IModelWithByteArraySafeLibraryDispatcher { - class_hash, - } - ) - } - fn write(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, value: IModelWithByteArraySafeLibraryDispatcher) -> starknet::SyscallResult<()> { - starknet::Store::::write(address_domain, base, value.class_hash)?; - starknet::SyscallResult::Ok(()) - } - fn read_at_offset(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, offset: u8) -> starknet::SyscallResult { - let class_hash = starknet::Store::::read_at_offset(address_domain, base, offset)?; - starknet::SyscallResult::Ok( - IModelWithByteArraySafeLibraryDispatcher { - class_hash, - } - ) - } - #[inline(always)] - fn write_at_offset(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, offset: u8, value: IModelWithByteArraySafeLibraryDispatcher) -> starknet::SyscallResult<()> { - starknet::Store::::write_at_offset(address_domain, base, offset, value.class_hash)?; - starknet::SyscallResult::Ok(()) - } - #[inline(always)] - fn size() -> u8 { - starknet::Store::::size() - } -} - -#[derive(Drop, Copy)] -pub struct IModelWithByteArraySafeLibraryDispatcherSubPointers { - pub class_hash: starknet::storage::StoragePointer, -} -impl IModelWithByteArraySafeLibraryDispatcherSubPointersImpl of starknet::storage::SubPointers { - type SubPointersType = IModelWithByteArraySafeLibraryDispatcherSubPointers; - fn sub_pointers(self: starknet::storage::StoragePointer) -> IModelWithByteArraySafeLibraryDispatcherSubPointers { - let base_address = self.__storage_pointer_address__; - let mut current_offset = self.__storage_pointer_offset__; - let __class_hash_value__ = starknet::storage::StoragePointer { - __storage_pointer_address__: base_address, - __storage_pointer_offset__: current_offset, - }; - IModelWithByteArraySafeLibraryDispatcherSubPointers { - class_hash: __class_hash_value__, - } - } -} -#[derive(Drop, Copy)] -pub struct IModelWithByteArraySafeLibraryDispatcherSubPointersMut { - pub class_hash: starknet::storage::StoragePointer>, -} -impl IModelWithByteArraySafeLibraryDispatcherSubPointersMutImpl of starknet::storage::SubPointersMut { - type SubPointersType = IModelWithByteArraySafeLibraryDispatcherSubPointersMut; - fn sub_pointers_mut(self: starknet::storage::StoragePointer>) -> IModelWithByteArraySafeLibraryDispatcherSubPointersMut { - let base_address = self.__storage_pointer_address__; - let mut current_offset = self.__storage_pointer_offset__; - let __class_hash_value__ = starknet::storage::StoragePointer { - __storage_pointer_address__: base_address, - __storage_pointer_offset__: current_offset, - }; - IModelWithByteArraySafeLibraryDispatcherSubPointersMut { - class_hash: __class_hash_value__, - } - } -} -impl IModelWithByteArraySafeDispatcherCopy of core::traits::Copy::; -impl IModelWithByteArraySafeDispatcherDrop of core::traits::Drop::; -impl IModelWithByteArraySafeDispatcherSerde of core::serde::Serde:: { - fn serialize(self: @IModelWithByteArraySafeDispatcher, ref output: core::array::Array) { - core::serde::Serde::serialize(self.contract_address, ref output) - } - fn deserialize(ref serialized: core::array::Span) -> core::option::Option { - core::option::Option::Some(IModelWithByteArraySafeDispatcher { - contract_address: core::serde::Serde::deserialize(ref serialized)?, - }) - } -} -impl StoreIModelWithByteArraySafeDispatcher of starknet::Store:: { - fn read(address_domain: u32, base: starknet::storage_access::StorageBaseAddress) -> starknet::SyscallResult { - let contract_address = starknet::Store::::read(address_domain, base)?; - starknet::SyscallResult::Ok( - IModelWithByteArraySafeDispatcher { - contract_address, - } - ) - } - fn write(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, value: IModelWithByteArraySafeDispatcher) -> starknet::SyscallResult<()> { - starknet::Store::::write(address_domain, base, value.contract_address)?; - starknet::SyscallResult::Ok(()) - } - fn read_at_offset(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, offset: u8) -> starknet::SyscallResult { - let contract_address = starknet::Store::::read_at_offset(address_domain, base, offset)?; - starknet::SyscallResult::Ok( - IModelWithByteArraySafeDispatcher { - contract_address, - } - ) - } - #[inline(always)] - fn write_at_offset(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, offset: u8, value: IModelWithByteArraySafeDispatcher) -> starknet::SyscallResult<()> { - starknet::Store::::write_at_offset(address_domain, base, offset, value.contract_address)?; - starknet::SyscallResult::Ok(()) - } - #[inline(always)] - fn size() -> u8 { - starknet::Store::::size() - } -} - -#[derive(Drop, Copy)] -pub struct IModelWithByteArraySafeDispatcherSubPointers { - pub contract_address: starknet::storage::StoragePointer, -} -impl IModelWithByteArraySafeDispatcherSubPointersImpl of starknet::storage::SubPointers { - type SubPointersType = IModelWithByteArraySafeDispatcherSubPointers; - fn sub_pointers(self: starknet::storage::StoragePointer) -> IModelWithByteArraySafeDispatcherSubPointers { - let base_address = self.__storage_pointer_address__; - let mut current_offset = self.__storage_pointer_offset__; - let __contract_address_value__ = starknet::storage::StoragePointer { - __storage_pointer_address__: base_address, - __storage_pointer_offset__: current_offset, - }; - IModelWithByteArraySafeDispatcherSubPointers { - contract_address: __contract_address_value__, - } - } -} -#[derive(Drop, Copy)] -pub struct IModelWithByteArraySafeDispatcherSubPointersMut { - pub contract_address: starknet::storage::StoragePointer>, -} -impl IModelWithByteArraySafeDispatcherSubPointersMutImpl of starknet::storage::SubPointersMut { - type SubPointersType = IModelWithByteArraySafeDispatcherSubPointersMut; - fn sub_pointers_mut(self: starknet::storage::StoragePointer>) -> IModelWithByteArraySafeDispatcherSubPointersMut { - let base_address = self.__storage_pointer_address__; - let mut current_offset = self.__storage_pointer_offset__; - let __contract_address_value__ = starknet::storage::StoragePointer { - __storage_pointer_address__: base_address, - __storage_pointer_offset__: current_offset, - }; - IModelWithByteArraySafeDispatcherSubPointersMut { - contract_address: __contract_address_value__, - } - } -} -impl IModelWithComplexArrayDispatcherCopy of core::traits::Copy::; -impl IModelWithComplexArrayDispatcherDrop of core::traits::Drop::; -impl IModelWithComplexArrayDispatcherSerde of core::serde::Serde:: { - fn serialize(self: @IModelWithComplexArrayDispatcher, ref output: core::array::Array) { - core::serde::Serde::serialize(self.contract_address, ref output) - } - fn deserialize(ref serialized: core::array::Span) -> core::option::Option { - core::option::Option::Some(IModelWithComplexArrayDispatcher { - contract_address: core::serde::Serde::deserialize(ref serialized)?, - }) - } -} -impl StoreIModelWithComplexArrayDispatcher of starknet::Store:: { - fn read(address_domain: u32, base: starknet::storage_access::StorageBaseAddress) -> starknet::SyscallResult { - let contract_address = starknet::Store::::read(address_domain, base)?; - starknet::SyscallResult::Ok( - IModelWithComplexArrayDispatcher { - contract_address, - } - ) - } - fn write(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, value: IModelWithComplexArrayDispatcher) -> starknet::SyscallResult<()> { - starknet::Store::::write(address_domain, base, value.contract_address)?; - starknet::SyscallResult::Ok(()) - } - fn read_at_offset(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, offset: u8) -> starknet::SyscallResult { - let contract_address = starknet::Store::::read_at_offset(address_domain, base, offset)?; - starknet::SyscallResult::Ok( - IModelWithComplexArrayDispatcher { - contract_address, - } - ) - } - #[inline(always)] - fn write_at_offset(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, offset: u8, value: IModelWithComplexArrayDispatcher) -> starknet::SyscallResult<()> { - starknet::Store::::write_at_offset(address_domain, base, offset, value.contract_address)?; - starknet::SyscallResult::Ok(()) - } - #[inline(always)] - fn size() -> u8 { - starknet::Store::::size() - } -} - -#[derive(Drop, Copy)] -pub struct IModelWithComplexArrayDispatcherSubPointers { - pub contract_address: starknet::storage::StoragePointer, -} -impl IModelWithComplexArrayDispatcherSubPointersImpl of starknet::storage::SubPointers { - type SubPointersType = IModelWithComplexArrayDispatcherSubPointers; - fn sub_pointers(self: starknet::storage::StoragePointer) -> IModelWithComplexArrayDispatcherSubPointers { - let base_address = self.__storage_pointer_address__; - let mut current_offset = self.__storage_pointer_offset__; - let __contract_address_value__ = starknet::storage::StoragePointer { - __storage_pointer_address__: base_address, - __storage_pointer_offset__: current_offset, - }; - IModelWithComplexArrayDispatcherSubPointers { - contract_address: __contract_address_value__, - } - } -} -#[derive(Drop, Copy)] -pub struct IModelWithComplexArrayDispatcherSubPointersMut { - pub contract_address: starknet::storage::StoragePointer>, -} -impl IModelWithComplexArrayDispatcherSubPointersMutImpl of starknet::storage::SubPointersMut { - type SubPointersType = IModelWithComplexArrayDispatcherSubPointersMut; - fn sub_pointers_mut(self: starknet::storage::StoragePointer>) -> IModelWithComplexArrayDispatcherSubPointersMut { - let base_address = self.__storage_pointer_address__; - let mut current_offset = self.__storage_pointer_offset__; - let __contract_address_value__ = starknet::storage::StoragePointer { - __storage_pointer_address__: base_address, - __storage_pointer_offset__: current_offset, - }; - IModelWithComplexArrayDispatcherSubPointersMut { - contract_address: __contract_address_value__, - } - } -} -impl IModelWithComplexArrayLibraryDispatcherCopy of core::traits::Copy::; -impl IModelWithComplexArrayLibraryDispatcherDrop of core::traits::Drop::; -impl IModelWithComplexArrayLibraryDispatcherSerde of core::serde::Serde:: { - fn serialize(self: @IModelWithComplexArrayLibraryDispatcher, ref output: core::array::Array) { - core::serde::Serde::serialize(self.class_hash, ref output) - } - fn deserialize(ref serialized: core::array::Span) -> core::option::Option { - core::option::Option::Some(IModelWithComplexArrayLibraryDispatcher { - class_hash: core::serde::Serde::deserialize(ref serialized)?, - }) - } -} -impl StoreIModelWithComplexArrayLibraryDispatcher of starknet::Store:: { - fn read(address_domain: u32, base: starknet::storage_access::StorageBaseAddress) -> starknet::SyscallResult { - let class_hash = starknet::Store::::read(address_domain, base)?; - starknet::SyscallResult::Ok( - IModelWithComplexArrayLibraryDispatcher { - class_hash, - } - ) - } - fn write(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, value: IModelWithComplexArrayLibraryDispatcher) -> starknet::SyscallResult<()> { - starknet::Store::::write(address_domain, base, value.class_hash)?; - starknet::SyscallResult::Ok(()) - } - fn read_at_offset(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, offset: u8) -> starknet::SyscallResult { - let class_hash = starknet::Store::::read_at_offset(address_domain, base, offset)?; - starknet::SyscallResult::Ok( - IModelWithComplexArrayLibraryDispatcher { - class_hash, - } - ) - } - #[inline(always)] - fn write_at_offset(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, offset: u8, value: IModelWithComplexArrayLibraryDispatcher) -> starknet::SyscallResult<()> { - starknet::Store::::write_at_offset(address_domain, base, offset, value.class_hash)?; - starknet::SyscallResult::Ok(()) - } - #[inline(always)] - fn size() -> u8 { - starknet::Store::::size() - } -} - -#[derive(Drop, Copy)] -pub struct IModelWithComplexArrayLibraryDispatcherSubPointers { - pub class_hash: starknet::storage::StoragePointer, -} -impl IModelWithComplexArrayLibraryDispatcherSubPointersImpl of starknet::storage::SubPointers { - type SubPointersType = IModelWithComplexArrayLibraryDispatcherSubPointers; - fn sub_pointers(self: starknet::storage::StoragePointer) -> IModelWithComplexArrayLibraryDispatcherSubPointers { - let base_address = self.__storage_pointer_address__; - let mut current_offset = self.__storage_pointer_offset__; - let __class_hash_value__ = starknet::storage::StoragePointer { - __storage_pointer_address__: base_address, - __storage_pointer_offset__: current_offset, - }; - IModelWithComplexArrayLibraryDispatcherSubPointers { - class_hash: __class_hash_value__, - } - } -} -#[derive(Drop, Copy)] -pub struct IModelWithComplexArrayLibraryDispatcherSubPointersMut { - pub class_hash: starknet::storage::StoragePointer>, -} -impl IModelWithComplexArrayLibraryDispatcherSubPointersMutImpl of starknet::storage::SubPointersMut { - type SubPointersType = IModelWithComplexArrayLibraryDispatcherSubPointersMut; - fn sub_pointers_mut(self: starknet::storage::StoragePointer>) -> IModelWithComplexArrayLibraryDispatcherSubPointersMut { - let base_address = self.__storage_pointer_address__; - let mut current_offset = self.__storage_pointer_offset__; - let __class_hash_value__ = starknet::storage::StoragePointer { - __storage_pointer_address__: base_address, - __storage_pointer_offset__: current_offset, - }; - IModelWithComplexArrayLibraryDispatcherSubPointersMut { - class_hash: __class_hash_value__, - } - } -} -impl IModelWithComplexArraySafeLibraryDispatcherCopy of core::traits::Copy::; -impl IModelWithComplexArraySafeLibraryDispatcherDrop of core::traits::Drop::; -impl IModelWithComplexArraySafeLibraryDispatcherSerde of core::serde::Serde:: { - fn serialize(self: @IModelWithComplexArraySafeLibraryDispatcher, ref output: core::array::Array) { - core::serde::Serde::serialize(self.class_hash, ref output) - } - fn deserialize(ref serialized: core::array::Span) -> core::option::Option { - core::option::Option::Some(IModelWithComplexArraySafeLibraryDispatcher { - class_hash: core::serde::Serde::deserialize(ref serialized)?, - }) - } -} -impl StoreIModelWithComplexArraySafeLibraryDispatcher of starknet::Store:: { - fn read(address_domain: u32, base: starknet::storage_access::StorageBaseAddress) -> starknet::SyscallResult { - let class_hash = starknet::Store::::read(address_domain, base)?; - starknet::SyscallResult::Ok( - IModelWithComplexArraySafeLibraryDispatcher { - class_hash, - } - ) - } - fn write(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, value: IModelWithComplexArraySafeLibraryDispatcher) -> starknet::SyscallResult<()> { - starknet::Store::::write(address_domain, base, value.class_hash)?; - starknet::SyscallResult::Ok(()) - } - fn read_at_offset(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, offset: u8) -> starknet::SyscallResult { - let class_hash = starknet::Store::::read_at_offset(address_domain, base, offset)?; - starknet::SyscallResult::Ok( - IModelWithComplexArraySafeLibraryDispatcher { - class_hash, - } - ) - } - #[inline(always)] - fn write_at_offset(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, offset: u8, value: IModelWithComplexArraySafeLibraryDispatcher) -> starknet::SyscallResult<()> { - starknet::Store::::write_at_offset(address_domain, base, offset, value.class_hash)?; - starknet::SyscallResult::Ok(()) - } - #[inline(always)] - fn size() -> u8 { - starknet::Store::::size() - } -} - -#[derive(Drop, Copy)] -pub struct IModelWithComplexArraySafeLibraryDispatcherSubPointers { - pub class_hash: starknet::storage::StoragePointer, -} -impl IModelWithComplexArraySafeLibraryDispatcherSubPointersImpl of starknet::storage::SubPointers { - type SubPointersType = IModelWithComplexArraySafeLibraryDispatcherSubPointers; - fn sub_pointers(self: starknet::storage::StoragePointer) -> IModelWithComplexArraySafeLibraryDispatcherSubPointers { - let base_address = self.__storage_pointer_address__; - let mut current_offset = self.__storage_pointer_offset__; - let __class_hash_value__ = starknet::storage::StoragePointer { - __storage_pointer_address__: base_address, - __storage_pointer_offset__: current_offset, - }; - IModelWithComplexArraySafeLibraryDispatcherSubPointers { - class_hash: __class_hash_value__, - } - } -} -#[derive(Drop, Copy)] -pub struct IModelWithComplexArraySafeLibraryDispatcherSubPointersMut { - pub class_hash: starknet::storage::StoragePointer>, -} -impl IModelWithComplexArraySafeLibraryDispatcherSubPointersMutImpl of starknet::storage::SubPointersMut { - type SubPointersType = IModelWithComplexArraySafeLibraryDispatcherSubPointersMut; - fn sub_pointers_mut(self: starknet::storage::StoragePointer>) -> IModelWithComplexArraySafeLibraryDispatcherSubPointersMut { - let base_address = self.__storage_pointer_address__; - let mut current_offset = self.__storage_pointer_offset__; - let __class_hash_value__ = starknet::storage::StoragePointer { - __storage_pointer_address__: base_address, - __storage_pointer_offset__: current_offset, - }; - IModelWithComplexArraySafeLibraryDispatcherSubPointersMut { - class_hash: __class_hash_value__, - } - } -} -impl IModelWithComplexArraySafeDispatcherCopy of core::traits::Copy::; -impl IModelWithComplexArraySafeDispatcherDrop of core::traits::Drop::; -impl IModelWithComplexArraySafeDispatcherSerde of core::serde::Serde:: { - fn serialize(self: @IModelWithComplexArraySafeDispatcher, ref output: core::array::Array) { - core::serde::Serde::serialize(self.contract_address, ref output) - } - fn deserialize(ref serialized: core::array::Span) -> core::option::Option { - core::option::Option::Some(IModelWithComplexArraySafeDispatcher { - contract_address: core::serde::Serde::deserialize(ref serialized)?, - }) - } -} -impl StoreIModelWithComplexArraySafeDispatcher of starknet::Store:: { - fn read(address_domain: u32, base: starknet::storage_access::StorageBaseAddress) -> starknet::SyscallResult { - let contract_address = starknet::Store::::read(address_domain, base)?; - starknet::SyscallResult::Ok( - IModelWithComplexArraySafeDispatcher { - contract_address, - } - ) - } - fn write(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, value: IModelWithComplexArraySafeDispatcher) -> starknet::SyscallResult<()> { - starknet::Store::::write(address_domain, base, value.contract_address)?; - starknet::SyscallResult::Ok(()) - } - fn read_at_offset(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, offset: u8) -> starknet::SyscallResult { - let contract_address = starknet::Store::::read_at_offset(address_domain, base, offset)?; - starknet::SyscallResult::Ok( - IModelWithComplexArraySafeDispatcher { - contract_address, - } - ) - } - #[inline(always)] - fn write_at_offset(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, offset: u8, value: IModelWithComplexArraySafeDispatcher) -> starknet::SyscallResult<()> { - starknet::Store::::write_at_offset(address_domain, base, offset, value.contract_address)?; - starknet::SyscallResult::Ok(()) - } - #[inline(always)] - fn size() -> u8 { - starknet::Store::::size() - } -} - -#[derive(Drop, Copy)] -pub struct IModelWithComplexArraySafeDispatcherSubPointers { - pub contract_address: starknet::storage::StoragePointer, -} -impl IModelWithComplexArraySafeDispatcherSubPointersImpl of starknet::storage::SubPointers { - type SubPointersType = IModelWithComplexArraySafeDispatcherSubPointers; - fn sub_pointers(self: starknet::storage::StoragePointer) -> IModelWithComplexArraySafeDispatcherSubPointers { - let base_address = self.__storage_pointer_address__; - let mut current_offset = self.__storage_pointer_offset__; - let __contract_address_value__ = starknet::storage::StoragePointer { - __storage_pointer_address__: base_address, - __storage_pointer_offset__: current_offset, - }; - IModelWithComplexArraySafeDispatcherSubPointers { - contract_address: __contract_address_value__, - } - } -} -#[derive(Drop, Copy)] -pub struct IModelWithComplexArraySafeDispatcherSubPointersMut { - pub contract_address: starknet::storage::StoragePointer>, -} -impl IModelWithComplexArraySafeDispatcherSubPointersMutImpl of starknet::storage::SubPointersMut { - type SubPointersType = IModelWithComplexArraySafeDispatcherSubPointersMut; - fn sub_pointers_mut(self: starknet::storage::StoragePointer>) -> IModelWithComplexArraySafeDispatcherSubPointersMut { - let base_address = self.__storage_pointer_address__; - let mut current_offset = self.__storage_pointer_offset__; - let __contract_address_value__ = starknet::storage::StoragePointer { - __storage_pointer_address__: base_address, - __storage_pointer_offset__: current_offset, - }; - IModelWithComplexArraySafeDispatcherSubPointersMut { - contract_address: __contract_address_value__, - } - } -} -impl IModelWithTupleDispatcherCopy of core::traits::Copy::; -impl IModelWithTupleDispatcherDrop of core::traits::Drop::; -impl IModelWithTupleDispatcherSerde of core::serde::Serde:: { - fn serialize(self: @IModelWithTupleDispatcher, ref output: core::array::Array) { - core::serde::Serde::serialize(self.contract_address, ref output) - } - fn deserialize(ref serialized: core::array::Span) -> core::option::Option { - core::option::Option::Some(IModelWithTupleDispatcher { - contract_address: core::serde::Serde::deserialize(ref serialized)?, - }) - } -} -impl StoreIModelWithTupleDispatcher of starknet::Store:: { - fn read(address_domain: u32, base: starknet::storage_access::StorageBaseAddress) -> starknet::SyscallResult { - let contract_address = starknet::Store::::read(address_domain, base)?; - starknet::SyscallResult::Ok( - IModelWithTupleDispatcher { - contract_address, - } - ) - } - fn write(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, value: IModelWithTupleDispatcher) -> starknet::SyscallResult<()> { - starknet::Store::::write(address_domain, base, value.contract_address)?; - starknet::SyscallResult::Ok(()) - } - fn read_at_offset(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, offset: u8) -> starknet::SyscallResult { - let contract_address = starknet::Store::::read_at_offset(address_domain, base, offset)?; - starknet::SyscallResult::Ok( - IModelWithTupleDispatcher { - contract_address, - } - ) - } - #[inline(always)] - fn write_at_offset(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, offset: u8, value: IModelWithTupleDispatcher) -> starknet::SyscallResult<()> { - starknet::Store::::write_at_offset(address_domain, base, offset, value.contract_address)?; - starknet::SyscallResult::Ok(()) - } - #[inline(always)] - fn size() -> u8 { - starknet::Store::::size() - } -} - -#[derive(Drop, Copy)] -pub struct IModelWithTupleDispatcherSubPointers { - pub contract_address: starknet::storage::StoragePointer, -} -impl IModelWithTupleDispatcherSubPointersImpl of starknet::storage::SubPointers { - type SubPointersType = IModelWithTupleDispatcherSubPointers; - fn sub_pointers(self: starknet::storage::StoragePointer) -> IModelWithTupleDispatcherSubPointers { - let base_address = self.__storage_pointer_address__; - let mut current_offset = self.__storage_pointer_offset__; - let __contract_address_value__ = starknet::storage::StoragePointer { - __storage_pointer_address__: base_address, - __storage_pointer_offset__: current_offset, - }; - IModelWithTupleDispatcherSubPointers { - contract_address: __contract_address_value__, - } - } -} -#[derive(Drop, Copy)] -pub struct IModelWithTupleDispatcherSubPointersMut { - pub contract_address: starknet::storage::StoragePointer>, -} -impl IModelWithTupleDispatcherSubPointersMutImpl of starknet::storage::SubPointersMut { - type SubPointersType = IModelWithTupleDispatcherSubPointersMut; - fn sub_pointers_mut(self: starknet::storage::StoragePointer>) -> IModelWithTupleDispatcherSubPointersMut { - let base_address = self.__storage_pointer_address__; - let mut current_offset = self.__storage_pointer_offset__; - let __contract_address_value__ = starknet::storage::StoragePointer { - __storage_pointer_address__: base_address, - __storage_pointer_offset__: current_offset, - }; - IModelWithTupleDispatcherSubPointersMut { - contract_address: __contract_address_value__, - } - } -} -impl IModelWithTupleLibraryDispatcherCopy of core::traits::Copy::; -impl IModelWithTupleLibraryDispatcherDrop of core::traits::Drop::; -impl IModelWithTupleLibraryDispatcherSerde of core::serde::Serde:: { - fn serialize(self: @IModelWithTupleLibraryDispatcher, ref output: core::array::Array) { - core::serde::Serde::serialize(self.class_hash, ref output) - } - fn deserialize(ref serialized: core::array::Span) -> core::option::Option { - core::option::Option::Some(IModelWithTupleLibraryDispatcher { - class_hash: core::serde::Serde::deserialize(ref serialized)?, - }) - } -} -impl StoreIModelWithTupleLibraryDispatcher of starknet::Store:: { - fn read(address_domain: u32, base: starknet::storage_access::StorageBaseAddress) -> starknet::SyscallResult { - let class_hash = starknet::Store::::read(address_domain, base)?; - starknet::SyscallResult::Ok( - IModelWithTupleLibraryDispatcher { - class_hash, - } - ) - } - fn write(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, value: IModelWithTupleLibraryDispatcher) -> starknet::SyscallResult<()> { - starknet::Store::::write(address_domain, base, value.class_hash)?; - starknet::SyscallResult::Ok(()) - } - fn read_at_offset(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, offset: u8) -> starknet::SyscallResult { - let class_hash = starknet::Store::::read_at_offset(address_domain, base, offset)?; - starknet::SyscallResult::Ok( - IModelWithTupleLibraryDispatcher { - class_hash, - } - ) - } - #[inline(always)] - fn write_at_offset(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, offset: u8, value: IModelWithTupleLibraryDispatcher) -> starknet::SyscallResult<()> { - starknet::Store::::write_at_offset(address_domain, base, offset, value.class_hash)?; - starknet::SyscallResult::Ok(()) - } - #[inline(always)] - fn size() -> u8 { - starknet::Store::::size() - } -} - -#[derive(Drop, Copy)] -pub struct IModelWithTupleLibraryDispatcherSubPointers { - pub class_hash: starknet::storage::StoragePointer, -} -impl IModelWithTupleLibraryDispatcherSubPointersImpl of starknet::storage::SubPointers { - type SubPointersType = IModelWithTupleLibraryDispatcherSubPointers; - fn sub_pointers(self: starknet::storage::StoragePointer) -> IModelWithTupleLibraryDispatcherSubPointers { - let base_address = self.__storage_pointer_address__; - let mut current_offset = self.__storage_pointer_offset__; - let __class_hash_value__ = starknet::storage::StoragePointer { - __storage_pointer_address__: base_address, - __storage_pointer_offset__: current_offset, - }; - IModelWithTupleLibraryDispatcherSubPointers { - class_hash: __class_hash_value__, - } - } -} -#[derive(Drop, Copy)] -pub struct IModelWithTupleLibraryDispatcherSubPointersMut { - pub class_hash: starknet::storage::StoragePointer>, -} -impl IModelWithTupleLibraryDispatcherSubPointersMutImpl of starknet::storage::SubPointersMut { - type SubPointersType = IModelWithTupleLibraryDispatcherSubPointersMut; - fn sub_pointers_mut(self: starknet::storage::StoragePointer>) -> IModelWithTupleLibraryDispatcherSubPointersMut { - let base_address = self.__storage_pointer_address__; - let mut current_offset = self.__storage_pointer_offset__; - let __class_hash_value__ = starknet::storage::StoragePointer { - __storage_pointer_address__: base_address, - __storage_pointer_offset__: current_offset, - }; - IModelWithTupleLibraryDispatcherSubPointersMut { - class_hash: __class_hash_value__, - } - } -} -impl IModelWithTupleSafeLibraryDispatcherCopy of core::traits::Copy::; -impl IModelWithTupleSafeLibraryDispatcherDrop of core::traits::Drop::; -impl IModelWithTupleSafeLibraryDispatcherSerde of core::serde::Serde:: { - fn serialize(self: @IModelWithTupleSafeLibraryDispatcher, ref output: core::array::Array) { - core::serde::Serde::serialize(self.class_hash, ref output) - } - fn deserialize(ref serialized: core::array::Span) -> core::option::Option { - core::option::Option::Some(IModelWithTupleSafeLibraryDispatcher { - class_hash: core::serde::Serde::deserialize(ref serialized)?, - }) - } -} -impl StoreIModelWithTupleSafeLibraryDispatcher of starknet::Store:: { - fn read(address_domain: u32, base: starknet::storage_access::StorageBaseAddress) -> starknet::SyscallResult { - let class_hash = starknet::Store::::read(address_domain, base)?; - starknet::SyscallResult::Ok( - IModelWithTupleSafeLibraryDispatcher { - class_hash, - } - ) - } - fn write(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, value: IModelWithTupleSafeLibraryDispatcher) -> starknet::SyscallResult<()> { - starknet::Store::::write(address_domain, base, value.class_hash)?; - starknet::SyscallResult::Ok(()) - } - fn read_at_offset(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, offset: u8) -> starknet::SyscallResult { - let class_hash = starknet::Store::::read_at_offset(address_domain, base, offset)?; - starknet::SyscallResult::Ok( - IModelWithTupleSafeLibraryDispatcher { - class_hash, - } - ) - } - #[inline(always)] - fn write_at_offset(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, offset: u8, value: IModelWithTupleSafeLibraryDispatcher) -> starknet::SyscallResult<()> { - starknet::Store::::write_at_offset(address_domain, base, offset, value.class_hash)?; - starknet::SyscallResult::Ok(()) - } - #[inline(always)] - fn size() -> u8 { - starknet::Store::::size() - } -} - -#[derive(Drop, Copy)] -pub struct IModelWithTupleSafeLibraryDispatcherSubPointers { - pub class_hash: starknet::storage::StoragePointer, -} -impl IModelWithTupleSafeLibraryDispatcherSubPointersImpl of starknet::storage::SubPointers { - type SubPointersType = IModelWithTupleSafeLibraryDispatcherSubPointers; - fn sub_pointers(self: starknet::storage::StoragePointer) -> IModelWithTupleSafeLibraryDispatcherSubPointers { - let base_address = self.__storage_pointer_address__; - let mut current_offset = self.__storage_pointer_offset__; - let __class_hash_value__ = starknet::storage::StoragePointer { - __storage_pointer_address__: base_address, - __storage_pointer_offset__: current_offset, - }; - IModelWithTupleSafeLibraryDispatcherSubPointers { - class_hash: __class_hash_value__, - } - } -} -#[derive(Drop, Copy)] -pub struct IModelWithTupleSafeLibraryDispatcherSubPointersMut { - pub class_hash: starknet::storage::StoragePointer>, -} -impl IModelWithTupleSafeLibraryDispatcherSubPointersMutImpl of starknet::storage::SubPointersMut { - type SubPointersType = IModelWithTupleSafeLibraryDispatcherSubPointersMut; - fn sub_pointers_mut(self: starknet::storage::StoragePointer>) -> IModelWithTupleSafeLibraryDispatcherSubPointersMut { - let base_address = self.__storage_pointer_address__; - let mut current_offset = self.__storage_pointer_offset__; - let __class_hash_value__ = starknet::storage::StoragePointer { - __storage_pointer_address__: base_address, - __storage_pointer_offset__: current_offset, - }; - IModelWithTupleSafeLibraryDispatcherSubPointersMut { - class_hash: __class_hash_value__, - } - } -} -impl IModelWithTupleSafeDispatcherCopy of core::traits::Copy::; -impl IModelWithTupleSafeDispatcherDrop of core::traits::Drop::; -impl IModelWithTupleSafeDispatcherSerde of core::serde::Serde:: { - fn serialize(self: @IModelWithTupleSafeDispatcher, ref output: core::array::Array) { - core::serde::Serde::serialize(self.contract_address, ref output) - } - fn deserialize(ref serialized: core::array::Span) -> core::option::Option { - core::option::Option::Some(IModelWithTupleSafeDispatcher { - contract_address: core::serde::Serde::deserialize(ref serialized)?, - }) - } -} -impl StoreIModelWithTupleSafeDispatcher of starknet::Store:: { - fn read(address_domain: u32, base: starknet::storage_access::StorageBaseAddress) -> starknet::SyscallResult { - let contract_address = starknet::Store::::read(address_domain, base)?; - starknet::SyscallResult::Ok( - IModelWithTupleSafeDispatcher { - contract_address, - } - ) - } - fn write(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, value: IModelWithTupleSafeDispatcher) -> starknet::SyscallResult<()> { - starknet::Store::::write(address_domain, base, value.contract_address)?; - starknet::SyscallResult::Ok(()) - } - fn read_at_offset(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, offset: u8) -> starknet::SyscallResult { - let contract_address = starknet::Store::::read_at_offset(address_domain, base, offset)?; - starknet::SyscallResult::Ok( - IModelWithTupleSafeDispatcher { - contract_address, - } - ) - } - #[inline(always)] - fn write_at_offset(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, offset: u8, value: IModelWithTupleSafeDispatcher) -> starknet::SyscallResult<()> { - starknet::Store::::write_at_offset(address_domain, base, offset, value.contract_address)?; - starknet::SyscallResult::Ok(()) - } - #[inline(always)] - fn size() -> u8 { - starknet::Store::::size() - } -} - -#[derive(Drop, Copy)] -pub struct IModelWithTupleSafeDispatcherSubPointers { - pub contract_address: starknet::storage::StoragePointer, -} -impl IModelWithTupleSafeDispatcherSubPointersImpl of starknet::storage::SubPointers { - type SubPointersType = IModelWithTupleSafeDispatcherSubPointers; - fn sub_pointers(self: starknet::storage::StoragePointer) -> IModelWithTupleSafeDispatcherSubPointers { - let base_address = self.__storage_pointer_address__; - let mut current_offset = self.__storage_pointer_offset__; - let __contract_address_value__ = starknet::storage::StoragePointer { - __storage_pointer_address__: base_address, - __storage_pointer_offset__: current_offset, - }; - IModelWithTupleSafeDispatcherSubPointers { - contract_address: __contract_address_value__, - } - } -} -#[derive(Drop, Copy)] -pub struct IModelWithTupleSafeDispatcherSubPointersMut { - pub contract_address: starknet::storage::StoragePointer>, -} -impl IModelWithTupleSafeDispatcherSubPointersMutImpl of starknet::storage::SubPointersMut { - type SubPointersType = IModelWithTupleSafeDispatcherSubPointersMut; - fn sub_pointers_mut(self: starknet::storage::StoragePointer>) -> IModelWithTupleSafeDispatcherSubPointersMut { - let base_address = self.__storage_pointer_address__; - let mut current_offset = self.__storage_pointer_offset__; - let __contract_address_value__ = starknet::storage::StoragePointer { - __storage_pointer_address__: base_address, - __storage_pointer_offset__: current_offset, - }; - IModelWithTupleSafeDispatcherSubPointersMut { - contract_address: __contract_address_value__, - } - } -} -impl IModelWithTupleNoPrimitivesDispatcherCopy of core::traits::Copy::; -impl IModelWithTupleNoPrimitivesDispatcherDrop of core::traits::Drop::; -impl IModelWithTupleNoPrimitivesDispatcherSerde of core::serde::Serde:: { - fn serialize(self: @IModelWithTupleNoPrimitivesDispatcher, ref output: core::array::Array) { - core::serde::Serde::serialize(self.contract_address, ref output) - } - fn deserialize(ref serialized: core::array::Span) -> core::option::Option { - core::option::Option::Some(IModelWithTupleNoPrimitivesDispatcher { - contract_address: core::serde::Serde::deserialize(ref serialized)?, - }) - } -} -impl StoreIModelWithTupleNoPrimitivesDispatcher of starknet::Store:: { - fn read(address_domain: u32, base: starknet::storage_access::StorageBaseAddress) -> starknet::SyscallResult { - let contract_address = starknet::Store::::read(address_domain, base)?; - starknet::SyscallResult::Ok( - IModelWithTupleNoPrimitivesDispatcher { - contract_address, - } - ) - } - fn write(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, value: IModelWithTupleNoPrimitivesDispatcher) -> starknet::SyscallResult<()> { - starknet::Store::::write(address_domain, base, value.contract_address)?; - starknet::SyscallResult::Ok(()) - } - fn read_at_offset(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, offset: u8) -> starknet::SyscallResult { - let contract_address = starknet::Store::::read_at_offset(address_domain, base, offset)?; - starknet::SyscallResult::Ok( - IModelWithTupleNoPrimitivesDispatcher { - contract_address, - } - ) - } - #[inline(always)] - fn write_at_offset(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, offset: u8, value: IModelWithTupleNoPrimitivesDispatcher) -> starknet::SyscallResult<()> { - starknet::Store::::write_at_offset(address_domain, base, offset, value.contract_address)?; - starknet::SyscallResult::Ok(()) - } - #[inline(always)] - fn size() -> u8 { - starknet::Store::::size() - } -} - -#[derive(Drop, Copy)] -pub struct IModelWithTupleNoPrimitivesDispatcherSubPointers { - pub contract_address: starknet::storage::StoragePointer, -} -impl IModelWithTupleNoPrimitivesDispatcherSubPointersImpl of starknet::storage::SubPointers { - type SubPointersType = IModelWithTupleNoPrimitivesDispatcherSubPointers; - fn sub_pointers(self: starknet::storage::StoragePointer) -> IModelWithTupleNoPrimitivesDispatcherSubPointers { - let base_address = self.__storage_pointer_address__; - let mut current_offset = self.__storage_pointer_offset__; - let __contract_address_value__ = starknet::storage::StoragePointer { - __storage_pointer_address__: base_address, - __storage_pointer_offset__: current_offset, - }; - IModelWithTupleNoPrimitivesDispatcherSubPointers { - contract_address: __contract_address_value__, - } - } -} -#[derive(Drop, Copy)] -pub struct IModelWithTupleNoPrimitivesDispatcherSubPointersMut { - pub contract_address: starknet::storage::StoragePointer>, -} -impl IModelWithTupleNoPrimitivesDispatcherSubPointersMutImpl of starknet::storage::SubPointersMut { - type SubPointersType = IModelWithTupleNoPrimitivesDispatcherSubPointersMut; - fn sub_pointers_mut(self: starknet::storage::StoragePointer>) -> IModelWithTupleNoPrimitivesDispatcherSubPointersMut { - let base_address = self.__storage_pointer_address__; - let mut current_offset = self.__storage_pointer_offset__; - let __contract_address_value__ = starknet::storage::StoragePointer { - __storage_pointer_address__: base_address, - __storage_pointer_offset__: current_offset, - }; - IModelWithTupleNoPrimitivesDispatcherSubPointersMut { - contract_address: __contract_address_value__, - } - } -} -impl IModelWithTupleNoPrimitivesLibraryDispatcherCopy of core::traits::Copy::; -impl IModelWithTupleNoPrimitivesLibraryDispatcherDrop of core::traits::Drop::; -impl IModelWithTupleNoPrimitivesLibraryDispatcherSerde of core::serde::Serde:: { - fn serialize(self: @IModelWithTupleNoPrimitivesLibraryDispatcher, ref output: core::array::Array) { - core::serde::Serde::serialize(self.class_hash, ref output) - } - fn deserialize(ref serialized: core::array::Span) -> core::option::Option { - core::option::Option::Some(IModelWithTupleNoPrimitivesLibraryDispatcher { - class_hash: core::serde::Serde::deserialize(ref serialized)?, - }) - } -} -impl StoreIModelWithTupleNoPrimitivesLibraryDispatcher of starknet::Store:: { - fn read(address_domain: u32, base: starknet::storage_access::StorageBaseAddress) -> starknet::SyscallResult { - let class_hash = starknet::Store::::read(address_domain, base)?; - starknet::SyscallResult::Ok( - IModelWithTupleNoPrimitivesLibraryDispatcher { - class_hash, - } - ) - } - fn write(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, value: IModelWithTupleNoPrimitivesLibraryDispatcher) -> starknet::SyscallResult<()> { - starknet::Store::::write(address_domain, base, value.class_hash)?; - starknet::SyscallResult::Ok(()) - } - fn read_at_offset(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, offset: u8) -> starknet::SyscallResult { - let class_hash = starknet::Store::::read_at_offset(address_domain, base, offset)?; - starknet::SyscallResult::Ok( - IModelWithTupleNoPrimitivesLibraryDispatcher { - class_hash, - } - ) - } - #[inline(always)] - fn write_at_offset(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, offset: u8, value: IModelWithTupleNoPrimitivesLibraryDispatcher) -> starknet::SyscallResult<()> { - starknet::Store::::write_at_offset(address_domain, base, offset, value.class_hash)?; - starknet::SyscallResult::Ok(()) - } - #[inline(always)] - fn size() -> u8 { - starknet::Store::::size() - } -} - -#[derive(Drop, Copy)] -pub struct IModelWithTupleNoPrimitivesLibraryDispatcherSubPointers { - pub class_hash: starknet::storage::StoragePointer, -} -impl IModelWithTupleNoPrimitivesLibraryDispatcherSubPointersImpl of starknet::storage::SubPointers { - type SubPointersType = IModelWithTupleNoPrimitivesLibraryDispatcherSubPointers; - fn sub_pointers(self: starknet::storage::StoragePointer) -> IModelWithTupleNoPrimitivesLibraryDispatcherSubPointers { - let base_address = self.__storage_pointer_address__; - let mut current_offset = self.__storage_pointer_offset__; - let __class_hash_value__ = starknet::storage::StoragePointer { - __storage_pointer_address__: base_address, - __storage_pointer_offset__: current_offset, - }; - IModelWithTupleNoPrimitivesLibraryDispatcherSubPointers { - class_hash: __class_hash_value__, - } - } -} -#[derive(Drop, Copy)] -pub struct IModelWithTupleNoPrimitivesLibraryDispatcherSubPointersMut { - pub class_hash: starknet::storage::StoragePointer>, -} -impl IModelWithTupleNoPrimitivesLibraryDispatcherSubPointersMutImpl of starknet::storage::SubPointersMut { - type SubPointersType = IModelWithTupleNoPrimitivesLibraryDispatcherSubPointersMut; - fn sub_pointers_mut(self: starknet::storage::StoragePointer>) -> IModelWithTupleNoPrimitivesLibraryDispatcherSubPointersMut { - let base_address = self.__storage_pointer_address__; - let mut current_offset = self.__storage_pointer_offset__; - let __class_hash_value__ = starknet::storage::StoragePointer { - __storage_pointer_address__: base_address, - __storage_pointer_offset__: current_offset, - }; - IModelWithTupleNoPrimitivesLibraryDispatcherSubPointersMut { - class_hash: __class_hash_value__, - } - } -} -impl IModelWithTupleNoPrimitivesSafeLibraryDispatcherCopy of core::traits::Copy::; -impl IModelWithTupleNoPrimitivesSafeLibraryDispatcherDrop of core::traits::Drop::; -impl IModelWithTupleNoPrimitivesSafeLibraryDispatcherSerde of core::serde::Serde:: { - fn serialize(self: @IModelWithTupleNoPrimitivesSafeLibraryDispatcher, ref output: core::array::Array) { - core::serde::Serde::serialize(self.class_hash, ref output) - } - fn deserialize(ref serialized: core::array::Span) -> core::option::Option { - core::option::Option::Some(IModelWithTupleNoPrimitivesSafeLibraryDispatcher { - class_hash: core::serde::Serde::deserialize(ref serialized)?, - }) - } -} -impl StoreIModelWithTupleNoPrimitivesSafeLibraryDispatcher of starknet::Store:: { - fn read(address_domain: u32, base: starknet::storage_access::StorageBaseAddress) -> starknet::SyscallResult { - let class_hash = starknet::Store::::read(address_domain, base)?; - starknet::SyscallResult::Ok( - IModelWithTupleNoPrimitivesSafeLibraryDispatcher { - class_hash, - } - ) - } - fn write(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, value: IModelWithTupleNoPrimitivesSafeLibraryDispatcher) -> starknet::SyscallResult<()> { - starknet::Store::::write(address_domain, base, value.class_hash)?; - starknet::SyscallResult::Ok(()) - } - fn read_at_offset(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, offset: u8) -> starknet::SyscallResult { - let class_hash = starknet::Store::::read_at_offset(address_domain, base, offset)?; - starknet::SyscallResult::Ok( - IModelWithTupleNoPrimitivesSafeLibraryDispatcher { - class_hash, - } - ) - } - #[inline(always)] - fn write_at_offset(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, offset: u8, value: IModelWithTupleNoPrimitivesSafeLibraryDispatcher) -> starknet::SyscallResult<()> { - starknet::Store::::write_at_offset(address_domain, base, offset, value.class_hash)?; - starknet::SyscallResult::Ok(()) - } - #[inline(always)] - fn size() -> u8 { - starknet::Store::::size() - } -} - -#[derive(Drop, Copy)] -pub struct IModelWithTupleNoPrimitivesSafeLibraryDispatcherSubPointers { - pub class_hash: starknet::storage::StoragePointer, -} -impl IModelWithTupleNoPrimitivesSafeLibraryDispatcherSubPointersImpl of starknet::storage::SubPointers { - type SubPointersType = IModelWithTupleNoPrimitivesSafeLibraryDispatcherSubPointers; - fn sub_pointers(self: starknet::storage::StoragePointer) -> IModelWithTupleNoPrimitivesSafeLibraryDispatcherSubPointers { - let base_address = self.__storage_pointer_address__; - let mut current_offset = self.__storage_pointer_offset__; - let __class_hash_value__ = starknet::storage::StoragePointer { - __storage_pointer_address__: base_address, - __storage_pointer_offset__: current_offset, - }; - IModelWithTupleNoPrimitivesSafeLibraryDispatcherSubPointers { - class_hash: __class_hash_value__, - } - } -} -#[derive(Drop, Copy)] -pub struct IModelWithTupleNoPrimitivesSafeLibraryDispatcherSubPointersMut { - pub class_hash: starknet::storage::StoragePointer>, -} -impl IModelWithTupleNoPrimitivesSafeLibraryDispatcherSubPointersMutImpl of starknet::storage::SubPointersMut { - type SubPointersType = IModelWithTupleNoPrimitivesSafeLibraryDispatcherSubPointersMut; - fn sub_pointers_mut(self: starknet::storage::StoragePointer>) -> IModelWithTupleNoPrimitivesSafeLibraryDispatcherSubPointersMut { - let base_address = self.__storage_pointer_address__; - let mut current_offset = self.__storage_pointer_offset__; - let __class_hash_value__ = starknet::storage::StoragePointer { - __storage_pointer_address__: base_address, - __storage_pointer_offset__: current_offset, - }; - IModelWithTupleNoPrimitivesSafeLibraryDispatcherSubPointersMut { - class_hash: __class_hash_value__, - } - } -} -impl IModelWithTupleNoPrimitivesSafeDispatcherCopy of core::traits::Copy::; -impl IModelWithTupleNoPrimitivesSafeDispatcherDrop of core::traits::Drop::; -impl IModelWithTupleNoPrimitivesSafeDispatcherSerde of core::serde::Serde:: { - fn serialize(self: @IModelWithTupleNoPrimitivesSafeDispatcher, ref output: core::array::Array) { - core::serde::Serde::serialize(self.contract_address, ref output) - } - fn deserialize(ref serialized: core::array::Span) -> core::option::Option { - core::option::Option::Some(IModelWithTupleNoPrimitivesSafeDispatcher { - contract_address: core::serde::Serde::deserialize(ref serialized)?, - }) - } -} -impl StoreIModelWithTupleNoPrimitivesSafeDispatcher of starknet::Store:: { - fn read(address_domain: u32, base: starknet::storage_access::StorageBaseAddress) -> starknet::SyscallResult { - let contract_address = starknet::Store::::read(address_domain, base)?; - starknet::SyscallResult::Ok( - IModelWithTupleNoPrimitivesSafeDispatcher { - contract_address, - } - ) - } - fn write(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, value: IModelWithTupleNoPrimitivesSafeDispatcher) -> starknet::SyscallResult<()> { - starknet::Store::::write(address_domain, base, value.contract_address)?; - starknet::SyscallResult::Ok(()) - } - fn read_at_offset(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, offset: u8) -> starknet::SyscallResult { - let contract_address = starknet::Store::::read_at_offset(address_domain, base, offset)?; - starknet::SyscallResult::Ok( - IModelWithTupleNoPrimitivesSafeDispatcher { - contract_address, - } - ) - } - #[inline(always)] - fn write_at_offset(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, offset: u8, value: IModelWithTupleNoPrimitivesSafeDispatcher) -> starknet::SyscallResult<()> { - starknet::Store::::write_at_offset(address_domain, base, offset, value.contract_address)?; - starknet::SyscallResult::Ok(()) - } - #[inline(always)] - fn size() -> u8 { - starknet::Store::::size() - } -} - -#[derive(Drop, Copy)] -pub struct IModelWithTupleNoPrimitivesSafeDispatcherSubPointers { - pub contract_address: starknet::storage::StoragePointer, -} -impl IModelWithTupleNoPrimitivesSafeDispatcherSubPointersImpl of starknet::storage::SubPointers { - type SubPointersType = IModelWithTupleNoPrimitivesSafeDispatcherSubPointers; - fn sub_pointers(self: starknet::storage::StoragePointer) -> IModelWithTupleNoPrimitivesSafeDispatcherSubPointers { - let base_address = self.__storage_pointer_address__; - let mut current_offset = self.__storage_pointer_offset__; - let __contract_address_value__ = starknet::storage::StoragePointer { - __storage_pointer_address__: base_address, - __storage_pointer_offset__: current_offset, - }; - IModelWithTupleNoPrimitivesSafeDispatcherSubPointers { - contract_address: __contract_address_value__, - } - } -} -#[derive(Drop, Copy)] -pub struct IModelWithTupleNoPrimitivesSafeDispatcherSubPointersMut { - pub contract_address: starknet::storage::StoragePointer>, -} -impl IModelWithTupleNoPrimitivesSafeDispatcherSubPointersMutImpl of starknet::storage::SubPointersMut { - type SubPointersType = IModelWithTupleNoPrimitivesSafeDispatcherSubPointersMut; - fn sub_pointers_mut(self: starknet::storage::StoragePointer>) -> IModelWithTupleNoPrimitivesSafeDispatcherSubPointersMut { - let base_address = self.__storage_pointer_address__; - let mut current_offset = self.__storage_pointer_offset__; - let __contract_address_value__ = starknet::storage::StoragePointer { - __storage_pointer_address__: base_address, - __storage_pointer_offset__: current_offset, - }; - IModelWithTupleNoPrimitivesSafeDispatcherSubPointersMut { - contract_address: __contract_address_value__, - } - } -} -impl IModelv0DispatcherSubPointersDrop of core::traits::Drop::; -impl IModelv0DispatcherSubPointersCopy of core::traits::Copy::; -impl IModelv0DispatcherSubPointersMutDrop of core::traits::Drop::; -impl IModelv0DispatcherSubPointersMutCopy of core::traits::Copy::; -impl IModelv0LibraryDispatcherSubPointersDrop of core::traits::Drop::; -impl IModelv0LibraryDispatcherSubPointersCopy of core::traits::Copy::; -impl IModelv0LibraryDispatcherSubPointersMutDrop of core::traits::Drop::; -impl IModelv0LibraryDispatcherSubPointersMutCopy of core::traits::Copy::; -impl IModelv0SafeLibraryDispatcherSubPointersDrop of core::traits::Drop::; -impl IModelv0SafeLibraryDispatcherSubPointersCopy of core::traits::Copy::; -impl IModelv0SafeLibraryDispatcherSubPointersMutDrop of core::traits::Drop::; -impl IModelv0SafeLibraryDispatcherSubPointersMutCopy of core::traits::Copy::; -impl IModelv0SafeDispatcherSubPointersDrop of core::traits::Drop::; -impl IModelv0SafeDispatcherSubPointersCopy of core::traits::Copy::; -impl IModelv0SafeDispatcherSubPointersMutDrop of core::traits::Drop::; -impl IModelv0SafeDispatcherSubPointersMutCopy of core::traits::Copy::; -impl IModelWithBadNamespaceFormatDispatcherSubPointersDrop of core::traits::Drop::; -impl IModelWithBadNamespaceFormatDispatcherSubPointersCopy of core::traits::Copy::; -impl IModelWithBadNamespaceFormatDispatcherSubPointersMutDrop of core::traits::Drop::; -impl IModelWithBadNamespaceFormatDispatcherSubPointersMutCopy of core::traits::Copy::; -impl IModelWithBadNamespaceFormatLibraryDispatcherSubPointersDrop of core::traits::Drop::; -impl IModelWithBadNamespaceFormatLibraryDispatcherSubPointersCopy of core::traits::Copy::; -impl IModelWithBadNamespaceFormatLibraryDispatcherSubPointersMutDrop of core::traits::Drop::; -impl IModelWithBadNamespaceFormatLibraryDispatcherSubPointersMutCopy of core::traits::Copy::; -impl IModelWithBadNamespaceFormatSafeLibraryDispatcherSubPointersDrop of core::traits::Drop::; -impl IModelWithBadNamespaceFormatSafeLibraryDispatcherSubPointersCopy of core::traits::Copy::; -impl IModelWithBadNamespaceFormatSafeLibraryDispatcherSubPointersMutDrop of core::traits::Drop::; -impl IModelWithBadNamespaceFormatSafeLibraryDispatcherSubPointersMutCopy of core::traits::Copy::; -impl IModelWithBadNamespaceFormatSafeDispatcherSubPointersDrop of core::traits::Drop::; -impl IModelWithBadNamespaceFormatSafeDispatcherSubPointersCopy of core::traits::Copy::; -impl IModelWithBadNamespaceFormatSafeDispatcherSubPointersMutDrop of core::traits::Drop::; -impl IModelWithBadNamespaceFormatSafeDispatcherSubPointersMutCopy of core::traits::Copy::; -impl IModelWithShortStringNamespaceDispatcherSubPointersDrop of core::traits::Drop::; -impl IModelWithShortStringNamespaceDispatcherSubPointersCopy of core::traits::Copy::; -impl IModelWithShortStringNamespaceDispatcherSubPointersMutDrop of core::traits::Drop::; -impl IModelWithShortStringNamespaceDispatcherSubPointersMutCopy of core::traits::Copy::; -impl IModelWithShortStringNamespaceLibraryDispatcherSubPointersDrop of core::traits::Drop::; -impl IModelWithShortStringNamespaceLibraryDispatcherSubPointersCopy of core::traits::Copy::; -impl IModelWithShortStringNamespaceLibraryDispatcherSubPointersMutDrop of core::traits::Drop::; -impl IModelWithShortStringNamespaceLibraryDispatcherSubPointersMutCopy of core::traits::Copy::; -impl IModelWithShortStringNamespaceSafeLibraryDispatcherSubPointersDrop of core::traits::Drop::; -impl IModelWithShortStringNamespaceSafeLibraryDispatcherSubPointersCopy of core::traits::Copy::; -impl IModelWithShortStringNamespaceSafeLibraryDispatcherSubPointersMutDrop of core::traits::Drop::; -impl IModelWithShortStringNamespaceSafeLibraryDispatcherSubPointersMutCopy of core::traits::Copy::; -impl IModelWithShortStringNamespaceSafeDispatcherSubPointersDrop of core::traits::Drop::; -impl IModelWithShortStringNamespaceSafeDispatcherSubPointersCopy of core::traits::Copy::; -impl IModelWithShortStringNamespaceSafeDispatcherSubPointersMutDrop of core::traits::Drop::; -impl IModelWithShortStringNamespaceSafeDispatcherSubPointersMutCopy of core::traits::Copy::; -impl IModelWithStringNamespaceDispatcherSubPointersDrop of core::traits::Drop::; -impl IModelWithStringNamespaceDispatcherSubPointersCopy of core::traits::Copy::; -impl IModelWithStringNamespaceDispatcherSubPointersMutDrop of core::traits::Drop::; -impl IModelWithStringNamespaceDispatcherSubPointersMutCopy of core::traits::Copy::; -impl IModelWithStringNamespaceLibraryDispatcherSubPointersDrop of core::traits::Drop::; -impl IModelWithStringNamespaceLibraryDispatcherSubPointersCopy of core::traits::Copy::; -impl IModelWithStringNamespaceLibraryDispatcherSubPointersMutDrop of core::traits::Drop::; -impl IModelWithStringNamespaceLibraryDispatcherSubPointersMutCopy of core::traits::Copy::; -impl IModelWithStringNamespaceSafeLibraryDispatcherSubPointersDrop of core::traits::Drop::; -impl IModelWithStringNamespaceSafeLibraryDispatcherSubPointersCopy of core::traits::Copy::; -impl IModelWithStringNamespaceSafeLibraryDispatcherSubPointersMutDrop of core::traits::Drop::; -impl IModelWithStringNamespaceSafeLibraryDispatcherSubPointersMutCopy of core::traits::Copy::; -impl IModelWithStringNamespaceSafeDispatcherSubPointersDrop of core::traits::Drop::; -impl IModelWithStringNamespaceSafeDispatcherSubPointersCopy of core::traits::Copy::; -impl IModelWithStringNamespaceSafeDispatcherSubPointersMutDrop of core::traits::Drop::; -impl IModelWithStringNamespaceSafeDispatcherSubPointersMutCopy of core::traits::Copy::; -impl IPositionDispatcherSubPointersDrop of core::traits::Drop::; -impl IPositionDispatcherSubPointersCopy of core::traits::Copy::; -impl IPositionDispatcherSubPointersMutDrop of core::traits::Drop::; -impl IPositionDispatcherSubPointersMutCopy of core::traits::Copy::; -impl IPositionLibraryDispatcherSubPointersDrop of core::traits::Drop::; -impl IPositionLibraryDispatcherSubPointersCopy of core::traits::Copy::; -impl IPositionLibraryDispatcherSubPointersMutDrop of core::traits::Drop::; -impl IPositionLibraryDispatcherSubPointersMutCopy of core::traits::Copy::; -impl IPositionSafeLibraryDispatcherSubPointersDrop of core::traits::Drop::; -impl IPositionSafeLibraryDispatcherSubPointersCopy of core::traits::Copy::; -impl IPositionSafeLibraryDispatcherSubPointersMutDrop of core::traits::Drop::; -impl IPositionSafeLibraryDispatcherSubPointersMutCopy of core::traits::Copy::; -impl IPositionSafeDispatcherSubPointersDrop of core::traits::Drop::; -impl IPositionSafeDispatcherSubPointersCopy of core::traits::Copy::; -impl IPositionSafeDispatcherSubPointersMutDrop of core::traits::Drop::; -impl IPositionSafeDispatcherSubPointersMutCopy of core::traits::Copy::; -impl IPlayerDispatcherSubPointersDrop of core::traits::Drop::; -impl IPlayerDispatcherSubPointersCopy of core::traits::Copy::; -impl IPlayerDispatcherSubPointersMutDrop of core::traits::Drop::; -impl IPlayerDispatcherSubPointersMutCopy of core::traits::Copy::; -impl IPlayerLibraryDispatcherSubPointersDrop of core::traits::Drop::; -impl IPlayerLibraryDispatcherSubPointersCopy of core::traits::Copy::; -impl IPlayerLibraryDispatcherSubPointersMutDrop of core::traits::Drop::; -impl IPlayerLibraryDispatcherSubPointersMutCopy of core::traits::Copy::; -impl IPlayerSafeLibraryDispatcherSubPointersDrop of core::traits::Drop::; -impl IPlayerSafeLibraryDispatcherSubPointersCopy of core::traits::Copy::; -impl IPlayerSafeLibraryDispatcherSubPointersMutDrop of core::traits::Drop::; -impl IPlayerSafeLibraryDispatcherSubPointersMutCopy of core::traits::Copy::; -impl IPlayerSafeDispatcherSubPointersDrop of core::traits::Drop::; -impl IPlayerSafeDispatcherSubPointersCopy of core::traits::Copy::; -impl IPlayerSafeDispatcherSubPointersMutDrop of core::traits::Drop::; -impl IPlayerSafeDispatcherSubPointersMutCopy of core::traits::Copy::; -impl IModelWithSimpleArrayDispatcherSubPointersDrop of core::traits::Drop::; -impl IModelWithSimpleArrayDispatcherSubPointersCopy of core::traits::Copy::; -impl IModelWithSimpleArrayDispatcherSubPointersMutDrop of core::traits::Drop::; -impl IModelWithSimpleArrayDispatcherSubPointersMutCopy of core::traits::Copy::; -impl IModelWithSimpleArrayLibraryDispatcherSubPointersDrop of core::traits::Drop::; -impl IModelWithSimpleArrayLibraryDispatcherSubPointersCopy of core::traits::Copy::; -impl IModelWithSimpleArrayLibraryDispatcherSubPointersMutDrop of core::traits::Drop::; -impl IModelWithSimpleArrayLibraryDispatcherSubPointersMutCopy of core::traits::Copy::; -impl IModelWithSimpleArraySafeLibraryDispatcherSubPointersDrop of core::traits::Drop::; -impl IModelWithSimpleArraySafeLibraryDispatcherSubPointersCopy of core::traits::Copy::; -impl IModelWithSimpleArraySafeLibraryDispatcherSubPointersMutDrop of core::traits::Drop::; -impl IModelWithSimpleArraySafeLibraryDispatcherSubPointersMutCopy of core::traits::Copy::; -impl IModelWithSimpleArraySafeDispatcherSubPointersDrop of core::traits::Drop::; -impl IModelWithSimpleArraySafeDispatcherSubPointersCopy of core::traits::Copy::; -impl IModelWithSimpleArraySafeDispatcherSubPointersMutDrop of core::traits::Drop::; -impl IModelWithSimpleArraySafeDispatcherSubPointersMutCopy of core::traits::Copy::; -impl IModelWithByteArrayDispatcherSubPointersDrop of core::traits::Drop::; -impl IModelWithByteArrayDispatcherSubPointersCopy of core::traits::Copy::; -impl IModelWithByteArrayDispatcherSubPointersMutDrop of core::traits::Drop::; -impl IModelWithByteArrayDispatcherSubPointersMutCopy of core::traits::Copy::; -impl IModelWithByteArrayLibraryDispatcherSubPointersDrop of core::traits::Drop::; -impl IModelWithByteArrayLibraryDispatcherSubPointersCopy of core::traits::Copy::; -impl IModelWithByteArrayLibraryDispatcherSubPointersMutDrop of core::traits::Drop::; -impl IModelWithByteArrayLibraryDispatcherSubPointersMutCopy of core::traits::Copy::; -impl IModelWithByteArraySafeLibraryDispatcherSubPointersDrop of core::traits::Drop::; -impl IModelWithByteArraySafeLibraryDispatcherSubPointersCopy of core::traits::Copy::; -impl IModelWithByteArraySafeLibraryDispatcherSubPointersMutDrop of core::traits::Drop::; -impl IModelWithByteArraySafeLibraryDispatcherSubPointersMutCopy of core::traits::Copy::; -impl IModelWithByteArraySafeDispatcherSubPointersDrop of core::traits::Drop::; -impl IModelWithByteArraySafeDispatcherSubPointersCopy of core::traits::Copy::; -impl IModelWithByteArraySafeDispatcherSubPointersMutDrop of core::traits::Drop::; -impl IModelWithByteArraySafeDispatcherSubPointersMutCopy of core::traits::Copy::; -impl IModelWithComplexArrayDispatcherSubPointersDrop of core::traits::Drop::; -impl IModelWithComplexArrayDispatcherSubPointersCopy of core::traits::Copy::; -impl IModelWithComplexArrayDispatcherSubPointersMutDrop of core::traits::Drop::; -impl IModelWithComplexArrayDispatcherSubPointersMutCopy of core::traits::Copy::; -impl IModelWithComplexArrayLibraryDispatcherSubPointersDrop of core::traits::Drop::; -impl IModelWithComplexArrayLibraryDispatcherSubPointersCopy of core::traits::Copy::; -impl IModelWithComplexArrayLibraryDispatcherSubPointersMutDrop of core::traits::Drop::; -impl IModelWithComplexArrayLibraryDispatcherSubPointersMutCopy of core::traits::Copy::; -impl IModelWithComplexArraySafeLibraryDispatcherSubPointersDrop of core::traits::Drop::; -impl IModelWithComplexArraySafeLibraryDispatcherSubPointersCopy of core::traits::Copy::; -impl IModelWithComplexArraySafeLibraryDispatcherSubPointersMutDrop of core::traits::Drop::; -impl IModelWithComplexArraySafeLibraryDispatcherSubPointersMutCopy of core::traits::Copy::; -impl IModelWithComplexArraySafeDispatcherSubPointersDrop of core::traits::Drop::; -impl IModelWithComplexArraySafeDispatcherSubPointersCopy of core::traits::Copy::; -impl IModelWithComplexArraySafeDispatcherSubPointersMutDrop of core::traits::Drop::; -impl IModelWithComplexArraySafeDispatcherSubPointersMutCopy of core::traits::Copy::; -impl IModelWithTupleDispatcherSubPointersDrop of core::traits::Drop::; -impl IModelWithTupleDispatcherSubPointersCopy of core::traits::Copy::; -impl IModelWithTupleDispatcherSubPointersMutDrop of core::traits::Drop::; -impl IModelWithTupleDispatcherSubPointersMutCopy of core::traits::Copy::; -impl IModelWithTupleLibraryDispatcherSubPointersDrop of core::traits::Drop::; -impl IModelWithTupleLibraryDispatcherSubPointersCopy of core::traits::Copy::; -impl IModelWithTupleLibraryDispatcherSubPointersMutDrop of core::traits::Drop::; -impl IModelWithTupleLibraryDispatcherSubPointersMutCopy of core::traits::Copy::; -impl IModelWithTupleSafeLibraryDispatcherSubPointersDrop of core::traits::Drop::; -impl IModelWithTupleSafeLibraryDispatcherSubPointersCopy of core::traits::Copy::; -impl IModelWithTupleSafeLibraryDispatcherSubPointersMutDrop of core::traits::Drop::; -impl IModelWithTupleSafeLibraryDispatcherSubPointersMutCopy of core::traits::Copy::; -impl IModelWithTupleSafeDispatcherSubPointersDrop of core::traits::Drop::; -impl IModelWithTupleSafeDispatcherSubPointersCopy of core::traits::Copy::; -impl IModelWithTupleSafeDispatcherSubPointersMutDrop of core::traits::Drop::; -impl IModelWithTupleSafeDispatcherSubPointersMutCopy of core::traits::Copy::; -impl IModelWithTupleNoPrimitivesDispatcherSubPointersDrop of core::traits::Drop::; -impl IModelWithTupleNoPrimitivesDispatcherSubPointersCopy of core::traits::Copy::; -impl IModelWithTupleNoPrimitivesDispatcherSubPointersMutDrop of core::traits::Drop::; -impl IModelWithTupleNoPrimitivesDispatcherSubPointersMutCopy of core::traits::Copy::; -impl IModelWithTupleNoPrimitivesLibraryDispatcherSubPointersDrop of core::traits::Drop::; -impl IModelWithTupleNoPrimitivesLibraryDispatcherSubPointersCopy of core::traits::Copy::; -impl IModelWithTupleNoPrimitivesLibraryDispatcherSubPointersMutDrop of core::traits::Drop::; -impl IModelWithTupleNoPrimitivesLibraryDispatcherSubPointersMutCopy of core::traits::Copy::; -impl IModelWithTupleNoPrimitivesSafeLibraryDispatcherSubPointersDrop of core::traits::Drop::; -impl IModelWithTupleNoPrimitivesSafeLibraryDispatcherSubPointersCopy of core::traits::Copy::; -impl IModelWithTupleNoPrimitivesSafeLibraryDispatcherSubPointersMutDrop of core::traits::Drop::; -impl IModelWithTupleNoPrimitivesSafeLibraryDispatcherSubPointersMutCopy of core::traits::Copy::; -impl IModelWithTupleNoPrimitivesSafeDispatcherSubPointersDrop of core::traits::Drop::; -impl IModelWithTupleNoPrimitivesSafeDispatcherSubPointersCopy of core::traits::Copy::; -impl IModelWithTupleNoPrimitivesSafeDispatcherSubPointersMutDrop of core::traits::Drop::; -impl IModelWithTupleNoPrimitivesSafeDispatcherSubPointersMutCopy of core::traits::Copy::; - -//! > expected_diagnostics -error: Too many 'version' attributes for dojo::model - --> /tmp/plugin_test/model/src/lib.cairo:9:1 -#[dojo::model(version: 0, version: 0)] -^************************************^ - -error: The argument 'version' of dojo::model must be an integer - --> /tmp/plugin_test/model/src/lib.cairo:16:24 -#[dojo::model(version: hello)] - ^***^ - -error: Unexpected argument 'version' for dojo::model - --> /tmp/plugin_test/model/src/lib.cairo:23:15 -#[dojo::model(version)] - ^*****^ - -error: Unexpected argument 'my_arg' for dojo::model - --> /tmp/plugin_test/model/src/lib.cairo:30:15 -#[dojo::model(my_arg: 1)] - ^*******^ - -error: Unexpected argument 'my_arg' for dojo::model - --> /tmp/plugin_test/model/src/lib.cairo:37:15 -#[dojo::model(my_arg)] - ^****^ - -error: dojo::model version 2 not supported - --> /tmp/plugin_test/model/src/lib.cairo:44:24 -#[dojo::model(version: 2)] - ^ - -error: Model must define at least one #[key] attribute - --> /tmp/plugin_test/model/src/lib.cairo:87:8 -struct Roles { - ^***^ - -error: Model must define at least one member that is not a key - --> /tmp/plugin_test/model/src/lib.cairo:92:8 -struct OnlyKeyModel { - ^**********^ - -error: Key is only supported for core types that are 1 felt long once serialized. `u256` is a struct of 2 u128, hence not supported. - --> /tmp/plugin_test/model/src/lib.cairo:100:5 - id: u256 - ^^ - -error: Model must define at least one #[key] attribute - --> /tmp/plugin_test/model/src/lib.cairo:98:8 -struct U256KeyModel { - ^**********^ - -error: Model must define at least one member that is not a key - --> /tmp/plugin_test/model/src/lib.cairo:98:8 -struct U256KeyModel { - ^**********^ - -error: Expected args. - --> /tmp/plugin_test/model/src/lib.cairo:51:1 -#[dojo::model(version: 0)] -^************************^ - -error: Expected args. - --> /tmp/plugin_test/model/src/lib.cairo:51:1 -#[dojo::model(version: 0)] -^************************^ - -error: Expected args. - --> /tmp/plugin_test/model/src/lib.cairo:58:1 -#[dojo::model(namespace: 'MyNamespace')] -^**************************************^ - -error: Expected args. - --> /tmp/plugin_test/model/src/lib.cairo:58:1 -#[dojo::model(namespace: 'MyNamespace')] -^**************************************^ - -error: Expected args. - --> /tmp/plugin_test/model/src/lib.cairo:65:1 -#[dojo::model(namespace: 'my_namespace')] -^***************************************^ - -error: Expected args. - --> /tmp/plugin_test/model/src/lib.cairo:65:1 -#[dojo::model(namespace: 'my_namespace')] -^***************************************^ - -error: Expected args. - --> /tmp/plugin_test/model/src/lib.cairo:72:1 -#[dojo::model(namespace: "my_namespace")] -^***************************************^ - -error: Expected args. - --> /tmp/plugin_test/model/src/lib.cairo:72:1 -#[dojo::model(namespace: "my_namespace")] -^***************************************^ - -error: Expected args. - --> /tmp/plugin_test/model/src/lib.cairo:79:1 -#[dojo::model] -^************^ - -error: Expected args. - --> /tmp/plugin_test/model/src/lib.cairo:79:1 -#[dojo::model] -^************^ - -error: Expected args. - --> /tmp/plugin_test/model/src/lib.cairo:103:1 -#[dojo::model] -^************^ - -error: Expected args. - --> /tmp/plugin_test/model/src/lib.cairo:103:1 -#[dojo::model] -^************^ - -error: Expected args. - --> /tmp/plugin_test/model/src/lib.cairo:115:1 -#[dojo::model] -^************^ - -error: Expected args. - --> /tmp/plugin_test/model/src/lib.cairo:115:1 -#[dojo::model] -^************^ - -error: Expected args. - --> /tmp/plugin_test/model/src/lib.cairo:123:1 -#[dojo::model] -^************^ - -error: Expected args. - --> /tmp/plugin_test/model/src/lib.cairo:123:1 -#[dojo::model] -^************^ - -error: Expected args. - --> /tmp/plugin_test/model/src/lib.cairo:131:1 -#[dojo::model] -^************^ - -error: Expected args. - --> /tmp/plugin_test/model/src/lib.cairo:131:1 -#[dojo::model] -^************^ - -error: Expected args. - --> /tmp/plugin_test/model/src/lib.cairo:139:1 -#[dojo::model] -^************^ - -error: Expected args. - --> /tmp/plugin_test/model/src/lib.cairo:139:1 -#[dojo::model] -^************^ - -error: Expected args. - --> /tmp/plugin_test/model/src/lib.cairo:147:1 -#[dojo::model] -^************^ - -error: Expected args. - --> /tmp/plugin_test/model/src/lib.cairo:147:1 -#[dojo::model] -^************^ diff --git a/crates/dojo/lang/src/plugin_test_data/print b/crates/dojo/lang/src/plugin_test_data/print deleted file mode 100644 index 8481dd1e1c..0000000000 --- a/crates/dojo/lang/src/plugin_test_data/print +++ /dev/null @@ -1,136 +0,0 @@ -//! > Test expansion of the derive(Print). - -//! > test_runner_name -test_expand_plugin - -//! > test_id -print - -//! > cfg -["test"] - -//! > cairo_code -use serde::Serde; -use debug::PrintTrait; - -#[derive(Print)] -struct Position { - #[key] - id: felt252, - x: felt252, - y: felt252 -} - -#[derive(Print)] -struct Roles { - role_ids: Array -} - -use starknet::ContractAddress; - -#[derive(Print)] -struct Player { - #[key] - game: felt252, - #[key] - player: ContractAddress, - name: felt252, -} - -#[derive(Print)] -enum Enemy { - Unknown, - Bot: felt252, - OtherPlayer: ContractAddress, -} - -//! > expanded_cairo_code -use serde::Serde; -use debug::PrintTrait; - -#[derive(Print)] -struct Position { - #[key] - id: felt252, - x: felt252, - y: felt252 -} - -#[derive(Print)] -struct Roles { - role_ids: Array -} - -use starknet::ContractAddress; - -#[derive(Print)] -struct Player { - #[key] - game: felt252, - #[key] - player: ContractAddress, - name: felt252, -} - -#[derive(Print)] -enum Enemy { - Unknown, - Bot: felt252, - OtherPlayer: ContractAddress, -} -#[cfg(test)] -impl PositionStructPrintImpl of core::debug::PrintTrait { - fn print(self: Position) { - core::debug::PrintTrait::print('id'); core::debug::PrintTrait::print(self.id); -core::debug::PrintTrait::print('x'); core::debug::PrintTrait::print(self.x); -core::debug::PrintTrait::print('y'); core::debug::PrintTrait::print(self.y); - } -} - -#[cfg(test)] -impl RolesStructPrintImpl of core::debug::PrintTrait { - fn print(self: Roles) { - core::debug::PrintTrait::print('role_ids'); core::debug::PrintTrait::print(self.role_ids); - } -} - -#[cfg(test)] -impl PlayerStructPrintImpl of core::debug::PrintTrait { - fn print(self: Player) { - core::debug::PrintTrait::print('game'); core::debug::PrintTrait::print(self.game); -core::debug::PrintTrait::print('player'); core::debug::PrintTrait::print(self.player); -core::debug::PrintTrait::print('name'); core::debug::PrintTrait::print(self.name); - } -} - -#[cfg(test)] -impl EnemyEnumPrintImpl of core::debug::PrintTrait { - fn print(self: Enemy) { - match self { - Enemy::Unknown => { core::debug::PrintTrait::print('Unknown'); }, -Enemy::Bot(v) => { core::debug::PrintTrait::print('Bot'); core::debug::PrintTrait::print(v); }, -Enemy::OtherPlayer(v) => { core::debug::PrintTrait::print('OtherPlayer'); core::debug::PrintTrait::print(v); } - } - } -} - -//! > expected_diagnostics -error: Unknown derive `Print` - a plugin might be missing. - --> /tmp/plugin_test/print/src/lib.cairo:4:10 -#[derive(Print)] - ^***^ - -error: Unknown derive `Print` - a plugin might be missing. - --> /tmp/plugin_test/print/src/lib.cairo:12:10 -#[derive(Print)] - ^***^ - -error: Unknown derive `Print` - a plugin might be missing. - --> /tmp/plugin_test/print/src/lib.cairo:19:10 -#[derive(Print)] - ^***^ - -error: Unknown derive `Print` - a plugin might be missing. - --> /tmp/plugin_test/print/src/lib.cairo:28:10 -#[derive(Print)] - ^***^ diff --git a/crates/dojo/lang/src/plugin_test_data/system b/crates/dojo/lang/src/plugin_test_data/system deleted file mode 100644 index 004fbe5dc7..0000000000 --- a/crates/dojo/lang/src/plugin_test_data/system +++ /dev/null @@ -1,7220 +0,0 @@ -//! > Test expansion of the #[system]. - -//! > test_runner_name -test_expand_plugin - -//! > test_id -system - -//! > cairo_code -#[dojo::contract(namespace: "My@Namespace")] -mod bad_namespace_format { - use traits::Into; - use dojo::world::Context; - - fn execute(ctx: Context, name: felt252) { - return (); - } -} - -#[dojo::contract(namespace: 'my_namespace')] -mod spawn { - use traits::Into; - use dojo::world::Context; - - fn execute(ctx: Context, name: felt252) { - return (); - } -} - -#[dojo::contract(namespace: "my_namespace")] -mod proxy { - fn execute(value: felt252) -> felt252 { - value - } -} - -#[dojo::contract] -mod ctxnamed { - use traits::Into; - use dojo::world::Context; - - fn execute(ctx2: Context, name: felt252) { - return (); - } -} - -#[dojo::contract] -mod withevent { - #[event] - #[derive(Drop, starknet::Event)] - enum Event { - TestEvent: TestEvent, - } - - #[derive(Drop, starknet::Event)] - struct TestEvent { - address: ContractAddress, - } -} - -#[starknet::component] -mod testcomponent1 { - #[storage] - struct Storage {} -} - -#[starknet::component] -mod testcomponent2 { - #[storage] - struct Storage {} -} - -#[dojo::contract] -mod withcomponent { - component!(path: testcomponent1, storage: testcomponent1_storage, event: testcomponent1_event); - component!(path: testcomponent2, storage: testcomponent2_storage, event: testcomponent2_event); - - #[storage] - struct Storage { - #[substorage(v0)] - testcomponent1_storage: testcomponent1::Storage, - #[substorage(v0)] - testcomponent2_storage: testcomponent2::Storage, - } - - #[event] - #[derive(Drop, starknet::Event)] - enum Event { - #[flat] - testcomponent1_event: testcomponent1::Event, - testcomponent2_event: testcomponent2::Event, - } -} -#[dojo::interface] -trait IEmptyTrait; - -#[dojo::interface] -trait IFaultyTrait { - const ONE: u8; - - #[my_attr] - fn do_with_attrs(p1: u8) -> u16; -} - -#[dojo::interface] -trait INominalTrait { - fn do_no_param() -> felt252; - fn do_no_param_but_world(world: @IWorldDispatcher) -> felt252; - fn do_no_param_but_world_ref(ref world: IWorldDispatcher) -> felt252; - fn do_params_no_world(p1: felt252, p2: u8) -> felt252; - fn do_params_and_world(world: @IWorldDispatcher, p2: u8) -> felt252; - fn do_params_and_world_ref(ref world: IWorldDispatcher, p2: u8) -> felt252; - - fn do_with_self(self: @ContractState) -> felt252; - fn do_with_ref_self(ref self: ContractState) -> felt252; -} - -#[dojo::interface] -trait IFaultyTrait { - fn do_with_self_and_world(self: @ContractState, world: @IWorldDispatcher) -> felt252; - fn do_with_ref_self_and_world(ref self: ContractState, ref world: IWorldDispatcher) -> felt252; - fn do_with_self_and_world_inv(world: @IWorldDispatcher, self: @ContractState) -> felt252; - fn do_with_ref_self_and_world_inv( - ref world: IWorldDispatcher, ref self: ContractState - ) -> felt252; - fn do_with_several_world_dispatchers( - world: @IWorldDispatcher, vec: Vec2, ref another_world: IWorldDispatcher - ) -> felt252; - fn do_with_world_not_named_world(another_world: @IWorldDispatcher) -> felt252; - fn do_with_world_not_first(vec: Vec2, ref world: IWorldDispatcher) -> felt252; -} - -#[dojo::contract] -mod MyFaultyContract { - #[abi(embed_v0)] - impl TestFaultyImpl of IFaultyTrait { - fn do_with_self_and_world(self: @ContractState, world: @IWorldDispatcher) -> felt252 { - 'land' - } - - fn do_with_ref_self_and_world( - ref self: ContractState, ref world: IWorldDispatcher - ) -> felt252 { - 'land' - } - - fn do_with_self_and_world_inv(world: @IWorldDispatcher, self: @ContractState) -> felt252 { - 'land' - } - - fn do_with_ref_self_and_world_inv( - ref world: IWorldDispatcher, ref self: ContractState - ) -> felt252 { - 'land' - } - - fn do_with_several_world_dispatchers( - world: @IWorldDispatcher, vec: Vec2, ref another_world: IWorldDispatcher - ) -> felt252 { - 'land' - } - - fn do_with_world_not_named_world(another_world: @IWorldDispatcher) -> felt252 { - 'land' - } - - fn do_with_world_not_first(vec: Vec2, ref world: IWorldDispatcher) -> felt252 { - 'land' - } - } - - #[generate_trait] - impl InternalImplBad of InternalUtils { - fn bad_func_using_generate(world: @IWorldDispatcher) -> felt252 { - 'land' - } - } -} - -#[dojo::contract] -mod MyNominalContract { - #[derive(Drop)] - struct Action { - damage: u8 - } - - #[abi(embed_v0)] - impl TestNominalImpl of INominalTrait { - fn do_no_param() -> felt252 { - 'land' - } - - fn do_no_param_but_world(world: @IWorldDispatcher) -> felt252 { - 'land' - } - - fn do_no_param_but_world_ref(ref world: IWorldDispatcher) -> felt252 { - 'land' - } - - fn do_params_no_world(p1: felt252, p2: u8) -> felt252 { - 'land' - } - - fn do_params_and_world(world: @IWorldDispatcher, p2: u8) -> felt252 { - 'land' - } - - fn do_params_and_world_ref(ref world: IWorldDispatcher, p2: u8) -> felt252 { - 'land' - } - - fn do_with_self(self: @ContractState) -> felt252 { - 'land' - } - - fn do_with_ref_self(ref self: ContractState) -> felt252 { - 'land' - } - } - - #[generate_trait] - impl ImplInternalNoContractState of InternalNoContractState { - fn func1(world: IWorldDispatcher) -> felt252 { - let _w = world; - 42 - } - } -} - -#[dojo::contract] -mod constructor_test { - #[constructor] - fn constructor(ref self: ContractState, _value: u8) {} -} - -#[dojo::contract] -mod no_init_test {} - -//! > generated_cairo_code -#[starknet::contract] -mod spawn { - use dojo::world; - use dojo::world::IWorldDispatcher; - use dojo::world::IWorldDispatcherTrait; - - #[storage] - struct Storage { - world_dispatcher: IWorldDispatcher, - } - - #[abi(embed_v0)] - fn name(self: @ContractState) -> felt252 { - 'spawn' - } - - #[abi(embed_v0)] - impl Upgradeable of dojo::upgradable::IUpgradeable { - fn upgrade(ref self: ContractState, new_class_hash: starknet::ClassHash) { - let caller = starknet::get_caller_address(); - assert( - self.world_dispatcher.read().contract_address == caller, 'only World can upgrade' - ); - dojo::upgradable::UpgradeableTrait::upgrade(new_class_hash); - } - } - - use traits::Into; - use dojo::world::Context; - - #[abi(embed_v0)] - fn execute(self: @ContractState, ctx: Context, name: felt252) { - return (); - } -} - - -#[starknet::contract] -mod proxy { - use dojo::world; - use dojo::world::IWorldDispatcher; - use dojo::world::IWorldDispatcherTrait; - - #[storage] - struct Storage { - world_dispatcher: IWorldDispatcher, - } - - #[abi(embed_v0)] - fn name(self: @ContractState) -> felt252 { - 'proxy' - } - - #[abi(embed_v0)] - impl Upgradeable of dojo::upgradable::IUpgradeable { - fn upgrade(ref self: ContractState, new_class_hash: starknet::ClassHash) { - let caller = starknet::get_caller_address(); - assert( - self.world_dispatcher.read().contract_address == caller, 'only World can upgrade' - ); - dojo::upgradable::UpgradeableTrait::upgrade(new_class_hash); - } - } - - - #[abi(embed_v0)] - fn execute(self: @ContractState, value: felt252) -> felt252 { - value - } -} - - -#[starknet::contract] -mod ctxnamed { - use dojo::world; - use dojo::world::IWorldDispatcher; - use dojo::world::IWorldDispatcherTrait; - - #[storage] - struct Storage { - world_dispatcher: IWorldDispatcher, - } - - #[abi(embed_v0)] - fn name(self: @ContractState) -> felt252 { - 'ctxnamed' - } - - #[abi(embed_v0)] - impl Upgradeable of dojo::upgradable::IUpgradeable { - fn upgrade(ref self: ContractState, new_class_hash: starknet::ClassHash) { - let caller = starknet::get_caller_address(); - assert( - self.world_dispatcher.read().contract_address == caller, 'only World can upgrade' - ); - dojo::upgradable::UpgradeableTrait::upgrade(new_class_hash); - } - } - - use traits::Into; - use dojo::world::Context; - - #[abi(embed_v0)] - fn execute(self: @ContractState, ctx2: Context, name: felt252) { - return (); - } -} - -//! > expected_diagnostics -error: The contract namespace 'My@Namespace' can only contain characters (a-z/A-Z), digits (0-9) and underscore (_). - --> /tmp/plugin_test/system/src/lib.cairo:1:1 -#[dojo::contract(namespace: "My@Namespace")] -^******************************************^ - -error: Anything other than functions is not supported in a dojo::interface - --> /tmp/plugin_test/system/src/lib.cairo:90:5 - const ONE: u8; - ^************^ - -error: World parameter must be the first parameter. - --> /tmp/plugin_test/system/src/lib.cairo:111:5 - fn do_with_self_and_world(self: @ContractState, world: @IWorldDispatcher) -> felt252; - ^***********************************************************************************^ - -error: World parameter must be the first parameter. - --> /tmp/plugin_test/system/src/lib.cairo:112:5 - fn do_with_ref_self_and_world(ref self: ContractState, ref world: IWorldDispatcher) -> felt252; - ^*********************************************************************************************^ - -error: You cannot use `self` and `world` parameters together. - --> /tmp/plugin_test/system/src/lib.cairo:113:5 - fn do_with_self_and_world_inv(world: @IWorldDispatcher, self: @ContractState) -> felt252; - ^***************************************************************************************^ - -error: You cannot use `self` and `world` parameters together. - --> /tmp/plugin_test/system/src/lib.cairo:114:5 - fn do_with_ref_self_and_world_inv( - ^********************************^ - -error: World parameter must be the first parameter. - --> /tmp/plugin_test/system/src/lib.cairo:121:5 - fn do_with_world_not_first(vec: Vec2, ref world: IWorldDispatcher) -> felt252; - ^****************************************************************************^ - -error: World parameter must be the first parameter. - --> /tmp/plugin_test/system/src/lib.cairo:128:9 - fn do_with_self_and_world(self: @ContractState, world: @IWorldDispatcher) -> felt252 { - ^************************************************************************************^ - -error: World parameter must be the first parameter. - --> /tmp/plugin_test/system/src/lib.cairo:132:9 - fn do_with_ref_self_and_world( - ^****************************^ - -error: You cannot use `self` and `world` parameters together. - --> /tmp/plugin_test/system/src/lib.cairo:138:9 - fn do_with_self_and_world_inv(world: @IWorldDispatcher, self: @ContractState) -> felt252 { - ^****************************************************************************************^ - -error: You cannot use `self` and `world` parameters together. - --> /tmp/plugin_test/system/src/lib.cairo:142:9 - fn do_with_ref_self_and_world_inv( - ^********************************^ - -error: World parameter must be the first parameter. - --> /tmp/plugin_test/system/src/lib.cairo:158:9 - fn do_with_world_not_first(vec: Vec2, ref world: IWorldDispatcher) -> felt252 { - ^*****************************************************************************^ - -error: You cannot use `world` and `#[generate_trait]` together. Use `self` instead. - --> /tmp/plugin_test/system/src/lib.cairo:165:9 - fn bad_func_using_generate(world: @IWorldDispatcher) -> felt252 { - ^***************************************************************^ - -error: `starknet::interface` function first parameter must be a reference to the trait's generic parameter or a snapshot of it. - --> /tmp/plugin_test/system/src/lib.cairo:105:5 - fn do_with_self(self: @ContractState) -> felt252; - ^**********************************************^ - -error: `starknet::interface` function first parameter must be a reference to the trait's generic parameter or a snapshot of it. - --> /tmp/plugin_test/system/src/lib.cairo:106:5 - fn do_with_ref_self(ref self: ContractState) -> felt252; - ^*****************************************************^ - -error: `starknet::interface` function first parameter must be a reference to the trait's generic parameter or a snapshot of it. - --> /tmp/plugin_test/system/src/lib.cairo:111:5 - fn do_with_self_and_world(self: @ContractState, world: @IWorldDispatcher) -> felt252; - ^**********************************************************************************^ - -error: `starknet::interface` function first parameter must be a reference to the trait's generic parameter or a snapshot of it. - --> /tmp/plugin_test/system/src/lib.cairo:112:5 - fn do_with_ref_self_and_world(ref self: ContractState, ref world: IWorldDispatcher) -> felt252; - ^********************************************************************************************^ - -error: `starknet::interface` functions don't support `ref` parameters other than the first one. - --> /tmp/plugin_test/system/src/lib.cairo:112:5 - fn do_with_ref_self_and_world(ref self: ContractState, ref world: IWorldDispatcher) -> felt252; - ^********************************************************************************************^ - -error: `starknet::interface` functions don't support `ref` parameters other than the first one. - --> /tmp/plugin_test/system/src/lib.cairo:114:5 - fn do_with_ref_self_and_world_inv( - ^********************************^ - -error: `starknet::interface` functions don't support `ref` parameters other than the first one. - --> /tmp/plugin_test/system/src/lib.cairo:117:5 - fn do_with_several_world_dispatchers( - ^***********************************^ - -error: `starknet::interface` functions don't support `ref` parameters other than the first one. - --> /tmp/plugin_test/system/src/lib.cairo:121:5 - fn do_with_world_not_first(vec: Vec2, ref world: IWorldDispatcher) -> felt252; - ^***************************************************************************^ - -error: Generated trait must have generic args matching the impl's generic params. - --> /tmp/plugin_test/system/src/lib.cairo:163:5 - #[generate_trait] - ^***************^ - -//! > expanded_cairo_code -#[dojo::contract(namespace: "My@Namespace")] -mod bad_namespace_format { - use traits::Into; - use dojo::world::Context; - - fn execute(ctx: Context, name: felt252) { - return (); - } -} - -#[starknet::component] -mod testcomponent1 { -#[event] -#[derive(Drop, starknet::Event)] -pub enum Event {} - - -#[phantom] -pub struct Storage { -} - -#[derive(Drop, Copy)] -pub struct StorageStorageBase { -} -impl StorageStorageImpl of starknet::storage::StorageTrait { - type BaseType = StorageStorageBase; - fn storage(self: starknet::storage::FlattenedStorage) -> StorageStorageBase { - StorageStorageBase { - } - } -} -#[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 = starknet::storage::FlattenedStorage; - fn snapshot_deref(self: @ComponentState) -> starknet::storage::FlattenedStorage { - starknet::storage::FlattenedStorage {} - } -} -impl ComponentStateDerefMut of core::ops::DerefMut> { - type Target = starknet::storage::FlattenedStorage> ; - fn deref_mut(ref self: ComponentState) -> starknet::storage::FlattenedStorage> { - starknet::storage::FlattenedStorage {} - } -} -pub fn unsafe_new_component_state() -> ComponentState { - ComponentState:: { - } -} - - -// TODO(Gil): This generates duplicate diagnostics because of the plugin system, squash the duplicates into one. -#[deprecated( - feature: "deprecated_legacy_map", - note: "Use `starknet::storage::Map` instead." -)] -#[allow(unused_imports)] -use starknet::storage::Map as LegacyMap; -pub trait HasComponent { - fn get_component(self: @TContractState) -> @ComponentState; - fn get_component_mut(ref self: TContractState) -> ComponentState; - fn get_contract(self: @ComponentState) -> @TContractState; - fn get_contract_mut(ref self: ComponentState) -> TContractState; - fn emit>(ref self: ComponentState, event: S); -} -impl EventDrop of core::traits::Drop::; -impl EventIsEvent of starknet::Event { - fn append_keys_and_data( - self: @Event, ref keys: Array, ref data: Array - ) { - match self { - } - } - fn deserialize( - ref keys: Span, ref data: Span, - ) -> Option { - let __selector__ = *core::array::SpanTrait::pop_front(ref keys)?; - Option::None - } -} -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] -mod testcomponent2 { -#[event] -#[derive(Drop, starknet::Event)] -pub enum Event {} - - -#[phantom] -pub struct Storage { -} - -#[derive(Drop, Copy)] -pub struct StorageStorageBase { -} -impl StorageStorageImpl of starknet::storage::StorageTrait { - type BaseType = StorageStorageBase; - fn storage(self: starknet::storage::FlattenedStorage) -> StorageStorageBase { - StorageStorageBase { - } - } -} -#[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 = starknet::storage::FlattenedStorage; - fn snapshot_deref(self: @ComponentState) -> starknet::storage::FlattenedStorage { - starknet::storage::FlattenedStorage {} - } -} -impl ComponentStateDerefMut of core::ops::DerefMut> { - type Target = starknet::storage::FlattenedStorage> ; - fn deref_mut(ref self: ComponentState) -> starknet::storage::FlattenedStorage> { - starknet::storage::FlattenedStorage {} - } -} -pub fn unsafe_new_component_state() -> ComponentState { - ComponentState:: { - } -} - - -// TODO(Gil): This generates duplicate diagnostics because of the plugin system, squash the duplicates into one. -#[deprecated( - feature: "deprecated_legacy_map", - note: "Use `starknet::storage::Map` instead." -)] -#[allow(unused_imports)] -use starknet::storage::Map as LegacyMap; -pub trait HasComponent { - fn get_component(self: @TContractState) -> @ComponentState; - fn get_component_mut(ref self: TContractState) -> ComponentState; - fn get_contract(self: @ComponentState) -> @TContractState; - fn get_contract_mut(ref self: ComponentState) -> TContractState; - fn emit>(ref self: ComponentState, event: S); -} -impl EventDrop of core::traits::Drop::; -impl EventIsEvent of starknet::Event { - fn append_keys_and_data( - self: @Event, ref keys: Array, ref data: Array - ) { - match self { - } - } - fn deserialize( - ref keys: Span, ref data: Span, - ) -> Option { - let __selector__ = *core::array::SpanTrait::pop_front(ref keys)?; - Option::None - } -} -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::contract] -pub mod spawn { - use dojo::contract::components::world_provider::{world_provider_cpt, world_provider_cpt::InternalTrait as WorldProviderInternal, IWorldProvider}; - use dojo::contract::components::upgradeable::upgradeable_cpt; - use dojo::contract::IContract; - - #[abi(embed_v0)] - impl WorldProviderImpl = world_provider_cpt::WorldProviderImpl; - - #[abi(embed_v0)] - impl UpgradeableImpl = upgradeable_cpt::UpgradeableImpl; - - #[abi(embed_v0)] - pub impl ContractImpl of IContract { - fn name(self: @ContractState) -> ByteArray { - "spawn" - } - - fn namespace(self: @ContractState) -> ByteArray { - "my_namespace" - } - - fn tag(self: @ContractState) -> ByteArray { - "my_namespace-spawn" - } - - fn name_hash(self: @ContractState) -> felt252 { - 2776321589048333240377325502911505147617911439383944762363370901236132332849 - } - - fn namespace_hash(self: @ContractState) -> felt252 { - 1685136890688416384941629523783652800960468745356230625531475538826800548713 - } - - fn selector(self: @ContractState) -> felt252 { - 927765609926166707747357189894656840364326580388522007560729768978560453318 - } - } - - use traits::Into; - use dojo::world::Context; - - fn execute(ctx: Context, name: felt252) { - return (); - } - - #[constructor] - fn constructor(ref self: ContractState) { - self.world_provider.initializer(); - } - #[abi(per_item)] -#[generate_trait] -pub impl IDojoInitImpl of IDojoInit { - #[external(v0)] - fn dojo_init(self: @ContractState) { - if starknet::get_caller_address() != self.world_provider.world().contract_address { - core::panics::panic_with_byte_array( - @format!("Only the world can init contract `{}`, but caller is `{:?}`", - self.tag(), - starknet::get_caller_address(), - )); - } - } -} - - #[event] - #[derive(Drop, starknet::Event)] - enum Event { - UpgradeableEvent: upgradeable_cpt::Event, - WorldProviderEvent: world_provider_cpt::Event, - } - pub trait IDojoInit { - #[external(v0)] - fn dojo_init(self: @ContractState); -} -impl EventDrop of core::traits::Drop::; -impl EventIsEvent of starknet::Event { - fn append_keys_and_data( - self: @Event, ref keys: Array, ref data: Array - ) { - match self { - Event::UpgradeableEvent(val) => { - core::array::ArrayTrait::append(ref keys, selector!("UpgradeableEvent")); - starknet::Event::append_keys_and_data( - val, ref keys, ref data - ); - }, - Event::WorldProviderEvent(val) => { - core::array::ArrayTrait::append(ref keys, selector!("WorldProviderEvent")); - starknet::Event::append_keys_and_data( - val, ref keys, ref data - ); - }, - } - } - fn deserialize( - ref keys: Span, ref data: Span, - ) -> Option { - let __selector__ = *core::array::SpanTrait::pop_front(ref keys)?; - if __selector__ == selector!("UpgradeableEvent") { - let val = starknet::Event::deserialize( - ref keys, ref data - )?; - return Option::Some(Event::UpgradeableEvent(val)); - } - if __selector__ == selector!("WorldProviderEvent") { - let val = starknet::Event::deserialize( - ref keys, ref data - )?; - return Option::Some(Event::WorldProviderEvent(val)); - } - Option::None - } -} -impl EventUpgradeableEventIntoEvent of Into { - fn into(self: upgradeable_cpt::Event) -> Event { - Event::UpgradeableEvent(self) - } -} -impl EventWorldProviderEventIntoEvent of Into { - fn into(self: world_provider_cpt::Event) -> Event { - Event::WorldProviderEvent(self) - } -} - - -#[phantom] -pub struct Storage { - #[substorage(v0)] - pub upgradeable: upgradeable_cpt::Storage, - #[substorage(v0)] - pub world_provider: world_provider_cpt::Storage, -} - -#[derive(Drop, Copy)] -pub struct StorageStorageBase { - pub upgradeable: starknet::storage::FlattenedStorage, - pub world_provider: starknet::storage::FlattenedStorage, -} -impl StorageStorageImpl of starknet::storage::StorageTrait { - type BaseType = StorageStorageBase; - fn storage(self: starknet::storage::FlattenedStorage) -> StorageStorageBase { - let __upgradeable_value__ = starknet::storage::FlattenedStorage {}; - let __world_provider_value__ = starknet::storage::FlattenedStorage {}; - StorageStorageBase { - upgradeable: __upgradeable_value__, - world_provider: __world_provider_value__, - } - } -} -#[derive(Drop, Copy)] -pub struct StorageStorageBaseMut { - pub upgradeable: starknet::storage::FlattenedStorage>, - pub world_provider: starknet::storage::FlattenedStorage>, -} -impl StorageStorageMutImpl of starknet::storage::StorageTraitMut { - type BaseType = StorageStorageBaseMut; - fn storage_mut(self: starknet::storage::FlattenedStorage>) -> StorageStorageBaseMut { - let __upgradeable_value__ = starknet::storage::FlattenedStorage {}; - let __world_provider_value__ = starknet::storage::FlattenedStorage {}; - StorageStorageBaseMut { - upgradeable: __upgradeable_value__, - world_provider: __world_provider_value__, - } - } -} - -pub struct ContractState { - pub upgradeable: upgradeable_cpt::ComponentState, - pub world_provider: world_provider_cpt::ComponentState, -} - -impl ContractStateDrop of Drop {} - -impl ContractStateDeref of core::ops::SnapshotDeref { - type Target = starknet::storage::FlattenedStorage; - fn snapshot_deref(self: @ContractState) -> starknet::storage::FlattenedStorage { - starknet::storage::FlattenedStorage {} - } -} -impl ContractStateDerefMut of core::ops::DerefMut { - type Target = starknet::storage::FlattenedStorage> ; - fn deref_mut(ref self: ContractState) -> starknet::storage::FlattenedStorage> { - starknet::storage::FlattenedStorage {} - } -} -pub fn unsafe_new_contract_state() -> ContractState { - ContractState { - upgradeable: upgradeable_cpt::unsafe_new_component_state::(), - world_provider: world_provider_cpt::unsafe_new_component_state::(), - } -} - -// TODO(Gil): This generates duplicate diagnostics because of the plugin system, squash the duplicates into one. -#[deprecated( - feature: "deprecated_legacy_map", - note: "Use `starknet::storage::Map` instead." -)] -#[allow(unused_imports)] -use starknet::storage::Map as LegacyMap; - -impl ContractStateWorldProviderImpl of - world_provider_cpt::UnsafeNewContractStateTraitForWorldProviderImpl { - fn unsafe_new_contract_state() -> ContractState { - unsafe_new_contract_state() - } -} -impl ContractStateUpgradeableImpl of - upgradeable_cpt::UnsafeNewContractStateTraitForUpgradeableImpl { - fn unsafe_new_contract_state() -> ContractState { - unsafe_new_contract_state() - } -} -#[implicit_precedence(core::pedersen::Pedersen, core::RangeCheck, core::integer::Bitwise, core::ec::EcOp, core::poseidon::Poseidon, core::SegmentArena, core::circuit::RangeCheck96, core::circuit::AddMod, core::circuit::MulMod, core::gas::GasBuiltin, System)] -fn __wrapper__ContractImpl__name(mut data: Span::) -> Span:: { - core::internal::require_implicit::(); - core::internal::revoke_ap_tracking(); - core::option::OptionTraitImpl::expect(core::gas::withdraw_gas(), 'Out of gas'); - - assert(core::array::SpanTrait::is_empty(data), 'Input too long for arguments'); - core::option::OptionTraitImpl::expect( - core::gas::withdraw_gas_all(core::gas::get_builtin_costs()), 'Out of gas', - ); - let mut contract_state = unsafe_new_contract_state(); - let res = ContractImpl::name(@contract_state, ); - let mut arr = ArrayTrait::new(); - // References. - // Result. - core::serde::Serde::::serialize(@res, ref arr); - core::array::ArrayTrait::span(@arr) -} - -#[implicit_precedence(core::pedersen::Pedersen, core::RangeCheck, core::integer::Bitwise, core::ec::EcOp, core::poseidon::Poseidon, core::SegmentArena, core::circuit::RangeCheck96, core::circuit::AddMod, core::circuit::MulMod, core::gas::GasBuiltin, System)] -fn __wrapper__ContractImpl__namespace(mut data: Span::) -> Span:: { - core::internal::require_implicit::(); - core::internal::revoke_ap_tracking(); - core::option::OptionTraitImpl::expect(core::gas::withdraw_gas(), 'Out of gas'); - - assert(core::array::SpanTrait::is_empty(data), 'Input too long for arguments'); - core::option::OptionTraitImpl::expect( - core::gas::withdraw_gas_all(core::gas::get_builtin_costs()), 'Out of gas', - ); - let mut contract_state = unsafe_new_contract_state(); - let res = ContractImpl::namespace(@contract_state, ); - let mut arr = ArrayTrait::new(); - // References. - // Result. - core::serde::Serde::::serialize(@res, ref arr); - core::array::ArrayTrait::span(@arr) -} - -#[implicit_precedence(core::pedersen::Pedersen, core::RangeCheck, core::integer::Bitwise, core::ec::EcOp, core::poseidon::Poseidon, core::SegmentArena, core::circuit::RangeCheck96, core::circuit::AddMod, core::circuit::MulMod, core::gas::GasBuiltin, System)] -fn __wrapper__ContractImpl__tag(mut data: Span::) -> Span:: { - core::internal::require_implicit::(); - core::internal::revoke_ap_tracking(); - core::option::OptionTraitImpl::expect(core::gas::withdraw_gas(), 'Out of gas'); - - assert(core::array::SpanTrait::is_empty(data), 'Input too long for arguments'); - core::option::OptionTraitImpl::expect( - core::gas::withdraw_gas_all(core::gas::get_builtin_costs()), 'Out of gas', - ); - let mut contract_state = unsafe_new_contract_state(); - let res = ContractImpl::tag(@contract_state, ); - let mut arr = ArrayTrait::new(); - // References. - // Result. - core::serde::Serde::::serialize(@res, ref arr); - core::array::ArrayTrait::span(@arr) -} - -#[implicit_precedence(core::pedersen::Pedersen, core::RangeCheck, core::integer::Bitwise, core::ec::EcOp, core::poseidon::Poseidon, core::SegmentArena, core::circuit::RangeCheck96, core::circuit::AddMod, core::circuit::MulMod, core::gas::GasBuiltin, System)] -fn __wrapper__ContractImpl__name_hash(mut data: Span::) -> Span:: { - core::internal::require_implicit::(); - core::internal::revoke_ap_tracking(); - core::option::OptionTraitImpl::expect(core::gas::withdraw_gas(), 'Out of gas'); - - assert(core::array::SpanTrait::is_empty(data), 'Input too long for arguments'); - core::option::OptionTraitImpl::expect( - core::gas::withdraw_gas_all(core::gas::get_builtin_costs()), 'Out of gas', - ); - let mut contract_state = unsafe_new_contract_state(); - let res = ContractImpl::name_hash(@contract_state, ); - let mut arr = ArrayTrait::new(); - // References. - // Result. - core::serde::Serde::::serialize(@res, ref arr); - core::array::ArrayTrait::span(@arr) -} - -#[implicit_precedence(core::pedersen::Pedersen, core::RangeCheck, core::integer::Bitwise, core::ec::EcOp, core::poseidon::Poseidon, core::SegmentArena, core::circuit::RangeCheck96, core::circuit::AddMod, core::circuit::MulMod, core::gas::GasBuiltin, System)] -fn __wrapper__ContractImpl__namespace_hash(mut data: Span::) -> Span:: { - core::internal::require_implicit::(); - core::internal::revoke_ap_tracking(); - core::option::OptionTraitImpl::expect(core::gas::withdraw_gas(), 'Out of gas'); - - assert(core::array::SpanTrait::is_empty(data), 'Input too long for arguments'); - core::option::OptionTraitImpl::expect( - core::gas::withdraw_gas_all(core::gas::get_builtin_costs()), 'Out of gas', - ); - let mut contract_state = unsafe_new_contract_state(); - let res = ContractImpl::namespace_hash(@contract_state, ); - let mut arr = ArrayTrait::new(); - // References. - // Result. - core::serde::Serde::::serialize(@res, ref arr); - core::array::ArrayTrait::span(@arr) -} - -#[implicit_precedence(core::pedersen::Pedersen, core::RangeCheck, core::integer::Bitwise, core::ec::EcOp, core::poseidon::Poseidon, core::SegmentArena, core::circuit::RangeCheck96, core::circuit::AddMod, core::circuit::MulMod, core::gas::GasBuiltin, System)] -fn __wrapper__ContractImpl__selector(mut data: Span::) -> Span:: { - core::internal::require_implicit::(); - core::internal::revoke_ap_tracking(); - core::option::OptionTraitImpl::expect(core::gas::withdraw_gas(), 'Out of gas'); - - assert(core::array::SpanTrait::is_empty(data), 'Input too long for arguments'); - core::option::OptionTraitImpl::expect( - core::gas::withdraw_gas_all(core::gas::get_builtin_costs()), 'Out of gas', - ); - let mut contract_state = unsafe_new_contract_state(); - let res = ContractImpl::selector(@contract_state, ); - let mut arr = ArrayTrait::new(); - // References. - // Result. - core::serde::Serde::::serialize(@res, ref arr); - core::array::ArrayTrait::span(@arr) -} - -#[implicit_precedence(core::pedersen::Pedersen, core::RangeCheck, core::integer::Bitwise, core::ec::EcOp, core::poseidon::Poseidon, core::SegmentArena, core::circuit::RangeCheck96, core::circuit::AddMod, core::circuit::MulMod, core::gas::GasBuiltin, System)] -fn __wrapper__constructor(mut data: Span::) -> Span:: { - core::internal::require_implicit::(); - core::internal::revoke_ap_tracking(); - core::option::OptionTraitImpl::expect(core::gas::withdraw_gas(), 'Out of gas'); - - assert(core::array::SpanTrait::is_empty(data), 'Input too long for arguments'); - core::option::OptionTraitImpl::expect( - core::gas::withdraw_gas_all(core::gas::get_builtin_costs()), 'Out of gas', - ); - let mut contract_state = unsafe_new_contract_state(); - constructor(ref contract_state, ); - let mut arr = ArrayTrait::new(); - // References. - // Result. - core::array::ArrayTrait::span(@arr) -} - -#[implicit_precedence(core::pedersen::Pedersen, core::RangeCheck, core::integer::Bitwise, core::ec::EcOp, core::poseidon::Poseidon, core::SegmentArena, core::circuit::RangeCheck96, core::circuit::AddMod, core::circuit::MulMod, core::gas::GasBuiltin, System)] -fn __wrapper__IDojoInitImpl__dojo_init(mut data: Span::) -> Span:: { - core::internal::require_implicit::(); - core::internal::revoke_ap_tracking(); - core::option::OptionTraitImpl::expect(core::gas::withdraw_gas(), 'Out of gas'); - - assert(core::array::SpanTrait::is_empty(data), 'Input too long for arguments'); - core::option::OptionTraitImpl::expect( - core::gas::withdraw_gas_all(core::gas::get_builtin_costs()), 'Out of gas', - ); - let mut contract_state = unsafe_new_contract_state(); - IDojoInitImpl::dojo_init(@contract_state, ); - let mut arr = ArrayTrait::new(); - // References. - // Result. - core::array::ArrayTrait::span(@arr) -} - - -pub mod __external { - pub use super::__wrapper__ContractImpl__name as name; - pub use super::__wrapper__ContractImpl__namespace as namespace; - pub use super::__wrapper__ContractImpl__tag as tag; - pub use super::__wrapper__ContractImpl__name_hash as name_hash; - pub use super::__wrapper__ContractImpl__namespace_hash as namespace_hash; - pub use super::__wrapper__ContractImpl__selector as selector; - pub use super::__wrapper__IDojoInitImpl__dojo_init as dojo_init; -} -pub mod __l1_handler { -} -pub mod __constructor { - pub use super::__wrapper__constructor as constructor; -} - impl ContractStateEventEmitter of starknet::event::EventEmitter< - ContractState, Event - > { - fn emit>( - ref self: ContractState, event: S - ) { - let event: Event = core::traits::Into::into(event); - let mut keys = Default::::default(); - let mut data = Default::::default(); - starknet::Event::append_keys_and_data(@event, ref keys, ref data); - starknet::SyscallResultTrait::unwrap_syscall( - starknet::syscalls::emit_event_syscall( - core::array::ArrayTrait::span(@keys), - core::array::ArrayTrait::span(@data), - ) - ) - } - } - -impl HasComponentImpl_world_provider_cpt of world_provider_cpt::HasComponent { - fn get_component(self: @ContractState) -> @world_provider_cpt::ComponentState { - @world_provider_cpt::unsafe_new_component_state::() - } - fn get_component_mut(ref self: ContractState) -> world_provider_cpt::ComponentState { - world_provider_cpt::unsafe_new_component_state::() - } - fn get_contract(self: @world_provider_cpt::ComponentState) -> @ContractState { - @unsafe_new_contract_state() - } - fn get_contract_mut(ref self: world_provider_cpt::ComponentState) -> ContractState { - unsafe_new_contract_state() - } - fn emit>(ref self: world_provider_cpt::ComponentState, event: S) { - let event: world_provider_cpt::Event = core::traits::Into::into(event); - let mut contract = world_provider_cpt::HasComponent::get_contract_mut(ref self); - ContractStateEventEmitter::emit(ref contract, Event::WorldProviderEvent(event)); - } -} -impl HasComponentImpl_upgradeable_cpt of upgradeable_cpt::HasComponent { - fn get_component(self: @ContractState) -> @upgradeable_cpt::ComponentState { - @upgradeable_cpt::unsafe_new_component_state::() - } - fn get_component_mut(ref self: ContractState) -> upgradeable_cpt::ComponentState { - upgradeable_cpt::unsafe_new_component_state::() - } - fn get_contract(self: @upgradeable_cpt::ComponentState) -> @ContractState { - @unsafe_new_contract_state() - } - fn get_contract_mut(ref self: upgradeable_cpt::ComponentState) -> ContractState { - unsafe_new_contract_state() - } - fn emit>(ref self: upgradeable_cpt::ComponentState, event: S) { - let event: upgradeable_cpt::Event = core::traits::Into::into(event); - let mut contract = upgradeable_cpt::HasComponent::get_contract_mut(ref self); - ContractStateEventEmitter::emit(ref contract, Event::UpgradeableEvent(event)); - } -} -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::contract] -pub mod proxy { - use dojo::contract::components::world_provider::{world_provider_cpt, world_provider_cpt::InternalTrait as WorldProviderInternal, IWorldProvider}; - use dojo::contract::components::upgradeable::upgradeable_cpt; - use dojo::contract::IContract; - - #[abi(embed_v0)] - impl WorldProviderImpl = world_provider_cpt::WorldProviderImpl; - - #[abi(embed_v0)] - impl UpgradeableImpl = upgradeable_cpt::UpgradeableImpl; - - #[abi(embed_v0)] - pub impl ContractImpl of IContract { - fn name(self: @ContractState) -> ByteArray { - "proxy" - } - - fn namespace(self: @ContractState) -> ByteArray { - "my_namespace" - } - - fn tag(self: @ContractState) -> ByteArray { - "my_namespace-proxy" - } - - fn name_hash(self: @ContractState) -> felt252 { - 379211399603323842291430789821178524592027629543381998047225121027704003915 - } - - fn namespace_hash(self: @ContractState) -> felt252 { - 1685136890688416384941629523783652800960468745356230625531475538826800548713 - } - - fn selector(self: @ContractState) -> felt252 { - 1517897915978631541665409557725081861100844369870047691780983681552158397188 - } - } - - fn execute(value: felt252) -> felt252 { - value - } - - #[constructor] - fn constructor(ref self: ContractState) { - self.world_provider.initializer(); - } - #[abi(per_item)] -#[generate_trait] -pub impl IDojoInitImpl of IDojoInit { - #[external(v0)] - fn dojo_init(self: @ContractState) { - if starknet::get_caller_address() != self.world_provider.world().contract_address { - core::panics::panic_with_byte_array( - @format!("Only the world can init contract `{}`, but caller is `{:?}`", - self.tag(), - starknet::get_caller_address(), - )); - } - } -} - - #[event] - #[derive(Drop, starknet::Event)] - enum Event { - UpgradeableEvent: upgradeable_cpt::Event, - WorldProviderEvent: world_provider_cpt::Event, - } - pub trait IDojoInit { - #[external(v0)] - fn dojo_init(self: @ContractState); -} -impl EventDrop of core::traits::Drop::; -impl EventIsEvent of starknet::Event { - fn append_keys_and_data( - self: @Event, ref keys: Array, ref data: Array - ) { - match self { - Event::UpgradeableEvent(val) => { - core::array::ArrayTrait::append(ref keys, selector!("UpgradeableEvent")); - starknet::Event::append_keys_and_data( - val, ref keys, ref data - ); - }, - Event::WorldProviderEvent(val) => { - core::array::ArrayTrait::append(ref keys, selector!("WorldProviderEvent")); - starknet::Event::append_keys_and_data( - val, ref keys, ref data - ); - }, - } - } - fn deserialize( - ref keys: Span, ref data: Span, - ) -> Option { - let __selector__ = *core::array::SpanTrait::pop_front(ref keys)?; - if __selector__ == selector!("UpgradeableEvent") { - let val = starknet::Event::deserialize( - ref keys, ref data - )?; - return Option::Some(Event::UpgradeableEvent(val)); - } - if __selector__ == selector!("WorldProviderEvent") { - let val = starknet::Event::deserialize( - ref keys, ref data - )?; - return Option::Some(Event::WorldProviderEvent(val)); - } - Option::None - } -} -impl EventUpgradeableEventIntoEvent of Into { - fn into(self: upgradeable_cpt::Event) -> Event { - Event::UpgradeableEvent(self) - } -} -impl EventWorldProviderEventIntoEvent of Into { - fn into(self: world_provider_cpt::Event) -> Event { - Event::WorldProviderEvent(self) - } -} - - -#[phantom] -pub struct Storage { - #[substorage(v0)] - pub upgradeable: upgradeable_cpt::Storage, - #[substorage(v0)] - pub world_provider: world_provider_cpt::Storage, -} - -#[derive(Drop, Copy)] -pub struct StorageStorageBase { - pub upgradeable: starknet::storage::FlattenedStorage, - pub world_provider: starknet::storage::FlattenedStorage, -} -impl StorageStorageImpl of starknet::storage::StorageTrait { - type BaseType = StorageStorageBase; - fn storage(self: starknet::storage::FlattenedStorage) -> StorageStorageBase { - let __upgradeable_value__ = starknet::storage::FlattenedStorage {}; - let __world_provider_value__ = starknet::storage::FlattenedStorage {}; - StorageStorageBase { - upgradeable: __upgradeable_value__, - world_provider: __world_provider_value__, - } - } -} -#[derive(Drop, Copy)] -pub struct StorageStorageBaseMut { - pub upgradeable: starknet::storage::FlattenedStorage>, - pub world_provider: starknet::storage::FlattenedStorage>, -} -impl StorageStorageMutImpl of starknet::storage::StorageTraitMut { - type BaseType = StorageStorageBaseMut; - fn storage_mut(self: starknet::storage::FlattenedStorage>) -> StorageStorageBaseMut { - let __upgradeable_value__ = starknet::storage::FlattenedStorage {}; - let __world_provider_value__ = starknet::storage::FlattenedStorage {}; - StorageStorageBaseMut { - upgradeable: __upgradeable_value__, - world_provider: __world_provider_value__, - } - } -} - -pub struct ContractState { - pub upgradeable: upgradeable_cpt::ComponentState, - pub world_provider: world_provider_cpt::ComponentState, -} - -impl ContractStateDrop of Drop {} - -impl ContractStateDeref of core::ops::SnapshotDeref { - type Target = starknet::storage::FlattenedStorage; - fn snapshot_deref(self: @ContractState) -> starknet::storage::FlattenedStorage { - starknet::storage::FlattenedStorage {} - } -} -impl ContractStateDerefMut of core::ops::DerefMut { - type Target = starknet::storage::FlattenedStorage> ; - fn deref_mut(ref self: ContractState) -> starknet::storage::FlattenedStorage> { - starknet::storage::FlattenedStorage {} - } -} -pub fn unsafe_new_contract_state() -> ContractState { - ContractState { - upgradeable: upgradeable_cpt::unsafe_new_component_state::(), - world_provider: world_provider_cpt::unsafe_new_component_state::(), - } -} - -// TODO(Gil): This generates duplicate diagnostics because of the plugin system, squash the duplicates into one. -#[deprecated( - feature: "deprecated_legacy_map", - note: "Use `starknet::storage::Map` instead." -)] -#[allow(unused_imports)] -use starknet::storage::Map as LegacyMap; - -impl ContractStateWorldProviderImpl of - world_provider_cpt::UnsafeNewContractStateTraitForWorldProviderImpl { - fn unsafe_new_contract_state() -> ContractState { - unsafe_new_contract_state() - } -} -impl ContractStateUpgradeableImpl of - upgradeable_cpt::UnsafeNewContractStateTraitForUpgradeableImpl { - fn unsafe_new_contract_state() -> ContractState { - unsafe_new_contract_state() - } -} -#[implicit_precedence(core::pedersen::Pedersen, core::RangeCheck, core::integer::Bitwise, core::ec::EcOp, core::poseidon::Poseidon, core::SegmentArena, core::circuit::RangeCheck96, core::circuit::AddMod, core::circuit::MulMod, core::gas::GasBuiltin, System)] -fn __wrapper__ContractImpl__name(mut data: Span::) -> Span:: { - core::internal::require_implicit::(); - core::internal::revoke_ap_tracking(); - core::option::OptionTraitImpl::expect(core::gas::withdraw_gas(), 'Out of gas'); - - assert(core::array::SpanTrait::is_empty(data), 'Input too long for arguments'); - core::option::OptionTraitImpl::expect( - core::gas::withdraw_gas_all(core::gas::get_builtin_costs()), 'Out of gas', - ); - let mut contract_state = unsafe_new_contract_state(); - let res = ContractImpl::name(@contract_state, ); - let mut arr = ArrayTrait::new(); - // References. - // Result. - core::serde::Serde::::serialize(@res, ref arr); - core::array::ArrayTrait::span(@arr) -} - -#[implicit_precedence(core::pedersen::Pedersen, core::RangeCheck, core::integer::Bitwise, core::ec::EcOp, core::poseidon::Poseidon, core::SegmentArena, core::circuit::RangeCheck96, core::circuit::AddMod, core::circuit::MulMod, core::gas::GasBuiltin, System)] -fn __wrapper__ContractImpl__namespace(mut data: Span::) -> Span:: { - core::internal::require_implicit::(); - core::internal::revoke_ap_tracking(); - core::option::OptionTraitImpl::expect(core::gas::withdraw_gas(), 'Out of gas'); - - assert(core::array::SpanTrait::is_empty(data), 'Input too long for arguments'); - core::option::OptionTraitImpl::expect( - core::gas::withdraw_gas_all(core::gas::get_builtin_costs()), 'Out of gas', - ); - let mut contract_state = unsafe_new_contract_state(); - let res = ContractImpl::namespace(@contract_state, ); - let mut arr = ArrayTrait::new(); - // References. - // Result. - core::serde::Serde::::serialize(@res, ref arr); - core::array::ArrayTrait::span(@arr) -} - -#[implicit_precedence(core::pedersen::Pedersen, core::RangeCheck, core::integer::Bitwise, core::ec::EcOp, core::poseidon::Poseidon, core::SegmentArena, core::circuit::RangeCheck96, core::circuit::AddMod, core::circuit::MulMod, core::gas::GasBuiltin, System)] -fn __wrapper__ContractImpl__tag(mut data: Span::) -> Span:: { - core::internal::require_implicit::(); - core::internal::revoke_ap_tracking(); - core::option::OptionTraitImpl::expect(core::gas::withdraw_gas(), 'Out of gas'); - - assert(core::array::SpanTrait::is_empty(data), 'Input too long for arguments'); - core::option::OptionTraitImpl::expect( - core::gas::withdraw_gas_all(core::gas::get_builtin_costs()), 'Out of gas', - ); - let mut contract_state = unsafe_new_contract_state(); - let res = ContractImpl::tag(@contract_state, ); - let mut arr = ArrayTrait::new(); - // References. - // Result. - core::serde::Serde::::serialize(@res, ref arr); - core::array::ArrayTrait::span(@arr) -} - -#[implicit_precedence(core::pedersen::Pedersen, core::RangeCheck, core::integer::Bitwise, core::ec::EcOp, core::poseidon::Poseidon, core::SegmentArena, core::circuit::RangeCheck96, core::circuit::AddMod, core::circuit::MulMod, core::gas::GasBuiltin, System)] -fn __wrapper__ContractImpl__name_hash(mut data: Span::) -> Span:: { - core::internal::require_implicit::(); - core::internal::revoke_ap_tracking(); - core::option::OptionTraitImpl::expect(core::gas::withdraw_gas(), 'Out of gas'); - - assert(core::array::SpanTrait::is_empty(data), 'Input too long for arguments'); - core::option::OptionTraitImpl::expect( - core::gas::withdraw_gas_all(core::gas::get_builtin_costs()), 'Out of gas', - ); - let mut contract_state = unsafe_new_contract_state(); - let res = ContractImpl::name_hash(@contract_state, ); - let mut arr = ArrayTrait::new(); - // References. - // Result. - core::serde::Serde::::serialize(@res, ref arr); - core::array::ArrayTrait::span(@arr) -} - -#[implicit_precedence(core::pedersen::Pedersen, core::RangeCheck, core::integer::Bitwise, core::ec::EcOp, core::poseidon::Poseidon, core::SegmentArena, core::circuit::RangeCheck96, core::circuit::AddMod, core::circuit::MulMod, core::gas::GasBuiltin, System)] -fn __wrapper__ContractImpl__namespace_hash(mut data: Span::) -> Span:: { - core::internal::require_implicit::(); - core::internal::revoke_ap_tracking(); - core::option::OptionTraitImpl::expect(core::gas::withdraw_gas(), 'Out of gas'); - - assert(core::array::SpanTrait::is_empty(data), 'Input too long for arguments'); - core::option::OptionTraitImpl::expect( - core::gas::withdraw_gas_all(core::gas::get_builtin_costs()), 'Out of gas', - ); - let mut contract_state = unsafe_new_contract_state(); - let res = ContractImpl::namespace_hash(@contract_state, ); - let mut arr = ArrayTrait::new(); - // References. - // Result. - core::serde::Serde::::serialize(@res, ref arr); - core::array::ArrayTrait::span(@arr) -} - -#[implicit_precedence(core::pedersen::Pedersen, core::RangeCheck, core::integer::Bitwise, core::ec::EcOp, core::poseidon::Poseidon, core::SegmentArena, core::circuit::RangeCheck96, core::circuit::AddMod, core::circuit::MulMod, core::gas::GasBuiltin, System)] -fn __wrapper__ContractImpl__selector(mut data: Span::) -> Span:: { - core::internal::require_implicit::(); - core::internal::revoke_ap_tracking(); - core::option::OptionTraitImpl::expect(core::gas::withdraw_gas(), 'Out of gas'); - - assert(core::array::SpanTrait::is_empty(data), 'Input too long for arguments'); - core::option::OptionTraitImpl::expect( - core::gas::withdraw_gas_all(core::gas::get_builtin_costs()), 'Out of gas', - ); - let mut contract_state = unsafe_new_contract_state(); - let res = ContractImpl::selector(@contract_state, ); - let mut arr = ArrayTrait::new(); - // References. - // Result. - core::serde::Serde::::serialize(@res, ref arr); - core::array::ArrayTrait::span(@arr) -} - -#[implicit_precedence(core::pedersen::Pedersen, core::RangeCheck, core::integer::Bitwise, core::ec::EcOp, core::poseidon::Poseidon, core::SegmentArena, core::circuit::RangeCheck96, core::circuit::AddMod, core::circuit::MulMod, core::gas::GasBuiltin, System)] -fn __wrapper__constructor(mut data: Span::) -> Span:: { - core::internal::require_implicit::(); - core::internal::revoke_ap_tracking(); - core::option::OptionTraitImpl::expect(core::gas::withdraw_gas(), 'Out of gas'); - - assert(core::array::SpanTrait::is_empty(data), 'Input too long for arguments'); - core::option::OptionTraitImpl::expect( - core::gas::withdraw_gas_all(core::gas::get_builtin_costs()), 'Out of gas', - ); - let mut contract_state = unsafe_new_contract_state(); - constructor(ref contract_state, ); - let mut arr = ArrayTrait::new(); - // References. - // Result. - core::array::ArrayTrait::span(@arr) -} - -#[implicit_precedence(core::pedersen::Pedersen, core::RangeCheck, core::integer::Bitwise, core::ec::EcOp, core::poseidon::Poseidon, core::SegmentArena, core::circuit::RangeCheck96, core::circuit::AddMod, core::circuit::MulMod, core::gas::GasBuiltin, System)] -fn __wrapper__IDojoInitImpl__dojo_init(mut data: Span::) -> Span:: { - core::internal::require_implicit::(); - core::internal::revoke_ap_tracking(); - core::option::OptionTraitImpl::expect(core::gas::withdraw_gas(), 'Out of gas'); - - assert(core::array::SpanTrait::is_empty(data), 'Input too long for arguments'); - core::option::OptionTraitImpl::expect( - core::gas::withdraw_gas_all(core::gas::get_builtin_costs()), 'Out of gas', - ); - let mut contract_state = unsafe_new_contract_state(); - IDojoInitImpl::dojo_init(@contract_state, ); - let mut arr = ArrayTrait::new(); - // References. - // Result. - core::array::ArrayTrait::span(@arr) -} - - -pub mod __external { - pub use super::__wrapper__ContractImpl__name as name; - pub use super::__wrapper__ContractImpl__namespace as namespace; - pub use super::__wrapper__ContractImpl__tag as tag; - pub use super::__wrapper__ContractImpl__name_hash as name_hash; - pub use super::__wrapper__ContractImpl__namespace_hash as namespace_hash; - pub use super::__wrapper__ContractImpl__selector as selector; - pub use super::__wrapper__IDojoInitImpl__dojo_init as dojo_init; -} -pub mod __l1_handler { -} -pub mod __constructor { - pub use super::__wrapper__constructor as constructor; -} - impl ContractStateEventEmitter of starknet::event::EventEmitter< - ContractState, Event - > { - fn emit>( - ref self: ContractState, event: S - ) { - let event: Event = core::traits::Into::into(event); - let mut keys = Default::::default(); - let mut data = Default::::default(); - starknet::Event::append_keys_and_data(@event, ref keys, ref data); - starknet::SyscallResultTrait::unwrap_syscall( - starknet::syscalls::emit_event_syscall( - core::array::ArrayTrait::span(@keys), - core::array::ArrayTrait::span(@data), - ) - ) - } - } - -impl HasComponentImpl_world_provider_cpt of world_provider_cpt::HasComponent { - fn get_component(self: @ContractState) -> @world_provider_cpt::ComponentState { - @world_provider_cpt::unsafe_new_component_state::() - } - fn get_component_mut(ref self: ContractState) -> world_provider_cpt::ComponentState { - world_provider_cpt::unsafe_new_component_state::() - } - fn get_contract(self: @world_provider_cpt::ComponentState) -> @ContractState { - @unsafe_new_contract_state() - } - fn get_contract_mut(ref self: world_provider_cpt::ComponentState) -> ContractState { - unsafe_new_contract_state() - } - fn emit>(ref self: world_provider_cpt::ComponentState, event: S) { - let event: world_provider_cpt::Event = core::traits::Into::into(event); - let mut contract = world_provider_cpt::HasComponent::get_contract_mut(ref self); - ContractStateEventEmitter::emit(ref contract, Event::WorldProviderEvent(event)); - } -} -impl HasComponentImpl_upgradeable_cpt of upgradeable_cpt::HasComponent { - fn get_component(self: @ContractState) -> @upgradeable_cpt::ComponentState { - @upgradeable_cpt::unsafe_new_component_state::() - } - fn get_component_mut(ref self: ContractState) -> upgradeable_cpt::ComponentState { - upgradeable_cpt::unsafe_new_component_state::() - } - fn get_contract(self: @upgradeable_cpt::ComponentState) -> @ContractState { - @unsafe_new_contract_state() - } - fn get_contract_mut(ref self: upgradeable_cpt::ComponentState) -> ContractState { - unsafe_new_contract_state() - } - fn emit>(ref self: upgradeable_cpt::ComponentState, event: S) { - let event: upgradeable_cpt::Event = core::traits::Into::into(event); - let mut contract = upgradeable_cpt::HasComponent::get_contract_mut(ref self); - ContractStateEventEmitter::emit(ref contract, Event::UpgradeableEvent(event)); - } -} -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::contract] -pub mod ctxnamed { - use dojo::contract::components::world_provider::{world_provider_cpt, world_provider_cpt::InternalTrait as WorldProviderInternal, IWorldProvider}; - use dojo::contract::components::upgradeable::upgradeable_cpt; - use dojo::contract::IContract; - - #[abi(embed_v0)] - impl WorldProviderImpl = world_provider_cpt::WorldProviderImpl; - - #[abi(embed_v0)] - impl UpgradeableImpl = upgradeable_cpt::UpgradeableImpl; - - #[abi(embed_v0)] - pub impl ContractImpl of IContract { - fn name(self: @ContractState) -> ByteArray { - "ctxnamed" - } - - fn namespace(self: @ContractState) -> ByteArray { - "dojo_test" - } - - fn tag(self: @ContractState) -> ByteArray { - "dojo_test-ctxnamed" - } - - fn name_hash(self: @ContractState) -> felt252 { - 1120614286815912604239420768209466007446460277061516527925636408561239543041 - } - - fn namespace_hash(self: @ContractState) -> felt252 { - 1452123528942907587532668415362544424816022573043154497385993678618948064048 - } - - fn selector(self: @ContractState) -> felt252 { - 1088922133313711214547564678240399488767278073212336739350382494993498982824 - } - } - - use traits::Into; - use dojo::world::Context; - - fn execute(ctx2: Context, name: felt252) { - return (); - } - - #[constructor] - fn constructor(ref self: ContractState) { - self.world_provider.initializer(); - } - #[abi(per_item)] -#[generate_trait] -pub impl IDojoInitImpl of IDojoInit { - #[external(v0)] - fn dojo_init(self: @ContractState) { - if starknet::get_caller_address() != self.world_provider.world().contract_address { - core::panics::panic_with_byte_array( - @format!("Only the world can init contract `{}`, but caller is `{:?}`", - self.tag(), - starknet::get_caller_address(), - )); - } - } -} - - #[event] - #[derive(Drop, starknet::Event)] - enum Event { - UpgradeableEvent: upgradeable_cpt::Event, - WorldProviderEvent: world_provider_cpt::Event, - } - pub trait IDojoInit { - #[external(v0)] - fn dojo_init(self: @ContractState); -} -impl EventDrop of core::traits::Drop::; -impl EventIsEvent of starknet::Event { - fn append_keys_and_data( - self: @Event, ref keys: Array, ref data: Array - ) { - match self { - Event::UpgradeableEvent(val) => { - core::array::ArrayTrait::append(ref keys, selector!("UpgradeableEvent")); - starknet::Event::append_keys_and_data( - val, ref keys, ref data - ); - }, - Event::WorldProviderEvent(val) => { - core::array::ArrayTrait::append(ref keys, selector!("WorldProviderEvent")); - starknet::Event::append_keys_and_data( - val, ref keys, ref data - ); - }, - } - } - fn deserialize( - ref keys: Span, ref data: Span, - ) -> Option { - let __selector__ = *core::array::SpanTrait::pop_front(ref keys)?; - if __selector__ == selector!("UpgradeableEvent") { - let val = starknet::Event::deserialize( - ref keys, ref data - )?; - return Option::Some(Event::UpgradeableEvent(val)); - } - if __selector__ == selector!("WorldProviderEvent") { - let val = starknet::Event::deserialize( - ref keys, ref data - )?; - return Option::Some(Event::WorldProviderEvent(val)); - } - Option::None - } -} -impl EventUpgradeableEventIntoEvent of Into { - fn into(self: upgradeable_cpt::Event) -> Event { - Event::UpgradeableEvent(self) - } -} -impl EventWorldProviderEventIntoEvent of Into { - fn into(self: world_provider_cpt::Event) -> Event { - Event::WorldProviderEvent(self) - } -} - - -#[phantom] -pub struct Storage { - #[substorage(v0)] - pub upgradeable: upgradeable_cpt::Storage, - #[substorage(v0)] - pub world_provider: world_provider_cpt::Storage, -} - -#[derive(Drop, Copy)] -pub struct StorageStorageBase { - pub upgradeable: starknet::storage::FlattenedStorage, - pub world_provider: starknet::storage::FlattenedStorage, -} -impl StorageStorageImpl of starknet::storage::StorageTrait { - type BaseType = StorageStorageBase; - fn storage(self: starknet::storage::FlattenedStorage) -> StorageStorageBase { - let __upgradeable_value__ = starknet::storage::FlattenedStorage {}; - let __world_provider_value__ = starknet::storage::FlattenedStorage {}; - StorageStorageBase { - upgradeable: __upgradeable_value__, - world_provider: __world_provider_value__, - } - } -} -#[derive(Drop, Copy)] -pub struct StorageStorageBaseMut { - pub upgradeable: starknet::storage::FlattenedStorage>, - pub world_provider: starknet::storage::FlattenedStorage>, -} -impl StorageStorageMutImpl of starknet::storage::StorageTraitMut { - type BaseType = StorageStorageBaseMut; - fn storage_mut(self: starknet::storage::FlattenedStorage>) -> StorageStorageBaseMut { - let __upgradeable_value__ = starknet::storage::FlattenedStorage {}; - let __world_provider_value__ = starknet::storage::FlattenedStorage {}; - StorageStorageBaseMut { - upgradeable: __upgradeable_value__, - world_provider: __world_provider_value__, - } - } -} - -pub struct ContractState { - pub upgradeable: upgradeable_cpt::ComponentState, - pub world_provider: world_provider_cpt::ComponentState, -} - -impl ContractStateDrop of Drop {} - -impl ContractStateDeref of core::ops::SnapshotDeref { - type Target = starknet::storage::FlattenedStorage; - fn snapshot_deref(self: @ContractState) -> starknet::storage::FlattenedStorage { - starknet::storage::FlattenedStorage {} - } -} -impl ContractStateDerefMut of core::ops::DerefMut { - type Target = starknet::storage::FlattenedStorage> ; - fn deref_mut(ref self: ContractState) -> starknet::storage::FlattenedStorage> { - starknet::storage::FlattenedStorage {} - } -} -pub fn unsafe_new_contract_state() -> ContractState { - ContractState { - upgradeable: upgradeable_cpt::unsafe_new_component_state::(), - world_provider: world_provider_cpt::unsafe_new_component_state::(), - } -} - -// TODO(Gil): This generates duplicate diagnostics because of the plugin system, squash the duplicates into one. -#[deprecated( - feature: "deprecated_legacy_map", - note: "Use `starknet::storage::Map` instead." -)] -#[allow(unused_imports)] -use starknet::storage::Map as LegacyMap; - -impl ContractStateWorldProviderImpl of - world_provider_cpt::UnsafeNewContractStateTraitForWorldProviderImpl { - fn unsafe_new_contract_state() -> ContractState { - unsafe_new_contract_state() - } -} -impl ContractStateUpgradeableImpl of - upgradeable_cpt::UnsafeNewContractStateTraitForUpgradeableImpl { - fn unsafe_new_contract_state() -> ContractState { - unsafe_new_contract_state() - } -} -#[implicit_precedence(core::pedersen::Pedersen, core::RangeCheck, core::integer::Bitwise, core::ec::EcOp, core::poseidon::Poseidon, core::SegmentArena, core::circuit::RangeCheck96, core::circuit::AddMod, core::circuit::MulMod, core::gas::GasBuiltin, System)] -fn __wrapper__ContractImpl__name(mut data: Span::) -> Span:: { - core::internal::require_implicit::(); - core::internal::revoke_ap_tracking(); - core::option::OptionTraitImpl::expect(core::gas::withdraw_gas(), 'Out of gas'); - - assert(core::array::SpanTrait::is_empty(data), 'Input too long for arguments'); - core::option::OptionTraitImpl::expect( - core::gas::withdraw_gas_all(core::gas::get_builtin_costs()), 'Out of gas', - ); - let mut contract_state = unsafe_new_contract_state(); - let res = ContractImpl::name(@contract_state, ); - let mut arr = ArrayTrait::new(); - // References. - // Result. - core::serde::Serde::::serialize(@res, ref arr); - core::array::ArrayTrait::span(@arr) -} - -#[implicit_precedence(core::pedersen::Pedersen, core::RangeCheck, core::integer::Bitwise, core::ec::EcOp, core::poseidon::Poseidon, core::SegmentArena, core::circuit::RangeCheck96, core::circuit::AddMod, core::circuit::MulMod, core::gas::GasBuiltin, System)] -fn __wrapper__ContractImpl__namespace(mut data: Span::) -> Span:: { - core::internal::require_implicit::(); - core::internal::revoke_ap_tracking(); - core::option::OptionTraitImpl::expect(core::gas::withdraw_gas(), 'Out of gas'); - - assert(core::array::SpanTrait::is_empty(data), 'Input too long for arguments'); - core::option::OptionTraitImpl::expect( - core::gas::withdraw_gas_all(core::gas::get_builtin_costs()), 'Out of gas', - ); - let mut contract_state = unsafe_new_contract_state(); - let res = ContractImpl::namespace(@contract_state, ); - let mut arr = ArrayTrait::new(); - // References. - // Result. - core::serde::Serde::::serialize(@res, ref arr); - core::array::ArrayTrait::span(@arr) -} - -#[implicit_precedence(core::pedersen::Pedersen, core::RangeCheck, core::integer::Bitwise, core::ec::EcOp, core::poseidon::Poseidon, core::SegmentArena, core::circuit::RangeCheck96, core::circuit::AddMod, core::circuit::MulMod, core::gas::GasBuiltin, System)] -fn __wrapper__ContractImpl__tag(mut data: Span::) -> Span:: { - core::internal::require_implicit::(); - core::internal::revoke_ap_tracking(); - core::option::OptionTraitImpl::expect(core::gas::withdraw_gas(), 'Out of gas'); - - assert(core::array::SpanTrait::is_empty(data), 'Input too long for arguments'); - core::option::OptionTraitImpl::expect( - core::gas::withdraw_gas_all(core::gas::get_builtin_costs()), 'Out of gas', - ); - let mut contract_state = unsafe_new_contract_state(); - let res = ContractImpl::tag(@contract_state, ); - let mut arr = ArrayTrait::new(); - // References. - // Result. - core::serde::Serde::::serialize(@res, ref arr); - core::array::ArrayTrait::span(@arr) -} - -#[implicit_precedence(core::pedersen::Pedersen, core::RangeCheck, core::integer::Bitwise, core::ec::EcOp, core::poseidon::Poseidon, core::SegmentArena, core::circuit::RangeCheck96, core::circuit::AddMod, core::circuit::MulMod, core::gas::GasBuiltin, System)] -fn __wrapper__ContractImpl__name_hash(mut data: Span::) -> Span:: { - core::internal::require_implicit::(); - core::internal::revoke_ap_tracking(); - core::option::OptionTraitImpl::expect(core::gas::withdraw_gas(), 'Out of gas'); - - assert(core::array::SpanTrait::is_empty(data), 'Input too long for arguments'); - core::option::OptionTraitImpl::expect( - core::gas::withdraw_gas_all(core::gas::get_builtin_costs()), 'Out of gas', - ); - let mut contract_state = unsafe_new_contract_state(); - let res = ContractImpl::name_hash(@contract_state, ); - let mut arr = ArrayTrait::new(); - // References. - // Result. - core::serde::Serde::::serialize(@res, ref arr); - core::array::ArrayTrait::span(@arr) -} - -#[implicit_precedence(core::pedersen::Pedersen, core::RangeCheck, core::integer::Bitwise, core::ec::EcOp, core::poseidon::Poseidon, core::SegmentArena, core::circuit::RangeCheck96, core::circuit::AddMod, core::circuit::MulMod, core::gas::GasBuiltin, System)] -fn __wrapper__ContractImpl__namespace_hash(mut data: Span::) -> Span:: { - core::internal::require_implicit::(); - core::internal::revoke_ap_tracking(); - core::option::OptionTraitImpl::expect(core::gas::withdraw_gas(), 'Out of gas'); - - assert(core::array::SpanTrait::is_empty(data), 'Input too long for arguments'); - core::option::OptionTraitImpl::expect( - core::gas::withdraw_gas_all(core::gas::get_builtin_costs()), 'Out of gas', - ); - let mut contract_state = unsafe_new_contract_state(); - let res = ContractImpl::namespace_hash(@contract_state, ); - let mut arr = ArrayTrait::new(); - // References. - // Result. - core::serde::Serde::::serialize(@res, ref arr); - core::array::ArrayTrait::span(@arr) -} - -#[implicit_precedence(core::pedersen::Pedersen, core::RangeCheck, core::integer::Bitwise, core::ec::EcOp, core::poseidon::Poseidon, core::SegmentArena, core::circuit::RangeCheck96, core::circuit::AddMod, core::circuit::MulMod, core::gas::GasBuiltin, System)] -fn __wrapper__ContractImpl__selector(mut data: Span::) -> Span:: { - core::internal::require_implicit::(); - core::internal::revoke_ap_tracking(); - core::option::OptionTraitImpl::expect(core::gas::withdraw_gas(), 'Out of gas'); - - assert(core::array::SpanTrait::is_empty(data), 'Input too long for arguments'); - core::option::OptionTraitImpl::expect( - core::gas::withdraw_gas_all(core::gas::get_builtin_costs()), 'Out of gas', - ); - let mut contract_state = unsafe_new_contract_state(); - let res = ContractImpl::selector(@contract_state, ); - let mut arr = ArrayTrait::new(); - // References. - // Result. - core::serde::Serde::::serialize(@res, ref arr); - core::array::ArrayTrait::span(@arr) -} - -#[implicit_precedence(core::pedersen::Pedersen, core::RangeCheck, core::integer::Bitwise, core::ec::EcOp, core::poseidon::Poseidon, core::SegmentArena, core::circuit::RangeCheck96, core::circuit::AddMod, core::circuit::MulMod, core::gas::GasBuiltin, System)] -fn __wrapper__constructor(mut data: Span::) -> Span:: { - core::internal::require_implicit::(); - core::internal::revoke_ap_tracking(); - core::option::OptionTraitImpl::expect(core::gas::withdraw_gas(), 'Out of gas'); - - assert(core::array::SpanTrait::is_empty(data), 'Input too long for arguments'); - core::option::OptionTraitImpl::expect( - core::gas::withdraw_gas_all(core::gas::get_builtin_costs()), 'Out of gas', - ); - let mut contract_state = unsafe_new_contract_state(); - constructor(ref contract_state, ); - let mut arr = ArrayTrait::new(); - // References. - // Result. - core::array::ArrayTrait::span(@arr) -} - -#[implicit_precedence(core::pedersen::Pedersen, core::RangeCheck, core::integer::Bitwise, core::ec::EcOp, core::poseidon::Poseidon, core::SegmentArena, core::circuit::RangeCheck96, core::circuit::AddMod, core::circuit::MulMod, core::gas::GasBuiltin, System)] -fn __wrapper__IDojoInitImpl__dojo_init(mut data: Span::) -> Span:: { - core::internal::require_implicit::(); - core::internal::revoke_ap_tracking(); - core::option::OptionTraitImpl::expect(core::gas::withdraw_gas(), 'Out of gas'); - - assert(core::array::SpanTrait::is_empty(data), 'Input too long for arguments'); - core::option::OptionTraitImpl::expect( - core::gas::withdraw_gas_all(core::gas::get_builtin_costs()), 'Out of gas', - ); - let mut contract_state = unsafe_new_contract_state(); - IDojoInitImpl::dojo_init(@contract_state, ); - let mut arr = ArrayTrait::new(); - // References. - // Result. - core::array::ArrayTrait::span(@arr) -} - - -pub mod __external { - pub use super::__wrapper__ContractImpl__name as name; - pub use super::__wrapper__ContractImpl__namespace as namespace; - pub use super::__wrapper__ContractImpl__tag as tag; - pub use super::__wrapper__ContractImpl__name_hash as name_hash; - pub use super::__wrapper__ContractImpl__namespace_hash as namespace_hash; - pub use super::__wrapper__ContractImpl__selector as selector; - pub use super::__wrapper__IDojoInitImpl__dojo_init as dojo_init; -} -pub mod __l1_handler { -} -pub mod __constructor { - pub use super::__wrapper__constructor as constructor; -} - impl ContractStateEventEmitter of starknet::event::EventEmitter< - ContractState, Event - > { - fn emit>( - ref self: ContractState, event: S - ) { - let event: Event = core::traits::Into::into(event); - let mut keys = Default::::default(); - let mut data = Default::::default(); - starknet::Event::append_keys_and_data(@event, ref keys, ref data); - starknet::SyscallResultTrait::unwrap_syscall( - starknet::syscalls::emit_event_syscall( - core::array::ArrayTrait::span(@keys), - core::array::ArrayTrait::span(@data), - ) - ) - } - } - -impl HasComponentImpl_world_provider_cpt of world_provider_cpt::HasComponent { - fn get_component(self: @ContractState) -> @world_provider_cpt::ComponentState { - @world_provider_cpt::unsafe_new_component_state::() - } - fn get_component_mut(ref self: ContractState) -> world_provider_cpt::ComponentState { - world_provider_cpt::unsafe_new_component_state::() - } - fn get_contract(self: @world_provider_cpt::ComponentState) -> @ContractState { - @unsafe_new_contract_state() - } - fn get_contract_mut(ref self: world_provider_cpt::ComponentState) -> ContractState { - unsafe_new_contract_state() - } - fn emit>(ref self: world_provider_cpt::ComponentState, event: S) { - let event: world_provider_cpt::Event = core::traits::Into::into(event); - let mut contract = world_provider_cpt::HasComponent::get_contract_mut(ref self); - ContractStateEventEmitter::emit(ref contract, Event::WorldProviderEvent(event)); - } -} -impl HasComponentImpl_upgradeable_cpt of upgradeable_cpt::HasComponent { - fn get_component(self: @ContractState) -> @upgradeable_cpt::ComponentState { - @upgradeable_cpt::unsafe_new_component_state::() - } - fn get_component_mut(ref self: ContractState) -> upgradeable_cpt::ComponentState { - upgradeable_cpt::unsafe_new_component_state::() - } - fn get_contract(self: @upgradeable_cpt::ComponentState) -> @ContractState { - @unsafe_new_contract_state() - } - fn get_contract_mut(ref self: upgradeable_cpt::ComponentState) -> ContractState { - unsafe_new_contract_state() - } - fn emit>(ref self: upgradeable_cpt::ComponentState, event: S) { - let event: upgradeable_cpt::Event = core::traits::Into::into(event); - let mut contract = upgradeable_cpt::HasComponent::get_contract_mut(ref self); - ContractStateEventEmitter::emit(ref contract, Event::UpgradeableEvent(event)); - } -} -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::contract] -pub mod withevent { - use dojo::contract::components::world_provider::{world_provider_cpt, world_provider_cpt::InternalTrait as WorldProviderInternal, IWorldProvider}; - use dojo::contract::components::upgradeable::upgradeable_cpt; - use dojo::contract::IContract; - - #[abi(embed_v0)] - impl WorldProviderImpl = world_provider_cpt::WorldProviderImpl; - - #[abi(embed_v0)] - impl UpgradeableImpl = upgradeable_cpt::UpgradeableImpl; - - #[abi(embed_v0)] - pub impl ContractImpl of IContract { - fn name(self: @ContractState) -> ByteArray { - "withevent" - } - - fn namespace(self: @ContractState) -> ByteArray { - "dojo_test" - } - - fn tag(self: @ContractState) -> ByteArray { - "dojo_test-withevent" - } - - fn name_hash(self: @ContractState) -> felt252 { - 2196275886623691942883456540767114081898043897719876113518403014973431884540 - } - - fn namespace_hash(self: @ContractState) -> felt252 { - 1452123528942907587532668415362544424816022573043154497385993678618948064048 - } - - fn selector(self: @ContractState) -> felt252 { - 3549898308100844368972151697544420289462059777504886668025232769583717017648 - } - } - - - #[event] - #[derive(Drop, starknet::Event)] - enum Event { - UpgradeableEvent: upgradeable_cpt::Event, - WorldProviderEvent: world_provider_cpt::Event, - TestEvent: TestEvent - } - - #[derive(Drop, starknet::Event)] - struct TestEvent { - address: ContractAddress, - } - - #[constructor] - fn constructor(ref self: ContractState) { - self.world_provider.initializer(); - } - #[abi(per_item)] -#[generate_trait] -pub impl IDojoInitImpl of IDojoInit { - #[external(v0)] - fn dojo_init(self: @ContractState) { - if starknet::get_caller_address() != self.world_provider.world().contract_address { - core::panics::panic_with_byte_array( - @format!("Only the world can init contract `{}`, but caller is `{:?}`", - self.tag(), - starknet::get_caller_address(), - )); - } - } -} -impl EventDrop of core::traits::Drop::; -impl EventIsEvent of starknet::Event { - fn append_keys_and_data( - self: @Event, ref keys: Array, ref data: Array - ) { - match self { - Event::UpgradeableEvent(val) => { - core::array::ArrayTrait::append(ref keys, selector!("UpgradeableEvent")); - starknet::Event::append_keys_and_data( - val, ref keys, ref data - ); - }, - Event::WorldProviderEvent(val) => { - core::array::ArrayTrait::append(ref keys, selector!("WorldProviderEvent")); - starknet::Event::append_keys_and_data( - val, ref keys, ref data - ); - }, - Event::TestEvent(val) => { - core::array::ArrayTrait::append(ref keys, selector!("TestEvent")); - starknet::Event::append_keys_and_data( - val, ref keys, ref data - ); - }, - } - } - fn deserialize( - ref keys: Span, ref data: Span, - ) -> Option { - let __selector__ = *core::array::SpanTrait::pop_front(ref keys)?; - if __selector__ == selector!("UpgradeableEvent") { - let val = starknet::Event::deserialize( - ref keys, ref data - )?; - return Option::Some(Event::UpgradeableEvent(val)); - } - if __selector__ == selector!("WorldProviderEvent") { - let val = starknet::Event::deserialize( - ref keys, ref data - )?; - return Option::Some(Event::WorldProviderEvent(val)); - } - if __selector__ == selector!("TestEvent") { - let val = starknet::Event::deserialize( - ref keys, ref data - )?; - return Option::Some(Event::TestEvent(val)); - } - Option::None - } -} -impl EventUpgradeableEventIntoEvent of Into { - fn into(self: upgradeable_cpt::Event) -> Event { - Event::UpgradeableEvent(self) - } -} -impl EventWorldProviderEventIntoEvent of Into { - fn into(self: world_provider_cpt::Event) -> Event { - Event::WorldProviderEvent(self) - } -} -impl EventTestEventIntoEvent of Into { - fn into(self: TestEvent) -> Event { - Event::TestEvent(self) - } -} -impl TestEventDrop of core::traits::Drop::; -impl TestEventIsEvent of starknet::Event { - fn append_keys_and_data( - self: @TestEvent, ref keys: Array, ref data: Array - ) { - core::serde::Serde::serialize(self.address, ref data); - } - fn deserialize( - ref keys: Span, ref data: Span, - ) -> Option { - let address = core::serde::Serde::deserialize( - ref data - )?; - Option::Some(TestEvent {address, }) - } -} - pub trait IDojoInit { - #[external(v0)] - fn dojo_init(self: @ContractState); -} - - -#[phantom] -pub struct Storage { - #[substorage(v0)] - pub upgradeable: upgradeable_cpt::Storage, - #[substorage(v0)] - pub world_provider: world_provider_cpt::Storage, -} - -#[derive(Drop, Copy)] -pub struct StorageStorageBase { - pub upgradeable: starknet::storage::FlattenedStorage, - pub world_provider: starknet::storage::FlattenedStorage, -} -impl StorageStorageImpl of starknet::storage::StorageTrait { - type BaseType = StorageStorageBase; - fn storage(self: starknet::storage::FlattenedStorage) -> StorageStorageBase { - let __upgradeable_value__ = starknet::storage::FlattenedStorage {}; - let __world_provider_value__ = starknet::storage::FlattenedStorage {}; - StorageStorageBase { - upgradeable: __upgradeable_value__, - world_provider: __world_provider_value__, - } - } -} -#[derive(Drop, Copy)] -pub struct StorageStorageBaseMut { - pub upgradeable: starknet::storage::FlattenedStorage>, - pub world_provider: starknet::storage::FlattenedStorage>, -} -impl StorageStorageMutImpl of starknet::storage::StorageTraitMut { - type BaseType = StorageStorageBaseMut; - fn storage_mut(self: starknet::storage::FlattenedStorage>) -> StorageStorageBaseMut { - let __upgradeable_value__ = starknet::storage::FlattenedStorage {}; - let __world_provider_value__ = starknet::storage::FlattenedStorage {}; - StorageStorageBaseMut { - upgradeable: __upgradeable_value__, - world_provider: __world_provider_value__, - } - } -} - -pub struct ContractState { - pub upgradeable: upgradeable_cpt::ComponentState, - pub world_provider: world_provider_cpt::ComponentState, -} - -impl ContractStateDrop of Drop {} - -impl ContractStateDeref of core::ops::SnapshotDeref { - type Target = starknet::storage::FlattenedStorage; - fn snapshot_deref(self: @ContractState) -> starknet::storage::FlattenedStorage { - starknet::storage::FlattenedStorage {} - } -} -impl ContractStateDerefMut of core::ops::DerefMut { - type Target = starknet::storage::FlattenedStorage> ; - fn deref_mut(ref self: ContractState) -> starknet::storage::FlattenedStorage> { - starknet::storage::FlattenedStorage {} - } -} -pub fn unsafe_new_contract_state() -> ContractState { - ContractState { - upgradeable: upgradeable_cpt::unsafe_new_component_state::(), - world_provider: world_provider_cpt::unsafe_new_component_state::(), - } -} - -// TODO(Gil): This generates duplicate diagnostics because of the plugin system, squash the duplicates into one. -#[deprecated( - feature: "deprecated_legacy_map", - note: "Use `starknet::storage::Map` instead." -)] -#[allow(unused_imports)] -use starknet::storage::Map as LegacyMap; - -impl ContractStateWorldProviderImpl of - world_provider_cpt::UnsafeNewContractStateTraitForWorldProviderImpl { - fn unsafe_new_contract_state() -> ContractState { - unsafe_new_contract_state() - } -} -impl ContractStateUpgradeableImpl of - upgradeable_cpt::UnsafeNewContractStateTraitForUpgradeableImpl { - fn unsafe_new_contract_state() -> ContractState { - unsafe_new_contract_state() - } -} -#[implicit_precedence(core::pedersen::Pedersen, core::RangeCheck, core::integer::Bitwise, core::ec::EcOp, core::poseidon::Poseidon, core::SegmentArena, core::circuit::RangeCheck96, core::circuit::AddMod, core::circuit::MulMod, core::gas::GasBuiltin, System)] -fn __wrapper__ContractImpl__name(mut data: Span::) -> Span:: { - core::internal::require_implicit::(); - core::internal::revoke_ap_tracking(); - core::option::OptionTraitImpl::expect(core::gas::withdraw_gas(), 'Out of gas'); - - assert(core::array::SpanTrait::is_empty(data), 'Input too long for arguments'); - core::option::OptionTraitImpl::expect( - core::gas::withdraw_gas_all(core::gas::get_builtin_costs()), 'Out of gas', - ); - let mut contract_state = unsafe_new_contract_state(); - let res = ContractImpl::name(@contract_state, ); - let mut arr = ArrayTrait::new(); - // References. - // Result. - core::serde::Serde::::serialize(@res, ref arr); - core::array::ArrayTrait::span(@arr) -} - -#[implicit_precedence(core::pedersen::Pedersen, core::RangeCheck, core::integer::Bitwise, core::ec::EcOp, core::poseidon::Poseidon, core::SegmentArena, core::circuit::RangeCheck96, core::circuit::AddMod, core::circuit::MulMod, core::gas::GasBuiltin, System)] -fn __wrapper__ContractImpl__namespace(mut data: Span::) -> Span:: { - core::internal::require_implicit::(); - core::internal::revoke_ap_tracking(); - core::option::OptionTraitImpl::expect(core::gas::withdraw_gas(), 'Out of gas'); - - assert(core::array::SpanTrait::is_empty(data), 'Input too long for arguments'); - core::option::OptionTraitImpl::expect( - core::gas::withdraw_gas_all(core::gas::get_builtin_costs()), 'Out of gas', - ); - let mut contract_state = unsafe_new_contract_state(); - let res = ContractImpl::namespace(@contract_state, ); - let mut arr = ArrayTrait::new(); - // References. - // Result. - core::serde::Serde::::serialize(@res, ref arr); - core::array::ArrayTrait::span(@arr) -} - -#[implicit_precedence(core::pedersen::Pedersen, core::RangeCheck, core::integer::Bitwise, core::ec::EcOp, core::poseidon::Poseidon, core::SegmentArena, core::circuit::RangeCheck96, core::circuit::AddMod, core::circuit::MulMod, core::gas::GasBuiltin, System)] -fn __wrapper__ContractImpl__tag(mut data: Span::) -> Span:: { - core::internal::require_implicit::(); - core::internal::revoke_ap_tracking(); - core::option::OptionTraitImpl::expect(core::gas::withdraw_gas(), 'Out of gas'); - - assert(core::array::SpanTrait::is_empty(data), 'Input too long for arguments'); - core::option::OptionTraitImpl::expect( - core::gas::withdraw_gas_all(core::gas::get_builtin_costs()), 'Out of gas', - ); - let mut contract_state = unsafe_new_contract_state(); - let res = ContractImpl::tag(@contract_state, ); - let mut arr = ArrayTrait::new(); - // References. - // Result. - core::serde::Serde::::serialize(@res, ref arr); - core::array::ArrayTrait::span(@arr) -} - -#[implicit_precedence(core::pedersen::Pedersen, core::RangeCheck, core::integer::Bitwise, core::ec::EcOp, core::poseidon::Poseidon, core::SegmentArena, core::circuit::RangeCheck96, core::circuit::AddMod, core::circuit::MulMod, core::gas::GasBuiltin, System)] -fn __wrapper__ContractImpl__name_hash(mut data: Span::) -> Span:: { - core::internal::require_implicit::(); - core::internal::revoke_ap_tracking(); - core::option::OptionTraitImpl::expect(core::gas::withdraw_gas(), 'Out of gas'); - - assert(core::array::SpanTrait::is_empty(data), 'Input too long for arguments'); - core::option::OptionTraitImpl::expect( - core::gas::withdraw_gas_all(core::gas::get_builtin_costs()), 'Out of gas', - ); - let mut contract_state = unsafe_new_contract_state(); - let res = ContractImpl::name_hash(@contract_state, ); - let mut arr = ArrayTrait::new(); - // References. - // Result. - core::serde::Serde::::serialize(@res, ref arr); - core::array::ArrayTrait::span(@arr) -} - -#[implicit_precedence(core::pedersen::Pedersen, core::RangeCheck, core::integer::Bitwise, core::ec::EcOp, core::poseidon::Poseidon, core::SegmentArena, core::circuit::RangeCheck96, core::circuit::AddMod, core::circuit::MulMod, core::gas::GasBuiltin, System)] -fn __wrapper__ContractImpl__namespace_hash(mut data: Span::) -> Span:: { - core::internal::require_implicit::(); - core::internal::revoke_ap_tracking(); - core::option::OptionTraitImpl::expect(core::gas::withdraw_gas(), 'Out of gas'); - - assert(core::array::SpanTrait::is_empty(data), 'Input too long for arguments'); - core::option::OptionTraitImpl::expect( - core::gas::withdraw_gas_all(core::gas::get_builtin_costs()), 'Out of gas', - ); - let mut contract_state = unsafe_new_contract_state(); - let res = ContractImpl::namespace_hash(@contract_state, ); - let mut arr = ArrayTrait::new(); - // References. - // Result. - core::serde::Serde::::serialize(@res, ref arr); - core::array::ArrayTrait::span(@arr) -} - -#[implicit_precedence(core::pedersen::Pedersen, core::RangeCheck, core::integer::Bitwise, core::ec::EcOp, core::poseidon::Poseidon, core::SegmentArena, core::circuit::RangeCheck96, core::circuit::AddMod, core::circuit::MulMod, core::gas::GasBuiltin, System)] -fn __wrapper__ContractImpl__selector(mut data: Span::) -> Span:: { - core::internal::require_implicit::(); - core::internal::revoke_ap_tracking(); - core::option::OptionTraitImpl::expect(core::gas::withdraw_gas(), 'Out of gas'); - - assert(core::array::SpanTrait::is_empty(data), 'Input too long for arguments'); - core::option::OptionTraitImpl::expect( - core::gas::withdraw_gas_all(core::gas::get_builtin_costs()), 'Out of gas', - ); - let mut contract_state = unsafe_new_contract_state(); - let res = ContractImpl::selector(@contract_state, ); - let mut arr = ArrayTrait::new(); - // References. - // Result. - core::serde::Serde::::serialize(@res, ref arr); - core::array::ArrayTrait::span(@arr) -} - -#[implicit_precedence(core::pedersen::Pedersen, core::RangeCheck, core::integer::Bitwise, core::ec::EcOp, core::poseidon::Poseidon, core::SegmentArena, core::circuit::RangeCheck96, core::circuit::AddMod, core::circuit::MulMod, core::gas::GasBuiltin, System)] -fn __wrapper__constructor(mut data: Span::) -> Span:: { - core::internal::require_implicit::(); - core::internal::revoke_ap_tracking(); - core::option::OptionTraitImpl::expect(core::gas::withdraw_gas(), 'Out of gas'); - - assert(core::array::SpanTrait::is_empty(data), 'Input too long for arguments'); - core::option::OptionTraitImpl::expect( - core::gas::withdraw_gas_all(core::gas::get_builtin_costs()), 'Out of gas', - ); - let mut contract_state = unsafe_new_contract_state(); - constructor(ref contract_state, ); - let mut arr = ArrayTrait::new(); - // References. - // Result. - core::array::ArrayTrait::span(@arr) -} - -#[implicit_precedence(core::pedersen::Pedersen, core::RangeCheck, core::integer::Bitwise, core::ec::EcOp, core::poseidon::Poseidon, core::SegmentArena, core::circuit::RangeCheck96, core::circuit::AddMod, core::circuit::MulMod, core::gas::GasBuiltin, System)] -fn __wrapper__IDojoInitImpl__dojo_init(mut data: Span::) -> Span:: { - core::internal::require_implicit::(); - core::internal::revoke_ap_tracking(); - core::option::OptionTraitImpl::expect(core::gas::withdraw_gas(), 'Out of gas'); - - assert(core::array::SpanTrait::is_empty(data), 'Input too long for arguments'); - core::option::OptionTraitImpl::expect( - core::gas::withdraw_gas_all(core::gas::get_builtin_costs()), 'Out of gas', - ); - let mut contract_state = unsafe_new_contract_state(); - IDojoInitImpl::dojo_init(@contract_state, ); - let mut arr = ArrayTrait::new(); - // References. - // Result. - core::array::ArrayTrait::span(@arr) -} - - -pub mod __external { - pub use super::__wrapper__ContractImpl__name as name; - pub use super::__wrapper__ContractImpl__namespace as namespace; - pub use super::__wrapper__ContractImpl__tag as tag; - pub use super::__wrapper__ContractImpl__name_hash as name_hash; - pub use super::__wrapper__ContractImpl__namespace_hash as namespace_hash; - pub use super::__wrapper__ContractImpl__selector as selector; - pub use super::__wrapper__IDojoInitImpl__dojo_init as dojo_init; -} -pub mod __l1_handler { -} -pub mod __constructor { - pub use super::__wrapper__constructor as constructor; -} - impl ContractStateEventEmitter of starknet::event::EventEmitter< - ContractState, Event - > { - fn emit>( - ref self: ContractState, event: S - ) { - let event: Event = core::traits::Into::into(event); - let mut keys = Default::::default(); - let mut data = Default::::default(); - starknet::Event::append_keys_and_data(@event, ref keys, ref data); - starknet::SyscallResultTrait::unwrap_syscall( - starknet::syscalls::emit_event_syscall( - core::array::ArrayTrait::span(@keys), - core::array::ArrayTrait::span(@data), - ) - ) - } - } - -impl HasComponentImpl_world_provider_cpt of world_provider_cpt::HasComponent { - fn get_component(self: @ContractState) -> @world_provider_cpt::ComponentState { - @world_provider_cpt::unsafe_new_component_state::() - } - fn get_component_mut(ref self: ContractState) -> world_provider_cpt::ComponentState { - world_provider_cpt::unsafe_new_component_state::() - } - fn get_contract(self: @world_provider_cpt::ComponentState) -> @ContractState { - @unsafe_new_contract_state() - } - fn get_contract_mut(ref self: world_provider_cpt::ComponentState) -> ContractState { - unsafe_new_contract_state() - } - fn emit>(ref self: world_provider_cpt::ComponentState, event: S) { - let event: world_provider_cpt::Event = core::traits::Into::into(event); - let mut contract = world_provider_cpt::HasComponent::get_contract_mut(ref self); - ContractStateEventEmitter::emit(ref contract, Event::WorldProviderEvent(event)); - } -} -impl HasComponentImpl_upgradeable_cpt of upgradeable_cpt::HasComponent { - fn get_component(self: @ContractState) -> @upgradeable_cpt::ComponentState { - @upgradeable_cpt::unsafe_new_component_state::() - } - fn get_component_mut(ref self: ContractState) -> upgradeable_cpt::ComponentState { - upgradeable_cpt::unsafe_new_component_state::() - } - fn get_contract(self: @upgradeable_cpt::ComponentState) -> @ContractState { - @unsafe_new_contract_state() - } - fn get_contract_mut(ref self: upgradeable_cpt::ComponentState) -> ContractState { - unsafe_new_contract_state() - } - fn emit>(ref self: upgradeable_cpt::ComponentState, event: S) { - let event: upgradeable_cpt::Event = core::traits::Into::into(event); - let mut contract = upgradeable_cpt::HasComponent::get_contract_mut(ref self); - ContractStateEventEmitter::emit(ref contract, Event::UpgradeableEvent(event)); - } -} -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::contract] -pub mod withcomponent { - use dojo::contract::components::world_provider::{world_provider_cpt, world_provider_cpt::InternalTrait as WorldProviderInternal, IWorldProvider}; - use dojo::contract::components::upgradeable::upgradeable_cpt; - use dojo::contract::IContract; - - #[abi(embed_v0)] - impl WorldProviderImpl = world_provider_cpt::WorldProviderImpl; - - #[abi(embed_v0)] - impl UpgradeableImpl = upgradeable_cpt::UpgradeableImpl; - - #[abi(embed_v0)] - pub impl ContractImpl of IContract { - fn name(self: @ContractState) -> ByteArray { - "withcomponent" - } - - fn namespace(self: @ContractState) -> ByteArray { - "dojo_test" - } - - fn tag(self: @ContractState) -> ByteArray { - "dojo_test-withcomponent" - } - - fn name_hash(self: @ContractState) -> felt252 { - 999850881662666048155666650426666132968026605763740651763663703103974774091 - } - - fn namespace_hash(self: @ContractState) -> felt252 { - 1452123528942907587532668415362544424816022573043154497385993678618948064048 - } - - fn selector(self: @ContractState) -> felt252 { - 3051237314154062498758064027519150695325862034415997374893619833554034627226 - } - } - - #[event] - #[derive(Drop, starknet::Event)] - enum Event { - UpgradeableEvent: upgradeable_cpt::Event, - WorldProviderEvent: world_provider_cpt::Event, - #[flat] - testcomponent1_event: testcomponent1::Event, - testcomponent2_event: testcomponent2::Event - } - - #[constructor] - fn constructor(ref self: ContractState) { - self.world_provider.initializer(); - } - #[abi(per_item)] -#[generate_trait] -pub impl IDojoInitImpl of IDojoInit { - #[external(v0)] - fn dojo_init(self: @ContractState) { - if starknet::get_caller_address() != self.world_provider.world().contract_address { - core::panics::panic_with_byte_array( - @format!("Only the world can init contract `{}`, but caller is `{:?}`", - self.tag(), - starknet::get_caller_address(), - )); - } - } -} - - -#[phantom] -pub struct Storage { - #[substorage(v0)] - pub upgradeable: upgradeable_cpt::Storage, - #[substorage(v0)] - pub world_provider: world_provider_cpt::Storage, - #[substorage(v0)] - pub testcomponent1_storage: testcomponent1::Storage, - #[substorage(v0)] - pub testcomponent2_storage: testcomponent2::Storage, -} - -#[derive(Drop, Copy)] -pub struct StorageStorageBase { - pub upgradeable: starknet::storage::FlattenedStorage, - pub world_provider: starknet::storage::FlattenedStorage, - pub testcomponent1_storage: starknet::storage::FlattenedStorage, - pub testcomponent2_storage: starknet::storage::FlattenedStorage, -} -impl StorageStorageImpl of starknet::storage::StorageTrait { - type BaseType = StorageStorageBase; - fn storage(self: starknet::storage::FlattenedStorage) -> StorageStorageBase { - let __upgradeable_value__ = starknet::storage::FlattenedStorage {}; - let __world_provider_value__ = starknet::storage::FlattenedStorage {}; - let __testcomponent1_storage_value__ = starknet::storage::FlattenedStorage {}; - let __testcomponent2_storage_value__ = starknet::storage::FlattenedStorage {}; - StorageStorageBase { - upgradeable: __upgradeable_value__, - world_provider: __world_provider_value__, - testcomponent1_storage: __testcomponent1_storage_value__, - testcomponent2_storage: __testcomponent2_storage_value__, - } - } -} -#[derive(Drop, Copy)] -pub struct StorageStorageBaseMut { - pub upgradeable: starknet::storage::FlattenedStorage>, - pub world_provider: starknet::storage::FlattenedStorage>, - pub testcomponent1_storage: starknet::storage::FlattenedStorage>, - pub testcomponent2_storage: starknet::storage::FlattenedStorage>, -} -impl StorageStorageMutImpl of starknet::storage::StorageTraitMut { - type BaseType = StorageStorageBaseMut; - fn storage_mut(self: starknet::storage::FlattenedStorage>) -> StorageStorageBaseMut { - let __upgradeable_value__ = starknet::storage::FlattenedStorage {}; - let __world_provider_value__ = starknet::storage::FlattenedStorage {}; - let __testcomponent1_storage_value__ = starknet::storage::FlattenedStorage {}; - let __testcomponent2_storage_value__ = starknet::storage::FlattenedStorage {}; - StorageStorageBaseMut { - upgradeable: __upgradeable_value__, - world_provider: __world_provider_value__, - testcomponent1_storage: __testcomponent1_storage_value__, - testcomponent2_storage: __testcomponent2_storage_value__, - } - } -} - -pub struct ContractState { - pub upgradeable: upgradeable_cpt::ComponentState, - pub world_provider: world_provider_cpt::ComponentState, - pub testcomponent1_storage: testcomponent1::ComponentState, - pub testcomponent2_storage: testcomponent2::ComponentState, -} - -impl ContractStateDrop of Drop {} - -impl ContractStateDeref of core::ops::SnapshotDeref { - type Target = starknet::storage::FlattenedStorage; - fn snapshot_deref(self: @ContractState) -> starknet::storage::FlattenedStorage { - starknet::storage::FlattenedStorage {} - } -} -impl ContractStateDerefMut of core::ops::DerefMut { - type Target = starknet::storage::FlattenedStorage> ; - fn deref_mut(ref self: ContractState) -> starknet::storage::FlattenedStorage> { - starknet::storage::FlattenedStorage {} - } -} -pub fn unsafe_new_contract_state() -> ContractState { - ContractState { - upgradeable: upgradeable_cpt::unsafe_new_component_state::(), - world_provider: world_provider_cpt::unsafe_new_component_state::(), - testcomponent1_storage: testcomponent1::unsafe_new_component_state::(), - testcomponent2_storage: testcomponent2::unsafe_new_component_state::(), - } -} - -// TODO(Gil): This generates duplicate diagnostics because of the plugin system, squash the duplicates into one. -#[deprecated( - feature: "deprecated_legacy_map", - note: "Use `starknet::storage::Map` instead." -)] -#[allow(unused_imports)] -use starknet::storage::Map as LegacyMap; - -impl ContractStateWorldProviderImpl of - world_provider_cpt::UnsafeNewContractStateTraitForWorldProviderImpl { - fn unsafe_new_contract_state() -> ContractState { - unsafe_new_contract_state() - } -} -impl ContractStateUpgradeableImpl of - upgradeable_cpt::UnsafeNewContractStateTraitForUpgradeableImpl { - fn unsafe_new_contract_state() -> ContractState { - unsafe_new_contract_state() - } -} -#[implicit_precedence(core::pedersen::Pedersen, core::RangeCheck, core::integer::Bitwise, core::ec::EcOp, core::poseidon::Poseidon, core::SegmentArena, core::circuit::RangeCheck96, core::circuit::AddMod, core::circuit::MulMod, core::gas::GasBuiltin, System)] -fn __wrapper__ContractImpl__name(mut data: Span::) -> Span:: { - core::internal::require_implicit::(); - core::internal::revoke_ap_tracking(); - core::option::OptionTraitImpl::expect(core::gas::withdraw_gas(), 'Out of gas'); - - assert(core::array::SpanTrait::is_empty(data), 'Input too long for arguments'); - core::option::OptionTraitImpl::expect( - core::gas::withdraw_gas_all(core::gas::get_builtin_costs()), 'Out of gas', - ); - let mut contract_state = unsafe_new_contract_state(); - let res = ContractImpl::name(@contract_state, ); - let mut arr = ArrayTrait::new(); - // References. - // Result. - core::serde::Serde::::serialize(@res, ref arr); - core::array::ArrayTrait::span(@arr) -} - -#[implicit_precedence(core::pedersen::Pedersen, core::RangeCheck, core::integer::Bitwise, core::ec::EcOp, core::poseidon::Poseidon, core::SegmentArena, core::circuit::RangeCheck96, core::circuit::AddMod, core::circuit::MulMod, core::gas::GasBuiltin, System)] -fn __wrapper__ContractImpl__namespace(mut data: Span::) -> Span:: { - core::internal::require_implicit::(); - core::internal::revoke_ap_tracking(); - core::option::OptionTraitImpl::expect(core::gas::withdraw_gas(), 'Out of gas'); - - assert(core::array::SpanTrait::is_empty(data), 'Input too long for arguments'); - core::option::OptionTraitImpl::expect( - core::gas::withdraw_gas_all(core::gas::get_builtin_costs()), 'Out of gas', - ); - let mut contract_state = unsafe_new_contract_state(); - let res = ContractImpl::namespace(@contract_state, ); - let mut arr = ArrayTrait::new(); - // References. - // Result. - core::serde::Serde::::serialize(@res, ref arr); - core::array::ArrayTrait::span(@arr) -} - -#[implicit_precedence(core::pedersen::Pedersen, core::RangeCheck, core::integer::Bitwise, core::ec::EcOp, core::poseidon::Poseidon, core::SegmentArena, core::circuit::RangeCheck96, core::circuit::AddMod, core::circuit::MulMod, core::gas::GasBuiltin, System)] -fn __wrapper__ContractImpl__tag(mut data: Span::) -> Span:: { - core::internal::require_implicit::(); - core::internal::revoke_ap_tracking(); - core::option::OptionTraitImpl::expect(core::gas::withdraw_gas(), 'Out of gas'); - - assert(core::array::SpanTrait::is_empty(data), 'Input too long for arguments'); - core::option::OptionTraitImpl::expect( - core::gas::withdraw_gas_all(core::gas::get_builtin_costs()), 'Out of gas', - ); - let mut contract_state = unsafe_new_contract_state(); - let res = ContractImpl::tag(@contract_state, ); - let mut arr = ArrayTrait::new(); - // References. - // Result. - core::serde::Serde::::serialize(@res, ref arr); - core::array::ArrayTrait::span(@arr) -} - -#[implicit_precedence(core::pedersen::Pedersen, core::RangeCheck, core::integer::Bitwise, core::ec::EcOp, core::poseidon::Poseidon, core::SegmentArena, core::circuit::RangeCheck96, core::circuit::AddMod, core::circuit::MulMod, core::gas::GasBuiltin, System)] -fn __wrapper__ContractImpl__name_hash(mut data: Span::) -> Span:: { - core::internal::require_implicit::(); - core::internal::revoke_ap_tracking(); - core::option::OptionTraitImpl::expect(core::gas::withdraw_gas(), 'Out of gas'); - - assert(core::array::SpanTrait::is_empty(data), 'Input too long for arguments'); - core::option::OptionTraitImpl::expect( - core::gas::withdraw_gas_all(core::gas::get_builtin_costs()), 'Out of gas', - ); - let mut contract_state = unsafe_new_contract_state(); - let res = ContractImpl::name_hash(@contract_state, ); - let mut arr = ArrayTrait::new(); - // References. - // Result. - core::serde::Serde::::serialize(@res, ref arr); - core::array::ArrayTrait::span(@arr) -} - -#[implicit_precedence(core::pedersen::Pedersen, core::RangeCheck, core::integer::Bitwise, core::ec::EcOp, core::poseidon::Poseidon, core::SegmentArena, core::circuit::RangeCheck96, core::circuit::AddMod, core::circuit::MulMod, core::gas::GasBuiltin, System)] -fn __wrapper__ContractImpl__namespace_hash(mut data: Span::) -> Span:: { - core::internal::require_implicit::(); - core::internal::revoke_ap_tracking(); - core::option::OptionTraitImpl::expect(core::gas::withdraw_gas(), 'Out of gas'); - - assert(core::array::SpanTrait::is_empty(data), 'Input too long for arguments'); - core::option::OptionTraitImpl::expect( - core::gas::withdraw_gas_all(core::gas::get_builtin_costs()), 'Out of gas', - ); - let mut contract_state = unsafe_new_contract_state(); - let res = ContractImpl::namespace_hash(@contract_state, ); - let mut arr = ArrayTrait::new(); - // References. - // Result. - core::serde::Serde::::serialize(@res, ref arr); - core::array::ArrayTrait::span(@arr) -} - -#[implicit_precedence(core::pedersen::Pedersen, core::RangeCheck, core::integer::Bitwise, core::ec::EcOp, core::poseidon::Poseidon, core::SegmentArena, core::circuit::RangeCheck96, core::circuit::AddMod, core::circuit::MulMod, core::gas::GasBuiltin, System)] -fn __wrapper__ContractImpl__selector(mut data: Span::) -> Span:: { - core::internal::require_implicit::(); - core::internal::revoke_ap_tracking(); - core::option::OptionTraitImpl::expect(core::gas::withdraw_gas(), 'Out of gas'); - - assert(core::array::SpanTrait::is_empty(data), 'Input too long for arguments'); - core::option::OptionTraitImpl::expect( - core::gas::withdraw_gas_all(core::gas::get_builtin_costs()), 'Out of gas', - ); - let mut contract_state = unsafe_new_contract_state(); - let res = ContractImpl::selector(@contract_state, ); - let mut arr = ArrayTrait::new(); - // References. - // Result. - core::serde::Serde::::serialize(@res, ref arr); - core::array::ArrayTrait::span(@arr) -} - -#[implicit_precedence(core::pedersen::Pedersen, core::RangeCheck, core::integer::Bitwise, core::ec::EcOp, core::poseidon::Poseidon, core::SegmentArena, core::circuit::RangeCheck96, core::circuit::AddMod, core::circuit::MulMod, core::gas::GasBuiltin, System)] -fn __wrapper__constructor(mut data: Span::) -> Span:: { - core::internal::require_implicit::(); - core::internal::revoke_ap_tracking(); - core::option::OptionTraitImpl::expect(core::gas::withdraw_gas(), 'Out of gas'); - - assert(core::array::SpanTrait::is_empty(data), 'Input too long for arguments'); - core::option::OptionTraitImpl::expect( - core::gas::withdraw_gas_all(core::gas::get_builtin_costs()), 'Out of gas', - ); - let mut contract_state = unsafe_new_contract_state(); - constructor(ref contract_state, ); - let mut arr = ArrayTrait::new(); - // References. - // Result. - core::array::ArrayTrait::span(@arr) -} - -#[implicit_precedence(core::pedersen::Pedersen, core::RangeCheck, core::integer::Bitwise, core::ec::EcOp, core::poseidon::Poseidon, core::SegmentArena, core::circuit::RangeCheck96, core::circuit::AddMod, core::circuit::MulMod, core::gas::GasBuiltin, System)] -fn __wrapper__IDojoInitImpl__dojo_init(mut data: Span::) -> Span:: { - core::internal::require_implicit::(); - core::internal::revoke_ap_tracking(); - core::option::OptionTraitImpl::expect(core::gas::withdraw_gas(), 'Out of gas'); - - assert(core::array::SpanTrait::is_empty(data), 'Input too long for arguments'); - core::option::OptionTraitImpl::expect( - core::gas::withdraw_gas_all(core::gas::get_builtin_costs()), 'Out of gas', - ); - let mut contract_state = unsafe_new_contract_state(); - IDojoInitImpl::dojo_init(@contract_state, ); - let mut arr = ArrayTrait::new(); - // References. - // Result. - core::array::ArrayTrait::span(@arr) -} - - -pub mod __external { - pub use super::__wrapper__ContractImpl__name as name; - pub use super::__wrapper__ContractImpl__namespace as namespace; - pub use super::__wrapper__ContractImpl__tag as tag; - pub use super::__wrapper__ContractImpl__name_hash as name_hash; - pub use super::__wrapper__ContractImpl__namespace_hash as namespace_hash; - pub use super::__wrapper__ContractImpl__selector as selector; - pub use super::__wrapper__IDojoInitImpl__dojo_init as dojo_init; -} -pub mod __l1_handler { -} -pub mod __constructor { - pub use super::__wrapper__constructor as constructor; -} - impl ContractStateEventEmitter of starknet::event::EventEmitter< - ContractState, Event - > { - fn emit>( - ref self: ContractState, event: S - ) { - let event: Event = core::traits::Into::into(event); - let mut keys = Default::::default(); - let mut data = Default::::default(); - starknet::Event::append_keys_and_data(@event, ref keys, ref data); - starknet::SyscallResultTrait::unwrap_syscall( - starknet::syscalls::emit_event_syscall( - core::array::ArrayTrait::span(@keys), - core::array::ArrayTrait::span(@data), - ) - ) - } - } - -impl HasComponentImpl_world_provider_cpt of world_provider_cpt::HasComponent { - fn get_component(self: @ContractState) -> @world_provider_cpt::ComponentState { - @world_provider_cpt::unsafe_new_component_state::() - } - fn get_component_mut(ref self: ContractState) -> world_provider_cpt::ComponentState { - world_provider_cpt::unsafe_new_component_state::() - } - fn get_contract(self: @world_provider_cpt::ComponentState) -> @ContractState { - @unsafe_new_contract_state() - } - fn get_contract_mut(ref self: world_provider_cpt::ComponentState) -> ContractState { - unsafe_new_contract_state() - } - fn emit>(ref self: world_provider_cpt::ComponentState, event: S) { - let event: world_provider_cpt::Event = core::traits::Into::into(event); - let mut contract = world_provider_cpt::HasComponent::get_contract_mut(ref self); - ContractStateEventEmitter::emit(ref contract, Event::WorldProviderEvent(event)); - } -} -impl HasComponentImpl_upgradeable_cpt of upgradeable_cpt::HasComponent { - fn get_component(self: @ContractState) -> @upgradeable_cpt::ComponentState { - @upgradeable_cpt::unsafe_new_component_state::() - } - fn get_component_mut(ref self: ContractState) -> upgradeable_cpt::ComponentState { - upgradeable_cpt::unsafe_new_component_state::() - } - fn get_contract(self: @upgradeable_cpt::ComponentState) -> @ContractState { - @unsafe_new_contract_state() - } - fn get_contract_mut(ref self: upgradeable_cpt::ComponentState) -> ContractState { - unsafe_new_contract_state() - } - fn emit>(ref self: upgradeable_cpt::ComponentState, event: S) { - let event: upgradeable_cpt::Event = core::traits::Into::into(event); - let mut contract = upgradeable_cpt::HasComponent::get_contract_mut(ref self); - ContractStateEventEmitter::emit(ref contract, Event::UpgradeableEvent(event)); - } -} -impl HasComponentImpl_testcomponent1 of testcomponent1::HasComponent { - fn get_component(self: @ContractState) -> @testcomponent1::ComponentState { - @testcomponent1::unsafe_new_component_state::() - } - fn get_component_mut(ref self: ContractState) -> testcomponent1::ComponentState { - testcomponent1::unsafe_new_component_state::() - } - fn get_contract(self: @testcomponent1::ComponentState) -> @ContractState { - @unsafe_new_contract_state() - } - fn get_contract_mut(ref self: testcomponent1::ComponentState) -> ContractState { - unsafe_new_contract_state() - } - fn emit>(ref self: testcomponent1::ComponentState, event: S) { - let event: testcomponent1::Event = core::traits::Into::into(event); - let mut contract = testcomponent1::HasComponent::get_contract_mut(ref self); - ContractStateEventEmitter::emit(ref contract, Event::testcomponent1_event(event)); - } -} -impl HasComponentImpl_testcomponent2 of testcomponent2::HasComponent { - fn get_component(self: @ContractState) -> @testcomponent2::ComponentState { - @testcomponent2::unsafe_new_component_state::() - } - fn get_component_mut(ref self: ContractState) -> testcomponent2::ComponentState { - testcomponent2::unsafe_new_component_state::() - } - fn get_contract(self: @testcomponent2::ComponentState) -> @ContractState { - @unsafe_new_contract_state() - } - fn get_contract_mut(ref self: testcomponent2::ComponentState) -> ContractState { - unsafe_new_contract_state() - } - fn emit>(ref self: testcomponent2::ComponentState, event: S) { - let event: testcomponent2::Event = core::traits::Into::into(event); - let mut contract = testcomponent2::HasComponent::get_contract_mut(ref self); - ContractStateEventEmitter::emit(ref contract, Event::testcomponent2_event(event)); - } -} -impl EventDrop of core::traits::Drop::; -impl EventIsEvent of starknet::Event { - fn append_keys_and_data( - self: @Event, ref keys: Array, ref data: Array - ) { - match self { - Event::UpgradeableEvent(val) => { - core::array::ArrayTrait::append(ref keys, selector!("UpgradeableEvent")); - starknet::Event::append_keys_and_data( - val, ref keys, ref data - ); - }, - Event::WorldProviderEvent(val) => { - core::array::ArrayTrait::append(ref keys, selector!("WorldProviderEvent")); - starknet::Event::append_keys_and_data( - val, ref keys, ref data - ); - }, - Event::testcomponent1_event(val) => { - starknet::Event::append_keys_and_data( - val, ref keys, ref data - ); - }, - Event::testcomponent2_event(val) => { - core::array::ArrayTrait::append(ref keys, selector!("testcomponent2_event")); - starknet::Event::append_keys_and_data( - val, ref keys, ref data - ); - }, - } - } - fn deserialize( - ref keys: Span, ref data: Span, - ) -> Option { - { - let mut keys = keys; - let mut data = data; - match starknet::Event::deserialize(ref keys, ref data) { - Option::Some(val) => { - return Option::Some(Event::testcomponent1_event(val)); - }, - Option::None => {}, - }; - } - let __selector__ = *core::array::SpanTrait::pop_front(ref keys)?; - if __selector__ == selector!("UpgradeableEvent") { - let val = starknet::Event::deserialize( - ref keys, ref data - )?; - return Option::Some(Event::UpgradeableEvent(val)); - } - if __selector__ == selector!("WorldProviderEvent") { - let val = starknet::Event::deserialize( - ref keys, ref data - )?; - return Option::Some(Event::WorldProviderEvent(val)); - } - if __selector__ == selector!("testcomponent2_event") { - let val = starknet::Event::deserialize( - ref keys, ref data - )?; - return Option::Some(Event::testcomponent2_event(val)); - } - Option::None - } -} -impl EventUpgradeableEventIntoEvent of Into { - fn into(self: upgradeable_cpt::Event) -> Event { - Event::UpgradeableEvent(self) - } -} -impl EventWorldProviderEventIntoEvent of Into { - fn into(self: world_provider_cpt::Event) -> Event { - Event::WorldProviderEvent(self) - } -} -impl Eventtestcomponent1_eventIntoEvent of Into { - fn into(self: testcomponent1::Event) -> Event { - Event::testcomponent1_event(self) - } -} -impl Eventtestcomponent2_eventIntoEvent of Into { - fn into(self: testcomponent2::Event) -> Event { - Event::testcomponent2_event(self) - } -} - pub trait IDojoInit { - #[external(v0)] - fn dojo_init(self: @ContractState); -} -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::interface] - pub trait IEmptyTrait {} - - #[starknet::interface] - pub trait IFaultyTrait { - fn do_with_attrs(self: @TContractState, p1: u8) -> u16; - } - - #[starknet::interface] - pub trait INominalTrait { - fn do_no_param(self: @TContractState) -> felt252;fn do_no_param_but_world(self: @TContractState) -> felt252;fn do_no_param_but_world_ref(ref self: TContractState) -> felt252;fn do_params_no_world(self: @TContractState, p1: felt252, p2: u8) -> felt252;fn do_params_and_world(self: @TContractState, p2: u8) -> felt252;fn do_params_and_world_ref(ref self: TContractState, p2: u8) -> felt252;fn do_with_self(self: @ContractState) -> felt252;fn do_with_ref_self(ref self: ContractState) -> felt252; - } - - #[starknet::interface] - pub trait IFaultyTrait { - fn do_with_self_and_world(self: @ContractState, world: @IWorldDispatcher) -> felt252;fn do_with_ref_self_and_world(ref self: ContractState, ref world: IWorldDispatcher) -> felt252;fn do_with_self_and_world_inv(self: @TContractState, self: @ContractState) -> felt252;fn do_with_ref_self_and_world_inv(ref self: TContractState, ref self: ContractState -) -> felt252;fn do_with_several_world_dispatchers(self: @TContractState, vec: Vec2, ref another_world: IWorldDispatcher -) -> felt252;fn do_with_world_not_named_world(self: @TContractState, another_world: @IWorldDispatcher) -> felt252;fn do_with_world_not_first(self: @TContractState, vec: Vec2, ref world: IWorldDispatcher) -> felt252; - } -#[starknet::contract] -pub mod MyFaultyContract { - use dojo::contract::components::world_provider::{world_provider_cpt, world_provider_cpt::InternalTrait as WorldProviderInternal, IWorldProvider}; - use dojo::contract::components::upgradeable::upgradeable_cpt; - use dojo::contract::IContract; - - #[abi(embed_v0)] - impl WorldProviderImpl = world_provider_cpt::WorldProviderImpl; - - #[abi(embed_v0)] - impl UpgradeableImpl = upgradeable_cpt::UpgradeableImpl; - - #[abi(embed_v0)] - pub impl ContractImpl of IContract { - fn name(self: @ContractState) -> ByteArray { - "MyFaultyContract" - } - - fn namespace(self: @ContractState) -> ByteArray { - "dojo_test" - } - - fn tag(self: @ContractState) -> ByteArray { - "dojo_test-MyFaultyContract" - } - - fn name_hash(self: @ContractState) -> felt252 { - 3439743807865759203015037013733809315384408083697880336790137144257764256358 - } - - fn namespace_hash(self: @ContractState) -> felt252 { - 1452123528942907587532668415362544424816022573043154497385993678618948064048 - } - - fn selector(self: @ContractState) -> felt252 { - 3304414327641815709216225681190245445308480446755012097234787467696641395890 - } - } - - #[abi(embed_v0)] - impl TestFaultyImpl of IFaultyTrait {fn do_with_self_and_world(self: @ContractState) -> felt252 { 'land' -}fn do_with_ref_self_and_world( ref self: ContractState) -> felt252 { 'land' -}fn do_with_self_and_world_inv(self: @ContractState, self: @ContractState) -> felt252 {let world = self.world_provider.world(); 'land' -}fn do_with_ref_self_and_world_inv(ref self: ContractState, ref self: ContractState -) -> felt252 {let world = self.world_provider.world(); 'land' -}fn do_with_several_world_dispatchers(self: @ContractState, vec: Vec2, ref another_world: IWorldDispatcher -) -> felt252 {let world = self.world_provider.world(); 'land' -}fn do_with_world_not_named_world(self: @ContractState, another_world: @IWorldDispatcher) -> felt252 { 'land' -}fn do_with_world_not_first(self: @ContractState, vec: Vec2) -> felt252 { 'land' -}} - #[generate_trait] - impl InternalImplBad of InternalUtils {fn bad_func_using_generate(self: @ContractState) -> felt252 {let world = self.world_provider.world(); 'land' -}} - #[constructor] - fn constructor(ref self: ContractState) { - self.world_provider.initializer(); - } - #[abi(per_item)] -#[generate_trait] -pub impl IDojoInitImpl of IDojoInit { - #[external(v0)] - fn dojo_init(self: @ContractState) { - if starknet::get_caller_address() != self.world_provider.world().contract_address { - core::panics::panic_with_byte_array( - @format!("Only the world can init contract `{}`, but caller is `{:?}`", - self.tag(), - starknet::get_caller_address(), - )); - } - } -} - - #[event] - #[derive(Drop, starknet::Event)] - enum Event { - UpgradeableEvent: upgradeable_cpt::Event, - WorldProviderEvent: world_provider_cpt::Event, - } - trait InternalUtils{fn bad_func_using_generate(self: @ContractState) -> felt252; -} - pub trait IDojoInit { - #[external(v0)] - fn dojo_init(self: @ContractState); -} -impl EventDrop of core::traits::Drop::; -impl EventIsEvent of starknet::Event { - fn append_keys_and_data( - self: @Event, ref keys: Array, ref data: Array - ) { - match self { - Event::UpgradeableEvent(val) => { - core::array::ArrayTrait::append(ref keys, selector!("UpgradeableEvent")); - starknet::Event::append_keys_and_data( - val, ref keys, ref data - ); - }, - Event::WorldProviderEvent(val) => { - core::array::ArrayTrait::append(ref keys, selector!("WorldProviderEvent")); - starknet::Event::append_keys_and_data( - val, ref keys, ref data - ); - }, - } - } - fn deserialize( - ref keys: Span, ref data: Span, - ) -> Option { - let __selector__ = *core::array::SpanTrait::pop_front(ref keys)?; - if __selector__ == selector!("UpgradeableEvent") { - let val = starknet::Event::deserialize( - ref keys, ref data - )?; - return Option::Some(Event::UpgradeableEvent(val)); - } - if __selector__ == selector!("WorldProviderEvent") { - let val = starknet::Event::deserialize( - ref keys, ref data - )?; - return Option::Some(Event::WorldProviderEvent(val)); - } - Option::None - } -} -impl EventUpgradeableEventIntoEvent of Into { - fn into(self: upgradeable_cpt::Event) -> Event { - Event::UpgradeableEvent(self) - } -} -impl EventWorldProviderEventIntoEvent of Into { - fn into(self: world_provider_cpt::Event) -> Event { - Event::WorldProviderEvent(self) - } -} - - -#[phantom] -pub struct Storage { - #[substorage(v0)] - pub upgradeable: upgradeable_cpt::Storage, - #[substorage(v0)] - pub world_provider: world_provider_cpt::Storage, -} - -#[derive(Drop, Copy)] -pub struct StorageStorageBase { - pub upgradeable: starknet::storage::FlattenedStorage, - pub world_provider: starknet::storage::FlattenedStorage, -} -impl StorageStorageImpl of starknet::storage::StorageTrait { - type BaseType = StorageStorageBase; - fn storage(self: starknet::storage::FlattenedStorage) -> StorageStorageBase { - let __upgradeable_value__ = starknet::storage::FlattenedStorage {}; - let __world_provider_value__ = starknet::storage::FlattenedStorage {}; - StorageStorageBase { - upgradeable: __upgradeable_value__, - world_provider: __world_provider_value__, - } - } -} -#[derive(Drop, Copy)] -pub struct StorageStorageBaseMut { - pub upgradeable: starknet::storage::FlattenedStorage>, - pub world_provider: starknet::storage::FlattenedStorage>, -} -impl StorageStorageMutImpl of starknet::storage::StorageTraitMut { - type BaseType = StorageStorageBaseMut; - fn storage_mut(self: starknet::storage::FlattenedStorage>) -> StorageStorageBaseMut { - let __upgradeable_value__ = starknet::storage::FlattenedStorage {}; - let __world_provider_value__ = starknet::storage::FlattenedStorage {}; - StorageStorageBaseMut { - upgradeable: __upgradeable_value__, - world_provider: __world_provider_value__, - } - } -} - -pub struct ContractState { - pub upgradeable: upgradeable_cpt::ComponentState, - pub world_provider: world_provider_cpt::ComponentState, -} - -impl ContractStateDrop of Drop {} - -impl ContractStateDeref of core::ops::SnapshotDeref { - type Target = starknet::storage::FlattenedStorage; - fn snapshot_deref(self: @ContractState) -> starknet::storage::FlattenedStorage { - starknet::storage::FlattenedStorage {} - } -} -impl ContractStateDerefMut of core::ops::DerefMut { - type Target = starknet::storage::FlattenedStorage> ; - fn deref_mut(ref self: ContractState) -> starknet::storage::FlattenedStorage> { - starknet::storage::FlattenedStorage {} - } -} -pub fn unsafe_new_contract_state() -> ContractState { - ContractState { - upgradeable: upgradeable_cpt::unsafe_new_component_state::(), - world_provider: world_provider_cpt::unsafe_new_component_state::(), - } -} - -// TODO(Gil): This generates duplicate diagnostics because of the plugin system, squash the duplicates into one. -#[deprecated( - feature: "deprecated_legacy_map", - note: "Use `starknet::storage::Map` instead." -)] -#[allow(unused_imports)] -use starknet::storage::Map as LegacyMap; - -impl ContractStateWorldProviderImpl of - world_provider_cpt::UnsafeNewContractStateTraitForWorldProviderImpl { - fn unsafe_new_contract_state() -> ContractState { - unsafe_new_contract_state() - } -} -impl ContractStateUpgradeableImpl of - upgradeable_cpt::UnsafeNewContractStateTraitForUpgradeableImpl { - fn unsafe_new_contract_state() -> ContractState { - unsafe_new_contract_state() - } -} -#[implicit_precedence(core::pedersen::Pedersen, core::RangeCheck, core::integer::Bitwise, core::ec::EcOp, core::poseidon::Poseidon, core::SegmentArena, core::circuit::RangeCheck96, core::circuit::AddMod, core::circuit::MulMod, core::gas::GasBuiltin, System)] -fn __wrapper__ContractImpl__name(mut data: Span::) -> Span:: { - core::internal::require_implicit::(); - core::internal::revoke_ap_tracking(); - core::option::OptionTraitImpl::expect(core::gas::withdraw_gas(), 'Out of gas'); - - assert(core::array::SpanTrait::is_empty(data), 'Input too long for arguments'); - core::option::OptionTraitImpl::expect( - core::gas::withdraw_gas_all(core::gas::get_builtin_costs()), 'Out of gas', - ); - let mut contract_state = unsafe_new_contract_state(); - let res = ContractImpl::name(@contract_state, ); - let mut arr = ArrayTrait::new(); - // References. - // Result. - core::serde::Serde::::serialize(@res, ref arr); - core::array::ArrayTrait::span(@arr) -} - -#[implicit_precedence(core::pedersen::Pedersen, core::RangeCheck, core::integer::Bitwise, core::ec::EcOp, core::poseidon::Poseidon, core::SegmentArena, core::circuit::RangeCheck96, core::circuit::AddMod, core::circuit::MulMod, core::gas::GasBuiltin, System)] -fn __wrapper__ContractImpl__namespace(mut data: Span::) -> Span:: { - core::internal::require_implicit::(); - core::internal::revoke_ap_tracking(); - core::option::OptionTraitImpl::expect(core::gas::withdraw_gas(), 'Out of gas'); - - assert(core::array::SpanTrait::is_empty(data), 'Input too long for arguments'); - core::option::OptionTraitImpl::expect( - core::gas::withdraw_gas_all(core::gas::get_builtin_costs()), 'Out of gas', - ); - let mut contract_state = unsafe_new_contract_state(); - let res = ContractImpl::namespace(@contract_state, ); - let mut arr = ArrayTrait::new(); - // References. - // Result. - core::serde::Serde::::serialize(@res, ref arr); - core::array::ArrayTrait::span(@arr) -} - -#[implicit_precedence(core::pedersen::Pedersen, core::RangeCheck, core::integer::Bitwise, core::ec::EcOp, core::poseidon::Poseidon, core::SegmentArena, core::circuit::RangeCheck96, core::circuit::AddMod, core::circuit::MulMod, core::gas::GasBuiltin, System)] -fn __wrapper__ContractImpl__tag(mut data: Span::) -> Span:: { - core::internal::require_implicit::(); - core::internal::revoke_ap_tracking(); - core::option::OptionTraitImpl::expect(core::gas::withdraw_gas(), 'Out of gas'); - - assert(core::array::SpanTrait::is_empty(data), 'Input too long for arguments'); - core::option::OptionTraitImpl::expect( - core::gas::withdraw_gas_all(core::gas::get_builtin_costs()), 'Out of gas', - ); - let mut contract_state = unsafe_new_contract_state(); - let res = ContractImpl::tag(@contract_state, ); - let mut arr = ArrayTrait::new(); - // References. - // Result. - core::serde::Serde::::serialize(@res, ref arr); - core::array::ArrayTrait::span(@arr) -} - -#[implicit_precedence(core::pedersen::Pedersen, core::RangeCheck, core::integer::Bitwise, core::ec::EcOp, core::poseidon::Poseidon, core::SegmentArena, core::circuit::RangeCheck96, core::circuit::AddMod, core::circuit::MulMod, core::gas::GasBuiltin, System)] -fn __wrapper__ContractImpl__name_hash(mut data: Span::) -> Span:: { - core::internal::require_implicit::(); - core::internal::revoke_ap_tracking(); - core::option::OptionTraitImpl::expect(core::gas::withdraw_gas(), 'Out of gas'); - - assert(core::array::SpanTrait::is_empty(data), 'Input too long for arguments'); - core::option::OptionTraitImpl::expect( - core::gas::withdraw_gas_all(core::gas::get_builtin_costs()), 'Out of gas', - ); - let mut contract_state = unsafe_new_contract_state(); - let res = ContractImpl::name_hash(@contract_state, ); - let mut arr = ArrayTrait::new(); - // References. - // Result. - core::serde::Serde::::serialize(@res, ref arr); - core::array::ArrayTrait::span(@arr) -} - -#[implicit_precedence(core::pedersen::Pedersen, core::RangeCheck, core::integer::Bitwise, core::ec::EcOp, core::poseidon::Poseidon, core::SegmentArena, core::circuit::RangeCheck96, core::circuit::AddMod, core::circuit::MulMod, core::gas::GasBuiltin, System)] -fn __wrapper__ContractImpl__namespace_hash(mut data: Span::) -> Span:: { - core::internal::require_implicit::(); - core::internal::revoke_ap_tracking(); - core::option::OptionTraitImpl::expect(core::gas::withdraw_gas(), 'Out of gas'); - - assert(core::array::SpanTrait::is_empty(data), 'Input too long for arguments'); - core::option::OptionTraitImpl::expect( - core::gas::withdraw_gas_all(core::gas::get_builtin_costs()), 'Out of gas', - ); - let mut contract_state = unsafe_new_contract_state(); - let res = ContractImpl::namespace_hash(@contract_state, ); - let mut arr = ArrayTrait::new(); - // References. - // Result. - core::serde::Serde::::serialize(@res, ref arr); - core::array::ArrayTrait::span(@arr) -} - -#[implicit_precedence(core::pedersen::Pedersen, core::RangeCheck, core::integer::Bitwise, core::ec::EcOp, core::poseidon::Poseidon, core::SegmentArena, core::circuit::RangeCheck96, core::circuit::AddMod, core::circuit::MulMod, core::gas::GasBuiltin, System)] -fn __wrapper__ContractImpl__selector(mut data: Span::) -> Span:: { - core::internal::require_implicit::(); - core::internal::revoke_ap_tracking(); - core::option::OptionTraitImpl::expect(core::gas::withdraw_gas(), 'Out of gas'); - - assert(core::array::SpanTrait::is_empty(data), 'Input too long for arguments'); - core::option::OptionTraitImpl::expect( - core::gas::withdraw_gas_all(core::gas::get_builtin_costs()), 'Out of gas', - ); - let mut contract_state = unsafe_new_contract_state(); - let res = ContractImpl::selector(@contract_state, ); - let mut arr = ArrayTrait::new(); - // References. - // Result. - core::serde::Serde::::serialize(@res, ref arr); - core::array::ArrayTrait::span(@arr) -} - -#[implicit_precedence(core::pedersen::Pedersen, core::RangeCheck, core::integer::Bitwise, core::ec::EcOp, core::poseidon::Poseidon, core::SegmentArena, core::circuit::RangeCheck96, core::circuit::AddMod, core::circuit::MulMod, core::gas::GasBuiltin, System)] -fn __wrapper__TestFaultyImpl__do_with_self_and_world(mut data: Span::) -> Span:: { - core::internal::require_implicit::(); - core::internal::revoke_ap_tracking(); - core::option::OptionTraitImpl::expect(core::gas::withdraw_gas(), 'Out of gas'); - - assert(core::array::SpanTrait::is_empty(data), 'Input too long for arguments'); - core::option::OptionTraitImpl::expect( - core::gas::withdraw_gas_all(core::gas::get_builtin_costs()), 'Out of gas', - ); - let mut contract_state = unsafe_new_contract_state(); - let res = TestFaultyImpl::do_with_self_and_world(@contract_state, ); - let mut arr = ArrayTrait::new(); - // References. - // Result. - core::serde::Serde::::serialize(@res, ref arr); - core::array::ArrayTrait::span(@arr) -} - -#[implicit_precedence(core::pedersen::Pedersen, core::RangeCheck, core::integer::Bitwise, core::ec::EcOp, core::poseidon::Poseidon, core::SegmentArena, core::circuit::RangeCheck96, core::circuit::AddMod, core::circuit::MulMod, core::gas::GasBuiltin, System)] -fn __wrapper__TestFaultyImpl__do_with_ref_self_and_world(mut data: Span::) -> Span:: { - core::internal::require_implicit::(); - core::internal::revoke_ap_tracking(); - core::option::OptionTraitImpl::expect(core::gas::withdraw_gas(), 'Out of gas'); - - assert(core::array::SpanTrait::is_empty(data), 'Input too long for arguments'); - core::option::OptionTraitImpl::expect( - core::gas::withdraw_gas_all(core::gas::get_builtin_costs()), 'Out of gas', - ); - let mut contract_state = unsafe_new_contract_state(); - let res = TestFaultyImpl::do_with_ref_self_and_world(ref contract_state, ); - let mut arr = ArrayTrait::new(); - // References. - // Result. - core::serde::Serde::::serialize(@res, ref arr); - core::array::ArrayTrait::span(@arr) -} - -#[implicit_precedence(core::pedersen::Pedersen, core::RangeCheck, core::integer::Bitwise, core::ec::EcOp, core::poseidon::Poseidon, core::SegmentArena, core::circuit::RangeCheck96, core::circuit::AddMod, core::circuit::MulMod, core::gas::GasBuiltin, System)] -fn __wrapper__TestFaultyImpl__do_with_self_and_world_inv(mut data: Span::) -> Span:: { - core::internal::require_implicit::(); - core::internal::revoke_ap_tracking(); - core::option::OptionTraitImpl::expect(core::gas::withdraw_gas(), 'Out of gas'); - let __arg_self = core::option::OptionTraitImpl::expect( - core::serde::Serde::<@ContractState>::deserialize(ref data), - 'Failed to deserialize param #1' - ); - assert(core::array::SpanTrait::is_empty(data), 'Input too long for arguments'); - core::option::OptionTraitImpl::expect( - core::gas::withdraw_gas_all(core::gas::get_builtin_costs()), 'Out of gas', - ); - let mut contract_state = unsafe_new_contract_state(); - let res = TestFaultyImpl::do_with_self_and_world_inv(@contract_state, __arg_self); - let mut arr = ArrayTrait::new(); - // References. - // Result. - core::serde::Serde::::serialize(@res, ref arr); - core::array::ArrayTrait::span(@arr) -} - -#[implicit_precedence(core::pedersen::Pedersen, core::RangeCheck, core::integer::Bitwise, core::ec::EcOp, core::poseidon::Poseidon, core::SegmentArena, core::circuit::RangeCheck96, core::circuit::AddMod, core::circuit::MulMod, core::gas::GasBuiltin, System)] -fn __wrapper__TestFaultyImpl__do_with_ref_self_and_world_inv(mut data: Span::) -> Span:: { - core::internal::require_implicit::(); - core::internal::revoke_ap_tracking(); - core::option::OptionTraitImpl::expect(core::gas::withdraw_gas(), 'Out of gas'); - let mut __arg_self = core::option::OptionTraitImpl::expect( - core::serde::Serde::::deserialize(ref data), - 'Failed to deserialize param #1' - ); - assert(core::array::SpanTrait::is_empty(data), 'Input too long for arguments'); - core::option::OptionTraitImpl::expect( - core::gas::withdraw_gas_all(core::gas::get_builtin_costs()), 'Out of gas', - ); - let mut contract_state = unsafe_new_contract_state(); - let res = TestFaultyImpl::do_with_ref_self_and_world_inv(ref contract_state, ref __arg_self); - let mut arr = ArrayTrait::new(); - // References. - core::serde::Serde::::serialize(@__arg_self, ref arr); - // Result. - core::serde::Serde::::serialize(@res, ref arr); - core::array::ArrayTrait::span(@arr) -} - -#[implicit_precedence(core::pedersen::Pedersen, core::RangeCheck, core::integer::Bitwise, core::ec::EcOp, core::poseidon::Poseidon, core::SegmentArena, core::circuit::RangeCheck96, core::circuit::AddMod, core::circuit::MulMod, core::gas::GasBuiltin, System)] -fn __wrapper__TestFaultyImpl__do_with_several_world_dispatchers(mut data: Span::) -> Span:: { - core::internal::require_implicit::(); - core::internal::revoke_ap_tracking(); - core::option::OptionTraitImpl::expect(core::gas::withdraw_gas(), 'Out of gas'); - let __arg_vec = core::option::OptionTraitImpl::expect( - core::serde::Serde::::deserialize(ref data), - 'Failed to deserialize param #1' - ); - let mut __arg_another_world = core::option::OptionTraitImpl::expect( - core::serde::Serde::::deserialize(ref data), - 'Failed to deserialize param #2' - ); - assert(core::array::SpanTrait::is_empty(data), 'Input too long for arguments'); - core::option::OptionTraitImpl::expect( - core::gas::withdraw_gas_all(core::gas::get_builtin_costs()), 'Out of gas', - ); - let mut contract_state = unsafe_new_contract_state(); - let res = TestFaultyImpl::do_with_several_world_dispatchers(@contract_state, __arg_vec, ref __arg_another_world); - let mut arr = ArrayTrait::new(); - // References. - core::serde::Serde::::serialize(@__arg_another_world, ref arr); - // Result. - core::serde::Serde::::serialize(@res, ref arr); - core::array::ArrayTrait::span(@arr) -} - -#[implicit_precedence(core::pedersen::Pedersen, core::RangeCheck, core::integer::Bitwise, core::ec::EcOp, core::poseidon::Poseidon, core::SegmentArena, core::circuit::RangeCheck96, core::circuit::AddMod, core::circuit::MulMod, core::gas::GasBuiltin, System)] -fn __wrapper__TestFaultyImpl__do_with_world_not_named_world(mut data: Span::) -> Span:: { - core::internal::require_implicit::(); - core::internal::revoke_ap_tracking(); - core::option::OptionTraitImpl::expect(core::gas::withdraw_gas(), 'Out of gas'); - let __arg_another_world = core::option::OptionTraitImpl::expect( - core::serde::Serde::<@IWorldDispatcher>::deserialize(ref data), - 'Failed to deserialize param #1' - ); - assert(core::array::SpanTrait::is_empty(data), 'Input too long for arguments'); - core::option::OptionTraitImpl::expect( - core::gas::withdraw_gas_all(core::gas::get_builtin_costs()), 'Out of gas', - ); - let mut contract_state = unsafe_new_contract_state(); - let res = TestFaultyImpl::do_with_world_not_named_world(@contract_state, __arg_another_world); - let mut arr = ArrayTrait::new(); - // References. - // Result. - core::serde::Serde::::serialize(@res, ref arr); - core::array::ArrayTrait::span(@arr) -} - -#[implicit_precedence(core::pedersen::Pedersen, core::RangeCheck, core::integer::Bitwise, core::ec::EcOp, core::poseidon::Poseidon, core::SegmentArena, core::circuit::RangeCheck96, core::circuit::AddMod, core::circuit::MulMod, core::gas::GasBuiltin, System)] -fn __wrapper__TestFaultyImpl__do_with_world_not_first(mut data: Span::) -> Span:: { - core::internal::require_implicit::(); - core::internal::revoke_ap_tracking(); - core::option::OptionTraitImpl::expect(core::gas::withdraw_gas(), 'Out of gas'); - let __arg_vec = core::option::OptionTraitImpl::expect( - core::serde::Serde::::deserialize(ref data), - 'Failed to deserialize param #1' - ); - assert(core::array::SpanTrait::is_empty(data), 'Input too long for arguments'); - core::option::OptionTraitImpl::expect( - core::gas::withdraw_gas_all(core::gas::get_builtin_costs()), 'Out of gas', - ); - let mut contract_state = unsafe_new_contract_state(); - let res = TestFaultyImpl::do_with_world_not_first(@contract_state, __arg_vec); - let mut arr = ArrayTrait::new(); - // References. - // Result. - core::serde::Serde::::serialize(@res, ref arr); - core::array::ArrayTrait::span(@arr) -} - -#[implicit_precedence(core::pedersen::Pedersen, core::RangeCheck, core::integer::Bitwise, core::ec::EcOp, core::poseidon::Poseidon, core::SegmentArena, core::circuit::RangeCheck96, core::circuit::AddMod, core::circuit::MulMod, core::gas::GasBuiltin, System)] -fn __wrapper__constructor(mut data: Span::) -> Span:: { - core::internal::require_implicit::(); - core::internal::revoke_ap_tracking(); - core::option::OptionTraitImpl::expect(core::gas::withdraw_gas(), 'Out of gas'); - - assert(core::array::SpanTrait::is_empty(data), 'Input too long for arguments'); - core::option::OptionTraitImpl::expect( - core::gas::withdraw_gas_all(core::gas::get_builtin_costs()), 'Out of gas', - ); - let mut contract_state = unsafe_new_contract_state(); - constructor(ref contract_state, ); - let mut arr = ArrayTrait::new(); - // References. - // Result. - core::array::ArrayTrait::span(@arr) -} - -#[implicit_precedence(core::pedersen::Pedersen, core::RangeCheck, core::integer::Bitwise, core::ec::EcOp, core::poseidon::Poseidon, core::SegmentArena, core::circuit::RangeCheck96, core::circuit::AddMod, core::circuit::MulMod, core::gas::GasBuiltin, System)] -fn __wrapper__IDojoInitImpl__dojo_init(mut data: Span::) -> Span:: { - core::internal::require_implicit::(); - core::internal::revoke_ap_tracking(); - core::option::OptionTraitImpl::expect(core::gas::withdraw_gas(), 'Out of gas'); - - assert(core::array::SpanTrait::is_empty(data), 'Input too long for arguments'); - core::option::OptionTraitImpl::expect( - core::gas::withdraw_gas_all(core::gas::get_builtin_costs()), 'Out of gas', - ); - let mut contract_state = unsafe_new_contract_state(); - IDojoInitImpl::dojo_init(@contract_state, ); - let mut arr = ArrayTrait::new(); - // References. - // Result. - core::array::ArrayTrait::span(@arr) -} - - -pub mod __external { - pub use super::__wrapper__ContractImpl__name as name; - pub use super::__wrapper__ContractImpl__namespace as namespace; - pub use super::__wrapper__ContractImpl__tag as tag; - pub use super::__wrapper__ContractImpl__name_hash as name_hash; - pub use super::__wrapper__ContractImpl__namespace_hash as namespace_hash; - pub use super::__wrapper__ContractImpl__selector as selector; - pub use super::__wrapper__TestFaultyImpl__do_with_self_and_world as do_with_self_and_world; - pub use super::__wrapper__TestFaultyImpl__do_with_ref_self_and_world as do_with_ref_self_and_world; - pub use super::__wrapper__TestFaultyImpl__do_with_self_and_world_inv as do_with_self_and_world_inv; - pub use super::__wrapper__TestFaultyImpl__do_with_ref_self_and_world_inv as do_with_ref_self_and_world_inv; - pub use super::__wrapper__TestFaultyImpl__do_with_several_world_dispatchers as do_with_several_world_dispatchers; - pub use super::__wrapper__TestFaultyImpl__do_with_world_not_named_world as do_with_world_not_named_world; - pub use super::__wrapper__TestFaultyImpl__do_with_world_not_first as do_with_world_not_first; - pub use super::__wrapper__IDojoInitImpl__dojo_init as dojo_init; -} -pub mod __l1_handler { -} -pub mod __constructor { - pub use super::__wrapper__constructor as constructor; -} - impl ContractStateEventEmitter of starknet::event::EventEmitter< - ContractState, Event - > { - fn emit>( - ref self: ContractState, event: S - ) { - let event: Event = core::traits::Into::into(event); - let mut keys = Default::::default(); - let mut data = Default::::default(); - starknet::Event::append_keys_and_data(@event, ref keys, ref data); - starknet::SyscallResultTrait::unwrap_syscall( - starknet::syscalls::emit_event_syscall( - core::array::ArrayTrait::span(@keys), - core::array::ArrayTrait::span(@data), - ) - ) - } - } - -impl HasComponentImpl_world_provider_cpt of world_provider_cpt::HasComponent { - fn get_component(self: @ContractState) -> @world_provider_cpt::ComponentState { - @world_provider_cpt::unsafe_new_component_state::() - } - fn get_component_mut(ref self: ContractState) -> world_provider_cpt::ComponentState { - world_provider_cpt::unsafe_new_component_state::() - } - fn get_contract(self: @world_provider_cpt::ComponentState) -> @ContractState { - @unsafe_new_contract_state() - } - fn get_contract_mut(ref self: world_provider_cpt::ComponentState) -> ContractState { - unsafe_new_contract_state() - } - fn emit>(ref self: world_provider_cpt::ComponentState, event: S) { - let event: world_provider_cpt::Event = core::traits::Into::into(event); - let mut contract = world_provider_cpt::HasComponent::get_contract_mut(ref self); - ContractStateEventEmitter::emit(ref contract, Event::WorldProviderEvent(event)); - } -} -impl HasComponentImpl_upgradeable_cpt of upgradeable_cpt::HasComponent { - fn get_component(self: @ContractState) -> @upgradeable_cpt::ComponentState { - @upgradeable_cpt::unsafe_new_component_state::() - } - fn get_component_mut(ref self: ContractState) -> upgradeable_cpt::ComponentState { - upgradeable_cpt::unsafe_new_component_state::() - } - fn get_contract(self: @upgradeable_cpt::ComponentState) -> @ContractState { - @unsafe_new_contract_state() - } - fn get_contract_mut(ref self: upgradeable_cpt::ComponentState) -> ContractState { - unsafe_new_contract_state() - } - fn emit>(ref self: upgradeable_cpt::ComponentState, event: S) { - let event: upgradeable_cpt::Event = core::traits::Into::into(event); - let mut contract = upgradeable_cpt::HasComponent::get_contract_mut(ref self); - ContractStateEventEmitter::emit(ref contract, Event::UpgradeableEvent(event)); - } -} -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::contract] -pub mod MyNominalContract { - use dojo::contract::components::world_provider::{world_provider_cpt, world_provider_cpt::InternalTrait as WorldProviderInternal, IWorldProvider}; - use dojo::contract::components::upgradeable::upgradeable_cpt; - use dojo::contract::IContract; - - #[abi(embed_v0)] - impl WorldProviderImpl = world_provider_cpt::WorldProviderImpl; - - #[abi(embed_v0)] - impl UpgradeableImpl = upgradeable_cpt::UpgradeableImpl; - - #[abi(embed_v0)] - pub impl ContractImpl of IContract { - fn name(self: @ContractState) -> ByteArray { - "MyNominalContract" - } - - fn namespace(self: @ContractState) -> ByteArray { - "dojo_test" - } - - fn tag(self: @ContractState) -> ByteArray { - "dojo_test-MyNominalContract" - } - - fn name_hash(self: @ContractState) -> felt252 { - 1172628497499445169993220559087829230676589931723677494032285307738203070578 - } - - fn namespace_hash(self: @ContractState) -> felt252 { - 1452123528942907587532668415362544424816022573043154497385993678618948064048 - } - - fn selector(self: @ContractState) -> felt252 { - 1466845198188516049094649763342542731381088471625065496527510975945391631525 - } - } - - #[derive(Drop)] - struct Action { - damage: u8 - } - - #[abi(embed_v0)] - impl TestNominalImpl of INominalTrait {fn do_no_param(self: @ContractState) -> felt252 { 'land' -}fn do_no_param_but_world(self: @ContractState) -> felt252 {let world = self.world_provider.world(); 'land' -}fn do_no_param_but_world_ref(ref self: ContractState) -> felt252 {let world = self.world_provider.world(); 'land' -}fn do_params_no_world(self: @ContractState, p1: felt252, p2: u8) -> felt252 { 'land' -}fn do_params_and_world(self: @ContractState, p2: u8) -> felt252 {let world = self.world_provider.world(); 'land' -}fn do_params_and_world_ref(ref self: ContractState, p2: u8) -> felt252 {let world = self.world_provider.world(); 'land' -}fn do_with_self(self: @ContractState) -> felt252 { 'land' -}fn do_with_ref_self(ref self: ContractState) -> felt252 { 'land' -}} - #[generate_trait] - impl ImplInternalNoContractState of InternalNoContractState { - fn func1(world: IWorldDispatcher) -> felt252 { - let _w = world; - 42 - } - } - - #[constructor] - fn constructor(ref self: ContractState) { - self.world_provider.initializer(); - } - #[abi(per_item)] -#[generate_trait] -pub impl IDojoInitImpl of IDojoInit { - #[external(v0)] - fn dojo_init(self: @ContractState) { - if starknet::get_caller_address() != self.world_provider.world().contract_address { - core::panics::panic_with_byte_array( - @format!("Only the world can init contract `{}`, but caller is `{:?}`", - self.tag(), - starknet::get_caller_address(), - )); - } - } -} - - #[event] - #[derive(Drop, starknet::Event)] - enum Event { - UpgradeableEvent: upgradeable_cpt::Event, - WorldProviderEvent: world_provider_cpt::Event, - } -impl ActionDrop of core::traits::Drop::; - trait InternalNoContractState { - fn func1(world: IWorldDispatcher) -> felt252; - } - pub trait IDojoInit { - #[external(v0)] - fn dojo_init(self: @ContractState); -} -impl EventDrop of core::traits::Drop::; -impl EventIsEvent of starknet::Event { - fn append_keys_and_data( - self: @Event, ref keys: Array, ref data: Array - ) { - match self { - Event::UpgradeableEvent(val) => { - core::array::ArrayTrait::append(ref keys, selector!("UpgradeableEvent")); - starknet::Event::append_keys_and_data( - val, ref keys, ref data - ); - }, - Event::WorldProviderEvent(val) => { - core::array::ArrayTrait::append(ref keys, selector!("WorldProviderEvent")); - starknet::Event::append_keys_and_data( - val, ref keys, ref data - ); - }, - } - } - fn deserialize( - ref keys: Span, ref data: Span, - ) -> Option { - let __selector__ = *core::array::SpanTrait::pop_front(ref keys)?; - if __selector__ == selector!("UpgradeableEvent") { - let val = starknet::Event::deserialize( - ref keys, ref data - )?; - return Option::Some(Event::UpgradeableEvent(val)); - } - if __selector__ == selector!("WorldProviderEvent") { - let val = starknet::Event::deserialize( - ref keys, ref data - )?; - return Option::Some(Event::WorldProviderEvent(val)); - } - Option::None - } -} -impl EventUpgradeableEventIntoEvent of Into { - fn into(self: upgradeable_cpt::Event) -> Event { - Event::UpgradeableEvent(self) - } -} -impl EventWorldProviderEventIntoEvent of Into { - fn into(self: world_provider_cpt::Event) -> Event { - Event::WorldProviderEvent(self) - } -} - - -#[phantom] -pub struct Storage { - #[substorage(v0)] - pub upgradeable: upgradeable_cpt::Storage, - #[substorage(v0)] - pub world_provider: world_provider_cpt::Storage, -} - -#[derive(Drop, Copy)] -pub struct StorageStorageBase { - pub upgradeable: starknet::storage::FlattenedStorage, - pub world_provider: starknet::storage::FlattenedStorage, -} -impl StorageStorageImpl of starknet::storage::StorageTrait { - type BaseType = StorageStorageBase; - fn storage(self: starknet::storage::FlattenedStorage) -> StorageStorageBase { - let __upgradeable_value__ = starknet::storage::FlattenedStorage {}; - let __world_provider_value__ = starknet::storage::FlattenedStorage {}; - StorageStorageBase { - upgradeable: __upgradeable_value__, - world_provider: __world_provider_value__, - } - } -} -#[derive(Drop, Copy)] -pub struct StorageStorageBaseMut { - pub upgradeable: starknet::storage::FlattenedStorage>, - pub world_provider: starknet::storage::FlattenedStorage>, -} -impl StorageStorageMutImpl of starknet::storage::StorageTraitMut { - type BaseType = StorageStorageBaseMut; - fn storage_mut(self: starknet::storage::FlattenedStorage>) -> StorageStorageBaseMut { - let __upgradeable_value__ = starknet::storage::FlattenedStorage {}; - let __world_provider_value__ = starknet::storage::FlattenedStorage {}; - StorageStorageBaseMut { - upgradeable: __upgradeable_value__, - world_provider: __world_provider_value__, - } - } -} - -pub struct ContractState { - pub upgradeable: upgradeable_cpt::ComponentState, - pub world_provider: world_provider_cpt::ComponentState, -} - -impl ContractStateDrop of Drop {} - -impl ContractStateDeref of core::ops::SnapshotDeref { - type Target = starknet::storage::FlattenedStorage; - fn snapshot_deref(self: @ContractState) -> starknet::storage::FlattenedStorage { - starknet::storage::FlattenedStorage {} - } -} -impl ContractStateDerefMut of core::ops::DerefMut { - type Target = starknet::storage::FlattenedStorage> ; - fn deref_mut(ref self: ContractState) -> starknet::storage::FlattenedStorage> { - starknet::storage::FlattenedStorage {} - } -} -pub fn unsafe_new_contract_state() -> ContractState { - ContractState { - upgradeable: upgradeable_cpt::unsafe_new_component_state::(), - world_provider: world_provider_cpt::unsafe_new_component_state::(), - } -} - -// TODO(Gil): This generates duplicate diagnostics because of the plugin system, squash the duplicates into one. -#[deprecated( - feature: "deprecated_legacy_map", - note: "Use `starknet::storage::Map` instead." -)] -#[allow(unused_imports)] -use starknet::storage::Map as LegacyMap; - -impl ContractStateWorldProviderImpl of - world_provider_cpt::UnsafeNewContractStateTraitForWorldProviderImpl { - fn unsafe_new_contract_state() -> ContractState { - unsafe_new_contract_state() - } -} -impl ContractStateUpgradeableImpl of - upgradeable_cpt::UnsafeNewContractStateTraitForUpgradeableImpl { - fn unsafe_new_contract_state() -> ContractState { - unsafe_new_contract_state() - } -} -#[implicit_precedence(core::pedersen::Pedersen, core::RangeCheck, core::integer::Bitwise, core::ec::EcOp, core::poseidon::Poseidon, core::SegmentArena, core::circuit::RangeCheck96, core::circuit::AddMod, core::circuit::MulMod, core::gas::GasBuiltin, System)] -fn __wrapper__ContractImpl__name(mut data: Span::) -> Span:: { - core::internal::require_implicit::(); - core::internal::revoke_ap_tracking(); - core::option::OptionTraitImpl::expect(core::gas::withdraw_gas(), 'Out of gas'); - - assert(core::array::SpanTrait::is_empty(data), 'Input too long for arguments'); - core::option::OptionTraitImpl::expect( - core::gas::withdraw_gas_all(core::gas::get_builtin_costs()), 'Out of gas', - ); - let mut contract_state = unsafe_new_contract_state(); - let res = ContractImpl::name(@contract_state, ); - let mut arr = ArrayTrait::new(); - // References. - // Result. - core::serde::Serde::::serialize(@res, ref arr); - core::array::ArrayTrait::span(@arr) -} - -#[implicit_precedence(core::pedersen::Pedersen, core::RangeCheck, core::integer::Bitwise, core::ec::EcOp, core::poseidon::Poseidon, core::SegmentArena, core::circuit::RangeCheck96, core::circuit::AddMod, core::circuit::MulMod, core::gas::GasBuiltin, System)] -fn __wrapper__ContractImpl__namespace(mut data: Span::) -> Span:: { - core::internal::require_implicit::(); - core::internal::revoke_ap_tracking(); - core::option::OptionTraitImpl::expect(core::gas::withdraw_gas(), 'Out of gas'); - - assert(core::array::SpanTrait::is_empty(data), 'Input too long for arguments'); - core::option::OptionTraitImpl::expect( - core::gas::withdraw_gas_all(core::gas::get_builtin_costs()), 'Out of gas', - ); - let mut contract_state = unsafe_new_contract_state(); - let res = ContractImpl::namespace(@contract_state, ); - let mut arr = ArrayTrait::new(); - // References. - // Result. - core::serde::Serde::::serialize(@res, ref arr); - core::array::ArrayTrait::span(@arr) -} - -#[implicit_precedence(core::pedersen::Pedersen, core::RangeCheck, core::integer::Bitwise, core::ec::EcOp, core::poseidon::Poseidon, core::SegmentArena, core::circuit::RangeCheck96, core::circuit::AddMod, core::circuit::MulMod, core::gas::GasBuiltin, System)] -fn __wrapper__ContractImpl__tag(mut data: Span::) -> Span:: { - core::internal::require_implicit::(); - core::internal::revoke_ap_tracking(); - core::option::OptionTraitImpl::expect(core::gas::withdraw_gas(), 'Out of gas'); - - assert(core::array::SpanTrait::is_empty(data), 'Input too long for arguments'); - core::option::OptionTraitImpl::expect( - core::gas::withdraw_gas_all(core::gas::get_builtin_costs()), 'Out of gas', - ); - let mut contract_state = unsafe_new_contract_state(); - let res = ContractImpl::tag(@contract_state, ); - let mut arr = ArrayTrait::new(); - // References. - // Result. - core::serde::Serde::::serialize(@res, ref arr); - core::array::ArrayTrait::span(@arr) -} - -#[implicit_precedence(core::pedersen::Pedersen, core::RangeCheck, core::integer::Bitwise, core::ec::EcOp, core::poseidon::Poseidon, core::SegmentArena, core::circuit::RangeCheck96, core::circuit::AddMod, core::circuit::MulMod, core::gas::GasBuiltin, System)] -fn __wrapper__ContractImpl__name_hash(mut data: Span::) -> Span:: { - core::internal::require_implicit::(); - core::internal::revoke_ap_tracking(); - core::option::OptionTraitImpl::expect(core::gas::withdraw_gas(), 'Out of gas'); - - assert(core::array::SpanTrait::is_empty(data), 'Input too long for arguments'); - core::option::OptionTraitImpl::expect( - core::gas::withdraw_gas_all(core::gas::get_builtin_costs()), 'Out of gas', - ); - let mut contract_state = unsafe_new_contract_state(); - let res = ContractImpl::name_hash(@contract_state, ); - let mut arr = ArrayTrait::new(); - // References. - // Result. - core::serde::Serde::::serialize(@res, ref arr); - core::array::ArrayTrait::span(@arr) -} - -#[implicit_precedence(core::pedersen::Pedersen, core::RangeCheck, core::integer::Bitwise, core::ec::EcOp, core::poseidon::Poseidon, core::SegmentArena, core::circuit::RangeCheck96, core::circuit::AddMod, core::circuit::MulMod, core::gas::GasBuiltin, System)] -fn __wrapper__ContractImpl__namespace_hash(mut data: Span::) -> Span:: { - core::internal::require_implicit::(); - core::internal::revoke_ap_tracking(); - core::option::OptionTraitImpl::expect(core::gas::withdraw_gas(), 'Out of gas'); - - assert(core::array::SpanTrait::is_empty(data), 'Input too long for arguments'); - core::option::OptionTraitImpl::expect( - core::gas::withdraw_gas_all(core::gas::get_builtin_costs()), 'Out of gas', - ); - let mut contract_state = unsafe_new_contract_state(); - let res = ContractImpl::namespace_hash(@contract_state, ); - let mut arr = ArrayTrait::new(); - // References. - // Result. - core::serde::Serde::::serialize(@res, ref arr); - core::array::ArrayTrait::span(@arr) -} - -#[implicit_precedence(core::pedersen::Pedersen, core::RangeCheck, core::integer::Bitwise, core::ec::EcOp, core::poseidon::Poseidon, core::SegmentArena, core::circuit::RangeCheck96, core::circuit::AddMod, core::circuit::MulMod, core::gas::GasBuiltin, System)] -fn __wrapper__ContractImpl__selector(mut data: Span::) -> Span:: { - core::internal::require_implicit::(); - core::internal::revoke_ap_tracking(); - core::option::OptionTraitImpl::expect(core::gas::withdraw_gas(), 'Out of gas'); - - assert(core::array::SpanTrait::is_empty(data), 'Input too long for arguments'); - core::option::OptionTraitImpl::expect( - core::gas::withdraw_gas_all(core::gas::get_builtin_costs()), 'Out of gas', - ); - let mut contract_state = unsafe_new_contract_state(); - let res = ContractImpl::selector(@contract_state, ); - let mut arr = ArrayTrait::new(); - // References. - // Result. - core::serde::Serde::::serialize(@res, ref arr); - core::array::ArrayTrait::span(@arr) -} - -#[implicit_precedence(core::pedersen::Pedersen, core::RangeCheck, core::integer::Bitwise, core::ec::EcOp, core::poseidon::Poseidon, core::SegmentArena, core::circuit::RangeCheck96, core::circuit::AddMod, core::circuit::MulMod, core::gas::GasBuiltin, System)] -fn __wrapper__TestNominalImpl__do_no_param(mut data: Span::) -> Span:: { - core::internal::require_implicit::(); - core::internal::revoke_ap_tracking(); - core::option::OptionTraitImpl::expect(core::gas::withdraw_gas(), 'Out of gas'); - - assert(core::array::SpanTrait::is_empty(data), 'Input too long for arguments'); - core::option::OptionTraitImpl::expect( - core::gas::withdraw_gas_all(core::gas::get_builtin_costs()), 'Out of gas', - ); - let mut contract_state = unsafe_new_contract_state(); - let res = TestNominalImpl::do_no_param(@contract_state, ); - let mut arr = ArrayTrait::new(); - // References. - // Result. - core::serde::Serde::::serialize(@res, ref arr); - core::array::ArrayTrait::span(@arr) -} - -#[implicit_precedence(core::pedersen::Pedersen, core::RangeCheck, core::integer::Bitwise, core::ec::EcOp, core::poseidon::Poseidon, core::SegmentArena, core::circuit::RangeCheck96, core::circuit::AddMod, core::circuit::MulMod, core::gas::GasBuiltin, System)] -fn __wrapper__TestNominalImpl__do_no_param_but_world(mut data: Span::) -> Span:: { - core::internal::require_implicit::(); - core::internal::revoke_ap_tracking(); - core::option::OptionTraitImpl::expect(core::gas::withdraw_gas(), 'Out of gas'); - - assert(core::array::SpanTrait::is_empty(data), 'Input too long for arguments'); - core::option::OptionTraitImpl::expect( - core::gas::withdraw_gas_all(core::gas::get_builtin_costs()), 'Out of gas', - ); - let mut contract_state = unsafe_new_contract_state(); - let res = TestNominalImpl::do_no_param_but_world(@contract_state, ); - let mut arr = ArrayTrait::new(); - // References. - // Result. - core::serde::Serde::::serialize(@res, ref arr); - core::array::ArrayTrait::span(@arr) -} - -#[implicit_precedence(core::pedersen::Pedersen, core::RangeCheck, core::integer::Bitwise, core::ec::EcOp, core::poseidon::Poseidon, core::SegmentArena, core::circuit::RangeCheck96, core::circuit::AddMod, core::circuit::MulMod, core::gas::GasBuiltin, System)] -fn __wrapper__TestNominalImpl__do_no_param_but_world_ref(mut data: Span::) -> Span:: { - core::internal::require_implicit::(); - core::internal::revoke_ap_tracking(); - core::option::OptionTraitImpl::expect(core::gas::withdraw_gas(), 'Out of gas'); - - assert(core::array::SpanTrait::is_empty(data), 'Input too long for arguments'); - core::option::OptionTraitImpl::expect( - core::gas::withdraw_gas_all(core::gas::get_builtin_costs()), 'Out of gas', - ); - let mut contract_state = unsafe_new_contract_state(); - let res = TestNominalImpl::do_no_param_but_world_ref(ref contract_state, ); - let mut arr = ArrayTrait::new(); - // References. - // Result. - core::serde::Serde::::serialize(@res, ref arr); - core::array::ArrayTrait::span(@arr) -} - -#[implicit_precedence(core::pedersen::Pedersen, core::RangeCheck, core::integer::Bitwise, core::ec::EcOp, core::poseidon::Poseidon, core::SegmentArena, core::circuit::RangeCheck96, core::circuit::AddMod, core::circuit::MulMod, core::gas::GasBuiltin, System)] -fn __wrapper__TestNominalImpl__do_params_no_world(mut data: Span::) -> Span:: { - core::internal::require_implicit::(); - core::internal::revoke_ap_tracking(); - core::option::OptionTraitImpl::expect(core::gas::withdraw_gas(), 'Out of gas'); - let __arg_p1 = core::option::OptionTraitImpl::expect( - core::serde::Serde::::deserialize(ref data), - 'Failed to deserialize param #1' - ); - let __arg_p2 = core::option::OptionTraitImpl::expect( - core::serde::Serde::::deserialize(ref data), - 'Failed to deserialize param #2' - ); - assert(core::array::SpanTrait::is_empty(data), 'Input too long for arguments'); - core::option::OptionTraitImpl::expect( - core::gas::withdraw_gas_all(core::gas::get_builtin_costs()), 'Out of gas', - ); - let mut contract_state = unsafe_new_contract_state(); - let res = TestNominalImpl::do_params_no_world(@contract_state, __arg_p1, __arg_p2); - let mut arr = ArrayTrait::new(); - // References. - // Result. - core::serde::Serde::::serialize(@res, ref arr); - core::array::ArrayTrait::span(@arr) -} - -#[implicit_precedence(core::pedersen::Pedersen, core::RangeCheck, core::integer::Bitwise, core::ec::EcOp, core::poseidon::Poseidon, core::SegmentArena, core::circuit::RangeCheck96, core::circuit::AddMod, core::circuit::MulMod, core::gas::GasBuiltin, System)] -fn __wrapper__TestNominalImpl__do_params_and_world(mut data: Span::) -> Span:: { - core::internal::require_implicit::(); - core::internal::revoke_ap_tracking(); - core::option::OptionTraitImpl::expect(core::gas::withdraw_gas(), 'Out of gas'); - let __arg_p2 = core::option::OptionTraitImpl::expect( - core::serde::Serde::::deserialize(ref data), - 'Failed to deserialize param #1' - ); - assert(core::array::SpanTrait::is_empty(data), 'Input too long for arguments'); - core::option::OptionTraitImpl::expect( - core::gas::withdraw_gas_all(core::gas::get_builtin_costs()), 'Out of gas', - ); - let mut contract_state = unsafe_new_contract_state(); - let res = TestNominalImpl::do_params_and_world(@contract_state, __arg_p2); - let mut arr = ArrayTrait::new(); - // References. - // Result. - core::serde::Serde::::serialize(@res, ref arr); - core::array::ArrayTrait::span(@arr) -} - -#[implicit_precedence(core::pedersen::Pedersen, core::RangeCheck, core::integer::Bitwise, core::ec::EcOp, core::poseidon::Poseidon, core::SegmentArena, core::circuit::RangeCheck96, core::circuit::AddMod, core::circuit::MulMod, core::gas::GasBuiltin, System)] -fn __wrapper__TestNominalImpl__do_params_and_world_ref(mut data: Span::) -> Span:: { - core::internal::require_implicit::(); - core::internal::revoke_ap_tracking(); - core::option::OptionTraitImpl::expect(core::gas::withdraw_gas(), 'Out of gas'); - let __arg_p2 = core::option::OptionTraitImpl::expect( - core::serde::Serde::::deserialize(ref data), - 'Failed to deserialize param #1' - ); - assert(core::array::SpanTrait::is_empty(data), 'Input too long for arguments'); - core::option::OptionTraitImpl::expect( - core::gas::withdraw_gas_all(core::gas::get_builtin_costs()), 'Out of gas', - ); - let mut contract_state = unsafe_new_contract_state(); - let res = TestNominalImpl::do_params_and_world_ref(ref contract_state, __arg_p2); - let mut arr = ArrayTrait::new(); - // References. - // Result. - core::serde::Serde::::serialize(@res, ref arr); - core::array::ArrayTrait::span(@arr) -} - -#[implicit_precedence(core::pedersen::Pedersen, core::RangeCheck, core::integer::Bitwise, core::ec::EcOp, core::poseidon::Poseidon, core::SegmentArena, core::circuit::RangeCheck96, core::circuit::AddMod, core::circuit::MulMod, core::gas::GasBuiltin, System)] -fn __wrapper__TestNominalImpl__do_with_self(mut data: Span::) -> Span:: { - core::internal::require_implicit::(); - core::internal::revoke_ap_tracking(); - core::option::OptionTraitImpl::expect(core::gas::withdraw_gas(), 'Out of gas'); - - assert(core::array::SpanTrait::is_empty(data), 'Input too long for arguments'); - core::option::OptionTraitImpl::expect( - core::gas::withdraw_gas_all(core::gas::get_builtin_costs()), 'Out of gas', - ); - let mut contract_state = unsafe_new_contract_state(); - let res = TestNominalImpl::do_with_self(@contract_state, ); - let mut arr = ArrayTrait::new(); - // References. - // Result. - core::serde::Serde::::serialize(@res, ref arr); - core::array::ArrayTrait::span(@arr) -} - -#[implicit_precedence(core::pedersen::Pedersen, core::RangeCheck, core::integer::Bitwise, core::ec::EcOp, core::poseidon::Poseidon, core::SegmentArena, core::circuit::RangeCheck96, core::circuit::AddMod, core::circuit::MulMod, core::gas::GasBuiltin, System)] -fn __wrapper__TestNominalImpl__do_with_ref_self(mut data: Span::) -> Span:: { - core::internal::require_implicit::(); - core::internal::revoke_ap_tracking(); - core::option::OptionTraitImpl::expect(core::gas::withdraw_gas(), 'Out of gas'); - - assert(core::array::SpanTrait::is_empty(data), 'Input too long for arguments'); - core::option::OptionTraitImpl::expect( - core::gas::withdraw_gas_all(core::gas::get_builtin_costs()), 'Out of gas', - ); - let mut contract_state = unsafe_new_contract_state(); - let res = TestNominalImpl::do_with_ref_self(ref contract_state, ); - let mut arr = ArrayTrait::new(); - // References. - // Result. - core::serde::Serde::::serialize(@res, ref arr); - core::array::ArrayTrait::span(@arr) -} - -#[implicit_precedence(core::pedersen::Pedersen, core::RangeCheck, core::integer::Bitwise, core::ec::EcOp, core::poseidon::Poseidon, core::SegmentArena, core::circuit::RangeCheck96, core::circuit::AddMod, core::circuit::MulMod, core::gas::GasBuiltin, System)] -fn __wrapper__constructor(mut data: Span::) -> Span:: { - core::internal::require_implicit::(); - core::internal::revoke_ap_tracking(); - core::option::OptionTraitImpl::expect(core::gas::withdraw_gas(), 'Out of gas'); - - assert(core::array::SpanTrait::is_empty(data), 'Input too long for arguments'); - core::option::OptionTraitImpl::expect( - core::gas::withdraw_gas_all(core::gas::get_builtin_costs()), 'Out of gas', - ); - let mut contract_state = unsafe_new_contract_state(); - constructor(ref contract_state, ); - let mut arr = ArrayTrait::new(); - // References. - // Result. - core::array::ArrayTrait::span(@arr) -} - -#[implicit_precedence(core::pedersen::Pedersen, core::RangeCheck, core::integer::Bitwise, core::ec::EcOp, core::poseidon::Poseidon, core::SegmentArena, core::circuit::RangeCheck96, core::circuit::AddMod, core::circuit::MulMod, core::gas::GasBuiltin, System)] -fn __wrapper__IDojoInitImpl__dojo_init(mut data: Span::) -> Span:: { - core::internal::require_implicit::(); - core::internal::revoke_ap_tracking(); - core::option::OptionTraitImpl::expect(core::gas::withdraw_gas(), 'Out of gas'); - - assert(core::array::SpanTrait::is_empty(data), 'Input too long for arguments'); - core::option::OptionTraitImpl::expect( - core::gas::withdraw_gas_all(core::gas::get_builtin_costs()), 'Out of gas', - ); - let mut contract_state = unsafe_new_contract_state(); - IDojoInitImpl::dojo_init(@contract_state, ); - let mut arr = ArrayTrait::new(); - // References. - // Result. - core::array::ArrayTrait::span(@arr) -} - - -pub mod __external { - pub use super::__wrapper__ContractImpl__name as name; - pub use super::__wrapper__ContractImpl__namespace as namespace; - pub use super::__wrapper__ContractImpl__tag as tag; - pub use super::__wrapper__ContractImpl__name_hash as name_hash; - pub use super::__wrapper__ContractImpl__namespace_hash as namespace_hash; - pub use super::__wrapper__ContractImpl__selector as selector; - pub use super::__wrapper__TestNominalImpl__do_no_param as do_no_param; - pub use super::__wrapper__TestNominalImpl__do_no_param_but_world as do_no_param_but_world; - pub use super::__wrapper__TestNominalImpl__do_no_param_but_world_ref as do_no_param_but_world_ref; - pub use super::__wrapper__TestNominalImpl__do_params_no_world as do_params_no_world; - pub use super::__wrapper__TestNominalImpl__do_params_and_world as do_params_and_world; - pub use super::__wrapper__TestNominalImpl__do_params_and_world_ref as do_params_and_world_ref; - pub use super::__wrapper__TestNominalImpl__do_with_self as do_with_self; - pub use super::__wrapper__TestNominalImpl__do_with_ref_self as do_with_ref_self; - pub use super::__wrapper__IDojoInitImpl__dojo_init as dojo_init; -} -pub mod __l1_handler { -} -pub mod __constructor { - pub use super::__wrapper__constructor as constructor; -} - impl ContractStateEventEmitter of starknet::event::EventEmitter< - ContractState, Event - > { - fn emit>( - ref self: ContractState, event: S - ) { - let event: Event = core::traits::Into::into(event); - let mut keys = Default::::default(); - let mut data = Default::::default(); - starknet::Event::append_keys_and_data(@event, ref keys, ref data); - starknet::SyscallResultTrait::unwrap_syscall( - starknet::syscalls::emit_event_syscall( - core::array::ArrayTrait::span(@keys), - core::array::ArrayTrait::span(@data), - ) - ) - } - } - -impl HasComponentImpl_world_provider_cpt of world_provider_cpt::HasComponent { - fn get_component(self: @ContractState) -> @world_provider_cpt::ComponentState { - @world_provider_cpt::unsafe_new_component_state::() - } - fn get_component_mut(ref self: ContractState) -> world_provider_cpt::ComponentState { - world_provider_cpt::unsafe_new_component_state::() - } - fn get_contract(self: @world_provider_cpt::ComponentState) -> @ContractState { - @unsafe_new_contract_state() - } - fn get_contract_mut(ref self: world_provider_cpt::ComponentState) -> ContractState { - unsafe_new_contract_state() - } - fn emit>(ref self: world_provider_cpt::ComponentState, event: S) { - let event: world_provider_cpt::Event = core::traits::Into::into(event); - let mut contract = world_provider_cpt::HasComponent::get_contract_mut(ref self); - ContractStateEventEmitter::emit(ref contract, Event::WorldProviderEvent(event)); - } -} -impl HasComponentImpl_upgradeable_cpt of upgradeable_cpt::HasComponent { - fn get_component(self: @ContractState) -> @upgradeable_cpt::ComponentState { - @upgradeable_cpt::unsafe_new_component_state::() - } - fn get_component_mut(ref self: ContractState) -> upgradeable_cpt::ComponentState { - upgradeable_cpt::unsafe_new_component_state::() - } - fn get_contract(self: @upgradeable_cpt::ComponentState) -> @ContractState { - @unsafe_new_contract_state() - } - fn get_contract_mut(ref self: upgradeable_cpt::ComponentState) -> ContractState { - unsafe_new_contract_state() - } - fn emit>(ref self: upgradeable_cpt::ComponentState, event: S) { - let event: upgradeable_cpt::Event = core::traits::Into::into(event); - let mut contract = upgradeable_cpt::HasComponent::get_contract_mut(ref self); - ContractStateEventEmitter::emit(ref contract, Event::UpgradeableEvent(event)); - } -} -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::contract] -pub mod constructor_test { - use dojo::contract::components::world_provider::{world_provider_cpt, world_provider_cpt::InternalTrait as WorldProviderInternal, IWorldProvider}; - use dojo::contract::components::upgradeable::upgradeable_cpt; - use dojo::contract::IContract; - - #[abi(embed_v0)] - impl WorldProviderImpl = world_provider_cpt::WorldProviderImpl; - - #[abi(embed_v0)] - impl UpgradeableImpl = upgradeable_cpt::UpgradeableImpl; - - #[abi(embed_v0)] - pub impl ContractImpl of IContract { - fn name(self: @ContractState) -> ByteArray { - "constructor_test" - } - - fn namespace(self: @ContractState) -> ByteArray { - "dojo_test" - } - - fn tag(self: @ContractState) -> ByteArray { - "dojo_test-constructor_test" - } - - fn name_hash(self: @ContractState) -> felt252 { - 1448040114967332260450680311232069198633143381246182440670306454820750021442 - } - - fn namespace_hash(self: @ContractState) -> felt252 { - 1452123528942907587532668415362544424816022573043154497385993678618948064048 - } - - fn selector(self: @ContractState) -> felt252 { - 1847799915277474306008813139960743801242059631426321875100588125825381611082 - } - } - - - #[constructor] - fn constructor(ref self: ContractState, _value: u8) { - self.world_provider.initializer(); - } -#[abi(per_item)] -#[generate_trait] -pub impl IDojoInitImpl of IDojoInit { - #[external(v0)] - fn dojo_init(self: @ContractState) { - if starknet::get_caller_address() != self.world_provider.world().contract_address { - core::panics::panic_with_byte_array( - @format!("Only the world can init contract `{}`, but caller is `{:?}`", - self.tag(), - starknet::get_caller_address(), - )); - } - } -} - - #[event] - #[derive(Drop, starknet::Event)] - enum Event { - UpgradeableEvent: upgradeable_cpt::Event, - WorldProviderEvent: world_provider_cpt::Event, - } -pub trait IDojoInit { - #[external(v0)] - fn dojo_init(self: @ContractState); -} -impl EventDrop of core::traits::Drop::; -impl EventIsEvent of starknet::Event { - fn append_keys_and_data( - self: @Event, ref keys: Array, ref data: Array - ) { - match self { - Event::UpgradeableEvent(val) => { - core::array::ArrayTrait::append(ref keys, selector!("UpgradeableEvent")); - starknet::Event::append_keys_and_data( - val, ref keys, ref data - ); - }, - Event::WorldProviderEvent(val) => { - core::array::ArrayTrait::append(ref keys, selector!("WorldProviderEvent")); - starknet::Event::append_keys_and_data( - val, ref keys, ref data - ); - }, - } - } - fn deserialize( - ref keys: Span, ref data: Span, - ) -> Option { - let __selector__ = *core::array::SpanTrait::pop_front(ref keys)?; - if __selector__ == selector!("UpgradeableEvent") { - let val = starknet::Event::deserialize( - ref keys, ref data - )?; - return Option::Some(Event::UpgradeableEvent(val)); - } - if __selector__ == selector!("WorldProviderEvent") { - let val = starknet::Event::deserialize( - ref keys, ref data - )?; - return Option::Some(Event::WorldProviderEvent(val)); - } - Option::None - } -} -impl EventUpgradeableEventIntoEvent of Into { - fn into(self: upgradeable_cpt::Event) -> Event { - Event::UpgradeableEvent(self) - } -} -impl EventWorldProviderEventIntoEvent of Into { - fn into(self: world_provider_cpt::Event) -> Event { - Event::WorldProviderEvent(self) - } -} - - -#[phantom] -pub struct Storage { - #[substorage(v0)] - pub upgradeable: upgradeable_cpt::Storage, - #[substorage(v0)] - pub world_provider: world_provider_cpt::Storage, -} - -#[derive(Drop, Copy)] -pub struct StorageStorageBase { - pub upgradeable: starknet::storage::FlattenedStorage, - pub world_provider: starknet::storage::FlattenedStorage, -} -impl StorageStorageImpl of starknet::storage::StorageTrait { - type BaseType = StorageStorageBase; - fn storage(self: starknet::storage::FlattenedStorage) -> StorageStorageBase { - let __upgradeable_value__ = starknet::storage::FlattenedStorage {}; - let __world_provider_value__ = starknet::storage::FlattenedStorage {}; - StorageStorageBase { - upgradeable: __upgradeable_value__, - world_provider: __world_provider_value__, - } - } -} -#[derive(Drop, Copy)] -pub struct StorageStorageBaseMut { - pub upgradeable: starknet::storage::FlattenedStorage>, - pub world_provider: starknet::storage::FlattenedStorage>, -} -impl StorageStorageMutImpl of starknet::storage::StorageTraitMut { - type BaseType = StorageStorageBaseMut; - fn storage_mut(self: starknet::storage::FlattenedStorage>) -> StorageStorageBaseMut { - let __upgradeable_value__ = starknet::storage::FlattenedStorage {}; - let __world_provider_value__ = starknet::storage::FlattenedStorage {}; - StorageStorageBaseMut { - upgradeable: __upgradeable_value__, - world_provider: __world_provider_value__, - } - } -} - -pub struct ContractState { - pub upgradeable: upgradeable_cpt::ComponentState, - pub world_provider: world_provider_cpt::ComponentState, -} - -impl ContractStateDrop of Drop {} - -impl ContractStateDeref of core::ops::SnapshotDeref { - type Target = starknet::storage::FlattenedStorage; - fn snapshot_deref(self: @ContractState) -> starknet::storage::FlattenedStorage { - starknet::storage::FlattenedStorage {} - } -} -impl ContractStateDerefMut of core::ops::DerefMut { - type Target = starknet::storage::FlattenedStorage> ; - fn deref_mut(ref self: ContractState) -> starknet::storage::FlattenedStorage> { - starknet::storage::FlattenedStorage {} - } -} -pub fn unsafe_new_contract_state() -> ContractState { - ContractState { - upgradeable: upgradeable_cpt::unsafe_new_component_state::(), - world_provider: world_provider_cpt::unsafe_new_component_state::(), - } -} - -// TODO(Gil): This generates duplicate diagnostics because of the plugin system, squash the duplicates into one. -#[deprecated( - feature: "deprecated_legacy_map", - note: "Use `starknet::storage::Map` instead." -)] -#[allow(unused_imports)] -use starknet::storage::Map as LegacyMap; - -impl ContractStateWorldProviderImpl of - world_provider_cpt::UnsafeNewContractStateTraitForWorldProviderImpl { - fn unsafe_new_contract_state() -> ContractState { - unsafe_new_contract_state() - } -} -impl ContractStateUpgradeableImpl of - upgradeable_cpt::UnsafeNewContractStateTraitForUpgradeableImpl { - fn unsafe_new_contract_state() -> ContractState { - unsafe_new_contract_state() - } -} -#[implicit_precedence(core::pedersen::Pedersen, core::RangeCheck, core::integer::Bitwise, core::ec::EcOp, core::poseidon::Poseidon, core::SegmentArena, core::circuit::RangeCheck96, core::circuit::AddMod, core::circuit::MulMod, core::gas::GasBuiltin, System)] -fn __wrapper__ContractImpl__name(mut data: Span::) -> Span:: { - core::internal::require_implicit::(); - core::internal::revoke_ap_tracking(); - core::option::OptionTraitImpl::expect(core::gas::withdraw_gas(), 'Out of gas'); - - assert(core::array::SpanTrait::is_empty(data), 'Input too long for arguments'); - core::option::OptionTraitImpl::expect( - core::gas::withdraw_gas_all(core::gas::get_builtin_costs()), 'Out of gas', - ); - let mut contract_state = unsafe_new_contract_state(); - let res = ContractImpl::name(@contract_state, ); - let mut arr = ArrayTrait::new(); - // References. - // Result. - core::serde::Serde::::serialize(@res, ref arr); - core::array::ArrayTrait::span(@arr) -} - -#[implicit_precedence(core::pedersen::Pedersen, core::RangeCheck, core::integer::Bitwise, core::ec::EcOp, core::poseidon::Poseidon, core::SegmentArena, core::circuit::RangeCheck96, core::circuit::AddMod, core::circuit::MulMod, core::gas::GasBuiltin, System)] -fn __wrapper__ContractImpl__namespace(mut data: Span::) -> Span:: { - core::internal::require_implicit::(); - core::internal::revoke_ap_tracking(); - core::option::OptionTraitImpl::expect(core::gas::withdraw_gas(), 'Out of gas'); - - assert(core::array::SpanTrait::is_empty(data), 'Input too long for arguments'); - core::option::OptionTraitImpl::expect( - core::gas::withdraw_gas_all(core::gas::get_builtin_costs()), 'Out of gas', - ); - let mut contract_state = unsafe_new_contract_state(); - let res = ContractImpl::namespace(@contract_state, ); - let mut arr = ArrayTrait::new(); - // References. - // Result. - core::serde::Serde::::serialize(@res, ref arr); - core::array::ArrayTrait::span(@arr) -} - -#[implicit_precedence(core::pedersen::Pedersen, core::RangeCheck, core::integer::Bitwise, core::ec::EcOp, core::poseidon::Poseidon, core::SegmentArena, core::circuit::RangeCheck96, core::circuit::AddMod, core::circuit::MulMod, core::gas::GasBuiltin, System)] -fn __wrapper__ContractImpl__tag(mut data: Span::) -> Span:: { - core::internal::require_implicit::(); - core::internal::revoke_ap_tracking(); - core::option::OptionTraitImpl::expect(core::gas::withdraw_gas(), 'Out of gas'); - - assert(core::array::SpanTrait::is_empty(data), 'Input too long for arguments'); - core::option::OptionTraitImpl::expect( - core::gas::withdraw_gas_all(core::gas::get_builtin_costs()), 'Out of gas', - ); - let mut contract_state = unsafe_new_contract_state(); - let res = ContractImpl::tag(@contract_state, ); - let mut arr = ArrayTrait::new(); - // References. - // Result. - core::serde::Serde::::serialize(@res, ref arr); - core::array::ArrayTrait::span(@arr) -} - -#[implicit_precedence(core::pedersen::Pedersen, core::RangeCheck, core::integer::Bitwise, core::ec::EcOp, core::poseidon::Poseidon, core::SegmentArena, core::circuit::RangeCheck96, core::circuit::AddMod, core::circuit::MulMod, core::gas::GasBuiltin, System)] -fn __wrapper__ContractImpl__name_hash(mut data: Span::) -> Span:: { - core::internal::require_implicit::(); - core::internal::revoke_ap_tracking(); - core::option::OptionTraitImpl::expect(core::gas::withdraw_gas(), 'Out of gas'); - - assert(core::array::SpanTrait::is_empty(data), 'Input too long for arguments'); - core::option::OptionTraitImpl::expect( - core::gas::withdraw_gas_all(core::gas::get_builtin_costs()), 'Out of gas', - ); - let mut contract_state = unsafe_new_contract_state(); - let res = ContractImpl::name_hash(@contract_state, ); - let mut arr = ArrayTrait::new(); - // References. - // Result. - core::serde::Serde::::serialize(@res, ref arr); - core::array::ArrayTrait::span(@arr) -} - -#[implicit_precedence(core::pedersen::Pedersen, core::RangeCheck, core::integer::Bitwise, core::ec::EcOp, core::poseidon::Poseidon, core::SegmentArena, core::circuit::RangeCheck96, core::circuit::AddMod, core::circuit::MulMod, core::gas::GasBuiltin, System)] -fn __wrapper__ContractImpl__namespace_hash(mut data: Span::) -> Span:: { - core::internal::require_implicit::(); - core::internal::revoke_ap_tracking(); - core::option::OptionTraitImpl::expect(core::gas::withdraw_gas(), 'Out of gas'); - - assert(core::array::SpanTrait::is_empty(data), 'Input too long for arguments'); - core::option::OptionTraitImpl::expect( - core::gas::withdraw_gas_all(core::gas::get_builtin_costs()), 'Out of gas', - ); - let mut contract_state = unsafe_new_contract_state(); - let res = ContractImpl::namespace_hash(@contract_state, ); - let mut arr = ArrayTrait::new(); - // References. - // Result. - core::serde::Serde::::serialize(@res, ref arr); - core::array::ArrayTrait::span(@arr) -} - -#[implicit_precedence(core::pedersen::Pedersen, core::RangeCheck, core::integer::Bitwise, core::ec::EcOp, core::poseidon::Poseidon, core::SegmentArena, core::circuit::RangeCheck96, core::circuit::AddMod, core::circuit::MulMod, core::gas::GasBuiltin, System)] -fn __wrapper__ContractImpl__selector(mut data: Span::) -> Span:: { - core::internal::require_implicit::(); - core::internal::revoke_ap_tracking(); - core::option::OptionTraitImpl::expect(core::gas::withdraw_gas(), 'Out of gas'); - - assert(core::array::SpanTrait::is_empty(data), 'Input too long for arguments'); - core::option::OptionTraitImpl::expect( - core::gas::withdraw_gas_all(core::gas::get_builtin_costs()), 'Out of gas', - ); - let mut contract_state = unsafe_new_contract_state(); - let res = ContractImpl::selector(@contract_state, ); - let mut arr = ArrayTrait::new(); - // References. - // Result. - core::serde::Serde::::serialize(@res, ref arr); - core::array::ArrayTrait::span(@arr) -} - -#[implicit_precedence(core::pedersen::Pedersen, core::RangeCheck, core::integer::Bitwise, core::ec::EcOp, core::poseidon::Poseidon, core::SegmentArena, core::circuit::RangeCheck96, core::circuit::AddMod, core::circuit::MulMod, core::gas::GasBuiltin, System)] -fn __wrapper__constructor(mut data: Span::) -> Span:: { - core::internal::require_implicit::(); - core::internal::revoke_ap_tracking(); - core::option::OptionTraitImpl::expect(core::gas::withdraw_gas(), 'Out of gas'); - let __arg__value = core::option::OptionTraitImpl::expect( - core::serde::Serde::::deserialize(ref data), - 'Failed to deserialize param #1' - ); - assert(core::array::SpanTrait::is_empty(data), 'Input too long for arguments'); - core::option::OptionTraitImpl::expect( - core::gas::withdraw_gas_all(core::gas::get_builtin_costs()), 'Out of gas', - ); - let mut contract_state = unsafe_new_contract_state(); - constructor(ref contract_state, __arg__value); - let mut arr = ArrayTrait::new(); - // References. - // Result. - core::array::ArrayTrait::span(@arr) -} - -#[implicit_precedence(core::pedersen::Pedersen, core::RangeCheck, core::integer::Bitwise, core::ec::EcOp, core::poseidon::Poseidon, core::SegmentArena, core::circuit::RangeCheck96, core::circuit::AddMod, core::circuit::MulMod, core::gas::GasBuiltin, System)] -fn __wrapper__IDojoInitImpl__dojo_init(mut data: Span::) -> Span:: { - core::internal::require_implicit::(); - core::internal::revoke_ap_tracking(); - core::option::OptionTraitImpl::expect(core::gas::withdraw_gas(), 'Out of gas'); - - assert(core::array::SpanTrait::is_empty(data), 'Input too long for arguments'); - core::option::OptionTraitImpl::expect( - core::gas::withdraw_gas_all(core::gas::get_builtin_costs()), 'Out of gas', - ); - let mut contract_state = unsafe_new_contract_state(); - IDojoInitImpl::dojo_init(@contract_state, ); - let mut arr = ArrayTrait::new(); - // References. - // Result. - core::array::ArrayTrait::span(@arr) -} - - -pub mod __external { - pub use super::__wrapper__ContractImpl__name as name; - pub use super::__wrapper__ContractImpl__namespace as namespace; - pub use super::__wrapper__ContractImpl__tag as tag; - pub use super::__wrapper__ContractImpl__name_hash as name_hash; - pub use super::__wrapper__ContractImpl__namespace_hash as namespace_hash; - pub use super::__wrapper__ContractImpl__selector as selector; - pub use super::__wrapper__IDojoInitImpl__dojo_init as dojo_init; -} -pub mod __l1_handler { -} -pub mod __constructor { - pub use super::__wrapper__constructor as constructor; -} - impl ContractStateEventEmitter of starknet::event::EventEmitter< - ContractState, Event - > { - fn emit>( - ref self: ContractState, event: S - ) { - let event: Event = core::traits::Into::into(event); - let mut keys = Default::::default(); - let mut data = Default::::default(); - starknet::Event::append_keys_and_data(@event, ref keys, ref data); - starknet::SyscallResultTrait::unwrap_syscall( - starknet::syscalls::emit_event_syscall( - core::array::ArrayTrait::span(@keys), - core::array::ArrayTrait::span(@data), - ) - ) - } - } - -impl HasComponentImpl_world_provider_cpt of world_provider_cpt::HasComponent { - fn get_component(self: @ContractState) -> @world_provider_cpt::ComponentState { - @world_provider_cpt::unsafe_new_component_state::() - } - fn get_component_mut(ref self: ContractState) -> world_provider_cpt::ComponentState { - world_provider_cpt::unsafe_new_component_state::() - } - fn get_contract(self: @world_provider_cpt::ComponentState) -> @ContractState { - @unsafe_new_contract_state() - } - fn get_contract_mut(ref self: world_provider_cpt::ComponentState) -> ContractState { - unsafe_new_contract_state() - } - fn emit>(ref self: world_provider_cpt::ComponentState, event: S) { - let event: world_provider_cpt::Event = core::traits::Into::into(event); - let mut contract = world_provider_cpt::HasComponent::get_contract_mut(ref self); - ContractStateEventEmitter::emit(ref contract, Event::WorldProviderEvent(event)); - } -} -impl HasComponentImpl_upgradeable_cpt of upgradeable_cpt::HasComponent { - fn get_component(self: @ContractState) -> @upgradeable_cpt::ComponentState { - @upgradeable_cpt::unsafe_new_component_state::() - } - fn get_component_mut(ref self: ContractState) -> upgradeable_cpt::ComponentState { - upgradeable_cpt::unsafe_new_component_state::() - } - fn get_contract(self: @upgradeable_cpt::ComponentState) -> @ContractState { - @unsafe_new_contract_state() - } - fn get_contract_mut(ref self: upgradeable_cpt::ComponentState) -> ContractState { - unsafe_new_contract_state() - } - fn emit>(ref self: upgradeable_cpt::ComponentState, event: S) { - let event: upgradeable_cpt::Event = core::traits::Into::into(event); - let mut contract = upgradeable_cpt::HasComponent::get_contract_mut(ref self); - ContractStateEventEmitter::emit(ref contract, Event::UpgradeableEvent(event)); - } -} -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::contract] -pub mod no_init_test { - use dojo::contract::components::world_provider::{world_provider_cpt, world_provider_cpt::InternalTrait as WorldProviderInternal, IWorldProvider}; - use dojo::contract::components::upgradeable::upgradeable_cpt; - use dojo::contract::IContract; - - #[abi(embed_v0)] - impl WorldProviderImpl = world_provider_cpt::WorldProviderImpl; - - #[abi(embed_v0)] - impl UpgradeableImpl = upgradeable_cpt::UpgradeableImpl; - - #[abi(embed_v0)] - pub impl ContractImpl of IContract { - fn name(self: @ContractState) -> ByteArray { - "no_init_test" - } - - fn namespace(self: @ContractState) -> ByteArray { - "dojo_test" - } - - fn tag(self: @ContractState) -> ByteArray { - "dojo_test-no_init_test" - } - - fn name_hash(self: @ContractState) -> felt252 { - 2188407785440294979090510634648735461326850740369373015349552249835679156474 - } - - fn namespace_hash(self: @ContractState) -> felt252 { - 1452123528942907587532668415362544424816022573043154497385993678618948064048 - } - - fn selector(self: @ContractState) -> felt252 { - 1612380646418854749267717900057829622040529970486094087524750323429009828706 - } - } - - - #[constructor] - fn constructor(ref self: ContractState) { - self.world_provider.initializer(); - } - #[abi(per_item)] -#[generate_trait] -pub impl IDojoInitImpl of IDojoInit { - #[external(v0)] - fn dojo_init(self: @ContractState) { - if starknet::get_caller_address() != self.world_provider.world().contract_address { - core::panics::panic_with_byte_array( - @format!("Only the world can init contract `{}`, but caller is `{:?}`", - self.tag(), - starknet::get_caller_address(), - )); - } - } -} - - #[event] - #[derive(Drop, starknet::Event)] - enum Event { - UpgradeableEvent: upgradeable_cpt::Event, - WorldProviderEvent: world_provider_cpt::Event, - } - pub trait IDojoInit { - #[external(v0)] - fn dojo_init(self: @ContractState); -} -impl EventDrop of core::traits::Drop::; -impl EventIsEvent of starknet::Event { - fn append_keys_and_data( - self: @Event, ref keys: Array, ref data: Array - ) { - match self { - Event::UpgradeableEvent(val) => { - core::array::ArrayTrait::append(ref keys, selector!("UpgradeableEvent")); - starknet::Event::append_keys_and_data( - val, ref keys, ref data - ); - }, - Event::WorldProviderEvent(val) => { - core::array::ArrayTrait::append(ref keys, selector!("WorldProviderEvent")); - starknet::Event::append_keys_and_data( - val, ref keys, ref data - ); - }, - } - } - fn deserialize( - ref keys: Span, ref data: Span, - ) -> Option { - let __selector__ = *core::array::SpanTrait::pop_front(ref keys)?; - if __selector__ == selector!("UpgradeableEvent") { - let val = starknet::Event::deserialize( - ref keys, ref data - )?; - return Option::Some(Event::UpgradeableEvent(val)); - } - if __selector__ == selector!("WorldProviderEvent") { - let val = starknet::Event::deserialize( - ref keys, ref data - )?; - return Option::Some(Event::WorldProviderEvent(val)); - } - Option::None - } -} -impl EventUpgradeableEventIntoEvent of Into { - fn into(self: upgradeable_cpt::Event) -> Event { - Event::UpgradeableEvent(self) - } -} -impl EventWorldProviderEventIntoEvent of Into { - fn into(self: world_provider_cpt::Event) -> Event { - Event::WorldProviderEvent(self) - } -} - - -#[phantom] -pub struct Storage { - #[substorage(v0)] - pub upgradeable: upgradeable_cpt::Storage, - #[substorage(v0)] - pub world_provider: world_provider_cpt::Storage, -} - -#[derive(Drop, Copy)] -pub struct StorageStorageBase { - pub upgradeable: starknet::storage::FlattenedStorage, - pub world_provider: starknet::storage::FlattenedStorage, -} -impl StorageStorageImpl of starknet::storage::StorageTrait { - type BaseType = StorageStorageBase; - fn storage(self: starknet::storage::FlattenedStorage) -> StorageStorageBase { - let __upgradeable_value__ = starknet::storage::FlattenedStorage {}; - let __world_provider_value__ = starknet::storage::FlattenedStorage {}; - StorageStorageBase { - upgradeable: __upgradeable_value__, - world_provider: __world_provider_value__, - } - } -} -#[derive(Drop, Copy)] -pub struct StorageStorageBaseMut { - pub upgradeable: starknet::storage::FlattenedStorage>, - pub world_provider: starknet::storage::FlattenedStorage>, -} -impl StorageStorageMutImpl of starknet::storage::StorageTraitMut { - type BaseType = StorageStorageBaseMut; - fn storage_mut(self: starknet::storage::FlattenedStorage>) -> StorageStorageBaseMut { - let __upgradeable_value__ = starknet::storage::FlattenedStorage {}; - let __world_provider_value__ = starknet::storage::FlattenedStorage {}; - StorageStorageBaseMut { - upgradeable: __upgradeable_value__, - world_provider: __world_provider_value__, - } - } -} - -pub struct ContractState { - pub upgradeable: upgradeable_cpt::ComponentState, - pub world_provider: world_provider_cpt::ComponentState, -} - -impl ContractStateDrop of Drop {} - -impl ContractStateDeref of core::ops::SnapshotDeref { - type Target = starknet::storage::FlattenedStorage; - fn snapshot_deref(self: @ContractState) -> starknet::storage::FlattenedStorage { - starknet::storage::FlattenedStorage {} - } -} -impl ContractStateDerefMut of core::ops::DerefMut { - type Target = starknet::storage::FlattenedStorage> ; - fn deref_mut(ref self: ContractState) -> starknet::storage::FlattenedStorage> { - starknet::storage::FlattenedStorage {} - } -} -pub fn unsafe_new_contract_state() -> ContractState { - ContractState { - upgradeable: upgradeable_cpt::unsafe_new_component_state::(), - world_provider: world_provider_cpt::unsafe_new_component_state::(), - } -} - -// TODO(Gil): This generates duplicate diagnostics because of the plugin system, squash the duplicates into one. -#[deprecated( - feature: "deprecated_legacy_map", - note: "Use `starknet::storage::Map` instead." -)] -#[allow(unused_imports)] -use starknet::storage::Map as LegacyMap; - -impl ContractStateWorldProviderImpl of - world_provider_cpt::UnsafeNewContractStateTraitForWorldProviderImpl { - fn unsafe_new_contract_state() -> ContractState { - unsafe_new_contract_state() - } -} -impl ContractStateUpgradeableImpl of - upgradeable_cpt::UnsafeNewContractStateTraitForUpgradeableImpl { - fn unsafe_new_contract_state() -> ContractState { - unsafe_new_contract_state() - } -} -#[implicit_precedence(core::pedersen::Pedersen, core::RangeCheck, core::integer::Bitwise, core::ec::EcOp, core::poseidon::Poseidon, core::SegmentArena, core::circuit::RangeCheck96, core::circuit::AddMod, core::circuit::MulMod, core::gas::GasBuiltin, System)] -fn __wrapper__ContractImpl__name(mut data: Span::) -> Span:: { - core::internal::require_implicit::(); - core::internal::revoke_ap_tracking(); - core::option::OptionTraitImpl::expect(core::gas::withdraw_gas(), 'Out of gas'); - - assert(core::array::SpanTrait::is_empty(data), 'Input too long for arguments'); - core::option::OptionTraitImpl::expect( - core::gas::withdraw_gas_all(core::gas::get_builtin_costs()), 'Out of gas', - ); - let mut contract_state = unsafe_new_contract_state(); - let res = ContractImpl::name(@contract_state, ); - let mut arr = ArrayTrait::new(); - // References. - // Result. - core::serde::Serde::::serialize(@res, ref arr); - core::array::ArrayTrait::span(@arr) -} - -#[implicit_precedence(core::pedersen::Pedersen, core::RangeCheck, core::integer::Bitwise, core::ec::EcOp, core::poseidon::Poseidon, core::SegmentArena, core::circuit::RangeCheck96, core::circuit::AddMod, core::circuit::MulMod, core::gas::GasBuiltin, System)] -fn __wrapper__ContractImpl__namespace(mut data: Span::) -> Span:: { - core::internal::require_implicit::(); - core::internal::revoke_ap_tracking(); - core::option::OptionTraitImpl::expect(core::gas::withdraw_gas(), 'Out of gas'); - - assert(core::array::SpanTrait::is_empty(data), 'Input too long for arguments'); - core::option::OptionTraitImpl::expect( - core::gas::withdraw_gas_all(core::gas::get_builtin_costs()), 'Out of gas', - ); - let mut contract_state = unsafe_new_contract_state(); - let res = ContractImpl::namespace(@contract_state, ); - let mut arr = ArrayTrait::new(); - // References. - // Result. - core::serde::Serde::::serialize(@res, ref arr); - core::array::ArrayTrait::span(@arr) -} - -#[implicit_precedence(core::pedersen::Pedersen, core::RangeCheck, core::integer::Bitwise, core::ec::EcOp, core::poseidon::Poseidon, core::SegmentArena, core::circuit::RangeCheck96, core::circuit::AddMod, core::circuit::MulMod, core::gas::GasBuiltin, System)] -fn __wrapper__ContractImpl__tag(mut data: Span::) -> Span:: { - core::internal::require_implicit::(); - core::internal::revoke_ap_tracking(); - core::option::OptionTraitImpl::expect(core::gas::withdraw_gas(), 'Out of gas'); - - assert(core::array::SpanTrait::is_empty(data), 'Input too long for arguments'); - core::option::OptionTraitImpl::expect( - core::gas::withdraw_gas_all(core::gas::get_builtin_costs()), 'Out of gas', - ); - let mut contract_state = unsafe_new_contract_state(); - let res = ContractImpl::tag(@contract_state, ); - let mut arr = ArrayTrait::new(); - // References. - // Result. - core::serde::Serde::::serialize(@res, ref arr); - core::array::ArrayTrait::span(@arr) -} - -#[implicit_precedence(core::pedersen::Pedersen, core::RangeCheck, core::integer::Bitwise, core::ec::EcOp, core::poseidon::Poseidon, core::SegmentArena, core::circuit::RangeCheck96, core::circuit::AddMod, core::circuit::MulMod, core::gas::GasBuiltin, System)] -fn __wrapper__ContractImpl__name_hash(mut data: Span::) -> Span:: { - core::internal::require_implicit::(); - core::internal::revoke_ap_tracking(); - core::option::OptionTraitImpl::expect(core::gas::withdraw_gas(), 'Out of gas'); - - assert(core::array::SpanTrait::is_empty(data), 'Input too long for arguments'); - core::option::OptionTraitImpl::expect( - core::gas::withdraw_gas_all(core::gas::get_builtin_costs()), 'Out of gas', - ); - let mut contract_state = unsafe_new_contract_state(); - let res = ContractImpl::name_hash(@contract_state, ); - let mut arr = ArrayTrait::new(); - // References. - // Result. - core::serde::Serde::::serialize(@res, ref arr); - core::array::ArrayTrait::span(@arr) -} - -#[implicit_precedence(core::pedersen::Pedersen, core::RangeCheck, core::integer::Bitwise, core::ec::EcOp, core::poseidon::Poseidon, core::SegmentArena, core::circuit::RangeCheck96, core::circuit::AddMod, core::circuit::MulMod, core::gas::GasBuiltin, System)] -fn __wrapper__ContractImpl__namespace_hash(mut data: Span::) -> Span:: { - core::internal::require_implicit::(); - core::internal::revoke_ap_tracking(); - core::option::OptionTraitImpl::expect(core::gas::withdraw_gas(), 'Out of gas'); - - assert(core::array::SpanTrait::is_empty(data), 'Input too long for arguments'); - core::option::OptionTraitImpl::expect( - core::gas::withdraw_gas_all(core::gas::get_builtin_costs()), 'Out of gas', - ); - let mut contract_state = unsafe_new_contract_state(); - let res = ContractImpl::namespace_hash(@contract_state, ); - let mut arr = ArrayTrait::new(); - // References. - // Result. - core::serde::Serde::::serialize(@res, ref arr); - core::array::ArrayTrait::span(@arr) -} - -#[implicit_precedence(core::pedersen::Pedersen, core::RangeCheck, core::integer::Bitwise, core::ec::EcOp, core::poseidon::Poseidon, core::SegmentArena, core::circuit::RangeCheck96, core::circuit::AddMod, core::circuit::MulMod, core::gas::GasBuiltin, System)] -fn __wrapper__ContractImpl__selector(mut data: Span::) -> Span:: { - core::internal::require_implicit::(); - core::internal::revoke_ap_tracking(); - core::option::OptionTraitImpl::expect(core::gas::withdraw_gas(), 'Out of gas'); - - assert(core::array::SpanTrait::is_empty(data), 'Input too long for arguments'); - core::option::OptionTraitImpl::expect( - core::gas::withdraw_gas_all(core::gas::get_builtin_costs()), 'Out of gas', - ); - let mut contract_state = unsafe_new_contract_state(); - let res = ContractImpl::selector(@contract_state, ); - let mut arr = ArrayTrait::new(); - // References. - // Result. - core::serde::Serde::::serialize(@res, ref arr); - core::array::ArrayTrait::span(@arr) -} - -#[implicit_precedence(core::pedersen::Pedersen, core::RangeCheck, core::integer::Bitwise, core::ec::EcOp, core::poseidon::Poseidon, core::SegmentArena, core::circuit::RangeCheck96, core::circuit::AddMod, core::circuit::MulMod, core::gas::GasBuiltin, System)] -fn __wrapper__constructor(mut data: Span::) -> Span:: { - core::internal::require_implicit::(); - core::internal::revoke_ap_tracking(); - core::option::OptionTraitImpl::expect(core::gas::withdraw_gas(), 'Out of gas'); - - assert(core::array::SpanTrait::is_empty(data), 'Input too long for arguments'); - core::option::OptionTraitImpl::expect( - core::gas::withdraw_gas_all(core::gas::get_builtin_costs()), 'Out of gas', - ); - let mut contract_state = unsafe_new_contract_state(); - constructor(ref contract_state, ); - let mut arr = ArrayTrait::new(); - // References. - // Result. - core::array::ArrayTrait::span(@arr) -} - -#[implicit_precedence(core::pedersen::Pedersen, core::RangeCheck, core::integer::Bitwise, core::ec::EcOp, core::poseidon::Poseidon, core::SegmentArena, core::circuit::RangeCheck96, core::circuit::AddMod, core::circuit::MulMod, core::gas::GasBuiltin, System)] -fn __wrapper__IDojoInitImpl__dojo_init(mut data: Span::) -> Span:: { - core::internal::require_implicit::(); - core::internal::revoke_ap_tracking(); - core::option::OptionTraitImpl::expect(core::gas::withdraw_gas(), 'Out of gas'); - - assert(core::array::SpanTrait::is_empty(data), 'Input too long for arguments'); - core::option::OptionTraitImpl::expect( - core::gas::withdraw_gas_all(core::gas::get_builtin_costs()), 'Out of gas', - ); - let mut contract_state = unsafe_new_contract_state(); - IDojoInitImpl::dojo_init(@contract_state, ); - let mut arr = ArrayTrait::new(); - // References. - // Result. - core::array::ArrayTrait::span(@arr) -} - - -pub mod __external { - pub use super::__wrapper__ContractImpl__name as name; - pub use super::__wrapper__ContractImpl__namespace as namespace; - pub use super::__wrapper__ContractImpl__tag as tag; - pub use super::__wrapper__ContractImpl__name_hash as name_hash; - pub use super::__wrapper__ContractImpl__namespace_hash as namespace_hash; - pub use super::__wrapper__ContractImpl__selector as selector; - pub use super::__wrapper__IDojoInitImpl__dojo_init as dojo_init; -} -pub mod __l1_handler { -} -pub mod __constructor { - pub use super::__wrapper__constructor as constructor; -} - impl ContractStateEventEmitter of starknet::event::EventEmitter< - ContractState, Event - > { - fn emit>( - ref self: ContractState, event: S - ) { - let event: Event = core::traits::Into::into(event); - let mut keys = Default::::default(); - let mut data = Default::::default(); - starknet::Event::append_keys_and_data(@event, ref keys, ref data); - starknet::SyscallResultTrait::unwrap_syscall( - starknet::syscalls::emit_event_syscall( - core::array::ArrayTrait::span(@keys), - core::array::ArrayTrait::span(@data), - ) - ) - } - } - -impl HasComponentImpl_world_provider_cpt of world_provider_cpt::HasComponent { - fn get_component(self: @ContractState) -> @world_provider_cpt::ComponentState { - @world_provider_cpt::unsafe_new_component_state::() - } - fn get_component_mut(ref self: ContractState) -> world_provider_cpt::ComponentState { - world_provider_cpt::unsafe_new_component_state::() - } - fn get_contract(self: @world_provider_cpt::ComponentState) -> @ContractState { - @unsafe_new_contract_state() - } - fn get_contract_mut(ref self: world_provider_cpt::ComponentState) -> ContractState { - unsafe_new_contract_state() - } - fn emit>(ref self: world_provider_cpt::ComponentState, event: S) { - let event: world_provider_cpt::Event = core::traits::Into::into(event); - let mut contract = world_provider_cpt::HasComponent::get_contract_mut(ref self); - ContractStateEventEmitter::emit(ref contract, Event::WorldProviderEvent(event)); - } -} -impl HasComponentImpl_upgradeable_cpt of upgradeable_cpt::HasComponent { - fn get_component(self: @ContractState) -> @upgradeable_cpt::ComponentState { - @upgradeable_cpt::unsafe_new_component_state::() - } - fn get_component_mut(ref self: ContractState) -> upgradeable_cpt::ComponentState { - upgradeable_cpt::unsafe_new_component_state::() - } - fn get_contract(self: @upgradeable_cpt::ComponentState) -> @ContractState { - @unsafe_new_contract_state() - } - fn get_contract_mut(ref self: upgradeable_cpt::ComponentState) -> ContractState { - unsafe_new_contract_state() - } - fn emit>(ref self: upgradeable_cpt::ComponentState, event: S) { - let event: upgradeable_cpt::Event = core::traits::Into::into(event); - let mut contract = upgradeable_cpt::HasComponent::get_contract_mut(ref self); - ContractStateEventEmitter::emit(ref contract, Event::UpgradeableEvent(event)); - } -} -impl StorageStorageBaseDrop of core::traits::Drop::; -impl StorageStorageBaseCopy of core::traits::Copy::; -impl StorageStorageBaseMutDrop of core::traits::Drop::; -impl StorageStorageBaseMutCopy of core::traits::Copy::; - -} - pub trait IEmptyTraitDispatcherTrait { -} - -#[derive(Copy, Drop, starknet::Store, Serde)] - pub struct IEmptyTraitDispatcher { - pub contract_address: starknet::ContractAddress, -} - -impl IEmptyTraitDispatcherImpl of IEmptyTraitDispatcherTrait { - -} - -#[derive(Copy, Drop, starknet::Store, Serde)] - pub struct IEmptyTraitLibraryDispatcher { - pub class_hash: starknet::ClassHash, -} - -impl IEmptyTraitLibraryDispatcherImpl of IEmptyTraitDispatcherTrait { - -} - - pub trait IEmptyTraitSafeDispatcherTrait { -} - -#[derive(Copy, Drop, starknet::Store, Serde)] - pub struct IEmptyTraitSafeLibraryDispatcher { - pub class_hash: starknet::ClassHash, -} - -impl IEmptyTraitSafeLibraryDispatcherImpl of IEmptyTraitSafeDispatcherTrait { - -} - - -#[derive(Copy, Drop, starknet::Store, Serde)] - pub struct IEmptyTraitSafeDispatcher { - pub contract_address: starknet::ContractAddress, -} - -impl IEmptyTraitSafeDispatcherImpl of IEmptyTraitSafeDispatcherTrait { - -} - pub trait IFaultyTraitDispatcherTrait { - fn do_with_attrs(self: T, p1: u8) -> u16; -} - -#[derive(Copy, Drop, starknet::Store, Serde)] - pub struct IFaultyTraitDispatcher { - pub contract_address: starknet::ContractAddress, -} - -impl IFaultyTraitDispatcherImpl of IFaultyTraitDispatcherTrait { - fn do_with_attrs(self: IFaultyTraitDispatcher, p1: u8) -> u16 { - let mut __calldata__ = core::traits::Default::default(); - core::serde::Serde::::serialize(@p1, ref __calldata__); - - let mut __dispatcher_return_data__ = starknet::syscalls::call_contract_syscall( - self.contract_address, - selector!("do_with_attrs"), - core::array::ArrayTrait::span(@__calldata__), - ); - let mut __dispatcher_return_data__ = starknet::SyscallResultTrait::unwrap_syscall(__dispatcher_return_data__); - core::option::OptionTrait::expect( - core::serde::Serde::::deserialize(ref __dispatcher_return_data__), - 'Returned data too short', - ) - } - -} - -#[derive(Copy, Drop, starknet::Store, Serde)] - pub struct IFaultyTraitLibraryDispatcher { - pub class_hash: starknet::ClassHash, -} - -impl IFaultyTraitLibraryDispatcherImpl of IFaultyTraitDispatcherTrait { - fn do_with_attrs(self: IFaultyTraitLibraryDispatcher, p1: u8) -> u16 { - let mut __calldata__ = core::traits::Default::default(); - core::serde::Serde::::serialize(@p1, ref __calldata__); - - let mut __dispatcher_return_data__ = starknet::syscalls::library_call_syscall( - self.class_hash, - selector!("do_with_attrs"), - core::array::ArrayTrait::span(@__calldata__), - ); - let mut __dispatcher_return_data__ = starknet::SyscallResultTrait::unwrap_syscall(__dispatcher_return_data__); - core::option::OptionTrait::expect( - core::serde::Serde::::deserialize(ref __dispatcher_return_data__), - 'Returned data too short', - ) - } - -} - - pub trait IFaultyTraitSafeDispatcherTrait { - #[unstable(feature: "safe_dispatcher")] - fn do_with_attrs(self: T, p1: u8) -> starknet::SyscallResult; -} - -#[derive(Copy, Drop, starknet::Store, Serde)] - pub struct IFaultyTraitSafeLibraryDispatcher { - pub class_hash: starknet::ClassHash, -} - -impl IFaultyTraitSafeLibraryDispatcherImpl of IFaultyTraitSafeDispatcherTrait { - fn do_with_attrs(self: IFaultyTraitSafeLibraryDispatcher, p1: u8) -> starknet::SyscallResult { - let mut __calldata__ = core::traits::Default::default(); - core::serde::Serde::::serialize(@p1, ref __calldata__); - - let mut __dispatcher_return_data__ = starknet::syscalls::library_call_syscall( - self.class_hash, - selector!("do_with_attrs"), - core::array::ArrayTrait::span(@__calldata__), - ); - let mut __dispatcher_return_data__ = __dispatcher_return_data__?; - Result::Ok( - core::option::OptionTrait::expect( - core::serde::Serde::::deserialize(ref __dispatcher_return_data__), - 'Returned data too short', - ) - ) - } - -} - - -#[derive(Copy, Drop, starknet::Store, Serde)] - pub struct IFaultyTraitSafeDispatcher { - pub contract_address: starknet::ContractAddress, -} - -impl IFaultyTraitSafeDispatcherImpl of IFaultyTraitSafeDispatcherTrait { - fn do_with_attrs(self: IFaultyTraitSafeDispatcher, p1: u8) -> starknet::SyscallResult { - let mut __calldata__ = core::traits::Default::default(); - core::serde::Serde::::serialize(@p1, ref __calldata__); - - let mut __dispatcher_return_data__ = starknet::syscalls::call_contract_syscall( - self.contract_address, - selector!("do_with_attrs"), - core::array::ArrayTrait::span(@__calldata__), - ); - let mut __dispatcher_return_data__ = __dispatcher_return_data__?; - Result::Ok( - core::option::OptionTrait::expect( - core::serde::Serde::::deserialize(ref __dispatcher_return_data__), - 'Returned data too short', - ) - ) - } - -} - pub trait INominalTraitDispatcherTrait { - fn do_no_param(self: T) -> felt252; -fn do_no_param_but_world(self: T) -> felt252; -fn do_no_param_but_world_ref(self: T) -> felt252; -fn do_params_no_world(self: T, p1: felt252, p2: u8) -> felt252; -fn do_params_and_world(self: T, p2: u8) -> felt252; -fn do_params_and_world_ref(self: T, p2: u8) -> felt252; -} - -#[derive(Copy, Drop, starknet::Store, Serde)] - pub struct INominalTraitDispatcher { - pub contract_address: starknet::ContractAddress, -} - -impl INominalTraitDispatcherImpl of INominalTraitDispatcherTrait { - fn do_no_param(self: INominalTraitDispatcher) -> felt252 { - let mut __calldata__ = core::traits::Default::default(); - - let mut __dispatcher_return_data__ = starknet::syscalls::call_contract_syscall( - self.contract_address, - selector!("do_no_param"), - core::array::ArrayTrait::span(@__calldata__), - ); - let mut __dispatcher_return_data__ = starknet::SyscallResultTrait::unwrap_syscall(__dispatcher_return_data__); - core::option::OptionTrait::expect( - core::serde::Serde::::deserialize(ref __dispatcher_return_data__), - 'Returned data too short', - ) - } -fn do_no_param_but_world(self: INominalTraitDispatcher) -> felt252 { - let mut __calldata__ = core::traits::Default::default(); - - let mut __dispatcher_return_data__ = starknet::syscalls::call_contract_syscall( - self.contract_address, - selector!("do_no_param_but_world"), - core::array::ArrayTrait::span(@__calldata__), - ); - let mut __dispatcher_return_data__ = starknet::SyscallResultTrait::unwrap_syscall(__dispatcher_return_data__); - core::option::OptionTrait::expect( - core::serde::Serde::::deserialize(ref __dispatcher_return_data__), - 'Returned data too short', - ) - } -fn do_no_param_but_world_ref(self: INominalTraitDispatcher) -> felt252 { - let mut __calldata__ = core::traits::Default::default(); - - let mut __dispatcher_return_data__ = starknet::syscalls::call_contract_syscall( - self.contract_address, - selector!("do_no_param_but_world_ref"), - core::array::ArrayTrait::span(@__calldata__), - ); - let mut __dispatcher_return_data__ = starknet::SyscallResultTrait::unwrap_syscall(__dispatcher_return_data__); - core::option::OptionTrait::expect( - core::serde::Serde::::deserialize(ref __dispatcher_return_data__), - 'Returned data too short', - ) - } -fn do_params_no_world(self: INominalTraitDispatcher, p1: felt252, p2: u8) -> felt252 { - let mut __calldata__ = core::traits::Default::default(); - core::serde::Serde::::serialize(@p1, ref __calldata__); - core::serde::Serde::::serialize(@p2, ref __calldata__); - - let mut __dispatcher_return_data__ = starknet::syscalls::call_contract_syscall( - self.contract_address, - selector!("do_params_no_world"), - core::array::ArrayTrait::span(@__calldata__), - ); - let mut __dispatcher_return_data__ = starknet::SyscallResultTrait::unwrap_syscall(__dispatcher_return_data__); - core::option::OptionTrait::expect( - core::serde::Serde::::deserialize(ref __dispatcher_return_data__), - 'Returned data too short', - ) - } -fn do_params_and_world(self: INominalTraitDispatcher, p2: u8) -> felt252 { - let mut __calldata__ = core::traits::Default::default(); - core::serde::Serde::::serialize(@p2, ref __calldata__); - - let mut __dispatcher_return_data__ = starknet::syscalls::call_contract_syscall( - self.contract_address, - selector!("do_params_and_world"), - core::array::ArrayTrait::span(@__calldata__), - ); - let mut __dispatcher_return_data__ = starknet::SyscallResultTrait::unwrap_syscall(__dispatcher_return_data__); - core::option::OptionTrait::expect( - core::serde::Serde::::deserialize(ref __dispatcher_return_data__), - 'Returned data too short', - ) - } -fn do_params_and_world_ref(self: INominalTraitDispatcher, p2: u8) -> felt252 { - let mut __calldata__ = core::traits::Default::default(); - core::serde::Serde::::serialize(@p2, ref __calldata__); - - let mut __dispatcher_return_data__ = starknet::syscalls::call_contract_syscall( - self.contract_address, - selector!("do_params_and_world_ref"), - core::array::ArrayTrait::span(@__calldata__), - ); - let mut __dispatcher_return_data__ = starknet::SyscallResultTrait::unwrap_syscall(__dispatcher_return_data__); - core::option::OptionTrait::expect( - core::serde::Serde::::deserialize(ref __dispatcher_return_data__), - 'Returned data too short', - ) - } - -} - -#[derive(Copy, Drop, starknet::Store, Serde)] - pub struct INominalTraitLibraryDispatcher { - pub class_hash: starknet::ClassHash, -} - -impl INominalTraitLibraryDispatcherImpl of INominalTraitDispatcherTrait { - fn do_no_param(self: INominalTraitLibraryDispatcher) -> felt252 { - let mut __calldata__ = core::traits::Default::default(); - - let mut __dispatcher_return_data__ = starknet::syscalls::library_call_syscall( - self.class_hash, - selector!("do_no_param"), - core::array::ArrayTrait::span(@__calldata__), - ); - let mut __dispatcher_return_data__ = starknet::SyscallResultTrait::unwrap_syscall(__dispatcher_return_data__); - core::option::OptionTrait::expect( - core::serde::Serde::::deserialize(ref __dispatcher_return_data__), - 'Returned data too short', - ) - } -fn do_no_param_but_world(self: INominalTraitLibraryDispatcher) -> felt252 { - let mut __calldata__ = core::traits::Default::default(); - - let mut __dispatcher_return_data__ = starknet::syscalls::library_call_syscall( - self.class_hash, - selector!("do_no_param_but_world"), - core::array::ArrayTrait::span(@__calldata__), - ); - let mut __dispatcher_return_data__ = starknet::SyscallResultTrait::unwrap_syscall(__dispatcher_return_data__); - core::option::OptionTrait::expect( - core::serde::Serde::::deserialize(ref __dispatcher_return_data__), - 'Returned data too short', - ) - } -fn do_no_param_but_world_ref(self: INominalTraitLibraryDispatcher) -> felt252 { - let mut __calldata__ = core::traits::Default::default(); - - let mut __dispatcher_return_data__ = starknet::syscalls::library_call_syscall( - self.class_hash, - selector!("do_no_param_but_world_ref"), - core::array::ArrayTrait::span(@__calldata__), - ); - let mut __dispatcher_return_data__ = starknet::SyscallResultTrait::unwrap_syscall(__dispatcher_return_data__); - core::option::OptionTrait::expect( - core::serde::Serde::::deserialize(ref __dispatcher_return_data__), - 'Returned data too short', - ) - } -fn do_params_no_world(self: INominalTraitLibraryDispatcher, p1: felt252, p2: u8) -> felt252 { - let mut __calldata__ = core::traits::Default::default(); - core::serde::Serde::::serialize(@p1, ref __calldata__); - core::serde::Serde::::serialize(@p2, ref __calldata__); - - let mut __dispatcher_return_data__ = starknet::syscalls::library_call_syscall( - self.class_hash, - selector!("do_params_no_world"), - core::array::ArrayTrait::span(@__calldata__), - ); - let mut __dispatcher_return_data__ = starknet::SyscallResultTrait::unwrap_syscall(__dispatcher_return_data__); - core::option::OptionTrait::expect( - core::serde::Serde::::deserialize(ref __dispatcher_return_data__), - 'Returned data too short', - ) - } -fn do_params_and_world(self: INominalTraitLibraryDispatcher, p2: u8) -> felt252 { - let mut __calldata__ = core::traits::Default::default(); - core::serde::Serde::::serialize(@p2, ref __calldata__); - - let mut __dispatcher_return_data__ = starknet::syscalls::library_call_syscall( - self.class_hash, - selector!("do_params_and_world"), - core::array::ArrayTrait::span(@__calldata__), - ); - let mut __dispatcher_return_data__ = starknet::SyscallResultTrait::unwrap_syscall(__dispatcher_return_data__); - core::option::OptionTrait::expect( - core::serde::Serde::::deserialize(ref __dispatcher_return_data__), - 'Returned data too short', - ) - } -fn do_params_and_world_ref(self: INominalTraitLibraryDispatcher, p2: u8) -> felt252 { - let mut __calldata__ = core::traits::Default::default(); - core::serde::Serde::::serialize(@p2, ref __calldata__); - - let mut __dispatcher_return_data__ = starknet::syscalls::library_call_syscall( - self.class_hash, - selector!("do_params_and_world_ref"), - core::array::ArrayTrait::span(@__calldata__), - ); - let mut __dispatcher_return_data__ = starknet::SyscallResultTrait::unwrap_syscall(__dispatcher_return_data__); - core::option::OptionTrait::expect( - core::serde::Serde::::deserialize(ref __dispatcher_return_data__), - 'Returned data too short', - ) - } - -} - - pub trait INominalTraitSafeDispatcherTrait { - #[unstable(feature: "safe_dispatcher")] - fn do_no_param(self: T) -> starknet::SyscallResult; - #[unstable(feature: "safe_dispatcher")] -fn do_no_param_but_world(self: T) -> starknet::SyscallResult; - #[unstable(feature: "safe_dispatcher")] -fn do_no_param_but_world_ref(self: T) -> starknet::SyscallResult; - #[unstable(feature: "safe_dispatcher")] -fn do_params_no_world(self: T, p1: felt252, p2: u8) -> starknet::SyscallResult; - #[unstable(feature: "safe_dispatcher")] -fn do_params_and_world(self: T, p2: u8) -> starknet::SyscallResult; - #[unstable(feature: "safe_dispatcher")] -fn do_params_and_world_ref(self: T, p2: u8) -> starknet::SyscallResult; -} - -#[derive(Copy, Drop, starknet::Store, Serde)] - pub struct INominalTraitSafeLibraryDispatcher { - pub class_hash: starknet::ClassHash, -} - -impl INominalTraitSafeLibraryDispatcherImpl of INominalTraitSafeDispatcherTrait { - fn do_no_param(self: INominalTraitSafeLibraryDispatcher) -> starknet::SyscallResult { - let mut __calldata__ = core::traits::Default::default(); - - let mut __dispatcher_return_data__ = starknet::syscalls::library_call_syscall( - self.class_hash, - selector!("do_no_param"), - core::array::ArrayTrait::span(@__calldata__), - ); - let mut __dispatcher_return_data__ = __dispatcher_return_data__?; - Result::Ok( - core::option::OptionTrait::expect( - core::serde::Serde::::deserialize(ref __dispatcher_return_data__), - 'Returned data too short', - ) - ) - } -fn do_no_param_but_world(self: INominalTraitSafeLibraryDispatcher) -> starknet::SyscallResult { - let mut __calldata__ = core::traits::Default::default(); - - let mut __dispatcher_return_data__ = starknet::syscalls::library_call_syscall( - self.class_hash, - selector!("do_no_param_but_world"), - core::array::ArrayTrait::span(@__calldata__), - ); - let mut __dispatcher_return_data__ = __dispatcher_return_data__?; - Result::Ok( - core::option::OptionTrait::expect( - core::serde::Serde::::deserialize(ref __dispatcher_return_data__), - 'Returned data too short', - ) - ) - } -fn do_no_param_but_world_ref(self: INominalTraitSafeLibraryDispatcher) -> starknet::SyscallResult { - let mut __calldata__ = core::traits::Default::default(); - - let mut __dispatcher_return_data__ = starknet::syscalls::library_call_syscall( - self.class_hash, - selector!("do_no_param_but_world_ref"), - core::array::ArrayTrait::span(@__calldata__), - ); - let mut __dispatcher_return_data__ = __dispatcher_return_data__?; - Result::Ok( - core::option::OptionTrait::expect( - core::serde::Serde::::deserialize(ref __dispatcher_return_data__), - 'Returned data too short', - ) - ) - } -fn do_params_no_world(self: INominalTraitSafeLibraryDispatcher, p1: felt252, p2: u8) -> starknet::SyscallResult { - let mut __calldata__ = core::traits::Default::default(); - core::serde::Serde::::serialize(@p1, ref __calldata__); - core::serde::Serde::::serialize(@p2, ref __calldata__); - - let mut __dispatcher_return_data__ = starknet::syscalls::library_call_syscall( - self.class_hash, - selector!("do_params_no_world"), - core::array::ArrayTrait::span(@__calldata__), - ); - let mut __dispatcher_return_data__ = __dispatcher_return_data__?; - Result::Ok( - core::option::OptionTrait::expect( - core::serde::Serde::::deserialize(ref __dispatcher_return_data__), - 'Returned data too short', - ) - ) - } -fn do_params_and_world(self: INominalTraitSafeLibraryDispatcher, p2: u8) -> starknet::SyscallResult { - let mut __calldata__ = core::traits::Default::default(); - core::serde::Serde::::serialize(@p2, ref __calldata__); - - let mut __dispatcher_return_data__ = starknet::syscalls::library_call_syscall( - self.class_hash, - selector!("do_params_and_world"), - core::array::ArrayTrait::span(@__calldata__), - ); - let mut __dispatcher_return_data__ = __dispatcher_return_data__?; - Result::Ok( - core::option::OptionTrait::expect( - core::serde::Serde::::deserialize(ref __dispatcher_return_data__), - 'Returned data too short', - ) - ) - } -fn do_params_and_world_ref(self: INominalTraitSafeLibraryDispatcher, p2: u8) -> starknet::SyscallResult { - let mut __calldata__ = core::traits::Default::default(); - core::serde::Serde::::serialize(@p2, ref __calldata__); - - let mut __dispatcher_return_data__ = starknet::syscalls::library_call_syscall( - self.class_hash, - selector!("do_params_and_world_ref"), - core::array::ArrayTrait::span(@__calldata__), - ); - let mut __dispatcher_return_data__ = __dispatcher_return_data__?; - Result::Ok( - core::option::OptionTrait::expect( - core::serde::Serde::::deserialize(ref __dispatcher_return_data__), - 'Returned data too short', - ) - ) - } - -} - - -#[derive(Copy, Drop, starknet::Store, Serde)] - pub struct INominalTraitSafeDispatcher { - pub contract_address: starknet::ContractAddress, -} - -impl INominalTraitSafeDispatcherImpl of INominalTraitSafeDispatcherTrait { - fn do_no_param(self: INominalTraitSafeDispatcher) -> starknet::SyscallResult { - let mut __calldata__ = core::traits::Default::default(); - - let mut __dispatcher_return_data__ = starknet::syscalls::call_contract_syscall( - self.contract_address, - selector!("do_no_param"), - core::array::ArrayTrait::span(@__calldata__), - ); - let mut __dispatcher_return_data__ = __dispatcher_return_data__?; - Result::Ok( - core::option::OptionTrait::expect( - core::serde::Serde::::deserialize(ref __dispatcher_return_data__), - 'Returned data too short', - ) - ) - } -fn do_no_param_but_world(self: INominalTraitSafeDispatcher) -> starknet::SyscallResult { - let mut __calldata__ = core::traits::Default::default(); - - let mut __dispatcher_return_data__ = starknet::syscalls::call_contract_syscall( - self.contract_address, - selector!("do_no_param_but_world"), - core::array::ArrayTrait::span(@__calldata__), - ); - let mut __dispatcher_return_data__ = __dispatcher_return_data__?; - Result::Ok( - core::option::OptionTrait::expect( - core::serde::Serde::::deserialize(ref __dispatcher_return_data__), - 'Returned data too short', - ) - ) - } -fn do_no_param_but_world_ref(self: INominalTraitSafeDispatcher) -> starknet::SyscallResult { - let mut __calldata__ = core::traits::Default::default(); - - let mut __dispatcher_return_data__ = starknet::syscalls::call_contract_syscall( - self.contract_address, - selector!("do_no_param_but_world_ref"), - core::array::ArrayTrait::span(@__calldata__), - ); - let mut __dispatcher_return_data__ = __dispatcher_return_data__?; - Result::Ok( - core::option::OptionTrait::expect( - core::serde::Serde::::deserialize(ref __dispatcher_return_data__), - 'Returned data too short', - ) - ) - } -fn do_params_no_world(self: INominalTraitSafeDispatcher, p1: felt252, p2: u8) -> starknet::SyscallResult { - let mut __calldata__ = core::traits::Default::default(); - core::serde::Serde::::serialize(@p1, ref __calldata__); - core::serde::Serde::::serialize(@p2, ref __calldata__); - - let mut __dispatcher_return_data__ = starknet::syscalls::call_contract_syscall( - self.contract_address, - selector!("do_params_no_world"), - core::array::ArrayTrait::span(@__calldata__), - ); - let mut __dispatcher_return_data__ = __dispatcher_return_data__?; - Result::Ok( - core::option::OptionTrait::expect( - core::serde::Serde::::deserialize(ref __dispatcher_return_data__), - 'Returned data too short', - ) - ) - } -fn do_params_and_world(self: INominalTraitSafeDispatcher, p2: u8) -> starknet::SyscallResult { - let mut __calldata__ = core::traits::Default::default(); - core::serde::Serde::::serialize(@p2, ref __calldata__); - - let mut __dispatcher_return_data__ = starknet::syscalls::call_contract_syscall( - self.contract_address, - selector!("do_params_and_world"), - core::array::ArrayTrait::span(@__calldata__), - ); - let mut __dispatcher_return_data__ = __dispatcher_return_data__?; - Result::Ok( - core::option::OptionTrait::expect( - core::serde::Serde::::deserialize(ref __dispatcher_return_data__), - 'Returned data too short', - ) - ) - } -fn do_params_and_world_ref(self: INominalTraitSafeDispatcher, p2: u8) -> starknet::SyscallResult { - let mut __calldata__ = core::traits::Default::default(); - core::serde::Serde::::serialize(@p2, ref __calldata__); - - let mut __dispatcher_return_data__ = starknet::syscalls::call_contract_syscall( - self.contract_address, - selector!("do_params_and_world_ref"), - core::array::ArrayTrait::span(@__calldata__), - ); - let mut __dispatcher_return_data__ = __dispatcher_return_data__?; - Result::Ok( - core::option::OptionTrait::expect( - core::serde::Serde::::deserialize(ref __dispatcher_return_data__), - 'Returned data too short', - ) - ) - } - -} - pub trait IFaultyTraitDispatcherTrait { -fn do_with_self_and_world_inv(self: T, self: @ContractState) -> felt252; -fn do_with_world_not_named_world(self: T, another_world: @IWorldDispatcher) -> felt252; -} - -#[derive(Copy, Drop, starknet::Store, Serde)] - pub struct IFaultyTraitDispatcher { - pub contract_address: starknet::ContractAddress, -} - -impl IFaultyTraitDispatcherImpl of IFaultyTraitDispatcherTrait { -fn do_with_self_and_world_inv(self: IFaultyTraitDispatcher, self: @ContractState) -> felt252 { - let mut __calldata__ = core::traits::Default::default(); - core::serde::Serde::<@ContractState>::serialize(@self, ref __calldata__); - - let mut __dispatcher_return_data__ = starknet::syscalls::call_contract_syscall( - self.contract_address, - selector!("do_with_self_and_world_inv"), - core::array::ArrayTrait::span(@__calldata__), - ); - let mut __dispatcher_return_data__ = starknet::SyscallResultTrait::unwrap_syscall(__dispatcher_return_data__); - core::option::OptionTrait::expect( - core::serde::Serde::::deserialize(ref __dispatcher_return_data__), - 'Returned data too short', - ) - } -fn do_with_world_not_named_world(self: IFaultyTraitDispatcher, another_world: @IWorldDispatcher) -> felt252 { - let mut __calldata__ = core::traits::Default::default(); - core::serde::Serde::<@IWorldDispatcher>::serialize(@another_world, ref __calldata__); - - let mut __dispatcher_return_data__ = starknet::syscalls::call_contract_syscall( - self.contract_address, - selector!("do_with_world_not_named_world"), - core::array::ArrayTrait::span(@__calldata__), - ); - let mut __dispatcher_return_data__ = starknet::SyscallResultTrait::unwrap_syscall(__dispatcher_return_data__); - core::option::OptionTrait::expect( - core::serde::Serde::::deserialize(ref __dispatcher_return_data__), - 'Returned data too short', - ) - } - -} - -#[derive(Copy, Drop, starknet::Store, Serde)] - pub struct IFaultyTraitLibraryDispatcher { - pub class_hash: starknet::ClassHash, -} - -impl IFaultyTraitLibraryDispatcherImpl of IFaultyTraitDispatcherTrait { -fn do_with_self_and_world_inv(self: IFaultyTraitLibraryDispatcher, self: @ContractState) -> felt252 { - let mut __calldata__ = core::traits::Default::default(); - core::serde::Serde::<@ContractState>::serialize(@self, ref __calldata__); - - let mut __dispatcher_return_data__ = starknet::syscalls::library_call_syscall( - self.class_hash, - selector!("do_with_self_and_world_inv"), - core::array::ArrayTrait::span(@__calldata__), - ); - let mut __dispatcher_return_data__ = starknet::SyscallResultTrait::unwrap_syscall(__dispatcher_return_data__); - core::option::OptionTrait::expect( - core::serde::Serde::::deserialize(ref __dispatcher_return_data__), - 'Returned data too short', - ) - } -fn do_with_world_not_named_world(self: IFaultyTraitLibraryDispatcher, another_world: @IWorldDispatcher) -> felt252 { - let mut __calldata__ = core::traits::Default::default(); - core::serde::Serde::<@IWorldDispatcher>::serialize(@another_world, ref __calldata__); - - let mut __dispatcher_return_data__ = starknet::syscalls::library_call_syscall( - self.class_hash, - selector!("do_with_world_not_named_world"), - core::array::ArrayTrait::span(@__calldata__), - ); - let mut __dispatcher_return_data__ = starknet::SyscallResultTrait::unwrap_syscall(__dispatcher_return_data__); - core::option::OptionTrait::expect( - core::serde::Serde::::deserialize(ref __dispatcher_return_data__), - 'Returned data too short', - ) - } - -} - - pub trait IFaultyTraitSafeDispatcherTrait { - #[unstable(feature: "safe_dispatcher")] -fn do_with_self_and_world_inv(self: T, self: @ContractState) -> starknet::SyscallResult; - #[unstable(feature: "safe_dispatcher")] -fn do_with_world_not_named_world(self: T, another_world: @IWorldDispatcher) -> starknet::SyscallResult; -} - -#[derive(Copy, Drop, starknet::Store, Serde)] - pub struct IFaultyTraitSafeLibraryDispatcher { - pub class_hash: starknet::ClassHash, -} - -impl IFaultyTraitSafeLibraryDispatcherImpl of IFaultyTraitSafeDispatcherTrait { -fn do_with_self_and_world_inv(self: IFaultyTraitSafeLibraryDispatcher, self: @ContractState) -> starknet::SyscallResult { - let mut __calldata__ = core::traits::Default::default(); - core::serde::Serde::<@ContractState>::serialize(@self, ref __calldata__); - - let mut __dispatcher_return_data__ = starknet::syscalls::library_call_syscall( - self.class_hash, - selector!("do_with_self_and_world_inv"), - core::array::ArrayTrait::span(@__calldata__), - ); - let mut __dispatcher_return_data__ = __dispatcher_return_data__?; - Result::Ok( - core::option::OptionTrait::expect( - core::serde::Serde::::deserialize(ref __dispatcher_return_data__), - 'Returned data too short', - ) - ) - } -fn do_with_world_not_named_world(self: IFaultyTraitSafeLibraryDispatcher, another_world: @IWorldDispatcher) -> starknet::SyscallResult { - let mut __calldata__ = core::traits::Default::default(); - core::serde::Serde::<@IWorldDispatcher>::serialize(@another_world, ref __calldata__); - - let mut __dispatcher_return_data__ = starknet::syscalls::library_call_syscall( - self.class_hash, - selector!("do_with_world_not_named_world"), - core::array::ArrayTrait::span(@__calldata__), - ); - let mut __dispatcher_return_data__ = __dispatcher_return_data__?; - Result::Ok( - core::option::OptionTrait::expect( - core::serde::Serde::::deserialize(ref __dispatcher_return_data__), - 'Returned data too short', - ) - ) - } - -} - - -#[derive(Copy, Drop, starknet::Store, Serde)] - pub struct IFaultyTraitSafeDispatcher { - pub contract_address: starknet::ContractAddress, -} - -impl IFaultyTraitSafeDispatcherImpl of IFaultyTraitSafeDispatcherTrait { -fn do_with_self_and_world_inv(self: IFaultyTraitSafeDispatcher, self: @ContractState) -> starknet::SyscallResult { - let mut __calldata__ = core::traits::Default::default(); - core::serde::Serde::<@ContractState>::serialize(@self, ref __calldata__); - - let mut __dispatcher_return_data__ = starknet::syscalls::call_contract_syscall( - self.contract_address, - selector!("do_with_self_and_world_inv"), - core::array::ArrayTrait::span(@__calldata__), - ); - let mut __dispatcher_return_data__ = __dispatcher_return_data__?; - Result::Ok( - core::option::OptionTrait::expect( - core::serde::Serde::::deserialize(ref __dispatcher_return_data__), - 'Returned data too short', - ) - ) - } -fn do_with_world_not_named_world(self: IFaultyTraitSafeDispatcher, another_world: @IWorldDispatcher) -> starknet::SyscallResult { - let mut __calldata__ = core::traits::Default::default(); - core::serde::Serde::<@IWorldDispatcher>::serialize(@another_world, ref __calldata__); - - let mut __dispatcher_return_data__ = starknet::syscalls::call_contract_syscall( - self.contract_address, - selector!("do_with_world_not_named_world"), - core::array::ArrayTrait::span(@__calldata__), - ); - let mut __dispatcher_return_data__ = __dispatcher_return_data__?; - Result::Ok( - core::option::OptionTrait::expect( - core::serde::Serde::::deserialize(ref __dispatcher_return_data__), - 'Returned data too short', - ) - ) - } - -} -impl IEmptyTraitDispatcherCopy of core::traits::Copy::; -impl IEmptyTraitDispatcherDrop of core::traits::Drop::; -impl IEmptyTraitDispatcherSerde of core::serde::Serde:: { - fn serialize(self: @IEmptyTraitDispatcher, ref output: core::array::Array) { - core::serde::Serde::serialize(self.contract_address, ref output) - } - fn deserialize(ref serialized: core::array::Span) -> core::option::Option { - core::option::Option::Some(IEmptyTraitDispatcher { - contract_address: core::serde::Serde::deserialize(ref serialized)?, - }) - } -} -impl StoreIEmptyTraitDispatcher of starknet::Store:: { - fn read(address_domain: u32, base: starknet::storage_access::StorageBaseAddress) -> starknet::SyscallResult { - let contract_address = starknet::Store::::read(address_domain, base)?; - starknet::SyscallResult::Ok( - IEmptyTraitDispatcher { - contract_address, - } - ) - } - fn write(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, value: IEmptyTraitDispatcher) -> starknet::SyscallResult<()> { - starknet::Store::::write(address_domain, base, value.contract_address)?; - starknet::SyscallResult::Ok(()) - } - fn read_at_offset(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, offset: u8) -> starknet::SyscallResult { - let contract_address = starknet::Store::::read_at_offset(address_domain, base, offset)?; - starknet::SyscallResult::Ok( - IEmptyTraitDispatcher { - contract_address, - } - ) - } - #[inline(always)] - fn write_at_offset(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, offset: u8, value: IEmptyTraitDispatcher) -> starknet::SyscallResult<()> { - starknet::Store::::write_at_offset(address_domain, base, offset, value.contract_address)?; - starknet::SyscallResult::Ok(()) - } - #[inline(always)] - fn size() -> u8 { - starknet::Store::::size() - } -} - -#[derive(Drop, Copy)] -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.__storage_pointer_address__; - let mut current_offset = self.__storage_pointer_offset__; - let __contract_address_value__ = starknet::storage::StoragePointer { - __storage_pointer_address__: base_address, - __storage_pointer_offset__: current_offset, - }; - IEmptyTraitDispatcherSubPointers { - contract_address: __contract_address_value__, - } - } -} -#[derive(Drop, Copy)] -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 { - __storage_pointer_address__: base_address, - __storage_pointer_offset__: current_offset, - }; - IEmptyTraitDispatcherSubPointersMut { - contract_address: __contract_address_value__, - } - } -} -impl IEmptyTraitLibraryDispatcherCopy of core::traits::Copy::; -impl IEmptyTraitLibraryDispatcherDrop of core::traits::Drop::; -impl IEmptyTraitLibraryDispatcherSerde of core::serde::Serde:: { - fn serialize(self: @IEmptyTraitLibraryDispatcher, ref output: core::array::Array) { - core::serde::Serde::serialize(self.class_hash, ref output) - } - fn deserialize(ref serialized: core::array::Span) -> core::option::Option { - core::option::Option::Some(IEmptyTraitLibraryDispatcher { - class_hash: core::serde::Serde::deserialize(ref serialized)?, - }) - } -} -impl StoreIEmptyTraitLibraryDispatcher of starknet::Store:: { - fn read(address_domain: u32, base: starknet::storage_access::StorageBaseAddress) -> starknet::SyscallResult { - let class_hash = starknet::Store::::read(address_domain, base)?; - starknet::SyscallResult::Ok( - IEmptyTraitLibraryDispatcher { - class_hash, - } - ) - } - fn write(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, value: IEmptyTraitLibraryDispatcher) -> starknet::SyscallResult<()> { - starknet::Store::::write(address_domain, base, value.class_hash)?; - starknet::SyscallResult::Ok(()) - } - fn read_at_offset(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, offset: u8) -> starknet::SyscallResult { - let class_hash = starknet::Store::::read_at_offset(address_domain, base, offset)?; - starknet::SyscallResult::Ok( - IEmptyTraitLibraryDispatcher { - class_hash, - } - ) - } - #[inline(always)] - fn write_at_offset(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, offset: u8, value: IEmptyTraitLibraryDispatcher) -> starknet::SyscallResult<()> { - starknet::Store::::write_at_offset(address_domain, base, offset, value.class_hash)?; - starknet::SyscallResult::Ok(()) - } - #[inline(always)] - fn size() -> u8 { - starknet::Store::::size() - } -} - -#[derive(Drop, Copy)] -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.__storage_pointer_address__; - let mut current_offset = self.__storage_pointer_offset__; - let __class_hash_value__ = starknet::storage::StoragePointer { - __storage_pointer_address__: base_address, - __storage_pointer_offset__: current_offset, - }; - IEmptyTraitLibraryDispatcherSubPointers { - class_hash: __class_hash_value__, - } - } -} -#[derive(Drop, Copy)] -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 { - __storage_pointer_address__: base_address, - __storage_pointer_offset__: current_offset, - }; - IEmptyTraitLibraryDispatcherSubPointersMut { - class_hash: __class_hash_value__, - } - } -} -impl IEmptyTraitSafeLibraryDispatcherCopy of core::traits::Copy::; -impl IEmptyTraitSafeLibraryDispatcherDrop of core::traits::Drop::; -impl IEmptyTraitSafeLibraryDispatcherSerde of core::serde::Serde:: { - fn serialize(self: @IEmptyTraitSafeLibraryDispatcher, ref output: core::array::Array) { - core::serde::Serde::serialize(self.class_hash, ref output) - } - fn deserialize(ref serialized: core::array::Span) -> core::option::Option { - core::option::Option::Some(IEmptyTraitSafeLibraryDispatcher { - class_hash: core::serde::Serde::deserialize(ref serialized)?, - }) - } -} -impl StoreIEmptyTraitSafeLibraryDispatcher of starknet::Store:: { - fn read(address_domain: u32, base: starknet::storage_access::StorageBaseAddress) -> starknet::SyscallResult { - let class_hash = starknet::Store::::read(address_domain, base)?; - starknet::SyscallResult::Ok( - IEmptyTraitSafeLibraryDispatcher { - class_hash, - } - ) - } - fn write(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, value: IEmptyTraitSafeLibraryDispatcher) -> starknet::SyscallResult<()> { - starknet::Store::::write(address_domain, base, value.class_hash)?; - starknet::SyscallResult::Ok(()) - } - fn read_at_offset(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, offset: u8) -> starknet::SyscallResult { - let class_hash = starknet::Store::::read_at_offset(address_domain, base, offset)?; - starknet::SyscallResult::Ok( - IEmptyTraitSafeLibraryDispatcher { - class_hash, - } - ) - } - #[inline(always)] - fn write_at_offset(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, offset: u8, value: IEmptyTraitSafeLibraryDispatcher) -> starknet::SyscallResult<()> { - starknet::Store::::write_at_offset(address_domain, base, offset, value.class_hash)?; - starknet::SyscallResult::Ok(()) - } - #[inline(always)] - fn size() -> u8 { - starknet::Store::::size() - } -} - -#[derive(Drop, Copy)] -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.__storage_pointer_address__; - let mut current_offset = self.__storage_pointer_offset__; - let __class_hash_value__ = starknet::storage::StoragePointer { - __storage_pointer_address__: base_address, - __storage_pointer_offset__: current_offset, - }; - IEmptyTraitSafeLibraryDispatcherSubPointers { - class_hash: __class_hash_value__, - } - } -} -#[derive(Drop, Copy)] -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 { - __storage_pointer_address__: base_address, - __storage_pointer_offset__: current_offset, - }; - IEmptyTraitSafeLibraryDispatcherSubPointersMut { - class_hash: __class_hash_value__, - } - } -} -impl IEmptyTraitSafeDispatcherCopy of core::traits::Copy::; -impl IEmptyTraitSafeDispatcherDrop of core::traits::Drop::; -impl IEmptyTraitSafeDispatcherSerde of core::serde::Serde:: { - fn serialize(self: @IEmptyTraitSafeDispatcher, ref output: core::array::Array) { - core::serde::Serde::serialize(self.contract_address, ref output) - } - fn deserialize(ref serialized: core::array::Span) -> core::option::Option { - core::option::Option::Some(IEmptyTraitSafeDispatcher { - contract_address: core::serde::Serde::deserialize(ref serialized)?, - }) - } -} -impl StoreIEmptyTraitSafeDispatcher of starknet::Store:: { - fn read(address_domain: u32, base: starknet::storage_access::StorageBaseAddress) -> starknet::SyscallResult { - let contract_address = starknet::Store::::read(address_domain, base)?; - starknet::SyscallResult::Ok( - IEmptyTraitSafeDispatcher { - contract_address, - } - ) - } - fn write(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, value: IEmptyTraitSafeDispatcher) -> starknet::SyscallResult<()> { - starknet::Store::::write(address_domain, base, value.contract_address)?; - starknet::SyscallResult::Ok(()) - } - fn read_at_offset(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, offset: u8) -> starknet::SyscallResult { - let contract_address = starknet::Store::::read_at_offset(address_domain, base, offset)?; - starknet::SyscallResult::Ok( - IEmptyTraitSafeDispatcher { - contract_address, - } - ) - } - #[inline(always)] - fn write_at_offset(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, offset: u8, value: IEmptyTraitSafeDispatcher) -> starknet::SyscallResult<()> { - starknet::Store::::write_at_offset(address_domain, base, offset, value.contract_address)?; - starknet::SyscallResult::Ok(()) - } - #[inline(always)] - fn size() -> u8 { - starknet::Store::::size() - } -} - -#[derive(Drop, Copy)] -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.__storage_pointer_address__; - let mut current_offset = self.__storage_pointer_offset__; - let __contract_address_value__ = starknet::storage::StoragePointer { - __storage_pointer_address__: base_address, - __storage_pointer_offset__: current_offset, - }; - IEmptyTraitSafeDispatcherSubPointers { - contract_address: __contract_address_value__, - } - } -} -#[derive(Drop, Copy)] -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 { - __storage_pointer_address__: base_address, - __storage_pointer_offset__: current_offset, - }; - IEmptyTraitSafeDispatcherSubPointersMut { - contract_address: __contract_address_value__, - } - } -} -impl IFaultyTraitDispatcherCopy of core::traits::Copy::; -impl IFaultyTraitDispatcherDrop of core::traits::Drop::; -impl IFaultyTraitDispatcherSerde of core::serde::Serde:: { - fn serialize(self: @IFaultyTraitDispatcher, ref output: core::array::Array) { - core::serde::Serde::serialize(self.contract_address, ref output) - } - fn deserialize(ref serialized: core::array::Span) -> core::option::Option { - core::option::Option::Some(IFaultyTraitDispatcher { - contract_address: core::serde::Serde::deserialize(ref serialized)?, - }) - } -} -impl StoreIFaultyTraitDispatcher of starknet::Store:: { - fn read(address_domain: u32, base: starknet::storage_access::StorageBaseAddress) -> starknet::SyscallResult { - let contract_address = starknet::Store::::read(address_domain, base)?; - starknet::SyscallResult::Ok( - IFaultyTraitDispatcher { - contract_address, - } - ) - } - fn write(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, value: IFaultyTraitDispatcher) -> starknet::SyscallResult<()> { - starknet::Store::::write(address_domain, base, value.contract_address)?; - starknet::SyscallResult::Ok(()) - } - fn read_at_offset(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, offset: u8) -> starknet::SyscallResult { - let contract_address = starknet::Store::::read_at_offset(address_domain, base, offset)?; - starknet::SyscallResult::Ok( - IFaultyTraitDispatcher { - contract_address, - } - ) - } - #[inline(always)] - fn write_at_offset(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, offset: u8, value: IFaultyTraitDispatcher) -> starknet::SyscallResult<()> { - starknet::Store::::write_at_offset(address_domain, base, offset, value.contract_address)?; - starknet::SyscallResult::Ok(()) - } - #[inline(always)] - fn size() -> u8 { - starknet::Store::::size() - } -} - -#[derive(Drop, Copy)] -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.__storage_pointer_address__; - let mut current_offset = self.__storage_pointer_offset__; - let __contract_address_value__ = starknet::storage::StoragePointer { - __storage_pointer_address__: base_address, - __storage_pointer_offset__: current_offset, - }; - IFaultyTraitDispatcherSubPointers { - contract_address: __contract_address_value__, - } - } -} -#[derive(Drop, Copy)] -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 { - __storage_pointer_address__: base_address, - __storage_pointer_offset__: current_offset, - }; - IFaultyTraitDispatcherSubPointersMut { - contract_address: __contract_address_value__, - } - } -} -impl IFaultyTraitLibraryDispatcherCopy of core::traits::Copy::; -impl IFaultyTraitLibraryDispatcherDrop of core::traits::Drop::; -impl IFaultyTraitLibraryDispatcherSerde of core::serde::Serde:: { - fn serialize(self: @IFaultyTraitLibraryDispatcher, ref output: core::array::Array) { - core::serde::Serde::serialize(self.class_hash, ref output) - } - fn deserialize(ref serialized: core::array::Span) -> core::option::Option { - core::option::Option::Some(IFaultyTraitLibraryDispatcher { - class_hash: core::serde::Serde::deserialize(ref serialized)?, - }) - } -} -impl StoreIFaultyTraitLibraryDispatcher of starknet::Store:: { - fn read(address_domain: u32, base: starknet::storage_access::StorageBaseAddress) -> starknet::SyscallResult { - let class_hash = starknet::Store::::read(address_domain, base)?; - starknet::SyscallResult::Ok( - IFaultyTraitLibraryDispatcher { - class_hash, - } - ) - } - fn write(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, value: IFaultyTraitLibraryDispatcher) -> starknet::SyscallResult<()> { - starknet::Store::::write(address_domain, base, value.class_hash)?; - starknet::SyscallResult::Ok(()) - } - fn read_at_offset(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, offset: u8) -> starknet::SyscallResult { - let class_hash = starknet::Store::::read_at_offset(address_domain, base, offset)?; - starknet::SyscallResult::Ok( - IFaultyTraitLibraryDispatcher { - class_hash, - } - ) - } - #[inline(always)] - fn write_at_offset(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, offset: u8, value: IFaultyTraitLibraryDispatcher) -> starknet::SyscallResult<()> { - starknet::Store::::write_at_offset(address_domain, base, offset, value.class_hash)?; - starknet::SyscallResult::Ok(()) - } - #[inline(always)] - fn size() -> u8 { - starknet::Store::::size() - } -} - -#[derive(Drop, Copy)] -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.__storage_pointer_address__; - let mut current_offset = self.__storage_pointer_offset__; - let __class_hash_value__ = starknet::storage::StoragePointer { - __storage_pointer_address__: base_address, - __storage_pointer_offset__: current_offset, - }; - IFaultyTraitLibraryDispatcherSubPointers { - class_hash: __class_hash_value__, - } - } -} -#[derive(Drop, Copy)] -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 { - __storage_pointer_address__: base_address, - __storage_pointer_offset__: current_offset, - }; - IFaultyTraitLibraryDispatcherSubPointersMut { - class_hash: __class_hash_value__, - } - } -} -impl IFaultyTraitSafeLibraryDispatcherCopy of core::traits::Copy::; -impl IFaultyTraitSafeLibraryDispatcherDrop of core::traits::Drop::; -impl IFaultyTraitSafeLibraryDispatcherSerde of core::serde::Serde:: { - fn serialize(self: @IFaultyTraitSafeLibraryDispatcher, ref output: core::array::Array) { - core::serde::Serde::serialize(self.class_hash, ref output) - } - fn deserialize(ref serialized: core::array::Span) -> core::option::Option { - core::option::Option::Some(IFaultyTraitSafeLibraryDispatcher { - class_hash: core::serde::Serde::deserialize(ref serialized)?, - }) - } -} -impl StoreIFaultyTraitSafeLibraryDispatcher of starknet::Store:: { - fn read(address_domain: u32, base: starknet::storage_access::StorageBaseAddress) -> starknet::SyscallResult { - let class_hash = starknet::Store::::read(address_domain, base)?; - starknet::SyscallResult::Ok( - IFaultyTraitSafeLibraryDispatcher { - class_hash, - } - ) - } - fn write(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, value: IFaultyTraitSafeLibraryDispatcher) -> starknet::SyscallResult<()> { - starknet::Store::::write(address_domain, base, value.class_hash)?; - starknet::SyscallResult::Ok(()) - } - fn read_at_offset(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, offset: u8) -> starknet::SyscallResult { - let class_hash = starknet::Store::::read_at_offset(address_domain, base, offset)?; - starknet::SyscallResult::Ok( - IFaultyTraitSafeLibraryDispatcher { - class_hash, - } - ) - } - #[inline(always)] - fn write_at_offset(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, offset: u8, value: IFaultyTraitSafeLibraryDispatcher) -> starknet::SyscallResult<()> { - starknet::Store::::write_at_offset(address_domain, base, offset, value.class_hash)?; - starknet::SyscallResult::Ok(()) - } - #[inline(always)] - fn size() -> u8 { - starknet::Store::::size() - } -} - -#[derive(Drop, Copy)] -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.__storage_pointer_address__; - let mut current_offset = self.__storage_pointer_offset__; - let __class_hash_value__ = starknet::storage::StoragePointer { - __storage_pointer_address__: base_address, - __storage_pointer_offset__: current_offset, - }; - IFaultyTraitSafeLibraryDispatcherSubPointers { - class_hash: __class_hash_value__, - } - } -} -#[derive(Drop, Copy)] -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 { - __storage_pointer_address__: base_address, - __storage_pointer_offset__: current_offset, - }; - IFaultyTraitSafeLibraryDispatcherSubPointersMut { - class_hash: __class_hash_value__, - } - } -} -impl IFaultyTraitSafeDispatcherCopy of core::traits::Copy::; -impl IFaultyTraitSafeDispatcherDrop of core::traits::Drop::; -impl IFaultyTraitSafeDispatcherSerde of core::serde::Serde:: { - fn serialize(self: @IFaultyTraitSafeDispatcher, ref output: core::array::Array) { - core::serde::Serde::serialize(self.contract_address, ref output) - } - fn deserialize(ref serialized: core::array::Span) -> core::option::Option { - core::option::Option::Some(IFaultyTraitSafeDispatcher { - contract_address: core::serde::Serde::deserialize(ref serialized)?, - }) - } -} -impl StoreIFaultyTraitSafeDispatcher of starknet::Store:: { - fn read(address_domain: u32, base: starknet::storage_access::StorageBaseAddress) -> starknet::SyscallResult { - let contract_address = starknet::Store::::read(address_domain, base)?; - starknet::SyscallResult::Ok( - IFaultyTraitSafeDispatcher { - contract_address, - } - ) - } - fn write(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, value: IFaultyTraitSafeDispatcher) -> starknet::SyscallResult<()> { - starknet::Store::::write(address_domain, base, value.contract_address)?; - starknet::SyscallResult::Ok(()) - } - fn read_at_offset(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, offset: u8) -> starknet::SyscallResult { - let contract_address = starknet::Store::::read_at_offset(address_domain, base, offset)?; - starknet::SyscallResult::Ok( - IFaultyTraitSafeDispatcher { - contract_address, - } - ) - } - #[inline(always)] - fn write_at_offset(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, offset: u8, value: IFaultyTraitSafeDispatcher) -> starknet::SyscallResult<()> { - starknet::Store::::write_at_offset(address_domain, base, offset, value.contract_address)?; - starknet::SyscallResult::Ok(()) - } - #[inline(always)] - fn size() -> u8 { - starknet::Store::::size() - } -} - -#[derive(Drop, Copy)] -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.__storage_pointer_address__; - let mut current_offset = self.__storage_pointer_offset__; - let __contract_address_value__ = starknet::storage::StoragePointer { - __storage_pointer_address__: base_address, - __storage_pointer_offset__: current_offset, - }; - IFaultyTraitSafeDispatcherSubPointers { - contract_address: __contract_address_value__, - } - } -} -#[derive(Drop, Copy)] -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 { - __storage_pointer_address__: base_address, - __storage_pointer_offset__: current_offset, - }; - IFaultyTraitSafeDispatcherSubPointersMut { - contract_address: __contract_address_value__, - } - } -} -impl INominalTraitDispatcherCopy of core::traits::Copy::; -impl INominalTraitDispatcherDrop of core::traits::Drop::; -impl INominalTraitDispatcherSerde of core::serde::Serde:: { - fn serialize(self: @INominalTraitDispatcher, ref output: core::array::Array) { - core::serde::Serde::serialize(self.contract_address, ref output) - } - fn deserialize(ref serialized: core::array::Span) -> core::option::Option { - core::option::Option::Some(INominalTraitDispatcher { - contract_address: core::serde::Serde::deserialize(ref serialized)?, - }) - } -} -impl StoreINominalTraitDispatcher of starknet::Store:: { - fn read(address_domain: u32, base: starknet::storage_access::StorageBaseAddress) -> starknet::SyscallResult { - let contract_address = starknet::Store::::read(address_domain, base)?; - starknet::SyscallResult::Ok( - INominalTraitDispatcher { - contract_address, - } - ) - } - fn write(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, value: INominalTraitDispatcher) -> starknet::SyscallResult<()> { - starknet::Store::::write(address_domain, base, value.contract_address)?; - starknet::SyscallResult::Ok(()) - } - fn read_at_offset(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, offset: u8) -> starknet::SyscallResult { - let contract_address = starknet::Store::::read_at_offset(address_domain, base, offset)?; - starknet::SyscallResult::Ok( - INominalTraitDispatcher { - contract_address, - } - ) - } - #[inline(always)] - fn write_at_offset(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, offset: u8, value: INominalTraitDispatcher) -> starknet::SyscallResult<()> { - starknet::Store::::write_at_offset(address_domain, base, offset, value.contract_address)?; - starknet::SyscallResult::Ok(()) - } - #[inline(always)] - fn size() -> u8 { - starknet::Store::::size() - } -} - -#[derive(Drop, Copy)] -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.__storage_pointer_address__; - let mut current_offset = self.__storage_pointer_offset__; - let __contract_address_value__ = starknet::storage::StoragePointer { - __storage_pointer_address__: base_address, - __storage_pointer_offset__: current_offset, - }; - INominalTraitDispatcherSubPointers { - contract_address: __contract_address_value__, - } - } -} -#[derive(Drop, Copy)] -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 { - __storage_pointer_address__: base_address, - __storage_pointer_offset__: current_offset, - }; - INominalTraitDispatcherSubPointersMut { - contract_address: __contract_address_value__, - } - } -} -impl INominalTraitLibraryDispatcherCopy of core::traits::Copy::; -impl INominalTraitLibraryDispatcherDrop of core::traits::Drop::; -impl INominalTraitLibraryDispatcherSerde of core::serde::Serde:: { - fn serialize(self: @INominalTraitLibraryDispatcher, ref output: core::array::Array) { - core::serde::Serde::serialize(self.class_hash, ref output) - } - fn deserialize(ref serialized: core::array::Span) -> core::option::Option { - core::option::Option::Some(INominalTraitLibraryDispatcher { - class_hash: core::serde::Serde::deserialize(ref serialized)?, - }) - } -} -impl StoreINominalTraitLibraryDispatcher of starknet::Store:: { - fn read(address_domain: u32, base: starknet::storage_access::StorageBaseAddress) -> starknet::SyscallResult { - let class_hash = starknet::Store::::read(address_domain, base)?; - starknet::SyscallResult::Ok( - INominalTraitLibraryDispatcher { - class_hash, - } - ) - } - fn write(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, value: INominalTraitLibraryDispatcher) -> starknet::SyscallResult<()> { - starknet::Store::::write(address_domain, base, value.class_hash)?; - starknet::SyscallResult::Ok(()) - } - fn read_at_offset(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, offset: u8) -> starknet::SyscallResult { - let class_hash = starknet::Store::::read_at_offset(address_domain, base, offset)?; - starknet::SyscallResult::Ok( - INominalTraitLibraryDispatcher { - class_hash, - } - ) - } - #[inline(always)] - fn write_at_offset(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, offset: u8, value: INominalTraitLibraryDispatcher) -> starknet::SyscallResult<()> { - starknet::Store::::write_at_offset(address_domain, base, offset, value.class_hash)?; - starknet::SyscallResult::Ok(()) - } - #[inline(always)] - fn size() -> u8 { - starknet::Store::::size() - } -} - -#[derive(Drop, Copy)] -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.__storage_pointer_address__; - let mut current_offset = self.__storage_pointer_offset__; - let __class_hash_value__ = starknet::storage::StoragePointer { - __storage_pointer_address__: base_address, - __storage_pointer_offset__: current_offset, - }; - INominalTraitLibraryDispatcherSubPointers { - class_hash: __class_hash_value__, - } - } -} -#[derive(Drop, Copy)] -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 { - __storage_pointer_address__: base_address, - __storage_pointer_offset__: current_offset, - }; - INominalTraitLibraryDispatcherSubPointersMut { - class_hash: __class_hash_value__, - } - } -} -impl INominalTraitSafeLibraryDispatcherCopy of core::traits::Copy::; -impl INominalTraitSafeLibraryDispatcherDrop of core::traits::Drop::; -impl INominalTraitSafeLibraryDispatcherSerde of core::serde::Serde:: { - fn serialize(self: @INominalTraitSafeLibraryDispatcher, ref output: core::array::Array) { - core::serde::Serde::serialize(self.class_hash, ref output) - } - fn deserialize(ref serialized: core::array::Span) -> core::option::Option { - core::option::Option::Some(INominalTraitSafeLibraryDispatcher { - class_hash: core::serde::Serde::deserialize(ref serialized)?, - }) - } -} -impl StoreINominalTraitSafeLibraryDispatcher of starknet::Store:: { - fn read(address_domain: u32, base: starknet::storage_access::StorageBaseAddress) -> starknet::SyscallResult { - let class_hash = starknet::Store::::read(address_domain, base)?; - starknet::SyscallResult::Ok( - INominalTraitSafeLibraryDispatcher { - class_hash, - } - ) - } - fn write(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, value: INominalTraitSafeLibraryDispatcher) -> starknet::SyscallResult<()> { - starknet::Store::::write(address_domain, base, value.class_hash)?; - starknet::SyscallResult::Ok(()) - } - fn read_at_offset(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, offset: u8) -> starknet::SyscallResult { - let class_hash = starknet::Store::::read_at_offset(address_domain, base, offset)?; - starknet::SyscallResult::Ok( - INominalTraitSafeLibraryDispatcher { - class_hash, - } - ) - } - #[inline(always)] - fn write_at_offset(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, offset: u8, value: INominalTraitSafeLibraryDispatcher) -> starknet::SyscallResult<()> { - starknet::Store::::write_at_offset(address_domain, base, offset, value.class_hash)?; - starknet::SyscallResult::Ok(()) - } - #[inline(always)] - fn size() -> u8 { - starknet::Store::::size() - } -} - -#[derive(Drop, Copy)] -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.__storage_pointer_address__; - let mut current_offset = self.__storage_pointer_offset__; - let __class_hash_value__ = starknet::storage::StoragePointer { - __storage_pointer_address__: base_address, - __storage_pointer_offset__: current_offset, - }; - INominalTraitSafeLibraryDispatcherSubPointers { - class_hash: __class_hash_value__, - } - } -} -#[derive(Drop, Copy)] -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 { - __storage_pointer_address__: base_address, - __storage_pointer_offset__: current_offset, - }; - INominalTraitSafeLibraryDispatcherSubPointersMut { - class_hash: __class_hash_value__, - } - } -} -impl INominalTraitSafeDispatcherCopy of core::traits::Copy::; -impl INominalTraitSafeDispatcherDrop of core::traits::Drop::; -impl INominalTraitSafeDispatcherSerde of core::serde::Serde:: { - fn serialize(self: @INominalTraitSafeDispatcher, ref output: core::array::Array) { - core::serde::Serde::serialize(self.contract_address, ref output) - } - fn deserialize(ref serialized: core::array::Span) -> core::option::Option { - core::option::Option::Some(INominalTraitSafeDispatcher { - contract_address: core::serde::Serde::deserialize(ref serialized)?, - }) - } -} -impl StoreINominalTraitSafeDispatcher of starknet::Store:: { - fn read(address_domain: u32, base: starknet::storage_access::StorageBaseAddress) -> starknet::SyscallResult { - let contract_address = starknet::Store::::read(address_domain, base)?; - starknet::SyscallResult::Ok( - INominalTraitSafeDispatcher { - contract_address, - } - ) - } - fn write(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, value: INominalTraitSafeDispatcher) -> starknet::SyscallResult<()> { - starknet::Store::::write(address_domain, base, value.contract_address)?; - starknet::SyscallResult::Ok(()) - } - fn read_at_offset(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, offset: u8) -> starknet::SyscallResult { - let contract_address = starknet::Store::::read_at_offset(address_domain, base, offset)?; - starknet::SyscallResult::Ok( - INominalTraitSafeDispatcher { - contract_address, - } - ) - } - #[inline(always)] - fn write_at_offset(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, offset: u8, value: INominalTraitSafeDispatcher) -> starknet::SyscallResult<()> { - starknet::Store::::write_at_offset(address_domain, base, offset, value.contract_address)?; - starknet::SyscallResult::Ok(()) - } - #[inline(always)] - fn size() -> u8 { - starknet::Store::::size() - } -} - -#[derive(Drop, Copy)] -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.__storage_pointer_address__; - let mut current_offset = self.__storage_pointer_offset__; - let __contract_address_value__ = starknet::storage::StoragePointer { - __storage_pointer_address__: base_address, - __storage_pointer_offset__: current_offset, - }; - INominalTraitSafeDispatcherSubPointers { - contract_address: __contract_address_value__, - } - } -} -#[derive(Drop, Copy)] -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 { - __storage_pointer_address__: base_address, - __storage_pointer_offset__: current_offset, - }; - INominalTraitSafeDispatcherSubPointersMut { - contract_address: __contract_address_value__, - } - } -} -impl IFaultyTraitDispatcherCopy of core::traits::Copy::; -impl IFaultyTraitDispatcherDrop of core::traits::Drop::; -impl IFaultyTraitDispatcherSerde of core::serde::Serde:: { - fn serialize(self: @IFaultyTraitDispatcher, ref output: core::array::Array) { - core::serde::Serde::serialize(self.contract_address, ref output) - } - fn deserialize(ref serialized: core::array::Span) -> core::option::Option { - core::option::Option::Some(IFaultyTraitDispatcher { - contract_address: core::serde::Serde::deserialize(ref serialized)?, - }) - } -} -impl StoreIFaultyTraitDispatcher of starknet::Store:: { - fn read(address_domain: u32, base: starknet::storage_access::StorageBaseAddress) -> starknet::SyscallResult { - let contract_address = starknet::Store::::read(address_domain, base)?; - starknet::SyscallResult::Ok( - IFaultyTraitDispatcher { - contract_address, - } - ) - } - fn write(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, value: IFaultyTraitDispatcher) -> starknet::SyscallResult<()> { - starknet::Store::::write(address_domain, base, value.contract_address)?; - starknet::SyscallResult::Ok(()) - } - fn read_at_offset(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, offset: u8) -> starknet::SyscallResult { - let contract_address = starknet::Store::::read_at_offset(address_domain, base, offset)?; - starknet::SyscallResult::Ok( - IFaultyTraitDispatcher { - contract_address, - } - ) - } - #[inline(always)] - fn write_at_offset(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, offset: u8, value: IFaultyTraitDispatcher) -> starknet::SyscallResult<()> { - starknet::Store::::write_at_offset(address_domain, base, offset, value.contract_address)?; - starknet::SyscallResult::Ok(()) - } - #[inline(always)] - fn size() -> u8 { - starknet::Store::::size() - } -} - -#[derive(Drop, Copy)] -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.__storage_pointer_address__; - let mut current_offset = self.__storage_pointer_offset__; - let __contract_address_value__ = starknet::storage::StoragePointer { - __storage_pointer_address__: base_address, - __storage_pointer_offset__: current_offset, - }; - IFaultyTraitDispatcherSubPointers { - contract_address: __contract_address_value__, - } - } -} -#[derive(Drop, Copy)] -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 { - __storage_pointer_address__: base_address, - __storage_pointer_offset__: current_offset, - }; - IFaultyTraitDispatcherSubPointersMut { - contract_address: __contract_address_value__, - } - } -} -impl IFaultyTraitLibraryDispatcherCopy of core::traits::Copy::; -impl IFaultyTraitLibraryDispatcherDrop of core::traits::Drop::; -impl IFaultyTraitLibraryDispatcherSerde of core::serde::Serde:: { - fn serialize(self: @IFaultyTraitLibraryDispatcher, ref output: core::array::Array) { - core::serde::Serde::serialize(self.class_hash, ref output) - } - fn deserialize(ref serialized: core::array::Span) -> core::option::Option { - core::option::Option::Some(IFaultyTraitLibraryDispatcher { - class_hash: core::serde::Serde::deserialize(ref serialized)?, - }) - } -} -impl StoreIFaultyTraitLibraryDispatcher of starknet::Store:: { - fn read(address_domain: u32, base: starknet::storage_access::StorageBaseAddress) -> starknet::SyscallResult { - let class_hash = starknet::Store::::read(address_domain, base)?; - starknet::SyscallResult::Ok( - IFaultyTraitLibraryDispatcher { - class_hash, - } - ) - } - fn write(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, value: IFaultyTraitLibraryDispatcher) -> starknet::SyscallResult<()> { - starknet::Store::::write(address_domain, base, value.class_hash)?; - starknet::SyscallResult::Ok(()) - } - fn read_at_offset(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, offset: u8) -> starknet::SyscallResult { - let class_hash = starknet::Store::::read_at_offset(address_domain, base, offset)?; - starknet::SyscallResult::Ok( - IFaultyTraitLibraryDispatcher { - class_hash, - } - ) - } - #[inline(always)] - fn write_at_offset(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, offset: u8, value: IFaultyTraitLibraryDispatcher) -> starknet::SyscallResult<()> { - starknet::Store::::write_at_offset(address_domain, base, offset, value.class_hash)?; - starknet::SyscallResult::Ok(()) - } - #[inline(always)] - fn size() -> u8 { - starknet::Store::::size() - } -} - -#[derive(Drop, Copy)] -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.__storage_pointer_address__; - let mut current_offset = self.__storage_pointer_offset__; - let __class_hash_value__ = starknet::storage::StoragePointer { - __storage_pointer_address__: base_address, - __storage_pointer_offset__: current_offset, - }; - IFaultyTraitLibraryDispatcherSubPointers { - class_hash: __class_hash_value__, - } - } -} -#[derive(Drop, Copy)] -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 { - __storage_pointer_address__: base_address, - __storage_pointer_offset__: current_offset, - }; - IFaultyTraitLibraryDispatcherSubPointersMut { - class_hash: __class_hash_value__, - } - } -} -impl IFaultyTraitSafeLibraryDispatcherCopy of core::traits::Copy::; -impl IFaultyTraitSafeLibraryDispatcherDrop of core::traits::Drop::; -impl IFaultyTraitSafeLibraryDispatcherSerde of core::serde::Serde:: { - fn serialize(self: @IFaultyTraitSafeLibraryDispatcher, ref output: core::array::Array) { - core::serde::Serde::serialize(self.class_hash, ref output) - } - fn deserialize(ref serialized: core::array::Span) -> core::option::Option { - core::option::Option::Some(IFaultyTraitSafeLibraryDispatcher { - class_hash: core::serde::Serde::deserialize(ref serialized)?, - }) - } -} -impl StoreIFaultyTraitSafeLibraryDispatcher of starknet::Store:: { - fn read(address_domain: u32, base: starknet::storage_access::StorageBaseAddress) -> starknet::SyscallResult { - let class_hash = starknet::Store::::read(address_domain, base)?; - starknet::SyscallResult::Ok( - IFaultyTraitSafeLibraryDispatcher { - class_hash, - } - ) - } - fn write(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, value: IFaultyTraitSafeLibraryDispatcher) -> starknet::SyscallResult<()> { - starknet::Store::::write(address_domain, base, value.class_hash)?; - starknet::SyscallResult::Ok(()) - } - fn read_at_offset(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, offset: u8) -> starknet::SyscallResult { - let class_hash = starknet::Store::::read_at_offset(address_domain, base, offset)?; - starknet::SyscallResult::Ok( - IFaultyTraitSafeLibraryDispatcher { - class_hash, - } - ) - } - #[inline(always)] - fn write_at_offset(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, offset: u8, value: IFaultyTraitSafeLibraryDispatcher) -> starknet::SyscallResult<()> { - starknet::Store::::write_at_offset(address_domain, base, offset, value.class_hash)?; - starknet::SyscallResult::Ok(()) - } - #[inline(always)] - fn size() -> u8 { - starknet::Store::::size() - } -} - -#[derive(Drop, Copy)] -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.__storage_pointer_address__; - let mut current_offset = self.__storage_pointer_offset__; - let __class_hash_value__ = starknet::storage::StoragePointer { - __storage_pointer_address__: base_address, - __storage_pointer_offset__: current_offset, - }; - IFaultyTraitSafeLibraryDispatcherSubPointers { - class_hash: __class_hash_value__, - } - } -} -#[derive(Drop, Copy)] -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 { - __storage_pointer_address__: base_address, - __storage_pointer_offset__: current_offset, - }; - IFaultyTraitSafeLibraryDispatcherSubPointersMut { - class_hash: __class_hash_value__, - } - } -} -impl IFaultyTraitSafeDispatcherCopy of core::traits::Copy::; -impl IFaultyTraitSafeDispatcherDrop of core::traits::Drop::; -impl IFaultyTraitSafeDispatcherSerde of core::serde::Serde:: { - fn serialize(self: @IFaultyTraitSafeDispatcher, ref output: core::array::Array) { - core::serde::Serde::serialize(self.contract_address, ref output) - } - fn deserialize(ref serialized: core::array::Span) -> core::option::Option { - core::option::Option::Some(IFaultyTraitSafeDispatcher { - contract_address: core::serde::Serde::deserialize(ref serialized)?, - }) - } -} -impl StoreIFaultyTraitSafeDispatcher of starknet::Store:: { - fn read(address_domain: u32, base: starknet::storage_access::StorageBaseAddress) -> starknet::SyscallResult { - let contract_address = starknet::Store::::read(address_domain, base)?; - starknet::SyscallResult::Ok( - IFaultyTraitSafeDispatcher { - contract_address, - } - ) - } - fn write(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, value: IFaultyTraitSafeDispatcher) -> starknet::SyscallResult<()> { - starknet::Store::::write(address_domain, base, value.contract_address)?; - starknet::SyscallResult::Ok(()) - } - fn read_at_offset(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, offset: u8) -> starknet::SyscallResult { - let contract_address = starknet::Store::::read_at_offset(address_domain, base, offset)?; - starknet::SyscallResult::Ok( - IFaultyTraitSafeDispatcher { - contract_address, - } - ) - } - #[inline(always)] - fn write_at_offset(address_domain: u32, base: starknet::storage_access::StorageBaseAddress, offset: u8, value: IFaultyTraitSafeDispatcher) -> starknet::SyscallResult<()> { - starknet::Store::::write_at_offset(address_domain, base, offset, value.contract_address)?; - starknet::SyscallResult::Ok(()) - } - #[inline(always)] - fn size() -> u8 { - starknet::Store::::size() - } -} - -#[derive(Drop, Copy)] -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.__storage_pointer_address__; - let mut current_offset = self.__storage_pointer_offset__; - let __contract_address_value__ = starknet::storage::StoragePointer { - __storage_pointer_address__: base_address, - __storage_pointer_offset__: current_offset, - }; - IFaultyTraitSafeDispatcherSubPointers { - contract_address: __contract_address_value__, - } - } -} -#[derive(Drop, Copy)] -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 { - __storage_pointer_address__: base_address, - __storage_pointer_offset__: current_offset, - }; - IFaultyTraitSafeDispatcherSubPointersMut { - contract_address: __contract_address_value__, - } - } -} -impl IEmptyTraitDispatcherSubPointersDrop of core::traits::Drop::; -impl IEmptyTraitDispatcherSubPointersCopy 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 IEmptyTraitLibraryDispatcherSubPointersMutDrop of core::traits::Drop::; -impl IEmptyTraitLibraryDispatcherSubPointersMutCopy of core::traits::Copy::; -impl IEmptyTraitSafeLibraryDispatcherSubPointersDrop of core::traits::Drop::; -impl IEmptyTraitSafeLibraryDispatcherSubPointersCopy 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 IEmptyTraitSafeDispatcherSubPointersMutDrop of core::traits::Drop::; -impl IEmptyTraitSafeDispatcherSubPointersMutCopy of core::traits::Copy::; -impl IFaultyTraitDispatcherSubPointersDrop of core::traits::Drop::; -impl IFaultyTraitDispatcherSubPointersCopy 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 IFaultyTraitLibraryDispatcherSubPointersMutDrop of core::traits::Drop::; -impl IFaultyTraitLibraryDispatcherSubPointersMutCopy of core::traits::Copy::; -impl IFaultyTraitSafeLibraryDispatcherSubPointersDrop of core::traits::Drop::; -impl IFaultyTraitSafeLibraryDispatcherSubPointersCopy 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 IFaultyTraitSafeDispatcherSubPointersMutDrop of core::traits::Drop::; -impl IFaultyTraitSafeDispatcherSubPointersMutCopy of core::traits::Copy::; -impl INominalTraitDispatcherSubPointersDrop of core::traits::Drop::; -impl INominalTraitDispatcherSubPointersCopy 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 INominalTraitLibraryDispatcherSubPointersMutDrop of core::traits::Drop::; -impl INominalTraitLibraryDispatcherSubPointersMutCopy of core::traits::Copy::; -impl INominalTraitSafeLibraryDispatcherSubPointersDrop of core::traits::Drop::; -impl INominalTraitSafeLibraryDispatcherSubPointersCopy 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 INominalTraitSafeDispatcherSubPointersMutDrop of core::traits::Drop::; -impl INominalTraitSafeDispatcherSubPointersMutCopy of core::traits::Copy::; -impl IFaultyTraitDispatcherSubPointersDrop of core::traits::Drop::; -impl IFaultyTraitDispatcherSubPointersCopy 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 IFaultyTraitLibraryDispatcherSubPointersMutDrop of core::traits::Drop::; -impl IFaultyTraitLibraryDispatcherSubPointersMutCopy of core::traits::Copy::; -impl IFaultyTraitSafeLibraryDispatcherSubPointersDrop of core::traits::Drop::; -impl IFaultyTraitSafeLibraryDispatcherSubPointersCopy 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 IFaultyTraitSafeDispatcherSubPointersMutDrop of core::traits::Drop::; -impl IFaultyTraitSafeDispatcherSubPointersMutCopy of core::traits::Copy::; diff --git a/crates/dojo/lang/src/semantics/mod.rs b/crates/dojo/lang/src/semantics/mod.rs deleted file mode 100644 index 4c120c8d6f..0000000000 --- a/crates/dojo/lang/src/semantics/mod.rs +++ /dev/null @@ -1,7 +0,0 @@ -// pub mod utils; - -// #[cfg(test)] -// pub mod test_utils; - -// #[cfg(test)] -// pub mod tests; diff --git a/crates/dojo/lang/src/semantics/test_data/get b/crates/dojo/lang/src/semantics/test_data/get deleted file mode 100644 index fb404d8b4f..0000000000 --- a/crates/dojo/lang/src/semantics/test_data/get +++ /dev/null @@ -1,175 +0,0 @@ -//! > Test no params - -//! > test_runner_name -test_semantics - -//! > setup_code -use array::ArrayTrait; -use dojo::world::{IWorldDispatcher, IWorldDispatcherTrait}; - -#[derive(Copy, Drop, Serde, Introspect)] -struct Health { - #[key] - id: u32, - health: u16, -} - -//! > function_code -let key: felt252 = 0xb0b; -let world = IWorldDispatcher{contract_address: 0x0.try_into().unwrap()}; - -//! > expression -get!() - -//! > expected -Missing( - ExprMissing { - ty: , - }, -) - -//! > semantic_diagnostics -error: Plugin diagnostic: Invalid arguments. Expected "get!(world, keys, (models,))" - --> lib.cairo:12:1 -get!() -^****^ - -warning[E0001]: Unused variable. Consider ignoring by prefixing with `_`. - --> lib.cairo:10:22 -fn test_func() { let key: felt252 = 0xb0b; - ^*^ - -warning[E0001]: Unused variable. Consider ignoring by prefixing with `_`. - --> lib.cairo:11:5 -let world = IWorldDispatcher{contract_address: 0x0.try_into().unwrap()}; { - ^***^ - -//! > ========================================================================== - -//! > Test wrong params - -//! > test_runner_name -test_semantics - -//! > setup_code -use array::ArrayTrait; -use dojo::world::{IWorldDispatcher, IWorldDispatcherTrait}; - -#[derive(Copy, Drop, Serde, Introspect)] -struct Health { - #[key] - id: u32, - health: u16, -} - -//! > function_code -let key: felt252 = 0xb0b; -let world = IWorldDispatcher{contract_address: 0x0.try_into().unwrap()}; - -//! > expression -get!(world) - -//! > expected -Missing( - ExprMissing { - ty: , - }, -) - -//! > semantic_diagnostics -error: Plugin diagnostic: Invalid arguments. Expected "get!(world, keys, (models,))" - --> lib.cairo:12:1 -get!(world) -^*********^ - -warning[E0001]: Unused variable. Consider ignoring by prefixing with `_`. - --> lib.cairo:10:22 -fn test_func() { let key: felt252 = 0xb0b; - ^*^ - -warning[E0001]: Unused variable. Consider ignoring by prefixing with `_`. - --> lib.cairo:11:5 -let world = IWorldDispatcher{contract_address: 0x0.try_into().unwrap()}; { - ^***^ - -//! > ========================================================================== - -//! > Test world and keys - -//! > no_diagnostics -true - -//! > dojo_semantic -get_success - -//! > test_runner_name -test_semantics - -//! > setup_code -use array::ArrayTrait; -use dojo::world::{IWorldDispatcher, IWorldDispatcherTrait}; - -#[derive(Copy, Drop, Serde, Introspect)] -struct Health { - #[key] - id: u32, - health: u16, -} - -//! > function_code -let key: felt252 = 0xb0b; -let world = IWorldDispatcher{contract_address: 0x0.try_into().unwrap()}; - -//! > expression -get!(world, key, (Health)) - -//! > expected -Block( - ExprBlock { - statements: [ - Let( - StatementLet { - pattern: Variable( - __Health, - ), - expr: FunctionCall( - ExprFunctionCall { - function: ?4::get::, - args: [ - Value( - Snapshot( - ExprSnapshot { - inner: Var( - LocalVarId(test::world), - ), - ty: @dojo::world::iworld::IWorldDispatcher, - }, - ), - ), - Value( - Var( - LocalVarId(test::key), - ), - ), - ], - coupon_arg: None, - ty: test::Health, - }, - ), - }, - ), - ], - tail: Some( - Var( - LocalVarId(test::__Health), - ), - ), - ty: test::Health, - }, -) - -//! > semantic_diagnostics -error: Trait has no implementation in context: dojo::model::model::ModelStore::. - --> lib.cairo:12:1 -get!(world, key, (Health)) -^************************^ diff --git a/crates/dojo/lang/src/semantics/test_data/get_models_test_class_hashes b/crates/dojo/lang/src/semantics/test_data/get_models_test_class_hashes deleted file mode 100644 index b70f7b851f..0000000000 --- a/crates/dojo/lang/src/semantics/test_data/get_models_test_class_hashes +++ /dev/null @@ -1,89 +0,0 @@ -//! > Test ok empty (expected to fail due to missing dojo_manifests_dir) - -//! > test_runner_name -test_semantics - -//! > expression -get_models_test_class_hashes!() - -//! > expected -Missing( - ExprMissing { - ty: , - }, -) - -//! > semantic_diagnostics -error: Plugin diagnostic: Failed to load models and namespaces, ensure you have run `sozo build` first. - --> lib.cairo:2:1 -get_models_test_class_hashes!() -^*****************************^ - -//! > ========================================================================== - -//! > Test bad params - -//! > test_runner_name -test_semantics - -//! > expression -get_models_test_class_hashes!("ns1") - -//! > expected -Missing( - ExprMissing { - ty: , - }, -) - -//! > semantic_diagnostics -error: Plugin diagnostic: The list of namespaces should be a fixed size array of strings. - --> lib.cairo:2:31 -get_models_test_class_hashes!("ns1") - ^***^ - -//! > ========================================================================== - -//! > Test too much params - -//! > test_runner_name -test_semantics - -//! > expression -get_models_test_class_hashes!("ns1", ["ns2"]) - -//! > expected -Missing( - ExprMissing { - ty: , - }, -) - -//! > semantic_diagnostics -error: Plugin diagnostic: Invalid arguments. Expected "get_models_test_class_hashes!(["ns1", "ns2")]" or "get_models_test_class_hashes!()". - --> lib.cairo:2:1 -get_models_test_class_hashes!("ns1", ["ns2"]) -^*******************************************^ - -//! > ========================================================================== - -//! > Test ok array (expected to fail due to missing dojo_manifests_dir) - -//! > test_runner_name -test_semantics - -//! > expression -get_models_test_class_hashes!(["ns1", "ns2"]) - -//! > expected -Missing( - ExprMissing { - ty: , - }, -) - -//! > semantic_diagnostics -error: Plugin diagnostic: Failed to load models and namespaces, ensure you have run `sozo build` first. - --> lib.cairo:2:1 -get_models_test_class_hashes!(["ns1", "ns2"]) -^*******************************************^ diff --git a/crates/dojo/lang/src/semantics/test_data/selector_from_tag b/crates/dojo/lang/src/semantics/test_data/selector_from_tag deleted file mode 100644 index a5694605de..0000000000 --- a/crates/dojo/lang/src/semantics/test_data/selector_from_tag +++ /dev/null @@ -1,86 +0,0 @@ -//! > Test ok - -//! > test_runner_name -test_semantics - -//! > expression -selector_from_tag!("dojo-test_contract") - -//! > expected -Literal( - ExprLiteral { - value: 2368393732245529956313345237151518608283468650081902115301417183793437311044, - ty: core::felt252, - }, -) - -//! > semantic_diagnostics - -//! > ========================================================================== - -//! > Test no params - -//! > test_runner_name -test_semantics - -//! > expression -selector_from_tag!() - -//! > expected -Missing( - ExprMissing { - ty: , - }, -) - -//! > semantic_diagnostics -error: Plugin diagnostic: Invalid arguments. Expected "selector_from_tag!("tag")" - --> lib.cairo:2:1 -selector_from_tag!() -^******************^ - -//! > ========================================================================== - -//! > Test invalid tag - -//! > test_runner_name -test_semantics - -//! > expression -selector_from_tag!("invalid tag") - -//! > expected -Missing( - ExprMissing { - ty: , - }, -) - -//! > semantic_diagnostics -error: Plugin diagnostic: Invalid tag. Tag must be in the format of `namespace-name`. - --> lib.cairo:2:1 -selector_from_tag!("invalid tag") -^*******************************^ - -//! > ========================================================================== - -//! > Test wrong param - -//! > test_runner_name -test_semantics - -//! > expression -selector_from_tag!("name", "namespace") - -//! > expected -Missing( - ExprMissing { - ty: , - }, -) - -//! > semantic_diagnostics -error: Plugin diagnostic: Invalid arguments. Expected "selector_from_tag!("tag")" - --> lib.cairo:2:1 -selector_from_tag!("name", "namespace") -^*************************************^ diff --git a/crates/dojo/lang/src/semantics/test_data/set b/crates/dojo/lang/src/semantics/test_data/set deleted file mode 100644 index a6e9918296..0000000000 --- a/crates/dojo/lang/src/semantics/test_data/set +++ /dev/null @@ -1,147 +0,0 @@ -//! > no params - -//! > test_runner_name -test_semantics - -//! > setup_code - -//! > function_code - -//! > expression -set!() - -//! > expected -Missing( - ExprMissing { - ty: , - }, -) - -//! > semantic_diagnostics -error: Plugin diagnostic: Invalid arguments. Expected "(world, (models,))" - --> lib.cairo:2:6 -set!() - ^ - -//! > ========================================================================== - -//! > incorrect args - -//! > test_runner_name -test_semantics - -//! > setup_code - -//! > function_code - -//! > expression -set!(world) - -//! > expected -Missing( - ExprMissing { - ty: , - }, -) - -//! > semantic_diagnostics -error: Plugin diagnostic: Invalid arguments. Expected "(world, (models,))" - --> lib.cairo:2:6 -set!(world) - ^***^ - -//! > ========================================================================== - -//! > set successful expansion - -//! > no_diagnostics -true - -//! > test_runner_name -test_semantics - -//! > setup_code -use dojo::world::{IWorldDispatcher, IWorldDispatcherTrait}; - -#[derive(Copy, Drop, Serde)] -#[dojo::model] -struct Health { - #[key] - id: u32, - health: u16, -} - -//! > function_code -let key: felt252 = 0xb0b; -let world = IWorldDispatcher{contract_address: 0x0.try_into().unwrap()}; - -//! > expression -set!(world, (Health{id: 0xb0b, health: 79})) - -//! > expected -Block( - ExprBlock { - statements: [ - Expr( - StatementExpr { - expr: FunctionCall( - ExprFunctionCall { - function: dojo::model::model::ModelStoreImpl::, test::HealthSerde>, test::HealthDrop>::set, - args: [ - Value( - Var( - LocalVarId(test::world), - ), - ), - Value( - Snapshot( - ExprSnapshot { - inner: StructCtor( - ExprStructCtor { - concrete_struct_id: test::Health, - members: [ - ( - MemberId(test::id), - Literal( - ExprLiteral { - value: 2827, - ty: core::integer::u32, - }, - ), - ), - ( - MemberId(test::health), - Literal( - ExprLiteral { - value: 79, - ty: core::integer::u16, - }, - ), - ), - ], - base_struct: None, - ty: test::Health, - }, - ), - ty: @test::Health, - }, - ), - ), - ], - coupon_arg: None, - ty: (), - }, - ), - }, - ), - ], - tail: None, - ty: (), - }, -) - -//! > semantic_diagnostics -warning[E0001]: Unused variable. Consider ignoring by prefixing with `_`. - --> lib.cairo:10:22 -fn test_func() { let key: felt252 = 0xb0b; - ^*^ diff --git a/crates/dojo/lang/src/semantics/test_data/spawn_test_world b/crates/dojo/lang/src/semantics/test_data/spawn_test_world deleted file mode 100644 index f97089dfd8..0000000000 --- a/crates/dojo/lang/src/semantics/test_data/spawn_test_world +++ /dev/null @@ -1,66 +0,0 @@ -//! > Test ok empty (expected to fail due to missing dojo_manifests_dir) - -//! > test_runner_name -test_semantics - -//! > expression -spawn_test_world!() - -//! > expected -Missing( - ExprMissing { - ty: , - }, -) - -//! > semantic_diagnostics -error: Plugin diagnostic: failed to load models and namespaces, ensure you have run `sozo build` first. - --> lib.cairo:2:1 -spawn_test_world!() -^*****************^ - -//! > ========================================================================== - -//! > Test bad params - -//! > test_runner_name -test_semantics - -//! > expression -spawn_test_world!("ns1", "ns2") - -//! > expected -Missing( - ExprMissing { - ty: , - }, -) - -//! > semantic_diagnostics -error: Plugin diagnostic: Invalid arguments. Expected "spawn_test_world!()" or "spawn_test_world!(["ns1"]) - --> lib.cairo:2:1 -spawn_test_world!("ns1", "ns2") -^*****************************^ - -//! > ========================================================================== - -//! > Test ok namespaces - -//! > test_runner_name -test_semantics - -//! > expression -spawn_test_world!(["ns1", "ns2"]) - -//! > expected -Missing( - ExprMissing { - ty: , - }, -) - -//! > semantic_diagnostics -error: Plugin diagnostic: failed to load models and namespaces, ensure you have run `sozo build` first. - --> lib.cairo:2:1 -spawn_test_world!(["ns1", "ns2"]) -^*******************************^ diff --git a/crates/dojo/lang/src/semantics/test_utils.rs b/crates/dojo/lang/src/semantics/test_utils.rs deleted file mode 100644 index be667a30b2..0000000000 --- a/crates/dojo/lang/src/semantics/test_utils.rs +++ /dev/null @@ -1,344 +0,0 @@ -use std::collections::BTreeMap; -use std::path::PathBuf; -use std::sync::{Arc, Mutex}; - -use cairo_lang_defs::db::{ext_as_virtual_impl, DefsDatabase, DefsGroup}; -use cairo_lang_defs::ids::{FunctionWithBodyId, ModuleId}; -use cairo_lang_diagnostics::{Diagnostics, DiagnosticsBuilder}; -use cairo_lang_filesystem::db::{ - init_dev_corelib, init_files_group, AsFilesGroupMut, CrateConfiguration, ExternalFiles, - FilesDatabase, FilesGroup, FilesGroupEx, -}; -use cairo_lang_filesystem::ids::{ - CrateId, CrateLongId, Directory, FileKind, FileLongId, VirtualFile, -}; -use cairo_lang_parser::db::{ParserDatabase, ParserGroup}; -use cairo_lang_semantic::db::{SemanticDatabase, SemanticGroup}; -use cairo_lang_semantic::inline_macros::get_default_plugin_suite; -use cairo_lang_semantic::items::functions::GenericFunctionId; -use cairo_lang_semantic::{ConcreteFunctionWithBodyId, SemanticDiagnostic}; -use cairo_lang_starknet::starknet_plugin_suite; -use cairo_lang_syntax::node::db::{SyntaxDatabase, SyntaxGroup}; -use cairo_lang_utils::ordered_hash_map::OrderedHashMap; -use cairo_lang_utils::{extract_matches, OptionFrom, Upcast}; -use camino::Utf8PathBuf; -use once_cell::sync::Lazy; -use scarb::compiler::Profile; - -use crate::compiler::test_utils::{build_test_config, corelib}; -use crate::plugin::dojo_plugin_suite; - -#[salsa::database(SemanticDatabase, DefsDatabase, ParserDatabase, SyntaxDatabase, FilesDatabase)] -#[allow(missing_debug_implementations)] -pub struct DojoSemanticDatabase { - storage: salsa::Storage, -} -impl salsa::Database for DojoSemanticDatabase {} -impl ExternalFiles for DojoSemanticDatabase { - fn ext_as_virtual(&self, external_id: salsa::InternId) -> VirtualFile { - ext_as_virtual_impl(self.upcast(), external_id) - } -} -impl salsa::ParallelDatabase for DojoSemanticDatabase { - fn snapshot(&self) -> salsa::Snapshot { - salsa::Snapshot::new(DojoSemanticDatabase { storage: self.storage.snapshot() }) - } -} - -impl DojoSemanticDatabase { - pub fn new_empty() -> Self { - let mut db = DojoSemanticDatabase { storage: Default::default() }; - init_files_group(&mut db); - - let mut suite = get_default_plugin_suite(); - suite.add(starknet_plugin_suite()); - suite.add(dojo_plugin_suite()); - - db.set_macro_plugins(suite.plugins); - db.set_inline_macro_plugins(suite.inline_macro_plugins.into()); - db.set_analyzer_plugins(suite.analyzer_plugins); - - let dojo_path = Utf8PathBuf::from_path_buf("../../crates/contracts/src".into()).unwrap(); - let dojo_path: PathBuf = dojo_path.canonicalize_utf8().unwrap().into(); - let dojo_scarb_manifest = dojo_path.parent().unwrap().join("Scarb.toml"); - let core_crate = db.intern_crate(CrateLongId::Real("dojo".into())); - let core_root_dir = Directory::Real(dojo_path); - - // Use a config to detect the corelib. - let config = - build_test_config(dojo_scarb_manifest.to_str().unwrap(), Profile::DEV).unwrap(); - - // Ensure the crate[0] is dojo, to enable parsing of the Scarb.toml. - db.set_crate_config(core_crate, Some(CrateConfiguration::default_for_root(core_root_dir))); - - init_dev_corelib(&mut db, corelib(&config)); - db - } - /// Snapshots the db for read only. - pub fn snapshot(&self) -> DojoSemanticDatabase { - DojoSemanticDatabase { storage: self.storage.snapshot() } - } -} - -pub static SHARED_DB: Lazy> = - Lazy::new(|| Mutex::new(DojoSemanticDatabase::new_empty())); - -impl Default for DojoSemanticDatabase { - fn default() -> Self { - SHARED_DB.lock().unwrap().snapshot() - } -} -impl AsFilesGroupMut for DojoSemanticDatabase { - fn as_files_group_mut(&mut self) -> &mut (dyn FilesGroup + 'static) { - self - } -} -impl Upcast for DojoSemanticDatabase { - fn upcast(&self) -> &(dyn FilesGroup + 'static) { - self - } -} -impl Upcast for DojoSemanticDatabase { - fn upcast(&self) -> &(dyn SyntaxGroup + 'static) { - self - } -} -impl Upcast for DojoSemanticDatabase { - fn upcast(&self) -> &(dyn DefsGroup + 'static) { - self - } -} -impl Upcast for DojoSemanticDatabase { - fn upcast(&self) -> &(dyn SemanticGroup + 'static) { - self - } -} -impl Upcast for DojoSemanticDatabase { - fn upcast(&self) -> &(dyn ParserGroup + 'static) { - self - } -} - -#[derive(Debug)] -pub struct WithStringDiagnostics { - value: T, - diagnostics: String, -} -impl WithStringDiagnostics { - /// Verifies that there are no diagnostics (fails otherwise), and returns the inner value. - pub fn unwrap(self) -> T { - assert!(self.diagnostics.is_empty(), "Unexpected diagnostics:\n{}", self.diagnostics); - self.value - } - - /// Returns the inner value and the diagnostics (as a string). - pub fn split(self) -> (T, String) { - (self.value, self.diagnostics) - } - - /// Returns the diagnostics (as a string). - pub fn get_diagnostics(self) -> String { - self.diagnostics - } -} - -/// Helper struct for the return value of [setup_test_module]. -#[derive(Debug)] -pub struct TestModule { - pub crate_id: CrateId, - pub module_id: ModuleId, -} - -/// Sets up a crate with given content, and returns its crate id. -pub fn setup_test_crate(db: &dyn SemanticGroup, content: &str) -> CrateId { - let file_id = db.intern_file(FileLongId::Virtual(VirtualFile { - parent: None, - name: "lib.cairo".into(), - content: content.into(), - code_mappings: Arc::new([]), - kind: FileKind::Module, - })); - - db.intern_crate(CrateLongId::Virtual { - name: "test".into(), - config: CrateConfiguration::default_for_root(Directory::Virtual { - files: BTreeMap::from([("lib.cairo".into(), file_id)]), - dirs: Default::default(), - }), - }) -} - -/// Sets up a module with given content, and returns its module id. -pub fn setup_test_module( - db: &(dyn SemanticGroup + 'static), - content: &str, -) -> WithStringDiagnostics { - let crate_id = setup_test_crate(db, content); - let module_id = ModuleId::CrateRoot(crate_id); - let file_id = db.module_main_file(module_id).unwrap(); - - let syntax_diagnostics = db.file_syntax_diagnostics(file_id).format(Upcast::upcast(db)); - let semantic_diagnostics = db.module_semantic_diagnostics(module_id).unwrap().format(db); - - WithStringDiagnostics { - value: TestModule { crate_id, module_id }, - diagnostics: format!("{syntax_diagnostics}{semantic_diagnostics}"), - } -} - -/// Helper struct for the return value of [setup_test_function]. -#[derive(Debug)] -pub struct TestFunction { - pub module_id: ModuleId, - pub function_id: FunctionWithBodyId, - pub concrete_function_id: ConcreteFunctionWithBodyId, - pub signature: cairo_lang_semantic::Signature, - pub body: cairo_lang_semantic::ExprId, -} - -/// Returns the semantic model of a given function. -/// function_name - name of the function. -/// module_code - extra setup code in the module context. -pub fn setup_test_function( - db: &(dyn SemanticGroup + 'static), - function_code: &str, - function_name: &str, - module_code: &str, -) -> WithStringDiagnostics { - let content = if module_code.is_empty() { - function_code.to_string() - } else { - format!("{module_code}\n{function_code}") - }; - let (test_module, diagnostics) = setup_test_module(db, &content).split(); - let generic_function_id = db - .module_item_by_name(test_module.module_id, function_name.into()) - .expect("Failed to load module") - .and_then(GenericFunctionId::option_from) - .unwrap_or_else(|| panic!("Function '{function_name}' was not found.")); - let free_function_id = extract_matches!(generic_function_id, GenericFunctionId::Free); - let function_id = FunctionWithBodyId::Free(free_function_id); - WithStringDiagnostics { - value: TestFunction { - module_id: test_module.module_id, - function_id, - concrete_function_id: ConcreteFunctionWithBodyId::from_no_generics_free( - db, - free_function_id, - ) - .unwrap(), - signature: db.function_with_body_signature(function_id).unwrap(), - body: db.function_body_expr(function_id).unwrap(), - }, - diagnostics, - } -} - -/// Helper struct for the return value of [setup_test_expr] and [setup_test_block]. -#[derive(Debug)] -pub struct TestExpr { - pub module_id: ModuleId, - pub function_id: FunctionWithBodyId, - pub signature: cairo_lang_semantic::Signature, - pub body: cairo_lang_semantic::ExprId, - pub expr_id: cairo_lang_semantic::ExprId, -} - -/// Returns the semantic model of a given expression. -/// module_code - extra setup code in the module context. -/// function_body - extra setup code in the function context. -pub fn setup_test_expr( - db: &(dyn SemanticGroup + 'static), - expr_code: &str, - module_code: &str, - function_body: &str, -) -> WithStringDiagnostics { - let function_code = format!("fn test_func() {{ {function_body} {{\n{expr_code}\n}}; }}"); - let (test_function, diagnostics) = - setup_test_function(db, &function_code, "test_func", module_code).split(); - let cairo_lang_semantic::ExprBlock { statements, .. } = extract_matches!( - db.expr_semantic(test_function.function_id, test_function.body), - cairo_lang_semantic::Expr::Block - ); - let statement_expr = extract_matches!( - db.statement_semantic(test_function.function_id, *statements.last().unwrap()), - cairo_lang_semantic::Statement::Expr - ); - let cairo_lang_semantic::ExprBlock { statements, tail, .. } = extract_matches!( - db.expr_semantic(test_function.function_id, statement_expr.expr), - cairo_lang_semantic::Expr::Block - ); - assert!( - statements.is_empty(), - "expr_code is not a valid expression. Consider using setup_test_block()." - ); - WithStringDiagnostics { - value: TestExpr { - module_id: test_function.module_id, - function_id: test_function.function_id, - signature: test_function.signature, - body: test_function.body, - expr_id: tail.unwrap(), - }, - diagnostics, - } -} - -/// Returns the semantic model of a given block expression. -/// module_code - extra setup code in the module context. -/// function_body - extra setup code in the function context. -pub fn setup_test_block( - db: &(dyn SemanticGroup + 'static), - expr_code: &str, - module_code: &str, - function_body: &str, -) -> WithStringDiagnostics { - setup_test_expr(db, &format!("{{ \n{expr_code}\n }}"), module_code, function_body) -} - -pub fn test_expr_diagnostics( - inputs: &OrderedHashMap, - _args: &OrderedHashMap, -) -> Result, String> { - let db = &DojoSemanticDatabase::default(); - Ok(OrderedHashMap::from([( - "expected_diagnostics".into(), - setup_test_expr( - db, - inputs["expr_code"].as_str(), - inputs["module_code"].as_str(), - inputs["function_body"].as_str(), - ) - .get_diagnostics(), - )])) -} - -pub fn test_function_diagnostics( - inputs: &OrderedHashMap, - _args: &OrderedHashMap, -) -> Result, String> { - let db = &DojoSemanticDatabase::default(); - Ok(OrderedHashMap::from([( - "expected_diagnostics".into(), - setup_test_function( - db, - inputs["function"].as_str(), - inputs["function_name"].as_str(), - inputs["module_code"].as_str(), - ) - .get_diagnostics(), - )])) -} - -/// Gets the diagnostics for all the modules (including nested) in the given crate. -pub fn get_crate_semantic_diagnostics( - db: &dyn SemanticGroup, - crate_id: CrateId, -) -> Diagnostics { - let submodules = db.crate_modules(crate_id); - let mut diagnostics = DiagnosticsBuilder::default(); - for submodule_id in submodules.iter() { - diagnostics.extend(db.module_semantic_diagnostics(*submodule_id).unwrap()); - } - diagnostics.build() -} diff --git a/crates/dojo/lang/src/semantics/tests.rs b/crates/dojo/lang/src/semantics/tests.rs deleted file mode 100644 index e45bcf2040..0000000000 --- a/crates/dojo/lang/src/semantics/tests.rs +++ /dev/null @@ -1,57 +0,0 @@ -use cairo_lang_debug::DebugWithDb; -use cairo_lang_semantic::db::SemanticGroup; -use cairo_lang_semantic::expr::fmt::ExprFormatter; -use cairo_lang_semantic::test_utils::setup_test_expr; -use cairo_lang_semantic::Expr; -use cairo_lang_test_utils::parse_test_file::TestRunnerResult; -use cairo_lang_test_utils::test_file_test; -use cairo_lang_utils::ordered_hash_map::OrderedHashMap; - -use super::test_utils::DojoSemanticDatabase; - -test_file_test!( - dojo_semantics, - "src/plugin/semantics/test_data", - { - get: "get", - - set: "set", - - selector_from_tag: "selector_from_tag", - - get_models_test_class_hashes: "get_models_test_class_hashes", - - spawn_test_world: "spawn_test_world", - }, - test_semantics -); - -pub fn test_semantics( - inputs: &OrderedHashMap, - _args: &OrderedHashMap, -) -> TestRunnerResult { - let mut db = DojoSemanticDatabase::default(); - let (expr, diagnostics, expr_formatter) = semantics_test_setup(inputs, &mut db); - - TestRunnerResult::success(OrderedHashMap::from([ - ("expected".into(), format!("{:#?}", expr.debug(&expr_formatter))), - ("semantic_diagnostics".into(), diagnostics), - ])) -} - -pub fn semantics_test_setup<'a>( - inputs: &OrderedHashMap, - db: &'a mut DojoSemanticDatabase, -) -> (Expr, String, ExprFormatter<'a>) { - let (test_expr, diagnostics) = setup_test_expr( - db, - inputs["expression"].as_str(), - inputs.get("setup_code").map(|s| s.as_str()).unwrap_or(""), - inputs.get("function_code").map(|s| s.as_str()).unwrap_or(""), - ) - .split(); - let expr = db.expr_semantic(test_expr.function_id, test_expr.expr_id); - let expr_formatter = ExprFormatter { db, function_id: test_expr.function_id }; - - (expr, diagnostics, expr_formatter) -} diff --git a/crates/dojo/lang/src/semantics/utils.rs b/crates/dojo/lang/src/semantics/utils.rs deleted file mode 100644 index 4e712fe02d..0000000000 --- a/crates/dojo/lang/src/semantics/utils.rs +++ /dev/null @@ -1,24 +0,0 @@ -use cairo_lang_defs::ids::FunctionWithBodyId; -use cairo_lang_semantic as semantic; -use cairo_lang_syntax::node::{ast, SyntaxNode, TypedSyntaxNode}; -use semantic::db::SemanticGroup; -use semantic::items::function_with_body::SemanticExprLookup; - -/// Returns the semantic expression for the current node. -pub fn nearest_semantic_expr( - db: &dyn SemanticGroup, - mut node: SyntaxNode, - function_id: FunctionWithBodyId, -) -> Option { - loop { - let syntax_db = db.upcast(); - if ast::Expr::is_variant(node.kind(syntax_db)) { - let expr_node = ast::Expr::from_syntax_node(syntax_db, node.clone()); - if let Ok(expr_id) = db.lookup_expr_by_ptr(function_id, expr_node.stable_ptr()) { - let semantic_expr = db.expr_semantic(function_id, expr_id); - return Some(semantic_expr); - } - } - node = node.parent()?; - } -} diff --git a/crates/dojo/lang/src/syntax/mod.rs b/crates/dojo/lang/src/syntax/mod.rs deleted file mode 100644 index cfd40715a2..0000000000 --- a/crates/dojo/lang/src/syntax/mod.rs +++ /dev/null @@ -1,3 +0,0 @@ -pub mod self_param; -pub mod utils; -pub mod world_param; diff --git a/crates/dojo/lang/src/syntax/self_param.rs b/crates/dojo/lang/src/syntax/self_param.rs deleted file mode 100644 index a2eac93556..0000000000 --- a/crates/dojo/lang/src/syntax/self_param.rs +++ /dev/null @@ -1,30 +0,0 @@ -use cairo_lang_syntax::node::ast; -use cairo_lang_syntax::node::db::SyntaxGroup; - -use super::utils as syntax_utils; - -pub const SELF_PARAM_NAME: &str = "self"; - -/// Checks if the given function parameter is using `self` instead of `world` param. -/// Adds diagnostic if that case. -/// -/// # Arguments -/// -/// - `db` - The syntax group. -/// - `param_list` - The parameter list of the function. -/// - `fn_diagnostic_item` - The diagnostic item of the function. -/// - `diagnostics` - The diagnostics vector. -/// -/// # Returns -/// -/// - `true` if the function first parameter is `self`. -pub fn check_parameter(db: &dyn SyntaxGroup, param_list: &ast::ParamList) -> bool { - if param_list.elements(db).is_empty() { - return false; - } - - let param_0 = param_list.elements(db)[0].clone(); - let (name, _, _) = syntax_utils::get_parameter_info(db, param_0.clone()); - - name.eq(SELF_PARAM_NAME) -} diff --git a/crates/dojo/lang/src/syntax/utils.rs b/crates/dojo/lang/src/syntax/utils.rs deleted file mode 100644 index d4c8fd2c53..0000000000 --- a/crates/dojo/lang/src/syntax/utils.rs +++ /dev/null @@ -1,26 +0,0 @@ -use cairo_lang_syntax::node::ast::OptionTypeClause; -use cairo_lang_syntax::node::db::SyntaxGroup; -use cairo_lang_syntax::node::{ast, Terminal, TypedSyntaxNode}; - -/// Gets the name, modifiers and type of a function parameter. -/// -/// # Arguments -/// -/// * `db` - The syntax group. -/// * `param` - The parameter. -/// -/// # Returns -/// -/// * A tuple containing the name, modifiers and type of the parameter. -pub fn get_parameter_info(db: &dyn SyntaxGroup, param: ast::Param) -> (String, String, String) { - let name = param.name(db).text(db).trim().to_string(); - let modifiers = param.modifiers(db).as_syntax_node().get_text(db).trim().to_string(); - - let param_type = if let OptionTypeClause::TypeClause(ty) = param.type_clause(db) { - ty.ty(db).as_syntax_node().get_text(db).trim().to_string() - } else { - "()".to_string() - }; - - (name, modifiers, param_type) -} diff --git a/crates/dojo/lang/src/syntax/world_param.rs b/crates/dojo/lang/src/syntax/world_param.rs deleted file mode 100644 index 66ef198a5e..0000000000 --- a/crates/dojo/lang/src/syntax/world_param.rs +++ /dev/null @@ -1,100 +0,0 @@ -use cairo_lang_defs::plugin::PluginDiagnostic; -use cairo_lang_diagnostics::Severity; -use cairo_lang_syntax::node::db::SyntaxGroup; -use cairo_lang_syntax::node::{ast, ids}; - -use super::utils as syntax_utils; - -const WORLD_PARAM_NAME: &str = "world"; -const WORLD_PARAM_TYPE: &str = "IWorldDispatcher"; -const WORLD_PARAM_TYPE_SNAPSHOT: &str = "@IWorldDispatcher"; - -#[derive(Debug, PartialEq, Eq)] -pub enum WorldParamInjectionKind { - None, - View, - External, -} - -/// Checks if the given parameter is the `world` parameter. -/// -/// The `world` must be named `world`, and be placed first in the argument list. -pub fn is_world_param(param_name: &str, param_type: &str) -> bool { - param_name == WORLD_PARAM_NAME - && (param_type == WORLD_PARAM_TYPE || param_type == WORLD_PARAM_TYPE_SNAPSHOT) -} - -/// Extracts the state mutability of a function from the `world` parameter. -/// -/// Checks if the function has only one `world` parameter (or None). -/// The `world` must be named `world`, and be placed first in the argument list. -/// -/// `fn func1(ref world)` // would be external. -/// `fn func2(world)` // would be view. -/// `fn func3()` // would be view. -/// -/// Returns -/// * The [`WorldParamInjectionKind`] determined from the function's params list. -pub fn parse_world_injection( - db: &dyn SyntaxGroup, - param_list: ast::ParamList, - fn_diagnostic_item: ids::SyntaxStablePtrId, - diagnostics: &mut Vec, -) -> WorldParamInjectionKind { - let mut has_world_injected = false; - let mut injection_kind = WorldParamInjectionKind::None; - - param_list.elements(db).iter().enumerate().for_each(|(idx, param)| { - let (name, modifiers, param_type) = syntax_utils::get_parameter_info(db, param.clone()); - - if !is_world_param(&name, ¶m_type) { - if name.eq(super::self_param::SELF_PARAM_NAME) && has_world_injected { - diagnostics.push(PluginDiagnostic { - stable_ptr: fn_diagnostic_item, - message: "You cannot use `self` and `world` parameters together.".to_string(), - severity: Severity::Error, - }); - } - - return; - } - - if has_world_injected { - diagnostics.push(PluginDiagnostic { - stable_ptr: fn_diagnostic_item, - message: "Only one world parameter is allowed".to_string(), - severity: Severity::Error, - }); - - return; - } else { - has_world_injected = true; - } - - if idx != 0 { - diagnostics.push(PluginDiagnostic { - stable_ptr: fn_diagnostic_item, - message: "World parameter must be the first parameter.".to_string(), - severity: Severity::Error, - }); - - return; - } - - if modifiers.contains(&"ref".to_string()) { - injection_kind = WorldParamInjectionKind::External; - } else { - injection_kind = WorldParamInjectionKind::View; - - if param_type == WORLD_PARAM_TYPE { - diagnostics.push(PluginDiagnostic { - stable_ptr: fn_diagnostic_item, - message: "World parameter must be a snapshot if `ref` is not used.".to_string(), - severity: Severity::Error, - }); - } - } - }); - - injection_kind -} diff --git a/crates/dojo/macros/Cargo.toml b/crates/dojo/macros/Cargo.toml new file mode 100644 index 0000000000..1d4387af8c --- /dev/null +++ b/crates/dojo/macros/Cargo.toml @@ -0,0 +1,25 @@ +[package] +name = "dojo-macros" +version = "0.1.0" +edition = "2021" + +[lib] +crate-type = ["cdylib"] + +[dependencies] +#cairo-lang-macro = {git = "https://github.com/software-mansion/scarb", rev="aff99810c37ceb77b61b3bd2ecee14a253a3397e"} +cairo-lang-macro = {git = "https://github.com/remybar/scarb", rev="f6953d5b0690f166011da5f911452922dd835a96"} +cairo-lang-defs.workspace = true +cairo-lang-parser.workspace = true +cairo-lang-plugins.workspace = true +cairo-lang-syntax.workspace = true +cairo-lang-utils.workspace = true +convert_case.workspace = true +dojo-types.workspace = true +serde.workspace = true +serde_json.workspace = true +starknet.workspace = true +starknet-crypto.workspace = true + +[dev-dependencies] +regex = "1.11.1" diff --git a/crates/dojo/lang/Scarb.lock b/crates/dojo/macros/Scarb.lock similarity index 62% rename from crates/dojo/lang/Scarb.lock rename to crates/dojo/macros/Scarb.lock index 2f26886db2..2e5a11a7a4 100644 --- a/crates/dojo/lang/Scarb.lock +++ b/crates/dojo/macros/Scarb.lock @@ -2,5 +2,5 @@ version = 1 [[package]] -name = "dojo_plugin" -version = "2.8.4" +name = "dojo_macros" +version = "0.1.0" diff --git a/crates/dojo/macros/Scarb.toml b/crates/dojo/macros/Scarb.toml new file mode 100644 index 0000000000..17a88dd076 --- /dev/null +++ b/crates/dojo/macros/Scarb.toml @@ -0,0 +1,8 @@ +[package] +name = "dojo_macros" +version = "0.1.0" +description = "Dojo macros" +homepage = "https://github.com/dojoengine/dojo" +edition = "2024_07" + +[cairo-plugin] diff --git a/crates/dojo/macros/src/attributes/constants.rs b/crates/dojo/macros/src/attributes/constants.rs new file mode 100644 index 0000000000..4b9862c151 --- /dev/null +++ b/crates/dojo/macros/src/attributes/constants.rs @@ -0,0 +1,8 @@ +/// Dojo attribute names. +/// Note that, at the moment, these names must match with +/// proc macro function names. +pub const DOJO_CONTRACT_ATTR: &str = "dojo_contract"; +pub const DOJO_EVENT_ATTR: &str = "dojo_event"; +pub const DOJO_MODEL_ATTR: &str = "dojo_model"; + +pub const DOJO_ATTR_NAMES: [&str; 3] = [DOJO_CONTRACT_ATTR, DOJO_EVENT_ATTR, DOJO_MODEL_ATTR]; diff --git a/crates/dojo/macros/src/attributes/dojo_contract.rs b/crates/dojo/macros/src/attributes/dojo_contract.rs new file mode 100644 index 0000000000..d305b4e36f --- /dev/null +++ b/crates/dojo/macros/src/attributes/dojo_contract.rs @@ -0,0 +1,340 @@ +//! `dojo_contract` attribute macro. + +use cairo_lang_defs::patcher::{PatchBuilder, RewriteNode}; +use cairo_lang_macro::{attribute_macro, Diagnostic, Diagnostics, ProcMacroResult, TokenStream}; +use cairo_lang_parser::utils::SimpleParserDatabase; +use cairo_lang_syntax::node::ast::{MaybeModuleBody, OptionReturnTypeClause}; +use cairo_lang_syntax::node::db::SyntaxGroup; +use cairo_lang_syntax::node::helpers::BodyItems; +use cairo_lang_syntax::node::kind::SyntaxKind::ItemModule; +use cairo_lang_syntax::node::{ast, Terminal, TypedSyntaxNode}; +use cairo_lang_utils::unordered_hash_map::UnorderedHashMap; + +use super::constants::DOJO_CONTRACT_ATTR; +use super::struct_parser::{validate_attributes, validate_namings_diagnostics}; +use crate::diagnostic_ext::DiagnosticsExt; + +const CONSTRUCTOR_FN: &str = "constructor"; +pub const DOJO_INIT_FN: &str = "dojo_init"; + +const CONTRACT_PATCH: &str = include_str!("./patches/contract.patch.cairo"); +const DEFAULT_INIT_PATCH: &str = include_str!("./patches/default_init.patch.cairo"); + +#[attribute_macro("dojo::contract")] +pub fn dojo_contract(_args: TokenStream, token_stream: TokenStream) -> ProcMacroResult { + handle_module_attribute_macro(token_stream) +} + +pub fn handle_module_attribute_macro(token_stream: TokenStream) -> ProcMacroResult { + let db = SimpleParserDatabase::default(); + let (root_node, _diagnostics) = db.parse_virtual_with_diagnostics(token_stream); + + for n in root_node.descendants(&db) { + // Process only the first module expected to be the contract. + if n.kind(&db) == ItemModule { + let module_ast = ast::ItemModule::from_syntax_node(&db, n); + return from_module(&db, &module_ast); + } + } + + ProcMacroResult::new(TokenStream::empty()) +} + +pub fn from_module(db: &dyn SyntaxGroup, module_ast: &ast::ItemModule) -> ProcMacroResult { + let name = module_ast.name(db).text(db); + + let mut diagnostics = vec![]; + + diagnostics.extend(validate_attributes(db, &module_ast.attributes(db), DOJO_CONTRACT_ATTR)); + + diagnostics.extend(validate_namings_diagnostics(&[("contract name", &name)])); + + let mut has_event = false; + let mut has_storage = false; + let mut has_init = false; + let mut has_constructor = false; + + if let MaybeModuleBody::Some(body) = module_ast.body(db) { + // TODO: Use `.iter_items_in_cfg(db, metadata.cfg_set)` when possible + // to ensure we don't loop on items that are not in the current cfg set. + let mut body_nodes: Vec<_> = body + .items_vec(db) + .iter() + .flat_map(|el| { + if let ast::ModuleItem::Enum(ref enum_ast) = el { + if enum_ast.name(db).text(db).to_string() == "Event" { + has_event = true; + + return merge_event(db, enum_ast.clone()); + } + } else if let ast::ModuleItem::Struct(ref struct_ast) = el { + if struct_ast.name(db).text(db).to_string() == "Storage" { + has_storage = true; + return merge_storage(db, struct_ast.clone()); + } + } else if let ast::ModuleItem::FreeFunction(ref fn_ast) = el { + let fn_decl = fn_ast.declaration(db); + let fn_name = fn_decl.name(db).text(db); + + if fn_name == CONSTRUCTOR_FN { + has_constructor = true; + return handle_constructor_fn(db, fn_ast); + } + + if fn_name == DOJO_INIT_FN { + has_init = true; + return handle_init_fn(db, fn_ast, &mut diagnostics); + } + } + + vec![RewriteNode::Copied(el.as_syntax_node())] + }) + .collect(); + + if !has_constructor { + let node = RewriteNode::Text( + " + #[constructor] + fn constructor(ref self: ContractState) { + self.world_provider.initializer(); + } + " + .to_string(), + ); + + body_nodes.append(&mut vec![node]); + } + + if !has_init { + let node = RewriteNode::interpolate_patched( + DEFAULT_INIT_PATCH, + &UnorderedHashMap::from([( + "init_name".to_string(), + RewriteNode::Text(DOJO_INIT_FN.to_string()), + )]), + ); + body_nodes.append(&mut vec![node]); + } + + if !has_event { + body_nodes.append(&mut create_event()) + } + + if !has_storage { + body_nodes.append(&mut create_storage()) + } + + let mut builder = PatchBuilder::new(db, module_ast); + builder.add_modified(RewriteNode::Mapped { + node: Box::new(RewriteNode::interpolate_patched( + CONTRACT_PATCH, + &UnorderedHashMap::from([ + ("name".to_string(), RewriteNode::Text(name.to_string())), + ("body".to_string(), RewriteNode::new_modified(body_nodes)), + ]), + )), + origin: module_ast.as_syntax_node().span_without_trivia(db), + }); + + let (code, _) = builder.build(); + + crate::debug_expand(&format!("CONTRACT PATCH: {name}"), &code); + + return ProcMacroResult::new(TokenStream::new(code)) + .with_diagnostics(Diagnostics::new(diagnostics)); + } + + ProcMacroResult::new(TokenStream::empty()) +} +/// If a constructor is provided, we should keep the user statements. +/// We only inject the world provider initializer. +fn handle_constructor_fn(db: &dyn SyntaxGroup, fn_ast: &ast::FunctionWithBody) -> Vec { + let fn_decl = fn_ast.declaration(db); + + let params_str = params_to_str(db, fn_decl.signature(db).parameters(db)); + + let declaration_node = RewriteNode::Mapped { + node: Box::new(RewriteNode::Text(format!( + " + #[constructor] + fn constructor({}) {{ + self.world_provider.initializer(); + ", + params_str + ))), + origin: fn_ast.declaration(db).as_syntax_node().span_without_trivia(db), + }; + + let func_nodes = fn_ast + .body(db) + .statements(db) + .elements(db) + .iter() + .map(|e| RewriteNode::Mapped { + node: Box::new(RewriteNode::from(e.as_syntax_node())), + origin: e.as_syntax_node().span_without_trivia(db), + }) + .collect::>(); + + let mut nodes = vec![declaration_node]; + + nodes.extend(func_nodes); + + // Close the constructor with users statements included. + nodes.push(RewriteNode::Text("}\n".to_string())); + + nodes +} + +fn handle_init_fn( + db: &dyn SyntaxGroup, + fn_ast: &ast::FunctionWithBody, + diagnostics: &mut Vec, +) -> Vec { + let fn_decl = fn_ast.declaration(db); + + if let OptionReturnTypeClause::ReturnTypeClause(_) = fn_decl.signature(db).ret_ty(db) { + diagnostics.push_error(format!("The {} function cannot have a return type.", DOJO_INIT_FN)); + } + + let params: Vec = fn_decl + .signature(db) + .parameters(db) + .elements(db) + .iter() + .map(|p| p.as_syntax_node().get_text(db)) + .collect::>(); + + let params_str = params.join(", "); + + // Since the dojo init is meant to be called by the world, we don't need an + // interface to be generated (which adds a considerable amount of code). + let impl_node = RewriteNode::Text( + " + #[abi(per_item)] + #[generate_trait] + pub impl IDojoInitImpl of IDojoInit { + #[external(v0)] + " + .to_string(), + ); + + let declaration_node = RewriteNode::Mapped { + node: Box::new(RewriteNode::Text(format!("fn {}({}) {{", DOJO_INIT_FN, params_str))), + origin: fn_ast.declaration(db).as_syntax_node().span_without_trivia(db), + }; + + // Asserts the caller is the world, and close the init function. + let assert_world_caller_node = RewriteNode::Text( + "if starknet::get_caller_address() != \ + self.world_provider.world_dispatcher().contract_address { \ + core::panics::panic_with_byte_array(@format!(\"Only the world can init contract `{}`, \ + but caller is `{:?}`\", self.dojo_name(), starknet::get_caller_address())); }" + .to_string(), + ); + + let func_nodes = fn_ast + .body(db) + .statements(db) + .elements(db) + .iter() + .map(|e| RewriteNode::Mapped { + node: Box::new(RewriteNode::from(e.as_syntax_node())), + origin: e.as_syntax_node().span_without_trivia(db), + }) + .collect::>(); + + let mut nodes = vec![impl_node, declaration_node, assert_world_caller_node]; + nodes.extend(func_nodes); + // Close the init function + close the impl block. + nodes.push(RewriteNode::Text("}\n}".to_string())); + + nodes +} + +pub fn merge_event(db: &dyn SyntaxGroup, enum_ast: ast::ItemEnum) -> Vec { + let mut rewrite_nodes = vec![]; + + let elements = enum_ast.variants(db).elements(db); + + let variants = elements.iter().map(|e| e.as_syntax_node().get_text(db)).collect::>(); + let variants = variants.join(",\n"); + + rewrite_nodes.push(RewriteNode::interpolate_patched( + " + #[event] + #[derive(Drop, starknet::Event)] + enum Event { + UpgradeableEvent: upgradeable_cpt::Event, + WorldProviderEvent: world_provider_cpt::Event, + $variants$ + } + ", + &UnorderedHashMap::from([("variants".to_string(), RewriteNode::Text(variants))]), + )); + rewrite_nodes +} + +pub fn create_event() -> Vec { + vec![RewriteNode::Text( + " + #[event] + #[derive(Drop, starknet::Event)] + enum Event { + UpgradeableEvent: upgradeable_cpt::Event, + WorldProviderEvent: world_provider_cpt::Event, + } + " + .to_string(), + )] +} + +pub fn merge_storage(db: &dyn SyntaxGroup, struct_ast: ast::ItemStruct) -> Vec { + let mut rewrite_nodes = vec![]; + + let elements = struct_ast.members(db).elements(db); + + let members = elements.iter().map(|e| e.as_syntax_node().get_text(db)).collect::>(); + let members = members.join(",\n"); + + rewrite_nodes.push(RewriteNode::interpolate_patched( + " + #[storage] + struct Storage { + #[substorage(v0)] + upgradeable: upgradeable_cpt::Storage, + #[substorage(v0)] + world_provider: world_provider_cpt::Storage, + $members$ + } + ", + &UnorderedHashMap::from([("members".to_string(), RewriteNode::Text(members))]), + )); + rewrite_nodes +} + +pub fn create_storage() -> Vec { + vec![RewriteNode::Text( + " + #[storage] + struct Storage { + #[substorage(v0)] + upgradeable: upgradeable_cpt::Storage, + #[substorage(v0)] + world_provider: world_provider_cpt::Storage, + } + " + .to_string(), + )] +} + +/// Converts parameter list to it's string representation. +pub fn params_to_str(db: &dyn SyntaxGroup, param_list: ast::ParamList) -> String { + let params = param_list + .elements(db) + .iter() + .map(|param| param.as_syntax_node().get_text(db)) + .collect::>(); + + params.join(", ") +} diff --git a/crates/dojo/macros/src/attributes/dojo_event.rs b/crates/dojo/macros/src/attributes/dojo_event.rs new file mode 100644 index 0000000000..e6a655bdb3 --- /dev/null +++ b/crates/dojo/macros/src/attributes/dojo_event.rs @@ -0,0 +1,123 @@ +//! `dojo_event` attribute macro. + +use cairo_lang_defs::patcher::{PatchBuilder, RewriteNode}; +use cairo_lang_macro::{attribute_macro, Diagnostics, ProcMacroResult, TokenStream}; +use cairo_lang_syntax::node::db::SyntaxGroup; +use cairo_lang_syntax::node::helpers::QueryAttrs; +use cairo_lang_syntax::node::{ast, TypedSyntaxNode}; +use cairo_lang_utils::unordered_hash_map::UnorderedHashMap; + +use super::constants::DOJO_EVENT_ATTR; +use super::struct_parser::{ + compute_unique_hash, handle_struct_attribute_macro, parse_members, serialize_keys_and_values, + validate_attributes, validate_namings_diagnostics, +}; +use crate::attributes::struct_parser::remove_derives; +use crate::derives::{extract_derive_attr_names, DOJO_INTROSPECT_DERIVE, DOJO_PACKED_DERIVE}; +use crate::diagnostic_ext::DiagnosticsExt; + +const EVENT_PATCH: &str = include_str!("./patches/event.patch.cairo"); + +#[attribute_macro("dojo::event")] +pub fn dojo_event(_args: TokenStream, token_stream: TokenStream) -> ProcMacroResult { + handle_event_attribute_macro(token_stream) +} + +// inner function to be called in tests as `dojo_event()` is automatically renamed +// by the `attribute_macro` processing +pub fn handle_event_attribute_macro(token_stream: TokenStream) -> ProcMacroResult { + handle_struct_attribute_macro(token_stream, from_struct) +} + +pub fn from_struct(db: &dyn SyntaxGroup, struct_ast: &ast::ItemStruct) -> ProcMacroResult { + let mut diagnostics = vec![]; + + let event_name = struct_ast.name(db).as_syntax_node().get_text(db).trim().to_string(); + + diagnostics.extend(validate_attributes(db, &struct_ast.attributes(db), DOJO_EVENT_ATTR)); + + diagnostics.extend(validate_namings_diagnostics(&[("event name", &event_name)])); + + let members = parse_members(db, &struct_ast.members(db).elements(db), &mut diagnostics); + + let mut serialized_keys: Vec = vec![]; + let mut serialized_values: Vec = vec![]; + + serialize_keys_and_values(&members, &mut serialized_keys, &mut serialized_values); + + if serialized_keys.is_empty() { + diagnostics.push_error("Event must define at least one #[key] attribute".to_string()); + } + + if serialized_values.is_empty() { + diagnostics + .push_error("Event must define at least one member that is not a key".to_string()); + } + + let members_values = members + .iter() + .filter_map(|m| { + if m.key { + None + } else { + Some(RewriteNode::Text(format!("pub {}: {},\n", m.name, m.ty))) + } + }) + .collect::>(); + + let member_names = members + .iter() + .map(|member| RewriteNode::Text(format!("{},\n", member.name.clone()))) + .collect::>(); + + let derive_attr_names = extract_derive_attr_names( + db, + &mut diagnostics, + struct_ast.attributes(db).query_attr(db, "derive"), + ); + + if derive_attr_names.contains(&DOJO_PACKED_DERIVE.to_string()) { + diagnostics.push_error(format!("Deriving {DOJO_PACKED_DERIVE} on event is not allowed.")); + } + + let has_drop = derive_attr_names.contains(&"Drop".to_string()); + let has_serde = derive_attr_names.contains(&"Serde".to_string()); + + if !has_drop || !has_serde { + diagnostics.push_error("Event must derive from Drop and Serde.".to_string()); + } + + // Ensures events always derive Introspect if not already derived. + let derive_node = RewriteNode::Text(format!("#[derive({})]", DOJO_INTROSPECT_DERIVE)); + + // Must remove the derives from the original struct since they would create duplicates + // with the derives of other plugins. + let original_struct = remove_derives(db, struct_ast); + + let unique_hash = + compute_unique_hash(db, &event_name, false, &struct_ast.members(db).elements(db)) + .to_string(); + + let dojo_node = RewriteNode::interpolate_patched( + EVENT_PATCH, + &UnorderedHashMap::from([ + ("derive_node".to_string(), derive_node), + ("original_struct".to_string(), original_struct), + ("type_name".to_string(), RewriteNode::Text(event_name.clone())), + ("member_names".to_string(), RewriteNode::new_modified(member_names)), + ("serialized_keys".to_string(), RewriteNode::new_modified(serialized_keys)), + ("serialized_values".to_string(), RewriteNode::new_modified(serialized_values)), + ("unique_hash".to_string(), RewriteNode::Text(unique_hash)), + ("members_values".to_string(), RewriteNode::new_modified(members_values)), + ]), + ); + + let mut builder = PatchBuilder::new(db, struct_ast); + builder.add_modified(dojo_node); + + let (code, _) = builder.build(); + + crate::debug_expand(&format!("EVENT PATCH: {event_name}"), &code); + + ProcMacroResult::new(TokenStream::new(code)).with_diagnostics(Diagnostics::new(diagnostics)) +} diff --git a/crates/dojo/macros/src/attributes/dojo_model.rs b/crates/dojo/macros/src/attributes/dojo_model.rs new file mode 100644 index 0000000000..b251b50719 --- /dev/null +++ b/crates/dojo/macros/src/attributes/dojo_model.rs @@ -0,0 +1,194 @@ +//! `dojo_model` attribute macro. + +use cairo_lang_defs::patcher::{PatchBuilder, RewriteNode}; +use cairo_lang_macro::{attribute_macro, Diagnostics, ProcMacroResult, TokenStream}; +use cairo_lang_syntax::node::db::SyntaxGroup; +use cairo_lang_syntax::node::helpers::QueryAttrs; +use cairo_lang_syntax::node::{ast, TypedSyntaxNode}; +use cairo_lang_utils::unordered_hash_map::UnorderedHashMap; +use starknet::core::utils::get_selector_from_name; + +use super::constants::DOJO_MODEL_ATTR; +use super::struct_parser::{ + compute_unique_hash, handle_struct_attribute_macro, parse_members, serialize_member_ty, + validate_attributes, validate_namings_diagnostics, Member, +}; +use crate::attributes::struct_parser::remove_derives; +use crate::derives::{extract_derive_attr_names, DOJO_INTROSPECT_DERIVE, DOJO_PACKED_DERIVE}; +use crate::diagnostic_ext::DiagnosticsExt; + +const MODEL_CODE_PATCH: &str = include_str!("./patches/model.patch.cairo"); +const MODEL_FIELD_CODE_PATCH: &str = include_str!("./patches/model_field_store.patch.cairo"); + +#[attribute_macro("dojo::model")] +pub fn dojo_model(_args: TokenStream, token_stream: TokenStream) -> ProcMacroResult { + handle_model_attribute_macro(token_stream) +} + +// inner function to be called in tests as `dojo_model()` is automatically renamed +// by the `attribute_macro` processing +pub fn handle_model_attribute_macro(token_stream: TokenStream) -> ProcMacroResult { + handle_struct_attribute_macro(token_stream, from_struct) +} + +pub fn from_struct(db: &dyn SyntaxGroup, struct_ast: &ast::ItemStruct) -> ProcMacroResult { + let mut diagnostics = vec![]; + + let model_type = struct_ast.name(db).as_syntax_node().get_text(db).trim().to_string(); + + diagnostics.extend(validate_attributes(db, &struct_ast.attributes(db), DOJO_MODEL_ATTR)); + diagnostics.extend(validate_namings_diagnostics(&[("model name", &model_type)])); + + let mut values: Vec = vec![]; + let mut keys: Vec = vec![]; + let mut members_values: Vec = vec![]; + let mut key_types: Vec = vec![]; + let mut key_attrs: Vec = vec![]; + + let mut serialized_keys: Vec = vec![]; + let mut serialized_values: Vec = vec![]; + let mut field_accessors: Vec = vec![]; + + let members = parse_members(db, &struct_ast.members(db).elements(db), &mut diagnostics); + + members.iter().for_each(|member| { + if member.key { + keys.push(member.clone()); + key_types.push(member.ty.clone()); + key_attrs.push(format!("*self.{}", member.name.clone())); + serialized_keys.push(serialize_member_ty(member, true)); + } else { + values.push(member.clone()); + serialized_values.push(serialize_member_ty(member, true)); + members_values + .push(RewriteNode::Text(format!("pub {}: {},\n", member.name, member.ty))); + field_accessors.push(generate_field_accessors(model_type.clone(), member)); + } + }); + + if keys.is_empty() { + diagnostics.push_error("Model must define at least one #[key] attribute".to_string()); + } + + if values.is_empty() { + diagnostics + .push_error("Model must define at least one member that is not a key".to_string()); + } + + if !diagnostics.is_empty() { + return ProcMacroResult::new(TokenStream::empty()) + .with_diagnostics(Diagnostics::new(diagnostics)); + } + + let (keys_to_tuple, key_type) = if keys.len() > 1 { + (format!("({})", key_attrs.join(", ")), format!("({})", key_types.join(", "))) + } else { + (key_attrs.first().unwrap().to_string(), key_types.first().unwrap().to_string()) + }; + + let derive_attr_names = extract_derive_attr_names( + db, + &mut diagnostics, + struct_ast.attributes(db).query_attr(db, "derive"), + ); + + let has_introspect = derive_attr_names.contains(&DOJO_INTROSPECT_DERIVE.to_string()); + let has_introspect_packed = derive_attr_names.contains(&DOJO_PACKED_DERIVE.to_string()); + let has_drop = derive_attr_names.contains(&"Drop".to_string()); + let has_serde = derive_attr_names.contains(&"Serde".to_string()); + + if has_introspect && has_introspect_packed { + diagnostics.push_error( + "Model cannot derive from both Introspect and IntrospectPacked.".to_string(), + ); + } + + #[allow(clippy::nonminimal_bool)] + if !has_drop || !has_serde { + diagnostics.push_error("Model must derive from Drop and Serde.".to_string()); + } + + let derive_node = if has_introspect_packed { + RewriteNode::Text(format!("#[derive({})]", DOJO_PACKED_DERIVE)) + } else { + RewriteNode::Text(format!("#[derive({})]", DOJO_INTROSPECT_DERIVE)) + }; + + // Must remove the derives from the original struct since they would create duplicates + // with the derives of other plugins. + let original_struct = remove_derives(db, struct_ast); + + // Reuse the same derive attributes for ModelValue (except Introspect/IntrospectPacked). + let model_value_derive_attr_names = derive_attr_names + .iter() + .map(|d| d.as_str()) + .filter(|&d| d != DOJO_INTROSPECT_DERIVE && d != DOJO_PACKED_DERIVE) + .collect::>() + .join(", "); + + let unique_hash = compute_unique_hash( + db, + &model_type, + has_introspect_packed, + &struct_ast.members(db).elements(db), + ) + .to_string(); + + let dojo_node = RewriteNode::interpolate_patched( + MODEL_CODE_PATCH, + &UnorderedHashMap::from([ + ("derive_node".to_string(), derive_node), + ("original_struct".to_string(), original_struct), + ("model_type".to_string(), RewriteNode::Text(model_type.clone())), + ("serialized_keys".to_string(), RewriteNode::new_modified(serialized_keys)), + ("serialized_values".to_string(), RewriteNode::new_modified(serialized_values)), + ("keys_to_tuple".to_string(), RewriteNode::Text(keys_to_tuple)), + ("key_type".to_string(), RewriteNode::Text(key_type)), + ("members_values".to_string(), RewriteNode::new_modified(members_values)), + ("field_accessors".to_string(), RewriteNode::new_modified(field_accessors)), + ( + "model_value_derive_attr_names".to_string(), + RewriteNode::Text(model_value_derive_attr_names), + ), + ("unique_hash".to_string(), RewriteNode::Text(unique_hash)), + ]), + ); + + let mut builder = PatchBuilder::new(db, struct_ast); + builder.add_modified(dojo_node); + + let (code, _) = builder.build(); + + crate::debug_expand(&format!("MODEL PATCH: {model_type}"), &code); + + ProcMacroResult::new(TokenStream::new(code)).with_diagnostics(Diagnostics::new(diagnostics)) +} + +/// Generates field accessors (`get_[field_name]` and `set_[field_name]`) for every +/// fields of a model. +/// +/// # Arguments +/// +/// * `model_name` - the model name. +/// * `param_keys` - coma separated model keys with the format `KEY_NAME: KEY_TYPE`. +/// * `serialized_param_keys` - code to serialize model keys in a `serialized` felt252 array. +/// * `member` - information about the field for which to generate accessors. +/// +/// # Returns +/// A [`RewriteNode`] containing accessors code. +fn generate_field_accessors(model_type: String, member: &Member) -> RewriteNode { + RewriteNode::interpolate_patched( + MODEL_FIELD_CODE_PATCH, + &UnorderedHashMap::from([ + ("model_type".to_string(), RewriteNode::Text(model_type)), + ( + "field_selector".to_string(), + RewriteNode::Text( + get_selector_from_name(&member.name).expect("invalid member name").to_string(), + ), + ), + ("field_name".to_string(), RewriteNode::Text(member.name.clone())), + ("field_type".to_string(), RewriteNode::Text(member.ty.clone())), + ]), + ) +} diff --git a/crates/dojo/macros/src/attributes/mod.rs b/crates/dojo/macros/src/attributes/mod.rs new file mode 100644 index 0000000000..a243e83ac9 --- /dev/null +++ b/crates/dojo/macros/src/attributes/mod.rs @@ -0,0 +1,5 @@ +pub mod constants; +pub mod dojo_contract; +pub mod dojo_event; +pub mod dojo_model; +pub mod struct_parser; diff --git a/crates/dojo/lang/src/attribute_macros/patches/contract.patch.cairo b/crates/dojo/macros/src/attributes/patches/contract.patch.cairo similarity index 100% rename from crates/dojo/lang/src/attribute_macros/patches/contract.patch.cairo rename to crates/dojo/macros/src/attributes/patches/contract.patch.cairo diff --git a/crates/dojo/lang/src/attribute_macros/patches/default_init.patch.cairo b/crates/dojo/macros/src/attributes/patches/default_init.patch.cairo similarity index 100% rename from crates/dojo/lang/src/attribute_macros/patches/default_init.patch.cairo rename to crates/dojo/macros/src/attributes/patches/default_init.patch.cairo diff --git a/crates/dojo/lang/src/attribute_macros/patches/event.patch.cairo b/crates/dojo/macros/src/attributes/patches/event.patch.cairo similarity index 98% rename from crates/dojo/lang/src/attribute_macros/patches/event.patch.cairo rename to crates/dojo/macros/src/attributes/patches/event.patch.cairo index 936af4269d..a6275ab39c 100644 --- a/crates/dojo/lang/src/attribute_macros/patches/event.patch.cairo +++ b/crates/dojo/macros/src/attributes/patches/event.patch.cairo @@ -1,3 +1,6 @@ +$derive_node$ +$original_struct$ + // EventValue on it's own does nothing since events are always emitted and // never read from the storage. However, it's required by the ABI to // ensure that the event definition contains both keys and values easily distinguishable. diff --git a/crates/dojo/lang/src/attribute_macros/patches/model.patch.cairo b/crates/dojo/macros/src/attributes/patches/model.patch.cairo similarity index 99% rename from crates/dojo/lang/src/attribute_macros/patches/model.patch.cairo rename to crates/dojo/macros/src/attributes/patches/model.patch.cairo index 82397b9121..77002bfaea 100644 --- a/crates/dojo/lang/src/attribute_macros/patches/model.patch.cairo +++ b/crates/dojo/macros/src/attributes/patches/model.patch.cairo @@ -1,7 +1,10 @@ +$derive_node$ +$original_struct$ + #[derive($model_value_derive_attr_names$)] pub struct $model_type$Value { $members_values$ -} +} type $model_type$KeyType = $key_type$; diff --git a/crates/dojo/lang/src/attribute_macros/patches/model_field_store.patch.cairo b/crates/dojo/macros/src/attributes/patches/model_field_store.patch.cairo similarity index 100% rename from crates/dojo/lang/src/attribute_macros/patches/model_field_store.patch.cairo rename to crates/dojo/macros/src/attributes/patches/model_field_store.patch.cairo diff --git a/crates/dojo/macros/src/attributes/struct_parser.rs b/crates/dojo/macros/src/attributes/struct_parser.rs new file mode 100644 index 0000000000..20e5df87e4 --- /dev/null +++ b/crates/dojo/macros/src/attributes/struct_parser.rs @@ -0,0 +1,212 @@ +use cairo_lang_defs::patcher::RewriteNode; +use cairo_lang_macro::{Diagnostic, ProcMacroResult, Severity, TokenStream}; +use cairo_lang_parser::utils::SimpleParserDatabase; +use cairo_lang_syntax::node::ast::{self, AttributeList, Member as MemberAst}; +use cairo_lang_syntax::node::db::SyntaxGroup; +use cairo_lang_syntax::node::helpers::QueryAttrs; +use cairo_lang_syntax::node::kind::SyntaxKind::ItemStruct; +use cairo_lang_syntax::node::{Terminal, TypedSyntaxNode}; +use dojo_types::naming; +use dojo_types::naming::compute_bytearray_hash; +use serde::{Deserialize, Serialize}; +use starknet_crypto::{poseidon_hash_many, Felt}; + +use super::constants::DOJO_ATTR_NAMES; +use crate::diagnostic_ext::DiagnosticsExt; + +/// Represents a member of a struct. +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] +pub struct Member { + // Name of the member. + pub name: String, + // Type of the member. + pub ty: String, + // Whether the member is a key. + pub key: bool, +} + +pub fn parse_members( + db: &dyn SyntaxGroup, + members: &[MemberAst], + diagnostics: &mut Vec, +) -> Vec { + members + .iter() + .filter_map(|member_ast| { + let member = Member { + name: member_ast.name(db).text(db).to_string(), + ty: member_ast + .type_clause(db) + .ty(db) + .as_syntax_node() + .get_text(db) + .trim() + .to_string(), + key: member_ast.has_attr(db, "key"), + }; + + // validate key member + if member.key && member.ty == "u256" { + diagnostics.push(Diagnostic { + message: "Key is only supported for core types that are 1 felt long once \ + serialized. `u256` is a struct of 2 u128, hence not supported." + .into(), + severity: Severity::Error, + }); + None + } else { + Some(member) + } + }) + .collect::>() +} + +pub fn serialize_keys_and_values( + members: &[Member], + serialized_keys: &mut Vec, + serialized_values: &mut Vec, +) { + members.iter().for_each(|member| { + if member.key { + serialized_keys.push(serialize_member_ty(member, true)); + } else { + serialized_values.push(serialize_member_ty(member, true)); + } + }); +} + +/// Creates a [`RewriteNode`] for the member type serialization. +/// +/// # Arguments +/// +/// * member: The member to serialize. +pub fn serialize_member_ty(member: &Member, with_self: bool) -> RewriteNode { + RewriteNode::Text(format!( + "core::serde::Serde::serialize({}{}, ref serialized);\n", + if with_self { "self." } else { "@" }, + member.name + )) +} + +pub fn deserialize_member_ty(member: &Member, input_name: &str) -> RewriteNode { + RewriteNode::Text(format!( + "let {} = core::serde::Serde::<{}>::deserialize(ref {input_name})?;\n", + member.name, member.ty + )) +} + +/// Validates the namings of the attributes. +/// +/// # Arguments +/// +/// * namings: A list of tuples containing the id and value of the attribute. +/// +/// # Returns +/// +/// A vector of diagnostics. +pub fn validate_namings_diagnostics(namings: &[(&str, &str)]) -> Vec { + let mut diagnostics = vec![]; + + for (id, value) in namings { + if !naming::is_name_valid(value) { + diagnostics.push_error(format!( + "The {id} '{value}' can only contain characters (a-z/A-Z), digits (0-9) and \ + underscore (_)." + )); + } + } + + diagnostics +} + +/// Removes the derives from the original struct. +pub fn remove_derives(db: &dyn SyntaxGroup, struct_ast: &ast::ItemStruct) -> RewriteNode { + let mut out_lines = vec![]; + + let struct_str = struct_ast.as_syntax_node().get_text_without_trivia(db).to_string(); + + for l in struct_str.lines() { + if !l.starts_with("#[derive") { + out_lines.push(l); + } + } + + RewriteNode::Text(out_lines.join("\n")) +} + +/// Validates the attributes of a Dojo attribute. +/// +/// Parameters: +/// * db: The semantic database. +/// * module_ast: The AST of the contract module. +/// +/// Returns: +/// * A vector of diagnostics. +pub fn validate_attributes( + db: &dyn SyntaxGroup, + attribute_list: &AttributeList, + ref_attribute: &str, +) -> Vec { + let mut diagnostics = vec![]; + + for attribute in DOJO_ATTR_NAMES { + if attribute == ref_attribute { + if attribute_list.query_attr(db, attribute).first().is_some() { + diagnostics.push_error(format!( + "Only one {} attribute is allowed per module.", + ref_attribute + )); + } + } else if attribute_list.query_attr(db, attribute).first().is_some() { + diagnostics.push_error(format!( + "A {} can't be used together with a {}.", + ref_attribute, attribute + )); + } + } + + diagnostics +} + +/// Compute a unique hash based on the element name and types and names of members. +/// This hash is used in element contracts to ensure uniqueness. +pub fn compute_unique_hash( + db: &dyn SyntaxGroup, + element_name: &str, + is_packed: bool, + members: &[MemberAst], +) -> Felt { + let mut hashes = + vec![if is_packed { Felt::ONE } else { Felt::ZERO }, compute_bytearray_hash(element_name)]; + hashes.extend( + members + .iter() + .map(|m| { + poseidon_hash_many(&[ + compute_bytearray_hash(&m.name(db).text(db).to_string()), + compute_bytearray_hash( + m.type_clause(db).ty(db).as_syntax_node().get_text(db).trim(), + ), + ]) + }) + .collect::>(), + ); + poseidon_hash_many(&hashes) +} + +pub fn handle_struct_attribute_macro( + token_stream: TokenStream, + from_struct: fn(&dyn SyntaxGroup, &ast::ItemStruct) -> ProcMacroResult, +) -> ProcMacroResult { + let db = SimpleParserDatabase::default(); + let (root_node, _diagnostics) = db.parse_virtual_with_diagnostics(token_stream); + + for n in root_node.descendants(&db) { + if n.kind(&db) == ItemStruct { + let struct_ast = ast::ItemStruct::from_syntax_node(&db, n); + return from_struct(&db, &struct_ast); + } + } + + ProcMacroResult::new(TokenStream::empty()) +} diff --git a/crates/dojo/lang/src/derive_macros/introspect/layout.rs b/crates/dojo/macros/src/derives/introspect/layout.rs similarity index 75% rename from crates/dojo/lang/src/derive_macros/introspect/layout.rs rename to crates/dojo/macros/src/derives/introspect/layout.rs index 43667fe502..c38b5d8042 100644 --- a/crates/dojo/lang/src/derive_macros/introspect/layout.rs +++ b/crates/dojo/macros/src/derives/introspect/layout.rs @@ -1,20 +1,20 @@ -use cairo_lang_defs::plugin::PluginDiagnostic; -use cairo_lang_diagnostics::Severity; +use cairo_lang_macro::Diagnostic; use cairo_lang_syntax::node::ast::{Expr, ItemEnum, ItemStruct, OptionTypeClause, TypeClause}; use cairo_lang_syntax::node::db::SyntaxGroup; use cairo_lang_syntax::node::helpers::QueryAttrs; -use cairo_lang_syntax::node::{ids, Terminal, TypedSyntaxNode}; +use cairo_lang_syntax::node::{Terminal, TypedSyntaxNode}; use starknet::core::utils::get_selector_from_name; use super::utils::{ get_array_item_type, get_tuple_item_types, is_array, is_byte_array, is_tuple, is_unsupported_option_type, primitive_type_introspection, }; +use crate::diagnostic_ext::DiagnosticsExt; /// build the full layout for every field in the Struct. pub fn build_field_layouts( db: &dyn SyntaxGroup, - diagnostics: &mut Vec, + diagnostics: &mut Vec, struct_ast: &ItemStruct, ) -> String { struct_ast @@ -44,7 +44,7 @@ pub fn build_field_layouts( /// Note that every variant may have a different associated data type. pub fn build_variant_layouts( db: &dyn SyntaxGroup, - diagnostics: &mut Vec, + diagnostics: &mut Vec, enum_ast: &ItemEnum, ) -> String { enum_ast @@ -78,24 +78,20 @@ pub fn build_variant_layouts( /// Build a field layout describing the provided type clause. pub fn get_layout_from_type_clause( db: &dyn SyntaxGroup, - diagnostics: &mut Vec, + diagnostics: &mut Vec, type_clause: &TypeClause, ) -> String { match type_clause.ty(db) { Expr::Path(path) => { let path_type = path.as_syntax_node().get_text(db); - build_item_layout_from_type(diagnostics, type_clause.stable_ptr().0, &path_type) + build_item_layout_from_type(diagnostics, &path_type) } Expr::Tuple(expr) => { let tuple_type = expr.as_syntax_node().get_text(db); - build_tuple_layout_from_type(diagnostics, type_clause.stable_ptr().0, &tuple_type) + build_tuple_layout_from_type(diagnostics, &tuple_type) } _ => { - diagnostics.push(PluginDiagnostic { - stable_ptr: type_clause.stable_ptr().0, - message: "Unexpected expression for variant data type.".to_string(), - severity: Severity::Error, - }); + diagnostics.push_error("Unexpected expression for variant data type.".to_string()); "ERROR".to_string() } } @@ -103,11 +99,7 @@ pub fn get_layout_from_type_clause( /// Build the array layout describing the provided array type. /// item_type could be something like `Array` for example. -pub fn build_array_layout_from_type( - diagnostics: &mut Vec, - diagnostic_item: ids::SyntaxStablePtrId, - item_type: &str, -) -> String { +pub fn build_array_layout_from_type(diagnostics: &mut Vec, item_type: &str) -> String { let array_item_type = get_array_item_type(item_type); if is_tuple(&array_item_type) { @@ -117,7 +109,7 @@ pub fn build_array_layout_from_type( {} ].span() )", - build_item_layout_from_type(diagnostics, diagnostic_item, &array_item_type) + build_item_layout_from_type(diagnostics, &array_item_type) ) } else if is_array(&array_item_type) { format!( @@ -126,7 +118,7 @@ pub fn build_array_layout_from_type( {} ].span() )", - build_array_layout_from_type(diagnostics, diagnostic_item, &array_item_type) + build_array_layout_from_type(diagnostics, &array_item_type) ) } else { format!("dojo::meta::introspect::Introspect::<{}>::layout()", item_type) @@ -135,14 +127,10 @@ pub fn build_array_layout_from_type( /// Build the tuple layout describing the provided tuple type. /// item_type could be something like (u8, u32, u128) for example. -pub fn build_tuple_layout_from_type( - diagnostics: &mut Vec, - diagnostic_item: ids::SyntaxStablePtrId, - item_type: &str, -) -> String { +pub fn build_tuple_layout_from_type(diagnostics: &mut Vec, item_type: &str) -> String { let tuple_items = get_tuple_item_types(item_type) .iter() - .map(|x| build_item_layout_from_type(diagnostics, diagnostic_item, x)) + .map(|x| build_item_layout_from_type(diagnostics, x)) .collect::>() .join(",\n"); format!( @@ -157,23 +145,17 @@ pub fn build_tuple_layout_from_type( /// Build the layout describing the provided type. /// item_type could be any type (array, tuple, struct, ...) -pub fn build_item_layout_from_type( - diagnostics: &mut Vec, - diagnostic_item: ids::SyntaxStablePtrId, - item_type: &str, -) -> String { +pub fn build_item_layout_from_type(diagnostics: &mut Vec, item_type: &str) -> String { if is_array(item_type) { - build_array_layout_from_type(diagnostics, diagnostic_item, item_type) + build_array_layout_from_type(diagnostics, item_type) } else if is_tuple(item_type) { - build_tuple_layout_from_type(diagnostics, diagnostic_item, item_type) + build_tuple_layout_from_type(diagnostics, item_type) } else { // For Option, T cannot be a tuple if is_unsupported_option_type(item_type) { - diagnostics.push(PluginDiagnostic { - stable_ptr: diagnostic_item, - message: "Option cannot be used with tuples. Prefer using a struct.".into(), - severity: Severity::Error, - }); + diagnostics.push_error( + "Option cannot be used with tuples. Prefer using a struct.".to_string(), + ); } format!("dojo::meta::introspect::Introspect::<{}>::layout()", item_type) @@ -186,7 +168,7 @@ pub fn is_custom_layout(layout: &str) -> bool { pub fn build_packed_struct_layout( db: &dyn SyntaxGroup, - diagnostics: &mut Vec, + diagnostics: &mut Vec, struct_ast: &ItemStruct, ) -> String { let layouts = struct_ast @@ -263,7 +245,7 @@ pub fn generate_cairo_code_for_fixed_layout_with_custom_types(layouts: &[String] // pub fn build_packed_enum_layout( db: &dyn SyntaxGroup, - diagnostics: &mut Vec, + diagnostics: &mut Vec, enum_ast: &ItemEnum, ) -> String { // to be packable, all variants data must have the same size. @@ -301,28 +283,20 @@ pub fn build_packed_enum_layout( // pub fn get_packed_field_layout_from_type_clause( db: &dyn SyntaxGroup, - diagnostics: &mut Vec, + diagnostics: &mut Vec, type_clause: &TypeClause, ) -> Vec { match type_clause.ty(db) { Expr::Path(path) => { let path_type = path.as_syntax_node().get_text(db); - get_packed_item_layout_from_type( - diagnostics, - type_clause.stable_ptr().0, - path_type.trim(), - ) + get_packed_item_layout_from_type(diagnostics, path_type.trim()) } Expr::Tuple(expr) => { let tuple_type = expr.as_syntax_node().get_text(db); - get_packed_tuple_layout_from_type(diagnostics, type_clause.stable_ptr().0, &tuple_type) + get_packed_tuple_layout_from_type(diagnostics, &tuple_type) } _ => { - diagnostics.push(PluginDiagnostic { - stable_ptr: type_clause.stable_ptr().0, - message: "Unexpected expression for variant data type.".to_string(), - severity: Severity::Error, - }); + diagnostics.push_error("Unexpected expression for variant data type.".to_string()); vec!["ERROR".to_string()] } } @@ -330,19 +304,14 @@ pub fn get_packed_field_layout_from_type_clause( // pub fn get_packed_item_layout_from_type( - diagnostics: &mut Vec, - diagnostic_item: ids::SyntaxStablePtrId, + diagnostics: &mut Vec, item_type: &str, ) -> Vec { if is_array(item_type) || is_byte_array(item_type) { - diagnostics.push(PluginDiagnostic { - stable_ptr: diagnostic_item, - message: "Array field cannot be packed.".into(), - severity: Severity::Error, - }); + diagnostics.push_error("Array field cannot be packed.".to_string()); vec!["ERROR".to_string()] } else if is_tuple(item_type) { - get_packed_tuple_layout_from_type(diagnostics, diagnostic_item, item_type) + get_packed_tuple_layout_from_type(diagnostics, item_type) } else { let primitives = primitive_type_introspection(); @@ -359,12 +328,11 @@ pub fn get_packed_item_layout_from_type( // pub fn get_packed_tuple_layout_from_type( - diagnostics: &mut Vec, - diagnostic_item: ids::SyntaxStablePtrId, + diagnostics: &mut Vec, item_type: &str, ) -> Vec { get_tuple_item_types(item_type) .iter() - .flat_map(|x| get_packed_item_layout_from_type(diagnostics, diagnostic_item, x)) + .flat_map(|x| get_packed_item_layout_from_type(diagnostics, x)) .collect::>() } diff --git a/crates/dojo/lang/src/derive_macros/introspect/mod.rs b/crates/dojo/macros/src/derives/introspect/mod.rs similarity index 89% rename from crates/dojo/lang/src/derive_macros/introspect/mod.rs rename to crates/dojo/macros/src/derives/introspect/mod.rs index 62a2b11757..e01c4e4cd2 100644 --- a/crates/dojo/lang/src/derive_macros/introspect/mod.rs +++ b/crates/dojo/macros/src/derives/introspect/mod.rs @@ -1,13 +1,14 @@ use cairo_lang_defs::patcher::RewriteNode; -use cairo_lang_defs::plugin::PluginDiagnostic; -use cairo_lang_diagnostics::Severity; +use cairo_lang_macro::Diagnostic; use cairo_lang_syntax::node::ast::{ GenericParam, ItemEnum, ItemStruct, OptionWrappedGenericParamList, }; use cairo_lang_syntax::node::db::SyntaxGroup; -use cairo_lang_syntax::node::{Terminal, TypedSyntaxNode}; +use cairo_lang_syntax::node::Terminal; use cairo_lang_utils::unordered_hash_map::UnorderedHashMap; +use crate::diagnostic_ext::DiagnosticsExt; + mod layout; mod size; mod ty; @@ -16,7 +17,7 @@ mod utils; /// Generate the introspect of a Struct pub fn handle_introspect_struct( db: &dyn SyntaxGroup, - diagnostics: &mut Vec, + diagnostics: &mut Vec, struct_ast: ItemStruct, packed: bool, ) -> RewriteNode { @@ -45,7 +46,7 @@ pub fn handle_introspect_struct( /// Generate the introspect of a Enum pub fn handle_introspect_enum( db: &dyn SyntaxGroup, - diagnostics: &mut Vec, + diagnostics: &mut Vec, enum_ast: ItemEnum, packed: bool, ) -> RewriteNode { @@ -56,12 +57,9 @@ pub fn handle_introspect_enum( if size::is_enum_packable(&variant_sizes) { layout::build_packed_enum_layout(db, diagnostics, &enum_ast) } else { - diagnostics.push(PluginDiagnostic { - stable_ptr: enum_ast.name(db).stable_ptr().0, - message: "To be packed, all variants must have fixed layout of same size." - .to_string(), - severity: Severity::Error, - }); + diagnostics.push_error( + "To be packed, all variants must have fixed layout of same size.".to_string(), + ); "ERROR".to_string() } } else { diff --git a/crates/dojo/lang/src/derive_macros/introspect/size.rs b/crates/dojo/macros/src/derives/introspect/size.rs similarity index 100% rename from crates/dojo/lang/src/derive_macros/introspect/size.rs rename to crates/dojo/macros/src/derives/introspect/size.rs diff --git a/crates/dojo/lang/src/derive_macros/introspect/ty.rs b/crates/dojo/macros/src/derives/introspect/ty.rs similarity index 100% rename from crates/dojo/lang/src/derive_macros/introspect/ty.rs rename to crates/dojo/macros/src/derives/introspect/ty.rs diff --git a/crates/dojo/lang/src/derive_macros/introspect/utils.rs b/crates/dojo/macros/src/derives/introspect/utils.rs similarity index 100% rename from crates/dojo/lang/src/derive_macros/introspect/utils.rs rename to crates/dojo/macros/src/derives/introspect/utils.rs diff --git a/crates/dojo/lang/src/derive_macros/mod.rs b/crates/dojo/macros/src/derives/mod.rs similarity index 68% rename from crates/dojo/lang/src/derive_macros/mod.rs rename to crates/dojo/macros/src/derives/mod.rs index 9377a4d7eb..2b2852a901 100644 --- a/crates/dojo/lang/src/derive_macros/mod.rs +++ b/crates/dojo/macros/src/derives/mod.rs @@ -5,16 +5,19 @@ //! derive macro. use cairo_lang_defs::patcher::{PatchBuilder, RewriteNode}; -use cairo_lang_defs::plugin::{PluginDiagnostic, PluginGeneratedFile, PluginResult}; -use cairo_lang_diagnostics::Severity; +use cairo_lang_macro::{derive_macro, Diagnostic, Diagnostics, ProcMacroResult, TokenStream}; +use cairo_lang_parser::utils::SimpleParserDatabase; use cairo_lang_syntax::attribute::structured::{AttributeArgVariant, AttributeStructurize}; use cairo_lang_syntax::node::ast::Attribute; use cairo_lang_syntax::node::db::SyntaxGroup; -use cairo_lang_syntax::node::ids::SyntaxStablePtrId; +use cairo_lang_syntax::node::helpers::QueryAttrs; +use cairo_lang_syntax::node::kind::SyntaxKind::{ItemEnum, ItemStruct}; use cairo_lang_syntax::node::{ast, Terminal, TypedSyntaxNode}; use introspect::{handle_introspect_enum, handle_introspect_struct}; use print::{handle_print_enum, handle_print_struct}; +use crate::diagnostic_ext::DiagnosticsExt; + pub mod introspect; pub mod print; @@ -22,14 +25,52 @@ pub const DOJO_PRINT_DERIVE: &str = "Print"; pub const DOJO_INTROSPECT_DERIVE: &str = "Introspect"; pub const DOJO_PACKED_DERIVE: &str = "IntrospectPacked"; +#[derive_macro] +fn introspect(token_stream: TokenStream) -> ProcMacroResult { + handle_derives_macros(token_stream) +} + +#[derive_macro] +fn introspect_packed(token_stream: TokenStream) -> ProcMacroResult { + handle_derives_macros(token_stream) +} + +pub fn handle_derives_macros(token_stream: TokenStream) -> ProcMacroResult { + let db = SimpleParserDatabase::default(); + let (syn_file, _diagnostics) = db.parse_virtual_with_diagnostics(token_stream); + + for n in syn_file.descendants(&db) { + // Process only the first module expected to be the contract. + return match n.kind(&db) { + ItemStruct => { + let struct_ast = ast::ItemStruct::from_syntax_node(&db, n); + let attrs = struct_ast.attributes(&db).query_attr(&db, "derive"); + + dojo_derive_all(&db, attrs, &ast::ModuleItem::Struct(struct_ast)) + } + ItemEnum => { + let enum_ast = ast::ItemEnum::from_syntax_node(&db, n); + let attrs = enum_ast.attributes(&db).query_attr(&db, "derive"); + + dojo_derive_all(&db, attrs, &ast::ModuleItem::Enum(enum_ast)) + } + _ => { + continue; + } + }; + } + + ProcMacroResult::new(TokenStream::empty()) +} + /// Handles all the dojo derives macro and returns the generated code and diagnostics. pub fn dojo_derive_all( db: &dyn SyntaxGroup, attrs: Vec, item_ast: &ast::ModuleItem, -) -> PluginResult { +) -> ProcMacroResult { if attrs.is_empty() { - return PluginResult::default(); + return ProcMacroResult::new(TokenStream::empty()); } let mut diagnostics = vec![]; @@ -45,20 +86,13 @@ pub fn dojo_derive_all( builder.add_modified(node); } - let (code, code_mappings) = builder.build(); + let (code, _) = builder.build(); - let item_name = item_ast.as_syntax_node().get_text_without_trivia(db).into(); + let item_name = item_ast.as_syntax_node().get_text_without_trivia(db).to_string(); - PluginResult { - code: Some(PluginGeneratedFile { - name: item_name, - content: code, - aux_data: None, - code_mappings, - }), - diagnostics, - remove_original_item: false, - } + crate::debug_expand(&format!("DERIVE {}", item_name), &code.to_string()); + + ProcMacroResult::new(TokenStream::new(code)).with_diagnostics(Diagnostics::new(diagnostics)) } /// Handles the derive attributes of a struct or enum. @@ -66,11 +100,11 @@ pub fn handle_derive_attrs( db: &dyn SyntaxGroup, attrs: &[String], item_ast: &ast::ModuleItem, -) -> (Vec, Vec) { +) -> (Vec, Vec) { let mut rewrite_nodes = Vec::new(); let mut diagnostics = Vec::new(); - check_for_derive_attr_conflicts(&mut diagnostics, item_ast.stable_ptr().0, attrs); + check_for_derive_attr_conflicts(&mut diagnostics, attrs); match item_ast { ast::ModuleItem::Struct(struct_ast) => { @@ -128,13 +162,10 @@ pub fn handle_derive_attrs( _ => { // Currently Dojo plugin doesn't support derive macros on other items than struct and // enum. - diagnostics.push(PluginDiagnostic { - stable_ptr: item_ast.stable_ptr().0, - message: "Dojo plugin doesn't support derive macros on other items than struct \ - and enum." + diagnostics.push_error( + "Dojo plugin doesn't support derive macros on other items than struct and enum." .to_string(), - severity: Severity::Error, - }); + ); } } @@ -155,7 +186,7 @@ pub fn handle_derive_attrs( /// And this function will return `["Introspect"]`. pub fn extract_derive_attr_names( db: &dyn SyntaxGroup, - diagnostics: &mut Vec, + diagnostics: &mut Vec, attrs: Vec, ) -> Vec { attrs @@ -163,11 +194,7 @@ pub fn extract_derive_attr_names( .filter_map(|attr| { let args = attr.clone().structurize(db).args; if args.is_empty() { - diagnostics.push(PluginDiagnostic { - stable_ptr: attr.stable_ptr().0, - message: "Expected args.".into(), - severity: Severity::Error, - }); + diagnostics.push_error("Expected args.".to_string()); None } else { Some(args.into_iter().filter_map(|a| { @@ -190,21 +217,13 @@ pub fn extract_derive_attr_names( /// Checks for conflicts between introspect and packed attributes. /// /// Introspect and IntrospectPacked cannot be used at a same time. -fn check_for_derive_attr_conflicts( - diagnostics: &mut Vec, - diagnostic_item: SyntaxStablePtrId, - attr_names: &[String], -) { +fn check_for_derive_attr_conflicts(diagnostics: &mut Vec, attr_names: &[String]) { if attr_names.contains(&DOJO_INTROSPECT_DERIVE.to_string()) && attr_names.contains(&DOJO_PACKED_DERIVE.to_string()) { - diagnostics.push(PluginDiagnostic { - stable_ptr: diagnostic_item, - message: format!( - "{} and {} attributes cannot be used at a same time.", - DOJO_INTROSPECT_DERIVE, DOJO_PACKED_DERIVE - ), - severity: Severity::Error, - }); + diagnostics.push_error(format!( + "{} and {} attributes cannot be used at a same time.", + DOJO_INTROSPECT_DERIVE, DOJO_PACKED_DERIVE + )); } } diff --git a/crates/dojo/lang/src/derive_macros/print.rs b/crates/dojo/macros/src/derives/print.rs similarity index 100% rename from crates/dojo/lang/src/derive_macros/print.rs rename to crates/dojo/macros/src/derives/print.rs diff --git a/crates/dojo/macros/src/diagnostic_ext.rs b/crates/dojo/macros/src/diagnostic_ext.rs new file mode 100644 index 0000000000..05b4d0032e --- /dev/null +++ b/crates/dojo/macros/src/diagnostic_ext.rs @@ -0,0 +1,16 @@ +use cairo_lang_macro::Diagnostic; + +pub trait DiagnosticsExt { + fn push_error(&mut self, message: String); + fn push_warn(&mut self, message: String); +} + +impl DiagnosticsExt for Vec { + fn push_error(&mut self, message: String) { + self.push(Diagnostic::error(message)); + } + + fn push_warn(&mut self, message: String) { + self.push(Diagnostic::warn(message)); + } +} diff --git a/crates/dojo/macros/src/inlines/mod.rs b/crates/dojo/macros/src/inlines/mod.rs new file mode 100644 index 0000000000..341596eade --- /dev/null +++ b/crates/dojo/macros/src/inlines/mod.rs @@ -0,0 +1 @@ +pub mod selector_from_tag; diff --git a/crates/dojo/macros/src/inlines/selector_from_tag.rs b/crates/dojo/macros/src/inlines/selector_from_tag.rs new file mode 100644 index 0000000000..d032846805 --- /dev/null +++ b/crates/dojo/macros/src/inlines/selector_from_tag.rs @@ -0,0 +1,59 @@ +use cairo_lang_defs::patcher::PatchBuilder; +use cairo_lang_macro::{inline_macro, ProcMacroResult, TokenStream}; +use cairo_lang_parser::utils::SimpleParserDatabase; +use cairo_lang_syntax::node::kind::SyntaxKind::ItemInlineMacro; +use cairo_lang_syntax::node::{ast, TypedSyntaxNode}; +use dojo_types::naming; + +use crate::proc_macro_result_ext::ProcMacroResultExt; + +#[inline_macro] +pub fn selector_from_tag(token_stream: TokenStream) -> ProcMacroResult { + handle_selector_from_tag_macro(token_stream) +} + +pub fn handle_selector_from_tag_macro(token_stream: TokenStream) -> ProcMacroResult { + let db = SimpleParserDatabase::default(); + let (root_node, _diagnostics) = db.parse_virtual_with_diagnostics(token_stream); + + for n in root_node.descendants(&db) { + if n.kind(&db) == ItemInlineMacro { + let node = ast::ItemInlineMacro::from_syntax_node(&db, n); + + let ast::WrappedArgList::ParenthesizedArgList(arg_list) = node.arguments(&db) else { + return ProcMacroResult::error( + "Macro `selector_from_tag!` does not support this bracket type.".to_string(), + ); + }; + + let args = arg_list.arguments(&db).elements(&db); + + if args.len() != 1 { + return ProcMacroResult::error( + "Invalid arguments. Expected \"selector_from_tag!(\"tag\")\"".to_string(), + ); + } + + let tag = &args[0].as_syntax_node().get_text(&db).replace('\"', ""); + + if !naming::is_valid_tag(tag) { + return ProcMacroResult::error( + "Invalid tag. Tag must be in the format of `namespace-name`.".to_string(), + ); + } + + let selector = naming::compute_selector_from_tag(tag); + + let mut builder = PatchBuilder::new(&db, &node); + builder.add_str(&format!("{:#64x}", selector)); + + let (code, _) = builder.build(); + + return ProcMacroResult::new(TokenStream::new(code)); + } + } + + ProcMacroResult::error( + "Macro `selector_from_tag!` must be called with a string parameter".to_string(), + ) +} diff --git a/crates/dojo/macros/src/lib.rs b/crates/dojo/macros/src/lib.rs new file mode 100644 index 0000000000..9225bc96b0 --- /dev/null +++ b/crates/dojo/macros/src/lib.rs @@ -0,0 +1,21 @@ +pub mod attributes; +pub mod derives; +pub mod diagnostic_ext; +pub mod inlines; +pub mod proc_macro_result_ext; + +#[cfg(test)] +pub mod tests; + +/// Prints the given string only if the `DOJO_EXPAND` environment variable is set. +/// This is useful for debugging the compiler with verbose output. +/// +/// # Arguments +/// +/// * `loc` - The location of the code to be expanded. +/// * `code` - The code to be expanded. +pub fn debug_expand(loc: &str, code: &str) { + if std::env::var("DOJO_EXPAND").is_ok() { + println!("\n// *> EXPAND {} <*\n{}\n\n", loc, code); + } +} diff --git a/crates/dojo/macros/src/proc_macro_result_ext.rs b/crates/dojo/macros/src/proc_macro_result_ext.rs new file mode 100644 index 0000000000..cd984a40af --- /dev/null +++ b/crates/dojo/macros/src/proc_macro_result_ext.rs @@ -0,0 +1,15 @@ +use cairo_lang_macro::{Diagnostics, ProcMacroResult, TokenStream}; + +use crate::diagnostic_ext::DiagnosticsExt; + +pub trait ProcMacroResultExt { + fn error(message: String) -> Self; +} + +impl ProcMacroResultExt for ProcMacroResult { + fn error(message: String) -> Self { + let mut diagnostics = vec![]; + diagnostics.push_error(message); + ProcMacroResult::new(TokenStream::empty()).with_diagnostics(Diagnostics::new(diagnostics)) + } +} diff --git a/crates/dojo/macros/src/tests/attributes/dojo_contract.rs b/crates/dojo/macros/src/tests/attributes/dojo_contract.rs new file mode 100644 index 0000000000..6d029cda0b --- /dev/null +++ b/crates/dojo/macros/src/tests/attributes/dojo_contract.rs @@ -0,0 +1,148 @@ +use cairo_lang_macro::TokenStream; + +use crate::attributes::constants::{DOJO_CONTRACT_ATTR, DOJO_MODEL_ATTR}; +use crate::attributes::dojo_contract::{handle_module_attribute_macro, DOJO_INIT_FN}; +use crate::tests::utils::assert_output_stream; + +const SIMPLE_CONTRACT: &str = " +mod simple_contract { +} +"; + +const EXPANDED_SIMPLE_CONTRACT: &str = include_str!("./expanded/simple_contract.cairo"); + +const COMPLEX_CONTRACT: &str = " +mod complex_contract { + use starknet::{ContractAddress, get_caller_address}; + + #[derive(Copy, Drop, Serde)] + #[dojo::event] + struct MyInit { + #[key] + caller: ContractAddress, + value: u8, + } + + #[storage] + struct Storage { + value: u128 + } + + #[derive(Drop, starknet::Event)] + pub struct MyEvent { + #[key] + pub selector: felt252, + pub value: u64, + } + + #[event] + #[derive(Drop, starknet::Event)] + enum Event { + MyEvent: MyEvent, + } + + #[constructor] + fn constructor(ref self: ContractState) { + self.value.write(12); + } + + fn dojo_init(self: @ContractState, value: u8) { + let mut world = self.world(@\"ns\"); + world.emit_event(@MyInit { caller: get_caller_address(), value }); + } + + #[generate_trait] + impl SelfImpl of SelfTrait { + fn my_internal_function(self: @ContractState) -> u8 { + 42 + } + } +} +"; + +const EXPANDED_COMPLEX_CONTRACT: &str = include_str!("./expanded/complex_contract.cairo"); + +#[test] +fn test_contract_is_not_a_struct() { + let input = TokenStream::new("enum MyEnum { X, Y }".to_string()); + + let res = handle_module_attribute_macro(input); + + assert!(res.diagnostics.is_empty()); + assert!(res.token_stream.is_empty()); +} + +#[test] +fn test_contract_has_duplicated_attributes() { + let input = TokenStream::new(format!( + " + #[{DOJO_CONTRACT_ATTR}] + {SIMPLE_CONTRACT} + " + )); + + let res = handle_module_attribute_macro(input); + + assert_eq!( + res.diagnostics[0].message, + format!("Only one {DOJO_CONTRACT_ATTR} attribute is allowed per module.") + ); +} + +#[test] +fn test_contract_has_attribute_conflict() { + let input = TokenStream::new(format!( + " + #[{DOJO_MODEL_ATTR}] + {SIMPLE_CONTRACT} + " + )); + + let res = handle_module_attribute_macro(input); + + assert_eq!( + res.diagnostics[0].message, + format!("A {DOJO_CONTRACT_ATTR} can't be used together with a {DOJO_MODEL_ATTR}.") + ); +} + +#[test] +fn test_contract_has_bad_init_function() { + let input = TokenStream::new( + " +mod simple_contract { + fn dojo_init(self: @ContractState) -> u8 { + 0 + } +} + " + .to_string(), + ); + + let res = handle_module_attribute_macro(input); + + assert_eq!( + res.diagnostics[0].message, + format!("The {DOJO_INIT_FN} function cannot have a return type.") + ); +} + +#[test] +fn test_simple_contract() { + let input = TokenStream::new(SIMPLE_CONTRACT.to_string()); + + let res = handle_module_attribute_macro(input); + + assert!(res.diagnostics.is_empty()); + assert_output_stream(&res.token_stream, EXPANDED_SIMPLE_CONTRACT); +} + +#[test] +fn test_complex_contract() { + let input = TokenStream::new(COMPLEX_CONTRACT.to_string()); + + let res = handle_module_attribute_macro(input); + + assert!(res.diagnostics.is_empty()); + assert_output_stream(&res.token_stream, EXPANDED_COMPLEX_CONTRACT); +} diff --git a/crates/dojo/macros/src/tests/attributes/dojo_event.rs b/crates/dojo/macros/src/tests/attributes/dojo_event.rs new file mode 100644 index 0000000000..bce35a164d --- /dev/null +++ b/crates/dojo/macros/src/tests/attributes/dojo_event.rs @@ -0,0 +1,213 @@ +use cairo_lang_macro::TokenStream; + +use crate::attributes::constants::{DOJO_EVENT_ATTR, DOJO_MODEL_ATTR}; +use crate::attributes::dojo_event::handle_event_attribute_macro; +use crate::derives::DOJO_PACKED_DERIVE; +use crate::tests::utils::assert_output_stream; + +const SIMPLE_EVENT_WITHOUT_INTROSPECT: &str = " +#[derive(Drop, Serde)] +struct SimpleEvent { + #[key] + k: u32, + v: u32 +}"; + +const SIMPLE_EVENT: &str = " +#[derive(Introspect, Drop, Serde)] +struct SimpleEvent { + #[key] + k: u32, + v: u32 +}"; + +const EXPANDED_SIMPLE_EVENT: &str = include_str!("./expanded/simple_event.cairo"); + +const COMPLEX_EVENT: &str = " +#[derive(Introspect, Drop, Serde)] +struct ComplexEvent { + #[key] + k1: u8, + #[key] + k2: u32, + v1: u256, + v2: Option +}"; + +const EXPANDED_COMPLEX_EVENT: &str = include_str!("./expanded/complex_event.cairo"); + +#[test] +fn test_event_is_not_a_struct() { + let input = TokenStream::new("enum MyEnum { X, Y }".to_string()); + + let res = handle_event_attribute_macro(input); + + assert!(res.diagnostics.is_empty()); + assert!(res.token_stream.is_empty()); +} + +#[test] +fn test_event_has_duplicated_attributes() { + let input = TokenStream::new(format!( + " + #[{DOJO_EVENT_ATTR}] + {SIMPLE_EVENT} + " + )); + + let res = handle_event_attribute_macro(input); + + assert_eq!( + res.diagnostics[0].message, + format!("Only one {DOJO_EVENT_ATTR} attribute is allowed per module.") + ); +} + +#[test] +fn test_event_has_attribute_conflict() { + let input = TokenStream::new(format!( + " + #[{DOJO_MODEL_ATTR}] + {SIMPLE_EVENT} + " + )); + + let res = handle_event_attribute_macro(input); + + assert_eq!( + res.diagnostics[0].message, + format!("A {DOJO_EVENT_ATTR} can't be used together with a {DOJO_MODEL_ATTR}.") + ); +} + +#[test] +fn test_event_has_no_key() { + let input = TokenStream::new( + " + #[derive(Introspect, Drop, Serde)] + struct EventNoKey { + k: u32, + v: u32 + } + " + .to_string(), + ); + + let res = handle_event_attribute_macro(input); + + assert_eq!( + res.diagnostics[0].message, + "Event must define at least one #[key] attribute".to_string() + ); +} + +#[test] +fn test_event_has_no_value() { + let input = TokenStream::new( + " + #[derive(Introspect, Drop, Serde)] + struct EventNoValue { + #[key] + k: u32 + } + " + .to_string(), + ); + + let res = handle_event_attribute_macro(input); + + assert_eq!( + res.diagnostics[0].message, + "Event must define at least one member that is not a key".to_string() + ); +} + +#[test] +fn test_event_derives_from_introspect_packed() { + let input = TokenStream::new( + " + #[derive(IntrospectPacked, Drop, Serde)] + struct SimpleEvent { + #[key] + k: u32, + v: u32 + } + " + .to_string(), + ); + + let res = handle_event_attribute_macro(input); + + assert_eq!( + res.diagnostics[0].message, + format!("Deriving {DOJO_PACKED_DERIVE} on event is not allowed.") + ); +} + +#[test] +fn test_event_does_not_derive_from_drop() { + let input = TokenStream::new( + " + #[derive(Serde)] + struct SimpleModel { + #[key] + k: u32, + v: u32 + } + " + .to_string(), + ); + + let res = handle_event_attribute_macro(input); + + assert_eq!(res.diagnostics[0].message, "Event must derive from Drop and Serde.".to_string()); +} + +#[test] +fn test_event_does_not_derive_from_serde() { + let input = TokenStream::new( + " + #[derive(Drop)] + struct SimpleModel { + #[key] + k: u32, + v: u32 + } + " + .to_string(), + ); + + let res = handle_event_attribute_macro(input); + + assert_eq!(res.diagnostics[0].message, "Event must derive from Drop and Serde.".to_string()); +} + +#[test] +fn test_simple_event_without_introspect() { + let input = TokenStream::new(SIMPLE_EVENT_WITHOUT_INTROSPECT.to_string()); + + let res = handle_event_attribute_macro(input); + + assert!(res.diagnostics.is_empty()); + assert_output_stream(&res.token_stream, EXPANDED_SIMPLE_EVENT); +} + +#[test] +fn test_simple_event() { + let input = TokenStream::new(SIMPLE_EVENT.to_string()); + + let res = handle_event_attribute_macro(input); + + assert!(res.diagnostics.is_empty()); + assert_output_stream(&res.token_stream, EXPANDED_SIMPLE_EVENT); +} + +#[test] +fn test_complex_event() { + let input = TokenStream::new(COMPLEX_EVENT.to_string()); + + let res = handle_event_attribute_macro(input); + + assert!(res.diagnostics.is_empty()); + assert_output_stream(&res.token_stream, EXPANDED_COMPLEX_EVENT); +} diff --git a/crates/dojo/macros/src/tests/attributes/dojo_model.rs b/crates/dojo/macros/src/tests/attributes/dojo_model.rs new file mode 100644 index 0000000000..d5acac0711 --- /dev/null +++ b/crates/dojo/macros/src/tests/attributes/dojo_model.rs @@ -0,0 +1,212 @@ +use cairo_lang_macro::TokenStream; + +use crate::attributes::constants::{DOJO_EVENT_ATTR, DOJO_MODEL_ATTR}; +use crate::attributes::dojo_model::handle_model_attribute_macro; +use crate::tests::utils::assert_output_stream; + +const SIMPLE_MODEL: &str = " +#[derive(Introspect, Drop, Serde)] +struct SimpleModel { + #[key] + k: u32, + v: u32 +}"; + +const SIMPLE_MODEL_WITHOUT_INTROSPECT: &str = " +#[derive(Drop, Serde)] +struct SimpleModel { + #[key] + k: u32, + v: u32 +}"; + +const EXPANDED_SIMPLE_MODEL: &str = include_str!("./expanded/simple_model.cairo"); + +const COMPLEX_MODEL: &str = " +#[derive(Introspect, Drop, Serde)] +struct ComplexModel { + #[key] + k1: u8, + #[key] + k2: u32, + v1: u256, + v2: Option +}"; + +const EXPANDED_COMPLEX_MODEL: &str = include_str!("./expanded/complex_model.cairo"); + +#[test] +fn test_model_is_not_a_struct() { + let input = TokenStream::new("enum MyEnum { X, Y }".to_string()); + + let res = handle_model_attribute_macro(input); + + assert!(res.diagnostics.is_empty()); + assert!(res.token_stream.is_empty()); +} + +#[test] +fn test_model_has_duplicated_attributes() { + let input = TokenStream::new(format!( + " + #[{DOJO_MODEL_ATTR}] + {SIMPLE_MODEL} + " + )); + + let res = handle_model_attribute_macro(input); + + assert_eq!( + res.diagnostics[0].message, + format!("Only one {DOJO_MODEL_ATTR} attribute is allowed per module.") + ); +} + +#[test] +fn test_model_has_attribute_conflict() { + let input = TokenStream::new(format!( + " + #[{DOJO_EVENT_ATTR}] + {SIMPLE_MODEL} + " + )); + + let res = handle_model_attribute_macro(input); + + assert_eq!( + res.diagnostics[0].message, + format!("A {DOJO_MODEL_ATTR} can't be used together with a {DOJO_EVENT_ATTR}.") + ); +} + +#[test] +fn test_model_has_no_key() { + let input = TokenStream::new( + " + #[derive(Introspect, Drop, Serde)] + struct ModelNoKey { + k: u32, + v: u32 + } + " + .to_string(), + ); + + let res = handle_model_attribute_macro(input); + + assert_eq!( + res.diagnostics[0].message, + "Model must define at least one #[key] attribute".to_string() + ); +} + +#[test] +fn test_model_has_no_value() { + let input = TokenStream::new( + " + #[derive(Introspect, Drop, Serde)] + struct ModelNoValue { + #[key] + k: u32 + } + " + .to_string(), + ); + + let res = handle_model_attribute_macro(input); + + assert_eq!( + res.diagnostics[0].message, + "Model must define at least one member that is not a key".to_string() + ); +} + +#[test] +fn test_model_derives_from_both_introspect_and_packed() { + let input = TokenStream::new( + " + #[derive(Introspect, IntrospectPacked, Drop, Serde)] + struct SimpleModel { + #[key] + k: u32, + v: u32 + } + " + .to_string(), + ); + + let res = handle_model_attribute_macro(input); + + assert_eq!( + res.diagnostics[0].message, + "Model cannot derive from both Introspect and IntrospectPacked.".to_string() + ); +} + +#[test] +fn test_model_does_not_derive_from_drop() { + let input = TokenStream::new( + " + #[derive(Serde)] + struct SimpleModel { + #[key] + k: u32, + v: u32 + } + " + .to_string(), + ); + + let res = handle_model_attribute_macro(input); + + assert_eq!(res.diagnostics[0].message, "Model must derive from Drop and Serde.".to_string()); +} + +#[test] +fn test_model_does_not_derive_from_serde() { + let input = TokenStream::new( + " + #[derive(Drop)] + struct SimpleModel { + #[key] + k: u32, + v: u32 + } + " + .to_string(), + ); + + let res = handle_model_attribute_macro(input); + + assert_eq!(res.diagnostics[0].message, "Model must derive from Drop and Serde.".to_string()); +} + +#[test] +fn test_simple_model() { + let input = TokenStream::new(SIMPLE_MODEL.to_string()); + + let res = handle_model_attribute_macro(input); + + assert!(res.diagnostics.is_empty()); + assert_output_stream(&res.token_stream, EXPANDED_SIMPLE_MODEL); +} + +#[test] +fn test_simple_model_without_introspect() { + let input = TokenStream::new(SIMPLE_MODEL_WITHOUT_INTROSPECT.to_string()); + + let res = handle_model_attribute_macro(input); + + assert!(res.diagnostics.is_empty()); + assert_output_stream(&res.token_stream, EXPANDED_SIMPLE_MODEL); +} + +#[test] +fn test_complex_model() { + let input = TokenStream::new(COMPLEX_MODEL.to_string()); + + let res = handle_model_attribute_macro(input); + + assert!(res.diagnostics.is_empty()); + assert_output_stream(&res.token_stream, EXPANDED_COMPLEX_MODEL); +} diff --git a/crates/dojo/macros/src/tests/attributes/expanded/complex_contract.cairo b/crates/dojo/macros/src/tests/attributes/expanded/complex_contract.cairo new file mode 100644 index 0000000000..a301a7f661 --- /dev/null +++ b/crates/dojo/macros/src/tests/attributes/expanded/complex_contract.cairo @@ -0,0 +1,106 @@ +#[starknet::contract] +pub mod complex_contract { + use dojo::contract::components::world_provider::{ + world_provider_cpt, world_provider_cpt::InternalTrait as WorldProviderInternal, + IWorldProvider + }; + use dojo::contract::components::upgradeable::upgradeable_cpt; + use dojo::contract::IContract; + use dojo::meta::IDeployedResource; + + component!(path: world_provider_cpt, storage: world_provider, event: WorldProviderEvent); + component!(path: upgradeable_cpt, storage: upgradeable, event: UpgradeableEvent); + + #[abi(embed_v0)] + impl WorldProviderImpl = world_provider_cpt::WorldProviderImpl; + + #[abi(embed_v0)] + impl UpgradeableImpl = upgradeable_cpt::UpgradeableImpl; + + #[abi(embed_v0)] + pub impl complex_contract__ContractImpl of IContract {} + + #[abi(embed_v0)] + pub impl complex_contract__DeployedContractImpl of IDeployedResource { + fn dojo_name(self: @ContractState) -> ByteArray { + "complex_contract" + } + } + + #[generate_trait] + impl complex_contractInternalImpl of complex_contractInternalTrait { + fn world( + self: @ContractState, namespace: @ByteArray + ) -> dojo::world::storage::WorldStorage { + dojo::world::WorldStorageTrait::new(self.world_provider.world_dispatcher(), namespace) + } + } + + use starknet::{ContractAddress, get_caller_address}; + + #[derive(Copy, Drop, Serde)] + #[dojo::event] + struct MyInit { + #[key] + caller: ContractAddress, + value: u8, + } + + #[storage] + struct Storage { + #[substorage(v0)] + upgradeable: upgradeable_cpt::Storage, + #[substorage(v0)] + world_provider: world_provider_cpt::Storage, + value: u128 + } + + #[derive(Drop, starknet::Event)] + pub struct MyEvent { + #[key] + pub selector: felt252, + pub value: u64, + } + + #[event] + #[derive(Drop, starknet::Event)] + enum Event { + UpgradeableEvent: upgradeable_cpt::Event, + WorldProviderEvent: world_provider_cpt::Event, + MyEvent: MyEvent + } + + #[constructor] + fn constructor(ref self: ContractState) { + self.world_provider.initializer(); + self.value.write(12); + } + + #[abi(per_item)] + #[generate_trait] + pub impl IDojoInitImpl of IDojoInit { + #[external(v0)] + fn dojo_init(self: @ContractState, value: u8) { + if starknet::get_caller_address() != self + .world_provider + .world_dispatcher() + .contract_address { + core::panics::panic_with_byte_array( + @format!( + "Only the world can init contract `{}`, but caller is `{:?}`", + self.dojo_name(), + starknet::get_caller_address() + ) + ); + } + let mut world = self.world(@"ns"); + world.emit_event(@MyInit { caller: get_caller_address(), value }); + } + } + #[generate_trait] + impl SelfImpl of SelfTrait { + fn my_internal_function(self: @ContractState) -> u8 { + 42 + } + } +} diff --git a/crates/dojo/macros/src/tests/attributes/expanded/complex_event.cairo b/crates/dojo/macros/src/tests/attributes/expanded/complex_event.cairo new file mode 100644 index 0000000000..429888c065 --- /dev/null +++ b/crates/dojo/macros/src/tests/attributes/expanded/complex_event.cairo @@ -0,0 +1,89 @@ +#[derive(Introspect)] +struct ComplexEvent { + #[key] + k1: u8, + #[key] + k2: u32, + v1: u256, + v2: Option +} + +// EventValue on it's own does nothing since events are always emitted and +// never read from the storage. However, it's required by the ABI to +// ensure that the event definition contains both keys and values easily distinguishable. +// Only derives strictly required traits. +#[derive(Drop, Serde)] +pub struct ComplexEventValue { + pub v1: u256, + pub v2: Option, +} + +pub impl ComplexEventDefinition of dojo::event::EventDefinition { + #[inline(always)] + fn name() -> ByteArray { + "ComplexEvent" + } +} + +pub impl ComplexEventModelParser of dojo::model::model::ModelParser { + fn serialize_keys(self: @ComplexEvent) -> Span { + let mut serialized = core::array::ArrayTrait::new(); + core::serde::Serde::serialize(self.k1, ref serialized); + core::serde::Serde::serialize(self.k2, ref serialized); + + core::array::ArrayTrait::span(@serialized) + } + fn serialize_values(self: @ComplexEvent) -> Span { + let mut serialized = core::array::ArrayTrait::new(); + core::serde::Serde::serialize(self.v1, ref serialized); + core::serde::Serde::serialize(self.v2, ref serialized); + + core::array::ArrayTrait::span(@serialized) + } +} + +pub impl ComplexEventEventImpl = dojo::event::event::EventImpl; + +#[starknet::contract] +pub mod e_ComplexEvent { + use super::ComplexEvent; + use super::ComplexEventValue; + + #[storage] + struct Storage {} + + #[abi(embed_v0)] + impl ComplexEvent__DeployedEventImpl = + dojo::event::component::IDeployedEventImpl; + + #[abi(embed_v0)] + impl ComplexEvent__StoredEventImpl = + dojo::event::component::IStoredEventImpl; + + #[abi(embed_v0)] + impl ComplexEvent__EventImpl = + dojo::event::component::IEventImpl; + + #[abi(per_item)] + #[generate_trait] + impl ComplexEventImpl of IComplexEvent { + // Ensures the ABI contains the Event struct, since it's never used + // by systems directly. + #[external(v0)] + fn ensure_abi(self: @ContractState, event: ComplexEvent) { + let _event = event; + } + + // Outputs EventValue to allow a simple diff from the ABI compared to the + // event to retrieved the keys of an event. + #[external(v0)] + fn ensure_values(self: @ContractState, value: ComplexEventValue) { + let _value = value; + } + + // Ensures the generated contract has a unique classhash, using + // a hardcoded hash computed on event and member names. + #[external(v0)] + fn ensure_unique(self: @ContractState) {} + } +} diff --git a/crates/dojo/macros/src/tests/attributes/expanded/complex_model.cairo b/crates/dojo/macros/src/tests/attributes/expanded/complex_model.cairo new file mode 100644 index 0000000000..2b9daeb044 --- /dev/null +++ b/crates/dojo/macros/src/tests/attributes/expanded/complex_model.cairo @@ -0,0 +1,140 @@ +#[derive(Introspect)] +struct ComplexModel { + #[key] + k1: u8, + #[key] + k2: u32, + v1: u256, + v2: Option +} + +#[derive(Drop, Serde)] +pub struct ComplexModelValue { + pub v1: u256, + pub v2: Option, +} + +type ComplexModelKeyType = (u8, u32); + +pub impl ComplexModelKeyParser of dojo::model::model::KeyParser { + #[inline(always)] + fn parse_key(self: @ComplexModel) -> ComplexModelKeyType { + (*self.k1, *self.k2) + } +} + +impl ComplexModelModelValueKey of dojo::model::model_value::ModelValueKey< + ComplexModelValue, ComplexModelKeyType +> {} + +// Impl to get the static definition of a model +pub mod m_ComplexModel_definition { + use super::ComplexModel; + pub impl ComplexModelDefinitionImpl of dojo::model::ModelDefinition { + #[inline(always)] + fn name() -> ByteArray { + "ComplexModel" + } + + #[inline(always)] + fn layout() -> dojo::meta::Layout { + dojo::meta::Introspect::::layout() + } + + #[inline(always)] + fn schema() -> dojo::meta::introspect::Struct { + if let dojo::meta::introspect::Ty::Struct(s) = + dojo::meta::Introspect::::ty() { + s + } else { + panic!("Model `ComplexModel`: invalid schema.") + } + } + + #[inline(always)] + fn size() -> Option { + dojo::meta::Introspect::::size() + } + } +} + +pub impl ComplexModelDefinition = + m_ComplexModel_definition::ComplexModelDefinitionImpl; +pub impl ComplexModelModelValueDefinition = + m_ComplexModel_definition::ComplexModelDefinitionImpl; + +pub impl ComplexModelModelParser of dojo::model::model::ModelParser { + fn serialize_keys(self: @ComplexModel) -> Span { + let mut serialized = core::array::ArrayTrait::new(); + core::serde::Serde::serialize(self.k1, ref serialized); + core::serde::Serde::serialize(self.k2, ref serialized); + + core::array::ArrayTrait::span(@serialized) + } + fn serialize_values(self: @ComplexModel) -> Span { + let mut serialized = core::array::ArrayTrait::new(); + core::serde::Serde::serialize(self.v1, ref serialized); + core::serde::Serde::serialize(self.v2, ref serialized); + + core::array::ArrayTrait::span(@serialized) + } +} + +pub impl ComplexModelModelValueParser of dojo::model::model_value::ModelValueParser< + ComplexModelValue +> { + fn serialize_values(self: @ComplexModelValue) -> Span { + let mut serialized = core::array::ArrayTrait::new(); + core::serde::Serde::serialize(self.v1, ref serialized); + core::serde::Serde::serialize(self.v2, ref serialized); + + core::array::ArrayTrait::span(@serialized) + } +} + +pub impl ComplexModelModelImpl = dojo::model::model::ModelImpl; +pub impl ComplexModelModelValueImpl = dojo::model::model_value::ModelValueImpl; + +#[starknet::contract] +pub mod m_ComplexModel { + use super::ComplexModel; + use super::ComplexModelValue; + + #[storage] + struct Storage {} + + #[abi(embed_v0)] + impl ComplexModel__DojoDeployedModelImpl = + dojo::model::component::IDeployedModelImpl; + + #[abi(embed_v0)] + impl ComplexModel__DojoStoredModelImpl = + dojo::model::component::IStoredModelImpl; + + #[abi(embed_v0)] + impl ComplexModel__DojoModelImpl = + dojo::model::component::IModelImpl; + + #[abi(per_item)] + #[generate_trait] + impl ComplexModelImpl of IComplexModel { + // Ensures the ABI contains the Model struct, even if never used + // into as a system input. + #[external(v0)] + fn ensure_abi(self: @ContractState, model: ComplexModel) { + let _model = model; + } + + // Outputs ModelValue to allow a simple diff from the ABI compared to the + // model to retrieved the keys of a model. + #[external(v0)] + fn ensure_values(self: @ContractState, value: ComplexModelValue) { + let _value = value; + } + + // Ensures the generated contract has a unique classhash, using + // a hardcoded hash computed on model and member names. + #[external(v0)] + fn ensure_unique(self: @ContractState) {} + } +} diff --git a/crates/dojo/macros/src/tests/attributes/expanded/simple_contract.cairo b/crates/dojo/macros/src/tests/attributes/expanded/simple_contract.cairo new file mode 100644 index 0000000000..848ac02431 --- /dev/null +++ b/crates/dojo/macros/src/tests/attributes/expanded/simple_contract.cairo @@ -0,0 +1,78 @@ +#[starknet::contract] +pub mod simple_contract { + use dojo::contract::components::world_provider::{ + world_provider_cpt, world_provider_cpt::InternalTrait as WorldProviderInternal, + IWorldProvider + }; + use dojo::contract::components::upgradeable::upgradeable_cpt; + use dojo::contract::IContract; + use dojo::meta::IDeployedResource; + + component!(path: world_provider_cpt, storage: world_provider, event: WorldProviderEvent); + component!(path: upgradeable_cpt, storage: upgradeable, event: UpgradeableEvent); + + #[abi(embed_v0)] + impl WorldProviderImpl = world_provider_cpt::WorldProviderImpl; + + #[abi(embed_v0)] + impl UpgradeableImpl = upgradeable_cpt::UpgradeableImpl; + + #[abi(embed_v0)] + pub impl simple_contract__ContractImpl of IContract {} + + #[abi(embed_v0)] + pub impl simple_contract__DeployedContractImpl of IDeployedResource { + fn dojo_name(self: @ContractState) -> ByteArray { + "simple_contract" + } + } + + #[generate_trait] + impl simple_contractInternalImpl of simple_contractInternalTrait { + fn world( + self: @ContractState, namespace: @ByteArray + ) -> dojo::world::storage::WorldStorage { + dojo::world::WorldStorageTrait::new(self.world_provider.world_dispatcher(), namespace) + } + } + + + #[constructor] + fn constructor(ref self: ContractState) { + self.world_provider.initializer(); + } + #[abi(per_item)] + #[generate_trait] + pub impl IDojoInitImpl of IDojoInit { + #[external(v0)] + fn dojo_init(self: @ContractState) { + if starknet::get_caller_address() != self + .world_provider + .world_dispatcher() + .contract_address { + core::panics::panic_with_byte_array( + @format!( + "Only the world can init contract `{}`, but caller is `{:?}`", + self.dojo_name(), + starknet::get_caller_address(), + ) + ); + } + } + } + + #[event] + #[derive(Drop, starknet::Event)] + enum Event { + UpgradeableEvent: upgradeable_cpt::Event, + WorldProviderEvent: world_provider_cpt::Event, + } + + #[storage] + struct Storage { + #[substorage(v0)] + upgradeable: upgradeable_cpt::Storage, + #[substorage(v0)] + world_provider: world_provider_cpt::Storage, + } +} diff --git a/crates/dojo/macros/src/tests/attributes/expanded/simple_event.cairo b/crates/dojo/macros/src/tests/attributes/expanded/simple_event.cairo new file mode 100644 index 0000000000..caa83a6e87 --- /dev/null +++ b/crates/dojo/macros/src/tests/attributes/expanded/simple_event.cairo @@ -0,0 +1,83 @@ +#[derive(Introspect)] +struct SimpleEvent { + #[key] + k: u32, + v: u32 +} + +// EventValue on it's own does nothing since events are always emitted and +// never read from the storage. However, it's required by the ABI to +// ensure that the event definition contains both keys and values easily distinguishable. +// Only derives strictly required traits. +#[derive(Drop, Serde)] +pub struct SimpleEventValue { + pub v: u32, +} + +pub impl SimpleEventDefinition of dojo::event::EventDefinition { + #[inline(always)] + fn name() -> ByteArray { + "SimpleEvent" + } +} + +pub impl SimpleEventModelParser of dojo::model::model::ModelParser { + fn serialize_keys(self: @SimpleEvent) -> Span { + let mut serialized = core::array::ArrayTrait::new(); + core::serde::Serde::serialize(self.k, ref serialized); + + core::array::ArrayTrait::span(@serialized) + } + fn serialize_values(self: @SimpleEvent) -> Span { + let mut serialized = core::array::ArrayTrait::new(); + core::serde::Serde::serialize(self.v, ref serialized); + + core::array::ArrayTrait::span(@serialized) + } +} + +pub impl SimpleEventEventImpl = dojo::event::event::EventImpl; + +#[starknet::contract] +pub mod e_SimpleEvent { + use super::SimpleEvent; + use super::SimpleEventValue; + + #[storage] + struct Storage {} + + #[abi(embed_v0)] + impl SimpleEvent__DeployedEventImpl = + dojo::event::component::IDeployedEventImpl; + + #[abi(embed_v0)] + impl SimpleEvent__StoredEventImpl = + dojo::event::component::IStoredEventImpl; + + #[abi(embed_v0)] + impl SimpleEvent__EventImpl = + dojo::event::component::IEventImpl; + + #[abi(per_item)] + #[generate_trait] + impl SimpleEventImpl of ISimpleEvent { + // Ensures the ABI contains the Event struct, since it's never used + // by systems directly. + #[external(v0)] + fn ensure_abi(self: @ContractState, event: SimpleEvent) { + let _event = event; + } + + // Outputs EventValue to allow a simple diff from the ABI compared to the + // event to retrieved the keys of an event. + #[external(v0)] + fn ensure_values(self: @ContractState, value: SimpleEventValue) { + let _value = value; + } + + // Ensures the generated contract has a unique classhash, using + // a hardcoded hash computed on event and member names. + #[external(v0)] + fn ensure_unique(self: @ContractState) {} + } +} diff --git a/crates/dojo/macros/src/tests/attributes/expanded/simple_model.cairo b/crates/dojo/macros/src/tests/attributes/expanded/simple_model.cairo new file mode 100644 index 0000000000..36323ca14b --- /dev/null +++ b/crates/dojo/macros/src/tests/attributes/expanded/simple_model.cairo @@ -0,0 +1,132 @@ +#[derive(Introspect)] +struct SimpleModel { + #[key] + k: u32, + v: u32 +} + +#[derive(Drop, Serde)] +pub struct SimpleModelValue { + pub v: u32, +} + +type SimpleModelKeyType = u32; + +pub impl SimpleModelKeyParser of dojo::model::model::KeyParser { + #[inline(always)] + fn parse_key(self: @SimpleModel) -> SimpleModelKeyType { + *self.k + } +} + +impl SimpleModelModelValueKey of dojo::model::model_value::ModelValueKey< + SimpleModelValue, SimpleModelKeyType +> {} + +// Impl to get the static definition of a model +pub mod m_SimpleModel_definition { + use super::SimpleModel; + pub impl SimpleModelDefinitionImpl of dojo::model::ModelDefinition { + #[inline(always)] + fn name() -> ByteArray { + "SimpleModel" + } + + #[inline(always)] + fn layout() -> dojo::meta::Layout { + dojo::meta::Introspect::::layout() + } + + #[inline(always)] + fn schema() -> dojo::meta::introspect::Struct { + if let dojo::meta::introspect::Ty::Struct(s) = + dojo::meta::Introspect::::ty() { + s + } else { + panic!("Model `SimpleModel`: invalid schema.") + } + } + + #[inline(always)] + fn size() -> Option { + dojo::meta::Introspect::::size() + } + } +} + +pub impl SimpleModelDefinition = m_SimpleModel_definition::SimpleModelDefinitionImpl; +pub impl SimpleModelModelValueDefinition = + m_SimpleModel_definition::SimpleModelDefinitionImpl; + +pub impl SimpleModelModelParser of dojo::model::model::ModelParser { + fn serialize_keys(self: @SimpleModel) -> Span { + let mut serialized = core::array::ArrayTrait::new(); + core::serde::Serde::serialize(self.k, ref serialized); + + core::array::ArrayTrait::span(@serialized) + } + fn serialize_values(self: @SimpleModel) -> Span { + let mut serialized = core::array::ArrayTrait::new(); + core::serde::Serde::serialize(self.v, ref serialized); + + core::array::ArrayTrait::span(@serialized) + } +} + +pub impl SimpleModelModelValueParser of dojo::model::model_value::ModelValueParser< + SimpleModelValue +> { + fn serialize_values(self: @SimpleModelValue) -> Span { + let mut serialized = core::array::ArrayTrait::new(); + core::serde::Serde::serialize(self.v, ref serialized); + + core::array::ArrayTrait::span(@serialized) + } +} + +pub impl SimpleModelModelImpl = dojo::model::model::ModelImpl; +pub impl SimpleModelModelValueImpl = dojo::model::model_value::ModelValueImpl; + +#[starknet::contract] +pub mod m_SimpleModel { + use super::SimpleModel; + use super::SimpleModelValue; + + #[storage] + struct Storage {} + + #[abi(embed_v0)] + impl SimpleModel__DojoDeployedModelImpl = + dojo::model::component::IDeployedModelImpl; + + #[abi(embed_v0)] + impl SimpleModel__DojoStoredModelImpl = + dojo::model::component::IStoredModelImpl; + + #[abi(embed_v0)] + impl SimpleModel__DojoModelImpl = + dojo::model::component::IModelImpl; + + #[abi(per_item)] + #[generate_trait] + impl SimpleModelImpl of ISimpleModel { + // Ensures the ABI contains the Model struct, even if never used + // into as a system input. + #[external(v0)] + fn ensure_abi(self: @ContractState, model: SimpleModel) { + let _model = model; + } + + // Outputs ModelValue to allow a simple diff from the ABI compared to the + // model to retrieved the keys of a model. + #[external(v0)] + fn ensure_values(self: @ContractState, value: SimpleModelValue) { + let _value = value; + } + + // Ensures the generated contract has a unique classhash, using + // a hardcoded hash computed on model and member names. + #[external(v0)] + fn ensure_unique(self: @ContractState) {} + } +} diff --git a/crates/dojo/macros/src/tests/derives/expanded/complex_enum.cairo b/crates/dojo/macros/src/tests/derives/expanded/complex_enum.cairo new file mode 100644 index 0000000000..ba61d4fa31 --- /dev/null +++ b/crates/dojo/macros/src/tests/derives/expanded/complex_enum.cairo @@ -0,0 +1,57 @@ +impl ComplexEnumIntrospect<> of dojo::meta::introspect::Introspect> { + #[inline(always)] + fn size() -> Option { + Option::None + } + + fn layout() -> dojo::meta::Layout { + dojo::meta::Layout::Enum( + array![ + dojo::meta::FieldLayout { + selector: 0, layout: dojo::meta::introspect::Introspect::::layout() + }, + dojo::meta::FieldLayout { + selector: 1, layout: dojo::meta::introspect::Introspect::>::layout() + }, + dojo::meta::FieldLayout { + selector: 2, + layout: dojo::meta::Layout::Tuple( + array![ + dojo::meta::introspect::Introspect::::layout(), + dojo::meta::introspect::Introspect::::layout(), + dojo::meta::introspect::Introspect::::layout() + ] + .span() + ) + } + ] + .span() + ) + } + + #[inline(always)] + fn ty() -> dojo::meta::introspect::Ty { + dojo::meta::introspect::Ty::Enum( + dojo::meta::introspect::Enum { + name: 'ComplexEnum', + attrs: array![].span(), + children: array![ + ('VARIANT1', dojo::meta::introspect::Introspect::::ty()), + ('VARIANT2', dojo::meta::introspect::Introspect::>::ty()), + ( + 'VARIANT3', + dojo::meta::introspect::Ty::Tuple( + array![ + dojo::meta::introspect::Introspect::::ty(), + dojo::meta::introspect::Introspect::::ty(), + dojo::meta::introspect::Introspect::::ty() + ] + .span() + ) + ) + ] + .span() + } + ) + } +} diff --git a/crates/dojo/macros/src/tests/derives/expanded/complex_struct.cairo b/crates/dojo/macros/src/tests/derives/expanded/complex_struct.cairo new file mode 100644 index 0000000000..e3d04e9520 --- /dev/null +++ b/crates/dojo/macros/src/tests/derives/expanded/complex_struct.cairo @@ -0,0 +1,82 @@ +impl ComplexStructIntrospect<> of dojo::meta::introspect::Introspect> { + #[inline(always)] + fn size() -> Option { + Option::None + } + + fn layout() -> dojo::meta::Layout { + dojo::meta::Layout::Struct( + array![ + dojo::meta::FieldLayout { + selector: 687013198911006804117413256380548377255056948723479227932116677690621743639, + layout: dojo::meta::introspect::Introspect::>::layout() + }, + dojo::meta::FieldLayout { + selector: 573200779692275582020388969134054872186051594998702457223229675092771367647, + layout: dojo::meta::introspect::Introspect::>::layout() + }, + dojo::meta::FieldLayout { + selector: 268067745408767739723108330020913373797853558774636706294407751171317330906, + layout: dojo::meta::Layout::Tuple( + array![ + dojo::meta::introspect::Introspect::>::layout(), + dojo::meta::introspect::Introspect::::layout(), + dojo::meta::introspect::Introspect::>::layout() + ] + .span() + ) + } + ] + .span() + ) + } + + #[inline(always)] + fn ty() -> dojo::meta::introspect::Ty { + dojo::meta::introspect::Ty::Struct( + dojo::meta::introspect::Struct { + name: 'ComplexStruct', + attrs: array![].span(), + children: array![ + dojo::meta::introspect::Member { + name: 'k1', + attrs: array!['key'].span(), + ty: dojo::meta::introspect::Introspect::::ty() + }, + dojo::meta::introspect::Member { + name: 'k2', + attrs: array!['key'].span(), + ty: dojo::meta::introspect::Introspect::::ty() + }, + dojo::meta::introspect::Member { + name: 'v1', + attrs: array![].span(), + ty: dojo::meta::introspect::Ty::Array( + array![dojo::meta::introspect::Introspect::::ty()].span() + ) + }, + dojo::meta::introspect::Member { + name: 'v2', + attrs: array![].span(), + ty: dojo::meta::introspect::Introspect::>::ty() + }, + dojo::meta::introspect::Member { + name: 'v3', + attrs: array![].span(), + ty: dojo::meta::introspect::Ty::Tuple( + array![ + dojo::meta::introspect::Ty::Array( + array![dojo::meta::introspect::Introspect::::ty()].span() + ), + dojo::meta::introspect::Introspect::::ty(), + dojo::meta::introspect::Introspect::>::ty() + ] + .span() + ) + } + ] + .span() + } + ) + } +} diff --git a/crates/dojo/macros/src/tests/derives/expanded/packed_enum.cairo b/crates/dojo/macros/src/tests/derives/expanded/packed_enum.cairo new file mode 100644 index 0000000000..7a993979c2 --- /dev/null +++ b/crates/dojo/macros/src/tests/derives/expanded/packed_enum.cairo @@ -0,0 +1,87 @@ +impl PackedEnumIntrospect<> of dojo::meta::introspect::Introspect> { + #[inline(always)] + fn size() -> Option { + Option::Some(3) + } + + fn layout() -> dojo::meta::Layout { + dojo::meta::Layout::Enum( + array![ + dojo::meta::FieldLayout { + selector: 0, + layout: dojo::meta::Layout::Tuple( + array![ + dojo::meta::introspect::Introspect::::layout(), + dojo::meta::introspect::Introspect::::layout() + ] + .span() + ) + }, + dojo::meta::FieldLayout { + selector: 1, + layout: dojo::meta::Layout::Tuple( + array![ + dojo::meta::introspect::Introspect::::layout(), + dojo::meta::introspect::Introspect::::layout() + ] + .span() + ) + }, + dojo::meta::FieldLayout { + selector: 2, + layout: dojo::meta::Layout::Tuple( + array![ + dojo::meta::introspect::Introspect::::layout(), + dojo::meta::introspect::Introspect::::layout() + ] + .span() + ) + } + ] + .span() + ) + } + + #[inline(always)] + fn ty() -> dojo::meta::introspect::Ty { + dojo::meta::introspect::Ty::Enum( + dojo::meta::introspect::Enum { + name: 'PackedEnum', + attrs: array![].span(), + children: array![ + ( + 'VARIANT1', + dojo::meta::introspect::Ty::Tuple( + array![ + dojo::meta::introspect::Introspect::::ty(), + dojo::meta::introspect::Introspect::::ty() + ] + .span() + ) + ), + ( + 'VARIANT2', + dojo::meta::introspect::Ty::Tuple( + array![ + dojo::meta::introspect::Introspect::::ty(), + dojo::meta::introspect::Introspect::::ty() + ] + .span() + ) + ), + ( + 'VARIANT3', + dojo::meta::introspect::Ty::Tuple( + array![ + dojo::meta::introspect::Introspect::::ty(), + dojo::meta::introspect::Introspect::::ty() + ] + .span() + ) + ) + ] + .span() + } + ) + } +} diff --git a/crates/dojo/macros/src/tests/derives/expanded/packed_struct.cairo b/crates/dojo/macros/src/tests/derives/expanded/packed_struct.cairo new file mode 100644 index 0000000000..dc305e79df --- /dev/null +++ b/crates/dojo/macros/src/tests/derives/expanded/packed_struct.cairo @@ -0,0 +1,44 @@ +impl SimpleStructIntrospect<> of dojo::meta::introspect::Introspect> { + #[inline(always)] + fn size() -> Option { + Option::Some(3) + } + + fn layout() -> dojo::meta::Layout { + dojo::meta::Layout::Fixed(array![32, 8, 16].span()) + } + + #[inline(always)] + fn ty() -> dojo::meta::introspect::Ty { + dojo::meta::introspect::Ty::Struct( + dojo::meta::introspect::Struct { + name: 'SimpleStruct', + attrs: array![].span(), + children: array![ + dojo::meta::introspect::Member { + name: 'k1', + attrs: array!['key'].span(), + ty: dojo::meta::introspect::Introspect::::ty() + }, + dojo::meta::introspect::Member { + name: 'v1', + attrs: array![].span(), + ty: dojo::meta::introspect::Introspect::::ty() + }, + dojo::meta::introspect::Member { + name: 'v2', + attrs: array![].span(), + ty: dojo::meta::introspect::Ty::Tuple( + array![ + dojo::meta::introspect::Introspect::::ty(), + dojo::meta::introspect::Introspect::::ty() + ] + .span() + ) + } + ] + .span() + } + ) + } +} diff --git a/crates/dojo/macros/src/tests/derives/expanded/simple_enum.cairo b/crates/dojo/macros/src/tests/derives/expanded/simple_enum.cairo new file mode 100644 index 0000000000..aee76638fa --- /dev/null +++ b/crates/dojo/macros/src/tests/derives/expanded/simple_enum.cairo @@ -0,0 +1,39 @@ +impl SimpleEnumIntrospect<> of dojo::meta::introspect::Introspect> { + #[inline(always)] + fn size() -> Option { + Option::Some(1) + } + + fn layout() -> dojo::meta::Layout { + dojo::meta::Layout::Enum( + array![ + dojo::meta::FieldLayout { + selector: 0, layout: dojo::meta::Layout::Fixed(array![].span()) + }, + dojo::meta::FieldLayout { + selector: 1, layout: dojo::meta::Layout::Fixed(array![].span()) + }, + dojo::meta::FieldLayout { + selector: 2, layout: dojo::meta::Layout::Fixed(array![].span()) + } + ] + .span() + ) + } + + #[inline(always)] + fn ty() -> dojo::meta::introspect::Ty { + dojo::meta::introspect::Ty::Enum( + dojo::meta::introspect::Enum { + name: 'SimpleEnum', + attrs: array![].span(), + children: array![ + ('VARIANT1', dojo::meta::introspect::Ty::Tuple(array![].span())), + ('VARIANT2', dojo::meta::introspect::Ty::Tuple(array![].span())), + ('VARIANT3', dojo::meta::introspect::Ty::Tuple(array![].span())) + ] + .span() + } + ) + } +} diff --git a/crates/dojo/macros/src/tests/derives/expanded/simple_struct.cairo b/crates/dojo/macros/src/tests/derives/expanded/simple_struct.cairo new file mode 100644 index 0000000000..9a797e8b20 --- /dev/null +++ b/crates/dojo/macros/src/tests/derives/expanded/simple_struct.cairo @@ -0,0 +1,62 @@ +impl SimpleStructIntrospect<> of dojo::meta::introspect::Introspect> { + #[inline(always)] + fn size() -> Option { + Option::Some(3) + } + + fn layout() -> dojo::meta::Layout { + dojo::meta::Layout::Struct( + array![ + dojo::meta::FieldLayout { + selector: 687013198911006804117413256380548377255056948723479227932116677690621743639, + layout: dojo::meta::introspect::Introspect::::layout() + }, + dojo::meta::FieldLayout { + selector: 573200779692275582020388969134054872186051594998702457223229675092771367647, + layout: dojo::meta::Layout::Tuple( + array![ + dojo::meta::introspect::Introspect::::layout(), + dojo::meta::introspect::Introspect::::layout() + ] + .span() + ) + } + ] + .span() + ) + } + + #[inline(always)] + fn ty() -> dojo::meta::introspect::Ty { + dojo::meta::introspect::Ty::Struct( + dojo::meta::introspect::Struct { + name: 'SimpleStruct', + attrs: array![].span(), + children: array![ + dojo::meta::introspect::Member { + name: 'k1', + attrs: array!['key'].span(), + ty: dojo::meta::introspect::Introspect::::ty() + }, + dojo::meta::introspect::Member { + name: 'v1', + attrs: array![].span(), + ty: dojo::meta::introspect::Introspect::::ty() + }, + dojo::meta::introspect::Member { + name: 'v2', + attrs: array![].span(), + ty: dojo::meta::introspect::Ty::Tuple( + array![ + dojo::meta::introspect::Introspect::::ty(), + dojo::meta::introspect::Introspect::::ty() + ] + .span() + ) + } + ] + .span() + } + ) + } +} diff --git a/crates/dojo/macros/src/tests/derives/introspect.rs b/crates/dojo/macros/src/tests/derives/introspect.rs new file mode 100644 index 0000000000..240d4329f0 --- /dev/null +++ b/crates/dojo/macros/src/tests/derives/introspect.rs @@ -0,0 +1,202 @@ +use cairo_lang_macro::TokenStream; + +use crate::derives::handle_derives_macros; +use crate::tests::utils::assert_output_stream; + +const SIMPLE_STRUCT: &str = " +#[derive(Introspect)] +struct SimpleStruct { + #[key] + k1: u256, + v1: u32, + v2: (u8, u16), +} +"; + +const EXPANDED_SIMPLE_STRUCT: &str = include_str!("./expanded/simple_struct.cairo"); + +const PACKED_STRUCT: &str = " +#[derive(IntrospectPacked)] +struct SimpleStruct { + #[key] + k1: u256, + v1: u32, + v2: (u8, u16), +} +"; + +const EXPANDED_PACKED_STRUCT: &str = include_str!("./expanded/packed_struct.cairo"); + +const COMPLEX_STRUCT: &str = " +#[derive(Introspect)] +struct ComplexStruct { + #[key] + k1: u256, + #[key] + k2: u32, + v1: Array, + v2: Option, + v3: (Array, u16, Option) +} +"; + +const EXPANDED_COMPLEX_STRUCT: &str = include_str!("./expanded/complex_struct.cairo"); + +const SIMPLE_ENUM: &str = " +#[derive(Introspect)] +enum SimpleEnum { + VARIANT1, + VARIANT2, + VARIANT3 +} +"; + +const EXPANDED_SIMPLE_ENUM: &str = include_str!("./expanded/simple_enum.cairo"); + +const PACKED_ENUM: &str = " +#[derive(Introspect)] +enum PackedEnum { + VARIANT1: (u32, u128), + VARIANT2: (u32, u128), + VARIANT3: (u32, u128), +} +"; + +const EXPANDED_PACKED_ENUM: &str = include_str!("./expanded/packed_enum.cairo"); + +const COMPLEX_ENUM: &str = " +#[derive(Introspect)] +enum ComplexEnum { + VARIANT1: u32, + VARIANT2: Option, + VARIANT3: (u8, u16, u32) +} +"; + +const EXPANDED_COMPLEX_ENUM: &str = include_str!("./expanded/complex_enum.cairo"); + +#[test] +fn test_bad_type() { + let input = TokenStream::new("mod my_module {}".to_string()); + + let res = handle_derives_macros(input); + + assert!(res.diagnostics.is_empty()); + assert!(res.token_stream.is_empty()); +} + +#[test] +fn test_attribute_conflict() { + let input = TokenStream::new( + "#[derive(Introspect, IntrospectPacked)] + struct MyStruct { + v: u32 + }" + .to_string(), + ); + + let res = handle_derives_macros(input); + + assert_eq!( + res.diagnostics[0].message, + format!("Introspect and IntrospectPacked attributes cannot be used at a same time.") + ); +} + +#[test] +fn test_tuple_in_option_error() { + let input = TokenStream::new( + "#[derive(Introspect)] + enum MyEnum { + V1: Option<(u8, u32)> + V2: Option<(u8, u32)> + }" + .to_string(), + ); + + let res = handle_derives_macros(input); + + assert_eq!( + res.diagnostics[0].message, + format!("Option cannot be used with tuples. Prefer using a struct.") + ); +} + +#[test] +fn test_bad_enum_for_introspect_packed() { + let input = TokenStream::new( + "#[derive(IntrospectPacked)] + enum MyEnum { + V1: Option, + V2: u128 + }" + .to_string(), + ); + + let res = handle_derives_macros(input); + + assert_eq!( + res.diagnostics[0].message, + format!("To be packed, all variants must have fixed layout of same size.") + ); +} + +#[test] +fn test_simple_struct() { + let input = TokenStream::new(SIMPLE_STRUCT.to_string()); + + let res = handle_derives_macros(input); + + assert!(res.diagnostics.is_empty()); + assert_output_stream(&res.token_stream, EXPANDED_SIMPLE_STRUCT); +} + +#[test] +fn test_packed_struct() { + let input = TokenStream::new(PACKED_STRUCT.to_string()); + + let res = handle_derives_macros(input); + + assert!(res.diagnostics.is_empty()); + assert_output_stream(&res.token_stream, EXPANDED_PACKED_STRUCT); +} + +#[test] +fn test_complex_struct() { + let input = TokenStream::new(COMPLEX_STRUCT.to_string()); + + let res = handle_derives_macros(input); + + assert!(res.diagnostics.is_empty()); + assert_output_stream(&res.token_stream, EXPANDED_COMPLEX_STRUCT); +} + +#[test] +fn test_simple_enum() { + let input = TokenStream::new(SIMPLE_ENUM.to_string()); + + let res = handle_derives_macros(input); + + assert!(res.diagnostics.is_empty()); + assert_output_stream(&res.token_stream, EXPANDED_SIMPLE_ENUM); +} + +#[test] +fn test_packed_enum() { + let input = TokenStream::new(PACKED_ENUM.to_string()); + + let res = handle_derives_macros(input); + + assert!(res.diagnostics.is_empty()); + assert_output_stream(&res.token_stream, EXPANDED_PACKED_ENUM); +} + +#[test] +fn test_complex_enum() { + let input = TokenStream::new(COMPLEX_ENUM.to_string()); + + let res = handle_derives_macros(input); + + assert!(res.diagnostics.is_empty()); + assert_output_stream(&res.token_stream, EXPANDED_COMPLEX_ENUM); +} diff --git a/crates/dojo/macros/src/tests/inlines/selector_from_tag.rs b/crates/dojo/macros/src/tests/inlines/selector_from_tag.rs new file mode 100644 index 0000000000..893d1123b8 --- /dev/null +++ b/crates/dojo/macros/src/tests/inlines/selector_from_tag.rs @@ -0,0 +1,65 @@ +use cairo_lang_macro::TokenStream; +use dojo_types::naming; + +use crate::inlines::selector_from_tag::handle_selector_from_tag_macro; + +#[test] +fn test_with_bad_type() { + let input = TokenStream::new("enum MyEnum { X, Y }".to_string()); + + let res = handle_selector_from_tag_macro(input); + + assert_eq!( + res.diagnostics[0].message, + "Macro `selector_from_tag!` must be called with a string parameter".to_string() + ); +} + +#[test] +fn test_with_bad_argument_type() { + let input = TokenStream::new("selector_from_tag![\"one\"]".to_string()); + + let res = handle_selector_from_tag_macro(input); + + assert_eq!( + res.diagnostics[0].message, + "Macro `selector_from_tag!` does not support this bracket type.".to_string() + ); +} + +#[test] +fn test_with_multiple_arguments() { + let input = TokenStream::new("selector_from_tag!(\"one\", \"two\")".to_string()); + + let res = handle_selector_from_tag_macro(input); + + assert_eq!( + res.diagnostics[0].message, + "Invalid arguments. Expected \"selector_from_tag!(\"tag\")\"".to_string() + ); +} + +#[test] +fn test_with_bad_tag() { + let input = TokenStream::new("selector_from_tag!(\"my_contract\")".to_string()); + + let res = handle_selector_from_tag_macro(input); + + assert_eq!( + res.diagnostics[0].message, + "Invalid tag. Tag must be in the format of `namespace-name`.".to_string() + ); +} + +#[test] +fn test_nominal_case() { + let input = TokenStream::new("selector_from_tag!(\"dojo-my_contract\")".to_string()); + + let res = handle_selector_from_tag_macro(input); + + assert!(res.diagnostics.is_empty()); + assert_eq!( + res.token_stream.to_string(), + format!("{:#64x}", naming::compute_selector_from_tag("dojo-my_contract")) + ); +} diff --git a/crates/dojo/macros/src/tests/mod.rs b/crates/dojo/macros/src/tests/mod.rs new file mode 100644 index 0000000000..2937e9229e --- /dev/null +++ b/crates/dojo/macros/src/tests/mod.rs @@ -0,0 +1,15 @@ +mod attributes { + mod dojo_contract; + mod dojo_event; + mod dojo_model; +} + +mod derives { + mod introspect; +} + +mod inlines { + mod selector_from_tag; +} + +mod utils; diff --git a/crates/dojo/macros/src/tests/utils.rs b/crates/dojo/macros/src/tests/utils.rs new file mode 100644 index 0000000000..dee23f949e --- /dev/null +++ b/crates/dojo/macros/src/tests/utils.rs @@ -0,0 +1,26 @@ +use cairo_lang_macro::TokenStream; +use regex::Regex; + +/// Asserts that the output token stream is as expected. +/// +/// #Arguments +/// `output` - the output token stream +/// `expected` - the expected output +pub(crate) fn assert_output_stream(output: &TokenStream, expected: &str) { + // to avoid differences due to formatting, we remove all the whitespaces + // and newlines. + fn trim_whitespaces_and_newlines(s: &str) -> String { + s.replace(" ", "").replace("\n", "") + } + + // the `ensure_unique` function contains a randomly generated + // hash, so we have to remove it to be able to compare. + let re = Regex::new(r"let _hash =.*;").unwrap(); + let output = output.to_string(); + let output = re.replace(&output, ""); + + let output = trim_whitespaces_and_newlines(&output); + let expected = trim_whitespaces_and_newlines(expected); + + assert_eq!(output, expected); +} diff --git a/crates/dojo/test-utils/src/compiler.rs b/crates/dojo/test-utils/src/compiler.rs index 5266cf7f94..39f9e85e4a 100644 --- a/crates/dojo/test-utils/src/compiler.rs +++ b/crates/dojo/test-utils/src/compiler.rs @@ -195,8 +195,8 @@ pub fn copy_project_temp( fs::create_dir_all(destination_dir)?; } - let dojo_cairo_test_path = - Utf8PathBuf::from(dojo_core_path.to_string().replace("core", "core-cairo-test")); + let dojo_foundry_test_path = + Utf8PathBuf::from(dojo_core_path.to_string().replace("core", "core-foundry-test")); for entry in fs::read_dir(source_dir)? { let entry = entry?; @@ -248,10 +248,10 @@ pub fn copy_project_temp( .expect("Failed to write to Scab.toml"); } - let dojo_cairo_test = if table.contains_key("workspace") { + let dojo_foundry_test = if table.contains_key("workspace") { if table["workspace"].as_table().unwrap().contains_key("dev-dependencies") { Some( - table["workspace"]["dev-dependencies"]["dojo_cairo_test"] + table["workspace"]["dev-dependencies"]["dojo_foundry_test"] .as_table_mut() .unwrap(), ) @@ -259,15 +259,15 @@ pub fn copy_project_temp( None } } else if table.contains_key("dev-dependencies") { - Some(table["dev-dependencies"]["dojo_cairo_test"].as_table_mut().unwrap()) + Some(table["dev-dependencies"]["dojo_foundry_test"].as_table_mut().unwrap()) } else { None }; - if let Some(dojo_cairo_test) = dojo_cairo_test { - if dojo_cairo_test.contains_key("path") { - dojo_cairo_test["path"] = Value::String( - fs::canonicalize(dojo_cairo_test_path.clone()) + if let Some(dojo_foundry_test) = dojo_foundry_test { + if dojo_foundry_test.contains_key("path") { + dojo_foundry_test["path"] = Value::String( + fs::canonicalize(dojo_foundry_test_path.clone()) .unwrap() .to_string_lossy() .to_string(), diff --git a/crates/dojo/world/src/contracts/abigen/world.rs b/crates/dojo/world/src/contracts/abigen/world.rs index eec0cfc5bf..c18410c20d 100644 --- a/crates/dojo/world/src/contracts/abigen/world.rs +++ b/crates/dojo/world/src/contracts/abigen/world.rs @@ -1215,889 +1215,9 @@ impl cainome::cairo_serde::CairoSerde for Event { } } } -impl TryFrom<&starknet::core::types::EmittedEvent> for Event { +impl TryFrom for Event { type Error = String; - fn try_from(event: &starknet::core::types::EmittedEvent) -> Result { - use cainome::cairo_serde::CairoSerde; - if event.keys.is_empty() { - return Err("Event has no key".to_string()); - } - let selector = event.keys[0]; - if selector - == starknet::core::utils::get_selector_from_name("WorldSpawned") - .unwrap_or_else(|_| panic!("Invalid selector for {}", "WorldSpawned")) - { - let mut key_offset = 0 + 1; - let mut data_offset = 0; - let creator = match cainome::cairo_serde::ContractAddress::cairo_deserialize( - &event.data, - data_offset, - ) { - Ok(v) => v, - Err(e) => { - return Err(format!( - "Could not deserialize field {} for {}: {:?}", - "creator", "WorldSpawned", e - )); - } - }; - data_offset += cainome::cairo_serde::ContractAddress::cairo_serialized_size(&creator); - let class_hash = match cainome::cairo_serde::ClassHash::cairo_deserialize( - &event.data, - data_offset, - ) { - Ok(v) => v, - Err(e) => { - return Err(format!( - "Could not deserialize field {} for {}: {:?}", - "class_hash", "WorldSpawned", e - )); - } - }; - data_offset += cainome::cairo_serde::ClassHash::cairo_serialized_size(&class_hash); - return Ok(Event::WorldSpawned(WorldSpawned { creator, class_hash })); - } - let selector = event.keys[0]; - if selector - == starknet::core::utils::get_selector_from_name("WorldUpgraded") - .unwrap_or_else(|_| panic!("Invalid selector for {}", "WorldUpgraded")) - { - let mut key_offset = 0 + 1; - let mut data_offset = 0; - let class_hash = match cainome::cairo_serde::ClassHash::cairo_deserialize( - &event.data, - data_offset, - ) { - Ok(v) => v, - Err(e) => { - return Err(format!( - "Could not deserialize field {} for {}: {:?}", - "class_hash", "WorldUpgraded", e - )); - } - }; - data_offset += cainome::cairo_serde::ClassHash::cairo_serialized_size(&class_hash); - return Ok(Event::WorldUpgraded(WorldUpgraded { class_hash })); - } - let selector = event.keys[0]; - if selector - == starknet::core::utils::get_selector_from_name("NamespaceRegistered") - .unwrap_or_else(|_| panic!("Invalid selector for {}", "NamespaceRegistered")) - { - let mut key_offset = 0 + 1; - let mut data_offset = 0; - let namespace = - match cainome::cairo_serde::ByteArray::cairo_deserialize(&event.keys, key_offset) { - Ok(v) => v, - Err(e) => { - return Err(format!( - "Could not deserialize field {} for {}: {:?}", - "namespace", "NamespaceRegistered", e - )); - } - }; - key_offset += cainome::cairo_serde::ByteArray::cairo_serialized_size(&namespace); - let hash = - match starknet::core::types::Felt::cairo_deserialize(&event.data, data_offset) { - Ok(v) => v, - Err(e) => { - return Err(format!( - "Could not deserialize field {} for {}: {:?}", - "hash", "NamespaceRegistered", e - )); - } - }; - data_offset += starknet::core::types::Felt::cairo_serialized_size(&hash); - return Ok(Event::NamespaceRegistered(NamespaceRegistered { namespace, hash })); - } - let selector = event.keys[0]; - if selector - == starknet::core::utils::get_selector_from_name("ModelRegistered") - .unwrap_or_else(|_| panic!("Invalid selector for {}", "ModelRegistered")) - { - let mut key_offset = 0 + 1; - let mut data_offset = 0; - let name = - match cainome::cairo_serde::ByteArray::cairo_deserialize(&event.keys, key_offset) { - Ok(v) => v, - Err(e) => { - return Err(format!( - "Could not deserialize field {} for {}: {:?}", - "name", "ModelRegistered", e - )); - } - }; - key_offset += cainome::cairo_serde::ByteArray::cairo_serialized_size(&name); - let namespace = - match cainome::cairo_serde::ByteArray::cairo_deserialize(&event.keys, key_offset) { - Ok(v) => v, - Err(e) => { - return Err(format!( - "Could not deserialize field {} for {}: {:?}", - "namespace", "ModelRegistered", e - )); - } - }; - key_offset += cainome::cairo_serde::ByteArray::cairo_serialized_size(&namespace); - let class_hash = match cainome::cairo_serde::ClassHash::cairo_deserialize( - &event.data, - data_offset, - ) { - Ok(v) => v, - Err(e) => { - return Err(format!( - "Could not deserialize field {} for {}: {:?}", - "class_hash", "ModelRegistered", e - )); - } - }; - data_offset += cainome::cairo_serde::ClassHash::cairo_serialized_size(&class_hash); - let address = match cainome::cairo_serde::ContractAddress::cairo_deserialize( - &event.data, - data_offset, - ) { - Ok(v) => v, - Err(e) => { - return Err(format!( - "Could not deserialize field {} for {}: {:?}", - "address", "ModelRegistered", e - )); - } - }; - data_offset += cainome::cairo_serde::ContractAddress::cairo_serialized_size(&address); - return Ok(Event::ModelRegistered(ModelRegistered { - name, - namespace, - class_hash, - address, - })); - } - let selector = event.keys[0]; - if selector - == starknet::core::utils::get_selector_from_name("EventRegistered") - .unwrap_or_else(|_| panic!("Invalid selector for {}", "EventRegistered")) - { - let mut key_offset = 0 + 1; - let mut data_offset = 0; - let name = - match cainome::cairo_serde::ByteArray::cairo_deserialize(&event.keys, key_offset) { - Ok(v) => v, - Err(e) => { - return Err(format!( - "Could not deserialize field {} for {}: {:?}", - "name", "EventRegistered", e - )); - } - }; - key_offset += cainome::cairo_serde::ByteArray::cairo_serialized_size(&name); - let namespace = - match cainome::cairo_serde::ByteArray::cairo_deserialize(&event.keys, key_offset) { - Ok(v) => v, - Err(e) => { - return Err(format!( - "Could not deserialize field {} for {}: {:?}", - "namespace", "EventRegistered", e - )); - } - }; - key_offset += cainome::cairo_serde::ByteArray::cairo_serialized_size(&namespace); - let class_hash = match cainome::cairo_serde::ClassHash::cairo_deserialize( - &event.data, - data_offset, - ) { - Ok(v) => v, - Err(e) => { - return Err(format!( - "Could not deserialize field {} for {}: {:?}", - "class_hash", "EventRegistered", e - )); - } - }; - data_offset += cainome::cairo_serde::ClassHash::cairo_serialized_size(&class_hash); - let address = match cainome::cairo_serde::ContractAddress::cairo_deserialize( - &event.data, - data_offset, - ) { - Ok(v) => v, - Err(e) => { - return Err(format!( - "Could not deserialize field {} for {}: {:?}", - "address", "EventRegistered", e - )); - } - }; - data_offset += cainome::cairo_serde::ContractAddress::cairo_serialized_size(&address); - return Ok(Event::EventRegistered(EventRegistered { - name, - namespace, - class_hash, - address, - })); - } - let selector = event.keys[0]; - if selector - == starknet::core::utils::get_selector_from_name("ContractRegistered") - .unwrap_or_else(|_| panic!("Invalid selector for {}", "ContractRegistered")) - { - let mut key_offset = 0 + 1; - let mut data_offset = 0; - let name = - match cainome::cairo_serde::ByteArray::cairo_deserialize(&event.keys, key_offset) { - Ok(v) => v, - Err(e) => { - return Err(format!( - "Could not deserialize field {} for {}: {:?}", - "name", "ContractRegistered", e - )); - } - }; - key_offset += cainome::cairo_serde::ByteArray::cairo_serialized_size(&name); - let namespace = - match cainome::cairo_serde::ByteArray::cairo_deserialize(&event.keys, key_offset) { - Ok(v) => v, - Err(e) => { - return Err(format!( - "Could not deserialize field {} for {}: {:?}", - "namespace", "ContractRegistered", e - )); - } - }; - key_offset += cainome::cairo_serde::ByteArray::cairo_serialized_size(&namespace); - let address = match cainome::cairo_serde::ContractAddress::cairo_deserialize( - &event.data, - data_offset, - ) { - Ok(v) => v, - Err(e) => { - return Err(format!( - "Could not deserialize field {} for {}: {:?}", - "address", "ContractRegistered", e - )); - } - }; - data_offset += cainome::cairo_serde::ContractAddress::cairo_serialized_size(&address); - let class_hash = match cainome::cairo_serde::ClassHash::cairo_deserialize( - &event.data, - data_offset, - ) { - Ok(v) => v, - Err(e) => { - return Err(format!( - "Could not deserialize field {} for {}: {:?}", - "class_hash", "ContractRegistered", e - )); - } - }; - data_offset += cainome::cairo_serde::ClassHash::cairo_serialized_size(&class_hash); - let salt = - match starknet::core::types::Felt::cairo_deserialize(&event.data, data_offset) { - Ok(v) => v, - Err(e) => { - return Err(format!( - "Could not deserialize field {} for {}: {:?}", - "salt", "ContractRegistered", e - )); - } - }; - data_offset += starknet::core::types::Felt::cairo_serialized_size(&salt); - return Ok(Event::ContractRegistered(ContractRegistered { - name, - namespace, - address, - class_hash, - salt, - })); - } - let selector = event.keys[0]; - if selector - == starknet::core::utils::get_selector_from_name("ModelUpgraded") - .unwrap_or_else(|_| panic!("Invalid selector for {}", "ModelUpgraded")) - { - let mut key_offset = 0 + 1; - let mut data_offset = 0; - let selector = - match starknet::core::types::Felt::cairo_deserialize(&event.keys, key_offset) { - Ok(v) => v, - Err(e) => { - return Err(format!( - "Could not deserialize field {} for {}: {:?}", - "selector", "ModelUpgraded", e - )); - } - }; - key_offset += starknet::core::types::Felt::cairo_serialized_size(&selector); - let class_hash = match cainome::cairo_serde::ClassHash::cairo_deserialize( - &event.data, - data_offset, - ) { - Ok(v) => v, - Err(e) => { - return Err(format!( - "Could not deserialize field {} for {}: {:?}", - "class_hash", "ModelUpgraded", e - )); - } - }; - data_offset += cainome::cairo_serde::ClassHash::cairo_serialized_size(&class_hash); - let address = match cainome::cairo_serde::ContractAddress::cairo_deserialize( - &event.data, - data_offset, - ) { - Ok(v) => v, - Err(e) => { - return Err(format!( - "Could not deserialize field {} for {}: {:?}", - "address", "ModelUpgraded", e - )); - } - }; - data_offset += cainome::cairo_serde::ContractAddress::cairo_serialized_size(&address); - let prev_address = match cainome::cairo_serde::ContractAddress::cairo_deserialize( - &event.data, - data_offset, - ) { - Ok(v) => v, - Err(e) => { - return Err(format!( - "Could not deserialize field {} for {}: {:?}", - "prev_address", "ModelUpgraded", e - )); - } - }; - data_offset += - cainome::cairo_serde::ContractAddress::cairo_serialized_size(&prev_address); - return Ok(Event::ModelUpgraded(ModelUpgraded { - selector, - class_hash, - address, - prev_address, - })); - } - let selector = event.keys[0]; - if selector - == starknet::core::utils::get_selector_from_name("EventUpgraded") - .unwrap_or_else(|_| panic!("Invalid selector for {}", "EventUpgraded")) - { - let mut key_offset = 0 + 1; - let mut data_offset = 0; - let selector = - match starknet::core::types::Felt::cairo_deserialize(&event.keys, key_offset) { - Ok(v) => v, - Err(e) => { - return Err(format!( - "Could not deserialize field {} for {}: {:?}", - "selector", "EventUpgraded", e - )); - } - }; - key_offset += starknet::core::types::Felt::cairo_serialized_size(&selector); - let class_hash = match cainome::cairo_serde::ClassHash::cairo_deserialize( - &event.data, - data_offset, - ) { - Ok(v) => v, - Err(e) => { - return Err(format!( - "Could not deserialize field {} for {}: {:?}", - "class_hash", "EventUpgraded", e - )); - } - }; - data_offset += cainome::cairo_serde::ClassHash::cairo_serialized_size(&class_hash); - let address = match cainome::cairo_serde::ContractAddress::cairo_deserialize( - &event.data, - data_offset, - ) { - Ok(v) => v, - Err(e) => { - return Err(format!( - "Could not deserialize field {} for {}: {:?}", - "address", "EventUpgraded", e - )); - } - }; - data_offset += cainome::cairo_serde::ContractAddress::cairo_serialized_size(&address); - let prev_address = match cainome::cairo_serde::ContractAddress::cairo_deserialize( - &event.data, - data_offset, - ) { - Ok(v) => v, - Err(e) => { - return Err(format!( - "Could not deserialize field {} for {}: {:?}", - "prev_address", "EventUpgraded", e - )); - } - }; - data_offset += - cainome::cairo_serde::ContractAddress::cairo_serialized_size(&prev_address); - return Ok(Event::EventUpgraded(EventUpgraded { - selector, - class_hash, - address, - prev_address, - })); - } - let selector = event.keys[0]; - if selector - == starknet::core::utils::get_selector_from_name("ContractUpgraded") - .unwrap_or_else(|_| panic!("Invalid selector for {}", "ContractUpgraded")) - { - let mut key_offset = 0 + 1; - let mut data_offset = 0; - let selector = - match starknet::core::types::Felt::cairo_deserialize(&event.keys, key_offset) { - Ok(v) => v, - Err(e) => { - return Err(format!( - "Could not deserialize field {} for {}: {:?}", - "selector", "ContractUpgraded", e - )); - } - }; - key_offset += starknet::core::types::Felt::cairo_serialized_size(&selector); - let class_hash = match cainome::cairo_serde::ClassHash::cairo_deserialize( - &event.data, - data_offset, - ) { - Ok(v) => v, - Err(e) => { - return Err(format!( - "Could not deserialize field {} for {}: {:?}", - "class_hash", "ContractUpgraded", e - )); - } - }; - data_offset += cainome::cairo_serde::ClassHash::cairo_serialized_size(&class_hash); - return Ok(Event::ContractUpgraded(ContractUpgraded { selector, class_hash })); - } - let selector = event.keys[0]; - if selector - == starknet::core::utils::get_selector_from_name("ContractInitialized") - .unwrap_or_else(|_| panic!("Invalid selector for {}", "ContractInitialized")) - { - let mut key_offset = 0 + 1; - let mut data_offset = 0; - let selector = - match starknet::core::types::Felt::cairo_deserialize(&event.keys, key_offset) { - Ok(v) => v, - Err(e) => { - return Err(format!( - "Could not deserialize field {} for {}: {:?}", - "selector", "ContractInitialized", e - )); - } - }; - key_offset += starknet::core::types::Felt::cairo_serialized_size(&selector); - let init_calldata = match Vec::::cairo_deserialize( - &event.data, - data_offset, - ) { - Ok(v) => v, - Err(e) => { - return Err(format!( - "Could not deserialize field {} for {}: {:?}", - "init_calldata", "ContractInitialized", e - )); - } - }; - data_offset += - Vec::::cairo_serialized_size(&init_calldata); - return Ok(Event::ContractInitialized(ContractInitialized { selector, init_calldata })); - } - let selector = event.keys[0]; - if selector - == starknet::core::utils::get_selector_from_name("EventEmitted") - .unwrap_or_else(|_| panic!("Invalid selector for {}", "EventEmitted")) - { - let mut key_offset = 0 + 1; - let mut data_offset = 0; - let selector = - match starknet::core::types::Felt::cairo_deserialize(&event.keys, key_offset) { - Ok(v) => v, - Err(e) => { - return Err(format!( - "Could not deserialize field {} for {}: {:?}", - "selector", "EventEmitted", e - )); - } - }; - key_offset += starknet::core::types::Felt::cairo_serialized_size(&selector); - let system_address = match cainome::cairo_serde::ContractAddress::cairo_deserialize( - &event.keys, - key_offset, - ) { - Ok(v) => v, - Err(e) => { - return Err(format!( - "Could not deserialize field {} for {}: {:?}", - "system_address", "EventEmitted", e - )); - } - }; - key_offset += - cainome::cairo_serde::ContractAddress::cairo_serialized_size(&system_address); - let keys = match Vec::::cairo_deserialize( - &event.data, - data_offset, - ) { - Ok(v) => v, - Err(e) => { - return Err(format!( - "Could not deserialize field {} for {}: {:?}", - "keys", "EventEmitted", e - )); - } - }; - data_offset += Vec::::cairo_serialized_size(&keys); - let values = match Vec::::cairo_deserialize( - &event.data, - data_offset, - ) { - Ok(v) => v, - Err(e) => { - return Err(format!( - "Could not deserialize field {} for {}: {:?}", - "values", "EventEmitted", e - )); - } - }; - data_offset += Vec::::cairo_serialized_size(&values); - return Ok(Event::EventEmitted(EventEmitted { - selector, - system_address, - keys, - values, - })); - } - let selector = event.keys[0]; - if selector - == starknet::core::utils::get_selector_from_name("MetadataUpdate") - .unwrap_or_else(|_| panic!("Invalid selector for {}", "MetadataUpdate")) - { - let mut key_offset = 0 + 1; - let mut data_offset = 0; - let resource = - match starknet::core::types::Felt::cairo_deserialize(&event.keys, key_offset) { - Ok(v) => v, - Err(e) => { - return Err(format!( - "Could not deserialize field {} for {}: {:?}", - "resource", "MetadataUpdate", e - )); - } - }; - key_offset += starknet::core::types::Felt::cairo_serialized_size(&resource); - let uri = match cainome::cairo_serde::ByteArray::cairo_deserialize( - &event.data, - data_offset, - ) { - Ok(v) => v, - Err(e) => { - return Err(format!( - "Could not deserialize field {} for {}: {:?}", - "uri", "MetadataUpdate", e - )); - } - }; - data_offset += cainome::cairo_serde::ByteArray::cairo_serialized_size(&uri); - let hash = - match starknet::core::types::Felt::cairo_deserialize(&event.data, data_offset) { - Ok(v) => v, - Err(e) => { - return Err(format!( - "Could not deserialize field {} for {}: {:?}", - "hash", "MetadataUpdate", e - )); - } - }; - data_offset += starknet::core::types::Felt::cairo_serialized_size(&hash); - return Ok(Event::MetadataUpdate(MetadataUpdate { resource, uri, hash })); - } - let selector = event.keys[0]; - if selector - == starknet::core::utils::get_selector_from_name("StoreSetRecord") - .unwrap_or_else(|_| panic!("Invalid selector for {}", "StoreSetRecord")) - { - let mut key_offset = 0 + 1; - let mut data_offset = 0; - let selector = - match starknet::core::types::Felt::cairo_deserialize(&event.keys, key_offset) { - Ok(v) => v, - Err(e) => { - return Err(format!( - "Could not deserialize field {} for {}: {:?}", - "selector", "StoreSetRecord", e - )); - } - }; - key_offset += starknet::core::types::Felt::cairo_serialized_size(&selector); - let entity_id = - match starknet::core::types::Felt::cairo_deserialize(&event.keys, key_offset) { - Ok(v) => v, - Err(e) => { - return Err(format!( - "Could not deserialize field {} for {}: {:?}", - "entity_id", "StoreSetRecord", e - )); - } - }; - key_offset += starknet::core::types::Felt::cairo_serialized_size(&entity_id); - let keys = match Vec::::cairo_deserialize( - &event.data, - data_offset, - ) { - Ok(v) => v, - Err(e) => { - return Err(format!( - "Could not deserialize field {} for {}: {:?}", - "keys", "StoreSetRecord", e - )); - } - }; - data_offset += Vec::::cairo_serialized_size(&keys); - let values = match Vec::::cairo_deserialize( - &event.data, - data_offset, - ) { - Ok(v) => v, - Err(e) => { - return Err(format!( - "Could not deserialize field {} for {}: {:?}", - "values", "StoreSetRecord", e - )); - } - }; - data_offset += Vec::::cairo_serialized_size(&values); - return Ok(Event::StoreSetRecord(StoreSetRecord { selector, entity_id, keys, values })); - } - let selector = event.keys[0]; - if selector - == starknet::core::utils::get_selector_from_name("StoreUpdateRecord") - .unwrap_or_else(|_| panic!("Invalid selector for {}", "StoreUpdateRecord")) - { - let mut key_offset = 0 + 1; - let mut data_offset = 0; - let selector = - match starknet::core::types::Felt::cairo_deserialize(&event.keys, key_offset) { - Ok(v) => v, - Err(e) => { - return Err(format!( - "Could not deserialize field {} for {}: {:?}", - "selector", "StoreUpdateRecord", e - )); - } - }; - key_offset += starknet::core::types::Felt::cairo_serialized_size(&selector); - let entity_id = - match starknet::core::types::Felt::cairo_deserialize(&event.keys, key_offset) { - Ok(v) => v, - Err(e) => { - return Err(format!( - "Could not deserialize field {} for {}: {:?}", - "entity_id", "StoreUpdateRecord", e - )); - } - }; - key_offset += starknet::core::types::Felt::cairo_serialized_size(&entity_id); - let values = match Vec::::cairo_deserialize( - &event.data, - data_offset, - ) { - Ok(v) => v, - Err(e) => { - return Err(format!( - "Could not deserialize field {} for {}: {:?}", - "values", "StoreUpdateRecord", e - )); - } - }; - data_offset += Vec::::cairo_serialized_size(&values); - return Ok(Event::StoreUpdateRecord(StoreUpdateRecord { selector, entity_id, values })); - } - let selector = event.keys[0]; - if selector - == starknet::core::utils::get_selector_from_name("StoreUpdateMember") - .unwrap_or_else(|_| panic!("Invalid selector for {}", "StoreUpdateMember")) - { - let mut key_offset = 0 + 1; - let mut data_offset = 0; - let selector = - match starknet::core::types::Felt::cairo_deserialize(&event.keys, key_offset) { - Ok(v) => v, - Err(e) => { - return Err(format!( - "Could not deserialize field {} for {}: {:?}", - "selector", "StoreUpdateMember", e - )); - } - }; - key_offset += starknet::core::types::Felt::cairo_serialized_size(&selector); - let entity_id = - match starknet::core::types::Felt::cairo_deserialize(&event.keys, key_offset) { - Ok(v) => v, - Err(e) => { - return Err(format!( - "Could not deserialize field {} for {}: {:?}", - "entity_id", "StoreUpdateMember", e - )); - } - }; - key_offset += starknet::core::types::Felt::cairo_serialized_size(&entity_id); - let member_selector = - match starknet::core::types::Felt::cairo_deserialize(&event.keys, key_offset) { - Ok(v) => v, - Err(e) => { - return Err(format!( - "Could not deserialize field {} for {}: {:?}", - "member_selector", "StoreUpdateMember", e - )); - } - }; - key_offset += starknet::core::types::Felt::cairo_serialized_size(&member_selector); - let values = match Vec::::cairo_deserialize( - &event.data, - data_offset, - ) { - Ok(v) => v, - Err(e) => { - return Err(format!( - "Could not deserialize field {} for {}: {:?}", - "values", "StoreUpdateMember", e - )); - } - }; - data_offset += Vec::::cairo_serialized_size(&values); - return Ok(Event::StoreUpdateMember(StoreUpdateMember { - selector, - entity_id, - member_selector, - values, - })); - } - let selector = event.keys[0]; - if selector - == starknet::core::utils::get_selector_from_name("StoreDelRecord") - .unwrap_or_else(|_| panic!("Invalid selector for {}", "StoreDelRecord")) - { - let mut key_offset = 0 + 1; - let mut data_offset = 0; - let selector = - match starknet::core::types::Felt::cairo_deserialize(&event.keys, key_offset) { - Ok(v) => v, - Err(e) => { - return Err(format!( - "Could not deserialize field {} for {}: {:?}", - "selector", "StoreDelRecord", e - )); - } - }; - key_offset += starknet::core::types::Felt::cairo_serialized_size(&selector); - let entity_id = - match starknet::core::types::Felt::cairo_deserialize(&event.keys, key_offset) { - Ok(v) => v, - Err(e) => { - return Err(format!( - "Could not deserialize field {} for {}: {:?}", - "entity_id", "StoreDelRecord", e - )); - } - }; - key_offset += starknet::core::types::Felt::cairo_serialized_size(&entity_id); - return Ok(Event::StoreDelRecord(StoreDelRecord { selector, entity_id })); - } - let selector = event.keys[0]; - if selector - == starknet::core::utils::get_selector_from_name("WriterUpdated") - .unwrap_or_else(|_| panic!("Invalid selector for {}", "WriterUpdated")) - { - let mut key_offset = 0 + 1; - let mut data_offset = 0; - let resource = - match starknet::core::types::Felt::cairo_deserialize(&event.keys, key_offset) { - Ok(v) => v, - Err(e) => { - return Err(format!( - "Could not deserialize field {} for {}: {:?}", - "resource", "WriterUpdated", e - )); - } - }; - key_offset += starknet::core::types::Felt::cairo_serialized_size(&resource); - let contract = match cainome::cairo_serde::ContractAddress::cairo_deserialize( - &event.keys, - key_offset, - ) { - Ok(v) => v, - Err(e) => { - return Err(format!( - "Could not deserialize field {} for {}: {:?}", - "contract", "WriterUpdated", e - )); - } - }; - key_offset += cainome::cairo_serde::ContractAddress::cairo_serialized_size(&contract); - let value = match bool::cairo_deserialize(&event.data, data_offset) { - Ok(v) => v, - Err(e) => { - return Err(format!( - "Could not deserialize field {} for {}: {:?}", - "value", "WriterUpdated", e - )); - } - }; - data_offset += bool::cairo_serialized_size(&value); - return Ok(Event::WriterUpdated(WriterUpdated { resource, contract, value })); - } - let selector = event.keys[0]; - if selector - == starknet::core::utils::get_selector_from_name("OwnerUpdated") - .unwrap_or_else(|_| panic!("Invalid selector for {}", "OwnerUpdated")) - { - let mut key_offset = 0 + 1; - let mut data_offset = 0; - let resource = - match starknet::core::types::Felt::cairo_deserialize(&event.keys, key_offset) { - Ok(v) => v, - Err(e) => { - return Err(format!( - "Could not deserialize field {} for {}: {:?}", - "resource", "OwnerUpdated", e - )); - } - }; - key_offset += starknet::core::types::Felt::cairo_serialized_size(&resource); - let contract = match cainome::cairo_serde::ContractAddress::cairo_deserialize( - &event.keys, - key_offset, - ) { - Ok(v) => v, - Err(e) => { - return Err(format!( - "Could not deserialize field {} for {}: {:?}", - "contract", "OwnerUpdated", e - )); - } - }; - key_offset += cainome::cairo_serde::ContractAddress::cairo_serialized_size(&contract); - let value = match bool::cairo_deserialize(&event.data, data_offset) { - Ok(v) => v, - Err(e) => { - return Err(format!( - "Could not deserialize field {} for {}: {:?}", - "value", "OwnerUpdated", e - )); - } - }; - data_offset += bool::cairo_serialized_size(&value); - return Ok(Event::OwnerUpdated(OwnerUpdated { resource, contract, value })); - } - Err(format!("Could not match any event from keys {:?}", event.keys)) - } -} -impl TryFrom<&starknet::core::types::Event> for Event { - type Error = String; - fn try_from(event: &starknet::core::types::Event) -> Result { + fn try_from(event: starknet::core::types::EmittedEvent) -> Result { use cainome::cairo_serde::CairoSerde; if event.keys.is_empty() { return Err("Event has no key".to_string()); diff --git a/crates/dojo/world/src/remote/events_to_remote.rs b/crates/dojo/world/src/remote/events_to_remote.rs index 38ca1143f5..6b2bc27ec4 100644 --- a/crates/dojo/world/src/remote/events_to_remote.rs +++ b/crates/dojo/world/src/remote/events_to_remote.rs @@ -103,7 +103,7 @@ impl WorldRemote { "Fetched events for world." ); - for event in &events { + for event in events { match world::Event::try_from(event) { Ok(ev) => { tracing::trace!(?ev, "Processing world event."); diff --git a/crates/torii/types-test/Scarb.lock b/crates/torii/types-test/Scarb.lock index d9a159a984..d56e5ba64c 100644 --- a/crates/torii/types-test/Scarb.lock +++ b/crates/torii/types-test/Scarb.lock @@ -5,12 +5,12 @@ version = 1 name = "dojo" version = "1.0.5" dependencies = [ - "dojo_plugin", + "dojo_macros", ] [[package]] -name = "dojo_plugin" -version = "2.8.4" +name = "dojo_macros" +version = "0.1.0" [[package]] name = "types_test" diff --git a/dojoup/dojoup b/dojoup/dojoup index 8c352ae155..68e50cbd1e 100755 --- a/dojoup/dojoup +++ b/dojoup/dojoup @@ -12,7 +12,7 @@ BASE_DIR=${XDG_CONFIG_HOME:-$HOME} DOJO_DIR=${DOJO_DIR-"$BASE_DIR/.dojo"} DOJO_BIN_DIR="$DOJO_DIR/bin" -BINS=(katana sozo torii dojo-language-server) +BINS=(katana sozo torii) export RUSTFLAGS="-C target-cpu=native" diff --git a/examples/game-lib/Scarb.lock b/examples/game-lib/Scarb.lock index 775fb46b9b..0742ac3253 100644 --- a/examples/game-lib/Scarb.lock +++ b/examples/game-lib/Scarb.lock @@ -17,11 +17,11 @@ dependencies = [ [[package]] name = "dojo" -version = "1.0.0-rc.0" +version = "1.0.4" dependencies = [ - "dojo_plugin", + "dojo_macros", ] [[package]] -name = "dojo_plugin" -version = "2.8.4" +name = "dojo_macros" +version = "0.1.0" diff --git a/examples/simple/Scarb.lock b/examples/simple/Scarb.lock index d5dfe49119..e30d745b35 100644 --- a/examples/simple/Scarb.lock +++ b/examples/simple/Scarb.lock @@ -5,24 +5,40 @@ version = 1 name = "dojo" version = "1.0.5" dependencies = [ - "dojo_plugin", + "dojo_macros", ] [[package]] -name = "dojo_cairo_test" +name = "dojo_foundry_test" version = "1.0.0-rc.0" dependencies = [ "dojo", ] [[package]] -name = "dojo_plugin" -version = "2.8.4" +name = "dojo_macros" +version = "0.1.0" [[package]] name = "dojo_simple" version = "0.1.0" dependencies = [ "dojo", - "dojo_cairo_test", + "dojo_foundry_test", + "snforge_std", +] + +[[package]] +name = "snforge_scarb_plugin" +version = "0.33.0" +source = "registry+https://scarbs.xyz/" +checksum = "sha256:b4dd6088372decd367652827091e0589bbf6bc550dfc3957baa3e9c61d6eb449" + +[[package]] +name = "snforge_std" +version = "0.33.0" +source = "registry+https://scarbs.xyz/" +checksum = "sha256:f7dc3349f8a6ef4915c93df447a00bd5a53a31129fd0990a00afa0ad31d91b06" +dependencies = [ + "snforge_scarb_plugin", ] diff --git a/examples/simple/Scarb.toml b/examples/simple/Scarb.toml index 388df4c4b1..c5697e6062 100644 --- a/examples/simple/Scarb.toml +++ b/examples/simple/Scarb.toml @@ -11,12 +11,16 @@ build-external-contracts = ["dojo::world::world_contract::world"] [dependencies] dojo = { path = "../../crates/dojo/core" } +snforge_std = "0.33.0" starknet = "2.8.4" [dev-dependencies] -dojo_cairo_test = { path = "../../crates/dojo/core-cairo-test" } +dojo_foundry_test = { path = "../../crates/dojo/core-foundry-test" } [features] default = [] +[scripts] +test = "snforge test" + [profile.sepolia] diff --git a/examples/simple/src/lib.cairo b/examples/simple/src/lib.cairo index 682d9039c1..f5474a5eec 100644 --- a/examples/simple/src/lib.cairo +++ b/examples/simple/src/lib.cairo @@ -115,17 +115,16 @@ pub mod c3 {} #[cfg(test)] mod tests { use dojo::model::ModelStorage; - use dojo_cairo_test::{ + use dojo_foundry_test::{ spawn_test_world, NamespaceDef, TestResource, ContractDefTrait, WorldStorageTestTrait }; - use super::{c1, m_M, M}; + use super::M; #[test] fn test_1() { let ndef = NamespaceDef { namespace: "ns", resources: [ - TestResource::Model(m_M::TEST_CLASS_HASH), - TestResource::Contract(c1::TEST_CLASS_HASH), + TestResource::Model("M"), TestResource::Contract("c1"), ].span() }; diff --git a/examples/spawn-and-move/.snfoundry_cache/.prev_tests_failed b/examples/spawn-and-move/.snfoundry_cache/.prev_tests_failed new file mode 100644 index 0000000000..e69de29bb2 diff --git a/examples/spawn-and-move/Scarb.lock b/examples/spawn-and-move/Scarb.lock index 60e51ef4db..596dd3f9c8 100644 --- a/examples/spawn-and-move/Scarb.lock +++ b/examples/spawn-and-move/Scarb.lock @@ -19,26 +19,42 @@ dependencies = [ name = "dojo" version = "1.0.5" dependencies = [ - "dojo_plugin", + "dojo_macros", ] [[package]] -name = "dojo_cairo_test" -version = "1.0.0-rc.0" +name = "dojo_examples" +version = "1.0.5" dependencies = [ + "armory", + "bestiary", "dojo", + "dojo_foundry_test", + "snforge_std", ] [[package]] -name = "dojo_examples" -version = "1.0.5" +name = "dojo_foundry_test" +version = "1.0.0-rc.0" dependencies = [ - "armory", - "bestiary", "dojo", - "dojo_cairo_test", ] [[package]] -name = "dojo_plugin" -version = "2.8.4" +name = "dojo_macros" +version = "0.1.0" + +[[package]] +name = "snforge_scarb_plugin" +version = "0.33.0" +source = "registry+https://scarbs.xyz/" +checksum = "sha256:b4dd6088372decd367652827091e0589bbf6bc550dfc3957baa3e9c61d6eb449" + +[[package]] +name = "snforge_std" +version = "0.33.0" +source = "registry+https://scarbs.xyz/" +checksum = "sha256:f7dc3349f8a6ef4915c93df447a00bd5a53a31129fd0990a00afa0ad31d91b06" +dependencies = [ + "snforge_scarb_plugin", +] diff --git a/examples/spawn-and-move/Scarb.toml b/examples/spawn-and-move/Scarb.toml index ea06a336d7..c175bcf5ca 100644 --- a/examples/spawn-and-move/Scarb.toml +++ b/examples/spawn-and-move/Scarb.toml @@ -16,13 +16,17 @@ build-external-contracts = [ "dojo::world::world_contract::world" ] armory = { path = "../game-lib/armory" } bestiary = { path = "../game-lib/bestiary" } dojo = { path = "../../crates/dojo/core" } +snforge_std = "0.33.0" starknet = "2.8.4" [dev-dependencies] -dojo_cairo_test = { path = "../../crates/dojo/core-cairo-test" } +dojo_foundry_test = { path = "../../crates/dojo/core-foundry-test" } [features] default = [ "dungeon" ] dungeon = [ ] +[scripts] +test = "snforge test" + [profile.saya] diff --git a/examples/spawn-and-move/src/actions.cairo b/examples/spawn-and-move/src/actions.cairo index 95c8d4a4d5..3416a69c34 100644 --- a/examples/spawn-and-move/src/actions.cairo +++ b/examples/spawn-and-move/src/actions.cairo @@ -210,21 +210,21 @@ pub mod actions { mod tests { use dojo::model::{ModelStorage, ModelValueStorage, ModelStorageTest}; use dojo::world::WorldStorageTrait; - use dojo_cairo_test::{ + use dojo_foundry_test::{ spawn_test_world, NamespaceDef, TestResource, ContractDefTrait, ContractDef, WorldStorageTestTrait }; - use super::{actions, IActionsDispatcher, IActionsDispatcherTrait}; - use dojo_examples::models::{Position, PositionValue, m_Position, Moves, m_Moves, Direction,}; + use super::{IActionsDispatcher, IActionsDispatcherTrait}; + use dojo_examples::models::{Position, PositionValue, Moves, Direction,}; fn namespace_def() -> NamespaceDef { let ndef = NamespaceDef { namespace: "ns", resources: [ - TestResource::Model(m_Position::TEST_CLASS_HASH), - TestResource::Model(m_Moves::TEST_CLASS_HASH), - TestResource::Event(actions::e_Moved::TEST_CLASS_HASH), - TestResource::Contract(actions::TEST_CLASS_HASH), + TestResource::Model("Position"), + TestResource::Model("Moves"), + TestResource::Event("Moved"), + TestResource::Contract("actions"), ].span() }; @@ -277,7 +277,7 @@ mod tests { #[test] #[available_gas(30000000)] fn test_move() { - let caller = starknet::contract_address_const::<0x0>(); + let caller = snforge_std::test_address(); let ndef = namespace_def(); let mut world = spawn_test_world([ndef].span()); diff --git a/scripts/cairo_fmt.sh b/scripts/cairo_fmt.sh index f504323222..2ab2014d68 100755 --- a/scripts/cairo_fmt.sh +++ b/scripts/cairo_fmt.sh @@ -9,4 +9,4 @@ fi scarb --manifest-path examples/spawn-and-move/Scarb.toml fmt $option scarb --manifest-path examples/simple/Scarb.toml fmt $option scarb --manifest-path crates/dojo/core/Scarb.toml fmt $option -scarb --manifest-path crates/dojo/core-cairo-test/Scarb.toml fmt $option +scarb --manifest-path crates/dojo/core-foundry-test/Scarb.toml fmt $option diff --git a/scripts/rebuild_test_artifacts.sh b/scripts/rebuild_test_artifacts.sh index 5cf765499c..315d513077 100755 --- a/scripts/rebuild_test_artifacts.sh +++ b/scripts/rebuild_test_artifacts.sh @@ -13,7 +13,7 @@ cargo +nightly-2024-08-28 fmt --all -- "$@" scarb --manifest-path examples/spawn-and-move/Scarb.toml fmt scarb --manifest-path examples/simple/Scarb.toml fmt scarb --manifest-path crates/dojo/core/Scarb.toml fmt -scarb --manifest-path crates/dojo/core-cairo-test/Scarb.toml fmt +scarb --manifest-path crates/dojo/core-foundry-test/Scarb.toml fmt # Manual forced cleanup. rm -rf examples/spawn-and-move/target diff --git a/spawn-and-move-db.tar.gz b/spawn-and-move-db.tar.gz index e8c46c8aa7..f2850899d2 100644 Binary files a/spawn-and-move-db.tar.gz and b/spawn-and-move-db.tar.gz differ diff --git a/types-test-db.tar.gz b/types-test-db.tar.gz index 84700bbb69..3eef5c58c3 100644 Binary files a/types-test-db.tar.gz and b/types-test-db.tar.gz differ