lwk_wasm

Crates.iolwk_wasm
lib.rslwk_wasm
version0.12.0
created_at2024-02-15 13:28:44.788873+00
updated_at2025-09-24 12:45:02.868161+00
descriptionLiquid Wallet Kit - WASM
homepage
repository
max_upload_size
id1141106
size415,713
(LeoComandini)

documentation

https://docs.rs/lwk_wasm

README

Liquid Wallet Kit for WASM

This is only a proof of concept at the moment but we want to show our commitment to have the Liquid Wallet Kit working in the WASM environment.

Available as npm package.

For an example usage see the Liquid Web Wallet (source). Works as CT descriptor watch-only wallet or connected to a Jade.

For LWK Library developers

To build the WASM library you need rust and wasm-pack installed

$ wasm-pack build --dev

To enable web-serial:

$ RUSTFLAGS="--cfg=web_sys_unstable_apis" wasm-pack build --dev --features serial

For LWK library consumers (front-end developers)

Download the Liquid Web Wallet source

$ git clone https://github.com/RCasatta/liquid-web-wallet
$ npm install
$ npm run start

Open the browser at http://localhost:8080

Test

$ cd lwk_wasm
$ wasm-pack test --firefox # or --chrome

Then open the browser at http://127.0.0.1:8000, open also the dev tools to see console messages and network requests.

To avoid requiring opening the browser the headless mode is possible.

Note the increased timeout specified via the env var, the 20s default one could be too low.

$ cd lwk_wasm
$ WASM_BINDGEN_TEST_TIMEOUT=60 wasm-pack test --firefox --headless

run specific test (note the double --)

$ wasm-pack test --firefox --headless -- -- balance_test_testnet

Build NPM Package for release

Build rust crates in release mode, optimizing for space.

$ cd lwk_wasm/
$ RUSTFLAGS="--cfg=web_sys_unstable_apis" CARGO_PROFILE_RELEASE_OPT_LEVEL=z wasm-pack build --features serial
$ cd pkg
$ npm publish

Build wasm lib for profiling

To analyze the generated wasm file to optimize for size, we want to follow the same optimization as release but we want to keep debug info to analyze the produced lib with function names.

$ cd lwk_wasm/
$ RUSTFLAGS="--cfg=web_sys_unstable_apis" CARGO_PROFILE_RELEASE_OPT_LEVEL=z CARGO_PROFILE_RELEASE_DEBUG=2 wasm-pack build --profiling --features serial

With twiggy is then possible to analyze the library:

twiggy top -n 10 pkg/lwk_wasm_bg.wasm

Build for nodejs

$ cd lwk_wasm
$ RUSTFLAGS="--cfg=web_sys_unstable_apis" CARGO_PROFILE_RELEASE_OPT_LEVEL=z wasm-pack build --target nodejs --out-dir pkg_node -- --features serial

Rename the package to lwk_node so that we can publish it to npm.

sed -i 's/"lwk_wasm"/"lwk_node"/g' pkg_node/package.json

Test node js examples

Requirement:

  • having built node pkg like shown in previous paragraph
  • having node and npm installed
cd lwk_wasm/tests/node
npm install
node network.js

Javascript code conventions

String

For object that have a string representation we implement std::fmt::Display and we expose them like that

#[wasm_bindgen(js_name = toString)]
pub fn to_string_js(&self) -> String {
    self.to_string()
}

JSON

For objects that have a json representation, like the balance we provide a toJSON() method that must work when the caller use for example JSON.stringify(object) Unfortunately JSON.stringify cannot serialize big integers by default, thus we use string representation for BigInt.

Entries

Since JSON doesn't support BigInt some object expose also the js standard entries() method so that the following code is possible

const balance = wallet.balance();

// 1. Create a Map
const balanceMap = new Map(balance.entries());

// 2. Iterate directly in a for...of loop
for (const [currency, amount] of balance.entries()) {
  console.log(`${currency}: ${amount}`);
}

// 3. Convert to a plain object
const balanceObject = Object.fromEntries(balance.entries());

Documentation

Documentation of this crate should not use link to rust types such as [Transaction] because they are not usable in end-user javascript packages. Many types are wrappers of types in lwk crates, in this cases we mostly duplicate the original documentation with context adjustment.

Commit count: 0

cargo fmt