From 9354302b2ed30c52ff6f8c257fc4a9ca1e2be5da Mon Sep 17 00:00:00 2001 From: Nasr Date: Tue, 11 Feb 2025 09:40:35 +0800 Subject: [PATCH 1/4] fwat: subscribe to token updates --- Cargo.lock | 12 ++++++------ Cargo.toml | 12 ++++++------ dojo.h | 3 +++ dojo.hpp | 3 +++ dojo.pyx | 4 ++++ src/c/types.rs | 2 ++ src/wasm/types.rs | 2 ++ 7 files changed, 26 insertions(+), 12 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 188ff2c..9d91725 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1751,7 +1751,7 @@ dependencies = [ [[package]] name = "dojo-types" version = "1.1.2" -source = "git+https://github.com/dojoengine/dojo?rev=d11a7ec#d11a7ec6542dfa056455ac6fc7974b755f190210" +source = "git+https://github.com/dojoengine/dojo?rev=d3a4f2d#d3a4f2dc80aef60df199fd8ff7126649c6ffdfe5" dependencies = [ "anyhow", "cainome 0.4.11", @@ -1773,7 +1773,7 @@ dependencies = [ [[package]] name = "dojo-world" version = "1.1.2" -source = "git+https://github.com/dojoengine/dojo?rev=d11a7ec#d11a7ec6542dfa056455ac6fc7974b755f190210" +source = "git+https://github.com/dojoengine/dojo?rev=d3a4f2d#d3a4f2dc80aef60df199fd8ff7126649c6ffdfe5" dependencies = [ "anyhow", "async-trait", @@ -6838,7 +6838,7 @@ dependencies = [ [[package]] name = "torii-client" version = "1.1.2" -source = "git+https://github.com/dojoengine/dojo?rev=d11a7ec#d11a7ec6542dfa056455ac6fc7974b755f190210" +source = "git+https://github.com/dojoengine/dojo?rev=d3a4f2d#d3a4f2dc80aef60df199fd8ff7126649c6ffdfe5" dependencies = [ "async-trait", "crypto-bigint", @@ -6866,7 +6866,7 @@ dependencies = [ [[package]] name = "torii-grpc" version = "1.1.2" -source = "git+https://github.com/dojoengine/dojo?rev=d11a7ec#d11a7ec6542dfa056455ac6fc7974b755f190210" +source = "git+https://github.com/dojoengine/dojo?rev=d3a4f2d#d3a4f2dc80aef60df199fd8ff7126649c6ffdfe5" dependencies = [ "crypto-bigint", "dojo-types", @@ -6905,7 +6905,7 @@ dependencies = [ [[package]] name = "torii-relay" version = "1.1.2" -source = "git+https://github.com/dojoengine/dojo?rev=d11a7ec#d11a7ec6542dfa056455ac6fc7974b755f190210" +source = "git+https://github.com/dojoengine/dojo?rev=d3a4f2d#d3a4f2dc80aef60df199fd8ff7126649c6ffdfe5" dependencies = [ "anyhow", "futures", @@ -6923,7 +6923,7 @@ dependencies = [ [[package]] name = "torii-typed-data" version = "1.1.2" -source = "git+https://github.com/dojoengine/dojo?rev=d11a7ec#d11a7ec6542dfa056455ac6fc7974b755f190210" +source = "git+https://github.com/dojoengine/dojo?rev=d3a4f2d#d3a4f2dc80aef60df199fd8ff7126649c6ffdfe5" dependencies = [ "cainome 0.4.11", "crypto-bigint", diff --git a/Cargo.toml b/Cargo.toml index 94a1251..c0becba 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -7,14 +7,14 @@ version = "1.0.9" crate-type = ["cdylib", "rlib", "staticlib"] [dependencies] -dojo-world = { git = "https://github.com/dojoengine/dojo", rev = "d11a7ec" } -dojo-types = { git = "https://github.com/dojoengine/dojo", rev = "d11a7ec"} -torii-client = { git = "https://github.com/dojoengine/dojo", rev = "d11a7ec" } +dojo-world = { git = "https://github.com/dojoengine/dojo", rev = "d3a4f2d" } +dojo-types = { git = "https://github.com/dojoengine/dojo", rev = "d3a4f2d"} +torii-client = { git = "https://github.com/dojoengine/dojo", rev = "d3a4f2d" } torii-grpc = { git = "https://github.com/dojoengine/dojo", features = [ "client", -], rev = "d11a7ec" } -torii-typed-data = { git = "https://github.com/dojoengine/dojo", rev = "d11a7ec" } -torii-relay = { git = "https://github.com/dojoengine/dojo", rev = "d11a7ec" } +], rev = "d3a4f2d" } +torii-typed-data = { git = "https://github.com/dojoengine/dojo", rev = "d3a4f2d" } +torii-relay = { git = "https://github.com/dojoengine/dojo", rev = "d3a4f2d" } starknet = "0.12.0" starknet-crypto = "0.7.2" diff --git a/dojo.h b/dojo.h index 4354a74..7118e24 100644 --- a/dojo.h +++ b/dojo.h @@ -59,6 +59,8 @@ typedef enum PatternMatching { VariableLen = 1, } PatternMatching; +typedef struct String String; + typedef struct Error { char *message; } Error; @@ -732,6 +734,7 @@ typedef struct EntityKeysClause { } EntityKeysClause; typedef struct Token { + struct String id; struct FieldElement contract_address; const char *name; const char *symbol; diff --git a/dojo.hpp b/dojo.hpp index 9849f31..2b92546 100644 --- a/dojo.hpp +++ b/dojo.hpp @@ -48,6 +48,8 @@ enum class PatternMatching { VariableLen = 1, }; +struct String; + struct Error { char *message; }; @@ -593,6 +595,7 @@ struct Event { }; struct Token { + String id; FieldElement contract_address; const char *name; const char *symbol; diff --git a/dojo.pyx b/dojo.pyx index 840f517..7add44e 100644 --- a/dojo.pyx +++ b/dojo.pyx @@ -41,6 +41,9 @@ cdef extern from *: cdef struct Provider: pass + cdef struct String: + pass + cdef struct Subscription: pass @@ -454,6 +457,7 @@ cdef extern from *: KeysClause entity_keys; cdef struct Token: + String id; FieldElement contract_address; const char *name; const char *symbol; diff --git a/src/c/types.rs b/src/c/types.rs index a02b4fc..1ed8300 100644 --- a/src/c/types.rs +++ b/src/c/types.rs @@ -103,6 +103,7 @@ impl From<&torii_grpc::types::Controller> for Controller { #[derive(Debug, Clone)] #[repr(C)] pub struct Token { + pub id: String, pub contract_address: FieldElement, pub name: *const c_char, pub symbol: *const c_char, @@ -113,6 +114,7 @@ pub struct Token { impl From<&torii_grpc::types::Token> for Token { fn from(val: &torii_grpc::types::Token) -> Self { Token { + id: format!("{:#x}", val.contract_address), contract_address: (&val.contract_address).into(), name: CString::new(val.name.clone()).unwrap().into_raw(), symbol: CString::new(val.symbol.clone()).unwrap().into_raw(), diff --git a/src/wasm/types.rs b/src/wasm/types.rs index 264f829..bd1e897 100644 --- a/src/wasm/types.rs +++ b/src/wasm/types.rs @@ -46,6 +46,7 @@ pub struct TokenBalances(pub Vec); #[derive(Tsify, Serialize, Deserialize, Debug)] #[tsify(into_wasm_abi, from_wasm_abi)] pub struct Token { + pub id: String, pub contract_address: String, pub name: String, pub symbol: String, @@ -56,6 +57,7 @@ pub struct Token { impl From<&torii_grpc::types::Token> for Token { fn from(value: &torii_grpc::types::Token) -> Self { Self { + id: format!("{:#x}", value.contract_address), contract_address: format!("{:#x}", value.contract_address), name: value.name.clone(), symbol: value.symbol.clone(), From 9c237d2e2995803f8a72ec68a36a38cfc7470374 Mon Sep 17 00:00:00 2001 From: Nasr Date: Thu, 13 Feb 2025 10:43:21 +0800 Subject: [PATCH 2/4] feat: update rev with toekn update --- Cargo.lock | 24 ++++++++--------- Cargo.toml | 12 ++++----- dojo.h | 35 ++++++++++++++++-------- dojo.hpp | 17 +++++++++--- dojo.pyx | 32 ++++++++++++++-------- src/c/mod.rs | 68 +++++++++++++++++++++++++++++++++++++++++++++-- src/c/types.rs | 2 -- src/wasm/mod.rs | 68 +++++++++++++++++++++++++++++++++++++++++++++++ src/wasm/types.rs | 2 -- 9 files changed, 211 insertions(+), 49 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 9d91725..94cf10e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1750,8 +1750,8 @@ dependencies = [ [[package]] name = "dojo-types" -version = "1.1.2" -source = "git+https://github.com/dojoengine/dojo?rev=d3a4f2d#d3a4f2dc80aef60df199fd8ff7126649c6ffdfe5" +version = "1.2.0" +source = "git+https://github.com/dojoengine/dojo?rev=1aa06e1#1aa06e1cc9a060380b4d44ca2717a2ef97e1677c" dependencies = [ "anyhow", "cainome 0.4.11", @@ -1772,8 +1772,8 @@ dependencies = [ [[package]] name = "dojo-world" -version = "1.1.2" -source = "git+https://github.com/dojoengine/dojo?rev=d3a4f2d#d3a4f2dc80aef60df199fd8ff7126649c6ffdfe5" +version = "1.2.0" +source = "git+https://github.com/dojoengine/dojo?rev=1aa06e1#1aa06e1cc9a060380b4d44ca2717a2ef97e1677c" dependencies = [ "anyhow", "async-trait", @@ -6837,8 +6837,8 @@ dependencies = [ [[package]] name = "torii-client" -version = "1.1.2" -source = "git+https://github.com/dojoengine/dojo?rev=d3a4f2d#d3a4f2dc80aef60df199fd8ff7126649c6ffdfe5" +version = "1.2.0" +source = "git+https://github.com/dojoengine/dojo?rev=1aa06e1#1aa06e1cc9a060380b4d44ca2717a2ef97e1677c" dependencies = [ "async-trait", "crypto-bigint", @@ -6865,8 +6865,8 @@ dependencies = [ [[package]] name = "torii-grpc" -version = "1.1.2" -source = "git+https://github.com/dojoengine/dojo?rev=d3a4f2d#d3a4f2dc80aef60df199fd8ff7126649c6ffdfe5" +version = "1.2.0" +source = "git+https://github.com/dojoengine/dojo?rev=1aa06e1#1aa06e1cc9a060380b4d44ca2717a2ef97e1677c" dependencies = [ "crypto-bigint", "dojo-types", @@ -6904,8 +6904,8 @@ dependencies = [ [[package]] name = "torii-relay" -version = "1.1.2" -source = "git+https://github.com/dojoengine/dojo?rev=d3a4f2d#d3a4f2dc80aef60df199fd8ff7126649c6ffdfe5" +version = "1.2.0" +source = "git+https://github.com/dojoengine/dojo?rev=1aa06e1#1aa06e1cc9a060380b4d44ca2717a2ef97e1677c" dependencies = [ "anyhow", "futures", @@ -6922,8 +6922,8 @@ dependencies = [ [[package]] name = "torii-typed-data" -version = "1.1.2" -source = "git+https://github.com/dojoengine/dojo?rev=d3a4f2d#d3a4f2dc80aef60df199fd8ff7126649c6ffdfe5" +version = "1.2.0" +source = "git+https://github.com/dojoengine/dojo?rev=1aa06e1#1aa06e1cc9a060380b4d44ca2717a2ef97e1677c" dependencies = [ "cainome 0.4.11", "crypto-bigint", diff --git a/Cargo.toml b/Cargo.toml index c0becba..8349ea8 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -7,14 +7,14 @@ version = "1.0.9" crate-type = ["cdylib", "rlib", "staticlib"] [dependencies] -dojo-world = { git = "https://github.com/dojoengine/dojo", rev = "d3a4f2d" } -dojo-types = { git = "https://github.com/dojoengine/dojo", rev = "d3a4f2d"} -torii-client = { git = "https://github.com/dojoengine/dojo", rev = "d3a4f2d" } +dojo-world = { git = "https://github.com/dojoengine/dojo", rev = "1aa06e1" } +dojo-types = { git = "https://github.com/dojoengine/dojo", rev = "1aa06e1"} +torii-client = { git = "https://github.com/dojoengine/dojo", rev = "1aa06e1" } torii-grpc = { git = "https://github.com/dojoengine/dojo", features = [ "client", -], rev = "d3a4f2d" } -torii-typed-data = { git = "https://github.com/dojoengine/dojo", rev = "d3a4f2d" } -torii-relay = { git = "https://github.com/dojoengine/dojo", rev = "d3a4f2d" } +], rev = "1aa06e1" } +torii-typed-data = { git = "https://github.com/dojoengine/dojo", rev = "1aa06e1" } +torii-relay = { git = "https://github.com/dojoengine/dojo", rev = "1aa06e1" } starknet = "0.12.0" starknet-crypto = "0.7.2" diff --git a/dojo.h b/dojo.h index 7118e24..05cd46f 100644 --- a/dojo.h +++ b/dojo.h @@ -59,8 +59,6 @@ typedef enum PatternMatching { VariableLen = 1, } PatternMatching; -typedef struct String String; - typedef struct Error { char *message; } Error; @@ -268,6 +266,14 @@ typedef struct ResultCArrayToken { }; } ResultCArrayToken; +typedef struct Token { + struct FieldElement contract_address; + const char *name; + const char *symbol; + uint8_t decimals; + const char *metadata; +} Token; + typedef struct CArrayTokenBalance { struct TokenBalance *data; uintptr_t data_len; @@ -733,15 +739,6 @@ typedef struct EntityKeysClause { }; } EntityKeysClause; -typedef struct Token { - struct String id; - struct FieldElement contract_address; - const char *name; - const char *symbol; - uint8_t decimals; - const char *metadata; -} Token; - typedef enum COptionFieldElement_Tag { SomeFieldElement, NoneFieldElement, @@ -1125,6 +1122,22 @@ struct ResultCArrayToken client_tokens(struct ToriiClient *client, const struct FieldElement *contract_addresses, uintptr_t contract_addresses_len); +/** + * Subscribes to token updates + * + * # Parameters + * * `client` - Pointer to ToriiClient instance + * * `contract_addresses` - Array of contract addresses + * * `callback` - Function called when updates occur + * + * # Returns + * Result containing pointer to Subscription or error + */ +struct ResultSubscription client_on_token_update(struct ToriiClient *client, + const struct FieldElement *contract_addresses, + uintptr_t contract_addresses_len, + void (*callback)(struct Token)); + /** * Gets token balances for given accounts and contracts * diff --git a/dojo.hpp b/dojo.hpp index 2b92546..c4c084f 100644 --- a/dojo.hpp +++ b/dojo.hpp @@ -48,8 +48,6 @@ enum class PatternMatching { VariableLen = 1, }; -struct String; - struct Error { char *message; }; @@ -595,7 +593,6 @@ struct Event { }; struct Token { - String id; FieldElement contract_address; const char *name; const char *symbol; @@ -1240,6 +1237,20 @@ Result> client_tokens(ToriiClient *client, const FieldElement *contract_addresses, uintptr_t contract_addresses_len); +/// Subscribes to token updates +/// +/// # Parameters +/// * `client` - Pointer to ToriiClient instance +/// * `contract_addresses` - Array of contract addresses +/// * `callback` - Function called when updates occur +/// +/// # Returns +/// Result containing pointer to Subscription or error +Result client_on_token_update(ToriiClient *client, + const FieldElement *contract_addresses, + uintptr_t contract_addresses_len, + void (*callback)(Token)); + /// Gets token balances for given accounts and contracts /// /// # Parameters diff --git a/dojo.pyx b/dojo.pyx index 7add44e..4a195f3 100644 --- a/dojo.pyx +++ b/dojo.pyx @@ -41,9 +41,6 @@ cdef extern from *: cdef struct Provider: pass - cdef struct String: - pass - cdef struct Subscription: pass @@ -174,6 +171,13 @@ cdef extern from *: CArrayToken ok; Error err; + cdef struct Token: + FieldElement contract_address; + const char *name; + const char *symbol; + uint8_t decimals; + const char *metadata; + cdef struct CArrayTokenBalance: TokenBalance *data; uintptr_t data_len; @@ -456,14 +460,6 @@ cdef extern from *: CArrayFieldElement hashed_keys; KeysClause entity_keys; - cdef struct Token: - String id; - FieldElement contract_address; - const char *name; - const char *symbol; - uint8_t decimals; - const char *metadata; - cdef enum COptionFieldElement_Tag: SomeFieldElement, NoneFieldElement, @@ -788,6 +784,20 @@ cdef extern from *: const FieldElement *contract_addresses, uintptr_t contract_addresses_len); + # Subscribes to token updates + # + # # Parameters + # * `client` - Pointer to ToriiClient instance + # * `contract_addresses` - Array of contract addresses + # * `callback` - Function called when updates occur + # + # # Returns + # Result containing pointer to Subscription or error + ResultSubscription client_on_token_update(ToriiClient *client, + const FieldElement *contract_addresses, + uintptr_t contract_addresses_len, + void (*callback)(Token)); + # Gets token balances for given accounts and contracts # # # Parameters diff --git a/src/c/mod.rs b/src/c/mod.rs index 633fb1b..0d1804b 100644 --- a/src/c/mod.rs +++ b/src/c/mod.rs @@ -1083,8 +1083,7 @@ pub unsafe extern "C" fn client_tokens( ) -> Result> { let contract_addresses = unsafe { std::slice::from_raw_parts(contract_addresses, contract_addresses_len) }; - let contract_addresses = - contract_addresses.iter().map(|f| (&f.clone()).into()).collect::>(); + let contract_addresses = contract_addresses.iter().map(|f| (&f.clone()).into()).collect::>(); let tokens = match RUNTIME.block_on((*client).inner.tokens(contract_addresses)) { Ok(tokens) => tokens, Err(e) => return Result::Err(e.into()), @@ -1094,6 +1093,71 @@ pub unsafe extern "C" fn client_tokens( Result::Ok(tokens.into()) } +/// Subscribes to token updates +/// +/// # Parameters +/// * `client` - Pointer to ToriiClient instance +/// * `contract_addresses` - Array of contract addresses +/// * `callback` - Function called when updates occur +/// +/// # Returns +/// Result containing pointer to Subscription or error +#[no_mangle] +pub unsafe extern "C" fn client_on_token_update( + client: *mut ToriiClient, + contract_addresses: *const types::FieldElement, + contract_addresses_len: usize, + callback: unsafe extern "C" fn(Token), +) -> Result<*mut Subscription> { + let client = Arc::new(unsafe { &*client }); + + // Convert contract addresses array to Vec if not empty + let contract_addresses = if contract_addresses.is_null() || contract_addresses_len == 0 { + Vec::new() + } else { + let addresses = unsafe { std::slice::from_raw_parts(contract_addresses, contract_addresses_len) }; + addresses.iter().map(|f| (&f.clone()).into()).collect::>() + }; + + let subscription_id = Arc::new(AtomicU64::new(0)); + let (trigger, tripwire) = Tripwire::new(); + + let subscription = Subscription { id: Arc::clone(&subscription_id), trigger }; + + // Spawn a new thread to handle the stream and reconnections + let client_clone = client.clone(); + RUNTIME.spawn(async move { + let mut backoff = Duration::from_secs(1); + let max_backoff = Duration::from_secs(60); + + loop { + let rcv = client_clone.inner.on_token_updated(contract_addresses.clone()).await; + + if let Ok(rcv) = rcv { + backoff = Duration::from_secs(1); // Reset backoff on successful connection + + let mut rcv = rcv.take_until_if(tripwire.clone()); + + while let Some(Ok((id, token))) = rcv.next().await { + subscription_id.store(id, Ordering::SeqCst); + let token: Token = (&token).into(); + callback(token); + } + } + + // If we've reached this point, the stream has ended (possibly due to disconnection) + // We'll try to reconnect after a delay, unless the tripwire has been triggered + if tripwire.clone().now_or_never().unwrap_or_default() { + break; // Exit the loop if the subscription has been cancelled + } + sleep(backoff).await; + backoff = std::cmp::min(backoff * 2, max_backoff); + } + }); + + Result::Ok(Box::into_raw(Box::new(subscription))) +} + /// Gets token balances for given accounts and contracts /// /// # Parameters diff --git a/src/c/types.rs b/src/c/types.rs index 1ed8300..a02b4fc 100644 --- a/src/c/types.rs +++ b/src/c/types.rs @@ -103,7 +103,6 @@ impl From<&torii_grpc::types::Controller> for Controller { #[derive(Debug, Clone)] #[repr(C)] pub struct Token { - pub id: String, pub contract_address: FieldElement, pub name: *const c_char, pub symbol: *const c_char, @@ -114,7 +113,6 @@ pub struct Token { impl From<&torii_grpc::types::Token> for Token { fn from(val: &torii_grpc::types::Token) -> Self { Token { - id: format!("{:#x}", val.contract_address), contract_address: (&val.contract_address).into(), name: CString::new(val.name.clone()).unwrap().into_raw(), symbol: CString::new(val.symbol.clone()).unwrap().into_raw(), diff --git a/src/wasm/mod.rs b/src/wasm/mod.rs index 879d679..20705cb 100644 --- a/src/wasm/mod.rs +++ b/src/wasm/mod.rs @@ -640,6 +640,74 @@ impl ToriiClient { Ok(Tokens(tokens.iter().map(|t| t.into()).collect())) } + /// Subscribes to token updates + /// + /// # Parameters + /// * `contract_addresses` - Array of contract addresses as hex strings + /// * `callback` - JavaScript function to call on updates + /// + /// # Returns + /// Result containing subscription handle or error + #[wasm_bindgen(js_name = onTokenUpdated)] + pub fn on_token_updated( + &self, + contract_addresses: Vec, + callback: js_sys::Function, + ) -> Result { + #[cfg(feature = "console-error-panic")] + console_error_panic_hook::set_once(); + + let contract_addresses = contract_addresses + .into_iter() + .map(|addr| { + Felt::from_str(&addr).map_err(|err| { + JsValue::from(format!("failed to parse contract address: {err}")) + }) + }) + .collect::, _>>()?; + + let subscription_id = Arc::new(AtomicU64::new(0)); + let (trigger, tripwire) = Tripwire::new(); + + let subscription = Subscription { id: Arc::clone(&subscription_id), trigger }; + + // Spawn a new task to handle the stream and reconnections + let client = self.inner.clone(); + let subscription_id_clone = Arc::clone(&subscription_id); + wasm_bindgen_futures::spawn_local(async move { + let mut backoff = 1000; + let max_backoff = 60000; + + loop { + if let Ok(stream) = client.on_token_updated(contract_addresses.clone()).await { + backoff = 1000; // Reset backoff on successful connection + + let mut stream = stream.take_until_if(tripwire.clone()); + + while let Some(Ok((id, token))) = stream.next().await { + subscription_id_clone.store(id, Ordering::SeqCst); + let token: Token = (&token).into(); + + let _ = callback.call1( + &JsValue::null(), + &token.serialize(&JSON_COMPAT_SERIALIZER).unwrap(), + ); + } + } + + // If we've reached this point, the stream has ended (possibly due to disconnection) + // We'll try to reconnect after a delay, unless the tripwire has been triggered + if tripwire.clone().now_or_never().unwrap_or_default() { + break; // Exit the loop if the subscription has been cancelled + } + gloo_timers::future::TimeoutFuture::new(backoff).await; + backoff = std::cmp::min(backoff * 2, max_backoff); + } + }); + + Ok(subscription) + } + /// Gets token balances for given accounts and contracts /// /// # Parameters diff --git a/src/wasm/types.rs b/src/wasm/types.rs index bd1e897..264f829 100644 --- a/src/wasm/types.rs +++ b/src/wasm/types.rs @@ -46,7 +46,6 @@ pub struct TokenBalances(pub Vec); #[derive(Tsify, Serialize, Deserialize, Debug)] #[tsify(into_wasm_abi, from_wasm_abi)] pub struct Token { - pub id: String, pub contract_address: String, pub name: String, pub symbol: String, @@ -57,7 +56,6 @@ pub struct Token { impl From<&torii_grpc::types::Token> for Token { fn from(value: &torii_grpc::types::Token) -> Self { Self { - id: format!("{:#x}", value.contract_address), contract_address: format!("{:#x}", value.contract_address), name: value.name.clone(), symbol: value.symbol.clone(), From dc685e541ef400767e39dbb77826999046a2dfee Mon Sep 17 00:00:00 2001 From: Nasr Date: Thu, 13 Feb 2025 10:43:53 +0800 Subject: [PATCH 3/4] fmt --- src/c/mod.rs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/c/mod.rs b/src/c/mod.rs index 0d1804b..2fe2c9d 100644 --- a/src/c/mod.rs +++ b/src/c/mod.rs @@ -1083,7 +1083,8 @@ pub unsafe extern "C" fn client_tokens( ) -> Result> { let contract_addresses = unsafe { std::slice::from_raw_parts(contract_addresses, contract_addresses_len) }; - let contract_addresses = contract_addresses.iter().map(|f| (&f.clone()).into()).collect::>(); + let contract_addresses = + contract_addresses.iter().map(|f| (&f.clone()).into()).collect::>(); let tokens = match RUNTIME.block_on((*client).inner.tokens(contract_addresses)) { Ok(tokens) => tokens, Err(e) => return Result::Err(e.into()), @@ -1115,7 +1116,8 @@ pub unsafe extern "C" fn client_on_token_update( let contract_addresses = if contract_addresses.is_null() || contract_addresses_len == 0 { Vec::new() } else { - let addresses = unsafe { std::slice::from_raw_parts(contract_addresses, contract_addresses_len) }; + let addresses = + unsafe { std::slice::from_raw_parts(contract_addresses, contract_addresses_len) }; addresses.iter().map(|f| (&f.clone()).into()).collect::>() }; From 7dd326dbb8349ea0f683f718a03c597ac005457d Mon Sep 17 00:00:00 2001 From: Nasr Date: Thu, 13 Feb 2025 11:11:23 +0800 Subject: [PATCH 4/4] add id --- dojo.h | 1 + dojo.hpp | 1 + dojo.pyx | 1 + src/c/types.rs | 2 ++ src/wasm/types.rs | 2 ++ 5 files changed, 7 insertions(+) diff --git a/dojo.h b/dojo.h index 05cd46f..ea7ff56 100644 --- a/dojo.h +++ b/dojo.h @@ -267,6 +267,7 @@ typedef struct ResultCArrayToken { } ResultCArrayToken; typedef struct Token { + const char *id; struct FieldElement contract_address; const char *name; const char *symbol; diff --git a/dojo.hpp b/dojo.hpp index c4c084f..0883a64 100644 --- a/dojo.hpp +++ b/dojo.hpp @@ -593,6 +593,7 @@ struct Event { }; struct Token { + const char *id; FieldElement contract_address; const char *name; const char *symbol; diff --git a/dojo.pyx b/dojo.pyx index 4a195f3..615b882 100644 --- a/dojo.pyx +++ b/dojo.pyx @@ -172,6 +172,7 @@ cdef extern from *: Error err; cdef struct Token: + const char *id; FieldElement contract_address; const char *name; const char *symbol; diff --git a/src/c/types.rs b/src/c/types.rs index a02b4fc..3438a79 100644 --- a/src/c/types.rs +++ b/src/c/types.rs @@ -103,6 +103,7 @@ impl From<&torii_grpc::types::Controller> for Controller { #[derive(Debug, Clone)] #[repr(C)] pub struct Token { + id: *const c_char, pub contract_address: FieldElement, pub name: *const c_char, pub symbol: *const c_char, @@ -113,6 +114,7 @@ pub struct Token { impl From<&torii_grpc::types::Token> for Token { fn from(val: &torii_grpc::types::Token) -> Self { Token { + id: CString::new(val.id.clone()).unwrap().into_raw(), contract_address: (&val.contract_address).into(), name: CString::new(val.name.clone()).unwrap().into_raw(), symbol: CString::new(val.symbol.clone()).unwrap().into_raw(), diff --git a/src/wasm/types.rs b/src/wasm/types.rs index 264f829..d05fcb5 100644 --- a/src/wasm/types.rs +++ b/src/wasm/types.rs @@ -46,6 +46,7 @@ pub struct TokenBalances(pub Vec); #[derive(Tsify, Serialize, Deserialize, Debug)] #[tsify(into_wasm_abi, from_wasm_abi)] pub struct Token { + pub id: String, pub contract_address: String, pub name: String, pub symbol: String, @@ -56,6 +57,7 @@ pub struct Token { impl From<&torii_grpc::types::Token> for Token { fn from(value: &torii_grpc::types::Token) -> Self { Self { + id: value.id.clone(), contract_address: format!("{:#x}", value.contract_address), name: value.name.clone(), symbol: value.symbol.clone(),