diff --git a/bindings/wasm/build/node.js b/bindings/wasm/build/node.js index 9d1e2151a..95c58bd3c 100644 --- a/bindings/wasm/build/node.js +++ b/bindings/wasm/build/node.js @@ -1,6 +1,6 @@ const path = require("path"); const fs = require("fs"); -const {lintAll} = require("./lints"); +const { lintAll } = require("./lints"); const generatePackage = require("./utils/generatePackage"); const artifact = process.argv[2]; @@ -8,7 +8,7 @@ const artifact = process.argv[2]; const RELEASE_FOLDER = path.join(__dirname, "..", artifact, "node"); const entryFilePathNode = path.join(RELEASE_FOLDER, `${artifact}.js`); const entryFileNode = fs.readFileSync(entryFilePathNode).toString(); -console.log(`[build/node.js] Processing entryFile '${entryFilePathNode}' for artifact '${artifact}'`,) +console.log(`[build/node.js] Processing entryFile '${entryFilePathNode}' for artifact '${artifact}'`); lintAll(entryFileNode); @@ -29,7 +29,9 @@ fs.writeFileSync( entryFilePathNode, changedFileNode, ); -console.log(`[build/node.js] Added node-fetch polyfill to entryFile '${entryFilePathNode}'. Starting generatePackage().`,) +console.log( + `[build/node.js] Added node-fetch polyfill to entryFile '${entryFilePathNode}'. Starting generatePackage().`, +); // Generate `package.json`. const newPackage = generatePackage({ @@ -38,4 +40,4 @@ const newPackage = generatePackage({ artifact, }); fs.writeFileSync(path.join(RELEASE_FOLDER, "package.json"), JSON.stringify(newPackage, null, 2)); -console.log(`[build/node.js] Finished processing entryFile '${entryFilePathNode}' for artifact '${artifact}'`,) +console.log(`[build/node.js] Finished processing entryFile '${entryFilePathNode}' for artifact '${artifact}'`); diff --git a/bindings/wasm/build/web.js b/bindings/wasm/build/web.js index 7aad5d09b..5adfa7465 100644 --- a/bindings/wasm/build/web.js +++ b/bindings/wasm/build/web.js @@ -1,7 +1,7 @@ const path = require("path"); const fs = require("fs"); const fse = require("fs-extra"); -const {lintAll} = require("./lints"); +const { lintAll } = require("./lints"); const generatePackage = require("./utils/generatePackage"); const artifact = process.argv[2]; @@ -9,7 +9,7 @@ const artifact = process.argv[2]; const RELEASE_FOLDER = path.join(__dirname, "..", artifact, "web"); const entryFilePath = path.join(RELEASE_FOLDER, `${artifact}.js`); const entryFile = fs.readFileSync(entryFilePath).toString(); -console.log(`[build/web.js] Processing entryFile '${entryFilePath}' for artifact '${artifact}'`,) +console.log(`[build/web.js] Processing entryFile '${entryFilePath}' for artifact '${artifact}'`); lintAll(entryFile); @@ -29,7 +29,7 @@ fs.writeFileSync( entryFilePath, changedFile, ); -console.log(`[build/web.js] Commented out webpack workaround for '${entryFilePath}'.`,) +console.log(`[build/web.js] Commented out webpack workaround for '${entryFilePath}'.`); const entryFilePathTs = path.join(RELEASE_FOLDER, `${artifact}.d.ts`); const entryFileTs = fs.readFileSync(entryFilePathTs).toString(); @@ -47,7 +47,7 @@ fs.writeFileSync( entryFilePathTs, changedFileTs, ); -console.log(`[build/web.js] Created init function for '${entryFilePathTs}'. Starting generatePackage().`,) +console.log(`[build/web.js] Created init function for '${entryFilePathTs}'. Starting generatePackage().`); // Generate `package.json`. const newPackage = generatePackage({ @@ -56,4 +56,4 @@ const newPackage = generatePackage({ artifact, }); fs.writeFileSync(path.join(RELEASE_FOLDER, "package.json"), JSON.stringify(newPackage, null, 2)); -console.log(`[build/web.js] Finished processing entryFile '${entryFilePathNode}' for artifact '${artifact}'`,) +console.log(`[build/web.js] Finished processing entryFile '${entryFilePathNode}' for artifact '${artifact}'`); diff --git a/bindings/wasm/iota_interaction_ts/Cargo.toml b/bindings/wasm/iota_interaction_ts/Cargo.toml index 6b76276c7..083061b61 100644 --- a/bindings/wasm/iota_interaction_ts/Cargo.toml +++ b/bindings/wasm/iota_interaction_ts/Cargo.toml @@ -28,7 +28,7 @@ js-sys = { version = "0.3.61" } secret-storage = { git = "https://github.com/iotaledger/secret-storage.git", default-features = false, tag = "v0.1.0" } serde = { version = "1.0", features = ["derive"] } serde-wasm-bindgen = "0.6.5" -serde_json = { version = "1.0", default-features = false } +serde_json.workspace = true thiserror.workspace = true tsify = "0.4.5" wasm-bindgen = { version = "=0.2.93", features = ["serde-serialize"] } diff --git a/bindings/wasm/iota_interaction_ts/lib/iota_client_helpers.ts b/bindings/wasm/iota_interaction_ts/lib/iota_client_helpers.ts index 3cfae10e9..9276a699b 100644 --- a/bindings/wasm/iota_interaction_ts/lib/iota_client_helpers.ts +++ b/bindings/wasm/iota_interaction_ts/lib/iota_client_helpers.ts @@ -43,6 +43,10 @@ export class IotaTransactionBlockResponseAdapter { ? this.response.effects.created : null; } + + get_response(): IotaTransactionBlockResponse { + return this.response; + } } async function signTransactionData( diff --git a/bindings/wasm/iota_interaction_ts/package-lock.json b/bindings/wasm/iota_interaction_ts/package-lock.json index 4021b9c90..42bb5221c 100644 --- a/bindings/wasm/iota_interaction_ts/package-lock.json +++ b/bindings/wasm/iota_interaction_ts/package-lock.json @@ -6930,7 +6930,6 @@ "version": "5.1.6", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", - "dev": true, "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", diff --git a/bindings/wasm/iota_interaction_ts/src/bindings/wasm_types.rs b/bindings/wasm/iota_interaction_ts/src/bindings/wasm_types.rs index cb9a1c55e..40c500fae 100644 --- a/bindings/wasm/iota_interaction_ts/src/bindings/wasm_types.rs +++ b/bindings/wasm/iota_interaction_ts/src/bindings/wasm_types.rs @@ -1,6 +1,9 @@ // Copyright 2020-2025 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 +use std::net::AddrParseError; + +use identity_iota_interaction::rpc_types::IotaExecutionStatus; use identity_iota_interaction::rpc_types::OwnedObjectRef; use identity_iota_interaction::types::base_types::IotaAddress; use identity_iota_interaction::types::base_types::ObjectID; @@ -9,8 +12,10 @@ use identity_iota_interaction::types::base_types::SequenceNumber; use identity_iota_interaction::types::execution_status::CommandArgumentError; use identity_iota_interaction::types::execution_status::ExecutionStatus; use identity_iota_interaction::types::object::Owner; +use identity_iota_interaction::IotaTransactionBlockResponseT; use identity_iota_interaction::ProgrammableTransactionBcs; use js_sys::Promise; +use js_sys::Uint8Array; use serde::Deserialize; use wasm_bindgen::prelude::wasm_bindgen; use wasm_bindgen::JsCast; @@ -21,6 +26,7 @@ use crate::bindings::WasmIotaClient; use crate::common::into_sdk_type; use crate::console_log; use crate::error::TsSdkError; +use crate::error::WasmError; // TODO: fix/add // not available anymore @@ -58,9 +64,6 @@ const TS_SDK_TYPES: &'static str = r#" executeTransaction, IotaTransactionBlockResponseAdapter, } from "./iota_client_helpers" - - // TODO: decide if we use this or replace it with an adapter written in TypeScript type if needed - type ProgrammableTransaction = ReturnType; "#; #[wasm_bindgen(module = "@iota/iota.js/client")] @@ -71,6 +74,12 @@ extern "C" { #[wasm_bindgen(typescript_type = "Transaction")] pub type WasmTransactionBuilder; + #[wasm_bindgen(js_name = "from", static_method_of = WasmTransactionBuilder, catch)] + pub fn from_bcs_bytes(bytes: &[u8]) -> Result; + + #[wasm_bindgen(method, structural, catch)] + pub async fn build(this: &WasmTransactionBuilder) -> Result; + #[wasm_bindgen(typescript_type = "TransactionArgument")] pub type WasmTransactionArgument; @@ -238,6 +247,9 @@ extern "C" { #[wasm_bindgen(method)] fn effects_created_inner(this: &IotaTransactionBlockResponseAdapter) -> Option>; + #[wasm_bindgen(method, js_name = "get_response")] + fn response(this: &IotaTransactionBlockResponseAdapter) -> WasmIotaTransactionBlockResponse; + #[wasm_bindgen(js_name = executeTransaction)] fn execute_transaction_inner( iotaClient: &WasmIotaClient, // --> TypeScript: IotaClient @@ -249,12 +261,6 @@ extern "C" { ) -> PromiseIotaTransactionBlockResponseAdapter; } -#[wasm_bindgen] // no module here, as imported via custom section above -extern "C" { - #[wasm_bindgen(typescript_type = "ProgrammableTransaction")] - pub type WasmProgrammableTransaction; -} - #[derive(Deserialize)] struct WasmExecutionStatusAdapter { status: ExecutionStatus, @@ -306,9 +312,15 @@ pub async fn execute_transaction( } #[derive(Deserialize)] -// TODO: add manual deserialization later on (must be deserializable, but WasmPT is not) -// pub struct ProgrammableTransaction(WasmProgrammableTransaction); -pub struct ProgrammableTransaction(()); +#[serde(try_from = "Vec")] +pub struct ProgrammableTransaction(WasmTransactionBuilder); -// TODO: fill in required functions and data handling here -impl ProgrammableTransaction {} +impl TryFrom> for ProgrammableTransaction { + type Error = TsSdkError; + fn try_from(value: Vec) -> Result { + WasmTransactionBuilder::from_bcs_bytes(&value) + .map(Self) + .map_err(WasmError::from) + .map_err(TsSdkError::from) + } +} diff --git a/bindings/wasm/iota_interaction_ts/src/identity_move_calls.rs b/bindings/wasm/iota_interaction_ts/src/identity_move_calls.rs index 29035f3ea..a6317a97c 100644 --- a/bindings/wasm/iota_interaction_ts/src/identity_move_calls.rs +++ b/bindings/wasm/iota_interaction_ts/src/identity_move_calls.rs @@ -21,8 +21,6 @@ use identity_iota_interaction::rpc_types::OwnedObjectRef; use identity_iota_interaction::types::base_types::IotaAddress; use identity_iota_interaction::types::base_types::ObjectID; use identity_iota_interaction::types::base_types::ObjectRef; -use identity_iota_interaction::types::base_types::SequenceNumber; -use identity_iota_interaction::types::transaction::Argument; use identity_iota_interaction::types::TypeTag; use identity_iota_interaction::BorrowIntentFnInternalT; use identity_iota_interaction::ControllerIntentFnInternalT; diff --git a/bindings/wasm/iota_interaction_ts/src/lib.rs b/bindings/wasm/iota_interaction_ts/src/lib.rs index 7418e74c3..9a7c78a01 100644 --- a/bindings/wasm/iota_interaction_ts/src/lib.rs +++ b/bindings/wasm/iota_interaction_ts/src/lib.rs @@ -49,9 +49,8 @@ cfg_if::cfg_if! { #[allow(unused_imports)] pub use error::TsSdkError as AdapterError; #[allow(unused_imports)] pub use bindings::IotaTransactionBlockResponseAdapter as AdapterNativeResponse; + #[allow(unused_imports)] pub use bindings::ProgrammableTransaction; #[allow(unused_imports)] pub use transaction_builder::NativeTsTransactionBuilderBindingWrapper; - - #[allow(unused_imports)] pub use bindings::ProgrammableTransaction; } } diff --git a/bindings/wasm/iota_interaction_ts/src/migration_move_calls.rs b/bindings/wasm/iota_interaction_ts/src/migration_move_calls.rs index b738cd6dc..8024cae58 100644 --- a/bindings/wasm/iota_interaction_ts/src/migration_move_calls.rs +++ b/bindings/wasm/iota_interaction_ts/src/migration_move_calls.rs @@ -5,8 +5,6 @@ use identity_iota_interaction::ident_str; use identity_iota_interaction::rpc_types::OwnedObjectRef; use identity_iota_interaction::types::base_types::ObjectID; use identity_iota_interaction::types::base_types::ObjectRef; -use identity_iota_interaction::types::transaction::ObjectArg; -use identity_iota_interaction::types::IOTA_FRAMEWORK_PACKAGE_ID; use identity_iota_interaction::MigrationMoveCalls; use identity_iota_interaction::ProgrammableTransactionBcs; use js_sys::Uint8Array; diff --git a/bindings/wasm/iota_interaction_ts/src/transaction_builder.rs b/bindings/wasm/iota_interaction_ts/src/transaction_builder.rs index 9fa4dbd71..0d95bb740 100644 --- a/bindings/wasm/iota_interaction_ts/src/transaction_builder.rs +++ b/bindings/wasm/iota_interaction_ts/src/transaction_builder.rs @@ -6,6 +6,7 @@ use std::ops::DerefMut; use crate::bindings::WasmTransactionBuilder; use crate::error::TsSdkError; +use crate::error::WasmError; use identity_iota_interaction::ProgrammableTransactionBcs; use identity_iota_interaction::TransactionBuilderT; @@ -26,15 +27,18 @@ impl TransactionBuilderT for TransactionBuilderTsSdk { type NativeTxBuilder = NativeTsTransactionBuilderBindingWrapper; fn finish(self) -> Result { - unimplemented!(); + futures::executor::block_on(self.builder.build()) + .map(|js_arr| js_arr.to_vec()) + .map_err(WasmError::from) + .map_err(Self::Error::from) } fn as_native_tx_builder(&mut self) -> &mut Self::NativeTxBuilder { - todo!() + &mut self.builder } fn into_native_tx_builder(self) -> Self::NativeTxBuilder { - todo!() + self.builder } }