diff --git a/Assets/Dojo/Plugins/WebGL/starknet.jslib b/Assets/Dojo/Plugins/WebGL/starknet.jslib index dbe612f9..5ee047b9 100644 --- a/Assets/Dojo/Plugins/WebGL/starknet.jslib +++ b/Assets/Dojo/Plugins/WebGL/starknet.jslib @@ -41,15 +41,49 @@ mergeInto(LibraryManager.library, { account.setBlockId(UTF8ToString(blockId)); }, AccountExecuteRaw: async function (accountPtr, callsStr, cb) { - const account = wasm_bindgen.Account.__wrap(accountPtr); - const calls = JSON.parse(UTF8ToString(callsStr)); - const txHash = await account.executeRaw(calls); - const bufferSize = lengthBytesUTF8(txHash) + 1; - const buffer = _malloc(bufferSize); - stringToUTF8(txHash, buffer, bufferSize); - - account.__destroy_into_raw(); - dynCall_vi(cb, buffer); + let account; + let buffer; + + try { + account = wasm_bindgen.Account.__wrap(accountPtr); + const calls = JSON.parse(UTF8ToString(callsStr)); + + // Execute the raw calls and get the transaction hash + const txHash = await account.executeRaw(calls); + + // Create a success message + const message = JSON.stringify({ success: true, result: txHash }); + + // Allocate buffer for the message + const bufferSize = lengthBytesUTF8(message) + 1; + buffer = _malloc(bufferSize); + stringToUTF8(message, buffer, bufferSize); + + // Call the callback function with the success message + dynCall_vi(cb, buffer); + } catch (error) { + // Log the error + console.error('Starknet call error:', error); + + // Create an error message + const message = JSON.stringify({ success: false, error: error.toString() }); + + // Allocate buffer for the error message + const bufferSize = lengthBytesUTF8(message) + 1; + buffer = _malloc(bufferSize); + stringToUTF8(message, buffer, bufferSize); + + // Call the callback function with the error message + dynCall_vi(cb, buffer); + } finally { + // Clean up the account object + if (account) { + account.__destroy_into_raw(); + } + if (buffer) { + _free(buffer); + } + } }, AccountDeployBurner: async function (accountPtr, privateKey, cb) { const account = wasm_bindgen.Account.__wrap(accountPtr); diff --git a/Assets/Dojo/Runtime/Starknet/Account.cs b/Assets/Dojo/Runtime/Starknet/Account.cs index e9c0c322..95ce2f8c 100644 --- a/Assets/Dojo/Runtime/Starknet/Account.cs +++ b/Assets/Dojo/Runtime/Starknet/Account.cs @@ -94,9 +94,16 @@ private unsafe Account(dojo.Account* account, SigningKey signingKey) // webgl js interop starknet bindings public async Task ExecuteRaw(dojo.Call[] calls) { - var res = await StarknetInterop.AccountExecuteRawAsync(await account.Task, calls); - - return res; + try + { + var res = await StarknetInterop.AccountExecuteRawAsync(await account.Task, calls); + return res; + } + catch (Exception e) + { + Debug.LogError($"Error in ExecuteRaw: {e.Message}"); + throw; + } } #else private unsafe FieldElement ExecuteRawSync(dojo.Call[] calls) diff --git a/Assets/Dojo/Runtime/Starknet/StarknetInterop.cs b/Assets/Dojo/Runtime/Starknet/StarknetInterop.cs index e8df54ad..c87f2611 100644 --- a/Assets/Dojo/Runtime/Starknet/StarknetInterop.cs +++ b/Assets/Dojo/Runtime/Starknet/StarknetInterop.cs @@ -54,10 +54,29 @@ public class AccountExecuteRawHelper [MonoPInvokeCallback(typeof(Action))] public static void Callback(string result) { - Tcs.SetResult(new FieldElement(result)); + try + { + var message = JsonConvert.DeserializeObject(result); + + if (message.Success) + Tcs.SetResult(new FieldElement(message.Result)); + else + Tcs.SetException(new Exception(message.Error)); + } + catch (Exception ex) + { + Tcs.SetException(ex); + } } } + private class CallbackMessage + { + public bool Success { get; set; } + public string Result { get; set; } + public string Error { get; set; } + } + struct SerializedCall { public SerializedCall(FieldElement to, string selector, FieldElement[] calldata)