diff --git a/Cargo.lock b/Cargo.lock index 35a24d284c..cd2c8831f8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2497,16 +2497,16 @@ dependencies = [ [[package]] name = "cainome" -version = "0.4.8" -source = "git+https://github.com/cartridge-gg/cainome?tag=v0.4.10#6fefd8bf4370c77d8834d18a2ae3c59d3a5e8dd5" +version = "0.4.11" +source = "git+https://github.com/cartridge-gg/cainome?tag=v0.4.11#355b88b7b808656d729e9dfd16f81d80c5c30fbf" dependencies = [ "anyhow", "async-trait", - "cainome-cairo-serde 0.1.0 (git+https://github.com/cartridge-gg/cainome?tag=v0.4.10)", - "cainome-cairo-serde-derive 0.1.0 (git+https://github.com/cartridge-gg/cainome?tag=v0.4.10)", - "cainome-parser 0.1.0 (git+https://github.com/cartridge-gg/cainome?tag=v0.4.10)", - "cainome-rs 0.1.0 (git+https://github.com/cartridge-gg/cainome?tag=v0.4.10)", - "cainome-rs-macro 0.1.0 (git+https://github.com/cartridge-gg/cainome?tag=v0.4.10)", + "cainome-cairo-serde 0.1.0 (git+https://github.com/cartridge-gg/cainome?tag=v0.4.11)", + "cainome-cairo-serde-derive 0.1.0 (git+https://github.com/cartridge-gg/cainome?tag=v0.4.11)", + "cainome-parser 0.1.0 (git+https://github.com/cartridge-gg/cainome?tag=v0.4.11)", + "cainome-rs 0.1.0 (git+https://github.com/cartridge-gg/cainome?tag=v0.4.11)", + "cainome-rs-macro 0.1.0 (git+https://github.com/cartridge-gg/cainome?tag=v0.4.11)", "camino", "clap", "clap_complete", @@ -2524,7 +2524,7 @@ dependencies = [ [[package]] name = "cainome-cairo-serde" version = "0.1.0" -source = "git+https://github.com/cartridge-gg/cainome?tag=v0.4.10#6fefd8bf4370c77d8834d18a2ae3c59d3a5e8dd5" +source = "git+https://github.com/cartridge-gg/cainome?tag=v0.4.11#355b88b7b808656d729e9dfd16f81d80c5c30fbf" dependencies = [ "num-bigint", "serde", @@ -2556,7 +2556,7 @@ dependencies = [ [[package]] name = "cainome-cairo-serde-derive" version = "0.1.0" -source = "git+https://github.com/cartridge-gg/cainome?tag=v0.4.10#6fefd8bf4370c77d8834d18a2ae3c59d3a5e8dd5" +source = "git+https://github.com/cartridge-gg/cainome?tag=v0.4.11#355b88b7b808656d729e9dfd16f81d80c5c30fbf" dependencies = [ "proc-macro2", "quote", @@ -2578,7 +2578,7 @@ dependencies = [ [[package]] name = "cainome-parser" version = "0.1.0" -source = "git+https://github.com/cartridge-gg/cainome?tag=v0.4.10#6fefd8bf4370c77d8834d18a2ae3c59d3a5e8dd5" +source = "git+https://github.com/cartridge-gg/cainome?tag=v0.4.11#355b88b7b808656d729e9dfd16f81d80c5c30fbf" dependencies = [ "convert_case 0.6.0", "quote", @@ -2617,11 +2617,11 @@ dependencies = [ [[package]] name = "cainome-rs" version = "0.1.0" -source = "git+https://github.com/cartridge-gg/cainome?tag=v0.4.10#6fefd8bf4370c77d8834d18a2ae3c59d3a5e8dd5" +source = "git+https://github.com/cartridge-gg/cainome?tag=v0.4.11#355b88b7b808656d729e9dfd16f81d80c5c30fbf" dependencies = [ "anyhow", - "cainome-cairo-serde 0.1.0 (git+https://github.com/cartridge-gg/cainome?tag=v0.4.10)", - "cainome-parser 0.1.0 (git+https://github.com/cartridge-gg/cainome?tag=v0.4.10)", + "cainome-cairo-serde 0.1.0 (git+https://github.com/cartridge-gg/cainome?tag=v0.4.11)", + "cainome-parser 0.1.0 (git+https://github.com/cartridge-gg/cainome?tag=v0.4.11)", "camino", "prettyplease", "proc-macro2", @@ -2671,12 +2671,12 @@ dependencies = [ [[package]] name = "cainome-rs-macro" version = "0.1.0" -source = "git+https://github.com/cartridge-gg/cainome?tag=v0.4.10#6fefd8bf4370c77d8834d18a2ae3c59d3a5e8dd5" +source = "git+https://github.com/cartridge-gg/cainome?tag=v0.4.11#355b88b7b808656d729e9dfd16f81d80c5c30fbf" dependencies = [ "anyhow", - "cainome-cairo-serde 0.1.0 (git+https://github.com/cartridge-gg/cainome?tag=v0.4.10)", - "cainome-parser 0.1.0 (git+https://github.com/cartridge-gg/cainome?tag=v0.4.10)", - "cainome-rs 0.1.0 (git+https://github.com/cartridge-gg/cainome?tag=v0.4.10)", + "cainome-cairo-serde 0.1.0 (git+https://github.com/cartridge-gg/cainome?tag=v0.4.11)", + "cainome-parser 0.1.0 (git+https://github.com/cartridge-gg/cainome?tag=v0.4.11)", + "cainome-rs 0.1.0 (git+https://github.com/cartridge-gg/cainome?tag=v0.4.11)", "proc-macro-error", "proc-macro2", "quote", @@ -4858,7 +4858,7 @@ dependencies = [ "anyhow", "assert_matches", "async-trait", - "cainome 0.4.8", + "cainome 0.4.11", "camino", "chrono", "convert_case 0.6.0", @@ -5015,7 +5015,7 @@ name = "dojo-types" version = "1.0.9" dependencies = [ "anyhow", - "cainome 0.4.8", + "cainome 0.4.11", "crypto-bigint", "hex", "indexmap 2.5.0", @@ -5055,7 +5055,7 @@ version = "1.0.9" dependencies = [ "anyhow", "async-trait", - "cainome 0.4.8", + "cainome 0.4.11", "cairo-lang-starknet-classes", "dojo-types 1.0.9", "futures", @@ -5081,7 +5081,7 @@ name = "dojo-world-abigen" version = "1.0.9" dependencies = [ "anyhow", - "cainome 0.4.8", + "cainome 0.4.11", "cairo-lang-starknet", "cairo-lang-starknet-classes", "camino", @@ -8443,7 +8443,7 @@ dependencies = [ "anyhow", "assert_matches", "byte-unit", - "cainome 0.4.8", + "cainome 0.4.11", "clap", "clap_complete", "comfy-table", @@ -8486,7 +8486,7 @@ dependencies = [ "alloy-primitives", "anyhow", "assert_matches", - "cainome-cairo-serde 0.1.0 (git+https://github.com/cartridge-gg/cainome?tag=v0.4.10)", + "cainome-cairo-serde 0.1.0 (git+https://github.com/cartridge-gg/cainome?tag=v0.4.11)", "clap", "console", "dojo-utils", @@ -8798,7 +8798,7 @@ dependencies = [ "alloy-primitives", "anyhow", "assert_matches", - "cainome 0.4.8", + "cainome 0.4.11", "dojo-metrics", "dojo-test-utils", "dojo-utils", @@ -13963,7 +13963,7 @@ version = "1.0.9" dependencies = [ "anyhow", "async-trait", - "cainome 0.4.8", + "cainome 0.4.11", "cairo-lang-compiler", "cairo-lang-filesystem", "cairo-lang-project", @@ -14015,7 +14015,7 @@ dependencies = [ "anyhow", "assert_fs", "async-trait", - "cainome 0.4.8", + "cainome 0.4.11", "colored", "colored_json", "dojo-test-utils", @@ -15748,7 +15748,7 @@ dependencies = [ "async-trait", "base64 0.21.7", "bitflags 2.6.0", - "cainome 0.4.8", + "cainome 0.4.11", "chrono", "crypto-bigint", "data-url", @@ -15761,7 +15761,6 @@ dependencies = [ "hashlink", "ipfs-api-backend-hyper", "katana-runner", - "num-traits 0.2.19", "once_cell", "reqwest 0.11.27", "scarb", @@ -15823,7 +15822,7 @@ dependencies = [ name = "torii-grpc" version = "1.0.9" dependencies = [ - "cainome 0.4.8", + "cainome 0.4.11", "camino", "crypto-bigint", "dojo-test-utils", @@ -15871,7 +15870,7 @@ name = "torii-relay" version = "1.0.9" dependencies = [ "anyhow", - "cainome 0.4.8", + "cainome 0.4.11", "chrono", "crypto-bigint", "dojo-types 1.0.9", diff --git a/Cargo.toml b/Cargo.toml index b6c0ae31f0..9dc1b2bddc 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -73,8 +73,8 @@ debug = true inherits = "release" [workspace.dependencies] -cainome = { git = "https://github.com/cartridge-gg/cainome", tag = "v0.4.10", features = [ "abigen-rs" ] } -cainome-cairo-serde = { git = "https://github.com/cartridge-gg/cainome", tag = "v0.4.10" } +cainome = { git = "https://github.com/cartridge-gg/cainome", tag = "v0.4.11", features = [ "abigen-rs" ] } +cainome-cairo-serde = { git = "https://github.com/cartridge-gg/cainome", tag = "v0.4.11" } dojo-utils = { path = "crates/dojo/utils" } # metrics diff --git a/bin/sozo/tests/test_data/policies.json b/bin/sozo/tests/test_data/policies.json index 26ec67d783..2094e3d30f 100644 --- a/bin/sozo/tests/test_data/policies.json +++ b/bin/sozo/tests/test_data/policies.json @@ -1,48 +1,4 @@ [ - { - "target": "0x72a9f501c260b2d13f8988ea172680c5c1fdc085c5b44bdcac8477362ed5290", - "method": "upgrade" - }, - { - "target": "0x7e8a52c68b243d3a86a55c04ccec2edc760252d5952566d3af4001bd6cf38f3", - "method": "spawn" - }, - { - "target": "0x7e8a52c68b243d3a86a55c04ccec2edc760252d5952566d3af4001bd6cf38f3", - "method": "move" - }, - { - "target": "0x7e8a52c68b243d3a86a55c04ccec2edc760252d5952566d3af4001bd6cf38f3", - "method": "set_player_config" - }, - { - "target": "0x7e8a52c68b243d3a86a55c04ccec2edc760252d5952566d3af4001bd6cf38f3", - "method": "reset_player_config" - }, - { - "target": "0x7e8a52c68b243d3a86a55c04ccec2edc760252d5952566d3af4001bd6cf38f3", - "method": "set_player_server_profile" - }, - { - "target": "0x7e8a52c68b243d3a86a55c04ccec2edc760252d5952566d3af4001bd6cf38f3", - "method": "set_models" - }, - { - "target": "0x7e8a52c68b243d3a86a55c04ccec2edc760252d5952566d3af4001bd6cf38f3", - "method": "enter_dungeon" - }, - { - "target": "0x7e8a52c68b243d3a86a55c04ccec2edc760252d5952566d3af4001bd6cf38f3", - "method": "upgrade" - }, - { - "target": "0x50b1497d463d52cbeb5919a35a82360ea6702db2b9c62c2d69c167995f34c08", - "method": "upgrade" - }, - { - "target": "0x4b41a2abaeff170f3a04acb0144790a5a812e25e7a735dfef959247cfeb527", - "method": "upgrade" - }, { "target": "0x52ee4d3cba58d1a0462bbfb6813bf5aa1b35078c3b859cded2b727c1d9469ea", "method": "uuid" @@ -127,6 +83,54 @@ "target": "0x52ee4d3cba58d1a0462bbfb6813bf5aa1b35078c3b859cded2b727c1d9469ea", "method": "upgrade" }, + { + "target": "0x50b1497d463d52cbeb5919a35a82360ea6702db2b9c62c2d69c167995f34c08", + "method": "upgrade" + }, + { + "target": "0x72a9f501c260b2d13f8988ea172680c5c1fdc085c5b44bdcac8477362ed5290", + "method": "upgrade" + }, + { + "target": "0x6bfba78b8f4f42da469860a95291c2fad959c91ea747e2062de763ff4e62c4a", + "method": "spawn" + }, + { + "target": "0x6bfba78b8f4f42da469860a95291c2fad959c91ea747e2062de763ff4e62c4a", + "method": "move" + }, + { + "target": "0x6bfba78b8f4f42da469860a95291c2fad959c91ea747e2062de763ff4e62c4a", + "method": "set_player_config" + }, + { + "target": "0x6bfba78b8f4f42da469860a95291c2fad959c91ea747e2062de763ff4e62c4a", + "method": "update_player_config_name" + }, + { + "target": "0x6bfba78b8f4f42da469860a95291c2fad959c91ea747e2062de763ff4e62c4a", + "method": "reset_player_config" + }, + { + "target": "0x6bfba78b8f4f42da469860a95291c2fad959c91ea747e2062de763ff4e62c4a", + "method": "set_player_server_profile" + }, + { + "target": "0x6bfba78b8f4f42da469860a95291c2fad959c91ea747e2062de763ff4e62c4a", + "method": "set_models" + }, + { + "target": "0x6bfba78b8f4f42da469860a95291c2fad959c91ea747e2062de763ff4e62c4a", + "method": "enter_dungeon" + }, + { + "target": "0x6bfba78b8f4f42da469860a95291c2fad959c91ea747e2062de763ff4e62c4a", + "method": "upgrade" + }, + { + "target": "0x4b41a2abaeff170f3a04acb0144790a5a812e25e7a735dfef959247cfeb527", + "method": "upgrade" + }, { "target": "0x2af9427c5a277474c079a1283c880ee8a6f0f8fbf73ce969c08d88befec1bba", "method": "__declare_transaction__" diff --git a/crates/torii/core/Cargo.toml b/crates/torii/core/Cargo.toml index b9c90fa17e..bec2fe9a90 100644 --- a/crates/torii/core/Cargo.toml +++ b/crates/torii/core/Cargo.toml @@ -23,7 +23,6 @@ dojo-world.workspace = true futures-channel = "0.3.0" futures-util.workspace = true hashlink.workspace = true -num-traits.workspace = true once_cell.workspace = true reqwest.workspace = true serde.workspace = true diff --git a/crates/torii/core/src/processors/mod.rs b/crates/torii/core/src/processors/mod.rs index 4d4c5c637d..edbde5d3c3 100644 --- a/crates/torii/core/src/processors/mod.rs +++ b/crates/torii/core/src/processors/mod.rs @@ -25,9 +25,6 @@ pub mod store_update_record; pub mod upgrade_event; pub mod upgrade_model; -const MODEL_INDEX: usize = 0; -const ENTITY_ID_INDEX: usize = 1; - #[derive(Clone, Debug, Default)] pub struct EventProcessorConfig { pub historical_events: HashSet, diff --git a/crates/torii/core/src/processors/store_update_member.rs b/crates/torii/core/src/processors/store_update_member.rs index 2dd28735ff..cac9a2af8b 100644 --- a/crates/torii/core/src/processors/store_update_member.rs +++ b/crates/torii/core/src/processors/store_update_member.rs @@ -1,22 +1,18 @@ use anyhow::{Context, Error, Result}; use async_trait::async_trait; use dojo_types::schema::{Struct, Ty}; -use dojo_world::contracts::naming; +use dojo_world::contracts::abigen::world::Event as WorldEvent; use dojo_world::contracts::world::WorldContractReader; -use num_traits::ToPrimitive; use starknet::core::types::Event; use starknet::core::utils::get_selector_from_name; use starknet::providers::Provider; -use tracing::{info, warn}; +use tracing::info; use super::{EventProcessor, EventProcessorConfig}; -use crate::processors::{ENTITY_ID_INDEX, MODEL_INDEX}; use crate::sql::Sql; pub(crate) const LOG_TARGET: &str = "torii_core::processors::store_update_member"; -const MEMBER_INDEX: usize = 2; - #[derive(Default, Debug)] pub struct StoreUpdateMemberProcessor; @@ -29,16 +25,7 @@ where "StoreUpdateMember".to_string() } - fn validate(&self, event: &Event) -> bool { - if event.keys.len() > 1 { - info!( - target: LOG_TARGET, - event_key = %>::event_key(self), - invalid_keys = %>::event_keys_as_string(self, event), - "Invalid event keys." - ); - return false; - } + fn validate(&self, _event: &Event) -> bool { true } @@ -52,13 +39,27 @@ where event: &Event, _config: &EventProcessorConfig, ) -> Result<(), Error> { - let model_id = event.data[MODEL_INDEX]; - let entity_id = event.data[ENTITY_ID_INDEX]; - let member_selector = event.data[MEMBER_INDEX]; + // Torii version is coupled to the world version, so we can expect the event to be well + // formed. + let event = match WorldEvent::try_from(event).unwrap_or_else(|_| { + panic!( + "Expected {} event to be well formed.", + >::event_key(self) + ) + }) { + WorldEvent::StoreUpdateMember(e) => e, + _ => { + unreachable!() + } + }; + + let model_selector = event.selector; + let entity_id = event.entity_id; + let member_selector = event.member_selector; // If the model does not exist, silently ignore it. // This can happen if only specific namespaces are indexed. - let model = match db.model(model_id).await { + let model = match db.model(model_selector).await { Ok(m) => m, Err(e) => { if e.to_string().contains("no rows") { @@ -90,30 +91,12 @@ where "Store update member.", ); - let values_start = MEMBER_INDEX + 1; - let values_end: usize = - values_start + event.data[values_start].to_usize().context("invalid usize")?; - - // Skip the length to only get the values as they will be deserialized. - let mut values = event.data[values_start + 1..=values_end].to_vec(); - - let tag = naming::get_tag(&model.namespace, &model.name); - - if !db.does_entity_exist(tag.clone(), entity_id).await? { - warn!( - target: LOG_TARGET, - tag, - entity_id = format!("{:#x}", entity_id), - "Entity not found, must be set before updating a member.", - ); - - return Ok(()); - } - + let mut values = event.values.to_vec(); member.ty.deserialize(&mut values)?; - let wrapped_ty = Ty::Struct(Struct { name: schema.name(), children: vec![member] }); - db.set_entity(wrapped_ty, event_id, block_timestamp, entity_id, model_id, None).await?; + let wrapped_ty = Ty::Struct(Struct { name: schema.name(), children: vec![member] }); + db.set_entity(wrapped_ty, event_id, block_timestamp, entity_id, model_selector, None) + .await?; Ok(()) } } diff --git a/crates/torii/core/src/sql/mod.rs b/crates/torii/core/src/sql/mod.rs index 783fd246b4..cbcd9c3638 100644 --- a/crates/torii/core/src/sql/mod.rs +++ b/crates/torii/core/src/sql/mod.rs @@ -511,15 +511,6 @@ impl Sql { self.model_cache.model(&selector).await.map_err(|e| e.into()) } - pub async fn does_entity_exist(&self, model: String, key: Felt) -> Result { - let sql = format!("SELECT COUNT(*) FROM [{model}] WHERE id = ?"); - - let count: i64 = - sqlx::query_scalar(&sql).bind(format!("{:#x}", key)).fetch_one(&self.pool).await?; - - Ok(count > 0) - } - pub async fn entities(&self, model: String) -> Result>> { let query = sqlx::query_as::<_, (i32, String, String)>("SELECT * FROM ?").bind(model); let mut conn: PoolConnection = self.pool.acquire().await?; diff --git a/crates/torii/core/src/sql/test.rs b/crates/torii/core/src/sql/test.rs index 7d79f3ba4a..42a603c539 100644 --- a/crates/torii/core/src/sql/test.rs +++ b/crates/torii/core/src/sql/test.rs @@ -2,7 +2,7 @@ use std::collections::HashMap; use std::str::FromStr; use std::sync::Arc; -use cainome::cairo_serde::ContractAddress; +use cainome::cairo_serde::{ByteArray, CairoSerde, ContractAddress}; use dojo_test_utils::compiler::CompilerTestSetup; use dojo_test_utils::migration::copy_spawn_and_move_db; use dojo_utils::{TransactionExt, TransactionWaiter, TxnConfig}; @@ -205,6 +205,115 @@ async fn test_load_from_remote(sequencer: &RunnerCtx) { assert_eq!(keys, format!("{:#x}/", account.address())); } +#[ignore = "This test is being flaky and need to find why. Sometimes it fails, sometimes it passes."] +#[tokio::test(flavor = "multi_thread")] +#[katana_runner::test(accounts = 10, db_dir = copy_spawn_and_move_db().as_str())] +async fn test_load_from_remote_update(sequencer: &RunnerCtx) { + let setup = CompilerTestSetup::from_examples("../../dojo/core", "../../../examples/"); + let config = setup.build_test_config("spawn-and-move", Profile::DEV); + + let ws = scarb::ops::read_workspace(config.manifest_path(), &config).unwrap(); + + let account = sequencer.account(0); + let provider = Arc::new(JsonRpcClient::new(HttpTransport::new(sequencer.url()))); + + let world_local = ws.load_world_local().unwrap(); + let world_address = world_local.deterministic_world_address().unwrap(); + let actions_address = world_local + .get_contract_address_local(compute_selector_from_names("ns", "actions")) + .unwrap(); + + let world = WorldContract::new(world_address, &account); + + let res = world + .grant_writer(&compute_bytearray_hash("ns"), &ContractAddress(actions_address)) + .send_with_cfg(&TxnConfig::init_wait()) + .await + .unwrap(); + + TransactionWaiter::new(res.transaction_hash, &provider).await.unwrap(); + + // spawn + let res = account + .execute_v1(vec![Call { + to: actions_address, + selector: get_selector_from_name("spawn").unwrap(), + calldata: vec![], + }]) + .send_with_cfg(&TxnConfig::init_wait()) + .await + .unwrap(); + + TransactionWaiter::new(res.transaction_hash, &provider).await.unwrap(); + + // Set player config. + let res = account + .execute_v1(vec![Call { + to: actions_address, + selector: get_selector_from_name("set_player_config").unwrap(), + // Empty ByteArray. + calldata: vec![Felt::ZERO, Felt::ZERO, Felt::ZERO], + }]) + .send_with_cfg(&TxnConfig::init_wait()) + .await + .unwrap(); + + TransactionWaiter::new(res.transaction_hash, &provider).await.unwrap(); + + let name = ByteArray::from_string("mimi").unwrap(); + let res = account + .execute_v1(vec![Call { + to: actions_address, + selector: get_selector_from_name("update_player_config_name").unwrap(), + calldata: ByteArray::cairo_serialize(&name), + }]) + .send_with_cfg(&TxnConfig::init_wait()) + .await + .unwrap(); + + TransactionWaiter::new(res.transaction_hash, &provider).await.unwrap(); + + let world_reader = WorldContractReader::new(world_address, Arc::clone(&provider)); + + let tempfile = NamedTempFile::new().unwrap(); + let path = tempfile.path().to_string_lossy(); + let options = SqliteConnectOptions::from_str(&path).unwrap().create_if_missing(true); + let pool = SqlitePoolOptions::new().connect_with(options).await.unwrap(); + sqlx::migrate!("../migrations").run(&pool).await.unwrap(); + + let (shutdown_tx, _) = broadcast::channel(1); + let (mut executor, sender) = + Executor::new(pool.clone(), shutdown_tx.clone(), Arc::clone(&provider), 100).await.unwrap(); + tokio::spawn(async move { + executor.run().await.unwrap(); + }); + + let model_cache = Arc::new(ModelCache::new(pool.clone())); + let db = Sql::new( + pool.clone(), + sender.clone(), + &[Contract { address: world_reader.address, r#type: ContractType::WORLD }], + model_cache.clone(), + ) + .await + .unwrap(); + + let _ = bootstrap_engine(world_reader, db.clone(), Arc::clone(&provider)).await.unwrap(); + + let name: String = sqlx::query_scalar( + format!( + "SELECT name FROM [ns-PlayerConfig] WHERE internal_id = '{:#x}'", + poseidon_hash_many(&[account.address()]) + ) + .as_str(), + ) + .fetch_one(&pool) + .await + .unwrap(); + + assert_eq!(name, "mimi"); +} + #[ignore = "This test is being flaky and need to find why. Sometimes it fails, sometimes it passes."] #[tokio::test(flavor = "multi_thread")] #[katana_runner::test(accounts = 10, db_dir = copy_spawn_and_move_db().as_str())] diff --git a/crates/torii/types-test/Scarb.lock b/crates/torii/types-test/Scarb.lock index 2197d440fb..b298ae6561 100644 --- a/crates/torii/types-test/Scarb.lock +++ b/crates/torii/types-test/Scarb.lock @@ -14,7 +14,7 @@ version = "2.8.4" [[package]] name = "types_test" -version = "1.0.5" +version = "1.0.9" dependencies = [ "dojo", ] diff --git a/examples/simple/Scarb.lock b/examples/simple/Scarb.lock index d5dfe49119..09def408e1 100644 --- a/examples/simple/Scarb.lock +++ b/examples/simple/Scarb.lock @@ -3,7 +3,7 @@ version = 1 [[package]] name = "dojo" -version = "1.0.5" +version = "1.0.9" dependencies = [ "dojo_plugin", ] diff --git a/examples/spawn-and-move/Scarb.lock b/examples/spawn-and-move/Scarb.lock index 446c733bdf..aadeffbf77 100644 --- a/examples/spawn-and-move/Scarb.lock +++ b/examples/spawn-and-move/Scarb.lock @@ -31,7 +31,7 @@ dependencies = [ [[package]] name = "dojo_examples" -version = "1.0.8" +version = "1.0.9" dependencies = [ "armory", "bestiary", diff --git a/examples/spawn-and-move/manifest_dev.json b/examples/spawn-and-move/manifest_dev.json index 057ee7d64d..fec6bf6d76 100644 --- a/examples/spawn-and-move/manifest_dev.json +++ b/examples/spawn-and-move/manifest_dev.json @@ -1252,8 +1252,8 @@ }, "contracts": [ { - "address": "0x7e8a52c68b243d3a86a55c04ccec2edc760252d5952566d3af4001bd6cf38f3", - "class_hash": "0x636c2cf31b094097625cb5ada96f54ee9a3f7bc6d8cde00cc85e5ef0c622c8b", + "address": "0x6bfba78b8f4f42da469860a95291c2fad959c91ea747e2062de763ff4e62c4a", + "class_hash": "0x3e65d56b082c47e9e0952503424bcf6956ddd6d5faff40dd9900ea787d89c6", "abi": [ { "type": "impl", @@ -1399,6 +1399,18 @@ "outputs": [], "state_mutability": "external" }, + { + "type": "function", + "name": "update_player_config_name", + "inputs": [ + { + "name": "name", + "type": "core::byte_array::ByteArray" + } + ], + "outputs": [], + "state_mutability": "external" + }, { "type": "function", "name": "get_player_position", @@ -1585,6 +1597,7 @@ "spawn", "move", "set_player_config", + "update_player_config_name", "reset_player_config", "set_player_server_profile", "set_models", diff --git a/examples/spawn-and-move/src/actions.cairo b/examples/spawn-and-move/src/actions.cairo index 95c8d4a4d5..cd116a2255 100644 --- a/examples/spawn-and-move/src/actions.cairo +++ b/examples/spawn-and-move/src/actions.cairo @@ -5,6 +5,7 @@ pub trait IActions { fn spawn(ref self: T); fn move(ref self: T, direction: Direction); fn set_player_config(ref self: T, name: ByteArray); + fn update_player_config_name(ref self: T, name: ByteArray); fn get_player_position(self: @T) -> Position; fn reset_player_config(ref self: T); fn set_player_server_profile(ref self: T, server_id: u32, name: ByteArray); @@ -22,7 +23,7 @@ pub mod actions { Position, Moves, MovesValue, Direction, Vec2, PlayerConfig, PlayerItem, ServerProfile, }; use dojo_examples::utils::next_position; - use dojo::model::{ModelStorage, ModelValueStorage}; + use dojo::model::{ModelStorage, ModelValueStorage, Model}; use dojo::event::EventStorage; // Features can be used on modules, structs, trait and `use`. Not inside @@ -131,6 +132,17 @@ pub mod actions { world.write_model(@config); } + fn update_player_config_name(ref self: ContractState, name: ByteArray) { + let mut world = self.world_default(); + let player = get_caller_address(); + + // Don't need to read the model here, we directly overwrite the member "name". + world + .write_member( + Model::::ptr_from_keys(player), selector!("name"), name + ); + } + fn reset_player_config(ref self: ContractState) { let player = get_caller_address(); let mut world = self.world_default(); diff --git a/spawn-and-move-db.tar.gz b/spawn-and-move-db.tar.gz index 8f02dc10d4..db935cfd44 100644 Binary files a/spawn-and-move-db.tar.gz and b/spawn-and-move-db.tar.gz differ diff --git a/types-test-db.tar.gz b/types-test-db.tar.gz index a6b2f3cd82..9fb1a5c0d2 100644 Binary files a/types-test-db.tar.gz and b/types-test-db.tar.gz differ