diff --git a/.gitignore b/.gitignore index 918d7befce..87c9d1f937 100644 --- a/.gitignore +++ b/.gitignore @@ -44,7 +44,7 @@ dump fuzzing-code-coverage -*.wasm +./*.wasm stats !uniond/vendor/**/*.wasm _ diff --git a/Cargo.lock b/Cargo.lock index 91ca3aaaa6..0ce174412e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -12463,6 +12463,17 @@ dependencies = [ "serde", ] +[[package]] +name = "serde-wasm-bindgen" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8302e169f0eddcc139c70f139d19d6467353af16f9fce27e8c30158036a1e16b" +dependencies = [ + "js-sys", + "serde", + "wasm-bindgen", +] + [[package]] name = "serde_bytes" version = "0.11.19" @@ -15388,12 +15399,15 @@ name = "ucs03-zkgm-packet" version = "0.0.0" dependencies = [ "alloy-sol-types", + "embed-commit", "enumorph", "hex-literal 0.4.1", "serde", + "serde-wasm-bindgen", "serde_json", "ucs03-zkgm", "unionlabs-primitives", + "wasm-bindgen", ] [[package]] diff --git a/cosmwasm/cosmwasm.nix b/cosmwasm/cosmwasm.nix index 183f317c14..b6e1521349 100644 --- a/cosmwasm/cosmwasm.nix +++ b/cosmwasm/cosmwasm.nix @@ -1051,6 +1051,10 @@ _: { access-manager = crane.buildWasmContract "cosmwasm/access-manager" { }; access-managed-example = crane.buildWasmContract "e2e/access-managed-example" { }; + ucs03-zkgm-packet = crane.buildWasm "lib/ucs03-zkgm-packet" { + features = [ "serde" ]; + }; + cw20-base = crane.buildWasmContract "cosmwasm/cw20-base" { }; cw20-wrapped-tokenfactory = crane.buildWasmContract "cosmwasm/cw20-wrapped-tokenfactory" { }; @@ -1127,6 +1131,7 @@ _: { lst-staker access-managed-example proxy-account-factory + ucs03-zkgm-packet ; cosmwasm-scripts = { diff --git a/flake.nix b/flake.nix index e19c60e7e7..daba14267a 100644 --- a/flake.nix +++ b/flake.nix @@ -555,6 +555,10 @@ yq perl ]) + ++ [ + pkgsUnstable.wasm-bindgen-cli_0_2_100 + pkgs.wasm-pack + ] ++ (with pkgsUnstable; [ bun pnpm_10 @@ -569,6 +573,7 @@ nodePackages_latest."@tailwindcss/language-server" nodePackages_latest.typescript-language-server nodePackages_latest.vscode-langservers-extracted + binaryen ]) ++ (with pkgs; [ wasm-tools diff --git a/lib/ucs03-zkgm-packet/Cargo.toml b/lib/ucs03-zkgm-packet/Cargo.toml index 4846e6ccd3..a8b795606c 100644 --- a/lib/ucs03-zkgm-packet/Cargo.toml +++ b/lib/ucs03-zkgm-packet/Cargo.toml @@ -11,13 +11,19 @@ repository = { workspace = true } [lints] workspace = true +[lib] +crate-type = ["cdylib"] + [dependencies] alloy-sol-types = { workspace = true } +embed-commit = { workspace = true } enumorph = { workspace = true } hex-literal = { workspace = true } serde = { workspace = true, optional = true, features = ["derive"] } -ucs03-zkgm = { workspace = true } +serde-wasm-bindgen = "0.6.5" +ucs03-zkgm = { workspace = true, features = ["library"] } unionlabs-primitives = { workspace = true } +wasm-bindgen = "=0.2.100" [features] default = ["serde"] diff --git a/lib/ucs03-zkgm-packet/src/lib.rs b/lib/ucs03-zkgm-packet/src/lib.rs index 1f92044635..80f125861f 100644 --- a/lib/ucs03-zkgm-packet/src/lib.rs +++ b/lib/ucs03-zkgm-packet/src/lib.rs @@ -3,6 +3,7 @@ use std::error::Error; use alloy_sol_types::{SolValue, abi::TokenSeq}; use ucs03_zkgm::com::{TAG_ACK_FAILURE, TAG_ACK_SUCCESS}; use unionlabs_primitives::{Bytes, H256, U256}; +use wasm_bindgen::{JsValue, prelude::wasm_bindgen}; pub use crate::{ batch::{Batch, BatchAck, BatchShape}, @@ -134,6 +135,13 @@ impl Instruction { } } +#[wasm_bindgen] +pub fn decode_packet(packet: Vec) -> core::result::Result { + let packet = ZkgmPacket::decode(packet).map_err(|err| JsValue::from_str(&err.to_string()))?; + + Ok(serde_wasm_bindgen::to_value(&packet)?) +} + #[cfg(test)] mod tests { use hex_literal::hex; diff --git a/tools/rust/buildWasm.nix b/tools/rust/buildWasm.nix new file mode 100644 index 0000000000..382d350660 --- /dev/null +++ b/tools/rust/buildWasm.nix @@ -0,0 +1,62 @@ +{ + buildWorkspaceMember, + crateCargoToml, + pkgs, + pkgsUnstable, + lib, +}: +let + CARGO_BUILD_TARGET = "wasm32-unknown-unknown"; + + dashesToUnderscores = builtins.replaceStrings [ "-" ] [ "_" ]; + + mkFeaturesString = + features: if features == null then "" else (lib.concatMapStrings (feature: "-${feature}") features); + + cargoBuildInstallPhase = + { + crateDirFromRoot, + contractFileNameWithoutExt, + }: + '' + ${pkgs.binaryen}/bin/wasm-opt target/wasm32-unknown-unknown/wasm-release/${contractFileNameWithoutExt}.wasm -Oz -o ${(crateCargoToml crateDirFromRoot).package.name} + + ${pkgs.lib.meta.getExe pkgsUnstable.wasm-bindgen-cli_0_2_100} ${(crateCargoToml crateDirFromRoot).package.name} --out-dir $out --typescript --target web + ''; + cargoBuildExtraArgs = + features: + "--no-default-features --lib ${ + if features != null then lib.concatStringsSep " " ([ "--features" ] ++ features) else "" + }"; + # TODO: Add back -C opt-level=z once https://github.com/CosmWasm/cosmwasm/issues/2557 is resolved + mkRustflags = "-C opt-level=z -C link-arg=-s -C target-cpu=mvp -C passes=adce,loop-deletion -Zlocation-detail=none"; +in +crateDirFromRoot: +{ + features ? null, + extraBuildInputs ? [ ], + extraNativeBuildInputs ? [ ], +}: +let + packageName = "${(crateCargoToml crateDirFromRoot).package.name}${mkFeaturesString features}"; + + contract-basename = dashesToUnderscores (crateCargoToml crateDirFromRoot).package.name; + + all = buildWorkspaceMember crateDirFromRoot { + inherit extraBuildInputs extraNativeBuildInputs; + buildStdTarget = CARGO_BUILD_TARGET; + pnameSuffix = mkFeaturesString features; + + cargoBuildExtraArgs = cargoBuildExtraArgs features; + rustflags = mkRustflags; + + cargoBuildInstallPhase = cargoBuildInstallPhase { + inherit crateDirFromRoot; + contractFileNameWithoutExt = contract-basename; + }; + extraEnv = { + CARGO_PROFILE = "wasm-release"; + }; + }; +in +all.${packageName} diff --git a/tools/rust/buildWasmContract.nix b/tools/rust/buildWasmContract.nix index ab607dbd21..182733a333 100644 --- a/tools/rust/buildWasmContract.nix +++ b/tools/rust/buildWasmContract.nix @@ -3,10 +3,6 @@ crateCargoToml, pkgs, lib, - craneLib, - rust, - dbg, - gitRev, }: let CARGO_BUILD_TARGET = "wasm32-unknown-unknown"; @@ -37,7 +33,6 @@ let cargoBuildInstallPhase = { - features, contractFileNameWithoutExt, checks, maxSize, @@ -90,7 +85,6 @@ let cargoBuildInstallPhase = cargoBuildInstallPhase { inherit - features checks maxSize ; diff --git a/tools/rust/crane.nix b/tools/rust/crane.nix index 43c604985b..b1ea462eb6 100644 --- a/tools/rust/crane.nix +++ b/tools/rust/crane.nix @@ -4,6 +4,7 @@ perSystem = args@{ pkgs, + pkgsUnstable, rust, dbg, gitRev, @@ -630,10 +631,16 @@ crateCargoToml pkgs lib - rust - craneLib - dbg - gitRev + ; + }; + + buildWasm = import ./buildWasm.nix { + inherit + buildWorkspaceMember + crateCargoToml + pkgs + pkgsUnstable + lib ; }; @@ -643,6 +650,7 @@ cargoWorkspaceSrc buildWorkspaceMember buildWasmContract + buildWasm allCargoTomls ; lib = craneLib;