diff --git a/crates/dojo/core/src/event/event.cairo b/crates/dojo/core/src/event/event.cairo index ce3e521f87..c5912b3fee 100644 --- a/crates/dojo/core/src/event/event.cairo +++ b/crates/dojo/core/src/event/event.cairo @@ -10,6 +10,7 @@ pub struct EventDef { } pub trait EventDefinition { + const NAME_HASH: felt252; fn name() -> ByteArray; } @@ -47,6 +48,6 @@ pub impl EventImpl, +EventDefinition, +Serde, +Introspe ModelParser::::serialize_values(self) } fn selector(namespace_hash: felt252) -> felt252 { - dojo::utils::selector_from_namespace_and_name(namespace_hash, @Self::name()) + dojo::utils::selector_from_hashes(namespace_hash, EventDefinition::::NAME_HASH) } } diff --git a/crates/dojo/core/src/model/definition.cairo b/crates/dojo/core/src/model/definition.cairo index 91b2a53fb4..b011ae1611 100644 --- a/crates/dojo/core/src/model/definition.cairo +++ b/crates/dojo/core/src/model/definition.cairo @@ -19,6 +19,7 @@ pub enum ModelIndex { /// /// Definition of the model containing all the fields that makes up a model. pub trait ModelDefinition { + const NAME_HASH: felt252; fn name() -> ByteArray; fn layout() -> Layout; fn use_legacy_storage() -> bool; diff --git a/crates/dojo/core/src/model/model.cairo b/crates/dojo/core/src/model/model.cairo index 8cac8fe87a..6ebf8dd3c4 100644 --- a/crates/dojo/core/src/model/model.cairo +++ b/crates/dojo/core/src/model/model.cairo @@ -139,7 +139,7 @@ pub impl ModelImpl, +ModelDefinition, +Serde, +Drop> } fn selector(namespace_hash: felt252) -> felt252 { - dojo::utils::selector_from_namespace_and_name(namespace_hash, @Self::name()) + dojo::utils::selector_from_hashes(namespace_hash, ModelDefinition::::NAME_HASH) } fn layout() -> Layout { diff --git a/crates/dojo/core/src/model/model_value.cairo b/crates/dojo/core/src/model/model_value.cairo index 831de21732..49f88e5fa3 100644 --- a/crates/dojo/core/src/model/model_value.cairo +++ b/crates/dojo/core/src/model/model_value.cairo @@ -51,6 +51,6 @@ pub impl ModelValueImpl, +ModelDefinition, +ModelValueParser> } fn selector(namespace_hash: felt252) -> felt252 { - dojo::utils::selector_from_namespace_and_name(namespace_hash, @Self::name()) + dojo::utils::selector_from_hashes(namespace_hash, ModelDefinition::::NAME_HASH) } } diff --git a/crates/dojo/macros/src/attributes/event.rs b/crates/dojo/macros/src/attributes/event.rs index 32db2fa352..a632813f93 100644 --- a/crates/dojo/macros/src/attributes/event.rs +++ b/crates/dojo/macros/src/attributes/event.rs @@ -2,6 +2,7 @@ use cairo_lang_macro::{quote, Diagnostic, ProcMacroResult, TokenStream}; use cairo_lang_parser::utils::SimpleParserDatabase; use cairo_lang_syntax::node::helpers::QueryAttrs; use cairo_lang_syntax::node::{ast, TypedSyntaxNode}; +use dojo_types::naming; use crate::constants::{DOJO_INTROSPECT_DERIVE, DOJO_PACKED_DERIVE, EXPECTED_DERIVE_ATTR_NAMES}; use crate::helpers::{ @@ -12,6 +13,7 @@ use crate::helpers::{ pub struct DojoEvent { diagnostics: Vec, event_name: String, + name_hash: String, members_values: Vec, serialized_keys: Vec, serialized_values: Vec, @@ -24,6 +26,7 @@ impl DojoEvent { Self { diagnostics: vec![], event_name: String::default(), + name_hash: String::default(), members_values: vec![], serialized_keys: vec![], serialized_values: vec![], @@ -46,6 +49,7 @@ impl DojoEvent { let mut event = DojoEvent::new(); event.event_name = struct_ast.name(db).as_syntax_node().get_text(db).trim().to_string(); + event.name_hash = naming::compute_bytearray_hash(&event.event_name).to_hex_string(); if let Some(failure) = DojoChecker::is_name_valid("event", &event.event_name) { return failure; @@ -157,6 +161,7 @@ impl DojoEvent { fn generate_event_code(&self) -> TokenStream { let ( type_name, + name_hash, members_values, serialized_keys, serialized_values, @@ -164,6 +169,7 @@ impl DojoEvent { unique_hash, ) = ( &self.event_name, + &self.name_hash, self.members_values.join("\n"), self.serialized_keys.join("\n"), self.serialized_values.join("\n"), @@ -182,6 +188,8 @@ pub struct {type_name}Value {{ }} pub impl {type_name}Definition of dojo::event::EventDefinition<{type_name}> {{ + const NAME_HASH: felt252 = {name_hash}; + #[inline(always)] fn name() -> ByteArray {{ \"{type_name}\" diff --git a/crates/dojo/macros/src/attributes/model.rs b/crates/dojo/macros/src/attributes/model.rs index d6bca1f0b1..d95061423f 100644 --- a/crates/dojo/macros/src/attributes/model.rs +++ b/crates/dojo/macros/src/attributes/model.rs @@ -4,6 +4,7 @@ use cairo_lang_macro::{quote, Diagnostic, ProcMacroResult, TokenStream}; use cairo_lang_parser::utils::SimpleParserDatabase; use cairo_lang_syntax::node::helpers::QueryAttrs; use cairo_lang_syntax::node::{ast, TypedSyntaxNode}; +use dojo_types::naming; use crate::constants::{ DOJO_INTROSPECT_DERIVE, DOJO_LEGACY_STORAGE_DERIVE, DOJO_PACKED_DERIVE, @@ -17,6 +18,8 @@ use crate::helpers::{ #[derive(Debug)] pub struct DojoModel { diagnostics: Vec, + name_hash: String, + model_type: String, model_value_derive_attr_names: Vec, members_values: Vec, @@ -37,6 +40,7 @@ impl DojoModel { Self { diagnostics: vec![], model_type: String::default(), + name_hash: String::default(), model_value_derive_attr_names: vec![], members_values: vec![], key_type: String::default(), @@ -65,6 +69,7 @@ impl DojoModel { let mut model = DojoModel::new(); model.model_type = struct_ast.name(db).as_syntax_node().get_text(db).trim().to_string(); + model.name_hash = naming::compute_bytearray_hash(&model.model_type).to_hex_string(); if let Some(failure) = DojoChecker::is_name_valid("model", &model.model_type) { return failure; @@ -255,6 +260,7 @@ impl DojoModel { fn generate_model_code(&self) -> TokenStream { let ( model_type, + name_hash, model_value_derive_attr_names, members_values, key_type, @@ -269,6 +275,7 @@ impl DojoModel { deserialized_modelvalue, ) = ( &self.model_type, + &self.name_hash, format!("#[derive({})]", self.model_value_derive_attr_names.join(", ")), self.members_values.join(""), &self.key_type, @@ -307,6 +314,8 @@ impl {model_type}ModelValueKey of dojo::model::model_value::ModelValueKey<{model pub mod m_{model_type}_definition {{ use super::{model_type}; pub impl {model_type}DefinitionImpl of dojo::model::ModelDefinition{{ + const NAME_HASH: felt252 = {name_hash}; + #[inline(always)] fn name() -> ByteArray {{ \"{model_type}\" diff --git a/examples/benchmark/Scarb.lock b/examples/benchmark/Scarb.lock index 8d5a212b90..a4d8dc178d 100644 --- a/examples/benchmark/Scarb.lock +++ b/examples/benchmark/Scarb.lock @@ -3,7 +3,7 @@ version = 1 [[package]] name = "dojo" -version = "1.6.0-alpha.0" +version = "1.6.0-alpha.1" dependencies = [ "dojo_macros", ] @@ -19,11 +19,11 @@ dependencies = [ [[package]] name = "dojo_cairo_test" -version = "1.6.0" +version = "1.6.0-alpha.1" dependencies = [ "dojo", ] [[package]] name = "dojo_macros" -version = "1.6.0" +version = "1.6.0-alpha.1" diff --git a/examples/benchmark/src/model.cairo b/examples/benchmark/src/model.cairo index 11db1eb549..d002f0585b 100644 --- a/examples/benchmark/src/model.cairo +++ b/examples/benchmark/src/model.cairo @@ -234,7 +234,6 @@ fn read_sextuple_schema_large() { fn read_sextuple_member_large() { let mut world = spawn_foo_world(); world.write_model(@LARGE); - let v0: felt252 = world.read_member(LARGE.ptr(), selector!("v0")); let v1: felt252 = world.read_member(LARGE.ptr(), selector!("v1")); let v2: felt252 = world.read_member(LARGE.ptr(), selector!("v2")); diff --git a/spawn-and-move-db.tar.gz b/spawn-and-move-db.tar.gz index da5a09c0be..073298a569 100644 Binary files a/spawn-and-move-db.tar.gz and b/spawn-and-move-db.tar.gz differ