From 8ad67d13635a000ec0d2aa9369f03c0f2dd7dbcb Mon Sep 17 00:00:00 2001 From: Nasr Date: Tue, 2 Apr 2024 12:54:47 -0400 Subject: [PATCH 1/5] feat: type data encode & key metadata on model members --- dojo.h | 36 +++++++++++++++++++----------------- src/c/mod.rs | 21 +++++++++++++++++++++ src/wasm/mod.rs | 43 +++++++++++++++++++++++++++++-------------- src/wasm/utils.rs | 15 +++++++++------ 4 files changed, 78 insertions(+), 37 deletions(-) diff --git a/dojo.h b/dojo.h index 3cdd243..659fcab 100644 --- a/dojo.h +++ b/dojo.h @@ -437,6 +437,23 @@ typedef struct Resultbool { }; } Resultbool; +typedef enum ResultFieldElement_Tag { + OkFieldElement, + ErrFieldElement, +} ResultFieldElement_Tag; + +typedef struct ResultFieldElement { + ResultFieldElement_Tag tag; + union { + struct { + struct FieldElement ok; + }; + struct { + struct Error err; + }; + }; +} ResultFieldElement; + typedef enum ResultSignature_Tag { OkSignature, ErrSignature, @@ -535,23 +552,6 @@ typedef struct BlockId { }; } BlockId; -typedef enum ResultFieldElement_Tag { - OkFieldElement, - ErrFieldElement, -} ResultFieldElement_Tag; - -typedef struct ResultFieldElement { - ResultFieldElement_Tag tag; - union { - struct { - struct FieldElement ok; - }; - struct { - struct Error err; - }; - }; -} ResultFieldElement; - #ifdef __cplusplus extern "C" { #endif // __cplusplus @@ -593,6 +593,8 @@ struct Resultbool client_remove_models_to_sync(struct ToriiClient *client, const struct KeysClause *models, uintptr_t models_len); +struct ResultFieldElement typed_data_encode(const char *typed_data, struct FieldElement address); + struct FieldElement signing_key_new(void); struct ResultSignature signing_key_sign(struct FieldElement private_key, struct FieldElement hash); diff --git a/src/c/mod.rs b/src/c/mod.rs index 7833d8d..c52429e 100644 --- a/src/c/mod.rs +++ b/src/c/mod.rs @@ -271,6 +271,27 @@ pub unsafe extern "C" fn client_remove_models_to_sync( } } +#[no_mangle] +#[allow(clippy::missing_safety_doc)] +pub unsafe extern "C" fn typed_data_encode( + typed_data: *const c_char, + address: types::FieldElement, +) -> Result { + let typed_data = unsafe { CStr::from_ptr(typed_data).to_string_lossy().into_owned() }; + let typed_data = match serde_json::from_str::(typed_data.as_str()) { + Ok(typed_data) => typed_data, + Err(err) => return Result::Err(Error { message: CString::new(format!("Invalid typed data: {}", err)).unwrap().into_raw() }), + }; + + let address = (&address).into(); + let encoded = match typed_data.encode(address) { + Ok(encoded) => encoded, + Err(err) => return Result::Err(err.into()), + }; + + Result::Ok((&encoded).into()) +} + #[no_mangle] #[allow(clippy::missing_safety_doc)] pub unsafe extern "C" fn signing_key_new() -> types::FieldElement { diff --git a/src/wasm/mod.rs b/src/wasm/mod.rs index 949643b..9da1fe5 100644 --- a/src/wasm/mod.rs +++ b/src/wasm/mod.rs @@ -18,6 +18,7 @@ use starknet::providers::jsonrpc::HttpTransport; use starknet::providers::{JsonRpcClient, Provider as _}; use starknet::signers::{LocalWallet, SigningKey, VerifyingKey}; use starknet_crypto::Signature; +use torii_relay::typed_data::TypedData; use torii_relay::types::Message; use tsify::Tsify; use wasm_bindgen::prelude::*; @@ -371,6 +372,20 @@ impl From<&Primitive> for dojo_types::primitive::Primitive { } } +#[wasm_bindgen(js_name = typedDataEncode)] +pub fn typed_data_encode(typed_data: String, address: &str) -> Result { + let typed_data = serde_json::from_str::(&typed_data) + .map_err(|err| JsValue::from(format!("failed to parse typed data: {err}")))?; + + let address = FieldElement::from_str(&address) + .map_err(|err| JsValue::from(format!("failed to parse address: {err}")))?; + + typed_data + .encode(address) + .map(|felt| format!("{:#x}", felt)) + .map_err(|err| JsValue::from(err.to_string())) +} + #[wasm_bindgen(js_name = signingKeyNew)] pub fn signing_key_new() -> String { let private_key: SigningKey = SigningKey::from_random(); @@ -380,12 +395,12 @@ pub fn signing_key_new() -> String { #[wasm_bindgen(js_name = signingKeySign)] pub fn signing_key_sign(private_key: &str, hash: &str) -> Result { - let private_key = FieldElement::from_hex_be(private_key); + let private_key = FieldElement::from_str(private_key); if let Err(e) = private_key { return Err(JsValue::from(format!("failed to parse private key: {e}"))); } - let hash = FieldElement::from_hex_be(hash); + let hash = FieldElement::from_str(hash); if let Err(e) = hash { return Err(JsValue::from(format!("failed to parse hash: {e}"))); } @@ -401,7 +416,7 @@ pub fn signing_key_sign(private_key: &str, hash: &str) -> Result Result { - let signing_key = FieldElement::from_hex_be(signing_key); + let signing_key = FieldElement::from_str(signing_key); if let Err(e) = signing_key { return Err(JsValue::from(format!("failed to parse signing key: {e}"))); } @@ -417,14 +432,14 @@ pub fn verifying_key_verify( hash: &str, signature: JsSignature, ) -> Result { - let verifying_key = FieldElement::from_hex_be(verifying_key); + let verifying_key = FieldElement::from_str(verifying_key); if let Err(e) = verifying_key { return Err(JsValue::from(format!("failed to parse verifying key: {e}"))); } let verifying_key = VerifyingKey::from_scalar(verifying_key.unwrap()); - let hash = FieldElement::from_hex_be(hash); + let hash = FieldElement::from_str(hash); if let Err(e) = hash { return Err(JsValue::from(format!("failed to parse hash: {e}"))); } @@ -460,14 +475,14 @@ impl Provider { private_key: &str, address: &str, ) -> Result { - let private_key = FieldElement::from_hex_be(private_key); + let private_key = FieldElement::from_str(private_key); if let Err(e) = private_key { return Err(JsValue::from(format!("failed to parse private key: {e}"))); } let private_key = private_key.unwrap(); - let address = FieldElement::from_hex_be(address); + let address = FieldElement::from_str(address); if let Err(e) = address { return Err(JsValue::from(format!("failed to parse address: {e}"))); } @@ -514,7 +529,7 @@ impl Provider { #[wasm_bindgen(js_name = waitForTransaction)] pub async unsafe fn wait_for_transaction(&self, txn_hash: &str) -> Result { - let txn_hash = FieldElement::from_hex_be(txn_hash) + let txn_hash = FieldElement::from_str(txn_hash) .map_err(|err| JsValue::from(format!("failed to parse transaction hash: {err}")))?; let result: Result<(), anyhow::Error> = watch_tx(&self.0, txn_hash).await; @@ -541,7 +556,7 @@ impl Account { #[wasm_bindgen(js_name = setBlockId)] pub unsafe fn set_block_id(&mut self, block_id: String) -> Result<(), JsValue> { - let block_id = FieldElement::from_hex_be(&block_id) + let block_id = FieldElement::from_str(&block_id) .map_err(|err| JsValue::from(format!("failed to parse block id: {err}")))?; self.0 .set_block_id(starknet::core::types::BlockId::Hash(block_id)); @@ -616,17 +631,17 @@ pub fn hash_get_contract_address( constructor_calldata: Vec, deployer_address: &str, ) -> Result { - let class_hash = FieldElement::from_hex_be(class_hash) + let class_hash = FieldElement::from_str(class_hash) .map_err(|err| JsValue::from(format!("failed to parse class hash: {err}")))?; - let salt = FieldElement::from_hex_be(salt) + let salt = FieldElement::from_str(salt) .map_err(|err| JsValue::from(format!("failed to parse salt: {err}")))?; - let deployer_address = FieldElement::from_hex_be(deployer_address) + let deployer_address = FieldElement::from_str(deployer_address) .map_err(|err| JsValue::from(format!("failed to parse deployer address: {err}")))?; let constructor_calldata = constructor_calldata .into_iter() .map(|c| { - FieldElement::from_hex_be(c.as_str()).map_err(|err| { + FieldElement::from_str(c.as_str()).map_err(|err| { JsValue::from(format!("failed to parse constructor calldata: {err}")) }) }) @@ -678,7 +693,7 @@ impl Client { }) .await { - Ok(Some(ty)) => Ok(js_sys::JSON::parse(&parse_ty_as_json_str(&ty).to_string())?), + Ok(Some(ty)) => Ok(js_sys::JSON::parse(&parse_ty_as_json_str(&ty, false).to_string())?), Ok(None) => Ok(JsValue::NULL), Err(err) => Err(JsValue::from(format!("failed to get entity: {err}"))), diff --git a/src/wasm/utils.rs b/src/wasm/utils.rs index d142f66..0e3f99d 100644 --- a/src/wasm/utils.rs +++ b/src/wasm/utils.rs @@ -14,7 +14,7 @@ pub fn parse_entities_as_json_str(entities: Vec) -> Value { let model_map = model .members .iter() - .map(|member| (member.name.to_owned(), parse_ty_as_json_str(&member.ty))) + .map(|member| (member.name.to_owned(), parse_ty_as_json_str(&member.ty, member.key))) .collect::>(); (model.name, model_map.into()) @@ -27,11 +27,12 @@ pub fn parse_entities_as_json_str(entities: Vec) -> Value { .into() } -pub fn parse_ty_as_json_str(ty: &Ty) -> Value { +pub fn parse_ty_as_json_str(ty: &Ty, key: bool) -> Value { match ty { Ty::Primitive(primitive) => serde_json::json!({ "type": primitive.to_string(), - "value": primitive_value_json(*primitive) + "value": primitive_value_json(*primitive), + "key": key, }), Ty::Struct(struct_ty) => serde_json::json!({ @@ -39,8 +40,9 @@ pub fn parse_ty_as_json_str(ty: &Ty) -> Value { "value": struct_ty .children .iter() - .map(|child| (child.name.to_owned(), parse_ty_as_json_str(&child.ty))) - .collect::>() + .map(|child| (child.name.to_owned(), parse_ty_as_json_str(&child.ty, child.key))) + .collect::>(), + "key": key, }), Ty::Enum(enum_ty) => serde_json::json!({ @@ -49,7 +51,8 @@ pub fn parse_ty_as_json_str(ty: &Ty) -> Value { option.into() } else { Value::Null - } + }, + "key": key, }), Ty::Tuple(_) => unimplemented!("tuple not supported"), From 9b19c7ec35bd30aa42bd0fe0367ac912226f2093 Mon Sep 17 00:00:00 2001 From: Nasr Date: Wed, 3 Apr 2024 11:18:58 -0400 Subject: [PATCH 2/5] feat: run relay --- Cargo.lock | 206 ++++++++++++++++++++++++++++++++++-------------- example/main.c | 59 ++++++++------ src/c/mod.rs | 19 +++-- src/wasm/mod.rs | 10 +-- 4 files changed, 202 insertions(+), 92 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 9efdb25..4f73ca8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -336,8 +336,24 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f6fd5ddaf0351dff5b8da21b2fb4ff8e08ddd02857f0bf69c47639106c0fff0" dependencies = [ - "asn1-rs-derive", - "asn1-rs-impl", + "asn1-rs-derive 0.4.0", + "asn1-rs-impl 0.1.0", + "displaydoc", + "nom", + "num-traits 0.2.18", + "rusticata-macros", + "thiserror", + "time", +] + +[[package]] +name = "asn1-rs" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22ad1373757efa0f70ec53939aabc7152e1591cb485208052993070ac8d2429d" +dependencies = [ + "asn1-rs-derive 0.5.0", + "asn1-rs-impl 0.2.0", "displaydoc", "nom", "num-traits 0.2.18", @@ -355,7 +371,19 @@ dependencies = [ "proc-macro2", "quote", "syn 1.0.109", - "synstructure", + "synstructure 0.12.6", +] + +[[package]] +name = "asn1-rs-derive" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7378575ff571966e99a744addeff0bff98b8ada0dedf1956d59e634db95eaac1" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.57", + "synstructure 0.13.1", ] [[package]] @@ -369,6 +397,17 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "asn1-rs-impl" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b18050c2cd6fe86c3a76584ef5e0baf286d038cda203eb6223df2cc413565f7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.57", +] + [[package]] name = "assert_matches" version = "1.5.0" @@ -2240,7 +2279,21 @@ version = "8.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dbd676fbbab537128ef0278adb5576cf363cff6aa22a7b24effe97347cfab61e" dependencies = [ - "asn1-rs", + "asn1-rs 0.5.2", + "displaydoc", + "nom", + "num-bigint", + "num-traits 0.2.18", + "rusticata-macros", +] + +[[package]] +name = "der-parser" +version = "9.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5cd0a5c643689626bec213c4d8bd4d96acc8ffdb4ad4bb6bc16abf27d5f4b553" +dependencies = [ + "asn1-rs 0.6.1", "displaydoc", "nom", "num-bigint", @@ -2402,8 +2455,8 @@ dependencies = [ [[package]] name = "dojo-bindgen" -version = "0.6.0-alpha.10" -source = "git+https://github.com/dojoengine/dojo#b952d0fa881283c612f8945ea00b2d26aa456517" +version = "0.6.0-alpha.12" +source = "git+https://github.com/dojoengine/dojo#c2280feaf9567cd0727a6e7d93e67c173a66356b" dependencies = [ "async-trait", "cainome 0.1.5", @@ -2448,8 +2501,8 @@ dependencies = [ [[package]] name = "dojo-lang" -version = "0.6.0-alpha.10" -source = "git+https://github.com/dojoengine/dojo#b952d0fa881283c612f8945ea00b2d26aa456517" +version = "0.6.0-alpha.12" +source = "git+https://github.com/dojoengine/dojo#c2280feaf9567cd0727a6e7d93e67c173a66356b" dependencies = [ "anyhow", "cairo-lang-compiler", @@ -2493,8 +2546,8 @@ dependencies = [ [[package]] name = "dojo-types" -version = "0.6.0-alpha.10" -source = "git+https://github.com/dojoengine/dojo#b952d0fa881283c612f8945ea00b2d26aa456517" +version = "0.6.0-alpha.12" +source = "git+https://github.com/dojoengine/dojo#c2280feaf9567cd0727a6e7d93e67c173a66356b" dependencies = [ "crypto-bigint", "hex", @@ -2509,8 +2562,8 @@ dependencies = [ [[package]] name = "dojo-world" -version = "0.6.0-alpha.10" -source = "git+https://github.com/dojoengine/dojo#b952d0fa881283c612f8945ea00b2d26aa456517" +version = "0.6.0-alpha.12" +source = "git+https://github.com/dojoengine/dojo#c2280feaf9567cd0727a6e7d93e67c173a66356b" dependencies = [ "anyhow", "async-trait", @@ -4061,9 +4114,9 @@ dependencies = [ [[package]] name = "good_lp" -version = "1.7.0" +version = "1.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa124423ded10046a849fa0ae9747c541895557f1af177e0890b09879e7e9e7d" +checksum = "ef62372af3ab5b335ee1fca8ae7fb08da1c4aee777d9b6b740fa49cb74d905ac" dependencies = [ "fnv", "minilp", @@ -4979,7 +5032,7 @@ dependencies = [ [[package]] name = "libp2p" version = "0.54.0" -source = "git+https://github.com/libp2p/rust-libp2p#367d2a12bfc8a43c722e6139a98bbbfcd164401d" +source = "git+https://github.com/libp2p/rust-libp2p#9785dcae9c8634dc6dcd91a07553a9d7b13d8e86" dependencies = [ "bytes", "either", @@ -5013,7 +5066,7 @@ dependencies = [ [[package]] name = "libp2p-allow-block-list" version = "0.3.0" -source = "git+https://github.com/libp2p/rust-libp2p#367d2a12bfc8a43c722e6139a98bbbfcd164401d" +source = "git+https://github.com/libp2p/rust-libp2p#9785dcae9c8634dc6dcd91a07553a9d7b13d8e86" dependencies = [ "libp2p-core 0.41.2 (git+https://github.com/libp2p/rust-libp2p)", "libp2p-identity", @@ -5024,7 +5077,7 @@ dependencies = [ [[package]] name = "libp2p-connection-limits" version = "0.3.1" -source = "git+https://github.com/libp2p/rust-libp2p#367d2a12bfc8a43c722e6139a98bbbfcd164401d" +source = "git+https://github.com/libp2p/rust-libp2p#9785dcae9c8634dc6dcd91a07553a9d7b13d8e86" dependencies = [ "libp2p-core 0.41.2 (git+https://github.com/libp2p/rust-libp2p)", "libp2p-identity", @@ -5063,7 +5116,7 @@ dependencies = [ [[package]] name = "libp2p-core" version = "0.41.2" -source = "git+https://github.com/libp2p/rust-libp2p#367d2a12bfc8a43c722e6139a98bbbfcd164401d" +source = "git+https://github.com/libp2p/rust-libp2p#9785dcae9c8634dc6dcd91a07553a9d7b13d8e86" dependencies = [ "either", "fnv", @@ -5090,7 +5143,7 @@ dependencies = [ [[package]] name = "libp2p-dns" version = "0.41.1" -source = "git+https://github.com/libp2p/rust-libp2p#367d2a12bfc8a43c722e6139a98bbbfcd164401d" +source = "git+https://github.com/libp2p/rust-libp2p#9785dcae9c8634dc6dcd91a07553a9d7b13d8e86" dependencies = [ "async-trait", "futures", @@ -5136,7 +5189,7 @@ dependencies = [ [[package]] name = "libp2p-gossipsub" version = "0.46.1" -source = "git+https://github.com/libp2p/rust-libp2p#367d2a12bfc8a43c722e6139a98bbbfcd164401d" +source = "git+https://github.com/libp2p/rust-libp2p#9785dcae9c8634dc6dcd91a07553a9d7b13d8e86" dependencies = [ "asynchronous-codec", "base64 0.21.7", @@ -5166,7 +5219,7 @@ dependencies = [ [[package]] name = "libp2p-identify" version = "0.44.2" -source = "git+https://github.com/libp2p/rust-libp2p#367d2a12bfc8a43c722e6139a98bbbfcd164401d" +source = "git+https://github.com/libp2p/rust-libp2p#9785dcae9c8634dc6dcd91a07553a9d7b13d8e86" dependencies = [ "asynchronous-codec", "either", @@ -5206,7 +5259,7 @@ dependencies = [ [[package]] name = "libp2p-mdns" version = "0.45.1" -source = "git+https://github.com/libp2p/rust-libp2p#367d2a12bfc8a43c722e6139a98bbbfcd164401d" +source = "git+https://github.com/libp2p/rust-libp2p#9785dcae9c8634dc6dcd91a07553a9d7b13d8e86" dependencies = [ "data-encoding", "futures", @@ -5226,7 +5279,7 @@ dependencies = [ [[package]] name = "libp2p-metrics" version = "0.14.1" -source = "git+https://github.com/libp2p/rust-libp2p#367d2a12bfc8a43c722e6139a98bbbfcd164401d" +source = "git+https://github.com/libp2p/rust-libp2p#9785dcae9c8634dc6dcd91a07553a9d7b13d8e86" dependencies = [ "futures", "instant", @@ -5244,7 +5297,7 @@ dependencies = [ [[package]] name = "libp2p-noise" version = "0.44.0" -source = "git+https://github.com/libp2p/rust-libp2p#367d2a12bfc8a43c722e6139a98bbbfcd164401d" +source = "git+https://github.com/libp2p/rust-libp2p#9785dcae9c8634dc6dcd91a07553a9d7b13d8e86" dependencies = [ "asynchronous-codec", "bytes", @@ -5269,7 +5322,7 @@ dependencies = [ [[package]] name = "libp2p-ping" version = "0.44.0" -source = "git+https://github.com/libp2p/rust-libp2p#367d2a12bfc8a43c722e6139a98bbbfcd164401d" +source = "git+https://github.com/libp2p/rust-libp2p#9785dcae9c8634dc6dcd91a07553a9d7b13d8e86" dependencies = [ "either", "futures", @@ -5286,7 +5339,7 @@ dependencies = [ [[package]] name = "libp2p-quic" version = "0.10.2" -source = "git+https://github.com/libp2p/rust-libp2p#367d2a12bfc8a43c722e6139a98bbbfcd164401d" +source = "git+https://github.com/libp2p/rust-libp2p#9785dcae9c8634dc6dcd91a07553a9d7b13d8e86" dependencies = [ "bytes", "futures", @@ -5309,7 +5362,7 @@ dependencies = [ [[package]] name = "libp2p-relay" version = "0.17.1" -source = "git+https://github.com/libp2p/rust-libp2p#367d2a12bfc8a43c722e6139a98bbbfcd164401d" +source = "git+https://github.com/libp2p/rust-libp2p#9785dcae9c8634dc6dcd91a07553a9d7b13d8e86" dependencies = [ "asynchronous-codec", "bytes", @@ -5354,7 +5407,7 @@ dependencies = [ [[package]] name = "libp2p-swarm" version = "0.44.2" -source = "git+https://github.com/libp2p/rust-libp2p#367d2a12bfc8a43c722e6139a98bbbfcd164401d" +source = "git+https://github.com/libp2p/rust-libp2p#9785dcae9c8634dc6dcd91a07553a9d7b13d8e86" dependencies = [ "either", "fnv", @@ -5379,7 +5432,7 @@ dependencies = [ [[package]] name = "libp2p-swarm-derive" version = "0.34.3" -source = "git+https://github.com/libp2p/rust-libp2p#367d2a12bfc8a43c722e6139a98bbbfcd164401d" +source = "git+https://github.com/libp2p/rust-libp2p#9785dcae9c8634dc6dcd91a07553a9d7b13d8e86" dependencies = [ "heck 0.5.0", "proc-macro2", @@ -5390,7 +5443,7 @@ dependencies = [ [[package]] name = "libp2p-tcp" version = "0.41.0" -source = "git+https://github.com/libp2p/rust-libp2p#367d2a12bfc8a43c722e6139a98bbbfcd164401d" +source = "git+https://github.com/libp2p/rust-libp2p#9785dcae9c8634dc6dcd91a07553a9d7b13d8e86" dependencies = [ "futures", "futures-timer", @@ -5406,7 +5459,7 @@ dependencies = [ [[package]] name = "libp2p-tls" version = "0.3.0" -source = "git+https://github.com/libp2p/rust-libp2p#367d2a12bfc8a43c722e6139a98bbbfcd164401d" +source = "git+https://github.com/libp2p/rust-libp2p#9785dcae9c8634dc6dcd91a07553a9d7b13d8e86" dependencies = [ "futures", "futures-rustls", @@ -5417,14 +5470,14 @@ dependencies = [ "rustls 0.21.10", "rustls-webpki", "thiserror", - "x509-parser", + "x509-parser 0.16.0", "yasna", ] [[package]] name = "libp2p-upnp" version = "0.2.2" -source = "git+https://github.com/libp2p/rust-libp2p#367d2a12bfc8a43c722e6139a98bbbfcd164401d" +source = "git+https://github.com/libp2p/rust-libp2p#9785dcae9c8634dc6dcd91a07553a9d7b13d8e86" dependencies = [ "futures", "futures-timer", @@ -5439,7 +5492,7 @@ dependencies = [ [[package]] name = "libp2p-webrtc" version = "0.7.1-alpha" -source = "git+https://github.com/libp2p/rust-libp2p#367d2a12bfc8a43c722e6139a98bbbfcd164401d" +source = "git+https://github.com/libp2p/rust-libp2p#9785dcae9c8634dc6dcd91a07553a9d7b13d8e86" dependencies = [ "async-trait", "bytes", @@ -5467,7 +5520,7 @@ dependencies = [ [[package]] name = "libp2p-webrtc-utils" version = "0.2.0" -source = "git+https://github.com/libp2p/rust-libp2p#367d2a12bfc8a43c722e6139a98bbbfcd164401d" +source = "git+https://github.com/libp2p/rust-libp2p#9785dcae9c8634dc6dcd91a07553a9d7b13d8e86" dependencies = [ "asynchronous-codec", "bytes", @@ -5489,7 +5542,7 @@ dependencies = [ [[package]] name = "libp2p-webrtc-websys" version = "0.3.0-alpha" -source = "git+https://github.com/libp2p/rust-libp2p#367d2a12bfc8a43c722e6139a98bbbfcd164401d" +source = "git+https://github.com/libp2p/rust-libp2p#9785dcae9c8634dc6dcd91a07553a9d7b13d8e86" dependencies = [ "bytes", "futures", @@ -5510,7 +5563,7 @@ dependencies = [ [[package]] name = "libp2p-yamux" version = "0.45.1" -source = "git+https://github.com/libp2p/rust-libp2p#367d2a12bfc8a43c722e6139a98bbbfcd164401d" +source = "git+https://github.com/libp2p/rust-libp2p#9785dcae9c8634dc6dcd91a07553a9d7b13d8e86" dependencies = [ "either", "futures", @@ -5819,7 +5872,7 @@ dependencies = [ "proc-macro2", "quote", "syn 1.0.109", - "synstructure", + "synstructure 0.12.6", ] [[package]] @@ -5845,7 +5898,7 @@ dependencies = [ [[package]] name = "multistream-select" version = "0.13.0" -source = "git+https://github.com/libp2p/rust-libp2p#367d2a12bfc8a43c722e6139a98bbbfcd164401d" +source = "git+https://github.com/libp2p/rust-libp2p#9785dcae9c8634dc6dcd91a07553a9d7b13d8e86" dependencies = [ "bytes", "futures", @@ -6189,7 +6242,16 @@ version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9bedf36ffb6ba96c2eb7144ef6270557b52e54b20c0a8e1eb2ff99a6c6959bff" dependencies = [ - "asn1-rs", + "asn1-rs 0.5.2", +] + +[[package]] +name = "oid-registry" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c958dd45046245b9c3c2547369bb634eb461670b2e7e0de552905801a648d1d" +dependencies = [ + "asn1-rs 0.6.1", ] [[package]] @@ -6914,7 +6976,7 @@ dependencies = [ [[package]] name = "quick-protobuf-codec" version = "0.3.1" -source = "git+https://github.com/libp2p/rust-libp2p#367d2a12bfc8a43c722e6139a98bbbfcd164401d" +source = "git+https://github.com/libp2p/rust-libp2p#9785dcae9c8634dc6dcd91a07553a9d7b13d8e86" dependencies = [ "asynchronous-codec", "bytes", @@ -7051,7 +7113,7 @@ dependencies = [ "pem", "ring 0.16.20", "time", - "x509-parser", + "x509-parser 0.15.1", "yasna", ] @@ -7461,7 +7523,7 @@ dependencies = [ [[package]] name = "rw-stream-sink" version = "0.4.0" -source = "git+https://github.com/libp2p/rust-libp2p#367d2a12bfc8a43c722e6139a98bbbfcd164401d" +source = "git+https://github.com/libp2p/rust-libp2p#9785dcae9c8634dc6dcd91a07553a9d7b13d8e86" dependencies = [ "futures", "pin-project", @@ -8098,8 +8160,8 @@ dependencies = [ [[package]] name = "sozo-ops" -version = "0.6.0-alpha.10" -source = "git+https://github.com/dojoengine/dojo#b952d0fa881283c612f8945ea00b2d26aa456517" +version = "0.6.0-alpha.12" +source = "git+https://github.com/dojoengine/dojo#c2280feaf9567cd0727a6e7d93e67c173a66356b" dependencies = [ "anyhow", "async-trait", @@ -8811,6 +8873,17 @@ dependencies = [ "unicode-xid", ] +[[package]] +name = "synstructure" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.57", +] + [[package]] name = "system-configuration" version = "0.5.1" @@ -9315,8 +9388,8 @@ dependencies = [ [[package]] name = "torii-client" -version = "0.6.0-alpha.10" -source = "git+https://github.com/dojoengine/dojo#b952d0fa881283c612f8945ea00b2d26aa456517" +version = "0.6.0-alpha.12" +source = "git+https://github.com/dojoengine/dojo#c2280feaf9567cd0727a6e7d93e67c173a66356b" dependencies = [ "async-trait", "crypto-bigint", @@ -9343,8 +9416,8 @@ dependencies = [ [[package]] name = "torii-core" -version = "0.6.0-alpha.10" -source = "git+https://github.com/dojoengine/dojo#b952d0fa881283c612f8945ea00b2d26aa456517" +version = "0.6.0-alpha.12" +source = "git+https://github.com/dojoengine/dojo#c2280feaf9567cd0727a6e7d93e67c173a66356b" dependencies = [ "anyhow", "async-trait", @@ -9377,8 +9450,8 @@ dependencies = [ [[package]] name = "torii-grpc" -version = "0.6.0-alpha.10" -source = "git+https://github.com/dojoengine/dojo#b952d0fa881283c612f8945ea00b2d26aa456517" +version = "0.6.0-alpha.12" +source = "git+https://github.com/dojoengine/dojo#c2280feaf9567cd0727a6e7d93e67c173a66356b" dependencies = [ "bytes", "crypto-bigint", @@ -9416,8 +9489,8 @@ dependencies = [ [[package]] name = "torii-relay" -version = "0.6.0-alpha.10" -source = "git+https://github.com/dojoengine/dojo#b952d0fa881283c612f8945ea00b2d26aa456517" +version = "0.6.0-alpha.12" +source = "git+https://github.com/dojoengine/dojo#c2280feaf9567cd0727a6e7d93e67c173a66356b" dependencies = [ "anyhow", "async-trait", @@ -10144,7 +10217,7 @@ dependencies = [ "byteorder", "cbc", "ccm", - "der-parser", + "der-parser 8.2.0", "hkdf", "hmac", "log", @@ -10165,7 +10238,7 @@ dependencies = [ "tokio", "webrtc-util", "x25519-dalek", - "x509-parser", + "x509-parser 0.15.1", ] [[package]] @@ -10565,18 +10638,35 @@ version = "0.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7069fba5b66b9193bd2c5d3d4ff12b839118f6bcbef5328efafafb5395cf63da" dependencies = [ - "asn1-rs", + "asn1-rs 0.5.2", "data-encoding", - "der-parser", + "der-parser 8.2.0", "lazy_static", "nom", - "oid-registry", + "oid-registry 0.6.1", "ring 0.16.20", "rusticata-macros", "thiserror", "time", ] +[[package]] +name = "x509-parser" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcbc162f30700d6f3f82a24bf7cc62ffe7caea42c0b2cba8bf7f3ae50cf51f69" +dependencies = [ + "asn1-rs 0.6.1", + "data-encoding", + "der-parser 9.0.0", + "lazy_static", + "nom", + "oid-registry 0.7.0", + "rusticata-macros", + "thiserror", + "time", +] + [[package]] name = "xattr" version = "1.3.1" diff --git a/example/main.c b/example/main.c index 8e2ab5e..fe552f3 100644 --- a/example/main.c +++ b/example/main.c @@ -54,11 +54,11 @@ int main() const char *torii_url = "http://localhost:8080"; const char *rpc_url = "http://localhost:5050"; - const char *player_key = "0x028cd7ee02d7f6ec9810e75b930e8e607793b302445abbdee0ac88143f18da20"; + const char *player_key = "0x02038e0daba5c3948a6289e91e2a68dfc28e734a281c753933b8bd331e6d3dae"; const char *player_address = "0x06162896d1d7ab204c7ccac6dd5f8e9e7c25ecd5ae4fcb4ad32e57786bb46e03"; const char *player_signing_key = "0x1800000000300000180000000000030000000000003006001800006600"; - const char *world = "0x028f5999ae62fec17c09c52a800e244961dba05251f5aaf923afabd9c9804d1a"; - const char *actions = "0x0297bde19ca499fd8a39dd9bedbcd881a47f7b8f66c19478ce97d7de89e6112e"; + const char *world = "0x01385f25d20a724edc9c7b3bd9636c59af64cbaf9fcd12f33b3af96b2452f295"; + const char *actions = "0x03539c9b89b08095ba914653fb0f20e55d4b172a415beade611bc260b346d0f7"; // Initialize world.data here... KeysClause entities[1] = {}; @@ -76,6 +76,7 @@ int main() } ToriiClient *client = resClient.ok; + // signing key FieldElement signing_key = {}; hex_to_bytes(player_signing_key, &signing_key); @@ -115,11 +116,11 @@ int main() Account *burner = resBurner.ok; - FieldElement address = account_address(master_account); - printf("New account: 0x"); + printf("Burner account: 0x"); + FieldElement burner_address = account_address(burner); for (size_t i = 0; i < 32; i++) { - printf("%02x", address.data[i]); + printf("%02x", burner_address.data[i]); } printf("\n"); @@ -225,6 +226,11 @@ int main() // move left felt(0x01) hex_to_bytes("0x01", &move.calldata.data[0]); + BlockId block_id = { + .tag = BlockTag_, + .block_tag = Pending, + }; + account_set_block_id(master_account, block_id); ResultFieldElement resSpawn = account_execute_raw(master_account, &spawn, 1); if (resSpawn.tag == Errbool) { @@ -233,6 +239,8 @@ int main() } wait_for_transaction(provider, resSpawn.ok); + printf("Spawned\n"); + ResultFieldElement resMove = account_execute_raw(master_account, &move, 1); if (resMove.tag == Errbool) { @@ -241,26 +249,33 @@ int main() } wait_for_transaction(provider, resMove.ok); - resSpawn = account_execute_raw(burner, &spawn, 1); - if (resSpawn.tag == Errbool) - { - printf("Failed to execute call: %s\n", resSpawn.err.message); - return 1; - } - wait_for_transaction(provider, resSpawn.ok); - - resMove = account_execute_raw(burner, &move, 1); - if (resMove.tag == Errbool) - { - printf("Failed to execute call: %s\n", resMove.err.message); - return 1; - } - wait_for_transaction(provider, resMove.ok); + printf("Moved\n"); - // while (1) + // account_set_block_id(burner, block_id); + // resSpawn = account_execute_raw(burner, &spawn, 1); + // if (resSpawn.tag == Errbool) // { + // printf("Failed to execute call: %s\n", resSpawn.err.message); + // return 1; + // } + // wait_for_transaction(provider, resSpawn.ok); + + // printf("Spawned burner\n"); + // resMove = account_execute_raw(burner, &move, 1); + // if (resMove.tag == Errbool) + // { + // printf("Failed to execute call: %s\n", resMove.err.message); + // return 1; // } + // wait_for_transaction(provider, resMove.ok); + + // printf("Moved burner\n"); + + while (1) + { + + } // Result_bool resRemoveEntities = client_remove_models_to_sync(client, entities, 1); // if (resRemoveEntities.tag == Err_bool) diff --git a/src/c/mod.rs b/src/c/mod.rs index c52429e..468a091 100644 --- a/src/c/mod.rs +++ b/src/c/mod.rs @@ -60,16 +60,15 @@ pub unsafe extern "C" fn client_new( let client_future = TClient::new(torii_url, rpc_url, libp2p_relay_url, world, some_entities); let runtime = tokio::runtime::Runtime::new().unwrap(); - let mut client = match runtime.block_on(client_future) { + let client = match runtime.block_on(client_future) { Ok(client) => client, Err(e) => return Result::Err(e.into()), }; - // Run relay - match runtime.block_on(client.wait_for_relay()) { - Ok(_) => {} - Err(e) => return Result::Err(e.into()), - } + let relay_runner = client.relay_runner(); + runtime.spawn(async move { + relay_runner.lock().await.run().await; + }); // Start subscription let result = runtime.block_on(client.start_subscription()); @@ -280,7 +279,13 @@ pub unsafe extern "C" fn typed_data_encode( let typed_data = unsafe { CStr::from_ptr(typed_data).to_string_lossy().into_owned() }; let typed_data = match serde_json::from_str::(typed_data.as_str()) { Ok(typed_data) => typed_data, - Err(err) => return Result::Err(Error { message: CString::new(format!("Invalid typed data: {}", err)).unwrap().into_raw() }), + Err(err) => { + return Result::Err(Error { + message: CString::new(format!("Invalid typed data: {}", err)) + .unwrap() + .into_raw(), + }) + } }; let address = (&address).into(); diff --git a/src/wasm/mod.rs b/src/wasm/mod.rs index 9da1fe5..fa3486b 100644 --- a/src/wasm/mod.rs +++ b/src/wasm/mod.rs @@ -850,7 +850,7 @@ pub async fn create_client( let world_address = FieldElement::from_str(&world_address) .map_err(|err| JsValue::from(format!("failed to parse world address: {err}")))?; - let mut client = torii_client::client::Client::new( + let client = torii_client::client::Client::new( torii_url, rpc_url, relay_url, @@ -866,10 +866,10 @@ pub async fn create_client( )) })?); - client - .wait_for_relay() - .await - .map_err(|err| JsValue::from(err.to_string()))?; + let relay_runner = client.relay_runner(); + wasm_bindgen_futures::spawn_local(async move { + relay_runner.lock().await.run().await; + }); Ok(Client { inner: client }) } From 8d8b8686de676e0f9ee74a96645ad62ff5eb5ab8 Mon Sep 17 00:00:00 2001 From: Nasr Date: Thu, 4 Apr 2024 14:20:19 -0400 Subject: [PATCH 3/5] refactor: type --- src/wasm/mod.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/wasm/mod.rs b/src/wasm/mod.rs index fa3486b..068f7a4 100644 --- a/src/wasm/mod.rs +++ b/src/wasm/mod.rs @@ -373,7 +373,7 @@ impl From<&Primitive> for dojo_types::primitive::Primitive { } #[wasm_bindgen(js_name = typedDataEncode)] -pub fn typed_data_encode(typed_data: String, address: &str) -> Result { +pub fn typed_data_encode(typed_data: &str, address: &str) -> Result { let typed_data = serde_json::from_str::(&typed_data) .map_err(|err| JsValue::from(format!("failed to parse typed data: {err}")))?; From d4ac7278865b1db541d9883ad174d83ca922f7f5 Mon Sep 17 00:00:00 2001 From: Nasr Date: Thu, 4 Apr 2024 16:39:13 -0400 Subject: [PATCH 4/5] feat: pass signer to deploy burner --- dojo.h | 3 ++- src/c/mod.rs | 3 ++- src/wasm/mod.rs | 13 +++++++++++-- 3 files changed, 15 insertions(+), 4 deletions(-) diff --git a/dojo.h b/dojo.h index 659fcab..6c7d6d3 100644 --- a/dojo.h +++ b/dojo.h @@ -616,7 +616,8 @@ struct ResultCArrayFieldElement starknet_call(struct Provider *provider, struct BlockId block_id); struct ResultAccount account_deploy_burner(struct Provider *provider, - struct Account *master_account); + struct Account *master_account, + struct FieldElement signing_key); struct FieldElement account_address(struct Account *account); diff --git a/src/c/mod.rs b/src/c/mod.rs index 468a091..31b0373 100644 --- a/src/c/mod.rs +++ b/src/c/mod.rs @@ -426,8 +426,9 @@ pub unsafe extern "C" fn starknet_call( pub unsafe extern "C" fn account_deploy_burner( provider: *mut Provider, master_account: *mut Account, + signing_key: types::FieldElement ) -> Result<*mut Account> { - let signing_key = SigningKey::from_random(); + let signing_key = SigningKey::from_secret_scalar((&signing_key).into()); let verifying_key = signing_key.verifying_key(); let address = get_contract_address( verifying_key.scalar(), diff --git a/src/wasm/mod.rs b/src/wasm/mod.rs index 068f7a4..680b95e 100644 --- a/src/wasm/mod.rs +++ b/src/wasm/mod.rs @@ -578,8 +578,17 @@ impl Account { } #[wasm_bindgen(js_name = deployBurner)] - pub async unsafe fn deploy_burner(&self) -> Result { - let signing_key = SigningKey::from_random(); + pub async unsafe fn deploy_burner(&self, private_key: &str) -> Result { + let private_key = match FieldElement::from_str(private_key) { + Ok(key) => key, + Err(e) => { + return Err(JsValue::from(format!( + "failed to parse private key: {e}" + ))) + } + }; + + let signing_key = SigningKey::from_secret_scalar(private_key); let verifying_key = signing_key.verifying_key(); let address = get_contract_address( verifying_key.scalar(), From a3c49d0f4358acb3c9d79c6f8b32ca7c58cafb62 Mon Sep 17 00:00:00 2001 From: Nasr Date: Thu, 4 Apr 2024 16:39:25 -0400 Subject: [PATCH 5/5] fmt --- src/c/mod.rs | 2 +- src/wasm/mod.rs | 10 ++++------ src/wasm/utils.rs | 7 ++++++- 3 files changed, 11 insertions(+), 8 deletions(-) diff --git a/src/c/mod.rs b/src/c/mod.rs index 31b0373..b4412ad 100644 --- a/src/c/mod.rs +++ b/src/c/mod.rs @@ -426,7 +426,7 @@ pub unsafe extern "C" fn starknet_call( pub unsafe extern "C" fn account_deploy_burner( provider: *mut Provider, master_account: *mut Account, - signing_key: types::FieldElement + signing_key: types::FieldElement, ) -> Result<*mut Account> { let signing_key = SigningKey::from_secret_scalar((&signing_key).into()); let verifying_key = signing_key.verifying_key(); diff --git a/src/wasm/mod.rs b/src/wasm/mod.rs index 680b95e..1db15ec 100644 --- a/src/wasm/mod.rs +++ b/src/wasm/mod.rs @@ -581,11 +581,7 @@ impl Account { pub async unsafe fn deploy_burner(&self, private_key: &str) -> Result { let private_key = match FieldElement::from_str(private_key) { Ok(key) => key, - Err(e) => { - return Err(JsValue::from(format!( - "failed to parse private key: {e}" - ))) - } + Err(e) => return Err(JsValue::from(format!("failed to parse private key: {e}"))), }; let signing_key = SigningKey::from_secret_scalar(private_key); @@ -702,7 +698,9 @@ impl Client { }) .await { - Ok(Some(ty)) => Ok(js_sys::JSON::parse(&parse_ty_as_json_str(&ty, false).to_string())?), + Ok(Some(ty)) => Ok(js_sys::JSON::parse( + &parse_ty_as_json_str(&ty, false).to_string(), + )?), Ok(None) => Ok(JsValue::NULL), Err(err) => Err(JsValue::from(format!("failed to get entity: {err}"))), diff --git a/src/wasm/utils.rs b/src/wasm/utils.rs index 0e3f99d..6101085 100644 --- a/src/wasm/utils.rs +++ b/src/wasm/utils.rs @@ -14,7 +14,12 @@ pub fn parse_entities_as_json_str(entities: Vec) -> Value { let model_map = model .members .iter() - .map(|member| (member.name.to_owned(), parse_ty_as_json_str(&member.ty, member.key))) + .map(|member| { + ( + member.name.to_owned(), + parse_ty_as_json_str(&member.ty, member.key), + ) + }) .collect::>(); (model.name, model_map.into())