diff --git a/.github/workflows/static.yaml b/.github/workflows/static.yaml index e21e51a..fc820af 100644 --- a/.github/workflows/static.yaml +++ b/.github/workflows/static.yaml @@ -1,11 +1,9 @@ -name: bip322.rs Website +name: bip322.rs on: push: branches: ["master"] - workflow_dispatch: - permissions: contents: read pages: write @@ -24,12 +22,34 @@ jobs: steps: - name: Checkout uses: actions/checkout@v4 + + - name: Setup Rust + uses: actions-rs/toolchain@v1 + with: + toolchain: stable + target: wasm32-unknown-unknown + + - name: Install wasm-pack + run: curl https://rustwasm.github.io/wasm-pack/installer/init.sh -sSf | sh + + - name: Build WASM + run: | + cd www + wasm-pack build \ + --target web \ + --out-name bip322 \ + www + cp www/pkg/bip322.js www/pkg/bip322_bg.wasm www + - name: Setup Pages uses: actions/configure-pages@v5 + - name: Upload artifact uses: actions/upload-pages-artifact@v3 with: path: './www' + - name: Deploy to GitHub Pages id: deployment uses: actions/deploy-pages@v4 + diff --git a/README.md b/README.md index 2c99091..8db5aed 100644 --- a/README.md +++ b/README.md @@ -23,9 +23,9 @@ For MacOs: ``` brew install llvm cargo install wasm-pack -rustup toolchain install nightly -rustup target add wasm32-unknown-unknown --toolchain nightly -rustup default nightly-aarch64-apple-darwin +rustup target add wasm32-unknown-unknown cd www -AR=/opt/homebrew/opt/llvm/bin/llvm-ar CC=/opt/homebrew/opt/llvm/bin/clang wasm-pack build --target web --no-typescript +AR=/opt/homebrew/opt/llvm/bin/llvm-ar \ +CC=/opt/homebrew/opt/llvm/bin/clang \ + wasm-pack build --target web ``` diff --git a/justfile b/justfile index 9f48a33..706f4bb 100644 --- a/justfile +++ b/justfile @@ -20,6 +20,18 @@ outdated: coverage: cargo llvm-cov +wasm: + AR=/opt/homebrew/opt/llvm/bin/llvm-ar \ + CC=/opt/homebrew/opt/llvm/bin/clang \ + wasm-pack build \ + --target web \ + --out-name bip322 \ + www + cp www/pkg/bip322.js www/pkg/bip322_bg.wasm www + +serve: wasm + python3 -m http.server -b 127.0.0.1 -d www 8080 + prepare-release revision='master': #!/usr/bin/env bash set -euxo pipefail diff --git a/www/index.html b/www/index.html index 3633d73..e328f2a 100644 --- a/www/index.html +++ b/www/index.html @@ -24,74 +24,7 @@ github crate - - + diff --git a/www/index.js b/www/index.js new file mode 100644 index 0000000..e4048bf --- /dev/null +++ b/www/index.js @@ -0,0 +1,65 @@ +import init, { verify } from './bip322.js'; + +let wasmInitialized = false; + +async function initializeWasm() { + if (!wasmInitialized) { + await init(); + console.log('WASM module loaded'); + wasmInitialized = true; + } +} + +async function runVerification(event) { + event.preventDefault(); + await initializeWasm(); + + const address = document.getElementById('address').value; + const message = document.getElementById('message').value; + const signature = document.getElementById('signature').value; + + const result = verify(address, message, signature); + console.log(result); + + document.getElementById('verify-form').style.display = 'none'; + const resultElement = document.getElementById('verify'); + resultElement.textContent = result; + resultElement.style.display = 'block'; +} + +function showForm() { + document.getElementById('navbar').style.display = 'none'; + document.getElementById('bip').classList.add('hidden'); + document.getElementById('verify-form').classList.add('visible'); +} + +function handleFocus(event) { + if (event.target.value === event.target.getAttribute('data-default')) { + event.target.value = ''; + } +} + +function handleBlur(event) { + if (event.target.value === '') { + event.target.value = event.target.getAttribute('data-default'); + } +} + +function handleKeyPress(event) { + if (event.key === 'Enter') { + event.preventDefault(); + runVerification(event); + } +} + +document.getElementById('bip').addEventListener('click', showForm); +document.getElementById('verify-form').addEventListener('submit', runVerification); + +const inputs = document.querySelectorAll('#verify-form input'); +inputs.forEach(input => { + const defaultValue = input.value; + input.setAttribute('data-default', defaultValue); + input.addEventListener('focus', handleFocus); + input.addEventListener('blur', handleBlur); + input.addEventListener('keypress', handleKeyPress); +}); diff --git a/www/justfile b/www/justfile deleted file mode 100644 index 4d04995..0000000 --- a/www/justfile +++ /dev/null @@ -1,10 +0,0 @@ -wasm: - rustup toolchain install nightly - rustup target add wasm32-unknown-unknown --toolchain nightly - rustup default nightly-aarch64-apple-darwin - AR=/opt/homebrew/opt/llvm/bin/llvm-ar CC=/opt/homebrew/opt/llvm/bin/clang wasm-pack build --target web --no-typescript - cp pkg/www.js pkg/www_bg.wasm . - rustup default stable - -serve: wasm - python3 -m http.server -b 127.0.0.1 -d . 8080 diff --git a/www/www.js b/www/www.js deleted file mode 100644 index 511a5f3..0000000 --- a/www/www.js +++ /dev/null @@ -1,171 +0,0 @@ -let wasm; - -let WASM_VECTOR_LEN = 0; - -let cachedUint8Memory0 = null; - -function getUint8Memory0() { - if (cachedUint8Memory0 === null || cachedUint8Memory0.byteLength === 0) { - cachedUint8Memory0 = new Uint8Array(wasm.memory.buffer); - } - return cachedUint8Memory0; -} - -const cachedTextEncoder = (typeof TextEncoder !== 'undefined' ? new TextEncoder('utf-8') : { encode: () => { throw Error('TextEncoder not available') } } ); - -const encodeString = (typeof cachedTextEncoder.encodeInto === 'function' - ? function (arg, view) { - return cachedTextEncoder.encodeInto(arg, view); -} - : function (arg, view) { - const buf = cachedTextEncoder.encode(arg); - view.set(buf); - return { - read: arg.length, - written: buf.length - }; -}); - -function passStringToWasm0(arg, malloc, realloc) { - - if (realloc === undefined) { - const buf = cachedTextEncoder.encode(arg); - const ptr = malloc(buf.length, 1) >>> 0; - getUint8Memory0().subarray(ptr, ptr + buf.length).set(buf); - WASM_VECTOR_LEN = buf.length; - return ptr; - } - - let len = arg.length; - let ptr = malloc(len, 1) >>> 0; - - const mem = getUint8Memory0(); - - let offset = 0; - - for (; offset < len; offset++) { - const code = arg.charCodeAt(offset); - if (code > 0x7F) break; - mem[ptr + offset] = code; - } - - if (offset !== len) { - if (offset !== 0) { - arg = arg.slice(offset); - } - ptr = realloc(ptr, len, len = offset + arg.length * 3, 1) >>> 0; - const view = getUint8Memory0().subarray(ptr + offset, ptr + len); - const ret = encodeString(arg, view); - - offset += ret.written; - ptr = realloc(ptr, len, offset, 1) >>> 0; - } - - WASM_VECTOR_LEN = offset; - return ptr; -} -/** -* @param {string} address -* @param {string} message -* @param {string} signature -* @returns {boolean} -*/ -export function verify(address, message, signature) { - const ptr0 = passStringToWasm0(address, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); - const len0 = WASM_VECTOR_LEN; - const ptr1 = passStringToWasm0(message, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); - const len1 = WASM_VECTOR_LEN; - const ptr2 = passStringToWasm0(signature, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); - const len2 = WASM_VECTOR_LEN; - const ret = wasm.verify(ptr0, len0, ptr1, len1, ptr2, len2); - return ret !== 0; -} - -async function __wbg_load(module, imports) { - if (typeof Response === 'function' && module instanceof Response) { - if (typeof WebAssembly.instantiateStreaming === 'function') { - try { - return await WebAssembly.instantiateStreaming(module, imports); - - } catch (e) { - if (module.headers.get('Content-Type') != 'application/wasm') { - console.warn("`WebAssembly.instantiateStreaming` failed because your server does not serve wasm with `application/wasm` MIME type. Falling back to `WebAssembly.instantiate` which is slower. Original error:\n", e); - - } else { - throw e; - } - } - } - - const bytes = await module.arrayBuffer(); - return await WebAssembly.instantiate(bytes, imports); - - } else { - const instance = await WebAssembly.instantiate(module, imports); - - if (instance instanceof WebAssembly.Instance) { - return { instance, module }; - - } else { - return instance; - } - } -} - -function __wbg_get_imports() { - const imports = {}; - imports.wbg = {}; - - return imports; -} - -function __wbg_init_memory(imports, maybe_memory) { - -} - -function __wbg_finalize_init(instance, module) { - wasm = instance.exports; - __wbg_init.__wbindgen_wasm_module = module; - cachedUint8Memory0 = null; - - - return wasm; -} - -function initSync(module) { - if (wasm !== undefined) return wasm; - - const imports = __wbg_get_imports(); - - __wbg_init_memory(imports); - - if (!(module instanceof WebAssembly.Module)) { - module = new WebAssembly.Module(module); - } - - const instance = new WebAssembly.Instance(module, imports); - - return __wbg_finalize_init(instance, module); -} - -async function __wbg_init(input) { - if (wasm !== undefined) return wasm; - - if (typeof input === 'undefined') { - input = new URL('www_bg.wasm', import.meta.url); - } - const imports = __wbg_get_imports(); - - if (typeof input === 'string' || (typeof Request === 'function' && input instanceof Request) || (typeof URL === 'function' && input instanceof URL)) { - input = fetch(input); - } - - __wbg_init_memory(imports); - - const { instance, module } = await __wbg_load(await input, imports); - - return __wbg_finalize_init(instance, module); -} - -export { initSync } -export default __wbg_init; diff --git a/www/www_bg.wasm b/www/www_bg.wasm deleted file mode 100644 index 76f1671..0000000 Binary files a/www/www_bg.wasm and /dev/null differ