diff --git a/packages/account-wasm/pkg/account_wasm_bg.js b/packages/account-wasm/pkg/account_wasm_bg.js index c205dc2b6..faef5df8e 100644 --- a/packages/account-wasm/pkg/account_wasm_bg.js +++ b/packages/account-wasm/pkg/account_wasm_bg.js @@ -457,16 +457,6 @@ export function __wbindgen_string_get(arg0, arg1) { getInt32Memory0()[arg0 / 4 + 0] = ptr1; }; -export function __wbindgen_cb_drop(arg0) { - const obj = takeObject(arg0).original; - if (obj.cnt-- == 1) { - obj.a = 0; - return true; - } - const ret = false; - return ret; -}; - export function __wbindgen_is_bigint(arg0) { const ret = typeof(getObject(arg0)) === 'bigint'; return ret; @@ -516,6 +506,16 @@ export function __wbindgen_is_undefined(arg0) { return ret; }; +export function __wbindgen_cb_drop(arg0) { + const obj = takeObject(arg0).original; + if (obj.cnt-- == 1) { + obj.a = 0; + return true; + } + const ret = false; + return ret; +}; + export function __wbindgen_jsval_loose_eq(arg0, arg1) { const ret = getObject(arg0) == getObject(arg1); return ret; @@ -561,64 +561,21 @@ export function __wbg_String_88810dfeb4021902(arg0, arg1) { getInt32Memory0()[arg0 / 4 + 0] = ptr1; }; -export function __wbg_crypto_1d1f22824a6a080c(arg0) { - const ret = getObject(arg0).crypto; - return addHeapObject(ret); -}; - -export function __wbg_process_4a72847cc503995b(arg0) { - const ret = getObject(arg0).process; - return addHeapObject(ret); -}; - -export function __wbg_versions_f686565e586dd935(arg0) { - const ret = getObject(arg0).versions; +export function __wbg_fetch_bc7c8e27076a5c84(arg0) { + const ret = fetch(getObject(arg0)); return addHeapObject(ret); }; -export function __wbg_node_104a2ff8d6ea03a2(arg0) { - const ret = getObject(arg0).node; +export function __wbg_queueMicrotask_3cbae2ec6b6cd3d6(arg0) { + const ret = getObject(arg0).queueMicrotask; return addHeapObject(ret); }; -export function __wbindgen_is_string(arg0) { - const ret = typeof(getObject(arg0)) === 'string'; - return ret; -}; - -export function __wbg_require_cca90b1a94a0255b() { return handleError(function () { - const ret = module.require; - return addHeapObject(ret); -}, arguments) }; - export function __wbindgen_is_function(arg0) { const ret = typeof(getObject(arg0)) === 'function'; return ret; }; -export function __wbg_msCrypto_eb05e62b530a1508(arg0) { - const ret = getObject(arg0).msCrypto; - return addHeapObject(ret); -}; - -export function __wbg_randomFillSync_5c9c955aa56b6049() { return handleError(function (arg0, arg1) { - getObject(arg0).randomFillSync(takeObject(arg1)); -}, arguments) }; - -export function __wbg_getRandomValues_3aa56aa6edec874c() { return handleError(function (arg0, arg1) { - getObject(arg0).getRandomValues(getObject(arg1)); -}, arguments) }; - -export function __wbg_fetch_bc7c8e27076a5c84(arg0) { - const ret = fetch(getObject(arg0)); - return addHeapObject(ret); -}; - -export function __wbg_queueMicrotask_3cbae2ec6b6cd3d6(arg0) { - const ret = getObject(arg0).queueMicrotask; - return addHeapObject(ret); -}; - export function __wbg_queueMicrotask_481971b0d87f3dd4(arg0) { queueMicrotask(getObject(arg0)); }; @@ -753,6 +710,49 @@ export function __wbg_hostname_3d9f22c60dc5bec6() { return handleError(function getInt32Memory0()[arg0 / 4 + 0] = ptr1; }, arguments) }; +export function __wbg_crypto_1d1f22824a6a080c(arg0) { + const ret = getObject(arg0).crypto; + return addHeapObject(ret); +}; + +export function __wbg_process_4a72847cc503995b(arg0) { + const ret = getObject(arg0).process; + return addHeapObject(ret); +}; + +export function __wbg_versions_f686565e586dd935(arg0) { + const ret = getObject(arg0).versions; + return addHeapObject(ret); +}; + +export function __wbg_node_104a2ff8d6ea03a2(arg0) { + const ret = getObject(arg0).node; + return addHeapObject(ret); +}; + +export function __wbindgen_is_string(arg0) { + const ret = typeof(getObject(arg0)) === 'string'; + return ret; +}; + +export function __wbg_require_cca90b1a94a0255b() { return handleError(function () { + const ret = module.require; + return addHeapObject(ret); +}, arguments) }; + +export function __wbg_msCrypto_eb05e62b530a1508(arg0) { + const ret = getObject(arg0).msCrypto; + return addHeapObject(ret); +}; + +export function __wbg_randomFillSync_5c9c955aa56b6049() { return handleError(function (arg0, arg1) { + getObject(arg0).randomFillSync(takeObject(arg1)); +}, arguments) }; + +export function __wbg_getRandomValues_3aa56aa6edec874c() { return handleError(function (arg0, arg1) { + getObject(arg0).getRandomValues(getObject(arg1)); +}, arguments) }; + export function __wbg_get_bd8e338fbd5f5cc8(arg0, arg1) { const ret = getObject(arg0)[arg1 >>> 0]; return addHeapObject(ret); @@ -1002,8 +1002,8 @@ export function __wbindgen_memory() { return addHeapObject(ret); }; -export function __wbindgen_closure_wrapper1626(arg0, arg1, arg2) { - const ret = makeMutClosure(arg0, arg1, 500, __wbg_adapter_48); +export function __wbindgen_closure_wrapper1507(arg0, arg1, arg2) { + const ret = makeMutClosure(arg0, arg1, 513, __wbg_adapter_48); return addHeapObject(ret); }; diff --git a/packages/account-wasm/pkg/account_wasm_bg.wasm b/packages/account-wasm/pkg/account_wasm_bg.wasm index 02c754a8a..c0713a8cd 100644 Binary files a/packages/account-wasm/pkg/account_wasm_bg.wasm and b/packages/account-wasm/pkg/account_wasm_bg.wasm differ diff --git a/packages/account-wasm/src/errors.rs b/packages/account-wasm/src/errors.rs new file mode 100644 index 000000000..cce4fee91 --- /dev/null +++ b/packages/account-wasm/src/errors.rs @@ -0,0 +1,71 @@ +use account_sdk::signers::SignError; +use base64::DecodeError; +use coset::CoseError; +use starknet::{ + accounts::AccountError, + core::{types::FromStrError, utils::NonAsciiNameError}, +}; +use thiserror::Error; + +#[derive(Error, Debug)] +pub enum CartridgeError { + #[error("Session error: {0}")] + Session(#[from] SessionError), + + #[error("Account operation error: {0}")] + Operation(#[from] OperationError), + + #[error("Encoding error: {0}")] + Encoding(#[from] EncodingError), +} + +#[derive(Error, Debug)] +pub enum SessionError { + #[error("Failed to create session: {0}")] + Creation(SignError), + + #[error("Failed to sign message: {0}")] + Signing(SignError), +} + +#[derive(Error, Debug)] +pub enum OperationError { + #[error("Failed to delegate account: {0}")] + Delegation(String), + + #[error("Failed to estimate fee: {0}")] + FeeEstimation(String), + + #[error("Failed to execute transaction: {0}")] + Execution(String), + + #[error("Failed to deploy account: {0}")] + Deployment(String), + + #[error("Failed to sign message: {0}")] + SignMessage(SignError), + + #[error(transparent)] + AccountError(#[from] AccountError), +} + +#[derive(Error, Debug)] +pub enum EncodingError { + #[error(transparent)] + FromStr(#[from] FromStrError), + + #[error(transparent)] + NonAsciiName(#[from] NonAsciiNameError), + + #[error("Base64 decoding error: {0}")] + Base64Decode(#[from] DecodeError), + + #[error("COSE key error: {0}")] + CoseKey(#[from] CoseError), + + #[error("Invalid JSON: {0}")] + Json(#[from] serde_json::Error), + + #[error("Serialization error: {0}")] + Serialization(#[from] serde_wasm_bindgen::Error), +} diff --git a/packages/account-wasm/src/lib.rs b/packages/account-wasm/src/lib.rs index e59165e42..bda9e3d6f 100644 --- a/packages/account-wasm/src/lib.rs +++ b/packages/account-wasm/src/lib.rs @@ -1,4 +1,5 @@ mod constants; +mod errors; mod paymaster; mod types; mod utils; @@ -26,6 +27,7 @@ use base64::{engine::general_purpose, Engine}; use cainome::cairo_serde::CairoSerde; use constants::ACCOUNT_CLASS_HASH; use coset::{CborSerializable, CoseKey}; +use errors::{OperationError, SessionError}; use factory::cartridge::CartridgeAccountFactory; use factory::AccountDeployment; use paymaster::PaymasterRequest; @@ -128,16 +130,21 @@ impl CartridgeAccount { let methods = policies .into_iter() .map(AllowedMethod::try_from_js_value) - .collect::>>()?; + .collect::, _>>()?; let signer = SigningKey::from_random(); - let session = Session::new(methods, expires_at, &signer.signer())?; + let session = + Session::new(methods, expires_at, &signer.signer()).map_err(SessionError::Creation)?; let hash = session .raw() .get_message_hash_rev_1(self.account.chain_id(), self.account.address()); - let authorization = self.account.sign_hash(hash).await?; + let authorization = self + .account + .sign_hash(hash) + .await + .map_err(SessionError::Signing)?; Ok(to_value(&JsCredentials { authorization, @@ -157,23 +164,26 @@ impl CartridgeAccount { let calls = calls .into_iter() .map(Call::try_from_js_value) - .collect::>>()?; + .collect::, _>>()?; - let fee_estimate = if let Some(session_details) = from_value(session_details)? { + let result = if let Some(session_details) = from_value(session_details)? { self.session_account(session_details) .await? .execute_v1(calls) .fee_estimate_multiplier(fee_multiplier.unwrap_or(1.0)) .estimate_fee() - .await? + .await } else { self.account .execute_v1(calls) .fee_estimate_multiplier(fee_multiplier.unwrap_or(1.0)) .estimate_fee() - .await? + .await }; + let fee_estimate = + result.map_err(|e| OperationError::FeeEstimation(format!("{:#?}", e)))?; + Ok(to_value(&fee_estimate)?) } @@ -189,26 +199,28 @@ impl CartridgeAccount { let calls = calls .into_iter() .map(Call::try_from_js_value) - .collect::>>()?; + .collect::, _>>()?; let details = JsInvocationsDetails::try_from(transaction_details)?; - let execution = if let Some(session_details) = from_value(session_details)? { + let result = if let Some(session_details) = from_value(session_details)? { self.session_account(session_details) .await? .execute_v1(calls) .max_fee(details.max_fee) .nonce(details.nonce) .send() - .await? + .await } else { self.account .execute_v1(calls) .max_fee(details.max_fee) .nonce(details.nonce) .send() - .await? + .await }; + let execution = result.map_err(|e| OperationError::Execution(format!("{:#?}", e)))?; + Ok(to_value(&execution)?) } @@ -228,7 +240,7 @@ impl CartridgeAccount { calls: calls .into_iter() .map(JsCall::try_from) - .collect::>>()?, + .collect::, _>>()?, nonce: SigningKey::from_random().secret_scalar(), }; @@ -265,7 +277,9 @@ impl CartridgeAccount { let signature = self .account .sign_message(serde_json::from_str(&typed_data)?) - .await?; + .await + .map_err(OperationError::SignMessage)?; + Ok(to_value(&signature)?) } @@ -289,8 +303,11 @@ impl CartridgeAccount { starknetutils::cairo_short_string_to_felt(&self.username)?, &factory, ); - let res: starknet::core::types::DeployAccountTransactionResult = - deployment.max_fee(from_value(max_fee)?).send().await?; + let res = deployment + .max_fee(from_value(max_fee)?) + .send() + .await + .map_err(|e| OperationError::Deployment(format!("{:#?}", e)))?; Ok(to_value(&res)?) } @@ -308,7 +325,9 @@ impl CartridgeAccount { }, BlockId::Tag(BlockTag::Pending), ) - .await?; + .await + .map_err(|e| OperationError::Delegation(e.to_string()))?; + Ok(to_value(&res[0])?) } @@ -325,7 +344,8 @@ impl CartridgeAccount { let dummy_guardian = SigningKey::from_secret_scalar(short_string!("CARTRIDGE_GUARDIAN")); let session_signer = SigningKey::from_secret_scalar(details.credentials.private_key); let expires_at: u64 = details.expires_at.parse()?; - let session = Session::new(methods, expires_at, &session_signer.signer())?; + let session = Session::new(methods, expires_at, &session_signer.signer()) + .map_err(SessionError::Creation)?; Ok(SessionAccount::new( JsonRpcClient::new(HttpTransport::new(self.rpc_url.clone())), diff --git a/packages/account-wasm/src/types/call.rs b/packages/account-wasm/src/types/call.rs index 3a3d979f6..332055315 100644 --- a/packages/account-wasm/src/types/call.rs +++ b/packages/account-wasm/src/types/call.rs @@ -7,6 +7,8 @@ use starknet::{ }; use wasm_bindgen::prelude::*; +use crate::errors::EncodingError; + use super::TryFromJsValue; #[serde_as] @@ -21,7 +23,7 @@ pub struct JsCall { } impl TryFrom for Call { - type Error = JsError; + type Error = EncodingError; fn try_from(value: JsCall) -> Result { Ok(Call { @@ -33,7 +35,7 @@ impl TryFrom for Call { } impl TryFrom for JsCall { - type Error = JsError; + type Error = EncodingError; fn try_from(value: JsValue) -> Result { Ok(serde_wasm_bindgen::from_value(value)?) @@ -41,7 +43,7 @@ impl TryFrom for JsCall { } impl TryFromJsValue for Call { - fn try_from_js_value(value: JsValue) -> Result { + fn try_from_js_value(value: JsValue) -> Result { let js_call: JsCall = value.try_into()?; js_call.try_into() } diff --git a/packages/account-wasm/src/types/estimate.rs b/packages/account-wasm/src/types/estimate.rs index a07bbbca4..7bd100c5b 100644 --- a/packages/account-wasm/src/types/estimate.rs +++ b/packages/account-wasm/src/types/estimate.rs @@ -3,6 +3,8 @@ use serde_with::serde_as; use starknet::core::{serde::unsigned_field_element::UfeHex, types::Felt}; use wasm_bindgen::prelude::*; +use crate::errors::EncodingError; + #[serde_as] #[derive(Debug, Deserialize, Serialize)] #[serde(rename_all = "camelCase")] @@ -12,7 +14,7 @@ pub struct JsEstimateFeeDetails { } impl TryFrom for JsEstimateFeeDetails { - type Error = JsError; + type Error = EncodingError; fn try_from(value: JsValue) -> Result { Ok(serde_wasm_bindgen::from_value(value)?) diff --git a/packages/account-wasm/src/types/invocation.rs b/packages/account-wasm/src/types/invocation.rs index c9db1c262..a7ea881c3 100644 --- a/packages/account-wasm/src/types/invocation.rs +++ b/packages/account-wasm/src/types/invocation.rs @@ -4,6 +4,8 @@ use starknet::core::serde::unsigned_field_element::UfeHex; use starknet::core::types::Felt; use wasm_bindgen::prelude::*; +use crate::errors::EncodingError; + #[serde_as] #[derive(Debug, Deserialize, Serialize)] #[serde(rename_all = "camelCase")] @@ -15,7 +17,7 @@ pub struct JsInvocationsDetails { } impl TryFrom for JsInvocationsDetails { - type Error = JsError; + type Error = EncodingError; fn try_from(value: JsValue) -> Result { Ok(serde_wasm_bindgen::from_value(value)?) diff --git a/packages/account-wasm/src/types/mod.rs b/packages/account-wasm/src/types/mod.rs index e4339b1c0..c6cca4d00 100644 --- a/packages/account-wasm/src/types/mod.rs +++ b/packages/account-wasm/src/types/mod.rs @@ -1,4 +1,6 @@ -use wasm_bindgen::{JsError, JsValue}; +use wasm_bindgen::JsValue; + +use crate::errors::EncodingError; pub(crate) mod call; pub(crate) mod estimate; @@ -8,5 +10,5 @@ pub(crate) mod policy; pub(crate) mod session; pub(crate) trait TryFromJsValue { - fn try_from_js_value(value: JsValue) -> Result; + fn try_from_js_value(value: JsValue) -> Result; } diff --git a/packages/account-wasm/src/types/outside_execution.rs b/packages/account-wasm/src/types/outside_execution.rs index b6827eb29..a155ea092 100644 --- a/packages/account-wasm/src/types/outside_execution.rs +++ b/packages/account-wasm/src/types/outside_execution.rs @@ -6,6 +6,8 @@ use starknet::macros::short_string; use starknet::{accounts::Call, core::types::Felt}; use wasm_bindgen::prelude::*; +use crate::errors::EncodingError; + use super::call::JsCall; #[serde_as] @@ -22,7 +24,7 @@ pub struct JsOutsideExecution { } impl TryFrom for JsOutsideExecution { - type Error = JsError; + type Error = EncodingError; fn try_from(value: JsValue) -> Result { Ok(serde_wasm_bindgen::from_value(value)?) @@ -30,7 +32,7 @@ impl TryFrom for JsOutsideExecution { } impl TryFrom for OutsideExecution { - type Error = JsError; + type Error = EncodingError; fn try_from(value: JsOutsideExecution) -> Result { let caller = if value.caller.eq(&short_string!("ANY_CALLER")) { diff --git a/packages/account-wasm/src/types/policy.rs b/packages/account-wasm/src/types/policy.rs index 0d93d8640..746108755 100644 --- a/packages/account-wasm/src/types/policy.rs +++ b/packages/account-wasm/src/types/policy.rs @@ -1,12 +1,11 @@ use account_sdk::account::session::hash::AllowedMethod; use serde::{Deserialize, Serialize}; -use starknet::core::{ - types::{Felt, FromStrError}, - utils::get_selector_from_name, -}; +use starknet::core::{types::Felt, utils::get_selector_from_name}; use std::str::FromStr; use wasm_bindgen::prelude::*; +use crate::errors::EncodingError; + use super::TryFromJsValue; #[derive(Clone, Debug, Deserialize, Serialize)] @@ -17,7 +16,7 @@ pub struct JsPolicy { } impl TryFrom for JsPolicy { - type Error = JsError; + type Error = EncodingError; fn try_from(value: JsValue) -> Result { Ok(serde_wasm_bindgen::from_value(value)?) @@ -25,7 +24,7 @@ impl TryFrom for JsPolicy { } impl TryFrom for AllowedMethod { - type Error = FromStrError; + type Error = EncodingError; fn try_from(value: JsPolicy) -> Result { Ok(AllowedMethod { @@ -36,7 +35,7 @@ impl TryFrom for AllowedMethod { } impl TryFromJsValue for AllowedMethod { - fn try_from_js_value(value: JsValue) -> Result { + fn try_from_js_value(value: JsValue) -> Result { let js_policy: JsPolicy = value.try_into()?; let allowed_method: AllowedMethod = js_policy.try_into()?; Ok(allowed_method)