Skip to content

Commit

Permalink
Output better errors from wasm (#466)
Browse files Browse the repository at this point in the history
  • Loading branch information
broody authored Jul 11, 2024
1 parent b8f25fc commit 51d1939
Show file tree
Hide file tree
Showing 10 changed files with 192 additions and 92 deletions.
118 changes: 59 additions & 59 deletions packages/account-wasm/pkg/account_wasm_bg.js
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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));
};
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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);
};

Binary file modified packages/account-wasm/pkg/account_wasm_bg.wasm
Binary file not shown.
71 changes: 71 additions & 0 deletions packages/account-wasm/src/errors.rs
Original file line number Diff line number Diff line change
@@ -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<SignError>),
}

#[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),
}
54 changes: 37 additions & 17 deletions packages/account-wasm/src/lib.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
mod constants;
mod errors;
mod paymaster;
mod types;
mod utils;
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -128,16 +130,21 @@ impl CartridgeAccount {
let methods = policies
.into_iter()
.map(AllowedMethod::try_from_js_value)
.collect::<Result<Vec<AllowedMethod>>>()?;
.collect::<std::result::Result<Vec<_>, _>>()?;

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,
Expand All @@ -157,23 +164,26 @@ impl CartridgeAccount {
let calls = calls
.into_iter()
.map(Call::try_from_js_value)
.collect::<Result<Vec<Call>>>()?;
.collect::<std::result::Result<Vec<_>, _>>()?;

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)?)
}

Expand All @@ -189,26 +199,28 @@ impl CartridgeAccount {
let calls = calls
.into_iter()
.map(Call::try_from_js_value)
.collect::<Result<Vec<Call>>>()?;
.collect::<std::result::Result<Vec<_>, _>>()?;

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)?)
}

Expand All @@ -228,7 +240,7 @@ impl CartridgeAccount {
calls: calls
.into_iter()
.map(JsCall::try_from)
.collect::<Result<Vec<JsCall>>>()?,
.collect::<std::result::Result<Vec<_>, _>>()?,
nonce: SigningKey::from_random().secret_scalar(),
};

Expand Down Expand Up @@ -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)?)
}

Expand All @@ -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)?)
}
Expand All @@ -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])?)
}

Expand All @@ -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())),
Expand Down
Loading

0 comments on commit 51d1939

Please sign in to comment.