From 03d0a4526eb1b81f33124d8467a3e8f4a6379f4b Mon Sep 17 00:00:00 2001 From: quantum Date: Thu, 3 Jul 2025 05:05:55 -0500 Subject: [PATCH 01/31] fixes --- packages/dapi-grpc/Cargo.toml | 9 ++++--- packages/rs-dapi-client/Cargo.toml | 2 ++ .../src/transport/wasm_channel.rs | 24 ++++++++++++------- packages/wasm-sdk/Cargo.toml | 16 +++++++++---- packages/wasm-sdk/build.sh | 4 ++++ packages/wasm-sdk/src/context_provider.rs | 12 +++++++++- packages/wasm-sdk/src/lib.rs | 2 +- packages/wasm-sdk/src/sdk.rs | 2 +- .../src/state_transitions/documents.rs | 19 ++++++++------- 9 files changed, 61 insertions(+), 29 deletions(-) diff --git a/packages/dapi-grpc/Cargo.toml b/packages/dapi-grpc/Cargo.toml index a3416230c47..ab0abb3676c 100644 --- a/packages/dapi-grpc/Cargo.toml +++ b/packages/dapi-grpc/Cargo.toml @@ -43,11 +43,6 @@ tenderdash-proto = { git = "https://github.com/dashpay/rs-tenderdash-abci", vers prost = { version = "0.13" } futures-core = "0.3.30" -tonic = { version = "0.13.0", features = [ - "codegen", - "prost", - "tls-ring", -], default-features = false } serde = { version = "1.0.219", optional = true, features = ["derive"] } serde_bytes = { version = "0.11.12", optional = true } serde_json = { version = "1.0", optional = true } @@ -55,6 +50,10 @@ dapi-grpc-macros = { path = "../rs-dapi-grpc-macros" } platform-version = { path = "../rs-platform-version" } [target.'cfg(target_arch = "wasm32")'.dependencies] +tonic = { version = "0.13.0", features = [ + "codegen", + "prost", +], default-features = false } getrandom = { version = "0.2", features = ["js"] } [target.'cfg(not(target_arch = "wasm32"))'.dependencies] diff --git a/packages/rs-dapi-client/Cargo.toml b/packages/rs-dapi-client/Cargo.toml index e2911b5addf..c15d3eda589 100644 --- a/packages/rs-dapi-client/Cargo.toml +++ b/packages/rs-dapi-client/Cargo.toml @@ -31,6 +31,8 @@ gloo-timers = { version = "0.3.0", features = ["futures"] } tonic-web-wasm-client = { version = "0.7.0" } wasm-bindgen-futures = { version = "0.4.49" } getrandom = { version = "0.2", features = ["js"] } +tower-service = { version = "0.3" } +http-body-util = { version = "0.1" } [dependencies] backon = { version = "1.3", default-features = false } diff --git a/packages/rs-dapi-client/src/transport/wasm_channel.rs b/packages/rs-dapi-client/src/transport/wasm_channel.rs index 22e7fca5b0f..99d46d52fd3 100644 --- a/packages/rs-dapi-client/src/transport/wasm_channel.rs +++ b/packages/rs-dapi-client/src/transport/wasm_channel.rs @@ -43,21 +43,27 @@ impl WasmClient { } } -impl tonic::client::GrpcService for WasmClient { + +impl tonic::client::GrpcService for WasmClient { type Future = BoxFuture<'static, Result, Self::Error>>; - type ResponseBody = tonic::body::BoxBody; + type ResponseBody = tonic::body::Body; type Error = Status; - fn call(&mut self, request: http::Request) -> Self::Future { + fn call(&mut self, request: http::Request) -> Self::Future { let mut client = self.client.clone(); - let fut = client.call(request).map(|res| match res { - Ok(resp) => { - let body = tonic::body::boxed(resp.into_body()); - Ok(Response::new(body)) + + let fut = async move { + match client.call(request).await { + Ok(resp) => { + let (parts, body) = resp.into_parts(); + let tonic_body = tonic::body::Body::new(body); + Ok(Response::from_parts(parts, tonic_body)) + } + Err(e) => Err(wasm_client_error_to_status(e)), } - Err(e) => Err(wasm_client_error_to_status(e)), - }); + }; + // For WASM, we need to use into_send to make the future Send into_send(fut) } diff --git a/packages/wasm-sdk/Cargo.toml b/packages/wasm-sdk/Cargo.toml index 086b8d9502c..5dad96a57ef 100644 --- a/packages/wasm-sdk/Cargo.toml +++ b/packages/wasm-sdk/Cargo.toml @@ -1,3 +1,6 @@ +[workspace] +members = ["."] + [package] name = "wasm-sdk" edition = "2021" @@ -7,7 +10,7 @@ publish = false crate-type = ["cdylib"] [dependencies] -dash-sdk = { path = "../rs-sdk", default-features = false } +dash-sdk = { path = "../rs-sdk", default-features = false, features = ["mocks"] } console_error_panic_hook = { version = "0.1.6" } thiserror = { version = "2.0.12" } web-sys = { version = "0.3.4", features = [ @@ -20,7 +23,7 @@ web-sys = { version = "0.3.4", features = [ ] } wasm-bindgen = { version = "=0.2.100" } wasm-bindgen-futures = { version = "0.4.49" } -drive-proof-verifier = { path = "../rs-drive-proof-verifier" } # TODO: I think it's not needed (LKl) +drive-proof-verifier = { path = "../rs-drive-proof-verifier", default-features = false } # TODO: I think it's not needed (LKl) # tonic = { version = "*", features = ["transport"], default-features = false } # client = [ # "tonic/channel", FAIL @@ -30,17 +33,22 @@ drive-proof-verifier = { path = "../rs-drive-proof-verifier" } # TODO: I think i # "tonic/tls-webpki-roots", # "platform", # ] -tracing-wasm = { version = "0.2.1" } +# tracing-wasm = { version = "0.2.1" } wee_alloc = "0.4" platform-value = { path = "../rs-platform-value", features = ["json"] } serde-wasm-bindgen = { version = "0.6.5" } +getrandom = { version = "0.2", features = ["js"] } [profile.release] -lto = "fat" opt-level = "z" panic = "abort" debug = false +lto = false #[package.metadata.wasm-pack.profile.release] #wasm-opt = ['-g', '-O'] # -g for profiling # -Oz -Oz -g + +[patch.crates-io] +# Override ring to use the wasm-compatible version +ring = { git = "https://github.com/briansmith/ring", branch = "main" } diff --git a/packages/wasm-sdk/build.sh b/packages/wasm-sdk/build.sh index d9c1016741c..2c411e370c0 100755 --- a/packages/wasm-sdk/build.sh +++ b/packages/wasm-sdk/build.sh @@ -7,6 +7,10 @@ set -ex -o pipefail +# Disable LTO for WebAssembly builds +export CARGO_PROFILE_RELEASE_LTO=false +export RUSTFLAGS="-C lto=off" + wasm-pack build --target web --release --no-opt wasm-opt -tnh --flatten --rereloop -Oz --gufa -Oz --gufa -Oz -o pkg/optimized.wasm pkg/wasm_sdk_bg.wasm ls -lah pkg diff --git a/packages/wasm-sdk/src/context_provider.rs b/packages/wasm-sdk/src/context_provider.rs index 173c8a4948b..e621913b15c 100644 --- a/packages/wasm-sdk/src/context_provider.rs +++ b/packages/wasm-sdk/src/context_provider.rs @@ -4,11 +4,13 @@ use dash_sdk::{ dpp::{ prelude::CoreBlockHeight, util::vec::{decode_hex, encode_hex}, + version::PlatformVersion, + data_contract::TokenConfiguration, }, error::ContextProviderError, platform::{DataContract, Identifier}, }; -use drive_proof_verifier::ContextProvider; +use dash_sdk::platform::ContextProvider; use wasm_bindgen::prelude::wasm_bindgen; #[wasm_bindgen] @@ -91,10 +93,18 @@ impl ContextProvider for WasmContext { fn get_data_contract( &self, _id: &Identifier, + _platform_version: &PlatformVersion, ) -> Result>, ContextProviderError> { todo!() } + fn get_token_configuration( + &self, + _token_id: &Identifier, + ) -> Result, ContextProviderError> { + todo!() + } + fn get_platform_activation_height(&self) -> Result { todo!() } diff --git a/packages/wasm-sdk/src/lib.rs b/packages/wasm-sdk/src/lib.rs index ccbc036845c..10ac93019da 100644 --- a/packages/wasm-sdk/src/lib.rs +++ b/packages/wasm-sdk/src/lib.rs @@ -18,7 +18,7 @@ pub async fn start() -> Result<(), JsValue> { // * https://crates.io/crates/tracing-web console_error_panic_hook::set_once(); - tracing_wasm::set_as_global_default(); + // tracing_wasm::set_as_global_default(); Ok(()) } diff --git a/packages/wasm-sdk/src/sdk.rs b/packages/wasm-sdk/src/sdk.rs index 7701a8e8c0b..e6c3c29f5f8 100644 --- a/packages/wasm-sdk/src/sdk.rs +++ b/packages/wasm-sdk/src/sdk.rs @@ -184,7 +184,7 @@ pub async fn docs_testing(sdk: &WasmSdk) { .document_type_for_name("aaa") .expect("document type for name"); let doc_serialized = doc - .serialize(document_type, sdk.version()) + .serialize(document_type, &dc, sdk.version()) .expect("serialize document"); let msg = js_sys::JsString::from_str(&format!("{:?} {:?} ", dcs, doc_serialized)) diff --git a/packages/wasm-sdk/src/state_transitions/documents.rs b/packages/wasm-sdk/src/state_transitions/documents.rs index 83991f26440..c72af7991ad 100644 --- a/packages/wasm-sdk/src/state_transitions/documents.rs +++ b/packages/wasm-sdk/src/state_transitions/documents.rs @@ -1,12 +1,13 @@ use crate::error::to_js_error; use dash_sdk::dpp::identity::KeyID; use dash_sdk::dpp::serialization::PlatformSerializable; -use dash_sdk::dpp::state_transition::documents_batch_transition::document_base_transition::v0::DocumentBaseTransitionV0; -use dash_sdk::dpp::state_transition::documents_batch_transition::document_base_transition::DocumentBaseTransition; -use dash_sdk::dpp::state_transition::documents_batch_transition::document_create_transition::DocumentCreateTransitionV0; -use dash_sdk::dpp::state_transition::documents_batch_transition::document_transition::DocumentTransition; -use dash_sdk::dpp::state_transition::documents_batch_transition::{ - DocumentCreateTransition, DocumentsBatchTransition, DocumentsBatchTransitionV0, +use dash_sdk::dpp::state_transition::StateTransition; +use dash_sdk::dpp::state_transition::batch_transition::batched_transition::document_base_transition::v0::DocumentBaseTransitionV0; +use dash_sdk::dpp::state_transition::batch_transition::batched_transition::document_base_transition::DocumentBaseTransition; +use dash_sdk::dpp::state_transition::batch_transition::batched_transition::document_create_transition::DocumentCreateTransitionV0; +use dash_sdk::dpp::state_transition::batch_transition::batched_transition::document_transition::DocumentTransition; +use dash_sdk::dpp::state_transition::batch_transition::{ + document_create_transition::DocumentCreateTransition, BatchTransition, BatchTransitionV0, }; use wasm_bindgen::prelude::*; use web_sys::js_sys::{Number, Uint8Array}; @@ -60,7 +61,7 @@ fn create_batch_transition( ))); }; - let document_batch_transition = DocumentsBatchTransition::V0(DocumentsBatchTransitionV0 { + let document_batch_transition = BatchTransition::V0(BatchTransitionV0 { owner_id: Default::default(), transitions, user_fee_increase: 0, @@ -68,7 +69,9 @@ fn create_batch_transition( signature: Default::default(), }); - document_batch_transition + let state_transition: StateTransition = document_batch_transition.into(); + + state_transition .serialize_to_bytes() .map_err(to_js_error) .map(|bytes| Uint8Array::from(bytes.as_slice())) From 6149eeaeb24effb73c22cc2c4ab425fd6de09dc2 Mon Sep 17 00:00:00 2001 From: quantum Date: Thu, 3 Jul 2025 06:33:27 -0500 Subject: [PATCH 02/31] wasm workflow --- .github/workflows/wasm-sdk-build.yml | 105 +++++++++++++++++++++++++++ 1 file changed, 105 insertions(+) create mode 100644 .github/workflows/wasm-sdk-build.yml diff --git a/.github/workflows/wasm-sdk-build.yml b/.github/workflows/wasm-sdk-build.yml new file mode 100644 index 00000000000..17ae2423a13 --- /dev/null +++ b/.github/workflows/wasm-sdk-build.yml @@ -0,0 +1,105 @@ +name: Build WASM SDK + +on: + pull_request: + paths: + - 'packages/wasm-sdk/**' + - 'packages/rs-sdk/**' + - 'packages/rs-drive-proof-verifier/**' + - 'packages/rs-platform-value/**' + - 'packages/rs-dpp/**' + - 'packages/rs-drive/src/verify/**' + push: + branches: + - main + - master + - 'v[0-9]+.[0-9]+-dev' + - 'v[0-9]+.[0-9]+-dev-sdk' + paths: + - 'packages/wasm-sdk/**' + - 'packages/rs-sdk/**' + - 'packages/rs-drive-proof-verifier/**' + - 'packages/rs-platform-value/**' + - 'packages/rs-dpp/**' + - 'packages/rs-drive/src/verify/**' + workflow_dispatch: + +env: + CARGO_TERM_COLOR: always + RUSTFLAGS: "-C lto=off" + CARGO_PROFILE_RELEASE_LTO: false + +jobs: + build-wasm-sdk: + runs-on: ubuntu-latest + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Setup Rust toolchain + uses: actions-rs/toolchain@v1 + with: + profile: minimal + toolchain: stable + target: wasm32-unknown-unknown + override: true + + - name: Cache cargo dependencies + uses: actions/cache@v3 + with: + path: | + ~/.cargo/bin/ + ~/.cargo/registry/index/ + ~/.cargo/registry/cache/ + ~/.cargo/git/db/ + target/ + key: ${{ runner.os }}-cargo-wasm-sdk-${{ hashFiles('**/Cargo.lock') }} + restore-keys: | + ${{ runner.os }}-cargo-wasm-sdk- + + - name: Install wasm-pack + run: | + if ! command -v wasm-pack &> /dev/null; then + echo "Installing wasm-pack..." + curl https://rustwasm.github.io/wasm-pack/installer/init.sh -sSf | sh + else + echo "wasm-pack already installed" + fi + + - name: Install wasm-opt + run: | + if ! command -v wasm-opt &> /dev/null; then + echo "Installing wasm-opt..." + sudo apt-get update + sudo apt-get install -y binaryen + else + echo "wasm-opt already installed" + fi + + - name: Build WASM SDK + working-directory: packages/wasm-sdk + run: | + chmod +x build.sh + ./build.sh + + - name: Verify build output + working-directory: packages/wasm-sdk + run: | + echo "Checking build output..." + ls -lah pkg/ + # Verify required files exist + test -f pkg/wasm_sdk_bg.wasm + test -f pkg/optimized.wasm + test -f pkg/wasm_sdk.js + test -f pkg/wasm_sdk_bg.wasm.d.ts + test -f pkg/wasm_sdk.d.ts + test -f pkg/package.json + echo "Build verification successful!" + + - name: Upload build artifacts + uses: actions/upload-artifact@v3 + with: + name: wasm-sdk-build + path: packages/wasm-sdk/pkg/ + retention-days: 7 \ No newline at end of file From 43fe9c01a38e33c7f031b9037fc0e6b019f40e88 Mon Sep 17 00:00:00 2001 From: quantum Date: Thu, 3 Jul 2025 06:49:55 -0500 Subject: [PATCH 03/31] fixed html --- packages/wasm-sdk/index.html | 94 +++++++++++++++++++++++++++++++++++- 1 file changed, 92 insertions(+), 2 deletions(-) diff --git a/packages/wasm-sdk/index.html b/packages/wasm-sdk/index.html index 457479785a2..1f7d1113a34 100644 --- a/packages/wasm-sdk/index.html +++ b/packages/wasm-sdk/index.html @@ -12,11 +12,52 @@ .container { padding: 10px; } + + .network-toggle { + padding: 10px; + background-color: #f0f0f0; + border-radius: 5px; + margin-bottom: 20px; + } + + .network-toggle label { + margin-right: 15px; + font-weight: bold; + } + + .network-indicator { + display: inline-block; + padding: 5px 10px; + border-radius: 3px; + margin-left: 10px; + font-size: 0.9em; + font-weight: bold; + } + + .network-indicator.testnet { + background-color: #ff9800; + color: white; + } + + .network-indicator.mainnet { + background-color: #4caf50; + color: white; + }
Loading...
+ +
+ + + + + + MAINNET +
+
@@ -31,13 +72,57 @@