diff --git a/.gitignore b/.gitignore
index 6498958892..09a5b8fd5f 100644
--- a/.gitignore
+++ b/.gitignore
@@ -17,3 +17,4 @@ crates/benches/bench_results.txt
**/generated
.vscode
bindings
+justfile
diff --git a/Cargo.lock b/Cargo.lock
index 667854d1df..877b081274 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -4584,7 +4584,9 @@ dependencies = [
"camino",
"chrono",
"convert_case 0.6.0",
+ "dojo-test-utils",
"dojo-world",
+ "scarb",
"serde",
"serde_json",
"starknet",
@@ -14224,6 +14226,7 @@ name = "torii-grpc"
version = "0.7.0-alpha.5"
dependencies = [
"bytes",
+ "camino",
"crypto-bigint",
"dojo-test-utils",
"dojo-types",
diff --git a/bin/sozo/src/commands/build.rs b/bin/sozo/src/commands/build.rs
index e278e693d0..b94785575e 100644
--- a/bin/sozo/src/commands/build.rs
+++ b/bin/sozo/src/commands/build.rs
@@ -2,6 +2,8 @@ use anyhow::{Context, Result};
use clap::Args;
use dojo_bindgen::{BuiltinPlugins, PluginManager};
use dojo_lang::scarb_internal::compile_workspace;
+use dojo_world::manifest::MANIFESTS_DIR;
+use dojo_world::metadata::dojo_metadata_from_workspace;
use prettytable::format::consts::FORMAT_NO_LINESEP_WITH_TITLE;
use prettytable::{format, Cell, Row, Table};
use scarb::core::{Config, TargetKind};
@@ -9,6 +11,8 @@ use scarb::ops::{CompileOpts, FeaturesOpts, FeaturesSelector};
use sozo_ops::statistics::{get_contract_statistics_for_dir, ContractStatistics};
use tracing::trace;
+use crate::commands::clean::CleanArgs;
+
const BYTECODE_SIZE_LABEL: &str = "Bytecode size [in felts]\n(Sierra, Casm)";
const CONTRACT_CLASS_SIZE_LABEL: &str = "Contract Class size [in bytes]\n(Sierra, Casm)";
@@ -39,6 +43,18 @@ pub struct BuildArgs {
impl BuildArgs {
pub fn run(self, config: &Config) -> Result<()> {
+ let ws = scarb::ops::read_workspace(config.manifest_path(), config)?;
+
+ let profile_name =
+ ws.current_profile().expect("Scarb profile is expected at this point.").to_string();
+
+ // Manifest path is always a file, we can unwrap safely to get the
+ // parent folder.
+ let manifest_dir = ws.manifest_path().parent().unwrap().to_path_buf();
+
+ let profile_dir = manifest_dir.join(MANIFESTS_DIR).join(profile_name);
+ CleanArgs::clean_manifests(&profile_dir)?;
+
let features_opts =
FeaturesOpts { features: FeaturesSelector::AllFeatures, no_default_features: false };
@@ -110,9 +126,12 @@ impl BuildArgs {
};
trace!(pluginManager=?bindgen, "Generating bindings.");
+ let ws = scarb::ops::read_workspace(config.manifest_path(), config).unwrap();
+ let dojo_metadata = dojo_metadata_from_workspace(&ws);
+
tokio::runtime::Runtime::new()
.unwrap()
- .block_on(bindgen.generate())
+ .block_on(bindgen.generate(dojo_metadata.skip_migration))
.expect("Error generating bindings");
Ok(())
diff --git a/bin/sozo/src/commands/clean.rs b/bin/sozo/src/commands/clean.rs
index 7d02a03834..41da4a1921 100644
--- a/bin/sozo/src/commands/clean.rs
+++ b/bin/sozo/src/commands/clean.rs
@@ -21,7 +21,7 @@ impl CleanArgs {
/// # Arguments
///
/// * `profile_dir` - The directory where the profile files are located.
- pub fn clean_manifests(&self, profile_dir: &Utf8PathBuf) -> Result<()> {
+ pub fn clean_manifests(profile_dir: &Utf8PathBuf) -> Result<()> {
trace!(?profile_dir, "Cleaning manifests.");
let dirs = vec![profile_dir.join(BASE_DIR), profile_dir.join(ABIS_DIR).join(BASE_DIR)];
@@ -51,7 +51,7 @@ impl CleanArgs {
// By default, this command cleans the build manifests and scarb artifacts.
trace!("Cleaning Scarb artifacts and build manifests.");
scarb::ops::clean(config)?;
- self.clean_manifests(&profile_dir)?;
+ Self::clean_manifests(&profile_dir)?;
if self.all && profile_dir.exists() {
trace!(?profile_dir, "Removing entire profile directory.");
@@ -65,6 +65,7 @@ impl CleanArgs {
#[cfg(test)]
mod tests {
use dojo_test_utils::compiler;
+ use dojo_world::metadata::dojo_metadata_from_workspace;
use dojo_world::migration::TxnConfig;
use katana_runner::KatanaRunner;
use sozo_ops::migration;
@@ -84,6 +85,8 @@ mod tests {
let ws = scarb::ops::read_workspace(config.manifest_path(), &config).unwrap();
+ let dojo_metadata = dojo_metadata_from_workspace(&ws);
+
// Plan the migration to generate some manifests other than base.
config.tokio_handle().block_on(async {
migration::migrate(
@@ -94,6 +97,7 @@ mod tests {
"dojo_examples",
true,
TxnConfig::default(),
+ dojo_metadata.skip_migration,
)
.await
.unwrap()
diff --git a/bin/sozo/src/commands/dev.rs b/bin/sozo/src/commands/dev.rs
index 2ff6eef64a..79d866b1a0 100644
--- a/bin/sozo/src/commands/dev.rs
+++ b/bin/sozo/src/commands/dev.rs
@@ -47,13 +47,13 @@ pub struct DevArgs {
#[command(flatten)]
pub account: AccountOptions,
}
-
impl DevArgs {
pub fn run(self, config: &Config) -> Result<()> {
let ws = scarb::ops::read_workspace(config.manifest_path(), config)?;
+ let dojo_metadata = dojo_metadata_from_workspace(&ws);
let env_metadata = if config.manifest_path().exists() {
- dojo_metadata_from_workspace(&ws).env().cloned()
+ dojo_metadata.env().cloned()
} else {
trace!("Manifest path does not exist.");
None
@@ -97,6 +97,7 @@ impl DevArgs {
&name,
&context.ws,
previous_manifest.clone(),
+ dojo_metadata.skip_migration.clone(),
)) {
Ok((manifest, address)) => {
previous_manifest = Some(manifest);
@@ -131,6 +132,7 @@ impl DevArgs {
&name,
&context.ws,
previous_manifest.clone(),
+ dojo_metadata.skip_migration.clone(),
)) {
Ok((manifest, address)) => {
previous_manifest = Some(manifest);
@@ -222,12 +224,14 @@ fn build(context: &mut DevContext<'_>) -> Result<()> {
Ok(())
}
+// TODO: fix me
async fn migrate
(
mut world_address: Option,
account: &SingleOwnerAccount,
name: &str,
ws: &Workspace<'_>,
previous_manifest: Option,
+ skip_migration: Option>,
) -> Result<(DeploymentManifest, Option)>
where
P: Provider + Sync + Send + 'static,
@@ -243,9 +247,13 @@ where
return Err(anyhow!("Build project using `sozo build` first"));
}
- let new_manifest =
+ let mut new_manifest =
BaseManifest::load_from_path(&manifest_dir.join(MANIFESTS_DIR).join(BASE_DIR))?;
+ if let Some(skip_manifests) = skip_migration {
+ new_manifest.remove_items(skip_manifests);
+ }
+
let diff = WorldDiff::compute(new_manifest.clone(), previous_manifest);
let total_diffs = diff.count_diffs();
let config = ws.config();
diff --git a/bin/sozo/src/commands/migrate.rs b/bin/sozo/src/commands/migrate.rs
index 1bf05338a8..6f6abe7404 100644
--- a/bin/sozo/src/commands/migrate.rs
+++ b/bin/sozo/src/commands/migrate.rs
@@ -58,6 +58,7 @@ impl MigrateArgs {
pub fn run(self, config: &Config) -> Result<()> {
trace!(args = ?self);
let ws = scarb::ops::read_workspace(config.manifest_path(), config)?;
+ let dojo_metadata = dojo_metadata_from_workspace(&ws);
// This variant is tested before the match on `self.command` to avoid
// having the need to spin up a Katana to generate the files.
@@ -67,7 +68,7 @@ impl MigrateArgs {
}
let env_metadata = if config.manifest_path().exists() {
- dojo_metadata_from_workspace(&ws).env().cloned()
+ dojo_metadata.env().cloned()
} else {
trace!("Manifest path does not exist.");
None
@@ -99,6 +100,7 @@ impl MigrateArgs {
&name,
true,
TxnConfig::default(),
+ dojo_metadata.skip_migration,
)
.await
}),
@@ -106,8 +108,17 @@ impl MigrateArgs {
trace!(name, "Applying migration.");
let txn_config: TxnConfig = transaction.into();
- migration::migrate(&ws, world_address, rpc_url, account, &name, false, txn_config)
- .await
+ migration::migrate(
+ &ws,
+ world_address,
+ rpc_url,
+ account,
+ &name,
+ false,
+ txn_config,
+ dojo_metadata.skip_migration,
+ )
+ .await
}),
_ => unreachable!("other case handled above."),
}
diff --git a/bin/sozo/tests/register_test.rs b/bin/sozo/tests/register_test.rs
index 11053bd38f..7faf1ce474 100644
--- a/bin/sozo/tests/register_test.rs
+++ b/bin/sozo/tests/register_test.rs
@@ -3,6 +3,7 @@ mod utils;
use camino::Utf8PathBuf;
use dojo_test_utils::compiler;
use dojo_test_utils::migration::prepare_migration;
+use dojo_world::metadata::dojo_metadata_from_workspace;
use dojo_world::migration::TxnConfig;
use katana_runner::KatanaRunner;
use scarb::ops;
@@ -20,11 +21,13 @@ async fn reregister_models() {
let ws = ops::read_workspace(config.manifest_path(), &config)
.unwrap_or_else(|op| panic!("Error building workspace: {op:?}"));
+ let dojo_metadata = dojo_metadata_from_workspace(&ws);
- let base = config.manifest_path().parent().unwrap();
- let target_dir = format!("{}/target/dev", base);
+ let target_path =
+ ws.target_dir().path_existent().unwrap().join(ws.config().profile().to_string());
- let migration = prepare_migration(base.into(), target_dir.into()).unwrap();
+ let migration =
+ prepare_migration(source_project_dir, target_path, dojo_metadata.skip_migration).unwrap();
let sequencer = KatanaRunner::new().expect("Failed to start runner.");
diff --git a/crates/dojo-bindgen/Cargo.toml b/crates/dojo-bindgen/Cargo.toml
index 1d9f376db1..8a97d8c2c2 100644
--- a/crates/dojo-bindgen/Cargo.toml
+++ b/crates/dojo-bindgen/Cargo.toml
@@ -22,3 +22,7 @@ thiserror.workspace = true
cainome.workspace = true
dojo-world = { path = "../dojo-world", features = [ "manifest" ] }
+
+[dev-dependencies]
+dojo-test-utils = { path = "../dojo-test-utils", features = [ "build-examples" ] }
+scarb = { workspace = true }
diff --git a/crates/dojo-bindgen/src/lib.rs b/crates/dojo-bindgen/src/lib.rs
index 5dfc2ff265..d92999ad14 100644
--- a/crates/dojo-bindgen/src/lib.rs
+++ b/crates/dojo-bindgen/src/lib.rs
@@ -73,13 +73,17 @@ pub struct PluginManager {
impl PluginManager {
/// Generates the bindings for all the given Plugin.
- pub async fn generate(&self) -> BindgenResult<()> {
+ pub async fn generate(&self, skip_migration: Option>) -> BindgenResult<()> {
if self.builtin_plugins.is_empty() && self.plugins.is_empty() {
return Ok(());
}
- let data =
- gather_dojo_data(&self.manifest_path, &self.root_package_name, &self.profile_name)?;
+ let data = gather_dojo_data(
+ &self.manifest_path,
+ &self.root_package_name,
+ &self.profile_name,
+ skip_migration,
+ )?;
for plugin in &self.builtin_plugins {
// Get the plugin builder from the plugin enum.
@@ -111,10 +115,15 @@ fn gather_dojo_data(
manifest_path: &Utf8PathBuf,
root_package_name: &str,
profile_name: &str,
+ skip_migration: Option>,
) -> BindgenResult {
let root_dir: Utf8PathBuf = manifest_path.parent().unwrap().into();
let base_manifest_dir: Utf8PathBuf = root_dir.join("manifests").join(profile_name).join("base");
- let base_manifest = BaseManifest::load_from_path(&base_manifest_dir)?;
+ let mut base_manifest = BaseManifest::load_from_path(&base_manifest_dir)?;
+
+ if let Some(skip_manifests) = skip_migration {
+ base_manifest.remove_items(skip_manifests);
+ }
let mut models = HashMap::new();
let mut contracts = HashMap::new();
@@ -244,6 +253,9 @@ fn model_name_from_fully_qualified_path(file_name: &str) -> Option {
#[cfg(test)]
mod tests {
+ use dojo_test_utils::compiler;
+ use dojo_world::metadata::dojo_metadata_from_workspace;
+
use super::*;
#[test]
@@ -254,14 +266,21 @@ mod tests {
#[test]
fn gather_data_ok() {
- let data = gather_dojo_data(
- &Utf8PathBuf::from("src/test_data/spawn-and-move/Scarb.toml"),
- "dojo_example",
- "dev",
- )
- .unwrap();
+ let manifest_path = Utf8PathBuf::from("src/test_data/spawn-and-move/Scarb.toml");
+
+ let config = compiler::copy_tmp_config(
+ &Utf8PathBuf::from("../../examples/spawn-and-move"),
+ &Utf8PathBuf::from("../dojo-core"),
+ );
+
+ let ws = scarb::ops::read_workspace(config.manifest_path(), &config).unwrap();
+ let dojo_metadata = dojo_metadata_from_workspace(&ws);
+
+ let data =
+ gather_dojo_data(&manifest_path, "dojo_example", "dev", dojo_metadata.skip_migration)
+ .unwrap();
- assert_eq!(data.models.len(), 6);
+ assert_eq!(data.models.len(), 7);
assert_eq!(data.world.name, "dojo_example");
diff --git a/crates/dojo-bindgen/src/plugins/typescript_v2/mod.rs b/crates/dojo-bindgen/src/plugins/typescript_v2/mod.rs
index 7ae5d5b2a6..498b032c86 100644
--- a/crates/dojo-bindgen/src/plugins/typescript_v2/mod.rs
+++ b/crates/dojo-bindgen/src/plugins/typescript_v2/mod.rs
@@ -237,7 +237,7 @@ function convertQueryToToriiClause(query: Query): Clause | undefined {{
constructor(contractAddress: string, account?: Account) {{
super(contractAddress, account);
}}
-
+
{}
}}
",
@@ -630,6 +630,8 @@ mod tests {
use std::io::Read;
use camino::Utf8PathBuf;
+ use dojo_test_utils::compiler;
+ use dojo_world::metadata::dojo_metadata_from_workspace;
use super::*;
use crate::gather_dojo_data;
@@ -646,12 +648,17 @@ mod tests {
let expected_output_without_header =
expected_output.lines().skip(1).collect::>().join("\n");
- let data = gather_dojo_data(
- &Utf8PathBuf::from("src/test_data/spawn-and-move/Scarb.toml"),
- "dojo_examples",
- "dev",
- )
- .unwrap();
+ let manifest_path = Utf8PathBuf::from("src/test_data/spawn-and-move/Scarb.toml");
+ let config = compiler::copy_tmp_config(
+ &Utf8PathBuf::from("../../examples/spawn-and-move"),
+ &Utf8PathBuf::from("../dojo-core"),
+ );
+
+ let ws = scarb::ops::read_workspace(config.manifest_path(), &config).unwrap();
+ let dojo_metadata = dojo_metadata_from_workspace(&ws);
+ let data =
+ gather_dojo_data(&manifest_path, "dojo_examples", "dev", dojo_metadata.skip_migration)
+ .unwrap();
let actual_output = TypeScriptV2Plugin::generate_code_content(&data);
let actual_output_without_header =
diff --git a/crates/dojo-test-utils/src/migration.rs b/crates/dojo-test-utils/src/migration.rs
index e8a576f341..9edfb3e969 100644
--- a/crates/dojo-test-utils/src/migration.rs
+++ b/crates/dojo-test-utils/src/migration.rs
@@ -10,6 +10,7 @@ use starknet::macros::felt;
pub fn prepare_migration(
manifest_dir: Utf8PathBuf,
target_dir: Utf8PathBuf,
+ skip_migration: Option>,
) -> Result {
// In testing, profile name is always dev.
let profile_name = "dev";
@@ -19,6 +20,10 @@ pub fn prepare_migration(
)
.unwrap();
+ if let Some(skip_manifests) = skip_migration {
+ manifest.remove_items(skip_manifests);
+ }
+
let overlay_manifest = OverlayManifest::load_from_path(
&manifest_dir.join(MANIFESTS_DIR).join(profile_name).join(OVERLAYS_DIR),
)
diff --git a/crates/dojo-world/src/contracts/model_test.rs b/crates/dojo-world/src/contracts/model_test.rs
index 178e9b6495..8aeeec1649 100644
--- a/crates/dojo-world/src/contracts/model_test.rs
+++ b/crates/dojo-world/src/contracts/model_test.rs
@@ -9,6 +9,7 @@ use starknet::macros::felt;
use crate::contracts::model::ModelReader;
use crate::contracts::world::test::deploy_world;
use crate::contracts::world::WorldContractReader;
+use crate::metadata::dojo_metadata_from_workspace;
#[tokio::test(flavor = "multi_thread")]
async fn test_model() {
@@ -24,7 +25,12 @@ async fn test_model() {
let manifest_dir = config.manifest_path().parent().unwrap();
let target_dir = manifest_dir.join("target").join("dev");
- let world_address = deploy_world(&runner, &manifest_dir.into(), &target_dir).await;
+ let ws = scarb::ops::read_workspace(config.manifest_path(), &config).unwrap();
+ let dojo_metadata = dojo_metadata_from_workspace(&ws);
+
+ let world_address =
+ deploy_world(&runner, &manifest_dir.into(), &target_dir, dojo_metadata.skip_migration)
+ .await;
let world = WorldContractReader::new(world_address, provider);
let position = world.model_reader("Position").await.unwrap();
diff --git a/crates/dojo-world/src/contracts/world_test.rs b/crates/dojo-world/src/contracts/world_test.rs
index c011d573fb..21759c1ee2 100644
--- a/crates/dojo-world/src/contracts/world_test.rs
+++ b/crates/dojo-world/src/contracts/world_test.rs
@@ -8,6 +8,7 @@ use starknet::core::types::{BlockId, BlockTag, FieldElement};
use super::{WorldContract, WorldContractReader};
use crate::manifest::{BaseManifest, OverlayManifest, BASE_DIR, MANIFESTS_DIR, OVERLAYS_DIR};
+use crate::metadata::dojo_metadata_from_workspace;
use crate::migration::strategy::prepare_for_migration;
use crate::migration::world::WorldDiff;
use crate::migration::{Declarable, Deployable, TxnConfig};
@@ -28,8 +29,16 @@ async fn test_world_contract_reader() {
let provider = account.provider();
- let world_address =
- deploy_world(&runner, &manifest_dir.to_path_buf(), &target_dir.to_path_buf()).await;
+ let ws = scarb::ops::read_workspace(config.manifest_path(), &config).unwrap();
+ let dojo_metadata = dojo_metadata_from_workspace(&ws);
+
+ let world_address = deploy_world(
+ &runner,
+ &manifest_dir.to_path_buf(),
+ &target_dir.to_path_buf(),
+ dojo_metadata.skip_migration,
+ )
+ .await;
let _world = WorldContractReader::new(world_address, provider);
}
@@ -38,6 +47,7 @@ pub async fn deploy_world(
sequencer: &KatanaRunner,
manifest_dir: &Utf8PathBuf,
target_dir: &Utf8PathBuf,
+ skip_migration: Option>,
) -> FieldElement {
// Dev profile is used by default for testing:
let profile_name = "dev";
@@ -47,6 +57,10 @@ pub async fn deploy_world(
)
.unwrap();
+ if let Some(skip_manifests) = skip_migration {
+ manifest.remove_items(skip_manifests);
+ }
+
let overlay_manifest = OverlayManifest::load_from_path(
&manifest_dir.join(MANIFESTS_DIR).join(profile_name).join(OVERLAYS_DIR),
)
diff --git a/crates/dojo-world/src/manifest/manifest_test.rs b/crates/dojo-world/src/manifest/manifest_test.rs
index a003fc0e23..b979b93675 100644
--- a/crates/dojo-world/src/manifest/manifest_test.rs
+++ b/crates/dojo-world/src/manifest/manifest_test.rs
@@ -6,6 +6,7 @@ use dojo_test_utils::compiler;
use dojo_test_utils::rpc::MockJsonRpcTransport;
use katana_runner::KatanaRunner;
use serde_json::json;
+use smol_str::SmolStr;
use starknet::accounts::ConnectedAccount;
use starknet::core::types::contract::AbiEntry;
use starknet::core::types::{EmittedEvent, FieldElement};
@@ -21,6 +22,7 @@ use crate::manifest::{
parse_models_events, AbstractManifestError, DeploymentManifest, Manifest, OverlayClass,
OverlayDojoModel, BASE_DIR, MANIFESTS_DIR, OVERLAYS_DIR,
};
+use crate::metadata::dojo_metadata_from_workspace;
use crate::migration::world::WorldDiff;
#[tokio::test]
@@ -381,17 +383,30 @@ fn fetch_remote_manifest() {
let (temp_project_dir, config, _) =
compiler::copy_build_project_temp(source_project, dojo_core_path, true);
+ let ws = scarb::ops::read_workspace(config.manifest_path(), &config).unwrap();
+ let dojo_metadata = dojo_metadata_from_workspace(&ws);
+
let artifacts_path = temp_project_dir.join(format!("target/{profile_name}"));
- let world_address = config
- .tokio_handle()
- .block_on(async { deploy_world(&runner, &temp_project_dir, &artifacts_path).await });
+ let world_address = config.tokio_handle().block_on(async {
+ deploy_world(
+ &runner,
+ &temp_project_dir,
+ &artifacts_path,
+ dojo_metadata.skip_migration.clone(),
+ )
+ .await
+ });
let mut local_manifest = BaseManifest::load_from_path(
&temp_project_dir.join(MANIFESTS_DIR).join(profile_name).join(BASE_DIR),
)
.unwrap();
+ if let Some(skip_manifests) = dojo_metadata.skip_migration {
+ local_manifest.remove_items(skip_manifests);
+ }
+
let overlay_manifest = OverlayManifest::load_from_path(
&temp_project_dir.join(MANIFESTS_DIR).join(profile_name).join(OVERLAYS_DIR),
)
@@ -403,11 +418,11 @@ fn fetch_remote_manifest() {
DeploymentManifest::load_from_remote(provider, world_address).await.unwrap()
});
- assert_eq!(local_manifest.models.len(), 6);
- assert_eq!(local_manifest.contracts.len(), 2);
+ assert_eq!(local_manifest.models.len(), 7);
+ assert_eq!(local_manifest.contracts.len(), 3);
- assert_eq!(remote_manifest.models.len(), 6);
- assert_eq!(remote_manifest.contracts.len(), 2);
+ assert_eq!(remote_manifest.models.len(), 7);
+ assert_eq!(remote_manifest.contracts.len(), 3);
// compute diff from local and remote manifest
@@ -641,3 +656,37 @@ fn overlay_merge_for_base_work_as_expected() {
current.merge(other);
assert_eq!(current, expected);
}
+
+#[test]
+fn base_manifest_remove_items_work_as_expected() {
+ let contracts = ["c1", "c2", "c3"];
+ let models = ["m1", "m2", "m3"];
+
+ let world = Manifest { name: "world".into(), inner: Default::default() };
+ let base = Manifest { name: "base".into(), inner: Default::default() };
+
+ let contracts = contracts
+ .iter()
+ .map(|c| Manifest { name: SmolStr::from(*c), inner: Default::default() })
+ .collect();
+ let models = models
+ .iter()
+ .map(|c| Manifest { name: SmolStr::from(*c), inner: Default::default() })
+ .collect();
+
+ let mut base = BaseManifest { contracts, models, world, base };
+
+ base.remove_items(vec!["c1".to_string(), "c3".to_string(), "m2".to_string()]);
+
+ assert_eq!(base.contracts.len(), 1);
+ assert_eq!(
+ base.contracts.iter().map(|c| c.name.clone().into()).collect::>(),
+ vec!["c2"]
+ );
+
+ assert_eq!(base.models.len(), 2);
+ assert_eq!(
+ base.models.iter().map(|c| c.name.clone().into()).collect::>(),
+ vec!["m1", "m3"]
+ );
+}
diff --git a/crates/dojo-world/src/manifest/mod.rs b/crates/dojo-world/src/manifest/mod.rs
index 5391761e49..d3906595ab 100644
--- a/crates/dojo-world/src/manifest/mod.rs
+++ b/crates/dojo-world/src/manifest/mod.rs
@@ -17,6 +17,7 @@ use starknet::macros::selector;
use starknet::providers::{Provider, ProviderError};
use thiserror::Error;
use toml;
+use tracing::error;
use crate::contracts::model::ModelError;
use crate::contracts::world::WorldEvent;
@@ -121,6 +122,12 @@ impl BaseManifest {
Ok(Self { world, base, contracts, models })
}
+ /// Given a list of contract or model names, remove those from the manifest.
+ pub fn remove_items(&mut self, items: Vec) {
+ self.contracts.retain(|contract| !items.contains(&contract.name.to_string()));
+ self.models.retain(|model| !items.contains(&model.name.to_string()));
+ }
+
pub fn merge(&mut self, overlay: OverlayManifest) {
let mut base_map = HashMap::new();
@@ -129,11 +136,15 @@ impl BaseManifest {
}
for contract in overlay.contracts {
- base_map
- .get_mut(&contract.name)
- .expect("qed; overlay contract not found")
- .inner
- .merge(contract);
+ if let Some(manifest) = base_map.get_mut(&contract.name) {
+ manifest.inner.merge(contract);
+ } else {
+ error!(
+ "OverlayManifest configured for contract \"{}\", but contract is not present \
+ in BaseManifest.",
+ contract.name
+ );
+ }
}
if let Some(overlay_world) = overlay.world {
diff --git a/crates/dojo-world/src/metadata.rs b/crates/dojo-world/src/metadata.rs
index c432d09186..12f6cc837f 100644
--- a/crates/dojo-world/src/metadata.rs
+++ b/crates/dojo-world/src/metadata.rs
@@ -95,8 +95,11 @@ pub fn dojo_metadata_from_workspace(ws: &Workspace<'_>) -> DojoMetadata {
let abis_dir = manifest_dir.join(ABIS_DIR).join(BASE_DIR);
let project_metadata = ws.current_package().unwrap().manifest.metadata.dojo();
- let mut dojo_metadata =
- DojoMetadata { env: project_metadata.env.clone(), ..Default::default() };
+ let mut dojo_metadata = DojoMetadata {
+ env: project_metadata.env.clone(),
+ skip_migration: project_metadata.skip_migration.clone(),
+ ..Default::default()
+ };
let world_artifact = build_artifact_from_name(&sources_dir, &abis_dir, WORLD_CONTRACT_NAME);
@@ -147,6 +150,7 @@ pub fn dojo_metadata_from_workspace(ws: &Workspace<'_>) -> DojoMetadata {
pub struct ProjectMetadata {
pub world: Option,
pub env: Option,
+ pub skip_migration: Option>,
}
/// Metadata for a user defined resource (models, contracts).
@@ -162,6 +166,7 @@ pub struct DojoMetadata {
pub world: WorldMetadata,
pub env: Option,
pub resources_artifacts: HashMap,
+ pub skip_migration: Option>,
}
#[derive(Debug)]
diff --git a/crates/dojo-world/src/metadata_test.rs b/crates/dojo-world/src/metadata_test.rs
index 00da193bf8..adeb0df9a7 100644
--- a/crates/dojo-world/src/metadata_test.rs
+++ b/crates/dojo-world/src/metadata_test.rs
@@ -175,6 +175,7 @@ async fn get_full_dojo_metadata_from_workspace() {
dbg!(&artifacts);
for (abi_subdir, name) in artifacts {
let resource = dojo_metadata.resources_artifacts.get(&name);
+ dbg!(&dojo_metadata.resources_artifacts);
assert!(resource.is_some(), "bad resource metadata for {}", name);
let resource = resource.unwrap();
@@ -230,6 +231,9 @@ fn get_artifacts_from_manifest(manifest_dir: &Utf8PathBuf) -> Vec<(String, Strin
let name = name.replace("_others_", "::others::");
let name = name.replace("::others_", "::others::");
+
+ let name = name.replace("_mock_token_", "::mock_token::");
+ let name = name.replace("::mock_token_", "::mock_token::");
artifacts.push(("models".to_string(), name));
}
@@ -238,6 +242,7 @@ fn get_artifacts_from_manifest(manifest_dir: &Utf8PathBuf) -> Vec<(String, Strin
let name = entry.path().file_stem().unwrap().to_string_lossy().to_string();
let name = name.replace("_actions_", "::actions::");
let name = name.replace("_others_", "::others::");
+ let name = name.replace("_mock_token_", "::mock_token::");
artifacts.push(("contracts".to_string(), name));
}
diff --git a/crates/sozo/ops/src/migration/mod.rs b/crates/sozo/ops/src/migration/mod.rs
index d7d45d4c49..393ec72785 100644
--- a/crates/sozo/ops/src/migration/mod.rs
+++ b/crates/sozo/ops/src/migration/mod.rs
@@ -58,6 +58,7 @@ pub async fn migrate(
name: &str,
dry_run: bool,
txn_config: TxnConfig,
+ skip_manifests: Option>,
) -> Result<()>
where
P: Provider + Sync + Send + 'static,
@@ -77,15 +78,15 @@ where
// Load local and remote World manifests.
let (local_manifest, remote_manifest) =
- utils::load_world_manifests(&profile_dir, &account, world_address, &ui).await.map_err(
- |e| {
+ utils::load_world_manifests(&profile_dir, &account, world_address, &ui, skip_manifests)
+ .await
+ .map_err(|e| {
ui.error(e.to_string());
anyhow!(
"\n Use `sozo clean` to clean your project.\nThen, rebuild your project with \
`sozo build`.",
)
- },
- )?;
+ })?;
// Calculate diff between local and remote World manifests.
ui.print_step(2, "🧰", "Evaluating Worlds diff...");
diff --git a/crates/sozo/ops/src/migration/utils.rs b/crates/sozo/ops/src/migration/utils.rs
index d85ffb6df8..e8f6f50165 100644
--- a/crates/sozo/ops/src/migration/utils.rs
+++ b/crates/sozo/ops/src/migration/utils.rs
@@ -20,6 +20,7 @@ pub(super) async fn load_world_manifests(
account: &SingleOwnerAccount
,
world_address: Option,
ui: &Ui,
+ skip_migration: Option>,
) -> Result<(BaseManifest, Option)>
where
P: Provider + Sync + Send,
@@ -30,6 +31,10 @@ where
let mut local_manifest = BaseManifest::load_from_path(&profile_dir.join(BASE_DIR))
.map_err(|e| anyhow!("Fail to load local manifest file: {e}."))?;
+ if let Some(skip_manifests) = skip_migration {
+ local_manifest.remove_items(skip_manifests);
+ }
+
let overlay_path = profile_dir.join(OVERLAYS_DIR);
if overlay_path.exists() {
let overlay_manifest = OverlayManifest::load_from_path(&profile_dir.join(OVERLAYS_DIR))
diff --git a/crates/torii/core/src/sql_test.rs b/crates/torii/core/src/sql_test.rs
index 360e0a988c..cceb20d657 100644
--- a/crates/torii/core/src/sql_test.rs
+++ b/crates/torii/core/src/sql_test.rs
@@ -4,6 +4,7 @@ use camino::Utf8PathBuf;
use dojo_test_utils::compiler;
use dojo_test_utils::migration::prepare_migration;
use dojo_world::contracts::world::WorldContractReader;
+use dojo_world::metadata::dojo_metadata_from_workspace;
use dojo_world::migration::TxnConfig;
use dojo_world::utils::TransactionWaiter;
use katana_runner::KatanaRunner;
@@ -61,12 +62,16 @@ async fn test_load_from_remote() {
let dojo_core_path = Utf8PathBuf::from("../../dojo-core");
let config = compiler::copy_tmp_config(&source_project_dir, &dojo_core_path);
+ let ws = scarb::ops::read_workspace(config.manifest_path(), &config).unwrap();
+ let dojo_metadata = dojo_metadata_from_workspace(&ws);
let manifest_path = config.manifest_path();
let base_dir = manifest_path.parent().unwrap();
let target_dir = format!("{}/target/dev", base_dir);
- let mut migration = prepare_migration(base_dir.into(), target_dir.into()).unwrap();
+ let mut migration =
+ prepare_migration(base_dir.into(), target_dir.into(), dojo_metadata.skip_migration)
+ .unwrap();
migration.resolve_variable(migration.world_address().unwrap()).unwrap();
let sequencer = KatanaRunner::new().expect("Failed to start runner.");
@@ -112,7 +117,7 @@ async fn test_load_from_remote() {
let _block_timestamp = 1710754478_u64;
let models = sqlx::query("SELECT * FROM models").fetch_all(&pool).await.unwrap();
- assert_eq!(models.len(), 6);
+ assert_eq!(models.len(), 7);
let (id, name, packed_size, unpacked_size): (String, String, u8, u8) = sqlx::query_as(
"SELECT id, name, packed_size, unpacked_size FROM models WHERE name = 'Position'",
@@ -152,7 +157,7 @@ async fn test_load_from_remote() {
// print all entities
let entities = sqlx::query("SELECT * FROM entities").fetch_all(&pool).await.unwrap();
- assert_eq!(entities.len(), 1);
+ assert_eq!(entities.len(), 2);
let (id, keys): (String, String) = sqlx::query_as(
format!(
diff --git a/crates/torii/graphql/src/tests/mod.rs b/crates/torii/graphql/src/tests/mod.rs
index 86fcf37ad3..737cacc5ad 100644
--- a/crates/torii/graphql/src/tests/mod.rs
+++ b/crates/torii/graphql/src/tests/mod.rs
@@ -2,7 +2,8 @@ use std::str::FromStr;
use anyhow::Result;
use async_graphql::dynamic::Schema;
-use dojo_test_utils::compiler::build_test_config;
+use camino::Utf8PathBuf;
+use dojo_test_utils::compiler::{self, build_test_config};
use dojo_test_utils::migration::prepare_migration;
use dojo_test_utils::sequencer::{
get_default_test_starknet_config, SequencerConfig, TestSequencer,
@@ -12,6 +13,7 @@ use dojo_types::schema::{Enum, EnumOption, Member, Struct, Ty};
use dojo_world::contracts::abi::model::Layout;
use dojo_world::contracts::WorldContractReader;
use dojo_world::manifest::DeploymentManifest;
+use dojo_world::metadata::dojo_metadata_from_workspace;
use dojo_world::migration::TxnConfig;
use dojo_world::utils::TransactionWaiter;
use scarb::ops;
@@ -277,9 +279,18 @@ pub async fn spinup_types_test() -> Result {
let pool = SqlitePoolOptions::new().max_connections(5).connect_with(options).await.unwrap();
sqlx::migrate!("../migrations").run(&pool).await.unwrap();
- let base_path = "../types-test";
- let target_path = format!("{}/target/dev", base_path);
- let migration = prepare_migration(base_path.into(), target_path.into()).unwrap();
+ let source_project_dir = Utf8PathBuf::from("../types-test");
+ let dojo_core_path = Utf8PathBuf::from("../../dojo-core");
+
+ let config = compiler::copy_tmp_config(&source_project_dir, &dojo_core_path);
+
+ let ws = ops::read_workspace(config.manifest_path(), &config)
+ .unwrap_or_else(|op| panic!("Error building workspace: {op:?}"));
+ let dojo_metadata = dojo_metadata_from_workspace(&ws);
+
+ let target_path = ws.target_dir().path_existent().unwrap().join(config.profile().to_string());
+ let migration =
+ prepare_migration(source_project_dir, target_path, dojo_metadata.skip_migration).unwrap();
let config = build_test_config("../types-test/Scarb.toml").unwrap();
let db = Sql::new(pool.clone(), migration.world_address().unwrap()).await.unwrap();
@@ -294,7 +305,7 @@ pub async fn spinup_types_test() -> Result {
let ws = ops::read_workspace(config.manifest_path(), &config)
.unwrap_or_else(|op| panic!("Error building workspace: {op:?}"));
- execute_strategy(&ws, &migration, &account, TxnConfig::default()).await.unwrap();
+ execute_strategy(&ws, &migration, &account, TxnConfig::init_wait()).await.unwrap();
let manifest =
DeploymentManifest::load_from_remote(&provider, migration.world_address().unwrap())
diff --git a/crates/torii/grpc/Cargo.toml b/crates/torii/grpc/Cargo.toml
index 48fd1a8c20..3673a790a2 100644
--- a/crates/torii/grpc/Cargo.toml
+++ b/crates/torii/grpc/Cargo.toml
@@ -31,6 +31,7 @@ tower.workspace = true
tracing.workspace = true
[dev-dependencies]
+camino.workspace = true
dojo-test-utils.workspace = true
dojo-world = { path = "../../dojo-world", features = [ "contracts" ] }
scarb.workspace = true
diff --git a/crates/torii/grpc/src/server/tests/entities_test.rs b/crates/torii/grpc/src/server/tests/entities_test.rs
index 4776659558..786c1ffd1a 100644
--- a/crates/torii/grpc/src/server/tests/entities_test.rs
+++ b/crates/torii/grpc/src/server/tests/entities_test.rs
@@ -1,12 +1,14 @@
use std::str::FromStr;
use std::sync::Arc;
-use dojo_test_utils::compiler::build_test_config;
+use camino::Utf8PathBuf;
+use dojo_test_utils::compiler::{self, build_test_config};
use dojo_test_utils::migration::prepare_migration;
use dojo_test_utils::sequencer::{
get_default_test_starknet_config, SequencerConfig, TestSequencer,
};
use dojo_world::contracts::WorldContractReader;
+use dojo_world::metadata::dojo_metadata_from_workspace;
use dojo_world::migration::TxnConfig;
use dojo_world::utils::TransactionWaiter;
use scarb::ops;
@@ -34,10 +36,20 @@ async fn test_entities_queries() {
SqliteConnectOptions::from_str("sqlite::memory:").unwrap().create_if_missing(true);
let pool = SqlitePoolOptions::new().max_connections(5).connect_with(options).await.unwrap();
sqlx::migrate!("../migrations").run(&pool).await.unwrap();
- let base_path = "../../../examples/spawn-and-move";
- let target_path = format!("{}/target/dev", base_path);
- let mut migration = prepare_migration(base_path.into(), target_path.into()).unwrap();
+ let source_project_dir = Utf8PathBuf::from("../../../examples/spawn-and-move");
+ let dojo_core_path = Utf8PathBuf::from("../../dojo-core");
+
+ let config = compiler::copy_tmp_config(&source_project_dir, &dojo_core_path);
+
+ let ws = ops::read_workspace(config.manifest_path(), &config)
+ .unwrap_or_else(|op| panic!("Error building workspace: {op:?}"));
+ let dojo_metadata = dojo_metadata_from_workspace(&ws);
+
+ let target_path = ws.target_dir().path_existent().unwrap().join(config.profile().to_string());
+
+ let mut migration =
+ prepare_migration(source_project_dir, target_path, dojo_metadata.skip_migration).unwrap();
migration.resolve_variable(migration.world_address().unwrap()).unwrap();
dbg!(&migration);
diff --git a/examples/spawn-and-move/Scarb.toml b/examples/spawn-and-move/Scarb.toml
index e8b10f51c5..5dd277ffa0 100644
--- a/examples/spawn-and-move/Scarb.toml
+++ b/examples/spawn-and-move/Scarb.toml
@@ -15,6 +15,8 @@ dojo = { path = "../../crates/dojo-core" }
[[target.dojo]]
build-external-contracts = [ ]
+# `dev` profile
+
[tool.dojo.world]
description = "example world"
name = "example"
@@ -26,3 +28,27 @@ rpc_url = "http://localhost:5050/"
account_address = "0x6162896d1d7ab204c7ccac6dd5f8e9e7c25ecd5ae4fcb4ad32e57786bb46e03"
private_key = "0x1800000000300000180000000000030000000000003006001800006600"
world_address = "0x07efebb0c2d4cc285d48a97a7174def3be7fdd6b7bd29cca758fa2e17e03ef30"
+
+# `release` profile
+#
+# for now configurations in `tool` are not merged recursively so to override
+# `skip_migration` we need to redefine the whole `tool.dojo` table
+[profile.release]
+
+[profile.release.tool.dojo.world]
+description = "example world"
+name = "example"
+
+[profile.release.tool.dojo.env]
+rpc_url = "http://localhost:5050/"
+
+# Default account for katana with seed = 0
+account_address = "0x6162896d1d7ab204c7ccac6dd5f8e9e7c25ecd5ae4fcb4ad32e57786bb46e03"
+private_key = "0x1800000000300000180000000000030000000000003006001800006600"
+world_address = "0x07efebb0c2d4cc285d48a97a7174def3be7fdd6b7bd29cca758fa2e17e03ef30"
+
+[profile.release.tool.dojo]
+skip_migration = [
+ "dojo_examples::mock_token::mock_token",
+ "dojo_examples::models::mock_token",
+]
diff --git a/examples/spawn-and-move/manifests/dev/abis/base/contracts/dojo_examples_mock_token_mock_token.json b/examples/spawn-and-move/manifests/dev/abis/base/contracts/dojo_examples_mock_token_mock_token.json
new file mode 100644
index 0000000000..f4bde33e6d
--- /dev/null
+++ b/examples/spawn-and-move/manifests/dev/abis/base/contracts/dojo_examples_mock_token_mock_token.json
@@ -0,0 +1,133 @@
+[
+ {
+ "type": "impl",
+ "name": "DojoResourceProviderImpl",
+ "interface_name": "dojo::world::IDojoResourceProvider"
+ },
+ {
+ "type": "interface",
+ "name": "dojo::world::IDojoResourceProvider",
+ "items": [
+ {
+ "type": "function",
+ "name": "dojo_resource",
+ "inputs": [],
+ "outputs": [
+ {
+ "type": "core::felt252"
+ }
+ ],
+ "state_mutability": "view"
+ }
+ ]
+ },
+ {
+ "type": "impl",
+ "name": "WorldProviderImpl",
+ "interface_name": "dojo::world::IWorldProvider"
+ },
+ {
+ "type": "struct",
+ "name": "dojo::world::IWorldDispatcher",
+ "members": [
+ {
+ "name": "contract_address",
+ "type": "core::starknet::contract_address::ContractAddress"
+ }
+ ]
+ },
+ {
+ "type": "interface",
+ "name": "dojo::world::IWorldProvider",
+ "items": [
+ {
+ "type": "function",
+ "name": "world",
+ "inputs": [],
+ "outputs": [
+ {
+ "type": "dojo::world::IWorldDispatcher"
+ }
+ ],
+ "state_mutability": "view"
+ }
+ ]
+ },
+ {
+ "type": "impl",
+ "name": "IDojoInitImpl",
+ "interface_name": "dojo_examples::mock_token::mock_token::IDojoInit"
+ },
+ {
+ "type": "interface",
+ "name": "dojo_examples::mock_token::mock_token::IDojoInit",
+ "items": [
+ {
+ "type": "function",
+ "name": "dojo_init",
+ "inputs": [],
+ "outputs": [],
+ "state_mutability": "view"
+ }
+ ]
+ },
+ {
+ "type": "impl",
+ "name": "UpgradableImpl",
+ "interface_name": "dojo::components::upgradeable::IUpgradeable"
+ },
+ {
+ "type": "interface",
+ "name": "dojo::components::upgradeable::IUpgradeable",
+ "items": [
+ {
+ "type": "function",
+ "name": "upgrade",
+ "inputs": [
+ {
+ "name": "new_class_hash",
+ "type": "core::starknet::class_hash::ClassHash"
+ }
+ ],
+ "outputs": [],
+ "state_mutability": "external"
+ }
+ ]
+ },
+ {
+ "type": "event",
+ "name": "dojo::components::upgradeable::upgradeable::Upgraded",
+ "kind": "struct",
+ "members": [
+ {
+ "name": "class_hash",
+ "type": "core::starknet::class_hash::ClassHash",
+ "kind": "data"
+ }
+ ]
+ },
+ {
+ "type": "event",
+ "name": "dojo::components::upgradeable::upgradeable::Event",
+ "kind": "enum",
+ "variants": [
+ {
+ "name": "Upgraded",
+ "type": "dojo::components::upgradeable::upgradeable::Upgraded",
+ "kind": "nested"
+ }
+ ]
+ },
+ {
+ "type": "event",
+ "name": "dojo_examples::mock_token::mock_token::Event",
+ "kind": "enum",
+ "variants": [
+ {
+ "name": "UpgradeableEvent",
+ "type": "dojo::components::upgradeable::upgradeable::Event",
+ "kind": "nested"
+ }
+ ]
+ }
+]
\ No newline at end of file
diff --git a/examples/spawn-and-move/manifests/dev/abis/base/models/dojo_examples_models_mock_token.json b/examples/spawn-and-move/manifests/dev/abis/base/models/dojo_examples_models_mock_token.json
new file mode 100644
index 0000000000..b2c1c340fa
--- /dev/null
+++ b/examples/spawn-and-move/manifests/dev/abis/base/models/dojo_examples_models_mock_token.json
@@ -0,0 +1,363 @@
+[
+ {
+ "type": "impl",
+ "name": "DojoModelImpl",
+ "interface_name": "dojo::model::IModel"
+ },
+ {
+ "type": "struct",
+ "name": "core::byte_array::ByteArray",
+ "members": [
+ {
+ "name": "data",
+ "type": "core::array::Array::"
+ },
+ {
+ "name": "pending_word",
+ "type": "core::felt252"
+ },
+ {
+ "name": "pending_word_len",
+ "type": "core::integer::u32"
+ }
+ ]
+ },
+ {
+ "type": "enum",
+ "name": "core::option::Option::",
+ "variants": [
+ {
+ "name": "Some",
+ "type": "core::integer::u32"
+ },
+ {
+ "name": "None",
+ "type": "()"
+ }
+ ]
+ },
+ {
+ "type": "struct",
+ "name": "core::array::Span::",
+ "members": [
+ {
+ "name": "snapshot",
+ "type": "@core::array::Array::"
+ }
+ ]
+ },
+ {
+ "type": "struct",
+ "name": "dojo::database::introspect::FieldLayout",
+ "members": [
+ {
+ "name": "selector",
+ "type": "core::felt252"
+ },
+ {
+ "name": "layout",
+ "type": "dojo::database::introspect::Layout"
+ }
+ ]
+ },
+ {
+ "type": "struct",
+ "name": "core::array::Span::",
+ "members": [
+ {
+ "name": "snapshot",
+ "type": "@core::array::Array::"
+ }
+ ]
+ },
+ {
+ "type": "struct",
+ "name": "core::array::Span::",
+ "members": [
+ {
+ "name": "snapshot",
+ "type": "@core::array::Array::"
+ }
+ ]
+ },
+ {
+ "type": "enum",
+ "name": "dojo::database::introspect::Layout",
+ "variants": [
+ {
+ "name": "Fixed",
+ "type": "core::array::Span::"
+ },
+ {
+ "name": "Struct",
+ "type": "core::array::Span::"
+ },
+ {
+ "name": "Tuple",
+ "type": "core::array::Span::"
+ },
+ {
+ "name": "Array",
+ "type": "core::array::Span::"
+ },
+ {
+ "name": "ByteArray",
+ "type": "()"
+ },
+ {
+ "name": "Enum",
+ "type": "core::array::Span::"
+ }
+ ]
+ },
+ {
+ "type": "struct",
+ "name": "core::array::Span::",
+ "members": [
+ {
+ "name": "snapshot",
+ "type": "@core::array::Array::"
+ }
+ ]
+ },
+ {
+ "type": "struct",
+ "name": "dojo::database::introspect::Member",
+ "members": [
+ {
+ "name": "name",
+ "type": "core::felt252"
+ },
+ {
+ "name": "attrs",
+ "type": "core::array::Span::"
+ },
+ {
+ "name": "ty",
+ "type": "dojo::database::introspect::Ty"
+ }
+ ]
+ },
+ {
+ "type": "struct",
+ "name": "core::array::Span::",
+ "members": [
+ {
+ "name": "snapshot",
+ "type": "@core::array::Array::"
+ }
+ ]
+ },
+ {
+ "type": "struct",
+ "name": "dojo::database::introspect::Struct",
+ "members": [
+ {
+ "name": "name",
+ "type": "core::felt252"
+ },
+ {
+ "name": "attrs",
+ "type": "core::array::Span::"
+ },
+ {
+ "name": "children",
+ "type": "core::array::Span::"
+ }
+ ]
+ },
+ {
+ "type": "struct",
+ "name": "core::array::Span::<(core::felt252, dojo::database::introspect::Ty)>",
+ "members": [
+ {
+ "name": "snapshot",
+ "type": "@core::array::Array::<(core::felt252, dojo::database::introspect::Ty)>"
+ }
+ ]
+ },
+ {
+ "type": "struct",
+ "name": "dojo::database::introspect::Enum",
+ "members": [
+ {
+ "name": "name",
+ "type": "core::felt252"
+ },
+ {
+ "name": "attrs",
+ "type": "core::array::Span::"
+ },
+ {
+ "name": "children",
+ "type": "core::array::Span::<(core::felt252, dojo::database::introspect::Ty)>"
+ }
+ ]
+ },
+ {
+ "type": "struct",
+ "name": "core::array::Span::",
+ "members": [
+ {
+ "name": "snapshot",
+ "type": "@core::array::Array::"
+ }
+ ]
+ },
+ {
+ "type": "enum",
+ "name": "dojo::database::introspect::Ty",
+ "variants": [
+ {
+ "name": "Primitive",
+ "type": "core::felt252"
+ },
+ {
+ "name": "Struct",
+ "type": "dojo::database::introspect::Struct"
+ },
+ {
+ "name": "Enum",
+ "type": "dojo::database::introspect::Enum"
+ },
+ {
+ "name": "Tuple",
+ "type": "core::array::Span::"
+ },
+ {
+ "name": "Array",
+ "type": "core::array::Span::"
+ },
+ {
+ "name": "ByteArray",
+ "type": "()"
+ }
+ ]
+ },
+ {
+ "type": "interface",
+ "name": "dojo::model::IModel",
+ "items": [
+ {
+ "type": "function",
+ "name": "selector",
+ "inputs": [],
+ "outputs": [
+ {
+ "type": "core::felt252"
+ }
+ ],
+ "state_mutability": "view"
+ },
+ {
+ "type": "function",
+ "name": "name",
+ "inputs": [],
+ "outputs": [
+ {
+ "type": "core::byte_array::ByteArray"
+ }
+ ],
+ "state_mutability": "view"
+ },
+ {
+ "type": "function",
+ "name": "version",
+ "inputs": [],
+ "outputs": [
+ {
+ "type": "core::integer::u8"
+ }
+ ],
+ "state_mutability": "view"
+ },
+ {
+ "type": "function",
+ "name": "unpacked_size",
+ "inputs": [],
+ "outputs": [
+ {
+ "type": "core::option::Option::"
+ }
+ ],
+ "state_mutability": "view"
+ },
+ {
+ "type": "function",
+ "name": "packed_size",
+ "inputs": [],
+ "outputs": [
+ {
+ "type": "core::option::Option::"
+ }
+ ],
+ "state_mutability": "view"
+ },
+ {
+ "type": "function",
+ "name": "layout",
+ "inputs": [],
+ "outputs": [
+ {
+ "type": "dojo::database::introspect::Layout"
+ }
+ ],
+ "state_mutability": "view"
+ },
+ {
+ "type": "function",
+ "name": "schema",
+ "inputs": [],
+ "outputs": [
+ {
+ "type": "dojo::database::introspect::Ty"
+ }
+ ],
+ "state_mutability": "view"
+ }
+ ]
+ },
+ {
+ "type": "impl",
+ "name": "mock_tokenImpl",
+ "interface_name": "dojo_examples::models::Imock_token"
+ },
+ {
+ "type": "struct",
+ "name": "dojo_examples::models::MockToken",
+ "members": [
+ {
+ "name": "account",
+ "type": "core::starknet::contract_address::ContractAddress"
+ },
+ {
+ "name": "amount",
+ "type": "core::integer::u128"
+ }
+ ]
+ },
+ {
+ "type": "interface",
+ "name": "dojo_examples::models::Imock_token",
+ "items": [
+ {
+ "type": "function",
+ "name": "ensure_abi",
+ "inputs": [
+ {
+ "name": "model",
+ "type": "dojo_examples::models::MockToken"
+ }
+ ],
+ "outputs": [],
+ "state_mutability": "view"
+ }
+ ]
+ },
+ {
+ "type": "event",
+ "name": "dojo_examples::models::mock_token::Event",
+ "kind": "enum",
+ "variants": []
+ }
+]
\ No newline at end of file
diff --git a/examples/spawn-and-move/manifests/dev/abis/deployments/contracts/dojo_examples_mock_token_mock_token.json b/examples/spawn-and-move/manifests/dev/abis/deployments/contracts/dojo_examples_mock_token_mock_token.json
new file mode 100644
index 0000000000..f4bde33e6d
--- /dev/null
+++ b/examples/spawn-and-move/manifests/dev/abis/deployments/contracts/dojo_examples_mock_token_mock_token.json
@@ -0,0 +1,133 @@
+[
+ {
+ "type": "impl",
+ "name": "DojoResourceProviderImpl",
+ "interface_name": "dojo::world::IDojoResourceProvider"
+ },
+ {
+ "type": "interface",
+ "name": "dojo::world::IDojoResourceProvider",
+ "items": [
+ {
+ "type": "function",
+ "name": "dojo_resource",
+ "inputs": [],
+ "outputs": [
+ {
+ "type": "core::felt252"
+ }
+ ],
+ "state_mutability": "view"
+ }
+ ]
+ },
+ {
+ "type": "impl",
+ "name": "WorldProviderImpl",
+ "interface_name": "dojo::world::IWorldProvider"
+ },
+ {
+ "type": "struct",
+ "name": "dojo::world::IWorldDispatcher",
+ "members": [
+ {
+ "name": "contract_address",
+ "type": "core::starknet::contract_address::ContractAddress"
+ }
+ ]
+ },
+ {
+ "type": "interface",
+ "name": "dojo::world::IWorldProvider",
+ "items": [
+ {
+ "type": "function",
+ "name": "world",
+ "inputs": [],
+ "outputs": [
+ {
+ "type": "dojo::world::IWorldDispatcher"
+ }
+ ],
+ "state_mutability": "view"
+ }
+ ]
+ },
+ {
+ "type": "impl",
+ "name": "IDojoInitImpl",
+ "interface_name": "dojo_examples::mock_token::mock_token::IDojoInit"
+ },
+ {
+ "type": "interface",
+ "name": "dojo_examples::mock_token::mock_token::IDojoInit",
+ "items": [
+ {
+ "type": "function",
+ "name": "dojo_init",
+ "inputs": [],
+ "outputs": [],
+ "state_mutability": "view"
+ }
+ ]
+ },
+ {
+ "type": "impl",
+ "name": "UpgradableImpl",
+ "interface_name": "dojo::components::upgradeable::IUpgradeable"
+ },
+ {
+ "type": "interface",
+ "name": "dojo::components::upgradeable::IUpgradeable",
+ "items": [
+ {
+ "type": "function",
+ "name": "upgrade",
+ "inputs": [
+ {
+ "name": "new_class_hash",
+ "type": "core::starknet::class_hash::ClassHash"
+ }
+ ],
+ "outputs": [],
+ "state_mutability": "external"
+ }
+ ]
+ },
+ {
+ "type": "event",
+ "name": "dojo::components::upgradeable::upgradeable::Upgraded",
+ "kind": "struct",
+ "members": [
+ {
+ "name": "class_hash",
+ "type": "core::starknet::class_hash::ClassHash",
+ "kind": "data"
+ }
+ ]
+ },
+ {
+ "type": "event",
+ "name": "dojo::components::upgradeable::upgradeable::Event",
+ "kind": "enum",
+ "variants": [
+ {
+ "name": "Upgraded",
+ "type": "dojo::components::upgradeable::upgradeable::Upgraded",
+ "kind": "nested"
+ }
+ ]
+ },
+ {
+ "type": "event",
+ "name": "dojo_examples::mock_token::mock_token::Event",
+ "kind": "enum",
+ "variants": [
+ {
+ "name": "UpgradeableEvent",
+ "type": "dojo::components::upgradeable::upgradeable::Event",
+ "kind": "nested"
+ }
+ ]
+ }
+]
\ No newline at end of file
diff --git a/examples/spawn-and-move/manifests/dev/abis/deployments/models/dojo_examples_models_mock_token.json b/examples/spawn-and-move/manifests/dev/abis/deployments/models/dojo_examples_models_mock_token.json
new file mode 100644
index 0000000000..b2c1c340fa
--- /dev/null
+++ b/examples/spawn-and-move/manifests/dev/abis/deployments/models/dojo_examples_models_mock_token.json
@@ -0,0 +1,363 @@
+[
+ {
+ "type": "impl",
+ "name": "DojoModelImpl",
+ "interface_name": "dojo::model::IModel"
+ },
+ {
+ "type": "struct",
+ "name": "core::byte_array::ByteArray",
+ "members": [
+ {
+ "name": "data",
+ "type": "core::array::Array::"
+ },
+ {
+ "name": "pending_word",
+ "type": "core::felt252"
+ },
+ {
+ "name": "pending_word_len",
+ "type": "core::integer::u32"
+ }
+ ]
+ },
+ {
+ "type": "enum",
+ "name": "core::option::Option::",
+ "variants": [
+ {
+ "name": "Some",
+ "type": "core::integer::u32"
+ },
+ {
+ "name": "None",
+ "type": "()"
+ }
+ ]
+ },
+ {
+ "type": "struct",
+ "name": "core::array::Span::",
+ "members": [
+ {
+ "name": "snapshot",
+ "type": "@core::array::Array::"
+ }
+ ]
+ },
+ {
+ "type": "struct",
+ "name": "dojo::database::introspect::FieldLayout",
+ "members": [
+ {
+ "name": "selector",
+ "type": "core::felt252"
+ },
+ {
+ "name": "layout",
+ "type": "dojo::database::introspect::Layout"
+ }
+ ]
+ },
+ {
+ "type": "struct",
+ "name": "core::array::Span::",
+ "members": [
+ {
+ "name": "snapshot",
+ "type": "@core::array::Array::"
+ }
+ ]
+ },
+ {
+ "type": "struct",
+ "name": "core::array::Span::",
+ "members": [
+ {
+ "name": "snapshot",
+ "type": "@core::array::Array::"
+ }
+ ]
+ },
+ {
+ "type": "enum",
+ "name": "dojo::database::introspect::Layout",
+ "variants": [
+ {
+ "name": "Fixed",
+ "type": "core::array::Span::"
+ },
+ {
+ "name": "Struct",
+ "type": "core::array::Span::"
+ },
+ {
+ "name": "Tuple",
+ "type": "core::array::Span::"
+ },
+ {
+ "name": "Array",
+ "type": "core::array::Span::"
+ },
+ {
+ "name": "ByteArray",
+ "type": "()"
+ },
+ {
+ "name": "Enum",
+ "type": "core::array::Span::"
+ }
+ ]
+ },
+ {
+ "type": "struct",
+ "name": "core::array::Span::",
+ "members": [
+ {
+ "name": "snapshot",
+ "type": "@core::array::Array::"
+ }
+ ]
+ },
+ {
+ "type": "struct",
+ "name": "dojo::database::introspect::Member",
+ "members": [
+ {
+ "name": "name",
+ "type": "core::felt252"
+ },
+ {
+ "name": "attrs",
+ "type": "core::array::Span::"
+ },
+ {
+ "name": "ty",
+ "type": "dojo::database::introspect::Ty"
+ }
+ ]
+ },
+ {
+ "type": "struct",
+ "name": "core::array::Span::",
+ "members": [
+ {
+ "name": "snapshot",
+ "type": "@core::array::Array::"
+ }
+ ]
+ },
+ {
+ "type": "struct",
+ "name": "dojo::database::introspect::Struct",
+ "members": [
+ {
+ "name": "name",
+ "type": "core::felt252"
+ },
+ {
+ "name": "attrs",
+ "type": "core::array::Span::"
+ },
+ {
+ "name": "children",
+ "type": "core::array::Span::"
+ }
+ ]
+ },
+ {
+ "type": "struct",
+ "name": "core::array::Span::<(core::felt252, dojo::database::introspect::Ty)>",
+ "members": [
+ {
+ "name": "snapshot",
+ "type": "@core::array::Array::<(core::felt252, dojo::database::introspect::Ty)>"
+ }
+ ]
+ },
+ {
+ "type": "struct",
+ "name": "dojo::database::introspect::Enum",
+ "members": [
+ {
+ "name": "name",
+ "type": "core::felt252"
+ },
+ {
+ "name": "attrs",
+ "type": "core::array::Span::"
+ },
+ {
+ "name": "children",
+ "type": "core::array::Span::<(core::felt252, dojo::database::introspect::Ty)>"
+ }
+ ]
+ },
+ {
+ "type": "struct",
+ "name": "core::array::Span::",
+ "members": [
+ {
+ "name": "snapshot",
+ "type": "@core::array::Array::"
+ }
+ ]
+ },
+ {
+ "type": "enum",
+ "name": "dojo::database::introspect::Ty",
+ "variants": [
+ {
+ "name": "Primitive",
+ "type": "core::felt252"
+ },
+ {
+ "name": "Struct",
+ "type": "dojo::database::introspect::Struct"
+ },
+ {
+ "name": "Enum",
+ "type": "dojo::database::introspect::Enum"
+ },
+ {
+ "name": "Tuple",
+ "type": "core::array::Span::"
+ },
+ {
+ "name": "Array",
+ "type": "core::array::Span::"
+ },
+ {
+ "name": "ByteArray",
+ "type": "()"
+ }
+ ]
+ },
+ {
+ "type": "interface",
+ "name": "dojo::model::IModel",
+ "items": [
+ {
+ "type": "function",
+ "name": "selector",
+ "inputs": [],
+ "outputs": [
+ {
+ "type": "core::felt252"
+ }
+ ],
+ "state_mutability": "view"
+ },
+ {
+ "type": "function",
+ "name": "name",
+ "inputs": [],
+ "outputs": [
+ {
+ "type": "core::byte_array::ByteArray"
+ }
+ ],
+ "state_mutability": "view"
+ },
+ {
+ "type": "function",
+ "name": "version",
+ "inputs": [],
+ "outputs": [
+ {
+ "type": "core::integer::u8"
+ }
+ ],
+ "state_mutability": "view"
+ },
+ {
+ "type": "function",
+ "name": "unpacked_size",
+ "inputs": [],
+ "outputs": [
+ {
+ "type": "core::option::Option::"
+ }
+ ],
+ "state_mutability": "view"
+ },
+ {
+ "type": "function",
+ "name": "packed_size",
+ "inputs": [],
+ "outputs": [
+ {
+ "type": "core::option::Option::"
+ }
+ ],
+ "state_mutability": "view"
+ },
+ {
+ "type": "function",
+ "name": "layout",
+ "inputs": [],
+ "outputs": [
+ {
+ "type": "dojo::database::introspect::Layout"
+ }
+ ],
+ "state_mutability": "view"
+ },
+ {
+ "type": "function",
+ "name": "schema",
+ "inputs": [],
+ "outputs": [
+ {
+ "type": "dojo::database::introspect::Ty"
+ }
+ ],
+ "state_mutability": "view"
+ }
+ ]
+ },
+ {
+ "type": "impl",
+ "name": "mock_tokenImpl",
+ "interface_name": "dojo_examples::models::Imock_token"
+ },
+ {
+ "type": "struct",
+ "name": "dojo_examples::models::MockToken",
+ "members": [
+ {
+ "name": "account",
+ "type": "core::starknet::contract_address::ContractAddress"
+ },
+ {
+ "name": "amount",
+ "type": "core::integer::u128"
+ }
+ ]
+ },
+ {
+ "type": "interface",
+ "name": "dojo_examples::models::Imock_token",
+ "items": [
+ {
+ "type": "function",
+ "name": "ensure_abi",
+ "inputs": [
+ {
+ "name": "model",
+ "type": "dojo_examples::models::MockToken"
+ }
+ ],
+ "outputs": [],
+ "state_mutability": "view"
+ }
+ ]
+ },
+ {
+ "type": "event",
+ "name": "dojo_examples::models::mock_token::Event",
+ "kind": "enum",
+ "variants": []
+ }
+]
\ No newline at end of file
diff --git a/examples/spawn-and-move/manifests/dev/base/contracts/dojo_examples_mock_token_mock_token.toml b/examples/spawn-and-move/manifests/dev/base/contracts/dojo_examples_mock_token_mock_token.toml
new file mode 100644
index 0000000000..572af4068e
--- /dev/null
+++ b/examples/spawn-and-move/manifests/dev/base/contracts/dojo_examples_mock_token_mock_token.toml
@@ -0,0 +1,10 @@
+kind = "DojoContract"
+class_hash = "0x5c32bc974f96f82ded691bb95bf26b2783f874fffb50fe84a331acb75ecf5b2"
+original_class_hash = "0x5c32bc974f96f82ded691bb95bf26b2783f874fffb50fe84a331acb75ecf5b2"
+base_class_hash = "0x0"
+abi = "manifests/dev/abis/base/contracts/dojo_examples_mock_token_mock_token.json"
+reads = []
+writes = []
+computed = []
+init_calldata = []
+name = "dojo_examples::mock_token::mock_token"
diff --git a/examples/spawn-and-move/manifests/dev/base/models/dojo_examples_models_mock_token.toml b/examples/spawn-and-move/manifests/dev/base/models/dojo_examples_models_mock_token.toml
new file mode 100644
index 0000000000..1bf036168c
--- /dev/null
+++ b/examples/spawn-and-move/manifests/dev/base/models/dojo_examples_models_mock_token.toml
@@ -0,0 +1,15 @@
+kind = "DojoModel"
+class_hash = "0x6a21c56878ba470ac7a51f336ca6a59781de38e1810d2d20866ab2b52138a6d"
+original_class_hash = "0x6a21c56878ba470ac7a51f336ca6a59781de38e1810d2d20866ab2b52138a6d"
+abi = "manifests/dev/abis/base/models/dojo_examples_models_mock_token.json"
+name = "dojo_examples::models::mock_token"
+
+[[members]]
+name = "account"
+type = "ContractAddress"
+key = true
+
+[[members]]
+name = "amount"
+type = "u128"
+key = false
diff --git a/examples/spawn-and-move/manifests/dev/manifest.json b/examples/spawn-and-move/manifests/dev/manifest.json
index 0b6a6af2fb..9f2e854a95 100644
--- a/examples/spawn-and-move/manifests/dev/manifest.json
+++ b/examples/spawn-and-move/manifests/dev/manifest.json
@@ -1333,6 +1333,151 @@
"init_calldata": [],
"name": "dojo_examples::actions::actions"
},
+ {
+ "kind": "DojoContract",
+ "address": "0x75961b2027c52948ecebfd347aa427436ea308d41997fa9b3c98380f7011d53",
+ "class_hash": "0x5c32bc974f96f82ded691bb95bf26b2783f874fffb50fe84a331acb75ecf5b2",
+ "original_class_hash": "0x5c32bc974f96f82ded691bb95bf26b2783f874fffb50fe84a331acb75ecf5b2",
+ "base_class_hash": "0x22f3e55b61d86c2ac5239fa3b3b8761f26b9a5c0b5f61ddbd5d756ced498b46",
+ "abi": [
+ {
+ "type": "impl",
+ "name": "DojoResourceProviderImpl",
+ "interface_name": "dojo::world::IDojoResourceProvider"
+ },
+ {
+ "type": "interface",
+ "name": "dojo::world::IDojoResourceProvider",
+ "items": [
+ {
+ "type": "function",
+ "name": "dojo_resource",
+ "inputs": [],
+ "outputs": [
+ {
+ "type": "core::felt252"
+ }
+ ],
+ "state_mutability": "view"
+ }
+ ]
+ },
+ {
+ "type": "impl",
+ "name": "WorldProviderImpl",
+ "interface_name": "dojo::world::IWorldProvider"
+ },
+ {
+ "type": "struct",
+ "name": "dojo::world::IWorldDispatcher",
+ "members": [
+ {
+ "name": "contract_address",
+ "type": "core::starknet::contract_address::ContractAddress"
+ }
+ ]
+ },
+ {
+ "type": "interface",
+ "name": "dojo::world::IWorldProvider",
+ "items": [
+ {
+ "type": "function",
+ "name": "world",
+ "inputs": [],
+ "outputs": [
+ {
+ "type": "dojo::world::IWorldDispatcher"
+ }
+ ],
+ "state_mutability": "view"
+ }
+ ]
+ },
+ {
+ "type": "impl",
+ "name": "IDojoInitImpl",
+ "interface_name": "dojo_examples::mock_token::mock_token::IDojoInit"
+ },
+ {
+ "type": "interface",
+ "name": "dojo_examples::mock_token::mock_token::IDojoInit",
+ "items": [
+ {
+ "type": "function",
+ "name": "dojo_init",
+ "inputs": [],
+ "outputs": [],
+ "state_mutability": "view"
+ }
+ ]
+ },
+ {
+ "type": "impl",
+ "name": "UpgradableImpl",
+ "interface_name": "dojo::components::upgradeable::IUpgradeable"
+ },
+ {
+ "type": "interface",
+ "name": "dojo::components::upgradeable::IUpgradeable",
+ "items": [
+ {
+ "type": "function",
+ "name": "upgrade",
+ "inputs": [
+ {
+ "name": "new_class_hash",
+ "type": "core::starknet::class_hash::ClassHash"
+ }
+ ],
+ "outputs": [],
+ "state_mutability": "external"
+ }
+ ]
+ },
+ {
+ "type": "event",
+ "name": "dojo::components::upgradeable::upgradeable::Upgraded",
+ "kind": "struct",
+ "members": [
+ {
+ "name": "class_hash",
+ "type": "core::starknet::class_hash::ClassHash",
+ "kind": "data"
+ }
+ ]
+ },
+ {
+ "type": "event",
+ "name": "dojo::components::upgradeable::upgradeable::Event",
+ "kind": "enum",
+ "variants": [
+ {
+ "name": "Upgraded",
+ "type": "dojo::components::upgradeable::upgradeable::Upgraded",
+ "kind": "nested"
+ }
+ ]
+ },
+ {
+ "type": "event",
+ "name": "dojo_examples::mock_token::mock_token::Event",
+ "kind": "enum",
+ "variants": [
+ {
+ "name": "UpgradeableEvent",
+ "type": "dojo::components::upgradeable::upgradeable::Event",
+ "kind": "nested"
+ }
+ ]
+ }
+ ],
+ "reads": [],
+ "writes": [],
+ "computed": [],
+ "init_calldata": [],
+ "name": "dojo_examples::mock_token::mock_token"
+ },
{
"kind": "DojoContract",
"address": "0x3f51cd82daaf5907d2fd082ae3f45ae2ef96ab61677f46abc16e0a54d3392d1",
@@ -2303,6 +2448,387 @@
],
"name": "dojo_examples::models::message"
},
+ {
+ "kind": "DojoModel",
+ "members": [
+ {
+ "name": "account",
+ "type": "ContractAddress",
+ "key": true
+ },
+ {
+ "name": "amount",
+ "type": "u128",
+ "key": false
+ }
+ ],
+ "class_hash": "0x6a21c56878ba470ac7a51f336ca6a59781de38e1810d2d20866ab2b52138a6d",
+ "original_class_hash": "0x6a21c56878ba470ac7a51f336ca6a59781de38e1810d2d20866ab2b52138a6d",
+ "abi": [
+ {
+ "type": "impl",
+ "name": "DojoModelImpl",
+ "interface_name": "dojo::model::IModel"
+ },
+ {
+ "type": "struct",
+ "name": "core::byte_array::ByteArray",
+ "members": [
+ {
+ "name": "data",
+ "type": "core::array::Array::"
+ },
+ {
+ "name": "pending_word",
+ "type": "core::felt252"
+ },
+ {
+ "name": "pending_word_len",
+ "type": "core::integer::u32"
+ }
+ ]
+ },
+ {
+ "type": "enum",
+ "name": "core::option::Option::",
+ "variants": [
+ {
+ "name": "Some",
+ "type": "core::integer::u32"
+ },
+ {
+ "name": "None",
+ "type": "()"
+ }
+ ]
+ },
+ {
+ "type": "struct",
+ "name": "core::array::Span::",
+ "members": [
+ {
+ "name": "snapshot",
+ "type": "@core::array::Array::"
+ }
+ ]
+ },
+ {
+ "type": "struct",
+ "name": "dojo::database::introspect::FieldLayout",
+ "members": [
+ {
+ "name": "selector",
+ "type": "core::felt252"
+ },
+ {
+ "name": "layout",
+ "type": "dojo::database::introspect::Layout"
+ }
+ ]
+ },
+ {
+ "type": "struct",
+ "name": "core::array::Span::",
+ "members": [
+ {
+ "name": "snapshot",
+ "type": "@core::array::Array::"
+ }
+ ]
+ },
+ {
+ "type": "struct",
+ "name": "core::array::Span::",
+ "members": [
+ {
+ "name": "snapshot",
+ "type": "@core::array::Array::"
+ }
+ ]
+ },
+ {
+ "type": "enum",
+ "name": "dojo::database::introspect::Layout",
+ "variants": [
+ {
+ "name": "Fixed",
+ "type": "core::array::Span::"
+ },
+ {
+ "name": "Struct",
+ "type": "core::array::Span::"
+ },
+ {
+ "name": "Tuple",
+ "type": "core::array::Span::"
+ },
+ {
+ "name": "Array",
+ "type": "core::array::Span::"
+ },
+ {
+ "name": "ByteArray",
+ "type": "()"
+ },
+ {
+ "name": "Enum",
+ "type": "core::array::Span::"
+ }
+ ]
+ },
+ {
+ "type": "struct",
+ "name": "core::array::Span::",
+ "members": [
+ {
+ "name": "snapshot",
+ "type": "@core::array::Array::"
+ }
+ ]
+ },
+ {
+ "type": "struct",
+ "name": "dojo::database::introspect::Member",
+ "members": [
+ {
+ "name": "name",
+ "type": "core::felt252"
+ },
+ {
+ "name": "attrs",
+ "type": "core::array::Span::"
+ },
+ {
+ "name": "ty",
+ "type": "dojo::database::introspect::Ty"
+ }
+ ]
+ },
+ {
+ "type": "struct",
+ "name": "core::array::Span::",
+ "members": [
+ {
+ "name": "snapshot",
+ "type": "@core::array::Array::"
+ }
+ ]
+ },
+ {
+ "type": "struct",
+ "name": "dojo::database::introspect::Struct",
+ "members": [
+ {
+ "name": "name",
+ "type": "core::felt252"
+ },
+ {
+ "name": "attrs",
+ "type": "core::array::Span::"
+ },
+ {
+ "name": "children",
+ "type": "core::array::Span::"
+ }
+ ]
+ },
+ {
+ "type": "struct",
+ "name": "core::array::Span::<(core::felt252, dojo::database::introspect::Ty)>",
+ "members": [
+ {
+ "name": "snapshot",
+ "type": "@core::array::Array::<(core::felt252, dojo::database::introspect::Ty)>"
+ }
+ ]
+ },
+ {
+ "type": "struct",
+ "name": "dojo::database::introspect::Enum",
+ "members": [
+ {
+ "name": "name",
+ "type": "core::felt252"
+ },
+ {
+ "name": "attrs",
+ "type": "core::array::Span::"
+ },
+ {
+ "name": "children",
+ "type": "core::array::Span::<(core::felt252, dojo::database::introspect::Ty)>"
+ }
+ ]
+ },
+ {
+ "type": "struct",
+ "name": "core::array::Span::",
+ "members": [
+ {
+ "name": "snapshot",
+ "type": "@core::array::Array::"
+ }
+ ]
+ },
+ {
+ "type": "enum",
+ "name": "dojo::database::introspect::Ty",
+ "variants": [
+ {
+ "name": "Primitive",
+ "type": "core::felt252"
+ },
+ {
+ "name": "Struct",
+ "type": "dojo::database::introspect::Struct"
+ },
+ {
+ "name": "Enum",
+ "type": "dojo::database::introspect::Enum"
+ },
+ {
+ "name": "Tuple",
+ "type": "core::array::Span::"
+ },
+ {
+ "name": "Array",
+ "type": "core::array::Span::"
+ },
+ {
+ "name": "ByteArray",
+ "type": "()"
+ }
+ ]
+ },
+ {
+ "type": "interface",
+ "name": "dojo::model::IModel",
+ "items": [
+ {
+ "type": "function",
+ "name": "selector",
+ "inputs": [],
+ "outputs": [
+ {
+ "type": "core::felt252"
+ }
+ ],
+ "state_mutability": "view"
+ },
+ {
+ "type": "function",
+ "name": "name",
+ "inputs": [],
+ "outputs": [
+ {
+ "type": "core::byte_array::ByteArray"
+ }
+ ],
+ "state_mutability": "view"
+ },
+ {
+ "type": "function",
+ "name": "version",
+ "inputs": [],
+ "outputs": [
+ {
+ "type": "core::integer::u8"
+ }
+ ],
+ "state_mutability": "view"
+ },
+ {
+ "type": "function",
+ "name": "unpacked_size",
+ "inputs": [],
+ "outputs": [
+ {
+ "type": "core::option::Option::"
+ }
+ ],
+ "state_mutability": "view"
+ },
+ {
+ "type": "function",
+ "name": "packed_size",
+ "inputs": [],
+ "outputs": [
+ {
+ "type": "core::option::Option::"
+ }
+ ],
+ "state_mutability": "view"
+ },
+ {
+ "type": "function",
+ "name": "layout",
+ "inputs": [],
+ "outputs": [
+ {
+ "type": "dojo::database::introspect::Layout"
+ }
+ ],
+ "state_mutability": "view"
+ },
+ {
+ "type": "function",
+ "name": "schema",
+ "inputs": [],
+ "outputs": [
+ {
+ "type": "dojo::database::introspect::Ty"
+ }
+ ],
+ "state_mutability": "view"
+ }
+ ]
+ },
+ {
+ "type": "impl",
+ "name": "mock_tokenImpl",
+ "interface_name": "dojo_examples::models::Imock_token"
+ },
+ {
+ "type": "struct",
+ "name": "dojo_examples::models::MockToken",
+ "members": [
+ {
+ "name": "account",
+ "type": "core::starknet::contract_address::ContractAddress"
+ },
+ {
+ "name": "amount",
+ "type": "core::integer::u128"
+ }
+ ]
+ },
+ {
+ "type": "interface",
+ "name": "dojo_examples::models::Imock_token",
+ "items": [
+ {
+ "type": "function",
+ "name": "ensure_abi",
+ "inputs": [
+ {
+ "name": "model",
+ "type": "dojo_examples::models::MockToken"
+ }
+ ],
+ "outputs": [],
+ "state_mutability": "view"
+ }
+ ]
+ },
+ {
+ "type": "event",
+ "name": "dojo_examples::models::mock_token::Event",
+ "kind": "enum",
+ "variants": []
+ }
+ ],
+ "name": "dojo_examples::models::mock_token"
+ },
{
"kind": "DojoModel",
"members": [
diff --git a/examples/spawn-and-move/manifests/dev/manifest.toml b/examples/spawn-and-move/manifests/dev/manifest.toml
index 601c02ab1b..ec501b9733 100644
--- a/examples/spawn-and-move/manifests/dev/manifest.toml
+++ b/examples/spawn-and-move/manifests/dev/manifest.toml
@@ -35,6 +35,19 @@ computed = []
init_calldata = []
name = "dojo_examples::actions::actions"
+[[contracts]]
+kind = "DojoContract"
+address = "0x75961b2027c52948ecebfd347aa427436ea308d41997fa9b3c98380f7011d53"
+class_hash = "0x5c32bc974f96f82ded691bb95bf26b2783f874fffb50fe84a331acb75ecf5b2"
+original_class_hash = "0x5c32bc974f96f82ded691bb95bf26b2783f874fffb50fe84a331acb75ecf5b2"
+base_class_hash = "0x22f3e55b61d86c2ac5239fa3b3b8761f26b9a5c0b5f61ddbd5d756ced498b46"
+abi = "manifests/dev/abis/deployments/contracts/dojo_examples_mock_token_mock_token.json"
+reads = []
+writes = []
+computed = []
+init_calldata = []
+name = "dojo_examples::mock_token::mock_token"
+
[[contracts]]
kind = "DojoContract"
address = "0x3f51cd82daaf5907d2fd082ae3f45ae2ef96ab61677f46abc16e0a54d3392d1"
@@ -96,6 +109,23 @@ name = "salt"
type = "felt252"
key = true
+[[models]]
+kind = "DojoModel"
+class_hash = "0x6a21c56878ba470ac7a51f336ca6a59781de38e1810d2d20866ab2b52138a6d"
+original_class_hash = "0x6a21c56878ba470ac7a51f336ca6a59781de38e1810d2d20866ab2b52138a6d"
+abi = "manifests/dev/abis/deployments/models/dojo_examples_models_mock_token.json"
+name = "dojo_examples::models::mock_token"
+
+[[models.members]]
+name = "account"
+type = "ContractAddress"
+key = true
+
+[[models.members]]
+name = "amount"
+type = "u128"
+key = false
+
[[models]]
kind = "DojoModel"
class_hash = "0x456d85286b34249fffa0a13d1ac490cc1f5b02eb1a1c92d820c59d6b0f2eaa8"
diff --git a/examples/spawn-and-move/manifests/release/abis/base/contracts/dojo_examples_actions_actions.json b/examples/spawn-and-move/manifests/release/abis/base/contracts/dojo_examples_actions_actions.json
new file mode 100644
index 0000000000..21aed968a7
--- /dev/null
+++ b/examples/spawn-and-move/manifests/release/abis/base/contracts/dojo_examples_actions_actions.json
@@ -0,0 +1,290 @@
+[
+ {
+ "type": "impl",
+ "name": "DojoResourceProviderImpl",
+ "interface_name": "dojo::world::IDojoResourceProvider"
+ },
+ {
+ "type": "interface",
+ "name": "dojo::world::IDojoResourceProvider",
+ "items": [
+ {
+ "type": "function",
+ "name": "dojo_resource",
+ "inputs": [],
+ "outputs": [
+ {
+ "type": "core::felt252"
+ }
+ ],
+ "state_mutability": "view"
+ }
+ ]
+ },
+ {
+ "type": "impl",
+ "name": "WorldProviderImpl",
+ "interface_name": "dojo::world::IWorldProvider"
+ },
+ {
+ "type": "struct",
+ "name": "dojo::world::IWorldDispatcher",
+ "members": [
+ {
+ "name": "contract_address",
+ "type": "core::starknet::contract_address::ContractAddress"
+ }
+ ]
+ },
+ {
+ "type": "interface",
+ "name": "dojo::world::IWorldProvider",
+ "items": [
+ {
+ "type": "function",
+ "name": "world",
+ "inputs": [],
+ "outputs": [
+ {
+ "type": "dojo::world::IWorldDispatcher"
+ }
+ ],
+ "state_mutability": "view"
+ }
+ ]
+ },
+ {
+ "type": "impl",
+ "name": "ActionsComputedImpl",
+ "interface_name": "dojo_examples::actions::IActionsComputed"
+ },
+ {
+ "type": "struct",
+ "name": "dojo_examples::models::Vec2",
+ "members": [
+ {
+ "name": "x",
+ "type": "core::integer::u32"
+ },
+ {
+ "name": "y",
+ "type": "core::integer::u32"
+ }
+ ]
+ },
+ {
+ "type": "struct",
+ "name": "dojo_examples::models::Position",
+ "members": [
+ {
+ "name": "player",
+ "type": "core::starknet::contract_address::ContractAddress"
+ },
+ {
+ "name": "vec",
+ "type": "dojo_examples::models::Vec2"
+ }
+ ]
+ },
+ {
+ "type": "interface",
+ "name": "dojo_examples::actions::IActionsComputed",
+ "items": [
+ {
+ "type": "function",
+ "name": "tile_terrain",
+ "inputs": [
+ {
+ "name": "vec",
+ "type": "dojo_examples::models::Vec2"
+ }
+ ],
+ "outputs": [
+ {
+ "type": "core::felt252"
+ }
+ ],
+ "state_mutability": "view"
+ },
+ {
+ "type": "function",
+ "name": "quadrant",
+ "inputs": [
+ {
+ "name": "pos",
+ "type": "dojo_examples::models::Position"
+ }
+ ],
+ "outputs": [
+ {
+ "type": "core::integer::u8"
+ }
+ ],
+ "state_mutability": "view"
+ }
+ ]
+ },
+ {
+ "type": "impl",
+ "name": "ActionsImpl",
+ "interface_name": "dojo_examples::actions::IActions"
+ },
+ {
+ "type": "enum",
+ "name": "dojo_examples::models::Direction",
+ "variants": [
+ {
+ "name": "None",
+ "type": "()"
+ },
+ {
+ "name": "Left",
+ "type": "()"
+ },
+ {
+ "name": "Right",
+ "type": "()"
+ },
+ {
+ "name": "Up",
+ "type": "()"
+ },
+ {
+ "name": "Down",
+ "type": "()"
+ }
+ ]
+ },
+ {
+ "type": "struct",
+ "name": "core::byte_array::ByteArray",
+ "members": [
+ {
+ "name": "data",
+ "type": "core::array::Array::"
+ },
+ {
+ "name": "pending_word",
+ "type": "core::felt252"
+ },
+ {
+ "name": "pending_word_len",
+ "type": "core::integer::u32"
+ }
+ ]
+ },
+ {
+ "type": "interface",
+ "name": "dojo_examples::actions::IActions",
+ "items": [
+ {
+ "type": "function",
+ "name": "spawn",
+ "inputs": [],
+ "outputs": [],
+ "state_mutability": "view"
+ },
+ {
+ "type": "function",
+ "name": "move",
+ "inputs": [
+ {
+ "name": "direction",
+ "type": "dojo_examples::models::Direction"
+ }
+ ],
+ "outputs": [],
+ "state_mutability": "view"
+ },
+ {
+ "type": "function",
+ "name": "set_player_config",
+ "inputs": [
+ {
+ "name": "name",
+ "type": "core::byte_array::ByteArray"
+ }
+ ],
+ "outputs": [],
+ "state_mutability": "view"
+ }
+ ]
+ },
+ {
+ "type": "impl",
+ "name": "IDojoInitImpl",
+ "interface_name": "dojo_examples::actions::actions::IDojoInit"
+ },
+ {
+ "type": "interface",
+ "name": "dojo_examples::actions::actions::IDojoInit",
+ "items": [
+ {
+ "type": "function",
+ "name": "dojo_init",
+ "inputs": [],
+ "outputs": [],
+ "state_mutability": "view"
+ }
+ ]
+ },
+ {
+ "type": "impl",
+ "name": "UpgradableImpl",
+ "interface_name": "dojo::components::upgradeable::IUpgradeable"
+ },
+ {
+ "type": "interface",
+ "name": "dojo::components::upgradeable::IUpgradeable",
+ "items": [
+ {
+ "type": "function",
+ "name": "upgrade",
+ "inputs": [
+ {
+ "name": "new_class_hash",
+ "type": "core::starknet::class_hash::ClassHash"
+ }
+ ],
+ "outputs": [],
+ "state_mutability": "external"
+ }
+ ]
+ },
+ {
+ "type": "event",
+ "name": "dojo::components::upgradeable::upgradeable::Upgraded",
+ "kind": "struct",
+ "members": [
+ {
+ "name": "class_hash",
+ "type": "core::starknet::class_hash::ClassHash",
+ "kind": "data"
+ }
+ ]
+ },
+ {
+ "type": "event",
+ "name": "dojo::components::upgradeable::upgradeable::Event",
+ "kind": "enum",
+ "variants": [
+ {
+ "name": "Upgraded",
+ "type": "dojo::components::upgradeable::upgradeable::Upgraded",
+ "kind": "nested"
+ }
+ ]
+ },
+ {
+ "type": "event",
+ "name": "dojo_examples::actions::actions::Event",
+ "kind": "enum",
+ "variants": [
+ {
+ "name": "UpgradeableEvent",
+ "type": "dojo::components::upgradeable::upgradeable::Event",
+ "kind": "nested"
+ }
+ ]
+ }
+]
\ No newline at end of file
diff --git a/examples/spawn-and-move/manifests/release/abis/base/contracts/dojo_examples_mock_token_mock_token.json b/examples/spawn-and-move/manifests/release/abis/base/contracts/dojo_examples_mock_token_mock_token.json
new file mode 100644
index 0000000000..f4bde33e6d
--- /dev/null
+++ b/examples/spawn-and-move/manifests/release/abis/base/contracts/dojo_examples_mock_token_mock_token.json
@@ -0,0 +1,133 @@
+[
+ {
+ "type": "impl",
+ "name": "DojoResourceProviderImpl",
+ "interface_name": "dojo::world::IDojoResourceProvider"
+ },
+ {
+ "type": "interface",
+ "name": "dojo::world::IDojoResourceProvider",
+ "items": [
+ {
+ "type": "function",
+ "name": "dojo_resource",
+ "inputs": [],
+ "outputs": [
+ {
+ "type": "core::felt252"
+ }
+ ],
+ "state_mutability": "view"
+ }
+ ]
+ },
+ {
+ "type": "impl",
+ "name": "WorldProviderImpl",
+ "interface_name": "dojo::world::IWorldProvider"
+ },
+ {
+ "type": "struct",
+ "name": "dojo::world::IWorldDispatcher",
+ "members": [
+ {
+ "name": "contract_address",
+ "type": "core::starknet::contract_address::ContractAddress"
+ }
+ ]
+ },
+ {
+ "type": "interface",
+ "name": "dojo::world::IWorldProvider",
+ "items": [
+ {
+ "type": "function",
+ "name": "world",
+ "inputs": [],
+ "outputs": [
+ {
+ "type": "dojo::world::IWorldDispatcher"
+ }
+ ],
+ "state_mutability": "view"
+ }
+ ]
+ },
+ {
+ "type": "impl",
+ "name": "IDojoInitImpl",
+ "interface_name": "dojo_examples::mock_token::mock_token::IDojoInit"
+ },
+ {
+ "type": "interface",
+ "name": "dojo_examples::mock_token::mock_token::IDojoInit",
+ "items": [
+ {
+ "type": "function",
+ "name": "dojo_init",
+ "inputs": [],
+ "outputs": [],
+ "state_mutability": "view"
+ }
+ ]
+ },
+ {
+ "type": "impl",
+ "name": "UpgradableImpl",
+ "interface_name": "dojo::components::upgradeable::IUpgradeable"
+ },
+ {
+ "type": "interface",
+ "name": "dojo::components::upgradeable::IUpgradeable",
+ "items": [
+ {
+ "type": "function",
+ "name": "upgrade",
+ "inputs": [
+ {
+ "name": "new_class_hash",
+ "type": "core::starknet::class_hash::ClassHash"
+ }
+ ],
+ "outputs": [],
+ "state_mutability": "external"
+ }
+ ]
+ },
+ {
+ "type": "event",
+ "name": "dojo::components::upgradeable::upgradeable::Upgraded",
+ "kind": "struct",
+ "members": [
+ {
+ "name": "class_hash",
+ "type": "core::starknet::class_hash::ClassHash",
+ "kind": "data"
+ }
+ ]
+ },
+ {
+ "type": "event",
+ "name": "dojo::components::upgradeable::upgradeable::Event",
+ "kind": "enum",
+ "variants": [
+ {
+ "name": "Upgraded",
+ "type": "dojo::components::upgradeable::upgradeable::Upgraded",
+ "kind": "nested"
+ }
+ ]
+ },
+ {
+ "type": "event",
+ "name": "dojo_examples::mock_token::mock_token::Event",
+ "kind": "enum",
+ "variants": [
+ {
+ "name": "UpgradeableEvent",
+ "type": "dojo::components::upgradeable::upgradeable::Event",
+ "kind": "nested"
+ }
+ ]
+ }
+]
\ No newline at end of file
diff --git a/examples/spawn-and-move/manifests/release/abis/base/contracts/dojo_examples_others_others.json b/examples/spawn-and-move/manifests/release/abis/base/contracts/dojo_examples_others_others.json
new file mode 100644
index 0000000000..36d8c3ef78
--- /dev/null
+++ b/examples/spawn-and-move/manifests/release/abis/base/contracts/dojo_examples_others_others.json
@@ -0,0 +1,146 @@
+[
+ {
+ "type": "impl",
+ "name": "DojoResourceProviderImpl",
+ "interface_name": "dojo::world::IDojoResourceProvider"
+ },
+ {
+ "type": "interface",
+ "name": "dojo::world::IDojoResourceProvider",
+ "items": [
+ {
+ "type": "function",
+ "name": "dojo_resource",
+ "inputs": [],
+ "outputs": [
+ {
+ "type": "core::felt252"
+ }
+ ],
+ "state_mutability": "view"
+ }
+ ]
+ },
+ {
+ "type": "impl",
+ "name": "WorldProviderImpl",
+ "interface_name": "dojo::world::IWorldProvider"
+ },
+ {
+ "type": "struct",
+ "name": "dojo::world::IWorldDispatcher",
+ "members": [
+ {
+ "name": "contract_address",
+ "type": "core::starknet::contract_address::ContractAddress"
+ }
+ ]
+ },
+ {
+ "type": "interface",
+ "name": "dojo::world::IWorldProvider",
+ "items": [
+ {
+ "type": "function",
+ "name": "world",
+ "inputs": [],
+ "outputs": [
+ {
+ "type": "dojo::world::IWorldDispatcher"
+ }
+ ],
+ "state_mutability": "view"
+ }
+ ]
+ },
+ {
+ "type": "impl",
+ "name": "IDojoInitImpl",
+ "interface_name": "dojo_examples::others::others::IDojoInit"
+ },
+ {
+ "type": "interface",
+ "name": "dojo_examples::others::others::IDojoInit",
+ "items": [
+ {
+ "type": "function",
+ "name": "dojo_init",
+ "inputs": [
+ {
+ "name": "actions_address",
+ "type": "core::starknet::contract_address::ContractAddress"
+ },
+ {
+ "name": "actions_class",
+ "type": "core::starknet::class_hash::ClassHash"
+ },
+ {
+ "name": "value",
+ "type": "core::integer::u8"
+ }
+ ],
+ "outputs": [],
+ "state_mutability": "view"
+ }
+ ]
+ },
+ {
+ "type": "impl",
+ "name": "UpgradableImpl",
+ "interface_name": "dojo::components::upgradeable::IUpgradeable"
+ },
+ {
+ "type": "interface",
+ "name": "dojo::components::upgradeable::IUpgradeable",
+ "items": [
+ {
+ "type": "function",
+ "name": "upgrade",
+ "inputs": [
+ {
+ "name": "new_class_hash",
+ "type": "core::starknet::class_hash::ClassHash"
+ }
+ ],
+ "outputs": [],
+ "state_mutability": "external"
+ }
+ ]
+ },
+ {
+ "type": "event",
+ "name": "dojo::components::upgradeable::upgradeable::Upgraded",
+ "kind": "struct",
+ "members": [
+ {
+ "name": "class_hash",
+ "type": "core::starknet::class_hash::ClassHash",
+ "kind": "data"
+ }
+ ]
+ },
+ {
+ "type": "event",
+ "name": "dojo::components::upgradeable::upgradeable::Event",
+ "kind": "enum",
+ "variants": [
+ {
+ "name": "Upgraded",
+ "type": "dojo::components::upgradeable::upgradeable::Upgraded",
+ "kind": "nested"
+ }
+ ]
+ },
+ {
+ "type": "event",
+ "name": "dojo_examples::others::others::Event",
+ "kind": "enum",
+ "variants": [
+ {
+ "name": "UpgradeableEvent",
+ "type": "dojo::components::upgradeable::upgradeable::Event",
+ "kind": "nested"
+ }
+ ]
+ }
+]
\ No newline at end of file
diff --git a/examples/spawn-and-move/manifests/release/abis/base/dojo_world_world.json b/examples/spawn-and-move/manifests/release/abis/base/dojo_world_world.json
new file mode 100644
index 0000000000..c1a2447839
--- /dev/null
+++ b/examples/spawn-and-move/manifests/release/abis/base/dojo_world_world.json
@@ -0,0 +1,996 @@
+[
+ {
+ "type": "impl",
+ "name": "World",
+ "interface_name": "dojo::world::IWorld"
+ },
+ {
+ "type": "struct",
+ "name": "core::byte_array::ByteArray",
+ "members": [
+ {
+ "name": "data",
+ "type": "core::array::Array::"
+ },
+ {
+ "name": "pending_word",
+ "type": "core::felt252"
+ },
+ {
+ "name": "pending_word_len",
+ "type": "core::integer::u32"
+ }
+ ]
+ },
+ {
+ "type": "struct",
+ "name": "dojo::resource_metadata::ResourceMetadata",
+ "members": [
+ {
+ "name": "resource_id",
+ "type": "core::felt252"
+ },
+ {
+ "name": "metadata_uri",
+ "type": "core::byte_array::ByteArray"
+ }
+ ]
+ },
+ {
+ "type": "struct",
+ "name": "core::array::Span::",
+ "members": [
+ {
+ "name": "snapshot",
+ "type": "@core::array::Array::"
+ }
+ ]
+ },
+ {
+ "type": "struct",
+ "name": "core::array::Span::",
+ "members": [
+ {
+ "name": "snapshot",
+ "type": "@core::array::Array::"
+ }
+ ]
+ },
+ {
+ "type": "struct",
+ "name": "dojo::database::introspect::FieldLayout",
+ "members": [
+ {
+ "name": "selector",
+ "type": "core::felt252"
+ },
+ {
+ "name": "layout",
+ "type": "dojo::database::introspect::Layout"
+ }
+ ]
+ },
+ {
+ "type": "struct",
+ "name": "core::array::Span::",
+ "members": [
+ {
+ "name": "snapshot",
+ "type": "@core::array::Array::"
+ }
+ ]
+ },
+ {
+ "type": "struct",
+ "name": "core::array::Span::",
+ "members": [
+ {
+ "name": "snapshot",
+ "type": "@core::array::Array::"
+ }
+ ]
+ },
+ {
+ "type": "enum",
+ "name": "dojo::database::introspect::Layout",
+ "variants": [
+ {
+ "name": "Fixed",
+ "type": "core::array::Span::"
+ },
+ {
+ "name": "Struct",
+ "type": "core::array::Span::"
+ },
+ {
+ "name": "Tuple",
+ "type": "core::array::Span::"
+ },
+ {
+ "name": "Array",
+ "type": "core::array::Span::"
+ },
+ {
+ "name": "ByteArray",
+ "type": "()"
+ },
+ {
+ "name": "Enum",
+ "type": "core::array::Span::"
+ }
+ ]
+ },
+ {
+ "type": "enum",
+ "name": "core::bool",
+ "variants": [
+ {
+ "name": "False",
+ "type": "()"
+ },
+ {
+ "name": "True",
+ "type": "()"
+ }
+ ]
+ },
+ {
+ "type": "interface",
+ "name": "dojo::world::IWorld",
+ "items": [
+ {
+ "type": "function",
+ "name": "metadata",
+ "inputs": [
+ {
+ "name": "resource_id",
+ "type": "core::felt252"
+ }
+ ],
+ "outputs": [
+ {
+ "type": "dojo::resource_metadata::ResourceMetadata"
+ }
+ ],
+ "state_mutability": "view"
+ },
+ {
+ "type": "function",
+ "name": "set_metadata",
+ "inputs": [
+ {
+ "name": "metadata",
+ "type": "dojo::resource_metadata::ResourceMetadata"
+ }
+ ],
+ "outputs": [],
+ "state_mutability": "external"
+ },
+ {
+ "type": "function",
+ "name": "model",
+ "inputs": [
+ {
+ "name": "selector",
+ "type": "core::felt252"
+ }
+ ],
+ "outputs": [
+ {
+ "type": "(core::starknet::class_hash::ClassHash, core::starknet::contract_address::ContractAddress)"
+ }
+ ],
+ "state_mutability": "view"
+ },
+ {
+ "type": "function",
+ "name": "register_model",
+ "inputs": [
+ {
+ "name": "class_hash",
+ "type": "core::starknet::class_hash::ClassHash"
+ }
+ ],
+ "outputs": [],
+ "state_mutability": "external"
+ },
+ {
+ "type": "function",
+ "name": "deploy_contract",
+ "inputs": [
+ {
+ "name": "salt",
+ "type": "core::felt252"
+ },
+ {
+ "name": "class_hash",
+ "type": "core::starknet::class_hash::ClassHash"
+ },
+ {
+ "name": "init_calldata",
+ "type": "core::array::Span::"
+ }
+ ],
+ "outputs": [
+ {
+ "type": "core::starknet::contract_address::ContractAddress"
+ }
+ ],
+ "state_mutability": "external"
+ },
+ {
+ "type": "function",
+ "name": "upgrade_contract",
+ "inputs": [
+ {
+ "name": "address",
+ "type": "core::starknet::contract_address::ContractAddress"
+ },
+ {
+ "name": "class_hash",
+ "type": "core::starknet::class_hash::ClassHash"
+ }
+ ],
+ "outputs": [
+ {
+ "type": "core::starknet::class_hash::ClassHash"
+ }
+ ],
+ "state_mutability": "external"
+ },
+ {
+ "type": "function",
+ "name": "uuid",
+ "inputs": [],
+ "outputs": [
+ {
+ "type": "core::integer::u32"
+ }
+ ],
+ "state_mutability": "external"
+ },
+ {
+ "type": "function",
+ "name": "emit",
+ "inputs": [
+ {
+ "name": "keys",
+ "type": "core::array::Array::"
+ },
+ {
+ "name": "values",
+ "type": "core::array::Span::"
+ }
+ ],
+ "outputs": [],
+ "state_mutability": "view"
+ },
+ {
+ "type": "function",
+ "name": "entity",
+ "inputs": [
+ {
+ "name": "model",
+ "type": "core::felt252"
+ },
+ {
+ "name": "keys",
+ "type": "core::array::Span::"
+ },
+ {
+ "name": "layout",
+ "type": "dojo::database::introspect::Layout"
+ }
+ ],
+ "outputs": [
+ {
+ "type": "core::array::Span::"
+ }
+ ],
+ "state_mutability": "view"
+ },
+ {
+ "type": "function",
+ "name": "set_entity",
+ "inputs": [
+ {
+ "name": "model",
+ "type": "core::felt252"
+ },
+ {
+ "name": "keys",
+ "type": "core::array::Span::"
+ },
+ {
+ "name": "values",
+ "type": "core::array::Span::"
+ },
+ {
+ "name": "layout",
+ "type": "dojo::database::introspect::Layout"
+ }
+ ],
+ "outputs": [],
+ "state_mutability": "external"
+ },
+ {
+ "type": "function",
+ "name": "delete_entity",
+ "inputs": [
+ {
+ "name": "model",
+ "type": "core::felt252"
+ },
+ {
+ "name": "keys",
+ "type": "core::array::Span::"
+ },
+ {
+ "name": "layout",
+ "type": "dojo::database::introspect::Layout"
+ }
+ ],
+ "outputs": [],
+ "state_mutability": "external"
+ },
+ {
+ "type": "function",
+ "name": "base",
+ "inputs": [],
+ "outputs": [
+ {
+ "type": "core::starknet::class_hash::ClassHash"
+ }
+ ],
+ "state_mutability": "view"
+ },
+ {
+ "type": "function",
+ "name": "is_owner",
+ "inputs": [
+ {
+ "name": "address",
+ "type": "core::starknet::contract_address::ContractAddress"
+ },
+ {
+ "name": "resource",
+ "type": "core::felt252"
+ }
+ ],
+ "outputs": [
+ {
+ "type": "core::bool"
+ }
+ ],
+ "state_mutability": "view"
+ },
+ {
+ "type": "function",
+ "name": "grant_owner",
+ "inputs": [
+ {
+ "name": "address",
+ "type": "core::starknet::contract_address::ContractAddress"
+ },
+ {
+ "name": "resource",
+ "type": "core::felt252"
+ }
+ ],
+ "outputs": [],
+ "state_mutability": "external"
+ },
+ {
+ "type": "function",
+ "name": "revoke_owner",
+ "inputs": [
+ {
+ "name": "address",
+ "type": "core::starknet::contract_address::ContractAddress"
+ },
+ {
+ "name": "resource",
+ "type": "core::felt252"
+ }
+ ],
+ "outputs": [],
+ "state_mutability": "external"
+ },
+ {
+ "type": "function",
+ "name": "is_writer",
+ "inputs": [
+ {
+ "name": "model",
+ "type": "core::felt252"
+ },
+ {
+ "name": "contract",
+ "type": "core::starknet::contract_address::ContractAddress"
+ }
+ ],
+ "outputs": [
+ {
+ "type": "core::bool"
+ }
+ ],
+ "state_mutability": "view"
+ },
+ {
+ "type": "function",
+ "name": "grant_writer",
+ "inputs": [
+ {
+ "name": "model",
+ "type": "core::felt252"
+ },
+ {
+ "name": "contract",
+ "type": "core::starknet::contract_address::ContractAddress"
+ }
+ ],
+ "outputs": [],
+ "state_mutability": "external"
+ },
+ {
+ "type": "function",
+ "name": "revoke_writer",
+ "inputs": [
+ {
+ "name": "model",
+ "type": "core::felt252"
+ },
+ {
+ "name": "contract",
+ "type": "core::starknet::contract_address::ContractAddress"
+ }
+ ],
+ "outputs": [],
+ "state_mutability": "external"
+ }
+ ]
+ },
+ {
+ "type": "impl",
+ "name": "UpgradeableWorld",
+ "interface_name": "dojo::world::IUpgradeableWorld"
+ },
+ {
+ "type": "interface",
+ "name": "dojo::world::IUpgradeableWorld",
+ "items": [
+ {
+ "type": "function",
+ "name": "upgrade",
+ "inputs": [
+ {
+ "name": "new_class_hash",
+ "type": "core::starknet::class_hash::ClassHash"
+ }
+ ],
+ "outputs": [],
+ "state_mutability": "external"
+ }
+ ]
+ },
+ {
+ "type": "impl",
+ "name": "UpgradeableState",
+ "interface_name": "dojo::interfaces::IUpgradeableState"
+ },
+ {
+ "type": "struct",
+ "name": "dojo::interfaces::StorageUpdate",
+ "members": [
+ {
+ "name": "key",
+ "type": "core::felt252"
+ },
+ {
+ "name": "value",
+ "type": "core::felt252"
+ }
+ ]
+ },
+ {
+ "type": "struct",
+ "name": "core::array::Span::",
+ "members": [
+ {
+ "name": "snapshot",
+ "type": "@core::array::Array::"
+ }
+ ]
+ },
+ {
+ "type": "struct",
+ "name": "dojo::interfaces::ProgramOutput",
+ "members": [
+ {
+ "name": "prev_state_root",
+ "type": "core::felt252"
+ },
+ {
+ "name": "new_state_root",
+ "type": "core::felt252"
+ },
+ {
+ "name": "block_number",
+ "type": "core::felt252"
+ },
+ {
+ "name": "block_hash",
+ "type": "core::felt252"
+ },
+ {
+ "name": "config_hash",
+ "type": "core::felt252"
+ },
+ {
+ "name": "world_da_hash",
+ "type": "core::felt252"
+ },
+ {
+ "name": "message_to_starknet_segment",
+ "type": "core::array::Span::"
+ },
+ {
+ "name": "message_to_appchain_segment",
+ "type": "core::array::Span::"
+ }
+ ]
+ },
+ {
+ "type": "interface",
+ "name": "dojo::interfaces::IUpgradeableState",
+ "items": [
+ {
+ "type": "function",
+ "name": "upgrade_state",
+ "inputs": [
+ {
+ "name": "new_state",
+ "type": "core::array::Span::"
+ },
+ {
+ "name": "program_output",
+ "type": "dojo::interfaces::ProgramOutput"
+ },
+ {
+ "name": "program_hash",
+ "type": "core::felt252"
+ }
+ ],
+ "outputs": [],
+ "state_mutability": "external"
+ }
+ ]
+ },
+ {
+ "type": "impl",
+ "name": "ConfigImpl",
+ "interface_name": "dojo::config::interface::IConfig"
+ },
+ {
+ "type": "interface",
+ "name": "dojo::config::interface::IConfig",
+ "items": [
+ {
+ "type": "function",
+ "name": "set_differ_program_hash",
+ "inputs": [
+ {
+ "name": "program_hash",
+ "type": "core::felt252"
+ }
+ ],
+ "outputs": [],
+ "state_mutability": "external"
+ },
+ {
+ "type": "function",
+ "name": "set_merger_program_hash",
+ "inputs": [
+ {
+ "name": "program_hash",
+ "type": "core::felt252"
+ }
+ ],
+ "outputs": [],
+ "state_mutability": "external"
+ },
+ {
+ "type": "function",
+ "name": "get_differ_program_hash",
+ "inputs": [],
+ "outputs": [
+ {
+ "type": "core::felt252"
+ }
+ ],
+ "state_mutability": "view"
+ },
+ {
+ "type": "function",
+ "name": "get_merger_program_hash",
+ "inputs": [],
+ "outputs": [
+ {
+ "type": "core::felt252"
+ }
+ ],
+ "state_mutability": "view"
+ },
+ {
+ "type": "function",
+ "name": "set_facts_registry",
+ "inputs": [
+ {
+ "name": "address",
+ "type": "core::starknet::contract_address::ContractAddress"
+ }
+ ],
+ "outputs": [],
+ "state_mutability": "external"
+ },
+ {
+ "type": "function",
+ "name": "get_facts_registry",
+ "inputs": [],
+ "outputs": [
+ {
+ "type": "core::starknet::contract_address::ContractAddress"
+ }
+ ],
+ "state_mutability": "view"
+ }
+ ]
+ },
+ {
+ "type": "constructor",
+ "name": "constructor",
+ "inputs": [
+ {
+ "name": "contract_base",
+ "type": "core::starknet::class_hash::ClassHash"
+ }
+ ]
+ },
+ {
+ "type": "event",
+ "name": "dojo::world::world::WorldSpawned",
+ "kind": "struct",
+ "members": [
+ {
+ "name": "address",
+ "type": "core::starknet::contract_address::ContractAddress",
+ "kind": "data"
+ },
+ {
+ "name": "creator",
+ "type": "core::starknet::contract_address::ContractAddress",
+ "kind": "data"
+ }
+ ]
+ },
+ {
+ "type": "event",
+ "name": "dojo::world::world::ContractDeployed",
+ "kind": "struct",
+ "members": [
+ {
+ "name": "salt",
+ "type": "core::felt252",
+ "kind": "data"
+ },
+ {
+ "name": "class_hash",
+ "type": "core::starknet::class_hash::ClassHash",
+ "kind": "data"
+ },
+ {
+ "name": "address",
+ "type": "core::starknet::contract_address::ContractAddress",
+ "kind": "data"
+ }
+ ]
+ },
+ {
+ "type": "event",
+ "name": "dojo::world::world::ContractUpgraded",
+ "kind": "struct",
+ "members": [
+ {
+ "name": "class_hash",
+ "type": "core::starknet::class_hash::ClassHash",
+ "kind": "data"
+ },
+ {
+ "name": "address",
+ "type": "core::starknet::contract_address::ContractAddress",
+ "kind": "data"
+ }
+ ]
+ },
+ {
+ "type": "event",
+ "name": "dojo::world::world::WorldUpgraded",
+ "kind": "struct",
+ "members": [
+ {
+ "name": "class_hash",
+ "type": "core::starknet::class_hash::ClassHash",
+ "kind": "data"
+ }
+ ]
+ },
+ {
+ "type": "event",
+ "name": "dojo::world::world::MetadataUpdate",
+ "kind": "struct",
+ "members": [
+ {
+ "name": "resource",
+ "type": "core::felt252",
+ "kind": "data"
+ },
+ {
+ "name": "uri",
+ "type": "core::byte_array::ByteArray",
+ "kind": "data"
+ }
+ ]
+ },
+ {
+ "type": "event",
+ "name": "dojo::world::world::ModelRegistered",
+ "kind": "struct",
+ "members": [
+ {
+ "name": "name",
+ "type": "core::byte_array::ByteArray",
+ "kind": "data"
+ },
+ {
+ "name": "class_hash",
+ "type": "core::starknet::class_hash::ClassHash",
+ "kind": "data"
+ },
+ {
+ "name": "prev_class_hash",
+ "type": "core::starknet::class_hash::ClassHash",
+ "kind": "data"
+ },
+ {
+ "name": "address",
+ "type": "core::starknet::contract_address::ContractAddress",
+ "kind": "data"
+ },
+ {
+ "name": "prev_address",
+ "type": "core::starknet::contract_address::ContractAddress",
+ "kind": "data"
+ }
+ ]
+ },
+ {
+ "type": "event",
+ "name": "dojo::world::world::StoreSetRecord",
+ "kind": "struct",
+ "members": [
+ {
+ "name": "table",
+ "type": "core::felt252",
+ "kind": "data"
+ },
+ {
+ "name": "keys",
+ "type": "core::array::Span::",
+ "kind": "data"
+ },
+ {
+ "name": "values",
+ "type": "core::array::Span::",
+ "kind": "data"
+ }
+ ]
+ },
+ {
+ "type": "event",
+ "name": "dojo::world::world::StoreDelRecord",
+ "kind": "struct",
+ "members": [
+ {
+ "name": "table",
+ "type": "core::felt252",
+ "kind": "data"
+ },
+ {
+ "name": "keys",
+ "type": "core::array::Span::",
+ "kind": "data"
+ }
+ ]
+ },
+ {
+ "type": "event",
+ "name": "dojo::world::world::WriterUpdated",
+ "kind": "struct",
+ "members": [
+ {
+ "name": "model",
+ "type": "core::felt252",
+ "kind": "data"
+ },
+ {
+ "name": "contract",
+ "type": "core::starknet::contract_address::ContractAddress",
+ "kind": "data"
+ },
+ {
+ "name": "value",
+ "type": "core::bool",
+ "kind": "data"
+ }
+ ]
+ },
+ {
+ "type": "event",
+ "name": "dojo::world::world::OwnerUpdated",
+ "kind": "struct",
+ "members": [
+ {
+ "name": "address",
+ "type": "core::starknet::contract_address::ContractAddress",
+ "kind": "data"
+ },
+ {
+ "name": "resource",
+ "type": "core::felt252",
+ "kind": "data"
+ },
+ {
+ "name": "value",
+ "type": "core::bool",
+ "kind": "data"
+ }
+ ]
+ },
+ {
+ "type": "event",
+ "name": "dojo::config::component::Config::DifferProgramHashUpdate",
+ "kind": "struct",
+ "members": [
+ {
+ "name": "program_hash",
+ "type": "core::felt252",
+ "kind": "data"
+ }
+ ]
+ },
+ {
+ "type": "event",
+ "name": "dojo::config::component::Config::MergerProgramHashUpdate",
+ "kind": "struct",
+ "members": [
+ {
+ "name": "program_hash",
+ "type": "core::felt252",
+ "kind": "data"
+ }
+ ]
+ },
+ {
+ "type": "event",
+ "name": "dojo::config::component::Config::FactsRegistryUpdate",
+ "kind": "struct",
+ "members": [
+ {
+ "name": "address",
+ "type": "core::starknet::contract_address::ContractAddress",
+ "kind": "data"
+ }
+ ]
+ },
+ {
+ "type": "event",
+ "name": "dojo::config::component::Config::Event",
+ "kind": "enum",
+ "variants": [
+ {
+ "name": "DifferProgramHashUpdate",
+ "type": "dojo::config::component::Config::DifferProgramHashUpdate",
+ "kind": "nested"
+ },
+ {
+ "name": "MergerProgramHashUpdate",
+ "type": "dojo::config::component::Config::MergerProgramHashUpdate",
+ "kind": "nested"
+ },
+ {
+ "name": "FactsRegistryUpdate",
+ "type": "dojo::config::component::Config::FactsRegistryUpdate",
+ "kind": "nested"
+ }
+ ]
+ },
+ {
+ "type": "event",
+ "name": "dojo::world::world::StateUpdated",
+ "kind": "struct",
+ "members": [
+ {
+ "name": "da_hash",
+ "type": "core::felt252",
+ "kind": "data"
+ }
+ ]
+ },
+ {
+ "type": "event",
+ "name": "dojo::world::world::Event",
+ "kind": "enum",
+ "variants": [
+ {
+ "name": "WorldSpawned",
+ "type": "dojo::world::world::WorldSpawned",
+ "kind": "nested"
+ },
+ {
+ "name": "ContractDeployed",
+ "type": "dojo::world::world::ContractDeployed",
+ "kind": "nested"
+ },
+ {
+ "name": "ContractUpgraded",
+ "type": "dojo::world::world::ContractUpgraded",
+ "kind": "nested"
+ },
+ {
+ "name": "WorldUpgraded",
+ "type": "dojo::world::world::WorldUpgraded",
+ "kind": "nested"
+ },
+ {
+ "name": "MetadataUpdate",
+ "type": "dojo::world::world::MetadataUpdate",
+ "kind": "nested"
+ },
+ {
+ "name": "ModelRegistered",
+ "type": "dojo::world::world::ModelRegistered",
+ "kind": "nested"
+ },
+ {
+ "name": "StoreSetRecord",
+ "type": "dojo::world::world::StoreSetRecord",
+ "kind": "nested"
+ },
+ {
+ "name": "StoreDelRecord",
+ "type": "dojo::world::world::StoreDelRecord",
+ "kind": "nested"
+ },
+ {
+ "name": "WriterUpdated",
+ "type": "dojo::world::world::WriterUpdated",
+ "kind": "nested"
+ },
+ {
+ "name": "OwnerUpdated",
+ "type": "dojo::world::world::OwnerUpdated",
+ "kind": "nested"
+ },
+ {
+ "name": "ConfigEvent",
+ "type": "dojo::config::component::Config::Event",
+ "kind": "nested"
+ },
+ {
+ "name": "StateUpdated",
+ "type": "dojo::world::world::StateUpdated",
+ "kind": "nested"
+ }
+ ]
+ }
+]
\ No newline at end of file
diff --git a/examples/spawn-and-move/manifests/release/abis/base/models/dojo_examples_actions_actions_moved.json b/examples/spawn-and-move/manifests/release/abis/base/models/dojo_examples_actions_actions_moved.json
new file mode 100644
index 0000000000..89abdcfec5
--- /dev/null
+++ b/examples/spawn-and-move/manifests/release/abis/base/models/dojo_examples_actions_actions_moved.json
@@ -0,0 +1,389 @@
+[
+ {
+ "type": "impl",
+ "name": "DojoModelImpl",
+ "interface_name": "dojo::model::IModel"
+ },
+ {
+ "type": "struct",
+ "name": "core::byte_array::ByteArray",
+ "members": [
+ {
+ "name": "data",
+ "type": "core::array::Array::"
+ },
+ {
+ "name": "pending_word",
+ "type": "core::felt252"
+ },
+ {
+ "name": "pending_word_len",
+ "type": "core::integer::u32"
+ }
+ ]
+ },
+ {
+ "type": "enum",
+ "name": "core::option::Option::",
+ "variants": [
+ {
+ "name": "Some",
+ "type": "core::integer::u32"
+ },
+ {
+ "name": "None",
+ "type": "()"
+ }
+ ]
+ },
+ {
+ "type": "struct",
+ "name": "core::array::Span::",
+ "members": [
+ {
+ "name": "snapshot",
+ "type": "@core::array::Array::"
+ }
+ ]
+ },
+ {
+ "type": "struct",
+ "name": "dojo::database::introspect::FieldLayout",
+ "members": [
+ {
+ "name": "selector",
+ "type": "core::felt252"
+ },
+ {
+ "name": "layout",
+ "type": "dojo::database::introspect::Layout"
+ }
+ ]
+ },
+ {
+ "type": "struct",
+ "name": "core::array::Span::",
+ "members": [
+ {
+ "name": "snapshot",
+ "type": "@core::array::Array::"
+ }
+ ]
+ },
+ {
+ "type": "struct",
+ "name": "core::array::Span::",
+ "members": [
+ {
+ "name": "snapshot",
+ "type": "@core::array::Array::"
+ }
+ ]
+ },
+ {
+ "type": "enum",
+ "name": "dojo::database::introspect::Layout",
+ "variants": [
+ {
+ "name": "Fixed",
+ "type": "core::array::Span::"
+ },
+ {
+ "name": "Struct",
+ "type": "core::array::Span::"
+ },
+ {
+ "name": "Tuple",
+ "type": "core::array::Span::"
+ },
+ {
+ "name": "Array",
+ "type": "core::array::Span::"
+ },
+ {
+ "name": "ByteArray",
+ "type": "()"
+ },
+ {
+ "name": "Enum",
+ "type": "core::array::Span::"
+ }
+ ]
+ },
+ {
+ "type": "struct",
+ "name": "core::array::Span::",
+ "members": [
+ {
+ "name": "snapshot",
+ "type": "@core::array::Array::"
+ }
+ ]
+ },
+ {
+ "type": "struct",
+ "name": "dojo::database::introspect::Member",
+ "members": [
+ {
+ "name": "name",
+ "type": "core::felt252"
+ },
+ {
+ "name": "attrs",
+ "type": "core::array::Span::"
+ },
+ {
+ "name": "ty",
+ "type": "dojo::database::introspect::Ty"
+ }
+ ]
+ },
+ {
+ "type": "struct",
+ "name": "core::array::Span::",
+ "members": [
+ {
+ "name": "snapshot",
+ "type": "@core::array::Array::"
+ }
+ ]
+ },
+ {
+ "type": "struct",
+ "name": "dojo::database::introspect::Struct",
+ "members": [
+ {
+ "name": "name",
+ "type": "core::felt252"
+ },
+ {
+ "name": "attrs",
+ "type": "core::array::Span::"
+ },
+ {
+ "name": "children",
+ "type": "core::array::Span::"
+ }
+ ]
+ },
+ {
+ "type": "struct",
+ "name": "core::array::Span::<(core::felt252, dojo::database::introspect::Ty)>",
+ "members": [
+ {
+ "name": "snapshot",
+ "type": "@core::array::Array::<(core::felt252, dojo::database::introspect::Ty)>"
+ }
+ ]
+ },
+ {
+ "type": "struct",
+ "name": "dojo::database::introspect::Enum",
+ "members": [
+ {
+ "name": "name",
+ "type": "core::felt252"
+ },
+ {
+ "name": "attrs",
+ "type": "core::array::Span::"
+ },
+ {
+ "name": "children",
+ "type": "core::array::Span::<(core::felt252, dojo::database::introspect::Ty)>"
+ }
+ ]
+ },
+ {
+ "type": "struct",
+ "name": "core::array::Span::",
+ "members": [
+ {
+ "name": "snapshot",
+ "type": "@core::array::Array::"
+ }
+ ]
+ },
+ {
+ "type": "enum",
+ "name": "dojo::database::introspect::Ty",
+ "variants": [
+ {
+ "name": "Primitive",
+ "type": "core::felt252"
+ },
+ {
+ "name": "Struct",
+ "type": "dojo::database::introspect::Struct"
+ },
+ {
+ "name": "Enum",
+ "type": "dojo::database::introspect::Enum"
+ },
+ {
+ "name": "Tuple",
+ "type": "core::array::Span::"
+ },
+ {
+ "name": "Array",
+ "type": "core::array::Span::"
+ },
+ {
+ "name": "ByteArray",
+ "type": "()"
+ }
+ ]
+ },
+ {
+ "type": "interface",
+ "name": "dojo::model::IModel",
+ "items": [
+ {
+ "type": "function",
+ "name": "selector",
+ "inputs": [],
+ "outputs": [
+ {
+ "type": "core::felt252"
+ }
+ ],
+ "state_mutability": "view"
+ },
+ {
+ "type": "function",
+ "name": "name",
+ "inputs": [],
+ "outputs": [
+ {
+ "type": "core::byte_array::ByteArray"
+ }
+ ],
+ "state_mutability": "view"
+ },
+ {
+ "type": "function",
+ "name": "version",
+ "inputs": [],
+ "outputs": [
+ {
+ "type": "core::integer::u8"
+ }
+ ],
+ "state_mutability": "view"
+ },
+ {
+ "type": "function",
+ "name": "unpacked_size",
+ "inputs": [],
+ "outputs": [
+ {
+ "type": "core::option::Option::"
+ }
+ ],
+ "state_mutability": "view"
+ },
+ {
+ "type": "function",
+ "name": "packed_size",
+ "inputs": [],
+ "outputs": [
+ {
+ "type": "core::option::Option::"
+ }
+ ],
+ "state_mutability": "view"
+ },
+ {
+ "type": "function",
+ "name": "layout",
+ "inputs": [],
+ "outputs": [
+ {
+ "type": "dojo::database::introspect::Layout"
+ }
+ ],
+ "state_mutability": "view"
+ },
+ {
+ "type": "function",
+ "name": "schema",
+ "inputs": [],
+ "outputs": [
+ {
+ "type": "dojo::database::introspect::Ty"
+ }
+ ],
+ "state_mutability": "view"
+ }
+ ]
+ },
+ {
+ "type": "impl",
+ "name": "movedImpl",
+ "interface_name": "dojo_examples::actions::actions::Imoved"
+ },
+ {
+ "type": "enum",
+ "name": "dojo_examples::models::Direction",
+ "variants": [
+ {
+ "name": "None",
+ "type": "()"
+ },
+ {
+ "name": "Left",
+ "type": "()"
+ },
+ {
+ "name": "Right",
+ "type": "()"
+ },
+ {
+ "name": "Up",
+ "type": "()"
+ },
+ {
+ "name": "Down",
+ "type": "()"
+ }
+ ]
+ },
+ {
+ "type": "struct",
+ "name": "dojo_examples::actions::actions::Moved",
+ "members": [
+ {
+ "name": "player",
+ "type": "core::starknet::contract_address::ContractAddress"
+ },
+ {
+ "name": "direction",
+ "type": "dojo_examples::models::Direction"
+ }
+ ]
+ },
+ {
+ "type": "interface",
+ "name": "dojo_examples::actions::actions::Imoved",
+ "items": [
+ {
+ "type": "function",
+ "name": "ensure_abi",
+ "inputs": [
+ {
+ "name": "model",
+ "type": "dojo_examples::actions::actions::Moved"
+ }
+ ],
+ "outputs": [],
+ "state_mutability": "view"
+ }
+ ]
+ },
+ {
+ "type": "event",
+ "name": "dojo_examples::actions::actions::moved::Event",
+ "kind": "enum",
+ "variants": []
+ }
+]
\ No newline at end of file
diff --git a/examples/spawn-and-move/manifests/release/abis/base/models/dojo_examples_models_message.json b/examples/spawn-and-move/manifests/release/abis/base/models/dojo_examples_models_message.json
new file mode 100644
index 0000000000..ec760c99fb
--- /dev/null
+++ b/examples/spawn-and-move/manifests/release/abis/base/models/dojo_examples_models_message.json
@@ -0,0 +1,371 @@
+[
+ {
+ "type": "impl",
+ "name": "DojoModelImpl",
+ "interface_name": "dojo::model::IModel"
+ },
+ {
+ "type": "struct",
+ "name": "core::byte_array::ByteArray",
+ "members": [
+ {
+ "name": "data",
+ "type": "core::array::Array::"
+ },
+ {
+ "name": "pending_word",
+ "type": "core::felt252"
+ },
+ {
+ "name": "pending_word_len",
+ "type": "core::integer::u32"
+ }
+ ]
+ },
+ {
+ "type": "enum",
+ "name": "core::option::Option::",
+ "variants": [
+ {
+ "name": "Some",
+ "type": "core::integer::u32"
+ },
+ {
+ "name": "None",
+ "type": "()"
+ }
+ ]
+ },
+ {
+ "type": "struct",
+ "name": "core::array::Span::",
+ "members": [
+ {
+ "name": "snapshot",
+ "type": "@core::array::Array::"
+ }
+ ]
+ },
+ {
+ "type": "struct",
+ "name": "dojo::database::introspect::FieldLayout",
+ "members": [
+ {
+ "name": "selector",
+ "type": "core::felt252"
+ },
+ {
+ "name": "layout",
+ "type": "dojo::database::introspect::Layout"
+ }
+ ]
+ },
+ {
+ "type": "struct",
+ "name": "core::array::Span::",
+ "members": [
+ {
+ "name": "snapshot",
+ "type": "@core::array::Array::"
+ }
+ ]
+ },
+ {
+ "type": "struct",
+ "name": "core::array::Span::",
+ "members": [
+ {
+ "name": "snapshot",
+ "type": "@core::array::Array::"
+ }
+ ]
+ },
+ {
+ "type": "enum",
+ "name": "dojo::database::introspect::Layout",
+ "variants": [
+ {
+ "name": "Fixed",
+ "type": "core::array::Span::"
+ },
+ {
+ "name": "Struct",
+ "type": "core::array::Span::"
+ },
+ {
+ "name": "Tuple",
+ "type": "core::array::Span::"
+ },
+ {
+ "name": "Array",
+ "type": "core::array::Span::"
+ },
+ {
+ "name": "ByteArray",
+ "type": "()"
+ },
+ {
+ "name": "Enum",
+ "type": "core::array::Span::"
+ }
+ ]
+ },
+ {
+ "type": "struct",
+ "name": "core::array::Span::",
+ "members": [
+ {
+ "name": "snapshot",
+ "type": "@core::array::Array::"
+ }
+ ]
+ },
+ {
+ "type": "struct",
+ "name": "dojo::database::introspect::Member",
+ "members": [
+ {
+ "name": "name",
+ "type": "core::felt252"
+ },
+ {
+ "name": "attrs",
+ "type": "core::array::Span::"
+ },
+ {
+ "name": "ty",
+ "type": "dojo::database::introspect::Ty"
+ }
+ ]
+ },
+ {
+ "type": "struct",
+ "name": "core::array::Span::",
+ "members": [
+ {
+ "name": "snapshot",
+ "type": "@core::array::Array::"
+ }
+ ]
+ },
+ {
+ "type": "struct",
+ "name": "dojo::database::introspect::Struct",
+ "members": [
+ {
+ "name": "name",
+ "type": "core::felt252"
+ },
+ {
+ "name": "attrs",
+ "type": "core::array::Span::"
+ },
+ {
+ "name": "children",
+ "type": "core::array::Span::"
+ }
+ ]
+ },
+ {
+ "type": "struct",
+ "name": "core::array::Span::<(core::felt252, dojo::database::introspect::Ty)>",
+ "members": [
+ {
+ "name": "snapshot",
+ "type": "@core::array::Array::<(core::felt252, dojo::database::introspect::Ty)>"
+ }
+ ]
+ },
+ {
+ "type": "struct",
+ "name": "dojo::database::introspect::Enum",
+ "members": [
+ {
+ "name": "name",
+ "type": "core::felt252"
+ },
+ {
+ "name": "attrs",
+ "type": "core::array::Span::"
+ },
+ {
+ "name": "children",
+ "type": "core::array::Span::<(core::felt252, dojo::database::introspect::Ty)>"
+ }
+ ]
+ },
+ {
+ "type": "struct",
+ "name": "core::array::Span::",
+ "members": [
+ {
+ "name": "snapshot",
+ "type": "@core::array::Array::"
+ }
+ ]
+ },
+ {
+ "type": "enum",
+ "name": "dojo::database::introspect::Ty",
+ "variants": [
+ {
+ "name": "Primitive",
+ "type": "core::felt252"
+ },
+ {
+ "name": "Struct",
+ "type": "dojo::database::introspect::Struct"
+ },
+ {
+ "name": "Enum",
+ "type": "dojo::database::introspect::Enum"
+ },
+ {
+ "name": "Tuple",
+ "type": "core::array::Span::"
+ },
+ {
+ "name": "Array",
+ "type": "core::array::Span::"
+ },
+ {
+ "name": "ByteArray",
+ "type": "()"
+ }
+ ]
+ },
+ {
+ "type": "interface",
+ "name": "dojo::model::IModel",
+ "items": [
+ {
+ "type": "function",
+ "name": "selector",
+ "inputs": [],
+ "outputs": [
+ {
+ "type": "core::felt252"
+ }
+ ],
+ "state_mutability": "view"
+ },
+ {
+ "type": "function",
+ "name": "name",
+ "inputs": [],
+ "outputs": [
+ {
+ "type": "core::byte_array::ByteArray"
+ }
+ ],
+ "state_mutability": "view"
+ },
+ {
+ "type": "function",
+ "name": "version",
+ "inputs": [],
+ "outputs": [
+ {
+ "type": "core::integer::u8"
+ }
+ ],
+ "state_mutability": "view"
+ },
+ {
+ "type": "function",
+ "name": "unpacked_size",
+ "inputs": [],
+ "outputs": [
+ {
+ "type": "core::option::Option::"
+ }
+ ],
+ "state_mutability": "view"
+ },
+ {
+ "type": "function",
+ "name": "packed_size",
+ "inputs": [],
+ "outputs": [
+ {
+ "type": "core::option::Option::"
+ }
+ ],
+ "state_mutability": "view"
+ },
+ {
+ "type": "function",
+ "name": "layout",
+ "inputs": [],
+ "outputs": [
+ {
+ "type": "dojo::database::introspect::Layout"
+ }
+ ],
+ "state_mutability": "view"
+ },
+ {
+ "type": "function",
+ "name": "schema",
+ "inputs": [],
+ "outputs": [
+ {
+ "type": "dojo::database::introspect::Ty"
+ }
+ ],
+ "state_mutability": "view"
+ }
+ ]
+ },
+ {
+ "type": "impl",
+ "name": "messageImpl",
+ "interface_name": "dojo_examples::models::Imessage"
+ },
+ {
+ "type": "struct",
+ "name": "dojo_examples::models::Message",
+ "members": [
+ {
+ "name": "identity",
+ "type": "core::starknet::contract_address::ContractAddress"
+ },
+ {
+ "name": "channel",
+ "type": "core::felt252"
+ },
+ {
+ "name": "message",
+ "type": "core::byte_array::ByteArray"
+ },
+ {
+ "name": "salt",
+ "type": "core::felt252"
+ }
+ ]
+ },
+ {
+ "type": "interface",
+ "name": "dojo_examples::models::Imessage",
+ "items": [
+ {
+ "type": "function",
+ "name": "ensure_abi",
+ "inputs": [
+ {
+ "name": "model",
+ "type": "dojo_examples::models::Message"
+ }
+ ],
+ "outputs": [],
+ "state_mutability": "view"
+ }
+ ]
+ },
+ {
+ "type": "event",
+ "name": "dojo_examples::models::message::Event",
+ "kind": "enum",
+ "variants": []
+ }
+]
\ No newline at end of file
diff --git a/examples/spawn-and-move/manifests/release/abis/base/models/dojo_examples_models_mock_token.json b/examples/spawn-and-move/manifests/release/abis/base/models/dojo_examples_models_mock_token.json
new file mode 100644
index 0000000000..b2c1c340fa
--- /dev/null
+++ b/examples/spawn-and-move/manifests/release/abis/base/models/dojo_examples_models_mock_token.json
@@ -0,0 +1,363 @@
+[
+ {
+ "type": "impl",
+ "name": "DojoModelImpl",
+ "interface_name": "dojo::model::IModel"
+ },
+ {
+ "type": "struct",
+ "name": "core::byte_array::ByteArray",
+ "members": [
+ {
+ "name": "data",
+ "type": "core::array::Array::"
+ },
+ {
+ "name": "pending_word",
+ "type": "core::felt252"
+ },
+ {
+ "name": "pending_word_len",
+ "type": "core::integer::u32"
+ }
+ ]
+ },
+ {
+ "type": "enum",
+ "name": "core::option::Option::",
+ "variants": [
+ {
+ "name": "Some",
+ "type": "core::integer::u32"
+ },
+ {
+ "name": "None",
+ "type": "()"
+ }
+ ]
+ },
+ {
+ "type": "struct",
+ "name": "core::array::Span::",
+ "members": [
+ {
+ "name": "snapshot",
+ "type": "@core::array::Array::"
+ }
+ ]
+ },
+ {
+ "type": "struct",
+ "name": "dojo::database::introspect::FieldLayout",
+ "members": [
+ {
+ "name": "selector",
+ "type": "core::felt252"
+ },
+ {
+ "name": "layout",
+ "type": "dojo::database::introspect::Layout"
+ }
+ ]
+ },
+ {
+ "type": "struct",
+ "name": "core::array::Span::",
+ "members": [
+ {
+ "name": "snapshot",
+ "type": "@core::array::Array::"
+ }
+ ]
+ },
+ {
+ "type": "struct",
+ "name": "core::array::Span::",
+ "members": [
+ {
+ "name": "snapshot",
+ "type": "@core::array::Array::"
+ }
+ ]
+ },
+ {
+ "type": "enum",
+ "name": "dojo::database::introspect::Layout",
+ "variants": [
+ {
+ "name": "Fixed",
+ "type": "core::array::Span::"
+ },
+ {
+ "name": "Struct",
+ "type": "core::array::Span::"
+ },
+ {
+ "name": "Tuple",
+ "type": "core::array::Span::"
+ },
+ {
+ "name": "Array",
+ "type": "core::array::Span::"
+ },
+ {
+ "name": "ByteArray",
+ "type": "()"
+ },
+ {
+ "name": "Enum",
+ "type": "core::array::Span::"
+ }
+ ]
+ },
+ {
+ "type": "struct",
+ "name": "core::array::Span::",
+ "members": [
+ {
+ "name": "snapshot",
+ "type": "@core::array::Array::"
+ }
+ ]
+ },
+ {
+ "type": "struct",
+ "name": "dojo::database::introspect::Member",
+ "members": [
+ {
+ "name": "name",
+ "type": "core::felt252"
+ },
+ {
+ "name": "attrs",
+ "type": "core::array::Span::"
+ },
+ {
+ "name": "ty",
+ "type": "dojo::database::introspect::Ty"
+ }
+ ]
+ },
+ {
+ "type": "struct",
+ "name": "core::array::Span::",
+ "members": [
+ {
+ "name": "snapshot",
+ "type": "@core::array::Array::"
+ }
+ ]
+ },
+ {
+ "type": "struct",
+ "name": "dojo::database::introspect::Struct",
+ "members": [
+ {
+ "name": "name",
+ "type": "core::felt252"
+ },
+ {
+ "name": "attrs",
+ "type": "core::array::Span::"
+ },
+ {
+ "name": "children",
+ "type": "core::array::Span::"
+ }
+ ]
+ },
+ {
+ "type": "struct",
+ "name": "core::array::Span::<(core::felt252, dojo::database::introspect::Ty)>",
+ "members": [
+ {
+ "name": "snapshot",
+ "type": "@core::array::Array::<(core::felt252, dojo::database::introspect::Ty)>"
+ }
+ ]
+ },
+ {
+ "type": "struct",
+ "name": "dojo::database::introspect::Enum",
+ "members": [
+ {
+ "name": "name",
+ "type": "core::felt252"
+ },
+ {
+ "name": "attrs",
+ "type": "core::array::Span::"
+ },
+ {
+ "name": "children",
+ "type": "core::array::Span::<(core::felt252, dojo::database::introspect::Ty)>"
+ }
+ ]
+ },
+ {
+ "type": "struct",
+ "name": "core::array::Span::",
+ "members": [
+ {
+ "name": "snapshot",
+ "type": "@core::array::Array::"
+ }
+ ]
+ },
+ {
+ "type": "enum",
+ "name": "dojo::database::introspect::Ty",
+ "variants": [
+ {
+ "name": "Primitive",
+ "type": "core::felt252"
+ },
+ {
+ "name": "Struct",
+ "type": "dojo::database::introspect::Struct"
+ },
+ {
+ "name": "Enum",
+ "type": "dojo::database::introspect::Enum"
+ },
+ {
+ "name": "Tuple",
+ "type": "core::array::Span::"
+ },
+ {
+ "name": "Array",
+ "type": "core::array::Span::"
+ },
+ {
+ "name": "ByteArray",
+ "type": "()"
+ }
+ ]
+ },
+ {
+ "type": "interface",
+ "name": "dojo::model::IModel",
+ "items": [
+ {
+ "type": "function",
+ "name": "selector",
+ "inputs": [],
+ "outputs": [
+ {
+ "type": "core::felt252"
+ }
+ ],
+ "state_mutability": "view"
+ },
+ {
+ "type": "function",
+ "name": "name",
+ "inputs": [],
+ "outputs": [
+ {
+ "type": "core::byte_array::ByteArray"
+ }
+ ],
+ "state_mutability": "view"
+ },
+ {
+ "type": "function",
+ "name": "version",
+ "inputs": [],
+ "outputs": [
+ {
+ "type": "core::integer::u8"
+ }
+ ],
+ "state_mutability": "view"
+ },
+ {
+ "type": "function",
+ "name": "unpacked_size",
+ "inputs": [],
+ "outputs": [
+ {
+ "type": "core::option::Option::"
+ }
+ ],
+ "state_mutability": "view"
+ },
+ {
+ "type": "function",
+ "name": "packed_size",
+ "inputs": [],
+ "outputs": [
+ {
+ "type": "core::option::Option::"
+ }
+ ],
+ "state_mutability": "view"
+ },
+ {
+ "type": "function",
+ "name": "layout",
+ "inputs": [],
+ "outputs": [
+ {
+ "type": "dojo::database::introspect::Layout"
+ }
+ ],
+ "state_mutability": "view"
+ },
+ {
+ "type": "function",
+ "name": "schema",
+ "inputs": [],
+ "outputs": [
+ {
+ "type": "dojo::database::introspect::Ty"
+ }
+ ],
+ "state_mutability": "view"
+ }
+ ]
+ },
+ {
+ "type": "impl",
+ "name": "mock_tokenImpl",
+ "interface_name": "dojo_examples::models::Imock_token"
+ },
+ {
+ "type": "struct",
+ "name": "dojo_examples::models::MockToken",
+ "members": [
+ {
+ "name": "account",
+ "type": "core::starknet::contract_address::ContractAddress"
+ },
+ {
+ "name": "amount",
+ "type": "core::integer::u128"
+ }
+ ]
+ },
+ {
+ "type": "interface",
+ "name": "dojo_examples::models::Imock_token",
+ "items": [
+ {
+ "type": "function",
+ "name": "ensure_abi",
+ "inputs": [
+ {
+ "name": "model",
+ "type": "dojo_examples::models::MockToken"
+ }
+ ],
+ "outputs": [],
+ "state_mutability": "view"
+ }
+ ]
+ },
+ {
+ "type": "event",
+ "name": "dojo_examples::models::mock_token::Event",
+ "kind": "enum",
+ "variants": []
+ }
+]
\ No newline at end of file
diff --git a/examples/spawn-and-move/manifests/release/abis/base/models/dojo_examples_models_moves.json b/examples/spawn-and-move/manifests/release/abis/base/models/dojo_examples_models_moves.json
new file mode 100644
index 0000000000..ee2cf17b26
--- /dev/null
+++ b/examples/spawn-and-move/manifests/release/abis/base/models/dojo_examples_models_moves.json
@@ -0,0 +1,393 @@
+[
+ {
+ "type": "impl",
+ "name": "DojoModelImpl",
+ "interface_name": "dojo::model::IModel"
+ },
+ {
+ "type": "struct",
+ "name": "core::byte_array::ByteArray",
+ "members": [
+ {
+ "name": "data",
+ "type": "core::array::Array::"
+ },
+ {
+ "name": "pending_word",
+ "type": "core::felt252"
+ },
+ {
+ "name": "pending_word_len",
+ "type": "core::integer::u32"
+ }
+ ]
+ },
+ {
+ "type": "enum",
+ "name": "core::option::Option::",
+ "variants": [
+ {
+ "name": "Some",
+ "type": "core::integer::u32"
+ },
+ {
+ "name": "None",
+ "type": "()"
+ }
+ ]
+ },
+ {
+ "type": "struct",
+ "name": "core::array::Span::",
+ "members": [
+ {
+ "name": "snapshot",
+ "type": "@core::array::Array::"
+ }
+ ]
+ },
+ {
+ "type": "struct",
+ "name": "dojo::database::introspect::FieldLayout",
+ "members": [
+ {
+ "name": "selector",
+ "type": "core::felt252"
+ },
+ {
+ "name": "layout",
+ "type": "dojo::database::introspect::Layout"
+ }
+ ]
+ },
+ {
+ "type": "struct",
+ "name": "core::array::Span::",
+ "members": [
+ {
+ "name": "snapshot",
+ "type": "@core::array::Array::"
+ }
+ ]
+ },
+ {
+ "type": "struct",
+ "name": "core::array::Span::",
+ "members": [
+ {
+ "name": "snapshot",
+ "type": "@core::array::Array::"
+ }
+ ]
+ },
+ {
+ "type": "enum",
+ "name": "dojo::database::introspect::Layout",
+ "variants": [
+ {
+ "name": "Fixed",
+ "type": "core::array::Span::"
+ },
+ {
+ "name": "Struct",
+ "type": "core::array::Span::"
+ },
+ {
+ "name": "Tuple",
+ "type": "core::array::Span::"
+ },
+ {
+ "name": "Array",
+ "type": "core::array::Span::"
+ },
+ {
+ "name": "ByteArray",
+ "type": "()"
+ },
+ {
+ "name": "Enum",
+ "type": "core::array::Span::"
+ }
+ ]
+ },
+ {
+ "type": "struct",
+ "name": "core::array::Span::",
+ "members": [
+ {
+ "name": "snapshot",
+ "type": "@core::array::Array::"
+ }
+ ]
+ },
+ {
+ "type": "struct",
+ "name": "dojo::database::introspect::Member",
+ "members": [
+ {
+ "name": "name",
+ "type": "core::felt252"
+ },
+ {
+ "name": "attrs",
+ "type": "core::array::Span::"
+ },
+ {
+ "name": "ty",
+ "type": "dojo::database::introspect::Ty"
+ }
+ ]
+ },
+ {
+ "type": "struct",
+ "name": "core::array::Span::",
+ "members": [
+ {
+ "name": "snapshot",
+ "type": "@core::array::Array::"
+ }
+ ]
+ },
+ {
+ "type": "struct",
+ "name": "dojo::database::introspect::Struct",
+ "members": [
+ {
+ "name": "name",
+ "type": "core::felt252"
+ },
+ {
+ "name": "attrs",
+ "type": "core::array::Span::"
+ },
+ {
+ "name": "children",
+ "type": "core::array::Span::"
+ }
+ ]
+ },
+ {
+ "type": "struct",
+ "name": "core::array::Span::<(core::felt252, dojo::database::introspect::Ty)>",
+ "members": [
+ {
+ "name": "snapshot",
+ "type": "@core::array::Array::<(core::felt252, dojo::database::introspect::Ty)>"
+ }
+ ]
+ },
+ {
+ "type": "struct",
+ "name": "dojo::database::introspect::Enum",
+ "members": [
+ {
+ "name": "name",
+ "type": "core::felt252"
+ },
+ {
+ "name": "attrs",
+ "type": "core::array::Span::"
+ },
+ {
+ "name": "children",
+ "type": "core::array::Span::<(core::felt252, dojo::database::introspect::Ty)>"
+ }
+ ]
+ },
+ {
+ "type": "struct",
+ "name": "core::array::Span::",
+ "members": [
+ {
+ "name": "snapshot",
+ "type": "@core::array::Array::"
+ }
+ ]
+ },
+ {
+ "type": "enum",
+ "name": "dojo::database::introspect::Ty",
+ "variants": [
+ {
+ "name": "Primitive",
+ "type": "core::felt252"
+ },
+ {
+ "name": "Struct",
+ "type": "dojo::database::introspect::Struct"
+ },
+ {
+ "name": "Enum",
+ "type": "dojo::database::introspect::Enum"
+ },
+ {
+ "name": "Tuple",
+ "type": "core::array::Span::"
+ },
+ {
+ "name": "Array",
+ "type": "core::array::Span::"
+ },
+ {
+ "name": "ByteArray",
+ "type": "()"
+ }
+ ]
+ },
+ {
+ "type": "interface",
+ "name": "dojo::model::IModel",
+ "items": [
+ {
+ "type": "function",
+ "name": "selector",
+ "inputs": [],
+ "outputs": [
+ {
+ "type": "core::felt252"
+ }
+ ],
+ "state_mutability": "view"
+ },
+ {
+ "type": "function",
+ "name": "name",
+ "inputs": [],
+ "outputs": [
+ {
+ "type": "core::byte_array::ByteArray"
+ }
+ ],
+ "state_mutability": "view"
+ },
+ {
+ "type": "function",
+ "name": "version",
+ "inputs": [],
+ "outputs": [
+ {
+ "type": "core::integer::u8"
+ }
+ ],
+ "state_mutability": "view"
+ },
+ {
+ "type": "function",
+ "name": "unpacked_size",
+ "inputs": [],
+ "outputs": [
+ {
+ "type": "core::option::Option::"
+ }
+ ],
+ "state_mutability": "view"
+ },
+ {
+ "type": "function",
+ "name": "packed_size",
+ "inputs": [],
+ "outputs": [
+ {
+ "type": "core::option::Option::"
+ }
+ ],
+ "state_mutability": "view"
+ },
+ {
+ "type": "function",
+ "name": "layout",
+ "inputs": [],
+ "outputs": [
+ {
+ "type": "dojo::database::introspect::Layout"
+ }
+ ],
+ "state_mutability": "view"
+ },
+ {
+ "type": "function",
+ "name": "schema",
+ "inputs": [],
+ "outputs": [
+ {
+ "type": "dojo::database::introspect::Ty"
+ }
+ ],
+ "state_mutability": "view"
+ }
+ ]
+ },
+ {
+ "type": "impl",
+ "name": "movesImpl",
+ "interface_name": "dojo_examples::models::Imoves"
+ },
+ {
+ "type": "enum",
+ "name": "dojo_examples::models::Direction",
+ "variants": [
+ {
+ "name": "None",
+ "type": "()"
+ },
+ {
+ "name": "Left",
+ "type": "()"
+ },
+ {
+ "name": "Right",
+ "type": "()"
+ },
+ {
+ "name": "Up",
+ "type": "()"
+ },
+ {
+ "name": "Down",
+ "type": "()"
+ }
+ ]
+ },
+ {
+ "type": "struct",
+ "name": "dojo_examples::models::Moves",
+ "members": [
+ {
+ "name": "player",
+ "type": "core::starknet::contract_address::ContractAddress"
+ },
+ {
+ "name": "remaining",
+ "type": "core::integer::u8"
+ },
+ {
+ "name": "last_direction",
+ "type": "dojo_examples::models::Direction"
+ }
+ ]
+ },
+ {
+ "type": "interface",
+ "name": "dojo_examples::models::Imoves",
+ "items": [
+ {
+ "type": "function",
+ "name": "ensure_abi",
+ "inputs": [
+ {
+ "name": "model",
+ "type": "dojo_examples::models::Moves"
+ }
+ ],
+ "outputs": [],
+ "state_mutability": "view"
+ }
+ ]
+ },
+ {
+ "type": "event",
+ "name": "dojo_examples::models::moves::Event",
+ "kind": "enum",
+ "variants": []
+ }
+]
\ No newline at end of file
diff --git a/examples/spawn-and-move/manifests/release/abis/base/models/dojo_examples_models_player_config.json b/examples/spawn-and-move/manifests/release/abis/base/models/dojo_examples_models_player_config.json
new file mode 100644
index 0000000000..8c33ebabc4
--- /dev/null
+++ b/examples/spawn-and-move/manifests/release/abis/base/models/dojo_examples_models_player_config.json
@@ -0,0 +1,385 @@
+[
+ {
+ "type": "impl",
+ "name": "DojoModelImpl",
+ "interface_name": "dojo::model::IModel"
+ },
+ {
+ "type": "struct",
+ "name": "core::byte_array::ByteArray",
+ "members": [
+ {
+ "name": "data",
+ "type": "core::array::Array::"
+ },
+ {
+ "name": "pending_word",
+ "type": "core::felt252"
+ },
+ {
+ "name": "pending_word_len",
+ "type": "core::integer::u32"
+ }
+ ]
+ },
+ {
+ "type": "enum",
+ "name": "core::option::Option::",
+ "variants": [
+ {
+ "name": "Some",
+ "type": "core::integer::u32"
+ },
+ {
+ "name": "None",
+ "type": "()"
+ }
+ ]
+ },
+ {
+ "type": "struct",
+ "name": "core::array::Span::