From 05dd44bd98a3d3bb3f62fe9aaa3e51170e44d9e7 Mon Sep 17 00:00:00 2001 From: Nasr Date: Fri, 7 Feb 2025 14:18:09 +0800 Subject: [PATCH 1/4] feat: fetch controllers along with their usernames --- src/wasm/mod.rs | 24 ++++++++++++++++++++++++ src/wasm/types.rs | 13 +++++++++++++ 2 files changed, 37 insertions(+) diff --git a/src/wasm/mod.rs b/src/wasm/mod.rs index 68cf1a7..486b010 100644 --- a/src/wasm/mod.rs +++ b/src/wasm/mod.rs @@ -588,6 +588,30 @@ pub fn parse_cairo_short_string(str: &str) -> Result { #[wasm_bindgen] impl ToriiClient { + /// Gets controllers along with their usernames for the given contract addresses + /// + /// # Parameters + /// * `contract_addresses` - Array of contract addresses as hex strings. If empty, all controllers will be returned. + /// + /// # Returns + /// Result containing controllers or error + #[wasm_bindgen(js_name = getControllers)] + pub async fn get_controllers(&self, contract_addresses: Vec) -> Result { + let contract_addresses = contract_addresses + .into_iter() + .map(|c| Felt::from_str(&c)) + .collect::, _>>() + .map_err(|e| JsValue::from(format!("failed to parse contract addresses: {e}")))?; + + let controllers = self + .inner + .controllers(contract_addresses) + .await + .map_err(|e| JsValue::from(format!("failed to get controllers: {e}")))?; + + Ok(Controllers(controllers.iter().map(|c| c.into()).collect())) + } + /// Gets token information for the given contract addresses /// /// # Parameters diff --git a/src/wasm/types.rs b/src/wasm/types.rs index 43cfb01..9c04d7d 100644 --- a/src/wasm/types.rs +++ b/src/wasm/types.rs @@ -13,6 +13,19 @@ use wasm_bindgen::prelude::*; use super::utils::parse_ty_as_json_str; + +#[derive(Tsify, Serialize, Deserialize, Debug)] +#[tsify(into_wasm_abi, from_wasm_abi)] +pub struct Controllers(pub Vec); + +#[derive(Tsify, Serialize, Deserialize, Debug)] +#[tsify(into_wasm_abi, from_wasm_abi)] +pub struct Controller { + pub contract_address: String, + pub username: String, + pub deployed_at_timestamp: u64, +} + #[derive(Tsify, Serialize, Deserialize, Debug)] #[tsify(into_wasm_abi, from_wasm_abi)] pub struct Tokens(pub Vec); From f7da80f6ed598e89f348285c35b7191ba9abc27f Mon Sep 17 00:00:00 2001 From: Nasr Date: Fri, 7 Feb 2025 15:33:55 +0800 Subject: [PATCH 2/4] controllers C and wasm types --- dojo.h | 42 ++++++++++++++++++++++++++++++++++++++++++ dojo.hpp | 18 ++++++++++++++++++ dojo.pyx | 33 ++++++++++++++++++++++++++++++--- src/c/mod.rs | 30 +++++++++++++++++++++++++++++- src/c/types.rs | 14 ++++++++++++++ src/wasm/mod.rs | 2 +- src/wasm/types.rs | 8 +++++++- 7 files changed, 141 insertions(+), 6 deletions(-) diff --git a/dojo.h b/dojo.h index 6aef836..5ececb7 100644 --- a/dojo.h +++ b/dojo.h @@ -156,6 +156,28 @@ typedef struct ResultCArrayu8 { }; } ResultCArrayu8; +typedef struct CArrayController { + struct Controller *data; + uintptr_t data_len; +} CArrayController; + +typedef enum ResultCArrayController_Tag { + OkCArrayController, + ErrCArrayController, +} ResultCArrayController_Tag; + +typedef struct ResultCArrayController { + ResultCArrayController_Tag tag; + union { + struct { + struct CArrayController ok; + }; + struct { + struct Error err; + }; + }; +} ResultCArrayController; + typedef struct CArrayEntity { struct Entity *data; uintptr_t data_len; @@ -415,6 +437,12 @@ typedef struct Policy { const char *description; } Policy; +typedef struct Controller { + struct FieldElement address; + const char *username; + uint64_t deployed_at_timestamp; +} Controller; + typedef struct Entity { struct FieldElement hashed_keys; struct CArrayStruct models; @@ -934,6 +962,20 @@ struct ResultCArrayu8 client_publish_message(struct ToriiClient *client, const struct FieldElement *signature_felts, uintptr_t signature_felts_len); +/** + * Retrieves controllers for the given contract addresses + * + * # Parameters + * * `client` - Pointer to ToriiClient instance + * * `contract_addresses` - Array of contract addresses. If empty, all controllers will be returned. + * + * # Returns + * Result containing controllers or error + */ +struct ResultCArrayController client_controllers(struct ToriiClient *client, + const struct FieldElement *contract_addresses, + uintptr_t contract_addresses_len); + /** * Queries entities matching given criteria * diff --git a/dojo.hpp b/dojo.hpp index fe8ff28..9e27e85 100644 --- a/dojo.hpp +++ b/dojo.hpp @@ -106,6 +106,12 @@ struct CArray { uintptr_t data_len; }; +struct Controller { + FieldElement address; + const char *username; + uint64_t deployed_at_timestamp; +}; + struct Member { const char *name; Ty *ty; @@ -1094,6 +1100,18 @@ Result> client_publish_message(ToriiClient *client, const FieldElement *signature_felts, uintptr_t signature_felts_len); +/// Retrieves controllers for the given contract addresses +/// +/// # Parameters +/// * `client` - Pointer to ToriiClient instance +/// * `contract_addresses` - Array of contract addresses. If empty, all controllers will be returned. +/// +/// # Returns +/// Result containing controllers or error +Result> client_controllers(ToriiClient *client, + const FieldElement *contract_addresses, + uintptr_t contract_addresses_len); + /// Queries entities matching given criteria /// /// # Parameters diff --git a/dojo.pyx b/dojo.pyx index 49d136f..e563be2 100644 --- a/dojo.pyx +++ b/dojo.pyx @@ -35,9 +35,6 @@ cdef extern from *: cdef struct Account: pass - cdef struct Controller: - pass - cdef struct Provider: pass @@ -102,6 +99,19 @@ cdef extern from *: CArrayu8 ok; Error err; + cdef struct CArrayController: + Controller *data; + uintptr_t data_len; + + cdef enum ResultCArrayController_Tag: + OkCArrayController, + ErrCArrayController, + + cdef struct ResultCArrayController: + ResultCArrayController_Tag tag; + CArrayController ok; + Error err; + cdef struct CArrayEntity: Entity *data; uintptr_t data_len; @@ -257,6 +267,11 @@ cdef extern from *: const char *method; const char *description; + cdef struct Controller: + FieldElement address; + const char *username; + uint64_t deployed_at_timestamp; + cdef struct Entity: FieldElement hashed_keys; CArrayStruct models; @@ -629,6 +644,18 @@ cdef extern from *: const FieldElement *signature_felts, uintptr_t signature_felts_len); + # Retrieves controllers for the given contract addresses + # + # # Parameters + # * `client` - Pointer to ToriiClient instance + # * `contract_addresses` - Array of contract addresses. If empty, all controllers will be returned. + # + # # Returns + # Result containing controllers or error + ResultCArrayController client_controllers(ToriiClient *client, + const FieldElement *contract_addresses, + uintptr_t contract_addresses_len); + # Queries entities matching given criteria # # # Parameters diff --git a/src/c/mod.rs b/src/c/mod.rs index 4d11549..9fd316c 100644 --- a/src/c/mod.rs +++ b/src/c/mod.rs @@ -50,7 +50,7 @@ use torii_client::client::Client as TClient; use torii_relay::types::Message; use torii_typed_data::TypedData; use tower_http::cors::{AllowOrigin, CorsLayer}; -use types::{EntityKeysClause, Event, IndexerUpdate, Policy, Struct, Token, TokenBalance}; +use types::{Controller, EntityKeysClause, Event, IndexerUpdate, Policy, Struct, Token, TokenBalance}; use url::Url; use self::types::{ @@ -729,6 +729,34 @@ pub unsafe extern "C" fn client_publish_message( } } +/// Retrieves controllers for the given contract addresses +/// +/// # Parameters +/// * `client` - Pointer to ToriiClient instance +/// * `contract_addresses` - Array of contract addresses. If empty, all controllers will be returned. +/// +/// # Returns +/// Result containing controllers or error +#[no_mangle] +pub unsafe extern "C" fn client_controllers( + client: *mut ToriiClient, + contract_addresses: *const types::FieldElement, + contract_addresses_len: usize, +) -> Result> { + let contract_addresses = unsafe { std::slice::from_raw_parts(contract_addresses, contract_addresses_len) }; + let contract_addresses = contract_addresses.iter().map(|f| f.into()).collect::>(); + + let controllers_future = unsafe { (*client).inner.controllers(contract_addresses) }; + + match RUNTIME.block_on(controllers_future) { + Ok(controllers) => { + let controllers: Vec = controllers.iter().map(|c| c.into()).collect(); + Result::Ok(controllers.into()) + } + Err(e) => Result::Err(e.into()), + } +} + /// Queries entities matching given criteria /// /// # Parameters diff --git a/src/c/types.rs b/src/c/types.rs index a29fa92..60a244a 100644 --- a/src/c/types.rs +++ b/src/c/types.rs @@ -82,6 +82,20 @@ impl From<&Policy> for account_sdk::account::session::policy::CallPolicy { } } +#[derive(Debug, Clone)] +#[repr(C)] +pub struct Controller { + pub address: FieldElement, + pub username: *const c_char, + pub deployed_at_timestamp: u64, +} + +impl From<&torii_grpc::types::Controller> for Controller { + fn from(val: &torii_grpc::types::Controller) -> Self { + Controller { address: (&val.address).into(), username: CString::new(val.username.clone()).unwrap().into_raw(), deployed_at_timestamp: val.deployed_at } + } +} + #[derive(Debug, Clone)] #[repr(C)] pub struct Token { diff --git a/src/wasm/mod.rs b/src/wasm/mod.rs index 486b010..da21e38 100644 --- a/src/wasm/mod.rs +++ b/src/wasm/mod.rs @@ -41,7 +41,7 @@ mod types; use types::{ BlockId, Call, Calls, ClientConfig, Entities, Entity, IndexerUpdate, KeysClause, KeysClauses, - Model, Query, Signature, Token, TokenBalance, TokenBalances, Tokens, + Model, Query, Signature, Token, TokenBalance, TokenBalances, Tokens, Controller, Controllers, }; const JSON_COMPAT_SERIALIZER: serde_wasm_bindgen::Serializer = diff --git a/src/wasm/types.rs b/src/wasm/types.rs index 9c04d7d..cde7ee4 100644 --- a/src/wasm/types.rs +++ b/src/wasm/types.rs @@ -21,11 +21,17 @@ pub struct Controllers(pub Vec); #[derive(Tsify, Serialize, Deserialize, Debug)] #[tsify(into_wasm_abi, from_wasm_abi)] pub struct Controller { - pub contract_address: String, + pub address: String, pub username: String, pub deployed_at_timestamp: u64, } +impl From<&torii_grpc::types::Controller> for Controller { + fn from(value: &torii_grpc::types::Controller) -> Self { + Self { address: format!("{:#x}", value.address), username: value.username.clone(), deployed_at_timestamp: value.deployed_at } + } +} + #[derive(Tsify, Serialize, Deserialize, Debug)] #[tsify(into_wasm_abi, from_wasm_abi)] pub struct Tokens(pub Vec); From 1fed5c924e9a1ff1bd1b86525781b8e3dc582f7a Mon Sep 17 00:00:00 2001 From: Nasr Date: Fri, 7 Feb 2025 15:34:12 +0800 Subject: [PATCH 3/4] fmt --- src/c/mod.rs | 10 +++++++--- src/c/types.rs | 6 +++++- src/wasm/mod.rs | 12 ++++++++---- src/wasm/types.rs | 7 +++++-- 4 files changed, 25 insertions(+), 10 deletions(-) diff --git a/src/c/mod.rs b/src/c/mod.rs index 9fd316c..b0eb4b0 100644 --- a/src/c/mod.rs +++ b/src/c/mod.rs @@ -50,7 +50,9 @@ use torii_client::client::Client as TClient; use torii_relay::types::Message; use torii_typed_data::TypedData; use tower_http::cors::{AllowOrigin, CorsLayer}; -use types::{Controller, EntityKeysClause, Event, IndexerUpdate, Policy, Struct, Token, TokenBalance}; +use types::{ + Controller, EntityKeysClause, Event, IndexerUpdate, Policy, Struct, Token, TokenBalance, +}; use url::Url; use self::types::{ @@ -733,7 +735,8 @@ pub unsafe extern "C" fn client_publish_message( /// /// # Parameters /// * `client` - Pointer to ToriiClient instance -/// * `contract_addresses` - Array of contract addresses. If empty, all controllers will be returned. +/// * `contract_addresses` - Array of contract addresses. If empty, all controllers will be +/// returned. /// /// # Returns /// Result containing controllers or error @@ -743,7 +746,8 @@ pub unsafe extern "C" fn client_controllers( contract_addresses: *const types::FieldElement, contract_addresses_len: usize, ) -> Result> { - let contract_addresses = unsafe { std::slice::from_raw_parts(contract_addresses, contract_addresses_len) }; + let contract_addresses = + unsafe { std::slice::from_raw_parts(contract_addresses, contract_addresses_len) }; let contract_addresses = contract_addresses.iter().map(|f| f.into()).collect::>(); let controllers_future = unsafe { (*client).inner.controllers(contract_addresses) }; diff --git a/src/c/types.rs b/src/c/types.rs index 60a244a..a02b4fc 100644 --- a/src/c/types.rs +++ b/src/c/types.rs @@ -92,7 +92,11 @@ pub struct Controller { impl From<&torii_grpc::types::Controller> for Controller { fn from(val: &torii_grpc::types::Controller) -> Self { - Controller { address: (&val.address).into(), username: CString::new(val.username.clone()).unwrap().into_raw(), deployed_at_timestamp: val.deployed_at } + Controller { + address: (&val.address).into(), + username: CString::new(val.username.clone()).unwrap().into_raw(), + deployed_at_timestamp: val.deployed_at, + } } } diff --git a/src/wasm/mod.rs b/src/wasm/mod.rs index da21e38..879d679 100644 --- a/src/wasm/mod.rs +++ b/src/wasm/mod.rs @@ -40,8 +40,8 @@ use crate::utils::watch_tx; mod types; use types::{ - BlockId, Call, Calls, ClientConfig, Entities, Entity, IndexerUpdate, KeysClause, KeysClauses, - Model, Query, Signature, Token, TokenBalance, TokenBalances, Tokens, Controller, Controllers, + BlockId, Call, Calls, ClientConfig, Controller, Controllers, Entities, Entity, IndexerUpdate, + KeysClause, KeysClauses, Model, Query, Signature, Token, TokenBalance, TokenBalances, Tokens, }; const JSON_COMPAT_SERIALIZER: serde_wasm_bindgen::Serializer = @@ -591,12 +591,16 @@ impl ToriiClient { /// Gets controllers along with their usernames for the given contract addresses /// /// # Parameters - /// * `contract_addresses` - Array of contract addresses as hex strings. If empty, all controllers will be returned. + /// * `contract_addresses` - Array of contract addresses as hex strings. If empty, all + /// controllers will be returned. /// /// # Returns /// Result containing controllers or error #[wasm_bindgen(js_name = getControllers)] - pub async fn get_controllers(&self, contract_addresses: Vec) -> Result { + pub async fn get_controllers( + &self, + contract_addresses: Vec, + ) -> Result { let contract_addresses = contract_addresses .into_iter() .map(|c| Felt::from_str(&c)) diff --git a/src/wasm/types.rs b/src/wasm/types.rs index cde7ee4..264f829 100644 --- a/src/wasm/types.rs +++ b/src/wasm/types.rs @@ -13,7 +13,6 @@ use wasm_bindgen::prelude::*; use super::utils::parse_ty_as_json_str; - #[derive(Tsify, Serialize, Deserialize, Debug)] #[tsify(into_wasm_abi, from_wasm_abi)] pub struct Controllers(pub Vec); @@ -28,7 +27,11 @@ pub struct Controller { impl From<&torii_grpc::types::Controller> for Controller { fn from(value: &torii_grpc::types::Controller) -> Self { - Self { address: format!("{:#x}", value.address), username: value.username.clone(), deployed_at_timestamp: value.deployed_at } + Self { + address: format!("{:#x}", value.address), + username: value.username.clone(), + deployed_at_timestamp: value.deployed_at, + } } } From a88065e9afe337355c1dc6b66382f09b433f3139 Mon Sep 17 00:00:00 2001 From: Nasr Date: Fri, 7 Feb 2025 18:50:40 +0800 Subject: [PATCH 4/4] rename connected controller ptr to ocntrolleraccount --- dojo.h | 42 ++++++++++++++++++++++-------------------- dojo.hpp | 25 +++++++++++++------------ dojo.pyx | 38 +++++++++++++++++++++----------------- src/c/mod.rs | 39 ++++++++++++++++----------------------- src/types.rs | 2 +- 5 files changed, 73 insertions(+), 73 deletions(-) diff --git a/dojo.h b/dojo.h index 5ececb7..4354a74 100644 --- a/dojo.h +++ b/dojo.h @@ -9,8 +9,9 @@ namespace dojo_bindings { struct ToriiClient; struct Policy; -struct Controller; +struct ControllerAccount; struct Call; +struct Controller; struct Entity; struct Query; struct CHashItemFieldElementModelMetadata; @@ -83,22 +84,22 @@ typedef struct FieldElement { uint8_t data[32]; } FieldElement; -typedef enum ResultController_Tag { - OkController, - ErrController, -} ResultController_Tag; +typedef enum ResultControllerAccount_Tag { + OkControllerAccount, + ErrControllerAccount, +} ResultControllerAccount_Tag; -typedef struct ResultController { - ResultController_Tag tag; +typedef struct ResultControllerAccount { + ResultControllerAccount_Tag tag; union { struct { - struct Controller *ok; + struct ControllerAccount *ok; }; struct { struct Error err; }; }; -} ResultController; +} ResultControllerAccount; typedef enum Resultbool_Tag { Okbool, @@ -830,7 +831,7 @@ struct ResultToriiClient client_new(const char *torii_url, void controller_connect(const char *rpc_url, const struct Policy *policies, uintptr_t policies_len, - void (*account_callback)(struct Controller*)); + void (*account_callback)(struct ControllerAccount*)); /** * Retrieves a stored session account if one exists and is valid @@ -843,9 +844,9 @@ void controller_connect(const char *rpc_url, * # Returns * Result containing pointer to SessionAccount or error if no valid account exists */ -struct ResultController controller_account(const struct Policy *policies, - uintptr_t policies_len, - struct FieldElement chain_id); +struct ResultControllerAccount controller_account(const struct Policy *policies, + uintptr_t policies_len, + struct FieldElement chain_id); /** * Clears sessions matching the specified policies and chain ID @@ -871,7 +872,7 @@ struct Resultbool controller_clear(const struct Policy *policies, * # Returns * CString containing the username */ -const char *controller_username(struct Controller *controller); +const char *controller_username(struct ControllerAccount *controller); /** * Gets account address @@ -882,7 +883,7 @@ const char *controller_username(struct Controller *controller); * # Returns * FieldElement containing the account address */ -struct FieldElement controller_address(struct Controller *controller); +struct FieldElement controller_address(struct ControllerAccount *controller); /** * Gets account chain ID @@ -893,7 +894,7 @@ struct FieldElement controller_address(struct Controller *controller); * # Returns * FieldElement containing the chain ID */ -struct FieldElement controller_chain_id(struct Controller *controller); +struct FieldElement controller_chain_id(struct ControllerAccount *controller); /** * Gets account nonce @@ -904,7 +905,7 @@ struct FieldElement controller_chain_id(struct Controller *controller); * # Returns * Result containing FieldElement nonce or error */ -struct ResultFieldElement controller_nonce(struct Controller *controller); +struct ResultFieldElement controller_nonce(struct ControllerAccount *controller); /** * Executes raw transaction @@ -917,7 +918,7 @@ struct ResultFieldElement controller_nonce(struct Controller *controller); * # Returns * Result containing transaction hash as FieldElement or error */ -struct ResultFieldElement controller_execute_raw(struct Controller *controller, +struct ResultFieldElement controller_execute_raw(struct ControllerAccount *controller, const struct Call *calldata, uintptr_t calldata_len); @@ -932,7 +933,7 @@ struct ResultFieldElement controller_execute_raw(struct Controller *controller, * # Returns * Result containing transaction hash as FieldElement or error */ -struct ResultFieldElement controller_execute_from_outside(struct Controller *controller, +struct ResultFieldElement controller_execute_from_outside(struct ControllerAccount *controller, const struct Call *calldata, uintptr_t calldata_len); @@ -967,7 +968,8 @@ struct ResultCArrayu8 client_publish_message(struct ToriiClient *client, * * # Parameters * * `client` - Pointer to ToriiClient instance - * * `contract_addresses` - Array of contract addresses. If empty, all controllers will be returned. + * * `contract_addresses` - Array of contract addresses. If empty, all controllers will be + * returned. * * # Returns * Result containing controllers or error diff --git a/dojo.hpp b/dojo.hpp index 9e27e85..9849f31 100644 --- a/dojo.hpp +++ b/dojo.hpp @@ -8,7 +8,7 @@ namespace dojo_bindings { struct ToriiClient; struct Policy; -struct Controller; +struct ControllerAccount; struct Call; struct Ty; struct Query; @@ -988,7 +988,7 @@ Result client_new(const char *torii_url, void controller_connect(const char *rpc_url, const Policy *policies, uintptr_t policies_len, - void (*account_callback)(Controller*)); + void (*account_callback)(ControllerAccount*)); /// Retrieves a stored session account if one exists and is valid /// @@ -999,9 +999,9 @@ void controller_connect(const char *rpc_url, /// /// # Returns /// Result containing pointer to SessionAccount or error if no valid account exists -Result controller_account(const Policy *policies, - uintptr_t policies_len, - FieldElement chain_id); +Result controller_account(const Policy *policies, + uintptr_t policies_len, + FieldElement chain_id); /// Clears sessions matching the specified policies and chain ID /// @@ -1023,7 +1023,7 @@ Result controller_clear(const Policy *policies, /// /// # Returns /// CString containing the username -const char *controller_username(Controller *controller); +const char *controller_username(ControllerAccount *controller); /// Gets account address /// @@ -1032,7 +1032,7 @@ const char *controller_username(Controller *controller); /// /// # Returns /// FieldElement containing the account address -FieldElement controller_address(Controller *controller); +FieldElement controller_address(ControllerAccount *controller); /// Gets account chain ID /// @@ -1041,7 +1041,7 @@ FieldElement controller_address(Controller *controller); /// /// # Returns /// FieldElement containing the chain ID -FieldElement controller_chain_id(Controller *controller); +FieldElement controller_chain_id(ControllerAccount *controller); /// Gets account nonce /// @@ -1050,7 +1050,7 @@ FieldElement controller_chain_id(Controller *controller); /// /// # Returns /// Result containing FieldElement nonce or error -Result controller_nonce(Controller *controller); +Result controller_nonce(ControllerAccount *controller); /// Executes raw transaction /// @@ -1061,7 +1061,7 @@ Result controller_nonce(Controller *controller); /// /// # Returns /// Result containing transaction hash as FieldElement or error -Result controller_execute_raw(Controller *controller, +Result controller_execute_raw(ControllerAccount *controller, const Call *calldata, uintptr_t calldata_len); @@ -1074,7 +1074,7 @@ Result controller_execute_raw(Controller *controller, /// /// # Returns /// Result containing transaction hash as FieldElement or error -Result controller_execute_from_outside(Controller *controller, +Result controller_execute_from_outside(ControllerAccount *controller, const Call *calldata, uintptr_t calldata_len); @@ -1104,7 +1104,8 @@ Result> client_publish_message(ToriiClient *client, /// /// # Parameters /// * `client` - Pointer to ToriiClient instance -/// * `contract_addresses` - Array of contract addresses. If empty, all controllers will be returned. +/// * `contract_addresses` - Array of contract addresses. If empty, all controllers will be +/// returned. /// /// # Returns /// Result containing controllers or error diff --git a/dojo.pyx b/dojo.pyx index e563be2..840f517 100644 --- a/dojo.pyx +++ b/dojo.pyx @@ -35,6 +35,9 @@ cdef extern from *: cdef struct Account: pass + cdef struct ControllerAccount: + pass + cdef struct Provider: pass @@ -59,13 +62,13 @@ cdef extern from *: cdef struct FieldElement: uint8_t data[32]; - cdef enum ResultController_Tag: - OkController, - ErrController, + cdef enum ResultControllerAccount_Tag: + OkControllerAccount, + ErrControllerAccount, - cdef struct ResultController: - ResultController_Tag tag; - Controller *ok; + cdef struct ResultControllerAccount: + ResultControllerAccount_Tag tag; + ControllerAccount *ok; Error err; cdef enum Resultbool_Tag: @@ -532,7 +535,7 @@ cdef extern from *: void controller_connect(const char *rpc_url, const Policy *policies, uintptr_t policies_len, - void (*account_callback)(Controller*)); + void (*account_callback)(ControllerAccount*)); # Retrieves a stored session account if one exists and is valid # @@ -543,9 +546,9 @@ cdef extern from *: # # # Returns # Result containing pointer to SessionAccount or error if no valid account exists - ResultController controller_account(const Policy *policies, - uintptr_t policies_len, - FieldElement chain_id); + ResultControllerAccount controller_account(const Policy *policies, + uintptr_t policies_len, + FieldElement chain_id); # Clears sessions matching the specified policies and chain ID # @@ -567,7 +570,7 @@ cdef extern from *: # # # Returns # CString containing the username - const char *controller_username(Controller *controller); + const char *controller_username(ControllerAccount *controller); # Gets account address # @@ -576,7 +579,7 @@ cdef extern from *: # # # Returns # FieldElement containing the account address - FieldElement controller_address(Controller *controller); + FieldElement controller_address(ControllerAccount *controller); # Gets account chain ID # @@ -585,7 +588,7 @@ cdef extern from *: # # # Returns # FieldElement containing the chain ID - FieldElement controller_chain_id(Controller *controller); + FieldElement controller_chain_id(ControllerAccount *controller); # Gets account nonce # @@ -594,7 +597,7 @@ cdef extern from *: # # # Returns # Result containing FieldElement nonce or error - ResultFieldElement controller_nonce(Controller *controller); + ResultFieldElement controller_nonce(ControllerAccount *controller); # Executes raw transaction # @@ -605,7 +608,7 @@ cdef extern from *: # # # Returns # Result containing transaction hash as FieldElement or error - ResultFieldElement controller_execute_raw(Controller *controller, + ResultFieldElement controller_execute_raw(ControllerAccount *controller, const Call *calldata, uintptr_t calldata_len); @@ -618,7 +621,7 @@ cdef extern from *: # # # Returns # Result containing transaction hash as FieldElement or error - ResultFieldElement controller_execute_from_outside(Controller *controller, + ResultFieldElement controller_execute_from_outside(ControllerAccount *controller, const Call *calldata, uintptr_t calldata_len); @@ -648,7 +651,8 @@ cdef extern from *: # # # Parameters # * `client` - Pointer to ToriiClient instance - # * `contract_addresses` - Array of contract addresses. If empty, all controllers will be returned. + # * `contract_addresses` - Array of contract addresses. If empty, all controllers will be + # returned. # # # Returns # Result containing controllers or error diff --git a/src/c/mod.rs b/src/c/mod.rs index b0eb4b0..633fb1b 100644 --- a/src/c/mod.rs +++ b/src/c/mod.rs @@ -51,17 +51,15 @@ use torii_relay::types::Message; use torii_typed_data::TypedData; use tower_http::cors::{AllowOrigin, CorsLayer}; use types::{ - Controller, EntityKeysClause, Event, IndexerUpdate, Policy, Struct, Token, TokenBalance, + BlockId, CArray, Call, Controller, Entity, EntityKeysClause, Error, Event, IndexerUpdate, + Policy, Query, Result, Signature, Struct, Token, TokenBalance, ToriiClient, Ty, WorldMetadata, }; use url::Url; -use self::types::{ - BlockId, CArray, Call, Entity, Error, Query, Result, Signature, ToriiClient, Ty, WorldMetadata, -}; use crate::constants; use crate::types::{ - Account, Provider, RegisterSessionResponse, RegisteredAccount, RegisteredSession, - SessionsStorage, Subscription, + Account, ControllerAccount, Provider, RegisterSessionResponse, RegisteredAccount, + RegisteredSession, SessionsStorage, Subscription, }; use crate::utils::watch_tx; @@ -115,7 +113,7 @@ struct CallbackState { policies: Vec, private_key: SigningKey, public_key: Felt, - account_callback: extern "C" fn(*mut crate::types::Controller), + account_callback: extern "C" fn(*mut ControllerAccount), } // Modify handle_callback to call the callback @@ -197,7 +195,7 @@ async fn handle_callback(State(state): State, body: String) -> im ); // Call the callback with the new account - (state.account_callback)(Box::into_raw(Box::new(crate::types::Controller { + (state.account_callback)(Box::into_raw(Box::new(ControllerAccount { account: session_account, username: payload.username, }))); @@ -247,7 +245,7 @@ pub unsafe extern "C" fn controller_connect( rpc_url: *const c_char, policies: *const Policy, policies_len: usize, - account_callback: extern "C" fn(*mut crate::types::Controller), + account_callback: extern "C" fn(*mut ControllerAccount), ) { let rpc_url = unsafe { CStr::from_ptr(rpc_url).to_string_lossy().into_owned() }; let policies = unsafe { std::slice::from_raw_parts(policies, policies_len) }; @@ -336,7 +334,7 @@ pub unsafe extern "C" fn controller_account( policies: *const Policy, policies_len: usize, chain_id: types::FieldElement, -) -> Result<*mut crate::types::Controller> { +) -> Result<*mut ControllerAccount> { let policies = unsafe { std::slice::from_raw_parts(policies, policies_len) }; let account_policies: Vec = policies .iter() @@ -371,7 +369,7 @@ pub unsafe extern "C" fn controller_account( // Helper function to try creating a session account let try_create_session_account = |account: &RegisteredAccount, session: &RegisteredSession| - -> Option { + -> Option { // Check chain ID if account.chain_id != chain_id { return None; @@ -418,10 +416,7 @@ pub unsafe extern "C" fn controller_account( session, ); - Some(crate::types::Controller { - account: session_account, - username: account.username.clone(), - }) + Some(ControllerAccount { account: session_account, username: account.username.clone() }) }; // First try the active account if it exists @@ -547,9 +542,7 @@ pub unsafe extern "C" fn controller_clear( /// # Returns /// CString containing the username #[no_mangle] -pub unsafe extern "C" fn controller_username( - controller: *mut crate::types::Controller, -) -> *const c_char { +pub unsafe extern "C" fn controller_username(controller: *mut ControllerAccount) -> *const c_char { CString::new((*controller).username.to_string()).unwrap().into_raw() } @@ -562,7 +555,7 @@ pub unsafe extern "C" fn controller_username( /// FieldElement containing the account address #[no_mangle] pub unsafe extern "C" fn controller_address( - controller: *mut crate::types::Controller, + controller: *mut ControllerAccount, ) -> types::FieldElement { (&(*controller).account.address()).into() } @@ -576,7 +569,7 @@ pub unsafe extern "C" fn controller_address( /// FieldElement containing the chain ID #[no_mangle] pub unsafe extern "C" fn controller_chain_id( - controller: *mut crate::types::Controller, + controller: *mut ControllerAccount, ) -> types::FieldElement { (&(*controller).account.chain_id()).into() } @@ -590,7 +583,7 @@ pub unsafe extern "C" fn controller_chain_id( /// Result containing FieldElement nonce or error #[no_mangle] pub unsafe extern "C" fn controller_nonce( - controller: *mut crate::types::Controller, + controller: *mut ControllerAccount, ) -> Result { let nonce = match RUNTIME.block_on((*controller).account.get_nonce()) { Ok(nonce) => nonce, @@ -611,7 +604,7 @@ pub unsafe extern "C" fn controller_nonce( /// Result containing transaction hash as FieldElement or error #[no_mangle] pub unsafe extern "C" fn controller_execute_raw( - controller: *mut crate::types::Controller, + controller: *mut ControllerAccount, calldata: *const Call, calldata_len: usize, ) -> Result { @@ -640,7 +633,7 @@ pub unsafe extern "C" fn controller_execute_raw( /// Result containing transaction hash as FieldElement or error #[no_mangle] pub unsafe extern "C" fn controller_execute_from_outside( - controller: *mut crate::types::Controller, + controller: *mut ControllerAccount, calldata: *const Call, calldata_len: usize, ) -> Result { diff --git a/src/types.rs b/src/types.rs index dd9d986..bc49c2f 100644 --- a/src/types.rs +++ b/src/types.rs @@ -102,7 +102,7 @@ pub struct Provider(pub(crate) Arc>); #[wasm_bindgen] pub struct Account(pub(crate) SingleOwnerAccount>, LocalWallet>); #[wasm_bindgen] -pub struct Controller { +pub struct ControllerAccount { pub(crate) account: account_sdk::account::session::account::SessionAccount, pub(crate) username: String, }