From 8bb74305825ade74f4d37af80b702ba437e7ba77 Mon Sep 17 00:00:00 2001 From: Nasr Date: Thu, 8 Aug 2024 16:39:17 -0400 Subject: [PATCH 1/2] feat: add get accoutn nonce --- dojo.h | 2 ++ dojo.hpp | 2 ++ src/c/mod.rs | 15 ++++++++++++++- 3 files changed, 18 insertions(+), 1 deletion(-) diff --git a/dojo.h b/dojo.h index 4b6fd3e..5733a34 100644 --- a/dojo.h +++ b/dojo.h @@ -707,6 +707,8 @@ struct FieldElement account_chain_id(struct Account *account); void account_set_block_id(struct Account *account, struct BlockId block_id); +struct ResultFieldElement account_nonce(struct Account *account); + struct ResultFieldElement account_execute_raw(struct Account *account, const struct Call *calldata, uintptr_t calldata_len); diff --git a/dojo.hpp b/dojo.hpp index b248b98..f5349a6 100644 --- a/dojo.hpp +++ b/dojo.hpp @@ -998,6 +998,8 @@ FieldElement account_chain_id(Account *account); void account_set_block_id(Account *account, BlockId block_id); +Result account_nonce(Account *account); + Result account_execute_raw(Account *account, const Call *calldata, uintptr_t calldata_len); diff --git a/src/c/mod.rs b/src/c/mod.rs index 92be21a..cfec299 100644 --- a/src/c/mod.rs +++ b/src/c/mod.rs @@ -6,7 +6,9 @@ use std::os::raw::c_char; use std::sync::Arc; use cainome::cairo_serde::{self, ByteArray, CairoSerde}; -use starknet::accounts::{Account as StarknetAccount, ExecutionEncoding, SingleOwnerAccount}; +use starknet::accounts::{ + Account as StarknetAccount, ConnectedAccount, ExecutionEncoding, SingleOwnerAccount, +}; use starknet::core::types::FunctionCall; use starknet::core::utils::get_contract_address; use starknet::providers::jsonrpc::HttpTransport; @@ -583,6 +585,17 @@ pub unsafe extern "C" fn account_set_block_id(account: *mut Account, block_id: B (*account).0.set_block_id(block_id); } +#[no_mangle] +#[allow(clippy::missing_safety_doc)] +pub unsafe extern "C" fn account_nonce(account: *mut Account) -> Result { + let nonce = match tokio::runtime::Runtime::new().unwrap().block_on((*account).0.get_nonce()) { + Ok(nonce) => nonce, + Err(e) => return Result::Err(e.into()), + }; + + Result::Ok((&nonce).into()) +} + #[no_mangle] #[allow(clippy::missing_safety_doc)] pub unsafe extern "C" fn account_execute_raw( From 97989e4170fb5b91166cdf2661ad447b0083a8ff Mon Sep 17 00:00:00 2001 From: Nasr Date: Thu, 8 Aug 2024 16:42:28 -0400 Subject: [PATCH 2/2] feat: add get nonce to wasm --- dojo.pyx | 10 ++++++++++ src/wasm/mod.rs | 6 ++++++ 2 files changed, 16 insertions(+) diff --git a/dojo.pyx b/dojo.pyx index 0c33d6e..55472ee 100644 --- a/dojo.pyx +++ b/dojo.pyx @@ -425,6 +425,14 @@ cdef extern from *: FieldElement poseidon_hash(const FieldElement *felts, uintptr_t felts_len); + ResultFieldElement get_selector_from_name(const char *name); + + FieldElement starknet_keccak(const uint8_t *bytes, uintptr_t bytes_len); + + ResultFieldElement cairo_short_string_to_felt(const char *str); + + Resultc_char parse_cairo_short_string(FieldElement felt); + ResultFieldElement typed_data_encode(const char *typed_data, FieldElement address); FieldElement signing_key_new(); @@ -453,6 +461,8 @@ cdef extern from *: void account_set_block_id(Account *account, BlockId block_id); + ResultFieldElement account_nonce(Account *account); + ResultFieldElement account_execute_raw(Account *account, const Call *calldata, uintptr_t calldata_len); diff --git a/src/wasm/mod.rs b/src/wasm/mod.rs index 75427a6..bc6abe1 100644 --- a/src/wasm/mod.rs +++ b/src/wasm/mod.rs @@ -287,6 +287,12 @@ impl Account { Result::Ok(Account(account)) } + + #[wasm_bindgen(js_name = nonce)] + pub async unsafe fn nonce(&self) -> Result { + let nonce = self.0.get_nonce().await.map_err(|e| JsValue::from(e.to_string()))?; + Ok(format!("{:#x}", nonce)) + } } #[wasm_bindgen(js_name = hashGetContractAddress)]